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

121 lines
3.3 KiB
PHP

<?php
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* AJAX: Search products by name/ref for autocomplete
*/
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.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
header('Content-Type: application/json; charset=utf-8');
// Security check
if (!$user->hasRight('produit', 'lire') && !$user->hasRight('product', 'read')) {
echo json_encode(['success' => false, 'error' => 'Access denied']);
exit;
}
$search = GETPOST('q', 'alphanohtml');
$limit = GETPOSTINT('limit') ?: 15;
if (empty($search) || strlen($search) < 2) {
echo json_encode(['success' => true, 'products' => []]);
exit;
}
$products = [];
// Search products by ref, label
$sql = "SELECT p.rowid, p.ref, p.label, p.barcode, p.stock as stock_reel, p.fk_unit";
$sql .= " FROM ".MAIN_DB_PREFIX."product as p";
$sql .= " WHERE p.entity IN (".getEntity('product').")";
$sql .= " AND (p.ref LIKE '%".$db->escape($search)."%'";
$sql .= " OR p.label LIKE '%".$db->escape($search)."%'";
$sql .= " OR p.barcode LIKE '%".$db->escape($search)."%')";
$sql .= " ORDER BY p.label ASC";
$sql .= " LIMIT ".((int) $limit);
$resql = $db->query($sql);
if ($resql) {
while ($obj = $db->fetch_object($resql)) {
// Get suppliers for this product
$suppliers = [];
$productFourn = new ProductFournisseur($db);
$supplierPrices = $productFourn->list_product_fournisseur_price($obj->rowid);
if ($supplierPrices) {
foreach ($supplierPrices as $sp) {
// Get supplier name
$supplierSql = "SELECT nom FROM ".MAIN_DB_PREFIX."societe WHERE rowid = ".((int) $sp->fourn_id);
$supplierRes = $db->query($supplierSql);
$supplierObj = $db->fetch_object($supplierRes);
$refFourn = $sp->ref_supplier ?? $sp->fourn_ref ?? $sp->ref_fourn ?? '';
$suppliers[] = [
'id' => $sp->fourn_id,
'name' => $supplierObj->nom ?? 'Unknown',
'price' => (float) $sp->fourn_price,
'ref_fourn' => $refFourn
];
}
// Sort by price
usort($suppliers, function($a, $b) {
return $a['price'] <=> $b['price'];
});
}
// Get unit label
$stockUnit = 'Stk';
if (!empty($obj->fk_unit)) {
$unitSql = "SELECT label FROM ".MAIN_DB_PREFIX."c_units WHERE rowid = ".((int) $obj->fk_unit);
$unitRes = $db->query($unitSql);
if ($unitRes && $unitObj = $db->fetch_object($unitRes)) {
$stockUnit = $unitObj->label;
}
}
$products[] = [
'id' => $obj->rowid,
'ref' => $obj->ref,
'label' => $obj->label,
'barcode' => $obj->barcode,
'stock' => (float) $obj->stock_reel,
'stock_unit' => $stockUnit,
'suppliers' => $suppliers
];
}
}
echo json_encode([
'success' => true,
'products' => $products
]);