From ad3769381857a5ca42234b95836a9488e4c6389d Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sat, 3 Aug 2024 13:27:45 +0200 Subject: [PATCH] seriennummern datum, eingelagert --- upgrade/data/db_schema.json | 22 +++ www/lib/class.erpapi.php | 6 + www/pages/content/seriennummern_select.tpl | 167 +++++++++++++++++++ www/pages/seriennummern.php | 179 ++++++++++++++------- 4 files changed, 312 insertions(+), 62 deletions(-) create mode 100644 www/pages/content/seriennummern_select.tpl diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index b1ea4924..8db55bb4 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -91422,6 +91422,17 @@ "Privileges": "select,insert,update,references", "Comment": "" }, + { + "Field": "datum", + "Type": "date", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "current_timestamp()", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, { "Field": "adresse", "Type": "int(11)", @@ -91455,6 +91466,17 @@ "Privileges": "select,insert,update,references", "Comment": "" }, + { + "Field": "eingelagert", + "Type": "int(1)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": 0, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, { "Field": "lieferung", "Type": "date", diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 4debd59d..a83744a5 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2826,6 +2826,11 @@ public function NavigationHooks(&$menu) $obj->seriennummern_check_and_message_stock_added($artikel_id); } + function SeriennummernCheckLieferscheinWarnung($lieferschein_id) { + $obj = $this->LoadModul('seriennummern'); + $obj->seriennummern_check_and_message_delivery_note_removed($lieferschein_id); + } + // @refactor in Lager Modul function ArtikelAnzahlLagerPlatzMitSperre($artikel,$lager_platz) { @@ -3552,6 +3557,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } $this->RunHook('erpapi_lieferschein_auslagern', 1, $lieferschein); + $this->SeriennummernCheckLieferscheinWarnung($lieferschein); $this->LieferscheinProtokoll($lieferschein,"Lieferschein ausgelagert"); } } diff --git a/www/pages/content/seriennummern_select.tpl b/www/pages/content/seriennummern_select.tpl new file mode 100644 index 00000000..c47de36e --- /dev/null +++ b/www/pages/content/seriennummern_select.tpl @@ -0,0 +1,167 @@ +
+ + +
+ [MESSAGE] +
+ [FORMHANDLEREVENT] +
+
+
+
+
+ {|Seriennummern wählen Artikel [ARTIKELNUMMER] [ARTIKEL]|} + + + + + + + + + + + + + + + + + +
+ {|Lagermenge|}: + + +
+ {|Seriennummern verfügbar|}: + + +
+ {|Seriennummern fehlen|}: + + +
+ {|Seriennummer scannen|}: + + +
+
+
+
+
+
+
+ {|Seriennummernassistent|} + + + + + + + + + + + + + + + + + + + + + +
+ {|Letzte Seriennummer|}: + + +
+ {|Präfix|}: + + +
+ {|Start|}: + + +
+ {|Postfix|}: + + +
+ {|Anzahl|}: + + +
+
+
+
+
+
+
+ {|Aktionen|} + + + + + + + +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+ {|Gewählte Seriennummern|} + + + + + +
+ {|Seriennummern|}: + + + Liste der Seriennummern, 1 pro Zeile +
+
+
+
+
+
+
+ {|Aktionen|} + + + + +
+ +
+
+
+
+
+
+
+
+
+ diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index d378faa7..d88ec33f 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -17,7 +17,8 @@ class Seriennummern { $this->app->ActionHandlerInit($this); $this->app->ActionHandler("list", "seriennummern_artikel_list"); - $this->app->ActionHandler("nummern_list", "seriennummern_nummern_list"); + $this->app->ActionHandler("nummern_list", "seriennummern_nummern_list"); + $this->app->ActionHandler("lieferscheine_list", "seriennummern_lieferscheine_list"); $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); $this->app->DefaultActionHandler("list"); @@ -32,13 +33,13 @@ class Seriennummern { switch ($name) { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); - $heading = array('','','Nummer','Artikel', 'Seriennummer','Erfasst am','Adresse','Lieferschein','Lieferdatum', 'Menü'); + $heading = array('','','Nummer','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); $width = array('1%','1%','10%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('s.id','s.id', 'a.nummer', 'a.name_de', 's.seriennummer','s.logdatei','ad.name','l.belegnr','l.datum','s.id'); + $findcols = array('s.id','s.id', 'a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','ad.name','l.belegnr','l.datum','s.id'); $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; @@ -63,7 +64,8 @@ class Seriennummern { CONCAT('',a.nummer,'') as nummer, a.name_de, s.seriennummer, - ".$app->erp->FormatDateTime("s.logdatei").", + ".$app->erp->FormatDate("s.datum").", + if(s.eingelagert,'Ja','Nein'), ad.name, l.belegnr, ".$app->erp->FormatDate("l.datum").", @@ -108,7 +110,7 @@ class Seriennummern { $more_data1 = $app->Secure->GetGET("more_data1"); if ($more_data1 == 1) { - $where .= " AND s.lieferscheinpos = 0"; + $where .= " AND s.eingelagert = 1"; } else { } @@ -124,13 +126,13 @@ class Seriennummern { break; case "seriennummern_artikel_list": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('','', 'Nummer', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü',''); + $heading = array('','', 'Nummer', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü',''); $width = array('1%','1%','10%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('a.id','a.id', 'a.nummer', 'a.name_de' ); + $findcols = array('a.id','a.id', 'a.nummer', 'a.name_de' , 'null', 'null', 'null', 'null', 'null', 'null'); $searchsql = array('a.name_de', 'a.nummer'); $menucol = 1; @@ -166,7 +168,7 @@ class Seriennummern { CONCAT('',a.nummer,'') as nummer, a.name_de, ".$app->erp->FormatMenge('auf_lager.anzahl').", - SUM(if(s.id IS NULL,0,1))-SUM(if(s.lieferscheinpos <> 0,1,0)), + SUM(if(s.eingelagert <> 0,1,0)), SUM(if(s.lieferscheinpos <> 0,1,0)), SUM(if(s.id IS NULL,0,1)), ".$app->erp->ConcatSQL($menu_link).", @@ -200,14 +202,14 @@ class Seriennummern { break; case "seriennummern_lieferscheine_list": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('','', 'Nummer', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü'); + $heading = array('','', 'Lieferschein', 'Vom', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); $width = array('1%','1%','10%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('a.id','a.id', 'a.nummer', 'a.name_de' ); - $searchsql = array('a.name_de', 'a.nummer'); + $findcols = array('l.id','l.id', 'l.belegnr', 'l.datum', 'adr.name', 'null', 'null', 'null', 'null', 'null'); + $searchsql = array('l.belegnr'); $defaultorder = 1; $defaultorderdesc = 0; @@ -216,49 +218,44 @@ class Seriennummern { $numbercols = array(); $sumcol = array(); - $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; + $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; -// $moreinfo = true; // Allow drop down details -// $moreinfoaction = "lieferschein"; // specify suffix for minidetail-URL to allow different minidetails -// $menucol = 11; // Set id col for moredata/menu + //$menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
"; - $menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
"; + $menu_link = array( + '', + '', + '', + ); $sql = "SELECT SQL_CALC_FOUND_ROWS - a.id, - $dropnbox, - CONCAT('',a.nummer,'') as nummer, - a.name_de, - ".$app->erp->FormatMenge('auf_lager.anzahl').", - SUM(if(s.id IS NULL,0,1))-SUM(if(s.lieferscheinpos <> 0,1,0)), - SUM(if(s.lieferscheinpos <> 0,1,0)), - SUM(if(s.id IS NULL,0,1)) - FROM - artikel a - LEFT JOIN - ( - SELECT - a.id, - a.nummer, - a.name_de name, - SUM(lpi.menge) anzahl + l.id, + $dropnbox, + l.belegnr, + ".$app->erp->FormatDate("l.datum").", + adr.name, + ".$app->erp->FormatMengeFuerFormular("SUM(menge)").", + ".$app->erp->FormatMengeFuerFormular("COUNT(s.id)").", + ".$app->erp->FormatMengeFuerFormular("SUM(menge)-COUNT(s.id)").", + ".$app->erp->ConcatSQL($menu_link).", + l.id FROM - artikel a - INNER JOIN lager_platz_inhalt lpi ON - a.id = lpi.artikel - WHERE - a.seriennummern <> 'keine' AND a.seriennummern <> '' - GROUP BY - a.id - ) auf_lager ON auf_lager.id = a.id - LEFT JOIN - seriennummern s ON s.artikel = a.id + lieferschein_position lp + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN artikel a ON + a.id = lp.artikel + INNER JOIN adresse adr ON + adr.id = l.adresse + LEFT JOIN seriennummern s ON + lp.id = s.lieferscheinpos "; - $where = "a.seriennummern <> 'keine' AND a.seriennummern <> ''"; - $count = "SELECT count(DISTINCT a.id) FROM artikel a WHERE $where"; - $groupby = "GROUP BY a.id"; - + $where = "(a.seriennummern <> 'keine') AND (l.datum >= (SELECT MIN(datum) FROM seriennummern WHERE artikel = a.id))"; + $count = ""; + $groupby = "GROUP BY l.id"; break; } @@ -275,6 +272,7 @@ class Seriennummern { function seriennummern_menu() { $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Übersicht"); $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=nummern_list", "Seriennummern"); + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=lieferscheine_list", "Lieferscheine"); // $this->app->erp->MenuEintrag("index.php", "Zurück"); } @@ -359,6 +357,14 @@ class Seriennummern { $this->app->Tpl->Parse('PAGE', "seriennummern_list.tpl"); } + function seriennummern_lieferscheine_list() { + $this->seriennummern_menu(); + $this->seriennummern_check_and_message(null); + + $this->app->YUI->TableSearch('TAB1', 'seriennummern_lieferscheine_list', "show", "", "", basename(__FILE__), __CLASS__); + + $this->app->Tpl->Parse('PAGE', "seriennummern_list.tpl"); + } public function seriennummern_delete() { $id = (int) $this->app->Secure->GetGET('id'); @@ -405,7 +411,7 @@ class Seriennummern { continue; } - $sql = "INSERT INTO seriennummern (seriennummer, artikel, logdatei) VALUES ('".$this->app->DB->real_escape_string($seriennummer)."', '".$artikel_id."', CURRENT_TIMESTAMP)"; + $sql = "INSERT INTO seriennummern (seriennummer, artikel, logdatei, eingelagert) VALUES ('".$this->app->DB->real_escape_string($seriennummer)."', '".$artikel_id."', CURRENT_TIMESTAMP, 1)"; try { $this->app->DB->Insert($sql); } catch (mysqli_sql_exception $e) { @@ -519,14 +525,41 @@ class Seriennummern { $result = $this->app->DB->SelectArr($sql); return(empty($result)?array():$result); } - - /** - * @param int $printerId - * @param string $filename - * - * @return void + + /* + * Check if all delivery notes have serials + * Return array of delivery note positions and head information */ - protected function seriennummern_create_notification($artikel_id, $action, $title = 'Seriennummern', $message = 'Meldung', $button = 'Ok') + public function seriennummern_check_deliver_notes($lieferschein_id = null) : array { + $sql = " + SELECT + l.id lieferschein, + l.datum, + l.belegnr lieferschein_belegnr, + lp.id lieferschein_position, + a.nummer, + menge, + COUNT(s.id) anzahl_nummern, + GROUP_CONCAT(s.seriennummer) + FROM + lieferschein_position lp + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN artikel a ON + a.id = lp.artikel + LEFT JOIN seriennummern s ON + lp.id = s.lieferscheinpos + WHERE (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') + GROUP BY + lp.id + HAVING menge > anzahl_nummern + "; + + $result = $this->app->DB->SelectArr($sql); + return(empty($result)?array():$result); + } + + protected function seriennummern_create_notification_artikel($artikel_id, $action, $title = 'Seriennummern', $message = 'Meldung', $button = 'Ok') { // Notification erstellen $notification_message = new NotificationMessageData('default', $title); @@ -547,6 +580,28 @@ class Seriennummern { $notification = $this->app->Container->get('NotificationService'); $notification->createFromData($this->app->User->GetID(), $notification_message); } + + protected function seriennummern_create_notification_lieferschein($lieferschein_id, $action, $title = 'Seriennummern', $message = 'Meldung', $button = 'Ok') + { + // Notification erstellen + $notification_message = new NotificationMessageData('default', $title); + $lieferschein = $this->app->DB->SelectRow("SELECT belegnr FROM lieferschein WHERE id = '".$lieferschein_id."' LIMIT 1"); + $notification_message->setMessage($message.' Lieferschein '.$lieferschein['belegnr']); + $notification_message->addTags(['seriennummern']); + $notification_message->setPriority(true); + + $messageButtons = [ + [ + 'text' => $button, + 'link' => sprintf('index.php?module=seriennummern&action='.$action.'&lieferschein=%s', $lieferschein_id), + ] + ]; + $notification_message->setOption('buttons', $messageButtons); + + /** @var NotificationService $notification */ + $notification = $this->app->Container->get('NotificationService'); + $notification->createFromData($this->app->User->GetID(), $notification_message); + } /* * Check if new numbers need to be entered, if yes, create notification @@ -554,17 +609,17 @@ class Seriennummern { public function seriennummern_check_and_message_stock_added(int $artikel_id) { $check_seriennummern = $this->seriennummern_check_serials($artikel_id); if ($check_seriennummern[0]['menge_nummern'] < $check_seriennummern[0]['menge_auf_lager']) { - $this->seriennummern_create_notification($artikel_id, 'enter', 'Seriennummern','Bitte Seriennummern für Einlagerung erfassen','Zur Eingabe'); + $this->seriennummern_create_notification_artikel($artikel_id, 'enter', 'Seriennummern','Bitte Seriennummern für Einlagerung erfassen','Zur Eingabe'); } - } - + } + /* * Check if numbers need to be entered after stock removal, if yes, create notification */ - public function seriennummern_check_and_message_stock_removed(int $artikel_id) { - $check_seriennummern = $this->seriennummern_check_serials($artikel_id); - if ($check_seriennummern[0]['menge_nummern'] > $check_seriennummern[0]['menge_auf_lager']) { - $this->seriennummern_create_notification($artikel_id, 'enter', 'Seriennummern','Bitte Seriennummern für Auslagerung erfassen','Zur Eingabe'); + public function seriennummern_check_and_message_delivery_note_removed(int $lieferschein_id) { + $check_deliver_notes = $this->seriennummern_check_deliver_notes($lieferschein_id); + if (!empty($check_deliver_notes)) { + $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); } }