dolibarr.handybarcodescanner/ajax/updateorderline.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

147 lines
3.3 KiB
PHP

<?php
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* AJAX: Update or delete order line
*/
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', 'creer') && !$user->hasRight('supplier_order', 'creer')) {
echo json_encode(['success' => false, 'error' => 'Access denied']);
exit;
}
$action = GETPOST('action', 'alpha');
$orderId = GETPOSTINT('order_id');
$lineId = GETPOSTINT('line_id');
if (empty($orderId) || empty($lineId)) {
echo json_encode(['success' => false, 'error' => 'Missing parameters']);
exit;
}
$order = new CommandeFournisseur($db);
if ($order->fetch($orderId) <= 0) {
echo json_encode(['success' => false, 'error' => 'Order not found']);
exit;
}
// Only allow changes to draft orders
if ($order->statut != 0) {
echo json_encode(['success' => false, 'error' => 'Order is not a draft']);
exit;
}
// Find line
$targetLine = null;
foreach ($order->lines as $line) {
if ($line->id == $lineId) {
$targetLine = $line;
break;
}
}
if (!$targetLine) {
echo json_encode(['success' => false, 'error' => 'Line not found']);
exit;
}
if ($action === 'delete') {
$result = $order->deleteLine($lineId);
if ($result < 0) {
echo json_encode(['success' => false, 'error' => 'Failed to delete line: ' . $order->error]);
exit;
}
// Check if order is now empty - if so, delete it
$order->fetch($orderId);
if (count($order->lines) == 0) {
$order->delete($user);
echo json_encode([
'success' => true,
'message' => 'Line and empty order deleted',
'order_deleted' => true
]);
exit;
}
echo json_encode([
'success' => true,
'message' => 'Line deleted',
'order_deleted' => false
]);
} elseif ($action === 'update') {
$newQty = GETPOSTFLOAT('qty');
if ($newQty <= 0) {
echo json_encode(['success' => false, 'error' => 'Quantity must be greater than 0']);
exit;
}
$result = $order->updateline(
$lineId,
$targetLine->desc,
$targetLine->subprice,
$newQty,
$targetLine->remise_percent,
$targetLine->tva_tx,
$targetLine->localtax1_tx ?: 0,
$targetLine->localtax2_tx ?: 0,
'HT',
0,
0,
$targetLine->product_type ?: 0,
false,
null,
null,
0,
$targetLine->ref_fourn
);
if ($result < 0) {
echo json_encode(['success' => false, 'error' => 'Failed to update line: ' . $order->error]);
exit;
}
echo json_encode([
'success' => true,
'message' => 'Line updated',
'new_qty' => $newQty
]);
} else {
echo json_encode(['success' => false, 'error' => 'Unknown action']);
}