Lager. Shoplink angepasst neuer Tab danach immer im selben Tab. Kundenauftrag Button für Bestellung aus dem Entwurf heraus
359 lines
14 KiB
PHP
Executable file
359 lines
14 KiB
PHP
Executable file
<?php
|
|
/* Copyright (C) 2025 Eduard Wisch <data@data-it-solution.de>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
// 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 && file_exists("../../../../main.inc.php")) $res = @include "../../../../main.inc.php";
|
|
if (!$res) die("Include of main fails");
|
|
|
|
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
|
|
|
|
$langs->loadLangs(array('orders', 'sendings', 'companies', 'suppliers'));
|
|
|
|
// Parameter
|
|
$origin = GETPOST('origin', 'alpha');
|
|
$originid = GETPOST('originid', 'int');
|
|
$action = GETPOST('action', 'alpha');
|
|
|
|
// Berechtigungen prüfen
|
|
if (empty($user->rights->fournisseur->commande->creer)) {
|
|
accessforbidden();
|
|
}
|
|
|
|
// Kundenauftrag laden
|
|
$objectsrc = new Commande($db);
|
|
$objectsrc->fetch($originid);
|
|
$objectsrc->fetch_lines();
|
|
|
|
// Kunde laden für Lieferantenreferenz
|
|
$customer = new Societe($db);
|
|
$customer->fetch($objectsrc->socid);
|
|
|
|
// Lieferantenreferenz Format: "Kundenname - Auftragsnummer / Kundenzeichen"
|
|
$supplier_ref_default = $customer->name.' - '.$objectsrc->ref;
|
|
if (!empty($objectsrc->ref_client)) {
|
|
$supplier_ref_default .= ' / '.$objectsrc->ref_client;
|
|
}
|
|
|
|
/*
|
|
* Actions
|
|
*/
|
|
|
|
if ($action == 'create_supplier_orders') {
|
|
$toselect = GETPOST('toselect', 'array');
|
|
$supplier_id = GETPOST('supplier_id', 'int');
|
|
$ref_supplier = GETPOST('ref_supplier', 'alpha');
|
|
|
|
if (empty($toselect)) {
|
|
setEventMessages('Bitte wählen Sie mindestens eine Zeile aus.', null, 'errors');
|
|
} elseif (empty($supplier_id)) {
|
|
setEventMessages('Bitte wählen Sie einen Lieferanten aus.', null, 'errors');
|
|
} else {
|
|
// Lieferantenbestellung erstellen
|
|
$supplierorder = new CommandeFournisseur($db);
|
|
|
|
$supplierorder->socid = $supplier_id;
|
|
$supplierorder->ref_supplier = !empty($ref_supplier) ? $ref_supplier : $supplier_ref_default;
|
|
$supplierorder->cond_reglement_id = 0;
|
|
$supplierorder->mode_reglement_id = 0;
|
|
$supplierorder->origin = 'commande';
|
|
$supplierorder->origin_id = $originid;
|
|
|
|
$db->begin();
|
|
|
|
$result = $supplierorder->create($user);
|
|
|
|
if ($result > 0) {
|
|
// Zeilen hinzufügen
|
|
$errors = 0;
|
|
foreach ($toselect as $lineid) {
|
|
// Zeile aus Kundenauftrag finden
|
|
$srcline = null;
|
|
foreach ($objectsrc->lines as $line) {
|
|
if ($line->id == $lineid) {
|
|
$srcline = $line;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($srcline && !empty($srcline->fk_product)) {
|
|
// Günstigsten Lieferantenpreis für diesen Lieferanten finden
|
|
$sql = "SELECT pfp.rowid, pfp.ref_fourn, pfp.price, pfp.quantity as min_qty
|
|
FROM ".MAIN_DB_PREFIX."product_fournisseur_price pfp
|
|
WHERE pfp.fk_product = ".(int)$srcline->fk_product."
|
|
AND pfp.fk_soc = ".(int)$supplier_id."
|
|
ORDER BY pfp.price ASC
|
|
LIMIT 1";
|
|
|
|
$resql = $db->query($sql);
|
|
$fournprice = 0;
|
|
$fournref = '';
|
|
$fournpricerowid = 0;
|
|
|
|
if ($resql && $db->num_rows($resql) > 0) {
|
|
$objprice = $db->fetch_object($resql);
|
|
$fournprice = $objprice->price;
|
|
$fournref = $objprice->ref_fourn;
|
|
$fournpricerowid = $objprice->rowid;
|
|
}
|
|
|
|
// Zeile zur Lieferantenbestellung hinzufügen
|
|
$result_line = $supplierorder->addline(
|
|
$srcline->desc, // Description
|
|
$fournprice, // Unit price
|
|
$srcline->qty, // Quantity
|
|
$srcline->tva_tx, // VAT rate
|
|
$srcline->localtax1_tx, // Local tax 1
|
|
$srcline->localtax2_tx, // Local tax 2
|
|
$srcline->fk_product, // Product ID
|
|
$fournpricerowid, // Supplier price ID
|
|
$fournref, // Supplier ref
|
|
$srcline->remise_percent, // Discount
|
|
'HT', // Price base type
|
|
0, // pu_ht_devise
|
|
0, // type
|
|
0, // info_bits
|
|
false, // notrigger
|
|
null, // date_start
|
|
null, // date_end
|
|
0, // array_options
|
|
'', // fk_unit
|
|
0, // origin
|
|
0, // origin_id
|
|
1 // rang
|
|
);
|
|
|
|
if ($result_line < 0) {
|
|
$errors++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($errors == 0) {
|
|
$db->commit();
|
|
setEventMessages('Lieferantenbestellung '.$supplierorder->ref.' wurde erstellt.', null, 'mesgs');
|
|
header('Location: '.DOL_URL_ROOT.'/fourn/commande/card.php?id='.$supplierorder->id);
|
|
exit;
|
|
} else {
|
|
$db->rollback();
|
|
setEventMessages('Fehler beim Hinzufügen der Zeilen.', null, 'errors');
|
|
}
|
|
} else {
|
|
$db->rollback();
|
|
setEventMessages('Fehler beim Erstellen der Lieferantenbestellung: '.$supplierorder->error, null, 'errors');
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* View
|
|
*/
|
|
|
|
$title = 'Lieferantenbestellung aus Kundenauftrag erstellen';
|
|
llxHeader('', $title);
|
|
|
|
print load_fiche_titre($title, '', 'order');
|
|
|
|
// Formular für Auswahl
|
|
print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<input type="hidden" name="action" value="create_supplier_orders">';
|
|
print '<input type="hidden" name="origin" value="'.$origin.'">';
|
|
print '<input type="hidden" name="originid" value="'.$originid.'">';
|
|
|
|
// Zwei Boxen nebeneinander
|
|
print '<div class="fichecenter">';
|
|
|
|
// Linke Box: Kundenauftrag-Info
|
|
print '<div class="fichehalfleft">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
print '<table class="border centpercent tableforfield">';
|
|
print '<tr class="liste_titre"><th colspan="2">Kundenauftrag</th></tr>';
|
|
|
|
print '<tr class="oddeven"><td class="titlefield">'.$langs->trans("Ref").'</td>';
|
|
print '<td>'.$objectsrc->getNomUrl(1).'</td></tr>';
|
|
|
|
print '<tr class="oddeven"><td>'.$langs->trans("Customer").'</td>';
|
|
print '<td>'.$customer->getNomUrl(1).'</td></tr>';
|
|
|
|
print '<tr class="oddeven"><td>'.$langs->trans("RefCustomer").'</td>';
|
|
print '<td>'.dol_escape_htmltag($objectsrc->ref_client).'</td></tr>';
|
|
|
|
print '<tr class="oddeven"><td>'.$langs->trans("Status").'</td>';
|
|
print '<td>'.$objectsrc->getLibStatut(4).'</td></tr>';
|
|
|
|
print '</table>';
|
|
print '</div>';
|
|
|
|
// Rechte Box: Lieferant und Referenz
|
|
print '<div class="fichehalfright">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
print '<table class="border centpercent tableforfield">';
|
|
print '<tr class="liste_titre"><th colspan="2">Neue Lieferantenbestellung</th></tr>';
|
|
|
|
// Alle Lieferanten mit Shop-URL abrufen, die Produkte aus diesem Auftrag liefern können
|
|
$sql = "SELECT DISTINCT s.rowid, s.nom
|
|
FROM ".MAIN_DB_PREFIX."societe s
|
|
INNER JOIN ".MAIN_DB_PREFIX."product_fournisseur_price pfp ON pfp.fk_soc = s.rowid
|
|
WHERE pfp.fk_product IN (
|
|
SELECT cd.fk_product FROM ".MAIN_DB_PREFIX."commandedet cd
|
|
WHERE cd.fk_commande = ".(int)$originid." AND cd.fk_product > 0
|
|
)
|
|
AND s.fournisseur = 1
|
|
ORDER BY s.nom ASC";
|
|
|
|
$resql = $db->query($sql);
|
|
$suppliers = array();
|
|
if ($resql) {
|
|
while ($obj = $db->fetch_object($resql)) {
|
|
$suppliers[$obj->rowid] = $obj->nom;
|
|
}
|
|
}
|
|
|
|
print '<tr class="oddeven"><td class="titlefield fieldrequired">Lieferant</td>';
|
|
print '<td><select name="supplier_id" id="supplier_id" class="flat maxwidth300" required>';
|
|
print '<option value="">-- Lieferant wählen --</option>';
|
|
foreach ($suppliers as $id => $name) {
|
|
$selected = (GETPOST('supplier_id', 'int') == $id) ? ' selected' : '';
|
|
print '<option value="'.$id.'"'.$selected.'>'.dol_escape_htmltag($name).'</option>';
|
|
}
|
|
print '</select></td></tr>';
|
|
|
|
print '<tr class="oddeven"><td>Lieferanten-Referenz</td>';
|
|
print '<td><input type="text" name="ref_supplier" value="'.dol_escape_htmltag($supplier_ref_default).'" class="flat quatrevingtpercent" placeholder="Kunde - Auftrag / Zeichen">';
|
|
print '</td></tr>';
|
|
|
|
print '</table>';
|
|
print '</div>'; // Ende fichehalfright
|
|
|
|
print '</div>'; // Ende fichecenter
|
|
print '<div class="clearboth"></div>';
|
|
|
|
print '<br>';
|
|
|
|
// Zeilen-Auswahl mit Checkboxen
|
|
print '<div class="div-table-responsive-no-min">';
|
|
print '<table class="noborder centpercent" id="tablelines">';
|
|
print '<tr class="liste_titre">';
|
|
print '<th class="center" style="width: 30px;"><input type="checkbox" id="checkall" onclick="toggleAll(this)"></th>';
|
|
print '<th>Produkt</th>';
|
|
print '<th class="right">Menge</th>';
|
|
print '<th class="right">Lagerbestand</th>';
|
|
print '<th colspan="2">Lieferanten</th>';
|
|
print '</tr>';
|
|
|
|
// Produkte aus Kundenauftrag auflisten
|
|
foreach ($objectsrc->lines as $line) {
|
|
// Nur Produkte, keine Dienstleistungen
|
|
if (empty($line->fk_product) || $line->product_type != 0) {
|
|
continue;
|
|
}
|
|
|
|
// Produkt laden
|
|
$product = new Product($db);
|
|
$product->fetch($line->fk_product);
|
|
|
|
// Lagerbestand
|
|
$qtyStock = $product->stock_reel;
|
|
|
|
// Stock-Badge Farbe
|
|
$stockClass = 'badge-success';
|
|
if ($qtyStock <= 0) {
|
|
$stockClass = 'badge-danger';
|
|
} elseif ($product->seuil_stock_alerte > 0 && $qtyStock < $product->seuil_stock_alerte) {
|
|
$stockClass = 'badge-warning';
|
|
} elseif ($product->desiredstock > 0 && $qtyStock < $product->desiredstock) {
|
|
$stockClass = 'badge-secondary';
|
|
}
|
|
|
|
// Lieferanten für dieses Produkt
|
|
$sql_suppliers = "SELECT pfp.fk_soc, pfp.price, pfp.ref_fourn, s.nom
|
|
FROM ".MAIN_DB_PREFIX."product_fournisseur_price pfp
|
|
INNER JOIN ".MAIN_DB_PREFIX."societe s ON s.rowid = pfp.fk_soc
|
|
WHERE pfp.fk_product = ".(int)$line->fk_product."
|
|
ORDER BY pfp.price ASC";
|
|
$ressuppliers = $db->query($sql_suppliers);
|
|
$supplierList = array();
|
|
if ($ressuppliers) {
|
|
while ($objsup = $db->fetch_object($ressuppliers)) {
|
|
$supplierList[] = dol_escape_htmltag($objsup->nom).' ('.number_format($objsup->price, 2, ',', '.').' EUR)';
|
|
}
|
|
}
|
|
|
|
print '<tr class="oddeven">';
|
|
|
|
// Checkbox
|
|
print '<td class="center">';
|
|
print '<input type="checkbox" name="toselect[]" value="'.$line->id.'" class="linecheckbox">';
|
|
print '</td>';
|
|
|
|
// Produkt
|
|
print '<td>';
|
|
print $product->getNomUrl(1);
|
|
print ' - '.dol_escape_htmltag($product->label);
|
|
print '</td>';
|
|
|
|
// Menge
|
|
print '<td class="right">'.(int)$line->qty.'</td>';
|
|
|
|
// Lagerbestand
|
|
print '<td class="right">';
|
|
print '<span class="badge '.$stockClass.'">'.(int)$qtyStock.'</span>';
|
|
print '</td>';
|
|
|
|
// Lieferanten
|
|
print '<td>';
|
|
if (!empty($supplierList)) {
|
|
print implode('<br>', $supplierList);
|
|
} else {
|
|
print '<span class="opacitymedium">Keine Lieferanten</span>';
|
|
}
|
|
print '</td>';
|
|
|
|
print '</tr>';
|
|
}
|
|
|
|
print '</table>';
|
|
print '</div>';
|
|
|
|
// Buttons
|
|
print '<div class="center" style="margin-top: 20px;">';
|
|
print '<input type="submit" class="button button-save" value="Lieferantenbestellung erstellen">';
|
|
print ' ';
|
|
print '<a class="button button-cancel" href="'.DOL_URL_ROOT.'/commande/card.php?id='.$originid.'">Abbrechen</a>';
|
|
print '</div>';
|
|
|
|
print '</form>';
|
|
|
|
// JavaScript für "Alle auswählen"
|
|
print '<script type="text/javascript">
|
|
function toggleAll(checkbox) {
|
|
var checkboxes = document.getElementsByClassName("linecheckbox");
|
|
for (var i = 0; i < checkboxes.length; i++) {
|
|
checkboxes[i].checked = checkbox.checked;
|
|
}
|
|
}
|
|
</script>';
|
|
|
|
// Badge-Styles
|
|
print '<style>
|
|
.badge.badge-danger { background-color: #dc3545 !important; color: #fff !important; }
|
|
.badge.badge-warning { background-color: #fd7e14 !important; color: #fff !important; }
|
|
.badge.badge-secondary { background-color: #6c757d !important; color: #fff !important; }
|
|
.badge.badge-success { background-color: #28a745 !important; color: #fff !important; }
|
|
</style>';
|
|
|
|
llxFooter();
|
|
$db->close();
|