dolibarr.handybarcodescanner/ajax/getorders.php
data 74728a71d1 v5.0: Bestellmodus erweitert, Barcode-Druck, Scanner-Pausierung
Bestellmodus:
- Produktsuche (Lupe-Button) und Freitext-Positionen (Plus-Button)
- Bestellübersicht per Swipe nach links
- Horizontale Bestellliste mit Direkt-Bestellungen hervorgehoben
- Bestellzeilen bearbeiten (Menge ändern, löschen)
- Auto-Öffnung der zuletzt bearbeiteten Bestellung

Barcode-Druck:
- Swipe nach rechts öffnet Produktsuche für Druck
- Code128 Barcode-Generierung mit JsBarcode
- Optimiert für 24mm Etikettendrucker (Brother P-touch)

Scanner:
- Automatische Pausierung bei geöffneten Dialogen
- Fortsetzung wenn alle Dialoge geschlossen
- Stopp-Button funktioniert jetzt zuverlässig

Neue AJAX-Endpoints:
- searchproduct.php, addfreetextline.php
- getorders.php, getorderlines.php, updateorderline.php

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 09:46:06 +01:00

111 lines
3.5 KiB
PHP

<?php
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* AJAX: Get supplier orders for overview
*/
if (!defined('NOTOKENRENEWAL')) {
define('NOTOKENRENEWAL', '1');
}
if (!defined('NOREQUIREMENU')) {
define('NOREQUIREMENU', '1');
}
if (!defined('NOREQUIREHTML')) {
define('NOREQUIREHTML', '1');
}
if (!defined('NOREQUIREAJAX')) {
define('NOREQUIREAJAX', '1');
}
// Load Dolibarr environment
$res = 0;
if (!$res && file_exists("../../main.inc.php")) {
$res = @include "../../main.inc.php";
}
if (!$res && file_exists("../../../main.inc.php")) {
$res = @include "../../../main.inc.php";
}
if (!$res && file_exists("../../../../main.inc.php")) {
$res = @include "../../../../main.inc.php";
}
if (!$res) {
die(json_encode(['success' => false, 'error' => 'Failed to load Dolibarr']));
}
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
header('Content-Type: application/json; charset=utf-8');
// Security check
if (!$user->hasRight('fournisseur', 'commande', 'lire') && !$user->hasRight('supplier_order', 'read')) {
echo json_encode(['success' => false, 'error' => 'Access denied']);
exit;
}
$orders = [];
// Get all draft orders (fk_statut = 0) and approved orders (fk_statut = 1)
// Sorted: Direkt-drafts first, then other drafts, then approved
$sql = "SELECT cf.rowid, cf.ref, cf.ref_supplier, cf.fk_statut as status, cf.date_commande, cf.total_ht,";
$sql .= " s.nom as supplier_name, s.rowid as supplier_id,";
$sql .= " (SELECT COUNT(*) FROM ".MAIN_DB_PREFIX."commande_fournisseurdet WHERE fk_commande = cf.rowid) as line_count,";
$sql .= " (SELECT SUM(qty) FROM ".MAIN_DB_PREFIX."commande_fournisseurdet WHERE fk_commande = cf.rowid) as total_qty";
$sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as cf";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON cf.fk_soc = s.rowid";
$sql .= " WHERE cf.entity IN (".getEntity('supplier_order').")";
$sql .= " AND cf.fk_statut IN (0, 1, 2)"; // Draft, Validated, Approved
$sql .= " ORDER BY";
// Direkt-Bestellungen (Entwurf) zuerst
$sql .= " CASE WHEN cf.fk_statut = 0 AND cf.ref_supplier LIKE '%-Direkt' THEN 0";
// Dann Direkt-Bestellungen (freigestellt)
$sql .= " WHEN cf.fk_statut IN (1,2) AND cf.ref_supplier LIKE '%-Direkt' THEN 1";
// Dann andere Entwürfe
$sql .= " WHEN cf.fk_statut = 0 THEN 2";
// Dann alle anderen
$sql .= " ELSE 3 END,";
$sql .= " cf.date_commande DESC, cf.rowid DESC";
$resql = $db->query($sql);
if ($resql) {
while ($obj = $db->fetch_object($resql)) {
$isDirekt = (strpos($obj->ref_supplier, '-Direkt') !== false);
$orders[] = [
'id' => (int) $obj->rowid,
'ref' => $obj->ref,
'ref_supplier' => $obj->ref_supplier,
'status' => (int) $obj->status,
'status_label' => getOrderStatusLabel((int) $obj->status),
'date' => $obj->date_commande,
'total_ht' => (float) $obj->total_ht,
'supplier_id' => (int) $obj->supplier_id,
'supplier_name' => $obj->supplier_name,
'line_count' => (int) $obj->line_count,
'total_qty' => (float) $obj->total_qty,
'is_direkt' => $isDirekt
];
}
}
/**
* Get status label
*/
function getOrderStatusLabel($status) {
switch ($status) {
case 0: return 'Entwurf';
case 1: return 'Validiert';
case 2: return 'Freigegeben';
case 3: return 'Bestellt';
case 4: return 'Teilweise geliefert';
case 5: return 'Geliefert';
case 6: return 'Storniert';
case 7: return 'Annulliert';
case 9: return 'Abgelehnt';
default: return 'Unbekannt';
}
}
echo json_encode([
'success' => true,
'orders' => $orders
]);