From a5be2e984a1ba286b89221d5d6d830b42e94e6e0 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 25 Oct 2023 13:26:52 +0200 Subject: [PATCH] versandpakete improvements, added lieferungen view --- phpwf/plugins/class.yui.php | 8 +- www/lib/class.erpapi.php | 2 +- www/pages/content/versandpakete_lieferung.tpl | 50 ++ www/pages/versandpakete.php | 457 +++++++++++++----- www/themes/new/css/color3.css | 3 +- www/themes/new/css/styles.css | 11 +- www/themes/new/images/lagergo_stop_teil.png | Bin 0 -> 10317 bytes www/themes/new/images/lagergo_teil.png | Bin 0 -> 11224 bytes 8 files changed, 400 insertions(+), 131 deletions(-) create mode 100644 www/pages/content/versandpakete_lieferung.tpl create mode 100644 www/themes/new/images/lagergo_stop_teil.png create mode 100644 www/themes/new/images/lagergo_teil.png diff --git a/phpwf/plugins/class.yui.php b/phpwf/plugins/class.yui.php index 58a89a4d..c06f3ab2 100644 --- a/phpwf/plugins/class.yui.php +++ b/phpwf/plugins/class.yui.php @@ -3642,7 +3642,7 @@ class YUI { $lieferschein_kein = "app->Conf->WFconf['defaulttheme']}/images/summe_stop.png\" title=\"Kein Lieferschein\" border=\"0\" style=\"margin-right:1px\">"; $lieferschein_ohne_pos = "app->Conf->WFconf['defaulttheme']}/images/summe_go.png\" title=\"Lieferschein ohne Positionen\" border=\"0\" style=\"margin-right:1px\">"; $lieferschein_voll = "app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Lieferschein vollständig\" border=\"0\" style=\"margin-right:1px\">"; - $lieferschein_teil = "app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">"; + $lieferschein_teil = "app->Conf->WFconf['defaulttheme']}/images/lagergo_teil.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">"; $versendet = "app->Conf->WFconf['defaulttheme']}/images/liefersperrego.png\" title=\"Versendet\" border=\"0\" style=\"margin-right:1px\">"; $versendet_nicht = "app->Conf->WFconf['defaulttheme']}/images/liefersperrestop.png\" title=\"Nicht versendet\" border=\"0\" style=\"margin-right:1px\">"; @@ -3693,10 +3693,10 @@ class YUI { } function IconsSQL_lieferung() { - $lieferschein_kein = "app->Conf->WFconf['defaulttheme']}/images/summe_stop.png\" title=\"Kein Lieferschein\" border=\"0\" style=\"margin-right:1px\">"; + $lieferschein_kein = "app->Conf->WFconf['defaulttheme']}/images/lagerstop.png\" title=\"Keine Artikel\" border=\"0\" style=\"margin-right:1px\">"; $lieferschein_ohne_pos = "app->Conf->WFconf['defaulttheme']}/images/summe_go.png\" title=\"Lieferschein ohne Positionen\" border=\"0\" style=\"margin-right:1px\">"; - $lieferschein_voll = "app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Lieferschein vollständig\" border=\"0\" style=\"margin-right:1px\">"; - $lieferschein_teil = "app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">"; + $lieferschein_voll = "app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Artikel vollständig\" border=\"0\" style=\"margin-right:1px\">"; + $lieferschein_teil = "app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Artikel teilweise\" border=\"0\" style=\"margin-right:1px\">"; $versendet = "app->Conf->WFconf['defaulttheme']}/images/liefersperrego.png\" title=\"Versendet\" border=\"0\" style=\"margin-right:1px\">"; $versendet_nicht = "app->Conf->WFconf['defaulttheme']}/images/liefersperrestop.png\" title=\"Nicht versendet\" border=\"0\" style=\"margin-right:1px\">"; diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index b9ba007f..dae90b63 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -7110,7 +7110,7 @@ title: 'Abschicken', $navarray['menu']['admin'][++$menu]['first'] = array('Logistik','lager','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Wareneingang','wareneingang','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Lieferschein','lieferschein','list'); - $navarray['menu']['admin'][$menu]['sec'][] = array('Versand','versandpakete','list'); + $navarray['menu']['admin'][$menu]['sec'][] = array('Versand','versandpakete','lieferungen'); $navarray['menu']['admin'][$menu]['sec'][] = array('Lagerverwaltung','lager','list'); if($this->ModulVorhanden('lagermobil')) { $navarray['menu']['admin'][$menu]['sec'][] = array('Mobile Lagerverwaltung','lagermobil','list'); diff --git a/www/pages/content/versandpakete_lieferung.tpl b/www/pages/content/versandpakete_lieferung.tpl new file mode 100644 index 00000000..78a322f1 --- /dev/null +++ b/www/pages/content/versandpakete_lieferung.tpl @@ -0,0 +1,50 @@ +
+ +
+
+
+
+
+
+ {|Lieferung [BELEGNR]|} +
+
+
+
+
+ [MESSAGE] +
+
+
+
+
+ [TAB1] +
+ + Stapelverarbeitung + + + + +
{|Status|}:
 alle markieren 
+
+
+
+
+
+
+ [TAB1NEXT] +
+
+ + diff --git a/www/pages/versandpakete.php b/www/pages/versandpakete.php index 3a2d4f81..94ebacb2 100644 --- a/www/pages/versandpakete.php +++ b/www/pages/versandpakete.php @@ -28,6 +28,16 @@ class Versandpakete { lieferschein_ohne_pos <> 0 "; + const SQL_VERSANDPAKETE_LIEFERSCHEIN_WITH_POS = " + SELECT DISTINCT + versandpaket, + lieferschein + FROM + versandpaket_lieferschein_position vlp + INNER JOIN lieferschein_position lp ON + vlp.lieferschein_position = lp.id + "; + function __construct($app, $intern = false) { $this->app = $app; if ($intern) @@ -38,7 +48,8 @@ class Versandpakete { $this->app->ActionHandler("create", "versandpakete_edit"); // This automatically adds a "New" button $this->app->ActionHandler("edit", "versandpakete_edit"); $this->app->ActionHandler("add", "versandpakete_add"); - $this->app->ActionHandler("pakete", "versandpakete_pakete"); + $this->app->ActionHandler("lieferungen", "versandpakete_lieferungen"); + $this->app->ActionHandler("lieferung", "versandpakete_lieferung"); $this->app->ActionHandler("stapelverarbeitung", "versandpakete_stapelverarbeitung"); $this->app->ActionHandler("paketmarke", "versandpakete_paketmarke"); $this->app->ActionHandler("delete", "versandpakete_delete"); @@ -54,16 +65,23 @@ class Versandpakete { } static function TableSearch(&$app, $name, $erlaubtevars) { + $lieferschein_filter = null; switch ($name) { + case "lieferung_versandpakete_list": + $lieferschein_filter = $app->User->GetParameter('versandpakete_lieferschein_filter'); + if ($lieferschein_filter) { + $lieferschein_filter_where = "WHERE lieferschein = ".$lieferschein_filter; + } + // break omitted intentionally case "versandpakete_list": $allowed['versandpakete_list'] = array('list'); - $heading = array('', '', 'Paket-Nr.','Datum','Adresse', 'Lieferschein', 'Versandart', 'Tracking', 'Menge auf Lieferscheinen', 'Menge', 'Gewicht','Versender', 'Bemerkung', 'Status', 'Monitor', 'Menü'); - $width = array( '1%','1%','1%', '1%', '10%', '1%', '2%', '2%', '1%', '1%', '1%', '2%', '10%', '1%', '1%', '1%'); + $heading = array('', '', 'Paket-Nr.','Datum','Adresse', 'Lieferschein', 'Versandart', 'Tracking', 'Menge auf Lieferscheinen', 'Menge', 'Gewicht','Versender', 'Bemerkung', 'Status', 'Monitor', 'Menü', ''); + $width = array( '1%','1%','1%', '1%', '10%', '1%', '2%', '2%', '1%', '1%', '1%', '2%', '10%', '1%', '1%', '1%', '1%'); // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('id','id','id','datum','name','if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine)','versandart','tracking','lmenge','vmenge','gewicht','versender','bemerkung','status','id','id'); + $findcols = array('id','id','id','datum','name','lieferscheine','versandart','tracking','lmenge','vmenge','gewicht','versender','bemerkung','status','id','id'); $searchsql = array('name', 'if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine)', 'tracking', 'bemerkung'); $defaultorder = 1; @@ -72,10 +90,23 @@ class Versandpakete { $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; - $menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
"; + $menu = ""; $menucol = 1; $moreinfo = true; // Allow drop down details + $menu_link = array( + '', + "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">", + '', + " 'id'], + "\");>" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" + ); + $lieferschein_link = array( ' 'v.tracking_link'], + ['sql' => 'tracking_link'], '">', - ['sql' => 'v.tracking'], + ['sql' => 'tracking'], '' - ); + ); - $sql = "SELECT SQL_CALC_FOUND_ROWS - id, - $dropnbox, - id, - datum_format, - if (lieferscheine IS NULL,alop_name,name) as name, - if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine) as belegnr, - versandart, + $sql_lieferschein_mengen = " + SELECT + l.id, + l.belegnr, + l.adresse, + l.name, + SUM(lp.menge) lmenge + FROM + lieferschein_position lp + INNER JOIN + lieferschein l ON l.id = lp.lieferschein + INNER JOIN + artikel a ON a.id = lp.artikel + WHERE + a.lagerartikel + GROUP BY l.id + "; + + $sql_pakete_zu_lieferschein = " + SELECT + v.id, + v.datum, + v.lieferschein_ohne_pos, + v.versandart, + v.tracking_link, + v.tracking, + v.gewicht, + v.versender, + v.bemerkung, + v.status, + lp.lieferschein, + SUM(vlp.menge) AS vmenge + FROM + versandpakete v + LEFT JOIN + versandpaket_lieferschein_position vlp ON vlp.versandpaket = v.id + LEFT JOIN + lieferschein_position lp ON vlp.lieferschein_position = lp.id + GROUP BY v.id, lp.lieferschein + "; + + $sql = " + SELECT SQL_CALC_FOUND_ROWS + id, + ".$dropnbox.", + id id2, + ".$app->erp->FormatDateShort("datum").", + name, + lieferscheine, + versandart, + ".$app->erp->ConcatSQL($tracking_link)." AS tracking, + lmenge, + vmenge, + gewicht, + versender, + bemerkung, + status, + ".$app->YUI->IconsSQL_versandpaket()." icons, + ".$app->erp->ConcatSQL($menu_link)." AS paket_edit, + id, + id + FROM ( + SELECT + v.id, + v.datum, + if(lop.id IS NOT NULL,lop.name,l.name) AS name, + if(lop.id IS NOT NULL,".$app->erp->ConcatSQL($lieferschein_ohne_pos_link).", GROUP_CONCAT(".$app->erp->ConcatSQL($lieferschein_link)." SEPARATOR ', ')) AS lieferscheine, + v.versandart, + tracking, tracking_link, - lmenge, - vmenge, - gewicht, - versender, - bemerkung, - status, - ".$app->YUI->IconsSQL_versandpaket().", - id, - datum - FROM - ( - SELECT - v.id, - ".$app->erp->FormatDateShort('v.datum')." AS datum_format, - v.datum, - a.name, - alop.name alop_name, - GROUP_CONCAT(DISTINCT ".$app->erp->ConcatSQL($lieferschein_link)." SEPARATOR ', ') as lieferscheine, - v.lieferschein_ohne_pos, - GROUP_CONCAT(DISTINCT ".$app->erp->ConcatSQL($lieferschein_ohne_pos_link)." SEPARATOR ', ') as lieferscheine_ohne_pos, - ".$app->erp->FormatUCfirst('v.versandart')." as versandart, - ".$app->erp->ConcatSQL($tracking_link)." as tracking_link, - tracking, - ".$app->erp->FormatMenge('SUM(lp.menge)')." as lmenge, - ".$app->erp->FormatMenge('SUM(vlp.menge)')." AS vmenge, - v.gewicht, - v.versender, - v.bemerkung, - v.status - FROM - versandpakete v - LEFT JOIN - versandpaket_lieferschein_position vlp ON vlp.versandpaket = v.id - LEFT JOIN - lieferschein_position lp ON vlp.lieferschein_position = lp.id - LEFT JOIN - lieferschein l ON lp.lieferschein = l.id - LEFT JOIN - adresse a ON a.id = l.adresse - LEFT JOIN - lieferschein lop ON v.lieferschein_ohne_pos = lop.id - LEFT JOIN - adresse alop ON lop.adresse = alop.id - GROUP BY v.id - ) temp - "; + ".$app->erp->FormatMenge("SUM(l.lmenge)")." AS lmenge, + ".$app->erp->FormatMenge("SUM(v.vmenge)")." AS vmenge, + v.gewicht, + v.versender, + v.bemerkung, + v.status, + lieferschein_ohne_pos + FROM + (".$sql_pakete_zu_lieferschein.") AS v + LEFT JOIN + (".$sql_lieferschein_mengen.") as l + ON v.lieferschein = l.id + LEFT JOIN + lieferschein lop ON lop.id = v.lieferschein_ohne_pos + ".$lieferschein_filter_where." + GROUP BY + v.id + ) final + "; - $where = "((status IN ('neu', 'versendet')"; - // Toggle filters - $app->Tpl->Add('JQUERYREADY', "$('#geschlossene').click( function() { fnFilterColumn1( 0 ); } );"); - $app->Tpl->Add('JQUERYREADY', "$('#stornierte').click( function() { fnFilterColumn2( 0 ); } );"); + if (!$lieferschein_filter) { + $where = "((status IN ('neu', 'versendet')"; + // Toggle filters + $app->Tpl->Add('JQUERYREADY', "$('#geschlossene').click( function() { fnFilterColumn1( 0 ); } );"); + $app->Tpl->Add('JQUERYREADY', "$('#stornierte').click( function() { fnFilterColumn2( 0 ); } );"); - for ($r = 1;$r <= 2;$r++) { - $app->Tpl->Add('JAVASCRIPT', ' - function fnFilterColumn' . $r . ' ( i ) - { - if(oMoreData' . $r . $name . '==1) - oMoreData' . $r . $name . ' = 0; - else - oMoreData' . $r . $name . ' = 1; + for ($r = 1;$r <= 2;$r++) { + $app->Tpl->Add('JAVASCRIPT', ' + function fnFilterColumn' . $r . ' ( i ) + { + if(oMoreData' . $r . $name . '==1) + oMoreData' . $r . $name . ' = 0; + else + oMoreData' . $r . $name . ' = 1; - $(\'#' . $name . '\').dataTable().fnFilter( - \'\', - i, - 0,0 - ); - } - '); - } + $(\'#' . $name . '\').dataTable().fnFilter( + \'\', + i, + 0,0 + ); + } + '); + } - $more_data1 = $app->Secure->GetGET("more_data1"); - if ($more_data1 == 1) { - $where .= " OR status IN ('abgeschlossen'))"; + $more_data1 = $app->Secure->GetGET("more_data1"); + if ($more_data1 == 1) { + $where .= " OR status IN ('abgeschlossen'))"; + } else { + $where .= " )"; + } + + $more_data2 = $app->Secure->GetGET("more_data2"); + if ($more_data2 == 1) { + $where .= " OR status IN ('storniert'))"; + } + else { + $where .= " )"; + } + // END Toggle filters + + } else { - $where .= " )"; + $where = "1"; } - $more_data2 = $app->Secure->GetGET("more_data2"); - if ($more_data2 == 1) { - $where .= " OR status IN ('storniert'))"; - } - else { - $where .= " )"; - } - // END Toggle filters - - $count = "SELECT count(DISTINCT id) FROM versandpakete v"; + $count = "SELECT count(DISTINCT id) FROM versandpakete v WHERE ".$where; $groupby = ""; break; @@ -204,13 +275,13 @@ class Versandpakete { $allowed['versandpakete_lieferscheine'] = array('lieferscheine'); - $heading = array('', '', 'Lieferschein', 'Adresse','Menge','Menge in Versandpaketen','Monitor','Paket erstellen'); - $width = array( '1%','1%', '10%', '10%', '10%', '10%' ,'1%', '1%'); // Fill out manually later + $heading = array('', '', 'Lieferschein', 'Adresse','Menge','Menge in Versandpaketen','Monitor','Pakete','Paket erstellen'); + $width = array( '1%','1%', '10%', '10%', '10%', '10%', '1%', '1%', '1%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('id','id','belegnr','name','lmenge','vmenge','(alle_versendet+alle_abgeschlossen*2)','id'); + $findcols = array('id','id','belegnr','name','lmenge','vmenge','(alle_versendet+alle_abgeschlossen*2)','id','id'); $searchsql = array('belegnr','name'); $defaultorder = 1; @@ -220,9 +291,9 @@ class Versandpakete { $menucol = 1; $moreinfoaction = "lieferschein"; $moreinfo = true; // Allow drop down details - $aligncenter = [5,6,7,8]; + $aligncenter = [5,6,7,8,9,10]; - $menu = "Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\">"; + $menu = "Conf->WFconf['defaulttheme']}/images/add.png\" border=\"0\">"; $sql_lieferschein_position = " SELECT @@ -272,8 +343,9 @@ class Versandpakete { CONCAT('',belegnr,''), name, ".$app->erp->FormatMenge("lmenge").", - ".$app->erp->FormatMenge("vmenge").", + ".$app->erp->FormatMenge("vmenge").", ".$app->YUI->IconsSQL_lieferung().", + CONCAT('Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\">'), id, alle_abgeschlossen FROM ( @@ -314,7 +386,7 @@ class Versandpakete { } $more_data2 = $app->Secure->GetGET("more_data2"); if ($more_data2 == 1) { - $where .= " AND (alle_versendet)"; + $where .= " AND (alle_versendet | eins_versendet)"; } else { } @@ -462,13 +534,11 @@ class Versandpakete { } function versandpakete_menu() { - $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=list", "Lieferungen"); - $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=pakete", "Versandpakete"); - $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=create", "Neu anlegen"); + $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=lieferungen", "Lieferungen"); + $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=list", "Versandpakete"); } - function versandpakete_pakete() { - $this->versandpakete_menu(); + function versandpakete_status_select() { // Status select $options_text = ""; foreach (self::STATUS as $status) @@ -476,6 +546,12 @@ class Versandpakete { $options_text .= ""; } $this->app->Tpl->Set('STATUS_OPTIONS', $options_text); + } + + function versandpakete_list() { + $this->versandpakete_menu(); + $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=create", "Neu anlegen"); + $this->versandpakete_status_select(); $this->app->YUI->TableSearch('TAB1', 'versandpakete_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "versandpakete_list.tpl"); } @@ -501,12 +577,48 @@ class Versandpakete { $this->versandpakete_list(); } - function versandpakete_list() { + function versandpakete_lieferungen() { $this->versandpakete_menu(); $this->app->YUI->TableSearch('TAB1', 'versandpakete_lieferscheine', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "versandpakete_lieferungen.tpl"); } + function versandpakete_lieferung() { + $lieferschein_filter = (int) $this->app->Secure->GetGET('id'); + $this->versandpakete_menu(); + $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=add&lieferschein=".$lieferschein_filter, "Neu anlegen"); + $this->app->User->SetParameter('versandpakete_lieferschein_filter',$lieferschein_filter); + $this->versandpakete_status_select(); + + $sql = "SELECT + versandpaket, + belegnr, + l.name + FROM + versandpaket_lieferschein_position vlp + INNER JOIN + lieferschein_position lp ON lp.id = vlp.lieferschein_position + INNER JOIN + lieferschein l ON l.id = lp.lieferschein + WHERE l.id = ".$lieferschein_filter." LIMIT 1"; + + $info = $this->app->DB->SelectArr($sql); + + $this->app->Tpl->Set('BELEGNR', $info[0]['belegnr']); + + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $info[0]['name']." Lieferung ".$info[0]['belegnr']); + + if ($this->versandpakete_check_completion($info[0]['versandpaket'])) { + $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE'); + } + else { + $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE'); + } + + $this->app->YUI->TableSearch('TAB1', 'lieferung_versandpakete_list', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->Tpl->Parse('PAGE', "versandpakete_lieferung.tpl"); + } + public function versandpakete_delete() { $id = (int) $this->app->Secure->GetGET('id'); @@ -533,10 +645,14 @@ class Versandpakete { function versandpakete_edit() { + $id = $this->app->Secure->GetGET('id'); + $lieferung = $this->app->Secure->GetGET('lieferung'); + + if ($lieferung) { + $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=lieferung&id=".$lieferung, "Zurück"); + } $this->versandpakete_menu(); - $id = $this->app->Secure->GetGET('id'); - // Check if other users are editing this id if($this->app->erp->DisableModul('versandpakete',$id)) { @@ -696,6 +812,13 @@ class Versandpakete { $icons = $this->app->DB->SelectArr($sql); $this->app->Tpl->Set('ICONS', $icons[0]['icons']); + if ($this->versandpakete_check_completion($id)) { + $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE'); + } + else { + $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE'); + } + $this->app->YUI->TableSearch('PAKETINHALT', 'versandpakete_paketinhalt_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "versandpakete_edit.tpl"); } @@ -780,16 +903,14 @@ class Versandpakete { foreach($lieferschein_positionen as $lieferschein_position) { $restmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge']; - if ($restmenge <= 0) { + if ($restmenge <= 0 || $menge <= 0) { continue; } - if ($menge > $restmenge) { $buchmenge = $restmenge; } else { $buchmenge = $menge; - } - + } $buchmenge_gesamt += $buchmenge; $menge -= $buchmenge; @@ -825,14 +946,21 @@ class Versandpakete { $msg = "
Keine passende Lieferscheinposition gefunden.
"; break; } - + $buchmenge_gesamt = 0; foreach($lieferschein_positionen as $lieferschein_position) { - $buchmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge']; + $buchmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge']; + if ($buchmenge <= 0) { + continue; + } + $buchmenge_gesamt += $buchmenge; $sql = "INSERT INTO versandpaket_lieferschein_position (versandpaket, lieferschein_position, menge) VALUES (".$id.",".$lieferschein_position['lp_id'].",".$buchmenge.") ON DUPLICATE KEY UPDATE menge = menge+'".$buchmenge."'"; $this->app->DB->Insert($sql); } - $msg = $this->app->erp->base64_url_encode("
Lieferschein hinzugefügt.
"); - header("Location: index.php?module=versandpakete&action=edit&id=".$id."&msg=$msg"); + + if ($buchmenge_gesamt > 0) { + $msg = $this->app->erp->base64_url_encode("
Lieferschein hinzugefügt.
"); + header("Location: index.php?module=versandpakete&action=edit&id=".$id."&msg=$msg"); + } break; } @@ -846,12 +974,94 @@ class Versandpakete { $this->app->User->SetParameter('versandpakete_lieferschein', $lieferschein); $this->app->User->SetParameter('versandpakete_versandpaket', $id); + if ($this->versandpakete_check_completion($id)) { + $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE'); + } + else { + $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE'); + } + $this->app->YUI->TableSearch('LIEFERSCHEININHALT', 'versandpakete_lieferschein_paket_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->TableSearch('PAKETINHALT', 'versandpakete_paketinhalt_list', "show", "", "", basename(__FILE__), __CLASS__); - $this->app->Tpl->Set('MESSAGE', $msg); + $this->app->Tpl->Add('MESSAGE', $msg); $this->app->Tpl->Parse('PAGE', "versandpakete_add.tpl"); } + function versandpakete_check_completion($id) : bool { + $sql_lieferschein = " + SELECT DISTINCT + lieferschein + FROM + versandpaket_lieferschein_position vlp + INNER JOIN lieferschein_position lp ON vlp.lieferschein_position = lp.id + WHERE versandpaket = ".$id; + + $sql_lieferschein_mengen = " + SELECT + belegnr, + lp.id lieferschein_position, + menge lmenge + FROM + lieferschein_position lp + INNER JOIN + artikel a ON a.id = lp.artikel + INNER JOIN + lieferschein l on l.id = lp.lieferschein + INNER JOIN + (".$sql_lieferschein.") lieferschein_filter + ON lieferschein_filter.lieferschein = lp.lieferschein + WHERE + a.lagerartikel + GROUP BY + lp.id + "; + + // Check completion + $sql_versandmengen = " + SELECT + v.id versandpaket, + lieferschein_position, + SUM(menge) vmenge + FROM + versandpaket_lieferschein_position vlp + INNER JOIN + versandpakete v ON v.id = vlp.versandpaket + WHERE + v.status <> 'storniert' + GROUP BY + lieferschein_position + "; + + $sql_intermediate = " + SELECT + vmengen.versandpaket, + GROUP_CONCAT(DISTINCT lmengen.belegnr SEPARATOR ', ') lieferscheine, + SUM(lmenge) lmenge, + SUM(vmenge) vmenge + FROM + (".$sql_lieferschein_mengen.") lmengen + LEFT JOIN + (".$sql_versandmengen.") vmengen + ON lmengen.lieferschein_position = vmengen.lieferschein_position + "; + + $sql = " + SELECT + *, + ".$this->app->YUI->IconsSQL_versandpaket()." icons + FROM + (".$sql_intermediate.") final INNER JOIN versandpakete v ON v.id = final.versandpaket + "; + + $completion = $this->app->DB->SelectArr($sql); + + if (!empty($completion)) { + if ($completion[0]['lmenge'] == $completion[0]['vmenge']) { + return(true); + } + } + return(false); + } function versandpakete_minidetail() { $id = $this->app->Secure->GetGET('id'); @@ -905,8 +1115,9 @@ class Versandpakete { FROM lieferschein l INNER JOIN lieferschein_position lp ON lp.lieferschein = l.id - INNER JOIN versandpaket_lieferschein_position vlp ON vlp.lieferschein_position = lp.id - WHERE l.id = ".$id." + INNER JOIN artikel a ON lp.artikel = a.id + LEFT JOIN versandpaket_lieferschein_position vlp ON vlp.lieferschein_position = lp.id + WHERE l.id = ".$id." AND a.lagerartikel GROUP BY lp.id" ); $table->DisplayNew('TABLE', 'Paket', 'noAction'); @@ -917,9 +1128,9 @@ class Versandpakete { function versandpakete_paketmarke() { - $this->versandpakete_menu(); $id = $this->app->Secure->GetGET('id'); $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=edit&id=".$id, "Zurück"); + $this->versandpakete_menu(); $this->app->Tpl->Set('TABTEXT',"Paketmarke"); diff --git a/www/themes/new/css/color3.css b/www/themes/new/css/color3.css index e847a0dc..f3c975c9 100644 --- a/www/themes/new/css/color3.css +++ b/www/themes/new/css/color3.css @@ -64,5 +64,6 @@ --error: #F05A5C; --error-color: #fff; --important: #68D4D0; - --success: #92EFB4; +/* --success: #92EFB4;*/ + --success: #2DCA73; } diff --git a/www/themes/new/css/styles.css b/www/themes/new/css/styles.css index b2cc3e3b..9c5dcab2 100644 --- a/www/themes/new/css/styles.css +++ b/www/themes/new/css/styles.css @@ -2961,7 +2961,6 @@ div.error > input[type=submit] { } .info, -.success, .error2 { background-color: var(--info); color: var(--info-color); @@ -2976,6 +2975,14 @@ div.error > input[type=submit] { background-size: 30px 30px; } +.success { + background-color: var(--success); + color: var(--info-color); + background-image: url('../images/info.png'); + background-size: 30px 30px; +} + + .pull-right { float: right !important; } @@ -3040,7 +3047,7 @@ div.error > input[type=submit] { #header div.headererror > input { padding: 5px; margin: 3px; - background-color: var(--info); + background-color: var(--success); color: var(--info-color); } diff --git a/www/themes/new/images/lagergo_stop_teil.png b/www/themes/new/images/lagergo_stop_teil.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d1cd0179c77fb82561fbf8dbd1350073ac247c GIT binary patch literal 10317 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 C0ij+1 literal 0 HcmV?d00001 diff --git a/www/themes/new/images/lagergo_teil.png b/www/themes/new/images/lagergo_teil.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2c2e7b9a90d581a428d3c595597c610a77e15d GIT binary patch literal 11224 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