From ea1d578ffadcfb712df553972f92e8d936ca3515 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 26 Jul 2024 14:38:14 +0200 Subject: [PATCH 01/25] Seriennummern initial --- upgrade/data/db_schema.json | 9 + www/pages/ajax.php | 10 + www/pages/content/seriennummern_edit.tpl | 215 +++++++++++ www/pages/content/seriennummern_enter.tpl | 167 ++++++++ www/pages/content/seriennummern_list.tpl | 16 + www/pages/seriennummern.php | 447 ++++++++++++++++++++++ 6 files changed, 864 insertions(+) create mode 100644 www/pages/content/seriennummern_edit.tpl create mode 100644 www/pages/content/seriennummern_enter.tpl create mode 100644 www/pages/content/seriennummern_list.tpl create mode 100644 www/pages/seriennummern.php diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index e6a0f50d..b1ea4924 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -91519,6 +91519,15 @@ "id" ], "Non_unique": "" + }, + { + "Key_name": "seriennummer_artikel", + "Index_type": "BTREE", + "columns": [ + "seriennummer", + "artikel" + ], + "Non_unique": "UNIQUE" } ] }, diff --git a/www/pages/ajax.php b/www/pages/ajax.php index 3a08c07e..f3826b9b 100644 --- a/www/pages/ajax.php +++ b/www/pages/ajax.php @@ -2608,6 +2608,16 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku $newarr[] = $arr[$i]['name']; } break; + case "seriennummerverfuegbar": + $artikel = (int)$this->app->Secure->GetGET('artikel'); + $arr = $this->app->DB->SelectArr("SELECT seriennummer FROM seriennummern WHERE lieferschein = 0 AND seriennummer LIKE '%$term%' AND artikel = '$artikel' LIMIT 20"); + $carr = !empty($arr)?count($arr):0; + for($i = 0; $i < $carr; $i++) { + $newarr[] = $arr[$i]['seriennummer']; + } + break; + + break; case "artikelmengeinbeleg": $beleg = $this->app->Secure->GetGet('beleg'); $belegid = $this->app->Secure->GetGet('id'); diff --git a/www/pages/content/seriennummern_edit.tpl b/www/pages/content/seriennummern_edit.tpl new file mode 100644 index 00000000..0fa2f0eb --- /dev/null +++ b/www/pages/content/seriennummern_edit.tpl @@ -0,0 +1,215 @@ +
+ + +
+ [MESSAGE] +
+ [FORMHANDLEREVENT] +
+
+
+
+
+ {|seriennummern|}Info like this. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {|Seriennummer|}: + + +
+ {|Adresse|}: + + +
+ {|Artikel|}: + + +
+ {|Beschreibung|}: + + +
+ {|Lieferung|}: + + +
+ {|Lieferschein|}: + + +
+ {|Lieferscheinpos|}: + + +
+ {|Bearbeiter|}: + + +
+ {|Logdatei|}: + + +
+
+
+
+
+
+ + +
+
+ +
+ diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl new file mode 100644 index 00000000..bee44aea --- /dev/null +++ b/www/pages/content/seriennummern_enter.tpl @@ -0,0 +1,167 @@ +
+ + +
+ [MESSAGE] +
+ [FORMHANDLEREVENT] +
+
+
+
+
+ {|Seriennummern erfassen 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/content/seriennummern_list.tpl b/www/pages/content/seriennummern_list.tpl new file mode 100644 index 00000000..b5bec045 --- /dev/null +++ b/www/pages/content/seriennummern_list.tpl @@ -0,0 +1,16 @@ +
+ +
+ [MESSAGE] + [TAB1] + [TAB1NEXT] +
+
+ [MESSAGE] + [TAB2] + [TAB2NEXT] +
+
diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php new file mode 100644 index 00000000..70427ec7 --- /dev/null +++ b/www/pages/seriennummern.php @@ -0,0 +1,447 @@ +app = $app; + if ($intern) + return; + + $this->app->ActionHandlerInit($this); + $this->app->ActionHandler("list", "seriennummern_list"); + $this->app->ActionHandler("enter", "seriennummern_enter"); + $this->app->ActionHandler("delete", "seriennummern_delete"); + $this->app->DefaultActionHandler("list"); + $this->app->ActionHandlerListen($app); + } + + public function Install() { + /* Fill out manually later */ + } + + static function TableSearch(&$app, $name, $erlaubtevars) { + switch ($name) { + case "seriennummern_list": + $allowed['seriennummern_list'] = array('list'); + $heading = array('','','Artikel', 'Seriennummer','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', 's.seriennummer','ad.name','l.belegnr','l.datum','s.id'); + + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $alignright = array(); + $numbercols = array(); + $sumcol = array(); + + $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/delete.svg\" border=\"0\">" . "
"; + + $sql = " + SELECT SQL_CALC_FOUND_ROWS + s.id, + $dropnbox, + a.nummer, + s.seriennummer, + ad.name, + l.belegnr, + ".$app->erp->FormatDate("l.datum").", + s.id + FROM + seriennummern s + INNER JOIN + artikel a ON s.artikel = a.id + LEFT JOIN + lieferschein_position lp ON lp.id = s.lieferscheinpos + LEFT JOIN + lieferschein l ON l.id = lp.lieferschein + LEFT JOIN + adresse ad ON ad.id = l.adresse + "; + + $where = "1"; + $count = "SELECT count(DISTINCT id) FROM seriennummern WHERE $where"; +// $groupby = ""; + + break; + case "seriennummern_artikel_list": + $allowed['seriennummern_artikel_list'] = array('list'); + $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' ); + $searchsql = array('a.name_de', 'a.nummer'); + + $menucol = 1; + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $alignright = array(); + $numbercols = array(); + $sumcol = array(); + + $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_link = array( + '', + 'Erfassen', + '' + ); + + $sql = "SELECT SQL_CALC_FOUND_ROWS + a.id, + $dropnbox, + CONCAT('',a.nummer,'') as nummer, + a.name_de, + 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)), + ".$app->erp->ConcatSQL($menu_link).", + a.id + FROM + artikel a + LEFT JOIN + ( + SELECT + a.id, + a.nummer, + a.name_de name, + SUM(lpi.menge) anzahl + 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 + "; + + $where = "a.seriennummern <> 'keine' AND a.seriennummern <> ''"; + $count = "SELECT count(DISTINCT a.id) FROM artikel a WHERE $where"; + $groupby = "GROUP BY a.id"; + + break; + case "seriennummern_lieferscheine_list": + $allowed['seriennummern_artikel_list'] = array('list'); + $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' ); + $searchsql = array('a.name_de', 'a.nummer'); + + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $alignright = array(); + $numbercols = array(); + $sumcol = array(); + + $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\">" . "
"; + + $sql = "SELECT SQL_CALC_FOUND_ROWS + a.id, + $dropnbox, + CONCAT('',a.nummer,'') as nummer, + a.name_de, + 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 + 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 + "; + + $where = "a.seriennummern <> 'keine' AND a.seriennummern <> ''"; + $count = "SELECT count(DISTINCT a.id) FROM artikel a WHERE $where"; + $groupby = "GROUP BY a.id"; + + break; + } + + $erg = false; + + foreach ($erlaubtevars as $k => $v) { + if (isset($$v)) { + $erg[$v] = $$v; + } + } + return $erg; + } + + function seriennummern_list() { + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Übersicht"); + + $this->app->erp->MenuEintrag("index.php", "Zurück"); + + $this->app->YUI->TableSearch('TAB1', 'seriennummern_artikel_list', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->YUI->TableSearch('TAB2', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); + + $check_seriennummern = $this->seriennummern_check_serials(); + + if (!empty($check_seriennummern)) { + $artikel_id_links = array(); + foreach ($check_seriennummern as $artikel_id) { + if ($artikel_id['menge_nummern'] < $artikel_id['menge_auf_lager']) { + $artikel_id_links[] = ''.$artikel_id['nummer'].''; + } + } + if (!empty($artikel_id_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Artikel: '.implode(', ',$artikel_id_links)); + } + } + + $this->app->Tpl->Parse('PAGE', "seriennummern_list.tpl"); + } + + public function seriennummern_delete() { + $id = (int) $this->app->Secure->GetGET('id'); + + if ($this->app->DB->Select("SELECT id FROM `seriennummern` WHERE `id` = '{$id}' AND `lieferscheinpos` = 0")) { + $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}' AND `lieferscheinpos` = 0"); + $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); + } else { + $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden!'); + } + $this->seriennummern_list(); + } + + function seriennummern_enter() { + + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Zurück zur Übersicht"); + $artikel_id = (int) $this->app->Secure->GetGET('artikel'); + + $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); + + $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + + $submit = $this->app->Secure->GetPOST('submit'); + $seriennummern = array(); + + $seriennummern_text = $this->app->Secure->GetPOST('seriennummern'); + $seriennummern = explode('\n',str_replace(['\r'],'',$seriennummern_text)); + + switch ($submit) { + case 'hinzufuegen': + $eingabe = $this->app->Secure->GetPOST('eingabeneu'); + if (!empty($eingabe)) { + $seriennummern[] = $eingabe; + } + break; + case 'speichern': + $seriennummern_not_written = array(); + foreach ($seriennummern as $seriennummer) { + + $seriennummer = trim($seriennummer); + + if (empty($seriennummer)) { + continue; + } + + $sql = "INSERT INTO seriennummern (seriennummer, artikel) VALUES ('".$this->app->DB->real_escape_string($seriennummer)."', '".$artikel_id."')"; + try { + $this->app->DB->Insert($sql); + } catch (mysqli_sql_exception $e) { + $error = true; + $seriennummern_not_written[] = $seriennummer; + } + } + if ($error) { + $this->app->Tpl->addMessage('error', 'Einige Seriennummern konnten nicht gespeichert werden.'); + } + $seriennummern = $seriennummern_not_written; + break; + case 'assistent': + $praefix = $this->app->Secure->GetPOST('praefix'); + $start = $this->app->Secure->GetPOST('start'); + $postfix = $this->app->Secure->GetPOST('postfix'); + $anzahl = (int) $this->app->Secure->GetPOST('anzahl'); + + while ($anzahl) { + $seriennummern[] = $praefix.$start.$postfix; + $anzahl--; + $start++; + } + + break; + } + + $seriennummern = array_unique($seriennummern); + + $check_seriennummern = $this->seriennummern_check_serials($artikel_id); + if (empty($check_seriennummern)) { + $this->app->Tpl->addMessage('success', 'Seriennummern vollständig.'); + } + + $check_seriennummern = $check_seriennummern[0]; + + $anzahl_fehlt = $check_seriennummern['menge_auf_lager']-$check_seriennummern['menge_nummern']; + + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $letzte_seriennummer = (string) $this->app->DB->Select("SELECT seriennummer FROM seriennummern WHERE artikel = '".$artikel_id."' ORDER BY id DESC LIMIT 1"); + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); + + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + + $this->app->Tpl->Set('PRAEFIX', $matches[1]); + $this->app->Tpl->Set('START', $matches[2]+1); + $this->app->Tpl->Set('POSTFIX', $matches[3]); + + $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); + + $this->app->Tpl->Set('ARTIKELNUMMER', ''.$check_seriennummern['nummer'].''); + $this->app->Tpl->Set('ARTIKEL', $check_seriennummern['name']); + $this->app->Tpl->Set('ANZLAGER', $check_seriennummern['menge_auf_lager']); + $this->app->Tpl->Set('ANZVORHANDEN', $check_seriennummern['menge_nummern']); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + + $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&artikel=$artikel_id"); + $this->app->Tpl->Parse('PAGE', "seriennummern_enter.tpl"); + + } + + /* + * Check if all serial numbers are given + * Return array of article ids + */ + public function seriennummern_check_serials($artikel_id = null) : array { + $sql = " + SELECT + auf_lager.id, + nummer, + name, + auf_lager.anzahl menge_auf_lager, + COALESCE(nummern_verfuegbar.anzahl,0) menge_nummern + FROM + ( + SELECT + a.id, + a.nummer, + a.name_de name, + SUM(lpi.menge) anzahl + FROM + artikel a + INNER JOIN lager_platz_inhalt lpi ON + a.id = lpi.artikel + WHERE + a.seriennummern <> 'keine' AND a.seriennummern <> '' AND (a.id = '".$artikel_id."' OR '".$artikel_id."' = '') + GROUP BY + a.id + ) auf_lager + LEFT JOIN( + SELECT + artikel, + COUNT(id) anzahl + FROM + seriennummern + WHERE + lieferscheinpos = 0 + GROUP BY + artikel + ) nummern_verfuegbar + ON + auf_lager.id = nummern_verfuegbar.artikel + GROUP BY + auf_lager.id + HAVING + menge_nummern <> menge_auf_lager + "; + + $result = $this->app->DB->SelectArr($sql); + return(empty($result)?array():$result); + } + + /** + * @param int $printerId + * @param string $filename + * + * @return void + */ + protected function seriennummern_create_notification($article) + { + // Notification erstellen + $message = new NotificationMessageData('default', 'Seriennummern check problem alter'); + $message->setMessage('Nicht genug Seriendinges'); + $message->addTags(['seriennummern']); + $message->setOption('id', $article); + $message->setPriority(true); + + $messageButtons = [ + [ + 'text' => 'Seriennummern pflegen', + 'link' => sprintf('index.php?module=seriennummern&action=edit&article=%s', $article), + ], + [ + 'text' => 'Zum Spooler', + 'link' => '#' + ] + ]; + $message->setOption('buttons', $messageButtons); + + /** @var NotificationService $notification */ + $notification = $this->app->Container->get('NotificationService'); + $notification->createFromData($this->app->User->GetID(), $message); + } + } From a653e527847862687b486538e425e5baf3b8f9e8 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 26 Jul 2024 14:40:10 +0200 Subject: [PATCH 02/25] seriennummern removed Xentral legacy --- www/lib/class.erpapi.php | 8 +++--- www/pages/content/einlagern.tpl | 2 -- www/pages/lager.php | 43 ++++++++++++++++++++++++--------- www/pages/lieferschein.php | 8 +++--- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 381e6114..b065dbb9 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2904,7 +2904,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { - $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); +// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } @@ -2931,7 +2931,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { - $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); +// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } @@ -2957,7 +2957,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { - $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); +// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } @@ -2966,7 +2966,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu }else{ if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { - $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); +// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } diff --git a/www/pages/content/einlagern.tpl b/www/pages/content/einlagern.tpl index b39ec8be..9f7449a9 100644 --- a/www/pages/content/einlagern.tpl +++ b/www/pages/content/einlagern.tpl @@ -24,8 +24,6 @@ [SHOWCHRSTART] 
({|Chargennummer von Hersteller|})  
({|Infos zur Charge|})
[SHOWCHREND] - [SHOWSRNSTART]{|Seriennummern|}:
[SERIENNUMMERN]({|Pro Artikel eine Nummer|}) -
[SHOWSRNEND]
[PROJEKTAUTOEND][PROJEKTAUTOEND] diff --git a/www/pages/lager.php b/www/pages/lager.php index 440ec1b0..174d6d64 100644 --- a/www/pages/lager.php +++ b/www/pages/lager.php @@ -1882,13 +1882,14 @@ class Lager extends GenLager { { $this->app->Tpl->Add('SRNINFO',"Charge: ".$charge[$i-1]['charge'].""); } +/* XENTRAL Legacy $srn = $this->app->DB->SelectArr("SELECT * FROM lager_seriennummern WHERE zwischenlagerid='$id'"); $csrn = !empty($srn)?count($srn):0; for($i=1;$i<=$csrn;$i++) { $this->app->Tpl->Add('SRNINFO',"Seriennummer: ".$srn[$i-1]['seriennummer'].""); } - +*/ $this->app->Tpl->Set('SHOWCHRSTART',''); if((!empty($mhd)?count($mhd):0) <=0) @@ -1896,8 +1897,10 @@ class Lager extends GenLager { $this->app->Tpl->Set('SHOWMHDSTART',''); } +/* XENTRAL Legacy $this->app->Tpl->Set('SHOWSRNSTART',''); +*/ } else { $this->app->Tpl->Set('WOHERREADONLYSTART2',''); @@ -2042,13 +2045,13 @@ class Lager extends GenLager { $suggestedbatch = $suggestedbestbeforebatch; } - +/* XENTRAL Legacy $seriennummern = $artArr['seriennummern']; if($seriennummern != '' && $seriennummern !== 'keine') { $menge = (int)$menge; } // pruefen einlagern - +*/ $error = 0; // Pflichtfelder pruefen $checkmhd = $this->app->String->Convert($this->app->Secure->GetPOST('mhd'),'%1.%2.%3','%3-%2-%1'); @@ -2059,6 +2062,8 @@ class Lager extends GenLager { if(($chargenverwaltung=='2' || $chargenverwaltung=="1") && $this->app->Secure->GetPOST('charge')=='' && $zwischenlagerid <=0) { $error++; } + +/* XENTRAL Legacy if( ($seriennummern !=='keine' && $seriennummern !=='vomprodukt' && $seriennummern !=='eigene' && $seriennummern!='') && $cmd!=='zwischenlager') { $tmpcheck = $this->app->Secure->GetPOST("seriennummern"); for($checkser=0;$checkser < $menge; $checkser++) { @@ -2067,6 +2072,7 @@ class Lager extends GenLager { } } } +*/ if($submit!='' && $error > 0) { $alles_komplett++; @@ -2130,9 +2136,10 @@ class Lager extends GenLager { $this->app->erp->AddChargeLagerOhneBewegung($artikel,$menge,$regal,$datum,$chargemindest,$chargesnmhdbemerkung,0,'',0,$isInterim); } +/* XENTRAL Legacy //Seriennummern buchen $tmpcheck = $this->app->Secure->GetPOST('seriennummern'); - +*/ if($artikelid!=''){ $this->app->Location->execute('index.php?module=artikel&action=lager&id='.$artikelid.($msg!=""?"&msg=".$msg:"")); @@ -2272,7 +2279,7 @@ class Lager extends GenLager { $this->app->Tpl->Set('MHDVALUE', $frmmhd); } - + /* XENTRAL Legacy if($seriennummern === 'keine' || $seriennummern ==='vomprodukt' || $seriennummern ==='eigene' || $menge <= 0 || $seriennummern=='') { $this->app->Tpl->Set('SHOWSRNSTART','Aktionen|} + + + + +
+ +
+ + + + + +
+
+
{|Filter|} +
+ +
+
+
+
+
+
+ [TAB1] + [TAB1NEXT] +
+
+
+
+ + + diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index acd19138..a9d97451 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -16,7 +16,8 @@ class Seriennummern { return; $this->app->ActionHandlerInit($this); - $this->app->ActionHandler("list", "seriennummern_list"); + $this->app->ActionHandler("list", "seriennummern_artikel_list"); + $this->app->ActionHandler("nummern_list", "seriennummern_nummern_list"); $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); $this->app->DefaultActionHandler("list"); @@ -31,14 +32,14 @@ class Seriennummern { switch ($name) { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); - $heading = array('','','Nummer','Artikel', 'Seriennummer','Erzeugt am','Adresse','Lieferschein','Lieferdatum', 'Menü'); + $heading = array('','','Nummer','Artikel', 'Seriennummer','Erfasst am','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.name_de', 'a.nummer', 's.seriennummer','s.logdatei','ad.name','l.belegnr','l.datum','s.id'); - $searchsql = array('a.name_de', 'a.name_de', 'a.nummer', 's.seriennummer'); + $findcols = array('s.id','s.id', 'a.nummer', 'a.name_de', 's.seriennummer','s.logdatei','ad.name','l.belegnr','l.datum','s.id'); + $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; $defaultorderdesc = 0; @@ -79,8 +80,45 @@ class Seriennummern { adresse ad ON ad.id = l.adresse "; - $where = "1"; - $count = "SELECT count(DISTINCT id) FROM seriennummern WHERE $where"; + $artikel_id = $app->User->GetParameter('seriennummern_artikel_id'); + + $where = "(a.id = '".$artikel_id."' OR '".$artikel_id."' = '')"; + + // Toggle filters + $app->Tpl->Add('JQUERYREADY', "$('#verfuegbar').click( function() { fnFilterColumn1( 0 ); } );"); + $app->Tpl->Add('JQUERYREADY', "$('#versendet').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; + + $(\'#' . $name . '\').dataTable().fnFilter( + \'\', + i, + 0,0 + ); + } + '); + } + + $more_data1 = $app->Secure->GetGET("more_data1"); + if ($more_data1 == 1) { + $where .= " AND s.lieferscheinpos = 0"; + } else { + } + + $more_data2 = $app->Secure->GetGET("more_data2"); + if ($more_data2 == 1) { + $where .= " AND s.lieferscheinpos <> 0"; + } else { + } + + $count = "SELECT count(DISTINCT s.id) FROM seriennummern s LEFT JOIN artikel a on a.id = s.artikel WHERE $where"; // $groupby = ""; break; @@ -114,6 +152,11 @@ class Seriennummern { ['sql' => 'a.id'], '">', '', + '', + '', + '', '' ); @@ -229,31 +272,94 @@ class Seriennummern { return $erg; } - function seriennummern_list() { + function seriennummern_menu() { $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Übersicht"); - - $this->app->erp->MenuEintrag("index.php", "Zurück"); - - $this->app->YUI->TableSearch('TAB1', 'seriennummern_artikel_list', "show", "", "", basename(__FILE__), __CLASS__); - $this->app->YUI->TableSearch('TAB2', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); - - $check_seriennummern = $this->seriennummern_check_serials(); + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=nummern_list", "Seriennummern"); + // $this->app->erp->MenuEintrag("index.php", "Zurück"); + } + + function seriennummern_check_and_message($artikel_id) { + $check_seriennummern = $this->seriennummern_check_serials($artikel_id); if (!empty($check_seriennummern)) { - $artikel_id_links = array(); + $artikel_minus_id_links = array(); + $artikel_plus_id_links = array(); foreach ($check_seriennummern as $artikel_id) { if ($artikel_id['menge_nummern'] < $artikel_id['menge_auf_lager']) { - $artikel_id_links[] = ''.$artikel_id['nummer'].''; + $artikel_minus_id_links[] = ''.$artikel_id['nummer'].''; + } + else if ($artikel_id['menge_nummern'] > $artikel_id['menge_auf_lager']) { + $artikel_plus_id_links[] = ''.$artikel_id['nummer'].''; } } - if (!empty($artikel_id_links)) { - $this->app->YUI->Message('warning','Seriennummern fehlen für Artikel: '.implode(', ',$artikel_id_links)); + if (!empty($artikel_minus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Artikel: '.implode(', ',$artikel_minus_id_links)); } - } + if (!empty($artikel_plus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Artikel: '.implode(', ',$artikel_plus_id_links)); + } + } + } + + function seriennummern_nummern_list() { + + $this->seriennummern_menu(); + // For transfer to tablesearch + $artikel_id = $this->app->Secure->GetGET('artikel'); + $this->app->User->SetParameter('seriennummern_artikel_id', $artikel_id); + + if (empty($artikel_id)) { + $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); + } else { + $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); + + $check_seriennummern = $this->seriennummern_check_serials($artikel_id); + $check_seriennummern = $check_seriennummern[0]; + + $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Anzeigen'); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + + $anzahl_fehlt = $check_seriennummern['menge_auf_lager']-$check_seriennummern['menge_nummern']; + + if ($anzahl_fehlt == 0) { + $this->app->Tpl->addMessage('success', 'Seriennummern vollständig.'); + } + + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $letzte_seriennummer = (string) $this->app->DB->Select("SELECT seriennummer FROM seriennummern WHERE artikel = '".$artikel_id."' ORDER BY id DESC LIMIT 1"); + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + + $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); + $this->app->Tpl->Set('ARTIKEL_ID', $artikel_id); + + $this->app->Tpl->Set('ARTIKELNUMMER', ''.$check_seriennummern['nummer'].''); + $this->app->Tpl->Set('ARTIKEL', $check_seriennummern['name']); + $this->app->Tpl->Set('ANZLAGER', $check_seriennummern['menge_auf_lager']); + $this->app->Tpl->Set('ANZVORHANDEN', $check_seriennummern['menge_nummern']); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + } + + $this->seriennummern_check_and_message($artikel_id); + + $this->app->YUI->TableSearch('TAB1', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); + + $this->app->Tpl->Parse('PAGE', "seriennummern_nummern_list.tpl"); + } + + function seriennummern_artikel_list() { + $this->seriennummern_menu(); + $this->seriennummern_check_and_message(null); + + $this->app->YUI->TableSearch('TAB1', 'seriennummern_artikel_list', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->Tpl->Parse('PAGE', "seriennummern_list.tpl"); } + public function seriennummern_delete() { $id = (int) $this->app->Secure->GetGET('id'); diff --git a/www/themes/new/images/lupe.svg b/www/themes/new/images/lupe.svg new file mode 100644 index 00000000..ef5adf6b --- /dev/null +++ b/www/themes/new/images/lupe.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2ebf0a91c6347957192f3f8be9b8f749dc9e5aee Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sun, 28 Jul 2024 14:14:03 +0200 Subject: [PATCH 05/25] bugfix seriennummern_nummern_list --- www/pages/seriennummern.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index a9d97451..d378faa7 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -369,7 +369,7 @@ class Seriennummern { } else { $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden!'); } - $this->seriennummern_list(); + $this->seriennummern_nummern_list(); } function seriennummern_enter() { From ad3769381857a5ca42234b95836a9488e4c6389d Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sat, 3 Aug 2024 13:27:45 +0200 Subject: [PATCH 06/25] 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'); } } From 39c78c52c180881aa7a637cfb169198092ec1f94 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sat, 3 Aug 2024 20:11:59 +0200 Subject: [PATCH 07/25] seriennummern rework to new table structure lieferschein --- database/struktur.sql | 4 - upgrade/data/db_schema.json | 144 ++++++--- www/pages/content/seriennummern_enter.tpl | 7 +- .../content/seriennummern_nummern_list.tpl | 14 +- www/pages/seriennummern.php | 279 ++++++++++++------ 5 files changed, 314 insertions(+), 134 deletions(-) diff --git a/database/struktur.sql b/database/struktur.sql index 8f70631f..03a1c1b1 100755 --- a/database/struktur.sql +++ b/database/struktur.sql @@ -12945,12 +12945,8 @@ DROP TABLE IF EXISTS `seriennummern`; CREATE TABLE `seriennummern` ( `id` int(11) NOT NULL AUTO_INCREMENT, `seriennummer` varchar(255) NOT NULL, - `adresse` int(11) NOT NULL, `artikel` int(11) NOT NULL, `beschreibung` varchar(255) NOT NULL, - `lieferung` date NOT NULL, - `lieferschein` int(11) NOT NULL, - `lieferscheinpos` int(11) NOT NULL, `bearbeiter` varchar(255) NOT NULL, `logdatei` datetime NOT NULL, PRIMARY KEY (`id`) diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index 8db55bb4..1dd53b8c 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -91433,17 +91433,6 @@ "Privileges": "select,insert,update,references", "Comment": "" }, - { - "Field": "adresse", - "Type": "int(11)", - "Collation": null, - "Null": "NO", - "Key": "", - "Default": null, - "Extra": "", - "Privileges": "select,insert,update,references", - "Comment": "" - }, { "Field": "artikel", "Type": "int(11)", @@ -91477,39 +91466,6 @@ "Privileges": "select,insert,update,references", "Comment": "" }, - { - "Field": "lieferung", - "Type": "date", - "Collation": null, - "Null": "NO", - "Key": "", - "Default": null, - "Extra": "", - "Privileges": "select,insert,update,references", - "Comment": "" - }, - { - "Field": "lieferschein", - "Type": "int(11)", - "Collation": null, - "Null": "NO", - "Key": "", - "Default": null, - "Extra": "", - "Privileges": "select,insert,update,references", - "Comment": "" - }, - { - "Field": "lieferscheinpos", - "Type": "int(11)", - "Collation": null, - "Null": "NO", - "Key": "", - "Default": null, - "Extra": "", - "Privileges": "select,insert,update,references", - "Comment": "" - }, { "Field": "bearbeiter", "Type": "varchar(255)", @@ -91553,6 +91509,106 @@ } ] }, + { + "name": "seriennummern_lieferschein_position", + "collation": "utf8mb3_general_ci", + "type": "BASE TABLE", + "columns": [ + { + "Field": "id", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "PRI", + "Default": null, + "Extra": "auto_increment", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "seriennummer", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "lieferschein_position", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + } + ], + "keys": [ + { + "Key_name": "PRIMARY", + "Index_type": "BTREE", + "columns": [ + "id" + ], + "Non_unique": "" + } + ] + }, + { + "name": "seriennummern_paketdistribution", + "collation": "utf8mb3_general_ci", + "type": "BASE TABLE", + "columns": [ + { + "Field": "id", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "PRI", + "Default": null, + "Extra": "auto_increment", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "seriennummer", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "paketdistribution", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + } + ], + "keys": [ + { + "Key_name": "PRIMARY", + "Index_type": "BTREE", + "columns": [ + "id" + ], + "Non_unique": "" + } + ] + }, { "name": "seriennummern_log", "collation": "utf8mb3_general_ci", diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl index bee44aea..2ccc0531 100644 --- a/www/pages/content/seriennummern_enter.tpl +++ b/www/pages/content/seriennummern_enter.tpl @@ -140,7 +140,7 @@ Liste der Seriennummern, 1 pro Zeile - + @@ -150,6 +150,11 @@
{|Aktionen|} + + + @@ -161,7 +161,7 @@
+ {|Ausgelieferte erlauben|} +
diff --git a/www/pages/content/seriennummern_nummern_list.tpl b/www/pages/content/seriennummern_nummern_list.tpl index f083f7e8..03bc54fa 100644 --- a/www/pages/content/seriennummern_nummern_list.tpl +++ b/www/pages/content/seriennummern_nummern_list.tpl @@ -22,7 +22,7 @@
- {|Seriennummern verfügbar|}: + {|Seriennummern eingelagert|}: @@ -68,7 +68,17 @@ + +
  • + +
  • diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index d88ec33f..34433d93 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -33,13 +33,13 @@ class Seriennummern { switch ($name) { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); - $heading = array('','','Nummer','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); + $heading = array('','','Artikel-Nr.','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.datum','s.eingelagert','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','lh.adresse_name','lh.belegnr','lh.datum','s.id'); $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; @@ -57,40 +57,68 @@ class Seriennummern { $menu = "
    " . "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; - $sql = " - SELECT SQL_CALC_FOUND_ROWS - s.id, - $dropnbox, - CONCAT('',a.nummer,'') as nummer, - a.name_de, - s.seriennummer, - ".$app->erp->FormatDate("s.datum").", - if(s.eingelagert,'Ja','Nein'), - ad.name, - l.belegnr, - ".$app->erp->FormatDate("l.datum").", - s.id - FROM + $lieferschein_link = array( + '', + ['sql' => 'lh.belegnr'], + '', + ); + + $sql_columns = " + s.id, + $dropnbox, + CONCAT('',a.nummer,'') as nummer, + a.name_de, + s.seriennummer, + ".$app->erp->FormatDate("s.datum").", + if(s.eingelagert,'Ja','Nein'), + lh.adresse_name, + ".$app->erp->ConcatSQL($lieferschein_link).", + ".$app->erp->FormatDate("lh.datum").", + s.id + "; + + $sql_tables = " seriennummern s INNER JOIN artikel a ON s.artikel = a.id - LEFT JOIN - lieferschein_position lp ON lp.id = s.lieferscheinpos - LEFT JOIN - lieferschein l ON l.id = lp.lieferschein - LEFT JOIN - adresse ad ON ad.id = l.adresse + LEFT JOIN ( + SELECT DISTINCT + slp.seriennummer, + a.id adresse, + a.name adresse_name, + l.datum, + l.id lieferschein, + l.belegnr + FROM + seriennummern_lieferschein_position slp + INNER JOIN lieferschein_position lp ON + lp.id = slp.lieferschein_position + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN adresse a ON + a.id = l.adresse + ORDER BY + l.datum + DESC + , + l.id + DESC + ) lh ON lh.seriennummer = s.id "; $artikel_id = $app->User->GetParameter('seriennummern_artikel_id'); $where = "(a.id = '".$artikel_id."' OR '".$artikel_id."' = '')"; + $count = "SELECT COUNT(DISTINCT s.id) FROM ".$sql_tables." WHERE ".$where; // Toggle filters $app->Tpl->Add('JQUERYREADY', "$('#verfuegbar').click( function() { fnFilterColumn1( 0 ); } );"); - $app->Tpl->Add('JQUERYREADY', "$('#versendet').click( function() { fnFilterColumn2( 0 ); } );"); + $app->Tpl->Add('JQUERYREADY', "$('#ausgelagert').click( function() { fnFilterColumn2( 0 ); } );"); + $app->Tpl->Add('JQUERYREADY', "$('#versendet').click( function() { fnFilterColumn3( 0 ); } );"); - for ($r = 1;$r <= 2;$r++) { + for ($r = 1;$r <= 3;$r++) { $app->Tpl->Add('JAVASCRIPT', ' function fnFilterColumn' . $r . ' ( i ) { @@ -116,17 +144,27 @@ class Seriennummern { $more_data2 = $app->Secure->GetGET("more_data2"); if ($more_data2 == 1) { - $where .= " AND s.lieferscheinpos <> 0"; + $where .= " AND s.eingelagert = 0"; } else { } - $count = "SELECT count(DISTINCT s.id) FROM seriennummern s LEFT JOIN artikel a on a.id = s.artikel WHERE $where"; -// $groupby = ""; + $more_data3 = $app->Secure->GetGET("more_data3"); + if ($more_data3 == 1) { + $where .= " AND lh.seriennummer IS NOT NULL"; + } else { + } + + $groupby = "GROUP BY s.id"; + + $sql = "SELECT SQL_CALC_FOUND_ROWS ".$sql_columns." FROM ".$sql_tables; + +// echo($sql." WHERE ".$where." ".$groupby); +// echo($count); 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('','', 'Artikel-Nr.', '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) @@ -139,7 +177,7 @@ class Seriennummern { $defaultorder = 1; $defaultorderdesc = 0; $aligncenter = array(); - $alignright = array(); + $alignright = array(5,6,7,8,9); $numbercols = array(); $sumcol = array(); @@ -168,8 +206,8 @@ class Seriennummern { CONCAT('',a.nummer,'') as nummer, a.name_de, ".$app->erp->FormatMenge('auf_lager.anzahl').", - SUM(if(s.eingelagert <> 0,1,0)), - SUM(if(s.lieferscheinpos <> 0,1,0)), + SUM(if(s.eingelagert = 1,1,0)), + SUM(if(s.eingelagert = 0,1,0)), SUM(if(s.id IS NULL,0,1)), ".$app->erp->ConcatSQL($menu_link).", a.id @@ -192,12 +230,15 @@ class Seriennummern { a.id ) auf_lager ON auf_lager.id = a.id LEFT JOIN - seriennummern s ON s.artikel = a.id + seriennummern s ON s.artikel = a.id "; $where = "a.seriennummern <> 'keine' AND a.seriennummern <> ''"; - $count = "SELECT count(DISTINCT a.id) FROM artikel a WHERE $where"; $groupby = "GROUP BY a.id"; + $count = "SELECT count(DISTINCT a.id) FROM artikel a WHERE ".$where; + +// echo($sql." WHERE ".$where." ".$groupby); +// echo($count); break; case "seriennummern_lieferscheine_list": @@ -206,7 +247,7 @@ class Seriennummern { $width = array('1%','1%','10%'); // Fill out manually later // columns that are aligned right (numbers etc) - // $alignright = array(4,5,6,7,8); + $alignright = array(6,7,8,9); $findcols = array('l.id','l.id', 'l.belegnr', 'l.datum', 'adr.name', 'null', 'null', 'null', 'null', 'null'); $searchsql = array('l.belegnr'); @@ -214,7 +255,6 @@ class Seriennummern { $defaultorder = 1; $defaultorderdesc = 0; $aligncenter = array(); - $alignright = array(); $numbercols = array(); $sumcol = array(); @@ -230,31 +270,48 @@ class Seriennummern { '', ); + $lieferschein_link = array( + '', + ['sql' => 'l.belegnr'], + '', + ); + $sql = "SELECT SQL_CALC_FOUND_ROWS l.id, $dropnbox, - l.belegnr, + ".$app->erp->ConcatSQL($lieferschein_link).", ".$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->FormatMengeFuerFormular("menge").", + SUM(if(slp.id IS NULL,0,1)), + ".$app->erp->FormatMengeFuerFormular("menge-SUM(if(slp.id IS NULL,0,1))").", ".$app->erp->ConcatSQL($menu_link).", l.id FROM lieferschein_position lp + LEFT JOIN seriennummern_lieferschein_position slp + ON slp.lieferschein_position = lp.id 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 (l.datum >= (SELECT MIN(datum) FROM seriennummern WHERE artikel = a.id))"; - $count = ""; + $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM + lieferschein_position lp + LEFT JOIN seriennummern_lieferschein_position slp + ON slp.lieferschein_position = lp.id + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN artikel a ON + a.id = lp.artikel + "." WHERE ".$where; + $groupby = "GROUP BY l.id"; break; } @@ -299,9 +356,32 @@ class Seriennummern { } } + function seriennummern_delivery_note_check_and_message($lieferschein_id) { + + $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); + if (!empty($check_delivery_notes)) { + $lieferschein_minus_id_links = array(); + $lieferschein_plus_id_links = array(); + foreach ($check_delivery_notes as $lieferschein_id) { + if ($lieferschein_id['anzahl_nummern'] < $lieferschein_id['menge']) { + $lieferschein_minus_id_links[] = ''.$lieferschein_id['nummer'].''; + } + else if ($lieferschein_id['anzahl_nummern'] > $lieferschein_id['menge']) { + $lieferschein_plus_id_links[] = ''.$lieferschein_id['nummer'].''; + } + } + if (!empty($lieferschein_minus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Lieferschein: '.implode(', ',$lieferschein_minus_id_links)); + } + if (!empty($lieferschein_plus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_id_links)); + } + } + } + function seriennummern_nummern_list() { - $this->seriennummern_menu(); + $this->seriennummern_menu(); // For transfer to tablesearch $artikel_id = $this->app->Secure->GetGET('artikel'); @@ -342,6 +422,7 @@ class Seriennummern { } $this->seriennummern_check_and_message($artikel_id); + $this->seriennummern_delivery_note_check_and_message(null); $this->app->YUI->TableSearch('TAB1', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); @@ -351,6 +432,7 @@ class Seriennummern { function seriennummern_artikel_list() { $this->seriennummern_menu(); $this->seriennummern_check_and_message(null); + $this->seriennummern_delivery_note_check_and_message(null); $this->app->YUI->TableSearch('TAB1', 'seriennummern_artikel_list', "show", "", "", basename(__FILE__), __CLASS__); @@ -360,6 +442,7 @@ class Seriennummern { function seriennummern_lieferscheine_list() { $this->seriennummern_menu(); $this->seriennummern_check_and_message(null); + $this->seriennummern_delivery_note_check_and_message(null); $this->app->YUI->TableSearch('TAB1', 'seriennummern_lieferscheine_list', "show", "", "", basename(__FILE__), __CLASS__); @@ -369,11 +452,11 @@ class Seriennummern { public function seriennummern_delete() { $id = (int) $this->app->Secure->GetGET('id'); - if ($this->app->DB->Select("SELECT id FROM `seriennummern` WHERE `id` = '{$id}' AND `lieferscheinpos` = 0")) { - $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}' AND `lieferscheinpos` = 0"); + if (!$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'")) { + $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}'"); $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); } else { - $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden!'); + $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden da eine Lieferscheinzuordnung existiert!'); } $this->seriennummern_nummern_list(); } @@ -382,12 +465,14 @@ class Seriennummern { $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Zurück zur Übersicht"); $artikel_id = (int) $this->app->Secure->GetGET('artikel'); + $lieferschein_id = (int) $this->app->Secure->GetGET('lieferschein'); $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + $allowold = $this->app->Secure->GetPOST('allowold'); $submit = $this->app->Secure->GetPOST('submit'); $seriennummern = array(); @@ -403,6 +488,8 @@ class Seriennummern { break; case 'speichern': $seriennummern_not_written = array(); + $seriennummern_already_exist = array(); + $seriennummern_old_not_allowed = array(); foreach ($seriennummern as $seriennummer) { $seriennummer = trim($seriennummer); @@ -411,18 +498,40 @@ class Seriennummern { continue; } - $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) { - $error = true; - $seriennummern_not_written[] = $seriennummer; - } + $sql = "SELECT id, eingelagert FROM seriennummern WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"; + $check_existing = $this->app->DB->SelectRow($sql); + + if (empty($check_existing)) { // New serial + $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) { + $error = true; + $seriennummern_not_written[] = $seriennummer; + } + } else { + if ($check_existing['eingelagert']) { // Old serial, already here + $seriennummern_already_exist[] = $seriennummer; + } else { // Old serial, returning + if ($allowold) { + $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"; + $this->app->DB->Update($sql); + } else { + $seriennummern_old_not_allowed[] = $seriennummer; + } + } + } } - if ($error) { - $this->app->Tpl->addMessage('error', 'Einige Seriennummern konnten nicht gespeichert werden.'); + if (!empty($seriennummern_already_exist)) { + $this->app->Tpl->addMessage('error', 'Seriennummern existieren bereits: '.implode(', ',$seriennummern_already_exist)); } - $seriennummern = $seriennummern_not_written; + if (!empty($seriennummern_old_not_allowed)) { + $this->app->Tpl->addMessage('error', 'Seriennummern bereits ausgeliefert: '.implode(', ',$seriennummern_old_not_allowed)); + } + if (!empty($seriennummern_not_written)) { + $this->app->Tpl->addMessage('error', 'Seriennummern konnten nicht gespeichert werden: '.implode(', ',$seriennummern_not_written)); + } + $seriennummern = array_merge($seriennummern_not_written, $seriennummern_already_exist, $seriennummern_old_not_allowed); break; case 'assistent': $praefix = $this->app->Secure->GetPOST('praefix'); @@ -508,11 +617,9 @@ class Seriennummern { LEFT JOIN( SELECT artikel, - COUNT(id) anzahl + SUM(if(eingelagert,1,0)) anzahl FROM seriennummern - WHERE - lieferscheinpos = 0 GROUP BY artikel ) nummern_verfuegbar @@ -530,29 +637,35 @@ class Seriennummern { * Check if all delivery notes have serials * Return array of delivery note positions and head information */ - public function seriennummern_check_deliver_notes($lieferschein_id = null) : array { + public function seriennummern_check_delivery_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 + SELECT SQL_CALC_FOUND_ROWS + l.id, + l.belegnr nummer, + menge, + SUM(IF(slp.id IS NULL, 0, 1)) menge_nummern + FROM + lieferschein_position lp + LEFT JOIN seriennummern_lieferschein_position slp ON + slp.lieferschein_position = lp.id + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN artikel a ON + a.id = lp.artikel + WHERE + (a.seriennummern <> 'keine') AND( + l.datum >=( + SELECT + MIN(datum) + FROM + seriennummern + WHERE + artikel = a.id + ) + ) AND (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') + GROUP BY + l.id + HAVING menge > menge_nummern "; $result = $this->app->DB->SelectArr($sql); @@ -617,8 +730,8 @@ class Seriennummern { * Check if numbers need to be entered after stock removal, if yes, create notification */ 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)) { + $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); + if (!empty($check_delivery_notes)) { $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); } } From 00d10dd7cccd9dbd1a48e15a4ce51197f7a65d18 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sun, 4 Aug 2024 14:22:13 +0200 Subject: [PATCH 08/25] seriennummern removed dropnbox --- www/pages/seriennummern.php | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 34433d93..a71748e2 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -33,13 +33,13 @@ class Seriennummern { switch ($name) { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); - $heading = array('','','Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); - $width = array('1%','1%','10%'); // Fill out manually later + $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); + $width = array('10%','20%','20%'); // 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.datum','s.eingelagert','lh.adresse_name','lh.belegnr','lh.datum','s.id'); + $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','lh.adresse_name','lh.belegnr','lh.datum','s.id'); $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; @@ -67,7 +67,6 @@ class Seriennummern { $sql_columns = " s.id, - $dropnbox, CONCAT('',a.nummer,'') as nummer, a.name_de, s.seriennummer, @@ -164,20 +163,20 @@ class Seriennummern { break; case "seriennummern_artikel_list": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('','', 'Artikel-Nr.', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü',''); - $width = array('1%','1%','10%'); // Fill out manually later + $heading = array('Artikel-Nr.', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü',''); + $width = array('10%','20%'); // 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' , 'null', 'null', 'null', 'null', 'null', 'null'); + $findcols = array('a.nummer', 'a.name_de' , 'null', 'null', 'null', 'null', 'null', 'null'); $searchsql = array('a.name_de', 'a.nummer'); $menucol = 1; $defaultorder = 1; $defaultorderdesc = 0; $aligncenter = array(); - $alignright = array(5,6,7,8,9); + $alignright = array(3,4,5,6,7); $numbercols = array(); $sumcol = array(); @@ -202,7 +201,6 @@ class Seriennummern { $sql = "SELECT SQL_CALC_FOUND_ROWS a.id, - $dropnbox, CONCAT('',a.nummer,'') as nummer, a.name_de, ".$app->erp->FormatMenge('auf_lager.anzahl').", @@ -243,13 +241,13 @@ class Seriennummern { break; case "seriennummern_lieferscheine_list": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('','', 'Lieferschein', 'Vom', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); - $width = array('1%','1%','10%'); // Fill out manually later + $heading = array('Lieferschein', 'Vom', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); + $width = array('10%','10%','20%'); // Fill out manually later // columns that are aligned right (numbers etc) - $alignright = array(6,7,8,9); + $alignright = array(4,5,6,7); - $findcols = array('l.id','l.id', 'l.belegnr', 'l.datum', 'adr.name', 'null', 'null', 'null', 'null', 'null'); + $findcols = array('l.belegnr', 'l.datum', 'adr.name', 'null', 'null', 'null', 'null', 'null'); $searchsql = array('l.belegnr'); $defaultorder = 1; @@ -280,7 +278,6 @@ class Seriennummern { $sql = "SELECT SQL_CALC_FOUND_ROWS l.id, - $dropnbox, ".$app->erp->ConcatSQL($lieferschein_link).", ".$app->erp->FormatDate("l.datum").", adr.name, From a907a9fa3fd56514f9fc99c82e1cfef462c46139 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sun, 4 Aug 2024 22:05:35 +0200 Subject: [PATCH 09/25] seriennummern zwischenstand --- www/pages/ajax.php | 24 +- www/pages/content/seriennummern_enter.tpl | 286 ++++++++++-------- .../seriennummern_lieferschein_enter.tpl | 197 ++++++++++++ www/pages/seriennummern.php | 239 ++++++++++++--- 4 files changed, 571 insertions(+), 175 deletions(-) create mode 100644 www/pages/content/seriennummern_lieferschein_enter.tpl diff --git a/www/pages/ajax.php b/www/pages/ajax.php index f3826b9b..87ebf0f2 100644 --- a/www/pages/ajax.php +++ b/www/pages/ajax.php @@ -2610,7 +2610,29 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku break; case "seriennummerverfuegbar": $artikel = (int)$this->app->Secure->GetGET('artikel'); - $arr = $this->app->DB->SelectArr("SELECT seriennummer FROM seriennummern WHERE lieferschein = 0 AND seriennummer LIKE '%$term%' AND artikel = '$artikel' LIMIT 20"); + $lieferschein = (int)$this->app->Secure->GetGET('lieferschein'); + + $sql = " + SELECT DISTINCT + s.seriennummer + FROM + seriennummern s + INNER JOIN + lieferschein_position lp ON lp.artikel = s.artikel + LEFT JOIN + seriennummern_lieferschein_position slp ON slp.seriennummer = s.id + WHERE + s.eingelagert = 1 + AND slp.id IS NULL + AND s.seriennummer LIKE '%$term%' + AND (s.artikel = '$artikel' OR '$artikel' = '0') + LIMIT 20 + "; + + //echo($sql); + + $arr = $this->app->DB->SelectArr($sql); + $carr = !empty($arr)?count($arr):0; for($i = 0; $i < $carr; $i++) { $newarr[] = $arr[$i]['seriennummer']; diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl index 2ccc0531..3858223a 100644 --- a/www/pages/content/seriennummern_enter.tpl +++ b/www/pages/content/seriennummern_enter.tpl @@ -10,105 +10,155 @@ -->
    [MESSAGE] -
    + [FORMHANDLEREVENT]
    -
    -
    -
    -
    - {|Seriennummern erfassen Artikel [ARTIKELNUMMER] [ARTIKEL]|} - - - - - - - - - - - - - - - - - -
    - {|Lagermenge|}: - - -
    - {|Seriennummern verfügbar|}: - - -
    - {|Seriennummern fehlen|}: - - -
    - {|Seriennummer scannen|}: - - -
    -
    -
    -
    +
    -
    -
    - {|Seriennummernassistent|} - - - - - - - - - - - - - - - - - - - - - -
    - {|Letzte Seriennummer|}: - - -
    - {|Präfix|}: - - -
    - {|Start|}: - - -
    - {|Postfix|}: - - -
    - {|Anzahl|}: - - -
    -
    +
    +
    + {|Lieferscheinpositionen|} + [LIEFERSCHEINPOSITIONEN] +
    -
    +
    +
    +
    +
    +
    +
    +
    +
    + {|Seriennummern erfassen [LEGEND]|} + + + + + + + + + + + + + + + + + + + + + +
    + {|Lagermenge|}: + + +
    + {|Seriennummern verfügbar|}: + + +
    + {|Seriennummern fehlen|}: + + +
    + {|Seriennummer scannen|}: + + +
    + {|Seriennummer wählen|}: + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {|Seriennummernassistent|} + + + + + + + + + + + + + + + + + + + + + +
    + {|Letzte Seriennummer|}: + + +
    + {|Präfix|}: + + +
    + {|Start|}: + + +
    + {|Postfix|}: + + +
    + {|Anzahl|}: + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {|Gewählte Seriennummern|} + + + + + +
    + {|Seriennummern|}: + + + Liste der Seriennummern, 1 pro Zeile +
    +
    +
    +
    +
    +
    +
    +
    -
    +
    {|Aktionen|} - +
    - -
    @@ -118,55 +168,29 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {|Gewählte Seriennummern|} - - - - - -
    - {|Seriennummern|}: - - - Liste der Seriennummern, 1 pro Zeile -
    -
    -
    -
    -
    -
    -
    - {|Aktionen|} - - + + + + +
    {|Ausgelieferte erlauben|}
    + +
    - +
    -
    -
    -
    -
    + +
    +
    +
    - + diff --git a/www/pages/content/seriennummern_lieferschein_enter.tpl b/www/pages/content/seriennummern_lieferschein_enter.tpl new file mode 100644 index 00000000..672c4941 --- /dev/null +++ b/www/pages/content/seriennummern_lieferschein_enter.tpl @@ -0,0 +1,197 @@ +
    +
      +
    • +
    + +
    + [MESSAGE] +
    + [FORMHANDLEREVENT] +
    +
    +
    +
    +
    + {|Seriennummern erfassen [LEGEND]|} + + + + + + + + + + + + + + + + + + + + + +
    + {|Lagermenge|}: + + +
    + {|Seriennummern verfügbar|}: + + +
    + {|Seriennummern fehlen|}: + + +
    + {|Seriennummer scannen|}: + + +
    + {|Seriennummer wählen|}: + + +
    +
    +
    +
    +
    +
    +
    + {|Seriennummernassistent|} + + + + + + + + + + + + + + + + + + + + + +
    + {|Letzte Seriennummer|}: + + +
    + {|Präfix|}: + + +
    + {|Start|}: + + +
    + {|Postfix|}: + + +
    + {|Anzahl|}: + + +
    +
    +
    +
    +
    +
    +
    + {|Aktionen|} + + + + + + + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {|Gewählte Seriennummern|} + + + + + +
    + {|Seriennummern|}: + + + Liste der Seriennummern, 1 pro Zeile +
    +
    +
    +
    +
    +
    +
    + {|Aktionen|} + + + + + + + + + + +
    + {|Ausgelieferte erlauben|} +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {|Lieferscheinpositionen|} + [LIEFERSCHEINPOSITIONEN] +
    +
    +
    +
    +
    +
    +
    +
    + diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index a71748e2..08a0173e 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -21,6 +21,7 @@ class Seriennummern { $this->app->ActionHandler("lieferscheine_list", "seriennummern_lieferscheine_list"); $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); + $this->app->ActionHandler("minidetail", "seriennummern_minidetail"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); } @@ -310,6 +311,88 @@ class Seriennummern { "." WHERE ".$where; $groupby = "GROUP BY l.id"; + break; + case "seriennummern_lieferschein_positionen": + $allowed['seriennummern_artikel_list'] = array('list'); + $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); + $width = array('1%','1%','10%','10%','20%'); // Fill out manually later + + $lieferschein_id = $app->User->GetParameter('seriennummern_lieferschein_id'); + + // columns that are aligned right (numbers etc) + $alignright = array(6,7,8,9); + + $findcols = array('lp.id','lp.id','lp.sort','a.nummer', 'a.name_de', 'null', 'null', 'null', 'null', 'null', 'null'); + $searchsql = array('l.belegnr'); + + $moreinfo = true; // Allow drop down details +// $moreinfoaction = "lieferschein"; // specify suffix for minidetail-URL to allow different minidetails + $menucol = 1; // Set id col for moredata/menu + + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $numbercols = array(); + $sumcol = array(); + + $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; + + //$menu = "
    " . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; + + $menu_link = array( + '', + '', + '', + ); + + $lieferschein_link = array( + '', + ['sql' => 'l.belegnr'], + '', + ); + + $sql = "SELECT SQL_CALC_FOUND_ROWS + lp.id, + $dropnbox, + lp.sort, + a.nummer, + a.name_de, + ".$app->erp->FormatMengeFuerFormular("menge").", + SUM(if(slp.id IS NULL,0,1)), + ".$app->erp->FormatMengeFuerFormular("menge-SUM(if(slp.id IS NULL,0,1))").", + ".$app->erp->ConcatSQL($menu_link).", + l.id + FROM + lieferschein_position lp + LEFT JOIN seriennummern_lieferschein_position slp + ON slp.lieferschein_position = lp.id + 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 + "; + + $where = "(a.seriennummern <> 'keine') AND (l.id = '".$lieferschein_id."')"; + $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM + lieferschein_position lp + LEFT JOIN seriennummern_lieferschein_position slp + ON slp.lieferschein_position = lp.id + INNER JOIN lieferschein l ON + l.id = lp.lieferschein + INNER JOIN artikel a ON + a.id = lp.artikel + "." WHERE ".$where; + + $groupby = "GROUP BY lp.id"; + +// echo($sql." WHERE ".$where." ".$groupby); + break; } @@ -422,7 +505,7 @@ class Seriennummern { $this->seriennummern_delivery_note_check_and_message(null); $this->app->YUI->TableSearch('TAB1', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); - + $this->app->Tpl->Parse('PAGE', "seriennummern_nummern_list.tpl"); } @@ -461,29 +544,46 @@ class Seriennummern { function seriennummern_enter() { $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=list", "Zurück zur Übersicht"); - $artikel_id = (int) $this->app->Secure->GetGET('artikel'); - $lieferschein_id = (int) $this->app->Secure->GetGET('lieferschein'); - - $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); - $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); - $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + $task = ""; + + $artikel_id = (int) $this->app->Secure->GetGET('artikel'); + if (!empty($artikel_id)) { + $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + $this->app->Tpl->SetText('LEGEND',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + $task = "artikel"; + } + + $lieferschein_id = (int) $this->app->Secure->GetGET('lieferschein'); + if (!empty($lieferschein_id)) { + $this->app->User->SetParameter('seriennummern_lieferschein_id', $lieferschein_id); + $lieferschein = $this->app->DB->SelectRow("SELECT belegnr FROM lieferschein WHERE id ='".$lieferschein_id."'"); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2','Lieferschein '.$lieferschein['belegnr']); + $this->app->Tpl->SetText('LEGEND','Lieferschein '.$lieferschein['belegnr']); + $task = "lieferschein"; + } $allowold = $this->app->Secure->GetPOST('allowold'); $submit = $this->app->Secure->GetPOST('submit'); $seriennummern = array(); - $seriennummern_text = $this->app->Secure->GetPOST('seriennummern'); $seriennummern = explode('\n',str_replace(['\r'],'',$seriennummern_text)); switch ($submit) { case 'hinzufuegen': - $eingabe = $this->app->Secure->GetPOST('eingabeneu'); + $eingabescan = $this->app->Secure->GetPOST('eingabescan'); + $eingabe = $this->app->Secure->GetPOST('eingabe'); if (!empty($eingabe)) { $seriennummern[] = $eingabe; } + if (!empty($eingabescan)) { + $seriennummern[] = $eingabescan; + } break; - case 'speichern': + case 'einlagern': $seriennummern_not_written = array(); $seriennummern_already_exist = array(); $seriennummern_old_not_allowed = array(); @@ -543,42 +643,82 @@ class Seriennummern { } break; - } - + } $seriennummern = array_unique($seriennummern); - $check_seriennummern = $this->seriennummern_check_serials($artikel_id); - $check_seriennummern = $check_seriennummern[0]; - - $anzahl_fehlt = $check_seriennummern['menge_auf_lager']-$check_seriennummern['menge_nummern']; - - if ($anzahl_fehlt == 0) { - $this->app->Tpl->addMessage('success', 'Seriennummern vollständig.'); - } + switch ($task) { + case 'artikel': + $check_seriennummern = $this->seriennummern_check_serials($artikel_id); + $check_seriennummern = $check_seriennummern[0]; + + $anzahl_fehlt = $check_seriennummern['menge_auf_lager']-$check_seriennummern['menge_nummern']; + + if ($anzahl_fehlt == 0) { + $this->app->Tpl->addMessage('success', 'Seriennummern vollständig.'); + } - if ($anzahl_fehlt < 0) { - $anzahl_fehlt = 0; + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $letzte_seriennummer = (string) $this->app->DB->Select("SELECT seriennummer FROM seriennummern WHERE artikel = '".$artikel_id."' ORDER BY id DESC LIMIT 1"); + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + $this->app->Tpl->Set('PRAEFIX', $matches[1]); + $this->app->Tpl->Set('START', $matches[2]+1); + $this->app->Tpl->Set('POSTFIX', $matches[3]); + + $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); + + $this->app->Tpl->Set('ARTIKELNUMMER', ''.$check_seriennummern['nummer'].''); + + $this->app->Tpl->Set('ARTIKEL', $check_seriennummern['name']); + $this->app->Tpl->Set('ANZLAGER', $check_seriennummern['menge_auf_lager']); + $this->app->Tpl->Set('ANZVORHANDEN', $check_seriennummern['menge_nummern']); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + + break; + case 'lieferschein': + $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); + $this->app->Tpl->Set('LIEFERSCHEINNUMMER', ''.$lieferschein['belegnr'].''); + + $artikel_lieferschein = $this->app->DB->SelectArr("SELECT artikel FROM lieferschein_position WHERE lieferschein = '".$lieferschein_id."'"); + + $sql = " + SELECT + DISTINCT s.seriennummer + FROM + seriennummern s + LEFT JOIN + seriennummern_lieferschein_position slp ON slp.seriennummer = s.id + WHERE + s.artikel IN ('".implode("','",array_column($artikel_lieferschein,'artikel'))."') + AND s.eingelagert = 1 + AND slp.id IS NULL + ORDER BY s.id ASC + LIMIT 1 + "; + + $letzte_seriennummer = (string) $this->app->DB->Select($sql); + + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + $this->app->Tpl->Set('PRAEFIX', $matches[1]); + $this->app->Tpl->Set('START', $matches[2]); + $this->app->Tpl->Set('POSTFIX', $matches[3]); + + $this->app->YUI->TableSearch('LIEFERSCHEINPOSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); + + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + + break; + default: + exit(); + break; } - $letzte_seriennummer = (string) $this->app->DB->Select("SELECT seriennummer FROM seriennummern WHERE artikel = '".$artikel_id."' ORDER BY id DESC LIMIT 1"); - $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); - - $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); - - $this->app->Tpl->Set('PRAEFIX', $matches[1]); - $this->app->Tpl->Set('START', $matches[2]+1); - $this->app->Tpl->Set('POSTFIX', $matches[3]); - - $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); - - $this->app->Tpl->Set('ARTIKELNUMMER', ''.$check_seriennummern['nummer'].''); - $this->app->Tpl->Set('ARTIKEL', $check_seriennummern['name']); - $this->app->Tpl->Set('ANZLAGER', $check_seriennummern['menge_auf_lager']); - $this->app->Tpl->Set('ANZVORHANDEN', $check_seriennummern['menge_nummern']); - $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); - $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); - - $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&artikel=$artikel_id"); $this->app->Tpl->Parse('PAGE', "seriennummern_enter.tpl"); } @@ -732,5 +872,18 @@ class Seriennummern { $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); } } - - } + + public function seriennummern_minidetail($parsetarget='',$menu=true) { + $id = $this->app->Secure->GetGET('id'); + + if($parsetarget=='') + { + $tmp = new EasyTable($this->app); + $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE slp.lieferschein_position ='$id' ",0,""); + $tmp->DisplayNew('TAB1',"Seriennummern","noAction"); + + $this->app->Tpl->Output('emptytab.tpl'); + $this->app->ExitXentral(); + } + } +} From c486b241bd106282f85b02061405449437070507 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 6 Aug 2024 15:07:57 +0200 Subject: [PATCH 10/25] seriennummern lieferschein enter() --- upgrade/data/db_schema.json | 2 +- www/pages/content/seriennummern_enter.tpl | 264 +++++++------- .../seriennummern_lieferscheine_list.tpl | 28 ++ www/pages/seriennummern.php | 322 ++++++++++++++---- 4 files changed, 409 insertions(+), 207 deletions(-) create mode 100644 www/pages/content/seriennummern_lieferscheine_list.tpl diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index 1dd53b8c..d12eeb04 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -91424,7 +91424,7 @@ }, { "Field": "datum", - "Type": "date", + "Type": "datetime", "Collation": null, "Null": "NO", "Key": "", diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl index 3858223a..a21719aa 100644 --- a/www/pages/content/seriennummern_enter.tpl +++ b/www/pages/content/seriennummern_enter.tpl @@ -17,148 +17,148 @@
    - {|Lieferscheinpositionen|} - [LIEFERSCHEINPOSITIONEN] + {|Lieferscheinpositionen|} + {|Seriennummern|} + [POSITIONEN]
    -
    +
    -
    -
    -
    -
    -
    -
    - {|Seriennummern erfassen [LEGEND]|} - - - - - - - - - - - - - - - - - - - - - -
    - {|Lagermenge|}: - - -
    - {|Seriennummern verfügbar|}: - - -
    - {|Seriennummern fehlen|}: - - -
    - {|Seriennummer scannen|}: - - -
    - {|Seriennummer wählen|}: - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    + {|Seriennummern erfassen [LEGEND]|} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {|Lagermenge|}: + + +
    + {|Seriennummern verfügbar|}: + + +
    + {|Menge auf Lieferschein|}: + + +
    + {|Seriennummern zugeordnet|}: + + +
    + {|Seriennummern fehlen|}: + + +
    + {|Seriennummer scannen|}: + + +
    + {|Seriennummer wählen|}: + + +
    +
    {|Seriennummernassistent|} - - - - - - - - - - - - - - - - - - - - - -
    - {|Letzte Seriennummer|}: - - -
    - {|Präfix|}: - - -
    - {|Start|}: - - -
    - {|Postfix|}: - - -
    - {|Anzahl|}: - - -
    -
    - - - - -
    -
    -
    -
    -
    +
    +
    + {|Letzte Seriennummer|}: + + {|Nächste Seriennummer|}: + + +
    + {|Präfix|}: + + +
    + {|Start|}: + + +
    + {|Postfix|}: + + +
    + {|Anzahl|}: + + +
    +
    {|Gewählte Seriennummern|} - - - - - -
    - {|Seriennummern|}: - - - Liste der Seriennummern, 1 pro Zeile -
    -
    - - - - + +
    + {|Seriennummern|}: + + + Liste der Seriennummern, 1 pro Zeile +
    +
    {|Aktionen|} - +
    - + diff --git a/www/pages/content/seriennummern_lieferscheine_list.tpl b/www/pages/content/seriennummern_lieferscheine_list.tpl new file mode 100644 index 00000000..25d5cb31 --- /dev/null +++ b/www/pages/content/seriennummern_lieferscheine_list.tpl @@ -0,0 +1,28 @@ +
    + +
    +
    +
    {|Filter|} +
    +
      +
    • + + +
    • +
    +
    +
    +
    + [MESSAGE] + [TAB1] + [TAB1NEXT] +
    +
    diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 08a0173e..c1d16fd5 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -21,6 +21,7 @@ class Seriennummern { $this->app->ActionHandler("lieferscheine_list", "seriennummern_lieferscheine_list"); $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); + $this->app->ActionHandler("remove", "seriennummern_remove"); $this->app->ActionHandler("minidetail", "seriennummern_minidetail"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); @@ -34,13 +35,15 @@ class Seriennummern { switch ($name) { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); - $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); - $width = array('10%','20%','20%'); // Fill out manually later +// $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); + $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert', 'Menü'); + $width = array('10%','20%','20%','10%','1%','1%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); - $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','lh.adresse_name','lh.belegnr','lh.datum','s.id'); +// $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','lh.adresse_name','lh.belegnr','lh.datum','s.id'); + $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','s.id'); $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; @@ -66,19 +69,30 @@ class Seriennummern { '', ); - $sql_columns = " +/* $sql_columns = " s.id, CONCAT('',a.nummer,'') as nummer, a.name_de, s.seriennummer, - ".$app->erp->FormatDate("s.datum").", + ".$app->erp->FormatDateTime("s.datum").", if(s.eingelagert,'Ja','Nein'), lh.adresse_name, ".$app->erp->ConcatSQL($lieferschein_link).", ".$app->erp->FormatDate("lh.datum").", s.id + ";*/ + + $sql_columns = " + s.id, + CONCAT('',a.nummer,'') as nummer, + a.name_de, + s.seriennummer, + ".$app->erp->FormatDateTime("s.datum").", + if(s.eingelagert,'Ja','Nein'), + s.id "; + $sql_tables = " seriennummern s INNER JOIN @@ -165,7 +179,7 @@ class Seriennummern { case "seriennummern_artikel_list": $allowed['seriennummern_artikel_list'] = array('list'); $heading = array('Artikel-Nr.', 'Artikel', 'Lagermenge', 'Nummern verfügbar', 'Nummern ausgeliefert', 'Nummern gesamt', 'Menü',''); - $width = array('10%','20%'); // Fill out manually later + $width = array('10%','90%','1%','1%','1%','1%','1%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); @@ -243,7 +257,7 @@ class Seriennummern { case "seriennummern_lieferscheine_list": $allowed['seriennummern_artikel_list'] = array('list'); $heading = array('Lieferschein', 'Vom', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); - $width = array('10%','10%','20%'); // Fill out manually later + $width = array('10%','10%','20%','1%','1%','1%','1%','1%','1%'); // Fill out manually later // columns that are aligned right (numbers etc) $alignright = array(4,5,6,7); @@ -262,10 +276,10 @@ class Seriennummern { //$menu = "
    @@ -179,7 +179,7 @@
    " . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; $menu_link = array( - ' 'l.id'], '">', - '', + '', '', ); @@ -284,7 +298,7 @@ class Seriennummern { adr.name, ".$app->erp->FormatMengeFuerFormular("menge").", SUM(if(slp.id IS NULL,0,1)), - ".$app->erp->FormatMengeFuerFormular("menge-SUM(if(slp.id IS NULL,0,1))").", + ".$app->erp->FormatMengeFuerFormular("if(menge>SUM(if(slp.id IS NULL,0,1)),menge-SUM(if(slp.id IS NULL,0,1)),0) ").", ".$app->erp->ConcatSQL($menu_link).", l.id FROM @@ -299,7 +313,36 @@ class Seriennummern { adr.id = l.adresse "; - $where = "(a.seriennummern <> 'keine') AND (l.datum >= (SELECT MIN(datum) FROM seriennummern WHERE artikel = a.id))"; + $where = "(a.seriennummern <> 'keine')"; + + // Toggle filters + $app->Tpl->Add('JQUERYREADY', "$('#altelieferscheine').click( function() { fnFilterColumn1( 0 ); } );"); + + for ($r = 1;$r <= 1;$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 + ); + } + '); + } + + $more_data1 = $app->Secure->GetGET("more_data1"); + if ($more_data1 == 1) { + } else { + $where .= " AND (l.datum >= (SELECT DATE(MIN(datum)) FROM seriennummern WHERE artikel = a.id))"; + } + + $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM lieferschein_position lp LEFT JOIN seriennummern_lieferschein_position slp @@ -314,7 +357,7 @@ class Seriennummern { break; case "seriennummern_lieferschein_positionen": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); + $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü'); $width = array('1%','1%','10%','10%','20%'); // Fill out manually later $lieferschein_id = $app->User->GetParameter('seriennummern_lieferschein_id'); @@ -337,15 +380,7 @@ class Seriennummern { $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; - //$menu = "
    " . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; - - $menu_link = array( - '', - '', - '', - ); + $menu = "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; $lieferschein_link = array( 'erp->FormatMengeFuerFormular("menge").", SUM(if(slp.id IS NULL,0,1)), ".$app->erp->FormatMengeFuerFormular("menge-SUM(if(slp.id IS NULL,0,1))").", - ".$app->erp->ConcatSQL($menu_link).", - l.id + lp.id FROM lieferschein_position lp LEFT JOIN seriennummern_lieferschein_position slp @@ -440,21 +474,21 @@ class Seriennummern { $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); if (!empty($check_delivery_notes)) { - $lieferschein_minus_id_links = array(); - $lieferschein_plus_id_links = array(); - foreach ($check_delivery_notes as $lieferschein_id) { - if ($lieferschein_id['anzahl_nummern'] < $lieferschein_id['menge']) { - $lieferschein_minus_id_links[] = ''.$lieferschein_id['nummer'].''; + $lieferschein_minus_links = array(); + $lieferschein_plus_links = array(); + foreach ($check_delivery_notes as $check_delivery_note) { + if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_lieferschein']) { + $lieferschein_minus_links[] = ''.$check_delivery_note['belegnr'].''; } - else if ($lieferschein_id['anzahl_nummern'] > $lieferschein_id['menge']) { - $lieferschein_plus_id_links[] = ''.$lieferschein_id['nummer'].''; + else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { + $lieferschein_plus_links[] = ''.$check_delivery_note['belegnr'].''; } } - if (!empty($lieferschein_minus_id_links)) { - $this->app->YUI->Message('warning','Seriennummern fehlen für Lieferschein: '.implode(', ',$lieferschein_minus_id_links)); + if (!empty($lieferschein_minus_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Lieferschein: '.implode(', ',$lieferschein_minus_links)); } - if (!empty($lieferschein_plus_id_links)) { - $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_id_links)); + if (!empty($lieferschein_plus_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_links)); } } } @@ -526,20 +560,36 @@ class Seriennummern { $this->app->YUI->TableSearch('TAB1', 'seriennummern_lieferscheine_list', "show", "", "", basename(__FILE__), __CLASS__); - $this->app->Tpl->Parse('PAGE', "seriennummern_list.tpl"); + $this->app->Tpl->Parse('PAGE', "seriennummern_lieferscheine_list.tpl"); } public function seriennummern_delete() { $id = (int) $this->app->Secure->GetGET('id'); - if (!$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'")) { - $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}'"); - $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); - } else { - $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden da eine Lieferscheinzuordnung existiert!'); + if ($id) { + if (!$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'")) { + $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}'"); + $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); + } else { + $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden da eine Lieferscheinzuordnung existiert!'); + } + $this->seriennummern_nummern_list(); } - $this->seriennummern_nummern_list(); + } + + public function seriennummern_remove() { + $id = (int) $this->app->Secure->GetGET('id'); + + if ($id) { + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_lieferschein_position` WHERE `lieferschein_position` = '{$id}'")) { + $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); + } + $lieferschein = $this->app->DB->Select("SELECT lieferschein FROM lieferschein_position WHERE id = '".$id."'"); + $this->app->Location->execute("index.php?module=seriennummern&action=enter&lieferschein=$lieferschein&msg=$msg"); + } + } + function seriennummern_enter() { @@ -573,6 +623,18 @@ class Seriennummern { $seriennummern = explode('\n',str_replace(['\r'],'',$seriennummern_text)); switch ($submit) { + case 'assistent': + $praefix = $this->app->Secure->GetPOST('praefix'); + $start = $this->app->Secure->GetPOST('start'); + $postfix = $this->app->Secure->GetPOST('postfix'); + $anzahl = (int) $this->app->Secure->GetPOST('anzahl'); + + while ($anzahl) { + $seriennummern[] = $praefix.$start.$postfix; + $anzahl--; + $start++; + } + break; case 'hinzufuegen': $eingabescan = $this->app->Secure->GetPOST('eingabescan'); $eingabe = $this->app->Secure->GetPOST('eingabe'); @@ -630,24 +692,87 @@ class Seriennummern { } $seriennummern = array_merge($seriennummern_not_written, $seriennummern_already_exist, $seriennummern_old_not_allowed); break; - case 'assistent': - $praefix = $this->app->Secure->GetPOST('praefix'); - $start = $this->app->Secure->GetPOST('start'); - $postfix = $this->app->Secure->GetPOST('postfix'); - $anzahl = (int) $this->app->Secure->GetPOST('anzahl'); + case 'lieferscheinzuordnen': - while ($anzahl) { - $seriennummern[] = $praefix.$start.$postfix; - $anzahl--; - $start++; + if (empty($lieferschein_id)) { + break; } + $auswahl = $this->app->Secure->GetPOST('auswahl'); + if (!empty($auswahl)) { + if (count($auswahl) > 1) { + $this->app->Tpl->addMessage('error', 'Bitte eine oder keine Position anklicken'); + break; + } + $lieferschein_position = $auswahl[0]; + $sql_auswahl = " AND artikel IN (SELECT artikel FROM lieferschein_position WHERE id = '".$lieferschein_position."'"; + } + + $seriennummern_not_written = array(); + $seriennummern_dont_exist = array(); + $seriennummern_ambigious = array(); + + foreach ($seriennummern as $seriennummer) { + + $seriennummer = trim($seriennummer); + + if (empty($seriennummer)) { + continue; + } + + $sql = "SELECT id, artikel FROM seriennummern WHERE eingelagert = 1 AND seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."'".$sql_auswahl; + + $check_existing = $this->app->DB->SelectArr($sql); + + if (empty($check_existing)) { + $seriennummern_dont_exist[] = $seriennummer; + } else if (count($check_existing) > 1) { + $seriennummern_ambigious[] = $seriennummer; + } else { + + $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true); + $written = false; + + foreach ($check_lieferschein as $position) { + $menge_offen = $position['menge_lieferschein']-$position['menge_nummern']; + + if ($menge_offen > 0) { + if (empty($lieferschein_position)) { + $lieferschein_position = $position['lieferschein_position']; + } + if ($lieferschein_position == $position['lieferschein_position']) { + $sql = "INSERT INTO seriennummern_lieferschein_position (lieferschein_position, seriennummer) VALUES ('".$lieferschein_position."','".$check_existing[0]['id']."') "; + + $this->app->DB->Insert($sql); + $written = true; + } + } + } + + if (!$written) { + $seriennummern_not_written[] = $seriennummer; + } + + } + + } + if (!empty($seriennummern_dont_exist)) { + $this->app->Tpl->addMessage('error', 'Seriennummern existieren nicht: '.implode(', ',$seriennummern_dont_exist)); + } + if (!empty($seriennummern_ambigious)) { + $this->app->Tpl->addMessage('error', 'Seriennummern nicht eindeutig: '.implode(', ',$seriennummern_ambigious)); + } + $seriennummern = array_merge($seriennummern_not_written, $seriennummern_ambigious, $seriennummern_dont_exist); + break; } $seriennummern = array_unique($seriennummern); + $complete = false; + switch ($task) { case 'artikel': + $this->app->Tpl->Set('LIEFERSCHEIN_HIDDEN', "hidden=\"true\""); $check_seriennummern = $this->seriennummern_check_serials($artikel_id); $check_seriennummern = $check_seriennummern[0]; @@ -676,13 +801,38 @@ class Seriennummern { $this->app->Tpl->Set('ANZLAGER', $check_seriennummern['menge_auf_lager']); $this->app->Tpl->Set('ANZVORHANDEN', $check_seriennummern['menge_nummern']); $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); - $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + + $artikel_id = $this->app->Secure->GetGET('artikel'); + $this->app->User->SetParameter('seriennummern_artikel_id', $artikel_id); + $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); break; case 'lieferschein': + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=lieferscheine_list", "Zurück"); $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); $this->app->Tpl->Set('LIEFERSCHEINNUMMER', ''.$lieferschein['belegnr'].''); + $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true); + + if (empty($check_lieferschein)) { + $this->app->Tpl->AddMessage('success', 'Seriennummern vollständig.'); + $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true, only_missing: false); + $this->app->Tpl->Set('EINGABE_HIDDEN', 'hidden'); + } + + $menge_lieferschein = array_sum(array_column($check_lieferschein,'menge_lieferschein')); + $menge_nummern = array_sum(array_column($check_lieferschein,'menge_nummern')); + $anzahl_fehlt = $menge_lieferschein-$menge_nummern; + + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $this->app->Tpl->Set('ANZLIEFERSCHEIN', $menge_lieferschein); + $this->app->Tpl->Set('ANZVORHANDEN', $menge_nummern); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + $artikel_lieferschein = $this->app->DB->SelectArr("SELECT artikel FROM lieferschein_position WHERE lieferschein = '".$lieferschein_id."'"); $sql = " @@ -693,7 +843,7 @@ class Seriennummern { LEFT JOIN seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE - s.artikel IN ('".implode("','",array_column($artikel_lieferschein,'artikel'))."') + s.artikel = '".$check_lieferschein[0]['artikel']."' AND s.eingelagert = 1 AND slp.id IS NULL ORDER BY s.id ASC @@ -708,7 +858,14 @@ class Seriennummern { $this->app->Tpl->Set('START', $matches[2]); $this->app->Tpl->Set('POSTFIX', $matches[3]); - $this->app->YUI->TableSearch('LIEFERSCHEINPOSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); + $fehlt = $check_lieferschein[0]['menge_lieferschein']-$check_lieferschein[0]['menge_nummern']; + if ($fehlt < 0) { + $fehlt = 0; + } + + $this->app->Tpl->Set('ANZAHL', $fehlt); + + $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); @@ -774,37 +931,54 @@ class Seriennummern { * Check if all delivery notes have serials * Return array of delivery note positions and head information */ - public function seriennummern_check_delivery_notes($lieferschein_id = null) : array { + public function seriennummern_check_delivery_notes($lieferschein_id = null, $ignore_date = false, $only_missing = true) : array { $sql = " SELECT SQL_CALC_FOUND_ROWS - l.id, - l.belegnr nummer, - menge, - SUM(IF(slp.id IS NULL, 0, 1)) menge_nummern + l.id lieferschein, + l.belegnr belegnr, + lp.id lieferschein_position, + a.id artikel, + a.nummer artikel_nummer, + a.name_de, + ".$this->app->erp->FormatMenge('SUM(menge)')." menge_lieferschein, + SUM(COALESCE(menge_nummern,0)) menge_nummern FROM - lieferschein_position lp - LEFT JOIN seriennummern_lieferschein_position slp ON - slp.lieferschein_position = lp.id + lieferschein_position lp INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN artikel a ON a.id = lp.artikel + LEFT JOIN ( + SELECT + lieferschein_position, + COUNT(*) menge_nummern + FROM + seriennummern_lieferschein_position slp + GROUP BY + slp.lieferschein_position + ) slp ON slp.lieferschein_position = lp.id WHERE - (a.seriennummern <> 'keine') AND( + (a.seriennummern <> 'keine') + AND ( l.datum >=( - SELECT - MIN(datum) - FROM - seriennummern - WHERE - artikel = a.id - ) - ) AND (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') + SELECT + DATE(MIN(datum)) + FROM + seriennummern + WHERE + artikel = a.id + ) OR ('".$ignore_date."' <> '') + ) + AND (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') GROUP BY - l.id - HAVING menge > menge_nummern + l.id, + lp.id "; - + + if ($only_missing) { + $sql .= " HAVING menge_lieferschein > menge_nummern"; + } + $result = $this->app->DB->SelectArr($sql); return(empty($result)?array():$result); } From ca6249584f87166421919709df89d02d9332ee8f Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 6 Aug 2024 22:13:37 +0200 Subject: [PATCH 11/25] seriennummern print on lieferschein preliminary --- www/lib/dokumente/class.briefpapier.php | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index 46d1811d..ee8c7e6b 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -307,6 +307,36 @@ class Briefpapier extends SuperFPDF { public function GetChargeMHDSNString($type,$doctype,$doctypeid,$posid, $returnSimpleString = false) { + + + switch ($type) { + case 'sn': + $sql = "SELECT + s.seriennummer + FROM + seriennummern s + INNER JOIN + seriennummern_lieferschein_position slp ON slp.seriennummer = s.id + WHERE + slp.lieferschein_position = $posid + "; + $values = $this->app->DB->SelectArr($sql); + return(implode(', ',array_column($values,'seriennummer'))); + break; + } + + if(!empty($values)){ + if($returnSimpleString) { + return implode(', ', $values); + } + return implode("\r\n",$values); + } + return ''; + + +// XENTRAL Legacy +/* + $lieferschein_posid = 0; $auftrag_position_id = 0; $lieferschein = 0; @@ -560,6 +590,7 @@ class Briefpapier extends SuperFPDF { return implode("\r\n",$tmp_string); } return ''; +*/ } function CheckPosition($value,$doctype,$doctypeid,$posid) @@ -3306,6 +3337,10 @@ class Briefpapier extends SuperFPDF { } } + // OpenXE Seriennummern + + + if(!empty($this->doctype) && !empty($this->id) && strpos($item['desc'], '{') !== false) { $item['desc'] = $this->app->erp->ParseUserVars($this->doctype, $this->id ,$item['desc']); } From 8f3d2a6ade5615fabac7afa7909d762dab1a3cbf Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 6 Aug 2024 22:52:47 +0200 Subject: [PATCH 12/25] seriennummern bugfix array PDF --- www/lib/dokumente/class.briefpapier.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index ee8c7e6b..5a40fdae 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -318,9 +318,9 @@ class Briefpapier extends SuperFPDF { INNER JOIN seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE - slp.lieferschein_position = $posid + slp.lieferschein_position = $posid "; - $values = $this->app->DB->SelectArr($sql); + $values = (array) $this->app->DB->SelectArr($sql); return(implode(', ',array_column($values,'seriennummer'))); break; } From 934bd151eae184ee5061461dcae7d7db6beef135 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 7 Aug 2024 12:11:32 +0200 Subject: [PATCH 13/25] seriennummern bugfix lieferschein check message --- .../seriennummern_lieferscheine_list.tpl | 43 +++++++++++-------- www/pages/seriennummern.php | 25 ++++++++--- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/www/pages/content/seriennummern_lieferscheine_list.tpl b/www/pages/content/seriennummern_lieferscheine_list.tpl index 25d5cb31..82eddad7 100644 --- a/www/pages/content/seriennummern_lieferscheine_list.tpl +++ b/www/pages/content/seriennummern_lieferscheine_list.tpl @@ -1,28 +1,33 @@
    -
    -
    -
    {|Filter|} -
    -
      -
    • - - -
    • -
    -
    -
    [MESSAGE] +
    + [FORMHANDLEREVENT] +
    +
    +
    {|Filter|} +
    +
      +
    • + + +
    • +
    +
    +
    +
    +
    [TAB1] [TAB1NEXT] +
    diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index c1d16fd5..9cbab9f5 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -425,6 +425,8 @@ class Seriennummern { $groupby = "GROUP BY lp.id"; + $orderby = "ORDER BY lp.sort ASC"; + // echo($sql." WHERE ".$where." ".$groupby); break; @@ -472,7 +474,7 @@ class Seriennummern { function seriennummern_delivery_note_check_and_message($lieferschein_id) { - $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); + $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id, group_lieferschein: true); if (!empty($check_delivery_notes)) { $lieferschein_minus_links = array(); $lieferschein_plus_links = array(); @@ -490,7 +492,7 @@ class Seriennummern { if (!empty($lieferschein_plus_links)) { $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_links)); } - } + } } function seriennummern_nummern_list() { @@ -931,12 +933,21 @@ class Seriennummern { * Check if all delivery notes have serials * Return array of delivery note positions and head information */ - public function seriennummern_check_delivery_notes($lieferschein_id = null, $ignore_date = false, $only_missing = true) : array { + public function seriennummern_check_delivery_notes($lieferschein_id = null, $ignore_date = false, $only_missing = true, $group_lieferschein = false) : array { + + if ($group_lieferschein) { + $sql_lp = "''"; + $sql_lp_group = ""; + } else { + $sql_lp = "lp.id"; + $sql_lp_group = ", lp.id"; + } + $sql = " SELECT SQL_CALC_FOUND_ROWS l.id lieferschein, l.belegnr belegnr, - lp.id lieferschein_position, + $sql_lp lieferschein_position, a.id artikel, a.nummer artikel_nummer, a.name_de, @@ -971,12 +982,12 @@ class Seriennummern { ) AND (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') GROUP BY - l.id, - lp.id + l.id + $sql_lp_group "; if ($only_missing) { - $sql .= " HAVING menge_lieferschein > menge_nummern"; + $sql .= " HAVING menge_lieferschein <> menge_nummern"; } $result = $this->app->DB->SelectArr($sql); From 5f590c586c1ebdd417cf2ad4461862534fd08539 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 13 Aug 2024 12:12:55 +0200 Subject: [PATCH 14/25] seriennummern seriennummern_check_serials ignore lieferschein with empty belegnr --- www/pages/seriennummern.php | 1 + 1 file changed, 1 insertion(+) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 9cbab9f5..e2879c09 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -981,6 +981,7 @@ class Seriennummern { ) OR ('".$ignore_date."' <> '') ) AND (l.id = '".$lieferschein_id."' OR '".$lieferschein_id."' = '') + AND l.belegnr <> '' GROUP BY l.id $sql_lp_group From 5daa541f4f81e12d69ae0764baa44284af419f72 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 15 Aug 2024 18:12:24 +0200 Subject: [PATCH 15/25] templateparser addtext html --- phpwf/plugins/class.templateparser.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/phpwf/plugins/class.templateparser.php b/phpwf/plugins/class.templateparser.php index 09854989..7875200a 100644 --- a/phpwf/plugins/class.templateparser.php +++ b/phpwf/plugins/class.templateparser.php @@ -365,9 +365,13 @@ class TemplateParser { echo '

    '; } } - function SetText($_var, $_value) - { - $this->VARARRAY[$_var]= $this->htmlspecialchars($_value); + function SetText($_var, $_value, $html = false) + { + if(!$html) + { + $_value = $this->htmlspecialchars($_value); + } + $this->VARARRAY[$_var]= $_value; } function AddText($_var,$_value, $variable = false){ From 42f5d3cc01579fa26f3097c4b3d730b915cb291e Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 15 Aug 2024 18:12:58 +0200 Subject: [PATCH 16/25] seriennummern lieferschein warning and tab --- www/lib/class.erpapi.php | 13 +++++++---- www/pages/content/seriennummern_enter.tpl | 8 +++---- www/pages/lieferschein.php | 18 +++++++++++---- www/pages/seriennummern.php | 27 ++++++++++++++++++----- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index a83744a5..b6dfb773 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2821,14 +2821,19 @@ public function NavigationHooks(&$menu) } } - function SeriennummernCheckWarnung($artikel_id) { + function SeriennummernCheckWarnung(int $artikel_id) { $obj = $this->LoadModul('seriennummern'); $obj->seriennummern_check_and_message_stock_added($artikel_id); } - function SeriennummernCheckLieferscheinWarnung($lieferschein_id) { + function SeriennummernCheckLieferscheinWarnung(int $lieferschein_id, bool $notification) { $obj = $this->LoadModul('seriennummern'); - $obj->seriennummern_check_and_message_delivery_note_removed($lieferschein_id); + $obj->seriennummern_check_and_message_delivery_note($lieferschein_id, $notification); + } + + function SeriennummernCheckLieferschein($lieferschein_id = null, $ignore_date = false, $only_missing = true, $group_lieferschein = false) { + $obj = $this->LoadModul('seriennummern'); + return ($obj->seriennummern_check_delivery_notes($lieferschein_id, $ignore_date, $only_missing, $group_lieferschein)); } // @refactor in Lager Modul @@ -3557,7 +3562,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } $this->RunHook('erpapi_lieferschein_auslagern', 1, $lieferschein); - $this->SeriennummernCheckLieferscheinWarnung($lieferschein); + $this->SeriennummernCheckLieferscheinWarnung($lieferschein, true); $this->LieferscheinProtokoll($lieferschein,"Lieferschein ausgelagert"); } } diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl index a21719aa..6d42b9bd 100644 --- a/www/pages/content/seriennummern_enter.tpl +++ b/www/pages/content/seriennummern_enter.tpl @@ -137,7 +137,7 @@
  • - {|Gewählte Seriennummern|} + {|Liste der gewählten Seriennummern|}
    @@ -176,12 +176,12 @@
    - +
    - +
    - +
    diff --git a/www/pages/lieferschein.php b/www/pages/lieferschein.php index ec30c729..0c206ccf 100644 --- a/www/pages/lieferschein.php +++ b/www/pages/lieferschein.php @@ -1727,9 +1727,6 @@ class Lieferschein extends GenLieferschein // $this->app->Tpl->Set(KURZUEBERSCHRIFT,"Lieferschein $belegnr"); $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"$name Lieferschein $belegnr"); - - - // $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=edit&id=$id","Lieferscheindaten"); //$this->app->Tpl->Add(TABS,"
  • Positionen
  • "); @@ -1742,10 +1739,19 @@ class Lieferschein extends GenLieferschein } $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=edit&id=$id","Details"); - $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke"); // $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=abschicken&id=$id","Abschicken / Protokoll"); // $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=protokoll&id=$id","Protokoll"); $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=list","Zurück zur Übersicht"); + + if (!empty($this->app->erp->SeriennummernCheckLieferschein( + lieferschein_id: $id, + ignore_date: true, + only_missing: false, + group_lieferschein: true))) { + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=enter&lieferschein=".$id."&from=lieferschein", "Seriennummern"); + } + + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke"); $this->app->erp->RunMenuHook('lieferschein'); } @@ -1887,6 +1893,10 @@ class Lieferschein extends GenLieferschein $lieferantenretoure = $lieferscheinarr['lieferantenretoure'];//$this->app->DB->Select("SELECT lieferantenretoure FROM lieferschein WHERE id='$id' LIMIT 1"); $schreibschutz = $lieferscheinarr['schreibschutz'];//$this->app->DB->Select("SELECT schreibschutz FROM lieferschein WHERE id='$id' LIMIT 1"); $status = $lieferscheinarr['status'];//$this->app->DB->Select("SELECT status FROM lieferschein WHERE id='$id' LIMIT 1"); + + if ($status != 'angelegt' && $status != 'storniert') { + $this->app->erp->SeriennummernCheckLieferscheinWarnung($id, false); + } }else{ $nummer = ''; $projekt = 0; diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index e2879c09..dd23d019 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -278,7 +278,7 @@ class Seriennummern { $menu_link = array( '', + '&from=seriennummern">', '', '', ); @@ -599,6 +599,8 @@ class Seriennummern { $task = ""; + $from = $this->app->Secure->GetGET('from'); + $artikel_id = (int) $this->app->Secure->GetGET('artikel'); if (!empty($artikel_id)) { $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); @@ -614,7 +616,7 @@ class Seriennummern { $lieferschein = $this->app->DB->SelectRow("SELECT belegnr FROM lieferschein WHERE id ='".$lieferschein_id."'"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2','Lieferschein '.$lieferschein['belegnr']); - $this->app->Tpl->SetText('LEGEND','Lieferschein '.$lieferschein['belegnr']); + $this->app->Tpl->SetText('LEGEND','Lieferschein '.$lieferschein['belegnr'].'', html: true); $task = "lieferschein"; } @@ -811,7 +813,16 @@ class Seriennummern { break; case 'lieferschein': - $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=lieferscheine_list", "Zurück"); + + switch ($from) { + case 'lieferschein': + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=edit&id=".$lieferschein_id, "Zurück"); + break; + case 'seriennummern': + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=lieferscheine_list", "Zurück"); + break; + } + $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); $this->app->Tpl->Set('LIEFERSCHEINNUMMER', ''.$lieferschein['belegnr'].''); @@ -1050,12 +1061,16 @@ class Seriennummern { } /* - * Check if numbers need to be entered after stock removal, if yes, create notification + * Check if numbers need to be entered after stock removal, if yes, create notification or message */ - public function seriennummern_check_and_message_delivery_note_removed(int $lieferschein_id) { + public function seriennummern_check_and_message_delivery_note(int $lieferschein_id, bool $notification) { $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); if (!empty($check_delivery_notes)) { - $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); + if ($notificiation) { + $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); + } else { + $this->app->Tpl->Add('MESSAGE',"
    Bitte Seriennummern erfassen
    "); + } } } From a3285d6c61e564450ea22ed7c848d6b9173b84c9 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 21 Aug 2024 12:45:19 +0200 Subject: [PATCH 17/25] seriennummern added workflow buttons control, minidetail for seriennummer --- www/lib/class.erpapi.php | 2 +- .../seriennummern_lieferschein_enter.tpl | 197 ------------------ www/pages/lieferschein.php | 119 +++++------ www/pages/seriennummern.php | 74 ++++--- 4 files changed, 104 insertions(+), 288 deletions(-) delete mode 100644 www/pages/content/seriennummern_lieferschein_enter.tpl diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index b6dfb773..ce30b82d 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2828,7 +2828,7 @@ public function NavigationHooks(&$menu) function SeriennummernCheckLieferscheinWarnung(int $lieferschein_id, bool $notification) { $obj = $this->LoadModul('seriennummern'); - $obj->seriennummern_check_and_message_delivery_note($lieferschein_id, $notification); + return($obj->seriennummern_check_and_message_delivery_note($lieferschein_id, $notification)); } function SeriennummernCheckLieferschein($lieferschein_id = null, $ignore_date = false, $only_missing = true, $group_lieferschein = false) { diff --git a/www/pages/content/seriennummern_lieferschein_enter.tpl b/www/pages/content/seriennummern_lieferschein_enter.tpl deleted file mode 100644 index 672c4941..00000000 --- a/www/pages/content/seriennummern_lieferschein_enter.tpl +++ /dev/null @@ -1,197 +0,0 @@ -
    - - -
    - [MESSAGE] -
    - [FORMHANDLEREVENT] -
    -
    -
    -
    -
    - {|Seriennummern erfassen [LEGEND]|} - - - - - - - - - - - - - - - - - - - - - -
    - {|Lagermenge|}: - - -
    - {|Seriennummern verfügbar|}: - - -
    - {|Seriennummern fehlen|}: - - -
    - {|Seriennummer scannen|}: - - -
    - {|Seriennummer wählen|}: - - -
    -
    -
    -
    -
    -
    -
    - {|Seriennummernassistent|} - - - - - - - - - - - - - - - - - - - - - -
    - {|Letzte Seriennummer|}: - - -
    - {|Präfix|}: - - -
    - {|Start|}: - - -
    - {|Postfix|}: - - -
    - {|Anzahl|}: - - -
    -
    -
    -
    -
    -
    -
    - {|Aktionen|} - - - - - - - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {|Gewählte Seriennummern|} - - - - - -
    - {|Seriennummern|}: - - - Liste der Seriennummern, 1 pro Zeile -
    -
    -
    -
    -
    -
    -
    - {|Aktionen|} - - - - - - - - - - -
    - {|Ausgelieferte erlauben|} -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {|Lieferscheinpositionen|} - [LIEFERSCHEINPOSITIONEN] -
    -
    -
    -
    -
    -
    -
    -
    - diff --git a/www/pages/lieferschein.php b/www/pages/lieferschein.php index 0c206ccf..b2a5d241 100644 --- a/www/pages/lieferschein.php +++ b/www/pages/lieferschein.php @@ -645,12 +645,15 @@ class Lieferschein extends GenLieferschein $adresse = $this->app->DB->Select("SELECT adresse FROM lieferschein WHERE id='$id' LIMIT 1"); $lieferantenretoure = $this->app->DB->Select("SELECT lieferantenretoure FROM lieferschein WHERE id='$id' LIMIT 1"); - if($adresse > 0 && ($status=="angelegt" || $status=="")) - $freigabe = ""; + if($adresse > 0 && ($status=="angelegt" || $status=="")) { + $freigabe = ""; + } + $seriennummern_check_result = $this->app->erp->SeriennummernCheckLieferschein(lieferschein_id: $id, ignore_date: true, only_missing: true, group_lieferschein: true); - if(($status=="versendet" || $status=="freigegeben") && $lieferantenretoure=="1") - $abschliessen = ""; + if(($status=="versendet" || $status=="freigegeben") && $lieferantenretoure=="1" && empty($seriennummern_check_result)) { + $abschliessen = ""; + } $checkifrgexists = $this->app->DB->Select("SELECT id FROM rechnung WHERE lieferschein='$id' LIMIT 1"); @@ -668,7 +671,6 @@ class Lieferschein extends GenLieferschein $hookcase = ''; $this->app->erp->RunHook('Lieferschein_Aktion_option',3, $id, $status, $hookoption); $this->app->erp->RunHook('Lieferschein_Aktion_case',3, $id, $status, $hookcase); - $bestellmengelagerartikel = $this->app->DB->Select("SELECT sum(lp.menge) as bestellmenge from lieferschein_position lp INNER JOIN artikel a on a.id=lp.artikel where a.lagerartikel=1 AND lp.lieferschein = '$id'"); $liefermengelagerartikel = $this->app->DB->Select("SELECT sum(lp.geliefert) as liefermenge from lieferschein_position lp INNER JOIN artikel a on a.id=lp.artikel where a.lagerartikel=1 AND lp.lieferschein = '$id'"); @@ -695,19 +697,20 @@ class Lieferschein extends GenLieferschein } $optionumlagern = ""; - $abschicken = ""; - if($status!="angelegt" && $lieferantenretoure!="1") - { - $alsrechnung = ""; - if($this->app->erp->RechteVorhanden('lieferschein', 'proformarechnung') && $this->app->erp->ModulVorhanden('proformarechnung')) - { - $alsrechnung .= ""; - } + if (empty($seriennummern_check_result)) { + $abschicken = ""; + if($status!="angelegt" && $lieferantenretoure!="1") + { + $alsrechnung = ""; + if($this->app->erp->RechteVorhanden('lieferschein', 'proformarechnung') && $this->app->erp->ModulVorhanden('proformarechnung')) + { + $alsrechnung .= ""; + } + } } } - if($this->app->erp->RechteVorhanden('belegeimport', 'belegcsvexport')) { $casebelegeimport = "case 'belegeimport': window.location.href='index.php?module=belegeimport&action=belegcsvexport&cmd=lieferschein&id=%value%'; break;"; @@ -829,7 +832,6 @@ class Lieferschein extends GenLieferschein $lieferantenretoureinfo = $auftragArr[0]['lieferantenretoureinfo']; } - $this->app->Tpl->Set('LIEFERANTENRETOUREINFO',$lieferantenretoureinfo); if($lieferantenretoure!='1') { @@ -849,7 +851,6 @@ class Lieferschein extends GenLieferschein $this->app->Tpl->Set('ZAHLWEISE',$auftragArr[0]['zahlungsweise']); $this->app->Tpl->Set('STATUS',$auftragArr[0]['status']); - if($auftragArr[0]['auftragid'] > 0){ $orderRow = $this->app->DB->SelectRow( "SELECT belegnr, projekt FROM auftrag WHERE id='".$auftragArr[0]['auftragid']."' LIMIT 1" @@ -874,8 +875,7 @@ class Lieferschein extends GenLieferschein }else{ $this->app->Tpl->Set('AUFTRAG','-'); } - - + if($auftragArr[0]['auftragid'] > 0){ $rechnung = $this->app->DB->SelectArr( ($auftragArr[0]['auftragid']? @@ -915,9 +915,7 @@ class Lieferschein extends GenLieferschein INNER JOIN lieferschein_position lp ON lp.id = s.lieferschein_position_id WHERE lp.lieferschein='$id' "); - } - } $crechnung = !empty($rechnung)?count($rechnung):0; @@ -939,14 +937,13 @@ class Lieferschein extends GenLieferschein else $this->app->Tpl->Set('STEUER',"Export"); - if($menu) { $menu = $this->LieferscheinIconMenu($id); $this->app->Tpl->Set('MENU',$menu); } - // ARTIKEL + // ARTIKEL $lieferscheinarr = $this->app->DB->SelectRow("SELECT * FROM lieferschein WHERE id='$id' LIMIT 1"); $status = $lieferscheinarr['status'];//$this->app->DB->Select("SELECT status FROM lieferschein WHERE id='$id' LIMIT 1"); @@ -1313,8 +1310,6 @@ class Lieferschein extends GenLieferschein $this->app->erp->DokumentAbschicken(); } - - function LieferscheinDelete($id = null) { if(is_null($id)) @@ -1716,7 +1711,7 @@ class Lieferschein extends GenLieferschein } - function LieferscheinMenu() + function LieferscheinMenu($seriennummern_zeigen = false, $paketmarke_zeigen = false) { $id = $this->app->Secure->GetGET("id"); @@ -1733,26 +1728,22 @@ class Lieferschein extends GenLieferschein // status bestell $status = $this->app->DB->Select("SELECT status FROM lieferschein WHERE id='$id' LIMIT 1"); + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=edit&id=$id","Details"); + if ($status=="angelegt") { - $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=freigabe&id=$id","Freigabe"); + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=freigabe&id=$id","Freigabe"); + } else { + if ($seriennummern_zeigen) { + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=enter&lieferschein=".$id."&from=lieferschein", "Seriennummern"); + } + if ($paketmarke_zeigen) { + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke"); + } } - $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=edit&id=$id","Details"); - // $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=abschicken&id=$id","Abschicken / Protokoll"); - // $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=protokoll&id=$id","Protokoll"); $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=list","Zurück zur Übersicht"); - - if (!empty($this->app->erp->SeriennummernCheckLieferschein( - lieferschein_id: $id, - ignore_date: true, - only_missing: false, - group_lieferschein: true))) { - $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=enter&lieferschein=".$id."&from=lieferschein", "Seriennummern"); - } - - $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke"); - + $this->app->erp->RunMenuHook('lieferschein'); } @@ -1869,15 +1860,25 @@ class Lieferschein extends GenLieferschein if($this->app->erp->InnendienstAendern("lieferschein",$id,$cmd,$sid)) return; + + $seriennummern = $this->app->erp->SeriennummernCheckLieferschein( + lieferschein_id: $id, + ignore_date: true, + only_missing: false, + group_lieferschein: true); + + $seriennummern_aktiv = !empty($seriennummern); + + $seriennummern_check_result = $this->app->erp->SeriennummernCheckLieferscheinWarnung($id, false); + + $seriennummern_ok = empty($seriennummern_check_result); + if($this->app->erp->DisableModul("lieferschein",$id)) { - //$this->app->erp->MenuEintrag("index.php?module=auftrag&action=list","Zurück zur Übersicht"); - $this->LieferscheinMenu(); + $this->LieferscheinMenu(seriennummern_zeigen: !empty($seriennummern), paketmarke_zeigen: false); return; } - - $this->app->YUI->AARLGPositionen(); $this->app->erp->CheckVertrieb($id,"lieferschein"); @@ -1893,10 +1894,6 @@ class Lieferschein extends GenLieferschein $lieferantenretoure = $lieferscheinarr['lieferantenretoure'];//$this->app->DB->Select("SELECT lieferantenretoure FROM lieferschein WHERE id='$id' LIMIT 1"); $schreibschutz = $lieferscheinarr['schreibschutz'];//$this->app->DB->Select("SELECT schreibschutz FROM lieferschein WHERE id='$id' LIMIT 1"); $status = $lieferscheinarr['status'];//$this->app->DB->Select("SELECT status FROM lieferschein WHERE id='$id' LIMIT 1"); - - if ($status != 'angelegt' && $status != 'storniert') { - $this->app->erp->SeriennummernCheckLieferscheinWarnung($id, false); - } }else{ $nummer = ''; $projekt = 0; @@ -1958,20 +1955,19 @@ class Lieferschein extends GenLieferschein $this->app->erp->PDFArchivieren('lieferschein', $id, true); } - if($status != "angelegt" && $status != "angelegta" && $status != "a") + if($status != "angelegt" && $status != "angelegta" && $status != "a" && $seriennummern_ok) { $Brief = new Briefpapier($this->app); - if($Brief->zuArchivieren($id, "lieferschein")) + if ($Brief->zuArchivieren($id, "lieferschein")) { - $this->app->Tpl->Add('MESSAGE',"
    Der Lieferschein ist noch nicht archiviert! Bitte versenden oder manuell archivieren. -
    "); - }elseif(!$this->app->DB->Select("SELECT versendet FROM lieferschein WHERE id = '$id' LIMIT 1")) + $this->app->Tpl->Add('MESSAGE',"
    Der Lieferschein ist noch nicht archiviert! Bitte versenden oder manuell archivieren.
    "); + } elseif(!$this->app->DB->Select("SELECT versendet FROM lieferschein WHERE id = '$id' LIMIT 1")) { $this->app->Tpl->Add('MESSAGE',"
    Der Lieferschein wurde noch nicht versendet!
    "); } } - if($schreibschutz!="1")// && $this->app->erp->RechteVorhanden("lieferschein","schreibschutz")) + if($schreibschutz!="1") { $this->app->erp->AnsprechpartnerButton($adresse); $this->app->erp->LieferadresseButton($adresse); @@ -1980,11 +1976,8 @@ class Lieferschein extends GenLieferschein $this->app->erp->LieferscheinNeuberechnen($id); } - - //$this->LieferscheinMiniDetail(MINIDETAIL,false); $this->app->Tpl->Set('ICONMENU',$this->LieferscheinIconMenu($id)); - $this->app->Tpl->Set('ICONMENU2',$this->LieferscheinIconMenu($id,2)); - + //$this->app->Tpl->Set('ICONMENU2',$this->LieferscheinIconMenu($id,2)); if($nummer!="") { @@ -1998,7 +1991,6 @@ class Lieferschein extends GenLieferschein if($schreibschutz=="1" && $this->app->erp->RechteVorhanden("lieferschein","schreibschutz")) { $this->app->Tpl->Add('MESSAGE',"
    Dieser Lieferschein ist schreibgeschützt und darf daher nicht mehr bearbeitet werden! 
    "); - // $this->app->erp->CommonReadonly(); } if($schreibschutz=="1") $this->app->erp->CommonReadonly(); @@ -2012,13 +2004,11 @@ class Lieferschein extends GenLieferschein '); - $this->app->Tpl->Set('BUTTON_UEBERNEHMEN2', ' '); } - // immer wenn sich der lieferant genändert hat standartwerte setzen if($this->app->Secure->GetPOST("adresse")!="") { @@ -2053,10 +2043,8 @@ class Lieferschein extends GenLieferschein header("Location: index.php?module=lieferschein&action=edit&id=$id"); exit; } - } - // easy table mit arbeitspaketen YUI als template $table = new EasyTable($this->app); $table->Query("SELECT nummer as Nummer, bezeichnung, menge,vpe as VPE @@ -2086,7 +2074,8 @@ class Lieferschein extends GenLieferschein header("Location: index.php?module=lieferschein&action=positionen&id=$id"); exit; } - $this->LieferscheinMenu(); + + $this->LieferscheinMenu(seriennummern_zeigen: $seriennummern_aktiv, paketmarke_zeigen: $seriennummern_ok); } @@ -2230,8 +2219,6 @@ class Lieferschein extends GenLieferschein $this->app->YUI->DateiUpload('PAGE',"Lieferschein",$id); } - - function LieferscheinList() { if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('lieferschein', 'edit')) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index dd23d019..64e914d7 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -22,6 +22,7 @@ class Seriennummern { $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); $this->app->ActionHandler("remove", "seriennummern_remove"); + $this->app->ActionHandler("minidetail_lieferscheinposition", "seriennummern_lieferscheinpos_minidetail"); $this->app->ActionHandler("minidetail", "seriennummern_minidetail"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); @@ -36,14 +37,14 @@ class Seriennummern { case "seriennummern_list": $allowed['seriennummern_list'] = array('list'); // $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert','Adresse','Lieferschein','Lieferdatum', 'Menü'); - $heading = array('Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert', 'Menü'); - $width = array('10%','20%','20%','10%','1%','1%'); // Fill out manually later + $heading = array('','','Artikel-Nr.','Artikel', 'Seriennummer','Erfasst am','Eingelagert', 'Menü'); + $width = array('1%','1%','10%','20%','20%','10%','1%','1%'); // Fill out manually later // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); // $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','lh.adresse_name','lh.belegnr','lh.datum','s.id'); - $findcols = array('a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','s.id'); + $findcols = array('s.id','s.id','a.nummer', 'a.name_de', 's.seriennummer','s.datum','s.eingelagert','s.id'); $searchsql = array('a.nummer', 'a.name_de', 's.seriennummer'); $defaultorder = 1; @@ -55,9 +56,9 @@ class Seriennummern { $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; -// $moreinfo = true; // Allow drop down details + $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 + $menucol = 1; // Set id col for moredata/menu $menu = "
    " . "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; @@ -84,6 +85,7 @@ class Seriennummern { $sql_columns = " s.id, + $dropnbox, CONCAT('',a.nummer,'') as nummer, a.name_de, s.seriennummer, @@ -369,7 +371,7 @@ class Seriennummern { $searchsql = array('l.belegnr'); $moreinfo = true; // Allow drop down details -// $moreinfoaction = "lieferschein"; // specify suffix for minidetail-URL to allow different minidetails + $moreinfoaction = "_lieferscheinposition"; // specify suffix for minidetail-URL to allow different minidetails $menucol = 1; // Set id col for moredata/menu $defaultorder = 1; @@ -380,7 +382,7 @@ class Seriennummern { $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; - $menu = "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; + $menu = "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; $lieferschein_link = array( 'app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); - } - $lieferschein = $this->app->DB->Select("SELECT lieferschein FROM lieferschein_position WHERE id = '".$id."'"); - $this->app->Location->execute("index.php?module=seriennummern&action=enter&lieferschein=$lieferschein&msg=$msg"); + if ($id) { + $sql = "SELECT l.id, l.schreibschutz FROM lieferschein l INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein WHERE lp.id = '".$id."' LIMIT 1"; + $lieferschein = $this->app->DB->SelectRow($sql); + if ($lieferschein['schreibschutz']) { + $msg = $this->app->erp->base64_url_encode("
    Der Lieferschein ist schreibgeschützt.
    "); + } else { + $sql = "SELECT seriennummer FROM seriennummern_lieferschein_position WHERE `lieferschein_position` = '{$id}'"; + $seriennummer_ids = $this->app->DB->SelectArr($sql); + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_lieferschein_position` WHERE `lieferschein_position` = '{$id}'")) { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); + } else { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); + if (!empty($seriennummer_ids)) { + $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id IN (".implode(', ',array_column($seriennummer_ids, 'seriennummer')).")"; + $this->app->DB->Update($sql); + } + } + } + $this->app->Location->execute("index.php?module=seriennummern&action=enter&lieferschein=".$lieferschein['id']."&msg=$msg&from=$from"); } } @@ -746,22 +762,20 @@ class Seriennummern { } if ($lieferschein_position == $position['lieferschein_position']) { $sql = "INSERT INTO seriennummern_lieferschein_position (lieferschein_position, seriennummer) VALUES ('".$lieferschein_position."','".$check_existing[0]['id']."') "; - $this->app->DB->Insert($sql); + $sql = "UPDATE seriennummern SET eingelagert = 0, logdatei = CURRENT_TIMESTAMP WHERE id = '".$check_existing[0]['id']."'"; + $this->app->DB->Update($sql); $written = true; } } } - if (!$written) { $seriennummern_not_written[] = $seriennummer; } - } - } if (!empty($seriennummern_dont_exist)) { - $this->app->Tpl->addMessage('error', 'Seriennummern existieren nicht: '.implode(', ',$seriennummern_dont_exist)); + $this->app->Tpl->addMessage('error', 'Seriennummern nicht verfügbar: '.implode(', ',$seriennummern_dont_exist)); } if (!empty($seriennummern_ambigious)) { $this->app->Tpl->addMessage('error', 'Seriennummern nicht eindeutig: '.implode(', ',$seriennummern_ambigious)); @@ -853,12 +867,9 @@ class Seriennummern { DISTINCT s.seriennummer FROM seriennummern s - LEFT JOIN - seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE s.artikel = '".$check_lieferschein[0]['artikel']."' AND s.eingelagert = 1 - AND slp.id IS NULL ORDER BY s.id ASC LIMIT 1 "; @@ -1069,12 +1080,13 @@ class Seriennummern { if ($notificiation) { $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); } else { - $this->app->Tpl->Add('MESSAGE',"
    Bitte Seriennummern erfassen
    "); + $this->app->Tpl->Add('MESSAGE',"
    Seriennummern unvollständig!
    "); } } + return($check_delivery_notes); } - public function seriennummern_minidetail($parsetarget='',$menu=true) { + public function seriennummern_lieferscheinpos_minidetail($parsetarget='',$menu=true) { $id = $this->app->Secure->GetGET('id'); if($parsetarget=='') @@ -1087,4 +1099,18 @@ class Seriennummern { $this->app->ExitXentral(); } } + + public function seriennummern_minidetail($parsetarget='',$menu=true) { + $id = $this->app->Secure->GetGET('id'); + + if($parsetarget=='') + { + $tmp = new EasyTable($this->app); + $tmp->Query("SELECT l.belegnr AS Lieferschein, ".$this->app->erp->FormatDate('l.datum')." AS Datum, a.name AS Adresse FROM lieferschein l INNER JOIN adresse a ON a.id = l.adresse INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein INNER JOIN seriennummern_lieferschein_position slp ON slp.lieferschein_position = lp.id WHERE slp.seriennummer ='$id' ",0,""); + $tmp->DisplayNew('TAB1',"Adresse","noAction"); + + $this->app->Tpl->Output('emptytab.tpl'); + $this->app->ExitXentral(); + } + } } From 7776973a083f501be48b4b9321cb51c33e30d3f7 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 17 Sep 2024 09:50:47 +0200 Subject: [PATCH 18/25] Seriennummern added wareneingang checks --- .../seriennummern_wareneingaenge_list.tpl | 33 +++ www/pages/seriennummern.php | 231 +++++++++++++++++- 2 files changed, 251 insertions(+), 13 deletions(-) create mode 100644 www/pages/content/seriennummern_wareneingaenge_list.tpl diff --git a/www/pages/content/seriennummern_wareneingaenge_list.tpl b/www/pages/content/seriennummern_wareneingaenge_list.tpl new file mode 100644 index 00000000..bc95c2ae --- /dev/null +++ b/www/pages/content/seriennummern_wareneingaenge_list.tpl @@ -0,0 +1,33 @@ +
    + +
    + [MESSAGE] +
    + [FORMHANDLEREVENT] +
    +
    +
    {|Filter|} +
    +
      +
    • + + +
    • +
    +
    +
    +
    +
    + [TAB1] + [TAB1NEXT] +
    +
    +
    diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 64e914d7..c2b88781 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -18,7 +18,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("lieferscheine_list", "seriennummern_lieferscheine_list"); + $this->app->ActionHandler("lieferscheine_list", "seriennummern_lieferscheine_list"); + $this->app->ActionHandler("wareneingaenge_list", "seriennummern_wareneingaenge_list"); $this->app->ActionHandler("enter", "seriennummern_enter"); $this->app->ActionHandler("delete", "seriennummern_delete"); $this->app->ActionHandler("remove", "seriennummern_remove"); @@ -258,7 +259,7 @@ class Seriennummern { break; case "seriennummern_lieferscheine_list": $allowed['seriennummern_artikel_list'] = array('list'); - $heading = array('Lieferschein', 'Vom', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); + $heading = array('Lieferschein', 'Datum', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); $width = array('10%','10%','20%','1%','1%','1%','1%','1%','1%'); // Fill out manually later // columns that are aligned right (numbers etc) @@ -357,6 +358,108 @@ class Seriennummern { $groupby = "GROUP BY l.id"; break; + case "seriennummern_wareneingaenge_list": + $allowed['seriennummern_wareneingaenge_list'] = array('list'); + $heading = array('Paket-Nr.', 'Datum', 'Adresse', 'Menge Artikel', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü',''); + $width = array('10%','10%','20%','1%','1%','1%','1%','1%','1%'); // Fill out manually later + + // columns that are aligned right (numbers etc) + $alignright = array(4,5,6,7); + + $findcols = array('pa.id', 'pa.datum', 'adr.name', 'null', 'null', 'null', 'null', 'null'); + $searchsql = array('adr.name'); + + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $numbercols = array(); + $sumcol = array(); + + $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; + + //$menu = "
    " . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
    "; + + $menu_link = array( + '', + '', + '' + ); + + $wareneingang_link = array( + '', + ['sql' => 'pa.id'], + '' + ); + + $sql = " + SELECT + pa.id, + ".$app->erp->ConcatSQL($wareneingang_link).", + ".$app->erp->FormatDate("pa.datum").", + adr.name adresse, + ".$app->erp->FormatMengeFuerFormular("SUM(pd.menge)")." menge, + SUM(if(spd.id IS NULL,0,1)), + ".$app->erp->FormatMengeFuerFormular("if(menge>SUM(if(spd.id IS NULL,0,1)),menge-SUM(if(spd.id IS NULL,0,1)),0) ").", + ".$app->erp->ConcatSQL($menu_link)." + FROM + paketannahme pa + INNER JOIN paketdistribution pd ON + pd.paketannahme = pa.id + INNER JOIN adresse adr ON + adr.id = pa.adresse + INNER JOIN artikel a ON + a.id = pd.artikel + LEFT JOIN seriennummern_paketdistribution spd ON + spd.paketdistribution = pd.id + LEFT JOIN seriennummern s ON + s.id = spd.seriennummer + "; + + $where = "(a.seriennummern <> 'keine')"; + + // Toggle filters + $app->Tpl->Add('JQUERYREADY', "$('#geschlossenewareneingaenge').click( function() { fnFilterColumn1( 0 ); } );"); + + for ($r = 1;$r <= 1;$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 + ); + } + '); + } + + $more_data1 = $app->Secure->GetGET("more_data1"); + if ($more_data1 == 1) { + } else { + $where .= " AND (pa.status <> 'abgeschlossen')"; + } + + + $count = "SELECT COUNT(DISTINCT pd.paketannahme) FROM + paketdistribution pd + INNER JOIN paketannahme pa ON pa.id = pd.paketannahme + INNER JOIN seriennummern_paketdistribution spd + ON spd.paketdistribution = pd.id + INNER JOIN artikel a ON + a.id = pd.artikel + "." WHERE ".$where; + + $groupby = "GROUP BY pa.id"; + break; case "seriennummern_lieferschein_positionen": $allowed['seriennummern_artikel_list'] = array('list'); $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü'); @@ -448,6 +551,7 @@ class Seriennummern { $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?module=seriennummern&action=wareneingaenge_list", "Wareneingänge"); // $this->app->erp->MenuEintrag("index.php", "Zurück"); } @@ -476,7 +580,7 @@ class Seriennummern { function seriennummern_delivery_note_check_and_message($lieferschein_id) { - $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id, group_lieferschein: true); + $check_incoming_goods = $this->seriennummern_check_delivery_notes($lieferschein_id, group_lieferschein: true); if (!empty($check_delivery_notes)) { $lieferschein_minus_links = array(); $lieferschein_plus_links = array(); @@ -496,10 +600,35 @@ class Seriennummern { } } } + + function seriennummern_check_incoming_goods_and_message($wareneingang_id) { + + $check_incoming_goods = $this->seriennummern_check_incoming_goods($wareneingang_id, group_wareneingang: true); + + if (!empty($check_incoming_goods)) { + $wareneingang_minus_links = array(); + $wareneingang_plus_links = array(); + foreach ($check_incoming_goods as $check_delivery_note) { + if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_wareneingang']) { + $wareneingang_minus_links[] = ''.$check_delivery_note['belegnr'].''; + } + else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { + $wareneingang_plus_links[] = ''.$check_delivery_note['belegnr'].''; + } + } + if (!empty($wareneingang_minus_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Wareneingang: '.implode(', ',$wareneingang_minus_links)); + } + if (!empty($wareneingang_plus_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Wareneingang: '.implode(', ',$wareneingang_plus_links)); + } + } + } function seriennummern_nummern_list() { $this->seriennummern_menu(); + $this->seriennummern_menu_checks(); // For transfer to tablesearch $artikel_id = $this->app->Secure->GetGET('artikel'); @@ -539,18 +668,20 @@ class Seriennummern { $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); } - $this->seriennummern_check_and_message($artikel_id); - $this->seriennummern_delivery_note_check_and_message(null); - $this->app->YUI->TableSearch('TAB1', 'seriennummern_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "seriennummern_nummern_list.tpl"); } - function seriennummern_artikel_list() { - $this->seriennummern_menu(); + function seriennummern_menu_checks() { $this->seriennummern_check_and_message(null); $this->seriennummern_delivery_note_check_and_message(null); + $this->seriennummern_check_incoming_goods_and_message(null); + } + + function seriennummern_artikel_list() { + $this->seriennummern_menu(); + $this->seriennummern_menu_checks(); $this->app->YUI->TableSearch('TAB1', 'seriennummern_artikel_list', "show", "", "", basename(__FILE__), __CLASS__); @@ -559,13 +690,22 @@ class Seriennummern { function seriennummern_lieferscheine_list() { $this->seriennummern_menu(); - $this->seriennummern_check_and_message(null); - $this->seriennummern_delivery_note_check_and_message(null); - + $this->seriennummern_menu_checks(); + $this->app->YUI->TableSearch('TAB1', 'seriennummern_lieferscheine_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "seriennummern_lieferscheine_list.tpl"); } + + function seriennummern_wareneingaenge_list() { + $this->seriennummern_menu(); + $this->seriennummern_menu_checks(); + + $this->app->YUI->TableSearch('TAB1', 'seriennummern_wareneingaenge_list', "show", "", "", basename(__FILE__), __CLASS__); + + $this->app->Tpl->Parse('PAGE', "seriennummern_wareneingaenge_list.tpl"); + } + public function seriennummern_delete() { $id = (int) $this->app->Secure->GetGET('id'); @@ -951,6 +1091,71 @@ class Seriennummern { return(empty($result)?array():$result); } + /* + * Check if all incoming goods notes have serials + * Return array of incoming goods note positions and head information + */ + public function seriennummern_check_incoming_goods($wareneingang_id = null, $ignore_date = false, $only_missing = true, $group_wareneingang = false) : array { + + if ($group_wareneingang) { + $sql_we = "''"; + $sql_we_group = ""; + } else { + $sql_we = "pa.id"; + $sql_we_group = ", pa.id"; + } + + $sql = " + SELECT SQL_CALC_FOUND_ROWS + pa.id wareneingang, + pa.id belegnr, + $sql_we wareneingang_position, + a.id artikel, + a.nummer artikel_nummer, + a.name_de, + ".$this->app->erp->FormatMenge('SUM(menge)')." menge_wareneingang, + SUM(COALESCE(menge_nummern,0)) menge_nummern + FROM + paketdistribution pd + INNER JOIN paketannahme pa ON + pa.id = pd.paketannahme + INNER JOIN artikel a ON + a.id = pd.artikel + LEFT JOIN ( + SELECT + paketdistribution, + COUNT(*) menge_nummern + FROM + seriennummern_paketdistribution spd + GROUP BY + spd.paketdistribution + ) spd ON spd.paketdistribution = pd.id + WHERE + (a.seriennummern <> 'keine') + AND ( + pa.datum >=( + SELECT + COALESCE(DATE(MIN(datum)),CURRENT_DATE()) + FROM + seriennummern + WHERE + artikel = a.id + ) OR ('".$ignore_date."' <> '') + ) + AND (pa.id = '".$wareneingang_id."' OR '".$wareneingang_id."' = '') + GROUP BY + pa.id + $sql_we_group + "; + + if ($only_missing) { + $sql .= " HAVING menge_wareneingang <> menge_nummern"; + } + + $result = $this->app->DB->SelectArr($sql); + return(empty($result)?array():$result); + } + /* * Check if all delivery notes have serials * Return array of delivery note positions and head information @@ -995,7 +1200,7 @@ class Seriennummern { AND ( l.datum >=( SELECT - DATE(MIN(datum)) + COALESCE(DATE(MIN(datum)),CURRENT_DATE()) FROM seriennummern WHERE @@ -1069,7 +1274,7 @@ class Seriennummern { if ($check_seriennummern[0]['menge_nummern'] < $check_seriennummern[0]['menge_auf_lager']) { $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 or message From 046bfee9f90c30328b74e4bc95291c9cc7162c47 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 18 Sep 2024 20:12:54 +0200 Subject: [PATCH 19/25] seriennummern rework checks --- www/lib/class.erpapi.php | 28 ++++- www/pages/auftrag.php | 2 + www/pages/lieferschein.php | 2 +- www/pages/seriennummern.php | 228 +++++++++++++++++++----------------- www/pages/versandpakete.php | 5 + www/pages/wareneingang.php | 24 +++- 6 files changed, 173 insertions(+), 116 deletions(-) diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 48380c9a..b07a9d64 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2821,20 +2821,36 @@ public function NavigationHooks(&$menu) } } - function SeriennummernCheckWarnung(int $artikel_id) { + function SeriennummernCheckBenachrichtigung(int $artikel_id) { $obj = $this->LoadModul('seriennummern'); - $obj->seriennummern_check_and_message_stock_added($artikel_id); + return($obj->seriennummern_check_and_notification_stock_added($artikel_id)); } - - function SeriennummernCheckLieferscheinWarnung(int $lieferschein_id, bool $notification) { + + function SeriennummernCheckLieferscheinBenachrichtigung(int $lieferschein_id) { $obj = $this->LoadModul('seriennummern'); - return($obj->seriennummern_check_and_message_delivery_note($lieferschein_id, $notification)); + return($obj->seriennummern_check_and_notification_delivery_note($lieferschein_id)); + } + + function SeriennummernCheckLieferscheinWarnung(int $lieferschein_id) { + $obj = $this->LoadModul('seriennummern'); + return($obj->seriennummern_check_and_message_delivery_notes($lieferschein_id)); } function SeriennummernCheckLieferschein($lieferschein_id = null, $ignore_date = false, $only_missing = true, $group_lieferschein = false) { $obj = $this->LoadModul('seriennummern'); return ($obj->seriennummern_check_delivery_notes($lieferschein_id, $ignore_date, $only_missing, $group_lieferschein)); } + + function SeriennummernCheckWareneingangWarnung(int $wareneingang_id) { + $obj = $this->LoadModul('seriennummern'); + return($obj->seriennummern_check_and_message_incoming_goods($wareneingang_id)); + } + + function SeriennummernCheckWareneingang($wareneingang_id = null, $ignore_date = false, $only_missing = true, $group_wareneingang = false) { + $obj = $this->LoadModul('seriennummern'); + return ($obj->seriennummern_check_incoming_goods($wareneingang_id, $ignore_date, $only_missing, $group_wareneingang)); + } + // @refactor in Lager Modul function ArtikelAnzahlLagerPlatzMitSperre($artikel,$lager_platz) @@ -20479,7 +20495,7 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert, $this->RunHook('LagerEinlagern_after',7, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid); - $this->SeriennummernCheckWarnung($artikel); + $this->SeriennummernCheckBenachrichtigung($artikel); } function CreateLagerPlatzInhaltVPE($artikel, $menge, $gewicht, $laenge, $breite, $hoehe, $menge2 = 0, $gewicht2 = 0, $laenge2 = 0, $breite2 = 0, $hoehe2 = 0) diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 1436153c..f7f09ac9 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -5794,6 +5794,8 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. $nurRestmenge ); + $this->app->erp->SeriennummernCheckLieferscheinBenachrichtigung($lieferschein); + $sql = "SELECT id FROM kommissionierung k WHERE k.auftrag = '".$id."'"; $vorkommissionierung = $this->app->DB->Select($sql); diff --git a/www/pages/lieferschein.php b/www/pages/lieferschein.php index b2a5d241..3d3b40a6 100644 --- a/www/pages/lieferschein.php +++ b/www/pages/lieferschein.php @@ -1869,7 +1869,7 @@ class Lieferschein extends GenLieferschein $seriennummern_aktiv = !empty($seriennummern); - $seriennummern_check_result = $this->app->erp->SeriennummernCheckLieferscheinWarnung($id, false); + $seriennummern_check_result = $this->app->erp->SeriennummernCheckLieferscheinWarnung($id); $seriennummern_ok = empty($seriennummern_check_result); diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index c2b88781..19501fd1 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -554,77 +554,7 @@ class Seriennummern { $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=wareneingaenge_list", "Wareneingänge"); // $this->app->erp->MenuEintrag("index.php", "Zurück"); } - - function seriennummern_check_and_message($artikel_id) { - $check_seriennummern = $this->seriennummern_check_serials($artikel_id); - - if (!empty($check_seriennummern)) { - $artikel_minus_id_links = array(); - $artikel_plus_id_links = array(); - foreach ($check_seriennummern as $artikel_id) { - if ($artikel_id['menge_nummern'] < $artikel_id['menge_auf_lager']) { - $artikel_minus_id_links[] = ''.$artikel_id['nummer'].''; - } - else if ($artikel_id['menge_nummern'] > $artikel_id['menge_auf_lager']) { - $artikel_plus_id_links[] = ''.$artikel_id['nummer'].''; - } - } - if (!empty($artikel_minus_id_links)) { - $this->app->YUI->Message('warning','Seriennummern fehlen für Artikel: '.implode(', ',$artikel_minus_id_links)); - } - if (!empty($artikel_plus_id_links)) { - $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Artikel: '.implode(', ',$artikel_plus_id_links)); - } - } - } - - function seriennummern_delivery_note_check_and_message($lieferschein_id) { - - $check_incoming_goods = $this->seriennummern_check_delivery_notes($lieferschein_id, group_lieferschein: true); - if (!empty($check_delivery_notes)) { - $lieferschein_minus_links = array(); - $lieferschein_plus_links = array(); - foreach ($check_delivery_notes as $check_delivery_note) { - if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_lieferschein']) { - $lieferschein_minus_links[] = ''.$check_delivery_note['belegnr'].''; - } - else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { - $lieferschein_plus_links[] = ''.$check_delivery_note['belegnr'].''; - } - } - if (!empty($lieferschein_minus_links)) { - $this->app->YUI->Message('warning','Seriennummern fehlen für Lieferschein: '.implode(', ',$lieferschein_minus_links)); - } - if (!empty($lieferschein_plus_links)) { - $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_links)); - } - } - } - - function seriennummern_check_incoming_goods_and_message($wareneingang_id) { - - $check_incoming_goods = $this->seriennummern_check_incoming_goods($wareneingang_id, group_wareneingang: true); - - if (!empty($check_incoming_goods)) { - $wareneingang_minus_links = array(); - $wareneingang_plus_links = array(); - foreach ($check_incoming_goods as $check_delivery_note) { - if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_wareneingang']) { - $wareneingang_minus_links[] = ''.$check_delivery_note['belegnr'].''; - } - else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { - $wareneingang_plus_links[] = ''.$check_delivery_note['belegnr'].''; - } - } - if (!empty($wareneingang_minus_links)) { - $this->app->YUI->Message('warning','Seriennummern fehlen für Wareneingang: '.implode(', ',$wareneingang_minus_links)); - } - if (!empty($wareneingang_plus_links)) { - $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Wareneingang: '.implode(', ',$wareneingang_plus_links)); - } - } - } - + function seriennummern_nummern_list() { $this->seriennummern_menu(); @@ -675,8 +605,8 @@ class Seriennummern { function seriennummern_menu_checks() { $this->seriennummern_check_and_message(null); - $this->seriennummern_delivery_note_check_and_message(null); - $this->seriennummern_check_incoming_goods_and_message(null); + $this->seriennummern_check_and_message_delivery_notes(null); + $this->seriennummern_check_and_message_incoming_goods(null); } function seriennummern_artikel_list() { @@ -1044,6 +974,9 @@ class Seriennummern { } + /* -------------------------------------------- + CHECKS + -------------------------------------------- */ /* * Check if all serial numbers are given * Return array of article ids @@ -1095,7 +1028,7 @@ class Seriennummern { * Check if all incoming goods notes have serials * Return array of incoming goods note positions and head information */ - public function seriennummern_check_incoming_goods($wareneingang_id = null, $ignore_date = false, $only_missing = true, $group_wareneingang = false) : array { + public function seriennummern_check_incoming_goods($wareneingang_id = null, $only_missing = true, $group_wareneingang = false) : array { if ($group_wareneingang) { $sql_we = "''"; @@ -1132,16 +1065,7 @@ class Seriennummern { ) spd ON spd.paketdistribution = pd.id WHERE (a.seriennummern <> 'keine') - AND ( - pa.datum >=( - SELECT - COALESCE(DATE(MIN(datum)),CURRENT_DATE()) - FROM - seriennummern - WHERE - artikel = a.id - ) OR ('".$ignore_date."' <> '') - ) + AND pa.status <> 'abgeschlossen' AND (pa.id = '".$wareneingang_id."' OR '".$wareneingang_id."' = '') GROUP BY pa.id @@ -1222,6 +1146,9 @@ class Seriennummern { return(empty($result)?array():$result); } + /* -------------------------------------------- + NOTIFICATIONS + -------------------------------------------- */ protected function seriennummern_create_notification_artikel($artikel_id, $action, $title = 'Seriennummern', $message = 'Meldung', $button = 'Ok') { // Notification erstellen @@ -1265,32 +1192,131 @@ class Seriennummern { $notification = $this->app->Container->get('NotificationService'); $notification->createFromData($this->app->User->GetID(), $notification_message); } - + + /* -------------------------------------------- + CHECKS AND NOTIFICATIONS + -------------------------------------------- */ /* * Check if new numbers need to be entered, if yes, create notification */ - public function seriennummern_check_and_message_stock_added(int $artikel_id) { + public function seriennummern_check_and_notification_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($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 or message */ - public function seriennummern_check_and_message_delivery_note(int $lieferschein_id, bool $notification) { + public function seriennummern_check_and_notification_delivery_note(int $lieferschein_id) { $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id); if (!empty($check_delivery_notes)) { - if ($notificiation) { - $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); - } else { - $this->app->Tpl->Add('MESSAGE',"
    Seriennummern unvollständig!
    "); - } + $this->seriennummern_create_notification_lieferschein($lieferschein_id, 'enter', 'Seriennummern','Bitte Seriennummern für Lieferschein erfassen','Zur Eingabe'); } return($check_delivery_notes); } + /* -------------------------------------------- + CHECKS AND MESSAGES MODULE HEADER + -------------------------------------------- */ + function seriennummern_check_and_message($artikel_id) { + $check_seriennummern = $this->seriennummern_check_serials($artikel_id); + + if (!empty($check_seriennummern)) { + $artikel_minus_id_links = array(); + $artikel_plus_id_links = array(); + foreach ($check_seriennummern as $artikel_id) { + if ($artikel_id['menge_nummern'] < $artikel_id['menge_auf_lager']) { + $artikel_minus_id_links[] = ''.$artikel_id['nummer'].''; + } + else if ($artikel_id['menge_nummern'] > $artikel_id['menge_auf_lager']) { + $artikel_plus_id_links[] = ''.$artikel_id['nummer'].''; + } + } + if (!empty($artikel_minus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Artikel: '.implode(', ',$artikel_minus_id_links)); + } + if (!empty($artikel_plus_id_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Artikel: '.implode(', ',$artikel_plus_id_links)); + } + } + } + + function seriennummern_check_and_message_incoming_goods($wareneingang_id) { + + $check_incoming_goods = $this->seriennummern_check_incoming_goods($wareneingang_id, group_wareneingang: true); + + if (!empty($check_incoming_goods)) { + if (empty($wareneingang_id)) { + $wareneingang_minus_links = array(); + $wareneingang_plus_links = array(); + foreach ($check_incoming_goods as $check_delivery_note) { + if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_wareneingang']) { + $wareneingang_minus_links[] = ''.$check_delivery_note['belegnr'].''; + } + else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { + $wareneingang_plus_links[] = ''.$check_delivery_note['belegnr'].''; + } + } + if (!empty($wareneingang_minus_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Wareneingang: '.implode(', ',$wareneingang_minus_links)); + } + if (!empty($wareneingang_plus_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Wareneingang: '.implode(', ',$wareneingang_plus_links)); + } + } + else { + $this->app->Tpl->Add('MESSAGE',"
    Seriennummern unvollständig!
    "); + } + } + return($check_incoming_goods); + } + + function seriennummern_check_and_message_delivery_notes($lieferschein_id) { + $check_delivery_notes = $this->seriennummern_check_delivery_notes($lieferschein_id, group_lieferschein: true); + if (!empty($check_delivery_notes)) { + if (empty($lieferschein_id)) { + $lieferschein_minus_links = array(); + $lieferschein_plus_links = array(); + foreach ($check_delivery_notes as $check_delivery_note) { + if ($check_delivery_note['anzahl_nummern'] < $check_delivery_note['menge_lieferschein']) { + $lieferschein_minus_links[] = ''.$check_delivery_note['belegnr'].''; + } + else if ($check_delivery_note['anzahl_nummern'] > $check_delivery_note['menge']) { + $lieferschein_plus_links[] = ''.$check_delivery_note['belegnr'].''; + } + } + if (!empty($lieferschein_minus_links)) { + $this->app->YUI->Message('warning','Seriennummern fehlen für Lieferschein: '.implode(', ',$lieferschein_minus_links)); + } + if (!empty($lieferschein_plus_links)) { + $this->app->YUI->Message('warning','Seriennummern Ãœberschuss für Lieferschein: '.implode(', ',$lieferschein_plus_links)); + } + } else { + $this->app->Tpl->Add('MESSAGE',"
    Seriennummern unvollständig!
    "); + } + } + return($check_delivery_notes); + } + + /* + MINIDETAILS + */ + public function seriennummern_minidetail($parsetarget='',$menu=true) { + $id = $this->app->Secure->GetGET('id'); + + if($parsetarget=='') + { + $tmp = new EasyTable($this->app); + $tmp->Query("SELECT l.belegnr AS Lieferschein, ".$this->app->erp->FormatDate('l.datum')." AS Datum, a.name AS Adresse FROM lieferschein l INNER JOIN adresse a ON a.id = l.adresse INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein INNER JOIN seriennummern_lieferschein_position slp ON slp.lieferschein_position = lp.id WHERE slp.seriennummer ='$id' ",0,""); + $tmp->DisplayNew('TAB1',"Adresse","noAction"); + + $this->app->Tpl->Output('emptytab.tpl'); + $this->app->ExitXentral(); + } + } + public function seriennummern_lieferscheinpos_minidetail($parsetarget='',$menu=true) { $id = $this->app->Secure->GetGET('id'); @@ -1304,18 +1330,6 @@ class Seriennummern { $this->app->ExitXentral(); } } + - public function seriennummern_minidetail($parsetarget='',$menu=true) { - $id = $this->app->Secure->GetGET('id'); - - if($parsetarget=='') - { - $tmp = new EasyTable($this->app); - $tmp->Query("SELECT l.belegnr AS Lieferschein, ".$this->app->erp->FormatDate('l.datum')." AS Datum, a.name AS Adresse FROM lieferschein l INNER JOIN adresse a ON a.id = l.adresse INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein INNER JOIN seriennummern_lieferschein_position slp ON slp.lieferschein_position = lp.id WHERE slp.seriennummer ='$id' ",0,""); - $tmp->DisplayNew('TAB1',"Adresse","noAction"); - - $this->app->Tpl->Output('emptytab.tpl'); - $this->app->ExitXentral(); - } - } } diff --git a/www/pages/versandpakete.php b/www/pages/versandpakete.php index e29bf326..58975674 100644 --- a/www/pages/versandpakete.php +++ b/www/pages/versandpakete.php @@ -814,6 +814,7 @@ class Versandpakete { $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=edit&id=".$id, "Details"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', 'Artikel hinzufügen'); if (empty($id)) { + $lieferschein = $this->app->Secure->GetGET('lieferschein'); if (empty($lieferschein)) { $msg = $this->app->erp->base64_url_encode("
    Kein Lieferschein angegeben.
    "); @@ -874,8 +875,12 @@ class Versandpakete { } $lieferschein_belegnr = $this->app->erp->ReplaceLieferschein(false, $lieferschein, false); // Parameters: Target db?, value, from form? $input['lieferschein'] = $lieferschein; + } else { + } } + + $this->app->erp->SeriennummernCheckLieferscheinWarnung(lieferschein_id: $lieferschein); // Check if other users are editing this id if($this->app->erp->DisableModul('versandpakete',$id)) diff --git a/www/pages/wareneingang.php b/www/pages/wareneingang.php index 17153829..71288b5b 100644 --- a/www/pages/wareneingang.php +++ b/www/pages/wareneingang.php @@ -2014,14 +2014,29 @@ class Wareneingang { $id = $this->app->Secure->GetGET('id'); $this->app->erp->MenuEintrag('index.php?module=wareneingang&action=distriinhalt&id='.$id, 'Details'); + + $this->app->Tpl->Add('KURZUEBERSCHRIFT', ' Paketannahme / Leistungserfassung'); $cmd = $this->app->Secure->GetGET('cmd'); $lsnr = $this->app->Secure->GetPOST('lsnr'); $renr = $this->app->Secure->GetPOST('renr'); - $bemerkung = $this->app->Secure->GetPOST('bemerkung'); - + $bemerkung = $this->app->Secure->GetPOST('bemerkung'); $bemerkung = str_replace(array('\r\n', '\r', '\n'), "\n", $bemerkung); + $seriennummern = $this->app->erp->SeriennummernCheckWareneingang( + wareneingang_id: $id, + ignore_date: true, + only_missing: false, + group_wareneingang: true); + + $seriennummern_aktiv = !empty($seriennummern); + + if ($seriennummern_aktiv) { + $this->app->erp->MenuEintrag('index.php?module=seriennummern&action=enter&wareneingang='.$id, 'Seriennummern'); + $seriennummern_check_result = $this->app->erp->SeriennummernCheckWareneingangWarnung($id, false); + $seriennummern_ok = empty($seriennummern_check_result); + } + $this->app->User->SetParameter('table_wareneingang_lieferant_ausfuellen', ''); // Load from DB @@ -2633,6 +2648,11 @@ class Wareneingang { $this->app->YUI->Message('info','Wareneingang noch nicht abgeschlossen'); } } + + if ($seriennummern_aktiv && !$seriennummern_ok) { + $this->app->Tpl->Set('ABSCHLIESSENHIDDEN','hidden'); + } + $this->app->Tpl->Parse('PAGE', 'wareneingang_paketinhalt.tpl'); } From 1a01c2de205c4fd2e2b5f0f7084d556d1c100c35 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 19 Sep 2024 21:21:43 +0200 Subject: [PATCH 20/25] seriennummern enter wareneingang --- www/pages/artikel.php | 3 + www/pages/content/seriennummern_enter.tpl | 36 +- www/pages/mahnwesen.php | 2 + www/pages/seriennummern.php | 390 ++++++++++++++++++---- 4 files changed, 363 insertions(+), 68 deletions(-) diff --git a/www/pages/artikel.php b/www/pages/artikel.php index 1d201002..21baba30 100644 --- a/www/pages/artikel.php +++ b/www/pages/artikel.php @@ -7204,6 +7204,9 @@ class Artikel extends GenArtikel { $this->app->erp->MenuEintrag("index.php?module=artikel&action=lager&id=$id",'Lager'); } + if ($tmp[0]['seriennummern'] <> 'keine') { + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=nummern_list&artikel=$id&from=artikel",'Seriennummern'); + } if($tmp[0]['mindesthaltbarkeitsdatum']=='1' && $tmp[0]['chargenverwaltung']<=0) { diff --git a/www/pages/content/seriennummern_enter.tpl b/www/pages/content/seriennummern_enter.tpl index 6d42b9bd..a5ab8ceb 100644 --- a/www/pages/content/seriennummern_enter.tpl +++ b/www/pages/content/seriennummern_enter.tpl @@ -17,8 +17,7 @@
    - {|Lieferscheinpositionen|} - {|Seriennummern|} + {|[LEGEND]|} [POSITIONEN]
    @@ -26,7 +25,7 @@
    - {|Seriennummern erfassen [LEGEND]|} + {|Seriennummern erfassen|} - + - + @@ -76,6 +75,14 @@ + + + + + @@ -173,7 +183,7 @@ - + + + + + + +
    @@ -44,15 +43,15 @@
    - {|Menge auf Lieferschein|}: + {|Menge auf Beleg|}: - +
    {|Seriennummern zugeordnet|}:
    + {|Seriennummer scannen|}: + + +
    {|Seriennummer wählen|}: @@ -95,6 +102,9 @@ {|Letzte Seriennummer|}: + {|Letzte Seriennummer|}: + {|Nächste Seriennummer|}: {|Ausgelieferte erlauben|}
    @@ -184,6 +194,16 @@
    + {|Ausgelieferte erlauben|} +
    + +
    diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index b93ca08a..29d2f349 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -230,6 +230,8 @@ class Mahnwesen { "; $offene_rechnungen = $this->app->DB->SelectArr($sql); + echo($sql); + foreach ($offene_rechnungen as $offene_rechnung) { if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) { $sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id']; diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 19501fd1..13791969 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -24,6 +24,7 @@ class Seriennummern { $this->app->ActionHandler("delete", "seriennummern_delete"); $this->app->ActionHandler("remove", "seriennummern_remove"); $this->app->ActionHandler("minidetail_lieferscheinposition", "seriennummern_lieferscheinpos_minidetail"); + $this->app->ActionHandler("minidetail_wareneingangposition", "seriennummern_wareneingang_minidetail"); $this->app->ActionHandler("minidetail", "seriennummern_minidetail"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); @@ -461,7 +462,7 @@ class Seriennummern { $groupby = "GROUP BY pa.id"; break; case "seriennummern_lieferschein_positionen": - $allowed['seriennummern_artikel_list'] = array('list'); + $allowed['seriennummern_lieferschein_positionen'] = array('list'); $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü'); $width = array('1%','1%','10%','10%','20%'); // Fill out manually later @@ -499,7 +500,7 @@ class Seriennummern { lp.id, $dropnbox, lp.sort, - a.nummer, + CONCAT('',a.nummer,'') as nummer, a.name_de, ".$app->erp->FormatMengeFuerFormular("menge").", SUM(if(slp.id IS NULL,0,1)), @@ -535,6 +536,81 @@ class Seriennummern { // echo($sql." WHERE ".$where." ".$groupby); break; + case 'seriennummern_wareneingang_positionen': + + $allowed['seriennummern_wareneingang_positionen'] = array('list'); + $heading = array('','','Position', 'Artikel-Nr.', 'Artikel', 'Menge', 'Nummern zugeordnet', 'Nummern fehlen', 'Menü'); + $width = array('1%','1%','10%','10%','20%'); // Fill out manually later + + $wareneingang_id = $app->User->GetParameter('seriennummern_wareneingang_id'); + + // columns that are aligned right (numbers etc) + $alignright = array(6,7,8,9); + + $findcols = array('pd.id','pd.id','pd.id','a.nummer', 'a.name_de', 'null', 'null', 'null', 'null', 'null', 'null'); + $searchsql = array('w.id'); + + $moreinfo = true; // Allow drop down details + $moreinfoaction = "_wareneingangposition"; // specify suffix for minidetail-URL to allow different minidetails + $menucol = 1; // Set id col for moredata/menu + + $defaultorder = 1; + $defaultorderdesc = 0; + $aligncenter = array(); + $numbercols = array(); + $sumcol = array(); + + $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; + + $menu = "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; + + $wareneingang_link = array( + '', + ['sql' => 'w.id'], + '', + ); + + $sql = "SELECT SQL_CALC_FOUND_ROWS + pd.id, + $dropnbox, + pd.id, + CONCAT('',a.nummer,'') as nummer, + a.name_de, + ".$app->erp->FormatMengeFuerFormular("menge").", + SUM(if(spd.id IS NULL,0,1)), + ".$app->erp->FormatMengeFuerFormular("menge-SUM(if(spd.id IS NULL,0,1))").", + pd.id + FROM + paketdistribution pd + LEFT JOIN seriennummern_paketdistribution spd + ON spd.paketdistribution = pd.id + INNER JOIN paketannahme pa ON + pa.id = pd.paketannahme + INNER JOIN artikel a ON + a.id = pd.artikel + INNER JOIN adresse adr ON + adr.id = pa.adresse + "; + + $where = "(a.seriennummern <> 'keine') AND (pa.id = '".$wareneingang_id."')"; + $count = "SELECT COUNT(DISTINCT pd.id) FROM + paketdistribution pd + LEFT JOIN seriennummern_paketdistribution spd + ON spd.paketdistribution = pd.id + INNER JOIN paketannahme pa ON + pa.id = pd.paketannahme + INNER JOIN artikel a ON + a.id = pd.artikel + "." WHERE ".$where; + + $groupby = "GROUP BY pd.id"; + + $orderby = "ORDER BY pd.id ASC"; + +// echo($sql." WHERE ".$where." ".$groupby); + break; } $erg = false; @@ -548,6 +624,16 @@ class Seriennummern { } function seriennummern_menu() { + + $from = $this->app->Secure->GetGET('from'); + $artikel = $this->app->Secure->GetGET('artikel'); + + switch ($from) { + case 'artikel': + $this->app->erp->MenuEintrag("index.php?module=artikel&action=edit&id=".$artikel, "Zurück"); + break; + } + $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"); @@ -559,7 +645,7 @@ class Seriennummern { $this->seriennummern_menu(); $this->seriennummern_menu_checks(); - + // For transfer to tablesearch $artikel_id = $this->app->Secure->GetGET('artikel'); $this->app->User->SetParameter('seriennummern_artikel_id', $artikel_id); @@ -641,11 +727,14 @@ class Seriennummern { $id = (int) $this->app->Secure->GetGET('id'); if ($id) { - if (!$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'")) { + if ( + !$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'") && + !$this->app->DB->Select("SELECT id FROM `seriennummern_paketdistribution` WHERE `seriennummer` = '{$id}'") + ) { $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}'"); $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); } else { - $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden da eine Lieferscheinzuordnung existiert!'); + $this->app->Tpl->addMessage('error', 'Der Eintrag kann nicht gelöscht werden da eine Zuordnung existiert!'); } $this->seriennummern_nummern_list(); } @@ -656,28 +745,53 @@ class Seriennummern { $id = (int) $this->app->Secure->GetGET('id'); $from = $this->app->Secure->GetGET('from'); - if ($id) { - $sql = "SELECT l.id, l.schreibschutz FROM lieferschein l INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein WHERE lp.id = '".$id."' LIMIT 1"; - $lieferschein = $this->app->DB->SelectRow($sql); - if ($lieferschein['schreibschutz']) { - $msg = $this->app->erp->base64_url_encode("
    Der Lieferschein ist schreibgeschützt.
    "); - } else { - $sql = "SELECT seriennummer FROM seriennummern_lieferschein_position WHERE `lieferschein_position` = '{$id}'"; - $seriennummer_ids = $this->app->DB->SelectArr($sql); - if (!$this->app->DB->Delete("DELETE FROM `seriennummern_lieferschein_position` WHERE `lieferschein_position` = '{$id}'")) { - $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); - } else { - $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); - if (!empty($seriennummer_ids)) { - $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id IN (".implode(', ',array_column($seriennummer_ids, 'seriennummer')).")"; - $this->app->DB->Update($sql); - } - } - } - $this->app->Location->execute("index.php?module=seriennummern&action=enter&lieferschein=".$lieferschein['id']."&msg=$msg&from=$from"); - } - } + if (empty($id)) { + return; + } + switch ($from) { + case 'lieferschein': + $sql = "SELECT l.id, l.schreibschutz FROM lieferschein l INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein WHERE lp.id = '".$id."' LIMIT 1"; + $lieferschein = $this->app->DB->SelectRow($sql); + if ($lieferschein['schreibschutz']) { + $msg = $this->app->erp->base64_url_encode("
    Der Lieferschein ist schreibgeschützt.
    "); + } else { + $sql = "SELECT seriennummer FROM seriennummern_lieferschein_position WHERE `lieferschein_position` = '{$id}'"; + $seriennummer_ids = $this->app->DB->SelectArr($sql); + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_lieferschein_position` WHERE `lieferschein_position` = '{$id}'")) { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); + } else { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); + if (!empty($seriennummer_ids)) { + $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id IN (".implode(', ',array_column($seriennummer_ids, 'seriennummer')).")"; + $this->app->DB->Update($sql); + } + } + } + $this->app->Location->execute("index.php?module=seriennummern&action=enter&lieferschein=".$lieferschein['id']."&msg=$msg&from=$from"); + break; + case 'wareneingang': + $sql = "SELECT pa.id, pa.status FROM paketannahme pa INNER JOIN paketdistribution pd ON pa.id = pd.paketannahme WHERE pd.id = '".$id."' LIMIT 1"; + $wareneingang = $this->app->DB->SelectRow($sql); + if ($wareneingang['status'] == 'abgeschlossen') { + $msg = $this->app->erp->base64_url_encode("
    Der Wareneingang ist abgeschlossen.
    "); + } else { + $sql = "SELECT seriennummer FROM seriennummern_paketdistribution WHERE `paketdistribution` = '{$id}'"; + $seriennummer_ids = $this->app->DB->SelectArr($sql); + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_paketdistribution` WHERE `paketdistribution` = '{$id}'")) { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); + } else { + $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); + if (!empty($seriennummer_ids)) { + $sql = "UPDATE seriennummern SET eingelagert = 0, logdatei = CURRENT_TIMESTAMP WHERE id IN (".implode(', ',array_column($seriennummer_ids, 'seriennummer')).")"; + $this->app->DB->Update($sql); + } + } + } + $this->app->Location->execute("index.php?module=seriennummern&action=enter&wareneingang=".$wareneingang['id']."&msg=$msg&from=$from"); + break; + } + } function seriennummern_enter() { @@ -692,17 +806,26 @@ class Seriennummern { $artikel = $this->app->DB->SelectRow("SELECT name_de, nummer FROM artikel WHERE id ='".$artikel_id."'"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); - $this->app->Tpl->SetText('LEGEND',$artikel['name_de']." (Artikel ".$artikel['nummer'].")"); + $this->app->Tpl->SetText('LEGEND',''.$artikel['name_de'].' (Artikel '.$artikel['nummer'].')', html: true); $task = "artikel"; } + $wareneingang_id = (int) $this->app->Secure->GetGET('wareneingang'); + if (!empty($wareneingang_id)) { + $this->app->User->SetParameter('seriennummern_wareneingang_id', $wareneingang_id); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2','Wareneingang '.$wareneingang_id); + $this->app->Tpl->SetText('LEGEND','Wareneingang '.$wareneingang_id.'', html: true); + $task = "wareneingang"; + } + $lieferschein_id = (int) $this->app->Secure->GetGET('lieferschein'); if (!empty($lieferschein_id)) { $this->app->User->SetParameter('seriennummern_lieferschein_id', $lieferschein_id); $lieferschein = $this->app->DB->SelectRow("SELECT belegnr FROM lieferschein WHERE id ='".$lieferschein_id."'"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT1','Erfassen'); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2','Lieferschein '.$lieferschein['belegnr']); - $this->app->Tpl->SetText('LEGEND','Lieferschein '.$lieferschein['belegnr'].'', html: true); + $this->app->Tpl->SetText('LEGEND','Lieferschein '.$lieferschein['belegnr'].'', html: true); $task = "lieferschein"; } @@ -783,11 +906,9 @@ class Seriennummern { $seriennummern = array_merge($seriennummern_not_written, $seriennummern_already_exist, $seriennummern_old_not_allowed); break; case 'lieferscheinzuordnen': - if (empty($lieferschein_id)) { break; } - $auswahl = $this->app->Secure->GetPOST('auswahl'); if (!empty($auswahl)) { if (count($auswahl) > 1) { @@ -797,32 +918,23 @@ class Seriennummern { $lieferschein_position = $auswahl[0]; $sql_auswahl = " AND artikel IN (SELECT artikel FROM lieferschein_position WHERE id = '".$lieferschein_position."'"; } - $seriennummern_not_written = array(); $seriennummern_dont_exist = array(); $seriennummern_ambigious = array(); - - foreach ($seriennummern as $seriennummer) { - - $seriennummer = trim($seriennummer); - + foreach ($seriennummern as $seriennummer) { + $seriennummer = trim($seriennummer); if (empty($seriennummer)) { continue; } - $sql = "SELECT id, artikel FROM seriennummern WHERE eingelagert = 1 AND seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."'".$sql_auswahl; - - $check_existing = $this->app->DB->SelectArr($sql); - + $check_existing = $this->app->DB->SelectArr($sql); if (empty($check_existing)) { $seriennummern_dont_exist[] = $seriennummer; } else if (count($check_existing) > 1) { $seriennummern_ambigious[] = $seriennummer; } else { - $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true); $written = false; - foreach ($check_lieferschein as $position) { $menge_offen = $position['menge_lieferschein']-$position['menge_nummern']; @@ -851,6 +963,82 @@ class Seriennummern { $this->app->Tpl->addMessage('error', 'Seriennummern nicht eindeutig: '.implode(', ',$seriennummern_ambigious)); } $seriennummern = array_merge($seriennummern_not_written, $seriennummern_ambigious, $seriennummern_dont_exist); + break; + case 'wareneingangzuordnen': + if (empty($wareneingang_id)) { + break; + } + $auswahl = $this->app->Secure->GetPOST('auswahl'); + + $auswahl_ok = true; + + if (!empty($auswahl)) { + if (count($auswahl) > 1) { + $auswahl_ok = false; + } + } else { + $auswahl_ok = false; + } + + if (!$auswahl_ok) { + $this->app->Tpl->addMessage('error', 'Bitte genau eine Position anklicken'); + break; + } + + $wareneingang_position = $auswahl[0]; + $artikel_id = $this->app->DB->Select("SELECT artikel FROM paketdistribution pd WHERE pd.id ='".$wareneingang_position."' LIMIT 1"); + + $seriennummern_not_written = array(); + $seriennummern_already_exist = array(); + $seriennummern_old_not_allowed = array(); + foreach ($seriennummern as $seriennummer) { + + $seriennummer = trim($seriennummer); + + if (empty($seriennummer)) { + continue; + } + + $sql = "SELECT id, eingelagert FROM seriennummern WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"; + $check_existing = $this->app->DB->SelectRow($sql); + + if (empty($check_existing)) { // New serial + $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); + $seriennummer_id = $this->app->DB->GetInsertId(); + $sql = "INSERT INTO seriennummern_paketdistribution (seriennummer, paketdistribution) VALUES ('".$seriennummer_id."', '".$wareneingang_position."')"; + $this->app->DB->Insert($sql); + } catch (mysqli_sql_exception $e) { + $error = true; + $seriennummern_not_written[] = $seriennummer; + } + } else { + if ($check_existing['eingelagert']) { // Old serial, already here + $seriennummern_already_exist[] = $seriennummer; + } else { // Old serial, returning + if ($allowold) { + $seriennummer_id = $this->app->DB->Select("SELECT id FROM seriennummern WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"); + $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id = '".$seriennummer_id."'"; + $this->app->DB->Update($sql); + $sql = "INSERT INTO seriennummern_paketdistribution (seriennummer, paketdistribution) VALUES ('".$seriennummer_id."', '".$wareneingang_position."')"; + $this->app->DB->Insert($sql); + } else { + $seriennummern_old_not_allowed[] = $seriennummer; + } + } + } + } + if (!empty($seriennummern_already_exist)) { + $this->app->Tpl->addMessage('error', 'Seriennummern existieren bereits: '.implode(', ',$seriennummern_already_exist)); + } + if (!empty($seriennummern_old_not_allowed)) { + $this->app->Tpl->addMessage('error', 'Seriennummern bereits ausgeliefert: '.implode(', ',$seriennummern_old_not_allowed)); + } + if (!empty($seriennummern_not_written)) { + $this->app->Tpl->addMessage('error', 'Seriennummern konnten nicht gespeichert werden: '.implode(', ',$seriennummern_not_written)); + } + $seriennummern = array_merge($seriennummern_not_written, $seriennummern_already_exist, $seriennummern_old_not_allowed); break; } @@ -861,6 +1049,8 @@ class Seriennummern { switch ($task) { case 'artikel': $this->app->Tpl->Set('LIEFERSCHEIN_HIDDEN', "hidden=\"true\""); + $this->app->Tpl->Set('WARENEINGANG_HIDDEN', "hidden=\"true\""); + $this->app->Tpl->Set('BELEG_HIDDEN', "hidden=\"true\""); $check_seriennummern = $this->seriennummern_check_serials($artikel_id); $check_seriennummern = $check_seriennummern[0]; @@ -908,29 +1098,97 @@ class Seriennummern { } $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); - $this->app->Tpl->Set('LIEFERSCHEINNUMMER', ''.$lieferschein['belegnr'].''); + $this->app->Tpl->Set('WARENEINGANG_HIDDEN', "hidden=\"true\""); $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true); if (empty($check_lieferschein)) { $this->app->Tpl->AddMessage('success', 'Seriennummern vollständig.'); - $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true, only_missing: false); + $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true, only_missing: true); + $this->app->Tpl->Set('EINGABE_HIDDEN', 'hidden'); + } else { + $menge_lieferschein = array_sum(array_column($check_lieferschein,'menge_lieferschein')); + $menge_nummern = array_sum(array_column($check_lieferschein,'menge_nummern')); + $anzahl_fehlt = $menge_lieferschein-$menge_nummern; + + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $this->app->Tpl->Set('ANZBELEG', $menge_lieferschein); + $this->app->Tpl->Set('ANZVORHANDEN', $menge_nummern); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + + $artikel_lieferschein = $this->app->DB->SelectArr("SELECT artikel FROM lieferschein_position WHERE lieferschein = '".$lieferschein_id."'"); + + $sql = " + SELECT + DISTINCT s.seriennummer + FROM + seriennummern s + WHERE + s.artikel = ".$check_lieferschein[0]['artikel']." + AND s.eingelagert = 1 + ORDER BY s.id ASC + LIMIT 1 + "; + + $letzte_seriennummer = (string) $this->app->DB->Select($sql); + + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + $this->app->Tpl->Set('PRAEFIX', $matches[1]); + $this->app->Tpl->Set('START', $matches[2]); + $this->app->Tpl->Set('POSTFIX', $matches[3]); + + $fehlt = $check_lieferschein[0]['menge_lieferschein']-$check_lieferschein[0]['menge_nummern']; + if ($fehlt < 0) { + $fehlt = 0; + } + $this->app->Tpl->Set('ANZAHL', $fehlt); + } + + $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); + + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); + + break; + case 'wareneingang': + + switch ($from) { + case 'wareneingang': + $this->app->erp->MenuEintrag("index.php?module=wareneingang&action=distriinhalt&id=".$wareneingang_id, "Zurück"); + break; + case 'seriennummern': + $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=wareneingaenge_list", "Zurück"); + break; + } + + $this->app->Tpl->Set('LIEFERSCHEIN_HIDDEN', "hidden"); + $this->app->Tpl->Set('ARTIKEL_HIDDEN', "hidden"); + + $check_wareneingang = $this->seriennummern_check_incoming_goods($wareneingang_id); + + if (empty($check_wareneingang)) { + $this->app->Tpl->AddMessage('success', 'Seriennummern vollständig.'); + $check_wareneingang = $this->seriennummern_check_incoming_goods($check_wareneingang, only_missing: true); $this->app->Tpl->Set('EINGABE_HIDDEN', 'hidden'); } - $menge_lieferschein = array_sum(array_column($check_lieferschein,'menge_lieferschein')); - $menge_nummern = array_sum(array_column($check_lieferschein,'menge_nummern')); - $anzahl_fehlt = $menge_lieferschein-$menge_nummern; + $menge_wareneingang = array_sum(array_column($check_wareneingang,'menge_wareneingang')); + $menge_nummern = array_sum(array_column($check_wareneingang,'menge_nummern')); + $anzahl_fehlt = $menge_wareneingang-$menge_nummern; if ($anzahl_fehlt < 0) { $anzahl_fehlt = 0; } - $this->app->Tpl->Set('ANZLIEFERSCHEIN', $menge_lieferschein); + $this->app->Tpl->Set('ANZBELEG', $menge_wareneingang); $this->app->Tpl->Set('ANZVORHANDEN', $menge_nummern); $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); - $artikel_lieferschein = $this->app->DB->SelectArr("SELECT artikel FROM lieferschein_position WHERE lieferschein = '".$lieferschein_id."'"); + $artikel_wareneingang = $this->app->DB->SelectArr("SELECT artikel FROM paketdistribution WHERE paketannahme = '".$wareneingang_id."'"); $sql = " SELECT @@ -938,32 +1196,30 @@ class Seriennummern { FROM seriennummern s WHERE - s.artikel = '".$check_lieferschein[0]['artikel']."' - AND s.eingelagert = 1 - ORDER BY s.id ASC + s.artikel IN (".implode(',',array_column($artikel_wareneingang,'artikel')).") + ORDER BY s.id DESC LIMIT 1 "; - $letzte_seriennummer = (string) $this->app->DB->Select($sql); - + $letzte_seriennummer = (string) $this->app->DB->Select($sql); + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); $this->app->Tpl->Set('PRAEFIX', $matches[1]); - $this->app->Tpl->Set('START', $matches[2]); + $this->app->Tpl->Set('START', $matches[2]+1); $this->app->Tpl->Set('POSTFIX', $matches[3]); - $fehlt = $check_lieferschein[0]['menge_lieferschein']-$check_lieferschein[0]['menge_nummern']; + $fehlt = $check_lieferschein[0]['menge_wareneingang']-$check_wareneingang[0]['menge_nummern']; if ($fehlt < 0) { $fehlt = 0; } - $this->app->Tpl->Set('ANZAHL', $fehlt); + $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); - $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); + $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_wareneingang_positionen', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); - $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); - + $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); break; default: exit(); @@ -1330,6 +1586,20 @@ class Seriennummern { $this->app->ExitXentral(); } } + + public function seriennummern_wareneingang_minidetail($parsetarget='',$menu=true) { + $id = $this->app->Secure->GetGET('id'); + + if($parsetarget=='') + { + $tmp = new EasyTable($this->app); + $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_paketdistribution spd ON spd.seriennummer = s.id WHERE spd.paketdistribution ='$id' ",0,""); + $tmp->DisplayNew('TAB1',"Seriennummern","noAction"); + + $this->app->Tpl->Output('emptytab.tpl'); + $this->app->ExitXentral(); + } + } } From f1776beb363721e4d47bb31b8792f6113777b6db Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 27 Sep 2024 18:23:38 +0200 Subject: [PATCH 21/25] seriennummern migrated to seriennummern_beleg_position --- upgrade/data/db_schema.json | 49 ++---------------- www/pages/ajax.php | 3 -- www/pages/seriennummern.php | 99 ++++++++++++++++++++++--------------- 3 files changed, 65 insertions(+), 86 deletions(-) diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index 635071c2..e42e187e 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -91527,7 +91527,7 @@ ] }, { - "name": "seriennummern_lieferschein_position", + "name": "seriennummern_beleg_position", "collation": "utf8mb3_general_ci", "type": "BASE TABLE", "columns": [ @@ -91554,48 +91554,9 @@ "Comment": "" }, { - "Field": "lieferschein_position", - "Type": "int(11)", - "Collation": null, - "Null": "NO", - "Key": "", - "Default": null, - "Extra": "", - "Privileges": "select,insert,update,references", - "Comment": "" - } - ], - "keys": [ - { - "Key_name": "PRIMARY", - "Index_type": "BTREE", - "columns": [ - "id" - ], - "Non_unique": "" - } - ] - }, - { - "name": "seriennummern_paketdistribution", - "collation": "utf8mb3_general_ci", - "type": "BASE TABLE", - "columns": [ - { - "Field": "id", - "Type": "int(11)", - "Collation": null, - "Null": "NO", - "Key": "PRI", - "Default": null, - "Extra": "auto_increment", - "Privileges": "select,insert,update,references", - "Comment": "" - }, - { - "Field": "seriennummer", - "Type": "int(11)", - "Collation": null, + "Field": "beleg_typ", + "Type": "varchar(30)", + "Collation": "utf8mb3_general_ci", "Null": "NO", "Key": "", "Default": null, @@ -91604,7 +91565,7 @@ "Comment": "" }, { - "Field": "paketdistribution", + "Field": "beleg_position", "Type": "int(11)", "Collation": null, "Null": "NO", diff --git a/www/pages/ajax.php b/www/pages/ajax.php index 87ebf0f2..7b1b7028 100644 --- a/www/pages/ajax.php +++ b/www/pages/ajax.php @@ -2619,11 +2619,8 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku seriennummern s INNER JOIN lieferschein_position lp ON lp.artikel = s.artikel - LEFT JOIN - seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE s.eingelagert = 1 - AND slp.id IS NULL AND s.seriennummer LIKE '%$term%' AND (s.artikel = '$artikel' OR '$artikel' = '0') LIMIT 20 diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index 13791969..aea3fbd0 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -110,13 +110,14 @@ class Seriennummern { l.id lieferschein, l.belegnr FROM - seriennummern_lieferschein_position slp + seriennummern_beleg_position slp INNER JOIN lieferschein_position lp ON - lp.id = slp.lieferschein_position + lp.id = slp.beleg_position INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN adresse a ON a.id = l.adresse + WHERE slp.beleg_typ = 'lieferschein' ORDER BY l.datum DESC @@ -307,8 +308,8 @@ class Seriennummern { l.id FROM lieferschein_position lp - LEFT JOIN seriennummern_lieferschein_position slp - ON slp.lieferschein_position = lp.id + LEFT JOIN seriennummern_beleg_position slp + ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN artikel a ON @@ -349,8 +350,8 @@ class Seriennummern { $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM lieferschein_position lp - LEFT JOIN seriennummern_lieferschein_position slp - ON slp.lieferschein_position = lp.id + LEFT JOIN seriennummern_beleg_position slp + ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN artikel a ON @@ -414,8 +415,8 @@ class Seriennummern { adr.id = pa.adresse INNER JOIN artikel a ON a.id = pd.artikel - LEFT JOIN seriennummern_paketdistribution spd ON - spd.paketdistribution = pd.id + LEFT JOIN seriennummern_beleg_position spd ON + spd.beleg_typ = 'wareneingang' AND spd.beleg_position = pd.id LEFT JOIN seriennummern s ON s.id = spd.seriennummer "; @@ -449,12 +450,11 @@ class Seriennummern { $where .= " AND (pa.status <> 'abgeschlossen')"; } - $count = "SELECT COUNT(DISTINCT pd.paketannahme) FROM paketdistribution pd INNER JOIN paketannahme pa ON pa.id = pd.paketannahme - INNER JOIN seriennummern_paketdistribution spd - ON spd.paketdistribution = pd.id + INNER JOIN seriennummern_beleg_position spd + ON spd.beleg_typ = 'wareneingang' AND spd.beleg_position = pd.id INNER JOIN artikel a ON a.id = pd.artikel "." WHERE ".$where; @@ -508,8 +508,8 @@ class Seriennummern { lp.id FROM lieferschein_position lp - LEFT JOIN seriennummern_lieferschein_position slp - ON slp.lieferschein_position = lp.id + LEFT JOIN seriennummern_beleg_position slp + ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN artikel a ON @@ -521,8 +521,8 @@ class Seriennummern { $where = "(a.seriennummern <> 'keine') AND (l.id = '".$lieferschein_id."')"; $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM lieferschein_position lp - LEFT JOIN seriennummern_lieferschein_position slp - ON slp.lieferschein_position = lp.id + LEFT JOIN seriennummern_beleg_position slp + ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id INNER JOIN lieferschein l ON l.id = lp.lieferschein INNER JOIN artikel a ON @@ -584,8 +584,8 @@ class Seriennummern { pd.id FROM paketdistribution pd - LEFT JOIN seriennummern_paketdistribution spd - ON spd.paketdistribution = pd.id + LEFT JOIN seriennummern_beleg_position spd + ON spd.beleg_typ = 'wareneingang' AND spd.beleg_position = pd.id INNER JOIN paketannahme pa ON pa.id = pd.paketannahme INNER JOIN artikel a ON @@ -597,8 +597,8 @@ class Seriennummern { $where = "(a.seriennummern <> 'keine') AND (pa.id = '".$wareneingang_id."')"; $count = "SELECT COUNT(DISTINCT pd.id) FROM paketdistribution pd - LEFT JOIN seriennummern_paketdistribution spd - ON spd.paketdistribution = pd.id + LEFT JOIN seriennummern_beleg_position spd + ON spd.beleg_typ = 'wareneingang' AND spd.beleg_position = pd.id INNER JOIN paketannahme pa ON pa.id = pd.paketannahme INNER JOIN artikel a ON @@ -728,8 +728,7 @@ class Seriennummern { if ($id) { if ( - !$this->app->DB->Select("SELECT id FROM `seriennummern_lieferschein_position` WHERE `seriennummer` = '{$id}'") && - !$this->app->DB->Select("SELECT id FROM `seriennummern_paketdistribution` WHERE `seriennummer` = '{$id}'") + !$this->app->DB->Select("SELECT id FROM `seriennummern_beleg_position` WHERE `seriennummer` = '{$id}'") ) { $this->app->DB->Delete("DELETE FROM `seriennummern` WHERE `id` = '{$id}'"); $this->app->Tpl->addMessage('error', 'Der Eintrag wurde gelöscht'); @@ -756,9 +755,9 @@ class Seriennummern { if ($lieferschein['schreibschutz']) { $msg = $this->app->erp->base64_url_encode("
    Der Lieferschein ist schreibgeschützt.
    "); } else { - $sql = "SELECT seriennummer FROM seriennummern_lieferschein_position WHERE `lieferschein_position` = '{$id}'"; + $sql = "SELECT seriennummer FROM seriennummern_beleg_position WHERE beleg_typ = 'lieferschein' AND `beleg_position` = '{$id}'"; $seriennummer_ids = $this->app->DB->SelectArr($sql); - if (!$this->app->DB->Delete("DELETE FROM `seriennummern_lieferschein_position` WHERE `lieferschein_position` = '{$id}'")) { + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_beleg_position` WHERE beleg_typ = 'lieferschein' AND `beleg_position` = '{$id}'")) { $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); } else { $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); @@ -776,9 +775,9 @@ class Seriennummern { if ($wareneingang['status'] == 'abgeschlossen') { $msg = $this->app->erp->base64_url_encode("
    Der Wareneingang ist abgeschlossen.
    "); } else { - $sql = "SELECT seriennummer FROM seriennummern_paketdistribution WHERE `paketdistribution` = '{$id}'"; + $sql = "SELECT seriennummer FROM seriennummern_beleg_position WHERE beleg_typ = 'wareneingang' AND `beleg_position` = '{$id}'"; $seriennummer_ids = $this->app->DB->SelectArr($sql); - if (!$this->app->DB->Delete("DELETE FROM `seriennummern_paketdistribution` WHERE `paketdistribution` = '{$id}'")) { + if (!$this->app->DB->Delete("DELETE FROM `seriennummern_beleg_position` WHERE beleg_typ = 'wareneingang' AND `beleg_position` = '{$id}'")) { $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden nicht gelöscht!
    "); } else { $msg = $this->app->erp->base64_url_encode("
    Die Einträge wurden gelöscht.
    "); @@ -943,7 +942,7 @@ class Seriennummern { $lieferschein_position = $position['lieferschein_position']; } if ($lieferschein_position == $position['lieferschein_position']) { - $sql = "INSERT INTO seriennummern_lieferschein_position (lieferschein_position, seriennummer) VALUES ('".$lieferschein_position."','".$check_existing[0]['id']."') "; + $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, beleg_position, seriennummer) VALUES ('lieferschein','".$lieferschein_position."','".$check_existing[0]['id']."') "; $this->app->DB->Insert($sql); $sql = "UPDATE seriennummern SET eingelagert = 0, logdatei = CURRENT_TIMESTAMP WHERE id = '".$check_existing[0]['id']."'"; $this->app->DB->Update($sql); @@ -1007,7 +1006,7 @@ class Seriennummern { try { $this->app->DB->Insert($sql); $seriennummer_id = $this->app->DB->GetInsertId(); - $sql = "INSERT INTO seriennummern_paketdistribution (seriennummer, paketdistribution) VALUES ('".$seriennummer_id."', '".$wareneingang_position."')"; + $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, paketdistribution) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; $this->app->DB->Insert($sql); } catch (mysqli_sql_exception $e) { $error = true; @@ -1021,7 +1020,7 @@ class Seriennummern { $seriennummer_id = $this->app->DB->Select("SELECT id FROM seriennummern WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"); $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id = '".$seriennummer_id."'"; $this->app->DB->Update($sql); - $sql = "INSERT INTO seriennummern_paketdistribution (seriennummer, paketdistribution) VALUES ('".$seriennummer_id."', '".$wareneingang_position."')"; + $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, paketdistribution) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; $this->app->DB->Insert($sql); } else { $seriennummern_old_not_allowed[] = $seriennummer; @@ -1312,13 +1311,15 @@ class Seriennummern { a.id = pd.artikel LEFT JOIN ( SELECT - paketdistribution, + beleg_position, COUNT(*) menge_nummern FROM - seriennummern_paketdistribution spd + seriennummern_beleg_position spd + WHERE + spd.beleg_typ = 'wareneingang' GROUP BY - spd.paketdistribution - ) spd ON spd.paketdistribution = pd.id + spd.beleg_position + ) spd ON spd.beleg_position = pd.id WHERE (a.seriennummern <> 'keine') AND pa.status <> 'abgeschlossen' @@ -1368,13 +1369,14 @@ class Seriennummern { a.id = lp.artikel LEFT JOIN ( SELECT - lieferschein_position, + beleg_position, COUNT(*) menge_nummern FROM - seriennummern_lieferschein_position slp + seriennummern_beleg_position slp + WHERE slp.beleg_typ = 'lieferschein' GROUP BY - slp.lieferschein_position - ) slp ON slp.lieferschein_position = lp.id + slp.beleg_position + ) slp ON slp.beleg_position = lp.id WHERE (a.seriennummern <> 'keine') AND ( @@ -1565,7 +1567,26 @@ class Seriennummern { if($parsetarget=='') { $tmp = new EasyTable($this->app); - $tmp->Query("SELECT l.belegnr AS Lieferschein, ".$this->app->erp->FormatDate('l.datum')." AS Datum, a.name AS Adresse FROM lieferschein l INNER JOIN adresse a ON a.id = l.adresse INNER JOIN lieferschein_position lp ON l.id = lp.lieferschein INNER JOIN seriennummern_lieferschein_position slp ON slp.lieferschein_position = lp.id WHERE slp.seriennummer ='$id' ",0,""); + + $tmp->Query("SELECT + CONCAT( + UCASE(LEFT(sbp.beleg_typ, 1)), + SUBSTRING(sbp.beleg_typ, 2) + ) AS Belegtyp, + COALESCE(l.belegnr,w.id) AS Beleg, + ".$this->app->erp->FormatDate('l.datum')." AS Datum, + COALESCE(al.name,aw.name) AS Adresse + FROM seriennummern_beleg_position sbp + LEFT JOIN lieferschein_position lp ON sbp.beleg_typ = 'lieferschein' AND lp.id = sbp.beleg_position + LEFT JOIN lieferschein l ON l.id = lp.lieferschein + LEFT JOIN adresse al ON al.id = l.adresse + + LEFT JOIN paketdistribution pd ON sbp.beleg_typ = 'wareneingang' AND pd.id = sbp.beleg_position + LEFT JOIN paketannahme w ON w.id = pd.paketannahme + LEFT JOIN adresse aw ON aw.id = w.adresse + + WHERE sbp.seriennummer ='$id' " + ,0,""); $tmp->DisplayNew('TAB1',"Adresse","noAction"); $this->app->Tpl->Output('emptytab.tpl'); @@ -1579,7 +1600,7 @@ class Seriennummern { if($parsetarget=='') { $tmp = new EasyTable($this->app); - $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_lieferschein_position slp ON slp.seriennummer = s.id WHERE slp.lieferschein_position ='$id' ",0,""); + $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_beleg_position slp ON slp.beleg_typ = 'lieferschein' AND slp.seriennummer = s.id WHERE slp.beleg_position ='$id' ",0,""); $tmp->DisplayNew('TAB1',"Seriennummern","noAction"); $this->app->Tpl->Output('emptytab.tpl'); @@ -1593,7 +1614,7 @@ class Seriennummern { if($parsetarget=='') { $tmp = new EasyTable($this->app); - $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_paketdistribution spd ON spd.seriennummer = s.id WHERE spd.paketdistribution ='$id' ",0,""); + $tmp->Query("SELECT s.seriennummer FROM seriennummern s INNER JOIN seriennummern_beleg_position spd ON spd.beleg_typ = 'wareneingang' AND spd.seriennummer = s.id WHERE spd.beleg_position ='$id' ",0,""); $tmp->DisplayNew('TAB1',"Seriennummern","noAction"); $this->app->Tpl->Output('emptytab.tpl'); From e01ef58cd14c0501bc2c6a09ca26ce4d47c4f60f Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 27 Sep 2024 19:09:43 +0200 Subject: [PATCH 22/25] bugfix seriennummern lieferschein list --- www/pages/seriennummern.php | 56 +++++++++++++++---------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index aea3fbd0..c4f2326c 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -72,19 +72,6 @@ class Seriennummern { '', ); -/* $sql_columns = " - s.id, - CONCAT('',a.nummer,'') as nummer, - a.name_de, - s.seriennummer, - ".$app->erp->FormatDateTime("s.datum").", - if(s.eingelagert,'Ja','Nein'), - lh.adresse_name, - ".$app->erp->ConcatSQL($lieferschein_link).", - ".$app->erp->FormatDate("lh.datum").", - s.id - ";*/ - $sql_columns = " s.id, $dropnbox, @@ -96,7 +83,6 @@ class Seriennummern { s.id "; - $sql_tables = " seriennummern s INNER JOIN @@ -296,26 +282,36 @@ class Seriennummern { '', ); - $sql = "SELECT SQL_CALC_FOUND_ROWS + $sql_columns = " l.id, ".$app->erp->ConcatSQL($lieferschein_link).", ".$app->erp->FormatDate("l.datum").", adr.name, - ".$app->erp->FormatMengeFuerFormular("menge").", - SUM(if(slp.id IS NULL,0,1)), - ".$app->erp->FormatMengeFuerFormular("if(menge>SUM(if(slp.id IS NULL,0,1)),menge-SUM(if(slp.id IS NULL,0,1)),0) ").", + ".$app->erp->FormatMengeFuerFormular("SUM(menge)").", + SUM(menge_nummern), + ".$app->erp->FormatMengeFuerFormular("if(SUM(menge)>SUM(menge_nummern),SUM(menge)-SUM(menge_nummern),0)").", ".$app->erp->ConcatSQL($menu_link).", - l.id - FROM + l.id"; + $sql_tables = " lieferschein_position lp - LEFT JOIN seriennummern_beleg_position slp - ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id 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 ( + SELECT + beleg_position, + COUNT(id) menge_nummern + FROM + seriennummern_beleg_position + WHERE + beleg_typ = 'lieferschein' + GROUP BY + beleg_position + ) sbp + ON sbp.beleg_position = lp.id "; $where = "(a.seriennummern <> 'keine')"; @@ -347,17 +343,9 @@ class Seriennummern { $where .= " AND (l.datum >= (SELECT DATE(MIN(datum)) FROM seriennummern WHERE artikel = a.id))"; } - - $count = "SELECT COUNT(DISTINCT lp.lieferschein) FROM - lieferschein_position lp - LEFT JOIN seriennummern_beleg_position slp - ON slp.beleg_typ = 'lieferschein' AND slp.beleg_position = lp.id - INNER JOIN lieferschein l ON - l.id = lp.lieferschein - INNER JOIN artikel a ON - a.id = lp.artikel - "." WHERE ".$where; - + $sql = "SELECT SQL_CALC_FOUND_ROWS ".$sql_columns." FROM ".$sql_tables; + $count = "SELECT COUNT(DISTINCT l.id) FROM ".$sql_tables." WHERE ".$where; + $groupby = "GROUP BY l.id"; break; case "seriennummern_wareneingaenge_list": @@ -915,7 +903,7 @@ class Seriennummern { break; } $lieferschein_position = $auswahl[0]; - $sql_auswahl = " AND artikel IN (SELECT artikel FROM lieferschein_position WHERE id = '".$lieferschein_position."'"; + $sql_auswahl = " AND artikel IN (SELECT artikel FROM lieferschein_position WHERE id = '".$lieferschein_position."')"; } $seriennummern_not_written = array(); $seriennummern_dont_exist = array(); From 06add0d68533f9bd951bee0ff29423ab1e915f2a Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sat, 28 Sep 2024 12:30:41 +0200 Subject: [PATCH 23/25] seriennummern improvements assistant --- www/pages/seriennummern.php | 140 +++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 65 deletions(-) diff --git a/www/pages/seriennummern.php b/www/pages/seriennummern.php index c4f2326c..05e662a8 100644 --- a/www/pages/seriennummern.php +++ b/www/pages/seriennummern.php @@ -288,8 +288,8 @@ class Seriennummern { ".$app->erp->FormatDate("l.datum").", adr.name, ".$app->erp->FormatMengeFuerFormular("SUM(menge)").", - SUM(menge_nummern), - ".$app->erp->FormatMengeFuerFormular("if(SUM(menge)>SUM(menge_nummern),SUM(menge)-SUM(menge_nummern),0)").", + SUM(COALESCE(menge_nummern,0)), + ".$app->erp->FormatMengeFuerFormular("if(SUM(menge)>SUM(COALESCE(menge_nummern,0)),SUM(menge)-SUM(COALESCE(menge_nummern,0)),0)").", ".$app->erp->ConcatSQL($menu_link).", l.id"; $sql_tables = " @@ -391,9 +391,9 @@ class Seriennummern { ".$app->erp->ConcatSQL($wareneingang_link).", ".$app->erp->FormatDate("pa.datum").", adr.name adresse, - ".$app->erp->FormatMengeFuerFormular("SUM(pd.menge)")." menge, - SUM(if(spd.id IS NULL,0,1)), - ".$app->erp->FormatMengeFuerFormular("if(menge>SUM(if(spd.id IS NULL,0,1)),menge-SUM(if(spd.id IS NULL,0,1)),0) ").", + ".$app->erp->FormatMengeFuerFormular("SUM(menge)")." menge, + SUM(COALESCE(menge_nummern,0)), + ".$app->erp->FormatMengeFuerFormular("if(SUM(menge)>SUM(COALESCE(menge_nummern,0)),SUM(menge)-SUM(COALESCE(menge_nummern,0)),0) ").", ".$app->erp->ConcatSQL($menu_link)." FROM paketannahme pa @@ -403,10 +403,18 @@ class Seriennummern { adr.id = pa.adresse INNER JOIN artikel a ON a.id = pd.artikel - LEFT JOIN seriennummern_beleg_position spd ON - spd.beleg_typ = 'wareneingang' AND spd.beleg_position = pd.id - LEFT JOIN seriennummern s ON - s.id = spd.seriennummer + LEFT JOIN ( + SELECT + beleg_position, + COUNT(id) menge_nummern + FROM + seriennummern_beleg_position + WHERE + beleg_typ = 'wareneingang' + GROUP BY + beleg_position + ) sbp + ON sbp.beleg_position = pd.id "; $where = "(a.seriennummern <> 'keine')"; @@ -994,7 +1002,7 @@ class Seriennummern { try { $this->app->DB->Insert($sql); $seriennummer_id = $this->app->DB->GetInsertId(); - $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, paketdistribution) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; + $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, beleg_position) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; $this->app->DB->Insert($sql); } catch (mysqli_sql_exception $e) { $error = true; @@ -1008,7 +1016,7 @@ class Seriennummern { $seriennummer_id = $this->app->DB->Select("SELECT id FROM seriennummern WHERE seriennummer = '".$this->app->DB->real_escape_string($seriennummer)."' AND artikel = '".$artikel_id."'"); $sql = "UPDATE seriennummern SET eingelagert = 1, logdatei = CURRENT_TIMESTAMP WHERE id = '".$seriennummer_id."'"; $this->app->DB->Update($sql); - $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, paketdistribution) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; + $sql = "INSERT INTO seriennummern_beleg_position (beleg_typ, seriennummer, beleg_position) VALUES ('wareneingang','".$seriennummer_id."', '".$wareneingang_position."')"; $this->app->DB->Insert($sql); } else { $seriennummern_old_not_allowed[] = $seriennummer; @@ -1091,11 +1099,12 @@ class Seriennummern { if (empty($check_lieferschein)) { $this->app->Tpl->AddMessage('success', 'Seriennummern vollständig.'); - $check_lieferschein = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true, only_missing: true); $this->app->Tpl->Set('EINGABE_HIDDEN', 'hidden'); } else { - $menge_lieferschein = array_sum(array_column($check_lieferschein,'menge_lieferschein')); - $menge_nummern = array_sum(array_column($check_lieferschein,'menge_nummern')); + $check_lieferschein_alle = $this->seriennummern_check_delivery_notes($lieferschein_id, ignore_date: true, only_missing: false); + + $menge_lieferschein = array_sum(array_column($check_lieferschein_alle,'menge_lieferschein')); + $menge_nummern = array_sum(array_column($check_lieferschein_alle,'menge_nummern')); $anzahl_fehlt = $menge_lieferschein-$menge_nummern; if ($anzahl_fehlt < 0) { @@ -1128,13 +1137,13 @@ class Seriennummern { $this->app->Tpl->Set('START', $matches[2]); $this->app->Tpl->Set('POSTFIX', $matches[3]); - $fehlt = $check_lieferschein[0]['menge_lieferschein']-$check_lieferschein[0]['menge_nummern']; - if ($fehlt < 0) { - $fehlt = 0; + $anzahl_vorschlag = $check_lieferschein[0]['menge_lieferschein']-$check_lieferschein[0]['menge_nummern']; + if ($anzahl_vorschlag < 0) { + $anzahl_vorschlag = 0; } - $this->app->Tpl->Set('ANZAHL', $fehlt); + $this->app->Tpl->Set('ANZAHL', $anzahl_vorschlag); } - + $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_lieferschein_positionen', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); @@ -1159,52 +1168,52 @@ class Seriennummern { if (empty($check_wareneingang)) { $this->app->Tpl->AddMessage('success', 'Seriennummern vollständig.'); - $check_wareneingang = $this->seriennummern_check_incoming_goods($check_wareneingang, only_missing: true); $this->app->Tpl->Set('EINGABE_HIDDEN', 'hidden'); + } else { + $check_wareneingang_alle = $this->seriennummern_check_incoming_goods($wareneingang_id, only_missing: false); + + $menge_wareneingang = array_sum(array_column($check_wareneingang_alle,'menge_wareneingang')); + $menge_nummern = array_sum(array_column($check_wareneingang_alle,'menge_nummern')); + $anzahl_fehlt = $menge_wareneingang-$menge_nummern; + + if ($anzahl_fehlt < 0) { + $anzahl_fehlt = 0; + } + + $this->app->Tpl->Set('ANZBELEG', $menge_wareneingang); + $this->app->Tpl->Set('ANZVORHANDEN', $menge_nummern); + $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); + + $artikel_wareneingang = $this->app->DB->SelectArr("SELECT artikel FROM paketdistribution WHERE paketannahme = '".$wareneingang_id."'"); + + $sql = " + SELECT + DISTINCT s.seriennummer + FROM + seriennummern s + WHERE + s.artikel = ".$check_wareneingang[0]['artikel']." + ORDER BY s.id DESC + LIMIT 1 + "; + + $letzte_seriennummer = (string) $this->app->DB->Select($sql); + + $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); + $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); + $this->app->Tpl->Set('PRAEFIX', $matches[1]); + $this->app->Tpl->Set('START', $matches[2]+1); + $this->app->Tpl->Set('POSTFIX', $matches[3]); + + $anzahl_vorschlag = $check_wareneingang[0]['menge_wareneingang']-$check_wareneingang[0]['menge_nummern']; + if ($anzahl_vorschlag < 0) { + $anzahl_vorschlag = 0; + } + $this->app->Tpl->Set('ANZAHL', $anzahl_vorschlag); } - $menge_wareneingang = array_sum(array_column($check_wareneingang,'menge_wareneingang')); - $menge_nummern = array_sum(array_column($check_wareneingang,'menge_nummern')); - $anzahl_fehlt = $menge_wareneingang-$menge_nummern; - - if ($anzahl_fehlt < 0) { - $anzahl_fehlt = 0; - } - - $this->app->Tpl->Set('ANZBELEG', $menge_wareneingang); - $this->app->Tpl->Set('ANZVORHANDEN', $menge_nummern); - $this->app->Tpl->Set('ANZFEHLT', $anzahl_fehlt); - - $artikel_wareneingang = $this->app->DB->SelectArr("SELECT artikel FROM paketdistribution WHERE paketannahme = '".$wareneingang_id."'"); - - $sql = " - SELECT - DISTINCT s.seriennummer - FROM - seriennummern s - WHERE - s.artikel IN (".implode(',',array_column($artikel_wareneingang,'artikel')).") - ORDER BY s.id DESC - LIMIT 1 - "; - - $letzte_seriennummer = (string) $this->app->DB->Select($sql); - - $regex_result = array(preg_match('/(.*?)(\d+)(?!.*\d)(.*)/', $letzte_seriennummer, $matches)); - $this->app->Tpl->Set('LETZTE', $letzte_seriennummer); - $this->app->Tpl->Set('PRAEFIX', $matches[1]); - $this->app->Tpl->Set('START', $matches[2]+1); - $this->app->Tpl->Set('POSTFIX', $matches[3]); - - $fehlt = $check_lieferschein[0]['menge_wareneingang']-$check_wareneingang[0]['menge_nummern']; - if ($fehlt < 0) { - $fehlt = 0; - } - - $this->app->Tpl->Set('ANZAHL', $anzahl_fehlt); - $this->app->YUI->TableSearch('POSITIONEN', 'seriennummern_wareneingang_positionen', "show", "", "", basename(__FILE__), __CLASS__); - $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar",0,"&lieferschein=$lieferschein_id"); + $this->app->YUI->AutoComplete("eingabe", "seriennummerverfuegbar"); $this->app->Tpl->Set('SERIENNUMMERN', implode("\n",$seriennummern)); break; @@ -1277,8 +1286,8 @@ class Seriennummern { $sql_we = "''"; $sql_we_group = ""; } else { - $sql_we = "pa.id"; - $sql_we_group = ", pa.id"; + $sql_we = "pd.id"; + $sql_we_group = ", pd.id"; } $sql = " @@ -1562,7 +1571,7 @@ class Seriennummern { SUBSTRING(sbp.beleg_typ, 2) ) AS Belegtyp, COALESCE(l.belegnr,w.id) AS Beleg, - ".$this->app->erp->FormatDate('l.datum')." AS Datum, + ".$this->app->erp->FormatDate('COALESCE(l.datum,w.datum)')." AS Datum, COALESCE(al.name,aw.name) AS Adresse FROM seriennummern_beleg_position sbp LEFT JOIN lieferschein_position lp ON sbp.beleg_typ = 'lieferschein' AND lp.id = sbp.beleg_position @@ -1573,7 +1582,8 @@ class Seriennummern { LEFT JOIN paketannahme w ON w.id = pd.paketannahme LEFT JOIN adresse aw ON aw.id = w.adresse - WHERE sbp.seriennummer ='$id' " + WHERE sbp.seriennummer ='$id' + ORDER BY COALESCE(l.datum,w.datum) DESC" ,0,""); $tmp->DisplayNew('TAB1',"Adresse","noAction"); From 95f203b12c13979050cc4fd91461ca90c610c9e8 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 1 Oct 2024 13:50:55 +0200 Subject: [PATCH 24/25] seriennummern briefpapier seriennummern_beleg_position --- www/lib/dokumente/class.briefpapier.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index 8dc3b0a7..445ccea5 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -316,9 +316,9 @@ class Briefpapier extends SuperFPDF { FROM seriennummern s INNER JOIN - seriennummern_lieferschein_position slp ON slp.seriennummer = s.id + seriennummern_beleg_position slp ON slp.beleg_typ = 'lieferschein' AND slp.seriennummer = s.id WHERE - slp.lieferschein_position = $posid + slp.beleg_position = $posid "; $values = (array) $this->app->DB->SelectArr($sql); return(implode(', ',array_column($values,'seriennummer'))); From 5ef8439d9104ab4e229c50cc26f360d035c9a43c Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 1 Oct 2024 14:35:15 +0200 Subject: [PATCH 25/25] remove debug echo mahnwesen --- www/pages/mahnwesen.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index 29d2f349..b93ca08a 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -230,8 +230,6 @@ class Mahnwesen { "; $offene_rechnungen = $this->app->DB->SelectArr($sql); - echo($sql); - foreach ($offene_rechnungen as $offene_rechnung) { if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) { $sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id'];