From 472c23b4515628b7f327e38ffb1e5e5a90af067c Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sun, 26 Jan 2025 20:34:38 +0100 Subject: [PATCH 01/22] projekt uebergeordnetes_projekt nummernkreis --- upgrade/data/db_schema.json | 11 ++++++++++ www/lib/class.erpapi.php | 17 +++++++++++++++ www/pages/content/projekt_uebersicht.tpl | 6 ++++++ www/pages/projekt.php | 27 ++++++++++++++++-------- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index df80f65f..5484bc0b 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -80375,6 +80375,17 @@ "Extra": "", "Privileges": "select,insert,update,references", "Comment": "" + }, + { + "Field": "uebergeordnetes_projekt", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" } ], "keys": [ diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index b1105403..4dc99ab0 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -27254,6 +27254,23 @@ function Firmendaten($field,$projekt="") $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); $belegnr = ''; + + $untergeordnetes_projekt = $projekt; + if (empty($eigenernummernkreis)) { + do { + $uebergeordnetes_projekt = $this->app->DB->Select("SELECT uebergeordnetes_projekt FROM projekt WHERE id='$untergeordnetes_projekt' LIMIT 1"); + if (!empty($uebergeordnetes_projekt)) { + $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$uebergeordnetes_projekt' LIMIT 1"); + if ($eigenernummernkreis) { + $projekt = $uebergeordnetes_projekt; + break; + } else { + $untergeordnetes_projekt = $uebergeordnetes_projekt; + } + } + } while (!empty($uebergeordnetes_projekt) && $uebergeordnetes_projekt != $projekt); + } + if($eigenernummernkreis=='1') { $allowedtypes = ['angebot', 'auftrag', 'rechnung', 'lieferschein', 'arbeitsnachweis', 'reisekosten', diff --git a/www/pages/content/projekt_uebersicht.tpl b/www/pages/content/projekt_uebersicht.tpl index bd0a5eb0..1ba449a4 100644 --- a/www/pages/content/projekt_uebersicht.tpl +++ b/www/pages/content/projekt_uebersicht.tpl @@ -46,6 +46,12 @@ + + Übergeordnetes Projekt: + + Für Nummernkreise + + Status: diff --git a/www/pages/projekt.php b/www/pages/projekt.php index 0ce13276..7ca8bfd3 100644 --- a/www/pages/projekt.php +++ b/www/pages/projekt.php @@ -1890,6 +1890,10 @@ class Projekt extends GenProjekt { { $kunde = $this->app->Secure->GetPOST("kunde"); $verantwortlicher = $this->app->Secure->GetPOST("verantwortlicher"); + $uebergeordnetes_projekt = $this->app->Secure->GetPOST('uebergeordnetes_projekt'); + + $uebergeordnetes_projekt = $this->app->erp->ReplaceProjektName(true,$uebergeordnetes_projekt,true); + $kundennummer = strstr($kunde,' ',true); $mitarbeiternummer = strstr($verantwortlicher,' ',true); $kundeid = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer!='' AND kundennummer='$kundennummer' AND geloescht!=1 LIMIT 1"); @@ -1921,7 +1925,7 @@ class Projekt extends GenProjekt { } $this->app->FormHandler->FormUpdateDatabase("projekt",$id); - $this->app->DB->Update("UPDATE projekt SET kunde='$kundeid', verantwortlicher='$verantwortlicherid' WHERE id='$id' LIMIT 1"); + $this->app->DB->Update("UPDATE projekt SET kunde='$kundeid', verantwortlicher='$verantwortlicherid', uebergeordnetes_projekt='$uebergeordnetes_projekt' WHERE id='$id' LIMIT 1"); if($msg!="") { header("Location: index.php?module=projekt&action=uebersicht&id=$id&msg=$msg"); @@ -1931,12 +1935,13 @@ class Projekt extends GenProjekt { } $this->app->FormHandler->FormGetVars("projekt",$id); - $data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status FROM projekt p + $data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status, uebergeordnetes_projekt FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON a2.id=p.verantwortlicher WHERE p.id='$id' LIMIT 1"); if(isset($data[0])) { $this->app->Tpl->Set('KUNDE',$data[0]['kunde']); - $this->app->Tpl->Set('VERANTWORTLICHER',$data[0]['mitarbeiter']); + $this->app->Tpl->Set('VERANTWORTLICHER',$data[0]['mitarbeiter']); + $this->app->Tpl->Set('UEBERGEORDNETES_PROJEKT',$this->app->erp->ReplaceProjektName(false,$data[0]['uebergeordnetes_projekt'],false)); switch($data[0]['status']){ case 'gestartet': case 'geplant': @@ -1946,8 +1951,6 @@ class Projekt extends GenProjekt { } } - - for($i = 0; $i <= 10; $i++) { $n1 = 'projektfreifeld'.$i.'typ'; @@ -2041,9 +2044,10 @@ class Projekt extends GenProjekt { $this->app->Tpl->Set("FREIFELDER",$output); - $this->app->YUI->AutoComplete("abkuerzung","projektname",1); + // $this->app->YUI->AutoComplete("abkuerzung","projektname",1); $this->app->YUI->AutoComplete("kunde","kunde"); $this->app->YUI->AutoComplete("verantwortlicher","adresse"); + $this->app->YUI->AutoComplete("uebergeordnetes_projekt","projektname"); $this->app->YUI->CkEditor("beschreibung","belege"); $this->app->YUI->CkEditor("sonstiges","internal"); $this->app->Tpl->Parse('PAGE','projekt_uebersicht.tpl'); @@ -2825,9 +2829,14 @@ class Projekt extends GenProjekt { if($check > 0){ $this->app->DB->Update( "UPDATE `projekt` - SET `name` = '" . $data['name'] . "', `abkuerzung` = '" . $data['abkuerzung'] . "', - `kunde` = '" . $data['kunde'] . "', `verantwortlicher` = '" . $data['verantwortlicher'] . "', - `beschreibung` = '" . $data['beschreibung'] . "', `status` = '" . $data['status'] . "' + SET + `name` = '" . $data['name'] . "', + `abkuerzung` = '" . $data['abkuerzung'] . "', + `kunde` = '" . $data['kunde'] . "', + `verantwortlicher` = '" . $data['verantwortlicher'] . "', + `uebergeordnetes_projekt` = '" . $data['uebergeordnetes_projekt'] . "', + `beschreibung` = '" . $data['beschreibung'] . "', + `status` = '" . $data['status'] . "' WHERE `id` = '$check' LIMIT 1" ); From 8fb6e632fb7b1a0793e489592c9f94990d35a379 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Mon, 27 Jan 2025 09:29:04 +0100 Subject: [PATCH 02/22] bugfix xml rechnung erloes round --- www/pages/rechnung.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index 3a9d7669..6181c578 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -1345,7 +1345,7 @@ class Rechnung extends GenRechnung $this->app->erp->GetSteuerPosition('rechnung', $position['id'], $steuersatz, $steuertext, $erloes); $positionen[$key]['steuersatz'] = $steuersatz; $positionen[$key]['steuertext'] = $steuertext; - $positionen[$key]['erloese'] = round($erloes,2); + $positionen[$key]['erloes'] = $erloes; $positionen[$key]['umsatz_netto_gesamt'] = round($position['umsatz_netto_gesamt'],2); $positionen[$key]['umsatz_brutto_gesamt'] = round($position['umsatz_brutto_gesamt'],2); From b4e429d00a06c6bad30c1058786169a135a30213 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Mon, 27 Jan 2025 11:31:37 +0100 Subject: [PATCH 03/22] erpapi removed select from non-existing tablex lieferkette_bestellung --- www/lib/class.erpapi.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 4dc99ab0..d758f98a 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -11953,6 +11953,7 @@ function SendPaypalFromAuftrag($auftrag, $test = false) // darunter war ein else if if($just_stueckliste=="1" && $explodiert=="0") { + /* table lieferkette_bestellung does not exist $checklieferkette = 0; if($typ === 'auftrag'){ $checklieferkette = $this->app->DB->Select("SELECT id FROM lieferkette_bestellung WHERE belegtyp='auftrag' AND belegid='$auftrag' LIMIT 1"); @@ -11966,14 +11967,14 @@ function SendPaypalFromAuftrag($auftrag, $test = false) WHERE s.stuecklistevonartikel='$artikel' AND s.art!='it' AND s.art!='bt'" ); } - else{ + else{ */ $artikel_von_stueckliste = $this->app->DB->SelectArr( "SELECT s.*, art.nummer AS artnummer,art.projekt AS artprojekt FROM stueckliste AS s INNER JOIN artikel AS art ON s.artikel = art.id WHERE s.stuecklistevonartikel='$artikel'" ); - } +// } $treffer++; $changed = true; From 806e1ed7a237bdbe6fa04197065dc33c41e9f807 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Mon, 27 Jan 2025 12:58:09 +0100 Subject: [PATCH 04/22] projekte show simple tree view --- www/pages/content/projekt_uebersicht.tpl | 28 +++++++-------- www/pages/projekt.php | 45 ++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/www/pages/content/projekt_uebersicht.tpl b/www/pages/content/projekt_uebersicht.tpl index 1ba449a4..5ee6a9ca 100644 --- a/www/pages/content/projekt_uebersicht.tpl +++ b/www/pages/content/projekt_uebersicht.tpl @@ -30,16 +30,19 @@ + + + Status: + + + - - Kunde: - Verantwortlicher: @@ -52,20 +55,17 @@ Für Nummernkreise - - Status: + + Struktur: - +
[PROJEKTBAUM]
- + [FREIFELDER] - + - - -
@@ -84,15 +84,11 @@ - - -
- - +
diff --git a/www/pages/projekt.php b/www/pages/projekt.php index 7ca8bfd3..10876dbb 100644 --- a/www/pages/projekt.php +++ b/www/pages/projekt.php @@ -1884,7 +1884,6 @@ class Projekt extends GenProjekt { $id = (int)$this->app->Secure->GetGET('id'); $this->ProjektMenu(); - $speichern = $this->app->Secure->GetPOST('speichern'); if($speichern!='') { @@ -1935,7 +1934,7 @@ class Projekt extends GenProjekt { } $this->app->FormHandler->FormGetVars("projekt",$id); - $data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status, uebergeordnetes_projekt FROM projekt p + $data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status, uebergeordnetes_projekt, abkuerzung FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON a2.id=p.verantwortlicher WHERE p.id='$id' LIMIT 1"); if(isset($data[0])) { @@ -2044,6 +2043,48 @@ class Projekt extends GenProjekt { $this->app->Tpl->Set("FREIFELDER",$output); + // Build simple tree view + $projekte = $this->app->DB->SelectArr("SELECT id, abkuerzung, name, uebergeordnetes_projekt FROM projekt"); + function buildTree(array $elements, $parentId = 0, $limit = 10) { + $limit--; + if ($limit < 1) { + return; + } + $branch = array(); + foreach ($elements as $element) { + if ($element['uebergeordnetes_projekt'] == $parentId) { + $children = buildTree($elements, $element['id'], $limit); + if ($children) { + $element['children'] = $children; + } + $branch[] = $element; + } + } + return $branch; + } + $projektbaum = buildTree($projekte, $id); + if (!empty($projektbaum)) { + $root = array(); + $root['abkuerzung'] = $data[0]['abkuerzung']; + $root['children'] = $projektbaum; + function printleaf($leaf, $level, $first = false) { + if (!$first) { + $s = $level; + } + $s .= "- ".$leaf['abkuerzung']."\n"; + if ($leaf['children']) { + foreach ($leaf['children'] as $childleaf) { + $s .= printleaf($childleaf, $level.$level); + } + } + return($s); + } + $baum .= printleaf($root," ", true); + $this->app->Tpl->Set("PROJEKTBAUM",$baum); + } else { + $this->app->Tpl->Set("PROJEKTBAUMHIDDEN",'hidden'); + } + // $this->app->YUI->AutoComplete("abkuerzung","projektname",1); $this->app->YUI->AutoComplete("kunde","kunde"); $this->app->YUI->AutoComplete("verantwortlicher","adresse"); From 69c1018ae171133652c72eb593100424924e322b Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 28 Jan 2025 13:05:16 +0100 Subject: [PATCH 05/22] projekt list bugfix filter --- www/pages/projekt.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/www/pages/projekt.php b/www/pages/projekt.php index 10876dbb..767c253f 100644 --- a/www/pages/projekt.php +++ b/www/pages/projekt.php @@ -152,7 +152,7 @@ class Projekt extends GenProjekt { $width = array('1%','8%', '20%','5%','15%', '15%'); $moreinfo = true; $moreinfoaction='projektuebersicht'; - $findcols = array('p.abkuerzung','p.name','a.kundennummer','a.name','p.verantwortlicher'); + $findcols = array('','p.abkuerzung','p.name','a.kundennummer','a.name','a2.name'); $defaultorder = 6; $menu = ""; @@ -161,8 +161,12 @@ class Projekt extends GenProjekt { $width[] = '8%'; $heading[] = 'Öffentlich'; $findcols[] = "if(p.oeffentlich,'ja','-')"; - $searchsql = array('p.name', 'p.abkuerzung', 'a2.name', 'a.kundennummer', 'a.name',"if(p.oeffentlich,'ja','-')"); + $width[] = '1%'; + $heading[] = 'Nummern-Kreis'; + $findcols[] = "if(p.eigenernummernkreis,'ja','-')"; + + $searchsql = array('p.name', 'p.abkuerzung', 'a2.name', 'a.kundennummer', 'a.name',"if(p.oeffentlich,'ja','-')"); $heading[] = 'Menü'; @@ -192,8 +196,10 @@ class Projekt extends GenProjekt { // SQL statement $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, 'Conf->WFconf['defaulttheme']."/images/details_open.png class=details>' as open,"; $sql .= " p.abkuerzung, p.name, a.kundennummer,a.name, a2.name,"; - $sql .= "if(p.oeffentlich,'ja','-') as oeffentlich, $freifeldsql - p.id as menu FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON p.verantwortlicher = a2.id "; + $sql .= " if(p.oeffentlich,'ja','-') as oeffentlich,"; + $sql .= " if(p.eigenernummernkreis,'ja','-') as eigenernummernkreis,"; + $sql .= $freifeldsql; + $sql .= "p.id as menu FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON p.verantwortlicher = a2.id "; //if(p.status like 'abgeschlossen','abgeschlossen','offen') as status, // fester filter $where = " p.geloescht=0 " . $app->erp->ProjektRechte(); From ea3f7dd9f7d97511fa5f71b2612744cc4d146982 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 28 Jan 2025 13:28:05 +0100 Subject: [PATCH 06/22] lager re-added beschreibung --- www/pages/lager.php | 10 +++++----- www/widgets/templates/_gen/lager.tpl | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/www/pages/lager.php b/www/pages/lager.php index 174d6d64..47bd297d 100644 --- a/www/pages/lager.php +++ b/www/pages/lager.php @@ -182,16 +182,16 @@ class Lager extends GenLager { $defaultCountry = 'DE'; } // headings - $heading = array('Bezeichnung', 'Projekt','Kommissions- / Produktionslager','Land','Menü'); - $width = array('60%', '10%','20%','5%', '8%'); - $findcols = array('l.bezeichnung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)", 'l.id'); - $searchsql = array('l.bezeichnung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)",'p.name'); + $heading = array('Bezeichnung','Beschreibung', 'Projekt','Kommissions- / Produktionslager','Land','Menü'); + $width = array('20%','60%', '10%','20%','5%', '8%'); + $findcols = array('l.bezeichnung','l.beschreibung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)", 'l.id'); + $searchsql = array('l.bezeichnung','l.beschreibung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)",'p.name'); $defaultorder = 4; $defaultorderdesc = 1; $menu = "
Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">" . " Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . " Conf->WFconf['defaulttheme']}/images/labelprinter.png\" border=\"0\">
"; // SQL statement - $sql = "SELECT SQL_CALC_FOUND_ROWS l.id, l.bezeichnung, p.abkuerzung, a.name, + $sql = "SELECT SQL_CALC_FOUND_ROWS l.id, l.bezeichnung, l.beschreibung, p.abkuerzung, a.name, IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land), l.id as menu FROM `lager` AS `l` diff --git a/www/widgets/templates/_gen/lager.tpl b/www/widgets/templates/_gen/lager.tpl index e705a8e9..b1420ef2 100644 --- a/www/widgets/templates/_gen/lager.tpl +++ b/www/widgets/templates/_gen/lager.tpl @@ -23,8 +23,8 @@ {|Lager|}[BEZEICHNUNG][MSGBEZEICHNUNG] {|z.B. Raum 1, Lager Berlin|} {|Projekt|}[PROJEKT][MSGPROJEKT] {|Optional Angabe|} {|Adresse|}[ADRESSE][MSGADRESSE] {|Optional Angabe Adresse für Kommissionslager, externe Produktion oder Anschrift bzw. Land vom Lager|} - + + Beschreibung[BESCHREIBUNG][MSGBESCHREIBUNG] From 1712d5e927da3e6424aba7e20dd44661f493415b Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 28 Jan 2025 21:38:59 +0100 Subject: [PATCH 07/22] lagerbewertung added adress name --- www/pages/lager.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/www/pages/lager.php b/www/pages/lager.php index 47bd297d..2c87d385 100644 --- a/www/pages/lager.php +++ b/www/pages/lager.php @@ -310,9 +310,9 @@ class Lager extends GenLager { } } - $heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Menge','Gewicht','Volumen','Preistyp','EK-Preis','Währung','Kurs','', 'Gesamt',''); - $width = array( '5%', '05%', '20%', '10%', '10%', '5%' , '5%', '5%', '5%', '1%', '5%', '1%', '1%', '1%','2%', '1%'); - $findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername', 'name',$colmenge,$colgewicht,$colvolumen); + $heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Adresse','Menge','Gewicht','Volumen','Preistyp','EK-Preis','Währung','Kurs','', 'Gesamt',''); + $width = array( '5%', '05%', '20%', '10%', '10%', '5%' ,'5%', '5%', '5%', '5%', '1%', '5%', '1%', '1%', '1%','2%', '1%'); + $findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername', 'lagerplatzname','adressname',$colmenge,$colgewicht,$colvolumen); if ($preiseineuro) { $preisEUR = "((SELECT preisfinal)*if((SELECT waehrungfinal) = 'EUR' OR (SELECT waehrungfinal) = NULL,1,kurs))"; @@ -472,7 +472,9 @@ class Lager extends GenLager { GROUP BY artikel, waehrung - "; + "; + + $lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung lagerplatzname, lager_platz.adresse from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz"; $sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS art.id, @@ -481,7 +483,8 @@ class Lager extends GenLager { art.name_de, (select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, 'kat', 1), '_', 1) as type from artikel where id=art.id)) as artikelkategorie, lagerplatz.lagername, - lagerplatz.name, + lagerplatzname, + adr.adressname, ".$app->erp->FormatMenge('lw.menge',2).",".$app->erp->FormatPreis($colgewicht,2).",".$app->erp->FormatPreis($colvolumen,2)." as menge, ".self::PreisTypErgebnis($preisart)." as preisart, ".self::EinzelPreis($preisart)." AS preisfinal, @@ -493,14 +496,12 @@ class Lager extends GenLager { FROM artikel art INNER JOIN ".$lagermengen_sql." AS lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 + INNER JOIN ".$lagerplatz_sql." ON lw.lager_platz = lagerplatz.id + LEFT JOIN (SELECT id, name adressname FROM adresse) adr ON adr.id = lagerplatz.adresse LEFT JOIN (".$prices_sql.") AS ek ON art.id = ek.artikel AND ".self::Waehrung($preisart)." = ek.waehrung LEFT JOIN (".$currency_sql.") AS kurs ON kurs.waehrung_von = ".self::Waehrung($preisart)." AND kurs.waehrung_nach = 'EUR' "; - $lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung name from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz"; - - $sql .= "INNER JOIN ".$lagerplatz_sql." ON lw.lager_platz = lagerplatz.id"; - $where .= " AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 "; $sql = $app->YUI->CodiereSQLForOneQuery($sql, $name); From 200b19eb564c9ad33a90bc1eb6a7f6711a83c945 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 29 Jan 2025 12:20:25 +0100 Subject: [PATCH 08/22] lagerwert added sperrlager, konsignation --- www/pages/content/lager_wert.tpl | 10 +++++++- www/pages/lager.php | 43 +++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/www/pages/content/lager_wert.tpl b/www/pages/content/lager_wert.tpl index 3f0a5708..39f77a23 100644 --- a/www/pages/content/lager_wert.tpl +++ b/www/pages/content/lager_wert.tpl @@ -42,7 +42,15 @@ - + + + + + + + + + diff --git a/www/pages/lager.php b/www/pages/lager.php index 2c87d385..bc0cce29 100644 --- a/www/pages/lager.php +++ b/www/pages/lager.php @@ -287,6 +287,8 @@ class Lager extends GenLager { $datum = $app->User->GetParameter('datum'); $gruppierenlager = $app->User->GetParameter('gruppierenlager'); $preiseineuro = $app->User->GetParameter('preiseineuro'); + $sperrlager_nicht_bewerten = $app->User->GetParameter('sperrlager_nicht_bewerten'); + $konsignationslager_nicht_bewerten = $app->User->GetParameter('konsignationslager_nicht_bewerten'); if($datum) { @@ -310,9 +312,9 @@ class Lager extends GenLager { } } - $heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Adresse','Menge','Gewicht','Volumen','Preistyp','EK-Preis','Währung','Kurs','', 'Gesamt',''); - $width = array( '5%', '05%', '20%', '10%', '10%', '5%' ,'5%', '5%', '5%', '5%', '1%', '5%', '1%', '1%', '1%','2%', '1%'); - $findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername', 'lagerplatzname','adressname',$colmenge,$colgewicht,$colvolumen); + $heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Adresse','Lagerplatz','gesp.','Adresse','Menge','Gewicht','Volumen','Preistyp','EK-Preis','Währung','Kurs', 'Gesamt',''); + $width = array( '5%', '05%', '20%', '10%', '10%', '5%', '5%' ,'5%','1%', '5%', '5%', '1%', '1%', '5%', '1%', '1%', '1%','2%', '1%'); + $findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername','lageradressename', 'lagerplatzname','lagerplatz.sperrlager','lagerplatzadressename',$colmenge,$colgewicht,$colvolumen); if ($preiseineuro) { $preisEUR = "((SELECT preisfinal)*if((SELECT waehrungfinal) = 'EUR' OR (SELECT waehrungfinal) = NULL,1,kurs))"; @@ -322,12 +324,19 @@ class Lager extends GenLager { $gesamtcol = "((SELECT preisfinal)*lw.menge)"; $kurs = 1; } + + if ($sperrlager_nicht_bewerten) { + $gesamtcol = "if (lagerplatz.sperrlager,0,".$gesamtcol.")"; + } + + if ($konsignationslager_nicht_bewerten) { + $gesamtcol = "if (lagerplatz.lagerplatzadresse OR lagerplatz.lageradresse,0,".$gesamtcol.")"; + } $findcols[] = self::PreisTypErgebnis($preisart); $findcols[] = $preis; $findcols[] = 'waehrung'; $findcols[] = 'kurs'; - $findcols[] = ''; $findcols[] = $gesamtcol; $findcols[] = 'art.id'; @@ -336,9 +345,9 @@ class Lager extends GenLager { $defaultorder = 1; $defaultorderdesc = 0; - $alignright = array(7,8,9,10,11,11,13,15); - $sumcol = array(7,15); - $numbercols = array(7,8,9,11,13,15); + $alignright = array(9,10,11,12,13,15,16); + $sumcol = array(9,16); + $numbercols = array(9,10,11,12,13,15); $datecols = array(0); $onequeryperuser = true; @@ -474,7 +483,7 @@ class Lager extends GenLager { waehrung "; - $lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung lagerplatzname, lager_platz.adresse from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz"; + $lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung lagerplatzname, lager_platz.adresse lagerplatzadresse, lager_platz.sperrlager, lager.adresse lageradresse from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz"; $sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS art.id, @@ -483,21 +492,23 @@ class Lager extends GenLager { art.name_de, (select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, 'kat', 1), '_', 1) as type from artikel where id=art.id)) as artikelkategorie, lagerplatz.lagername, + lageradressename, lagerplatzname, - adr.adressname, + if(sperrlager,'ja',''), + lagerplatzadressename, ".$app->erp->FormatMenge('lw.menge',2).",".$app->erp->FormatPreis($colgewicht,2).",".$app->erp->FormatPreis($colvolumen,2)." as menge, ".self::PreisTypErgebnis($preisart)." as preisart, ".self::EinzelPreis($preisart)." AS preisfinal, ".self::Waehrung($preisart)." AS waehrungfinal, ".$kurs." AS kurs, - '' as hidden, ".$app->erp->FormatPreis($gesamtcol,2)." as gesamt, art.id FROM artikel art - INNER JOIN ".$lagermengen_sql." AS lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 + INNER JOIN ".$lagermengen_sql." AS lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 INNER JOIN ".$lagerplatz_sql." ON lw.lager_platz = lagerplatz.id - LEFT JOIN (SELECT id, name adressname FROM adresse) adr ON adr.id = lagerplatz.adresse + LEFT JOIN (SELECT id, name lageradressename FROM adresse) lageradr ON lageradr.id = lagerplatz.lageradresse + LEFT JOIN (SELECT id, name lagerplatzadressename FROM adresse) adr ON adr.id = lagerplatz.lagerplatzadresse LEFT JOIN (".$prices_sql.") AS ek ON art.id = ek.artikel AND ".self::Waehrung($preisart)." = ek.waehrung LEFT JOIN (".$currency_sql.") AS kurs ON kurs.waehrung_von = ".self::Waehrung($preisart)." AND kurs.waehrung_nach = 'EUR' "; @@ -1678,10 +1689,18 @@ class Lager extends GenLager { $preisart = $this->app->Secure->GetPOST('preisart'); $this->app->User->SetParameter('preisart', $preisart); + $sperrlager_nicht_bewerten = $this->app->Secure->GetPOST('sperrlager_nicht_bewerten'); + $this->app->User->SetParameter('sperrlager_nicht_bewerten', $sperrlager_nicht_bewerten); + + $konsignationslager_nicht_bewerten = $this->app->Secure->GetPOST('konsignationslager_nicht_bewerten'); + $this->app->User->SetParameter('konsignationslager_nicht_bewerten', $konsignationslager_nicht_bewerten); + $this->app->YUI->DatePicker("datum"); $this->app->Tpl->Set('DATUM', $datum); $this->app->Tpl->Set('PREISEINEURO', $preiseineuro==1?"checked":""); + $this->app->Tpl->Set('SPERRLAGER_NICHT_BEWERTEN', $sperrlager_nicht_bewerten==1?"checked":""); + $this->app->Tpl->Set('KONSIGNATIONSLAGER_NICHT_BEWERTEN', $konsignationslager_nicht_bewerten==1?"checked":""); $this->app->Tpl->Set('GRUPPIERENLAGER', $gruppierenlager==1?"checked":""); $this->app->Tpl->Set(strtoupper($preisart), 'selected'); From e10cfe6fbd423d421be6172cca0af3930ee6dcd0 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 29 Jan 2025 12:21:08 +0100 Subject: [PATCH 09/22] ErrorPageRenderer simplified page layout --- classes/Core/ErrorHandler/ErrorPageRenderer.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/classes/Core/ErrorHandler/ErrorPageRenderer.php b/classes/Core/ErrorHandler/ErrorPageRenderer.php index 51479009..522ef94b 100644 --- a/classes/Core/ErrorHandler/ErrorPageRenderer.php +++ b/classes/Core/ErrorHandler/ErrorPageRenderer.php @@ -35,8 +35,10 @@ final class ErrorPageRenderer $content .= '

' . htmlspecialchars($data['exception']['message'], ENT_QUOTES) . '

'; $content .= ''; $content .= ''; - $content .= '' . $this->renderInformationData($data['information']) . ''; $content .= '' . $this->renderExceptionData($data['exception']) . ''; + $content .= ''; + $content .= ''; + $content .= '' . $this->renderInformationData($data['information']) . ''; $content .= ''; $content .= $this->renderPageFooter(); @@ -61,12 +63,10 @@ final class ErrorPageRenderer h1, h2, h3, h4, h5, h6 { padding: 0; margin: 0.5em 0 0.5em 0; font-weight: bold; } p { padding: 0; margin: 0 0 .25em 0; } a, a:link, a:visited, a:hover, a:active { text-decoration: none; } - #headline { padding: 24px 12px 18px 12px; background-color: #42B8C5; } - #headline h1 { color: #F5F5F5; font-size: 2rem; margin: 1rem 0; } - #headline h2 { color: #9CD6DB; font-size: 1.1rem; font-weight: normal; margin: 1rem 0; } + #headline { padding: 5px 5px 5px 5px; background-color: #42B8C5; } table { width: 100%; border-collapse: separate; border-spacing: 0; } - table td, table th { text-align: left; padding: 10px 0 10px 0; vertical-align: baseline; } - table th.head { padding: 5px 0 10px 0; background-color: #FFF; vertical-align: baseline; border-bottom: 2px solid #DBDBDB; } + table td, table th { text-align: left; padding: 5px 0 5px 0; vertical-align: baseline; } + table th.head { padding: 5px 0 5px 0; background-color: #FFF; vertical-align: baseline; border-bottom: 2px solid #DBDBDB; } table th.head h3 { margin: 3px 0; } table td.trace { background-color: #F5F5F5; vertical-align: baseline; } table.exception { margin-bottom: 20px; border-top: 2px solid #DBDBDB; } @@ -76,8 +76,8 @@ final class ErrorPageRenderer table.exception a:link code, table.exception a:visited code { color: #42B8C5; } table.exception a:hover code, table.exception a:active code { color: #2F9099; } td.stacktrace tr:last-child td { border: none; } - #main { background-color: #FFF; padding: 2rem; } - #side { min-width: 240px; padding: 5px 15px; background-color: #E9ECEF; } + #main { background-color: #FFF; padding: 5px; } + #side { min-width: 240px; padding: 5px 5px; background-color: #E9ECEF; } #side h1, #side h2, #side h3, #side h4, #side h5, #side h6 { color: #7A7A7A; font-weight: normal; text-transform: uppercase; margin: 1em 0 0.5em 0; } .float-right { float: right; } .separator { color: #999; } From 2d049a5ac55d8c2a8b3dbf2048d3f28a0bceb804 Mon Sep 17 00:00:00 2001 From: faser2k Date: Thu, 30 Jan 2025 13:57:40 +0100 Subject: [PATCH 10/22] wareneingang: optionally hide non storage articles --- www/pages/content/firmendaten.tpl | 1 + www/pages/wareneingang.php | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/www/pages/content/firmendaten.tpl b/www/pages/content/firmendaten.tpl index 2ac2daea..535314f8 100644 --- a/www/pages/content/firmendaten.tpl +++ b/www/pages/content/firmendaten.tpl @@ -1287,6 +1287,7 @@ Aufträge zu Bestellungen im Wareneingang anzeigen: {|Bildtyp beim Upload im Wareneingang|}: {|Verhalten beim Scannen im Wareneingang|}: + Nur Lagerartikel im Wareneingang: diff --git a/www/pages/wareneingang.php b/www/pages/wareneingang.php index 71288b5b..d0e4d544 100644 --- a/www/pages/wareneingang.php +++ b/www/pages/wareneingang.php @@ -350,7 +350,11 @@ class Wareneingang { // $menu = "
Menge:  
"; $menucol = 4; - $lagerartikel = ""; + if($this->app->erp->Firmendaten("wareneingang_lagerartikel")) { + $lagerartikel = "AND art.lagerartikel = 1"; + } else { + $lagerartikel = ""; + } $receiptDocument = $this->app->erp->ModulVorhanden('receiptdocument'); if ($receiptDocument) { $this->app->DB->Select('SELECT id FROM receiptdocument LIMIT 1'); From 6482a68168640e30c3135ab5712700d2379937d7 Mon Sep 17 00:00:00 2001 From: faser2k Date: Thu, 30 Jan 2025 15:49:15 +0100 Subject: [PATCH 11/22] lieferschein: allow files upload --- www/pages/lieferschein.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/www/pages/lieferschein.php b/www/pages/lieferschein.php index c35a3993..c376bb80 100644 --- a/www/pages/lieferschein.php +++ b/www/pages/lieferschein.php @@ -1739,7 +1739,14 @@ class Lieferschein extends GenLieferschein $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke"); } } - + + $anzahldateien = ''; + if ($id > 0) { + $anzahldateien = $this->app->erp->AnzahlDateien('lieferschein', $id); + $anzahldateien = $anzahldateien > 0?' ('.$anzahldateien.')':''; + } + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=dateien&id=$id", 'Dateien'.$anzahldateien); + $this->app->erp->MenuEintrag("index.php?module=lieferschein&action=list","Zurück zur Übersicht"); $this->app->erp->RunMenuHook('lieferschein'); From cb0cad439990e586a5326251635b01516dafe4e1 Mon Sep 17 00:00:00 2001 From: faser2k Date: Thu, 30 Jan 2025 16:39:29 +0100 Subject: [PATCH 12/22] yui: don't show silly error image for attachments --- phpwf/plugins/class.yui.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/phpwf/plugins/class.yui.php b/phpwf/plugins/class.yui.php index b5ca26e7..08fe39ea 100644 --- a/phpwf/plugins/class.yui.php +++ b/phpwf/plugins/class.yui.php @@ -4230,7 +4230,12 @@ url:strUrl, success:function(html){strReturn = html;}, async:false if(!function_exists('imagejpeg')) { - $img = "'app->Conf->WFconf['defaulttheme']}/images/icon_img_error.png title=\"Keine GD-Erweiterung installiert\" />'"; + $img = "concat(' + + + app->Conf->WFconf['defaulttheme']}/images/download.svg title=\"Datei anzeigen\" /> + + ')"; }else{ $img = "concat('')"; } From 8acb138dadad75fd7d533319ce0a272d0f379e56 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 31 Jan 2025 21:36:41 +0100 Subject: [PATCH 13/22] lageretiketten improvements --- www/lib/dokumente/class.etiketten.php | 32 ++++++---- www/pages/content/lager_etikettenlist.tpl | 32 ++++++++-- www/pages/lager.php | 78 +++++++++++++++++++++-- www/widgets/templates/_gen/etiketten.tpl | 4 +- 4 files changed, 122 insertions(+), 24 deletions(-) diff --git a/www/lib/dokumente/class.etiketten.php b/www/lib/dokumente/class.etiketten.php index 7078cb9a..c6b6927b 100644 --- a/www/lib/dokumente/class.etiketten.php +++ b/www/lib/dokumente/class.etiketten.php @@ -144,25 +144,29 @@ class EtikettenPDF extends SuperFPDF { break; case "barcode": - if((String)($items->attributes()->type)=="E30") { + + if ((String)($items->attributes()->type)=="E30") { $this->EAN13($items->attributes()->x,$items->attributes()->y, $items[0],$items->attributes()->size); } - else if((String)($items->attributes()->type)=="Code128" || (String)($items->attributes()->type)=="1") { + else if ((String)($items->attributes()->type)=="Code128" || (String)($items->attributes()->type)=="1") { $this->Code128($items->attributes()->x, $items->attributes()->y, $items[0], $items->attributes()->width, $items->attributes()->size); } - else if((String)($items->attributes()->type)=="GS1-128" || (String)($items->attributes()->type)=="1") { - //$items[0] = "!FNC1!0104012345012345!FNC1!081231!FNC1!1012345"; - - $tmp =explode("!FNC1!",$items[0]); - $codewithfnc1 = implode(chr(206),$tmp); - - //echo chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345"; - //$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345", $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 - $this->Code128($items->attributes()->x, $items->attributes()->y, $codewithfnc1, $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 - //$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206).$items[0], $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 + else if ((String)($items->attributes()->type)=="GS1-128") { + //$items[0] = "!FNC1!0104012345012345!FNC1!081231!FNC1!1012345"; + $tmp =explode("!FNC1!",$items[0]); + $codewithfnc1 = implode(chr(206),$tmp); + //echo chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345"; + //$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345", $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 + $this->Code128($items->attributes()->x, $items->attributes()->y, $codewithfnc1, $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 + //$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206).$items[0], $items->attributes()->width, $items->attributes()->size); // 206 = FNC1 } - else { // standard auf 2 bzw default - $this->Code39($items->attributes()->x,$items->attributes()->y, $items[0], 0.5, $items->attributes()->size);//, $printText=false) + else { // standard Type 2, Code39 + if (isset($items->attributes()->linewidth)) { + $baseline = $items->attributes()->linewidth; + } else { + $baseline = 0.5; + } + $this->Code39($items->attributes()->x,$items->attributes()->y, $items[0], $baseline, $items->attributes()->size);//, $printText=false) } break; diff --git a/www/pages/content/lager_etikettenlist.tpl b/www/pages/content/lager_etikettenlist.tpl index 8361fcef..d4a8fe65 100644 --- a/www/pages/content/lager_etikettenlist.tpl +++ b/www/pages/content/lager_etikettenlist.tpl @@ -9,6 +9,18 @@
[MESSAGE] [TAB1] +
+
+
+
+ {|Auswahl Lagerplätze|} +
+ [TABELLE] +
+  {|alle markieren|} +
+
+
@@ -17,7 +29,13 @@
{|Auswahl Etiketten|} - [FORMULAR] + + + + +
{|Etikett|}:
{|Drucker|}:
+ +
@@ -36,7 +54,7 @@
- + [TAB1NEXT] @@ -93,8 +111,12 @@ function Etikettendrucken(id, anzahl) { } } }); - - } - \ No newline at end of file +function alleauswaehlen() +{ + var wert = $('#auswahlalle').prop('checked'); + $('#lagerplatz_etiketten').find(':checkbox').prop('checked',wert); +} + + diff --git a/www/pages/lager.php b/www/pages/lager.php index bc0cce29..d863c1e6 100644 --- a/www/pages/lager.php +++ b/www/pages/lager.php @@ -1060,6 +1060,47 @@ class Lager extends GenLager { JOIN lager_platz lp2 ON lp2.id = vorschlag.storage_area_id"; break; + case 'lagerplatz_etiketten': + $allowed['lager'] = array('platz'); + + // headings + + $heading = array('','Lager', 'Bezeichnung', 'Nachschublager', 'Verbrauchslager','POS Lager', 'kein Auto-Versand','Volumen','Regalart','Kategorie','Kommissions- / Produktionslager','Menü'); + + $width = array('1%','15%','15%', '10%', '10%','5%','5%','10%','10%','5%','10%','8%','1%'); + $findcols = array('lp.id','l.bezeichnung','lp.kurzbezeichnung', "IF(lp.autolagersperre,'kein Versand aus diesem Lager','')", "IF(lp.verbrauchslager,'ja','')","IF(lp.poslager,'ja','')","IF(lp.sperrlager,'ja','')",'breite','regalart','abckategorie','a.name','id'); + $searchsql = array('lp.kurzbezeichnung','regalart','abckategorie','a.name'); + $defaultorder = 4; + $defaultorderdesc = 1; + $alignright = [10]; + + $menu = "
Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">" +// . " Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" +// . " Conf->WFconf['defaulttheme']}/images/labelprinter.png\" border=\"0\">" + ."
"; + + $box = "CONCAT('') AS `auswahl`"; + + // SQL statement + $sql = "SELECT SQL_CALC_FOUND_ROWS + lp.id, + $box, + l.bezeichnung, + lp.kurzbezeichnung, if(lp.autolagersperre,'kein Versand aus diesem Lager','') as autolagersperre, + if(lp.verbrauchslager,'ja','') as verbrauchslager, + if(lp.poslager,'ja','') as poslager, + if(lp.sperrlager,'ja','') as sperrlager, + if(lp.laenge!=0.0,CONCAT(lp.laenge,'/',lp.breite,'/',lp.hoehe),'-') as volumen, + lp.regalart,lp.abckategorie, a.name, + lp.id as menu + FROM lager_platz lp + INNER JOIN lager l ON l.id = lp.lager + LEFT JOIN adresse a ON a.id=lp.adresse "; + + // fester filter + $where = " lp.geloescht=0 AND lp.id!=0"; + $count = "SELECT COUNT(id) FROM lager_platz WHERE geloescht=0"; + break; } $erg = []; @@ -4308,7 +4349,7 @@ $check_charge=="2" || $check_charge=="1" || $check_mhd=="1") public function LagerEtikettenlist() { $this->app->erp->Headlines('','Etiketten'); - +/* $this->app->YUI->AutoComplete('von','lagerplatz'); $this->app->YUI->AutoComplete('bis','lagerplatz'); @@ -4359,19 +4400,48 @@ $check_charge=="2" || $check_charge=="1" || $check_mhd=="1") echo json_encode(array('status'=>1)); $this->app->ExitXentral(); } + */ + + // Process multi action + $auswahl = $this->app->Secure->GetPOST('auswahl'); + $drucken = $this->app->Secure->GetPOST('drucken'); + $selectedIds = []; + if(!empty($auswahl)) { + foreach($auswahl as $selectedId) { + $selectedId = (int)$selectedId; + if ($selectedId > 0) { + $selectedIds[] = $selectedId; + } + } + } + + $etikettenauswahl = $this->app->Secure->GetPOST('etikettenauswahl'); + $etikettendrucker = $this->app->Secure->GetPOST('etikettendrucker'); + + if ($drucken) { + foreach ($selectedIds as $selectedId) { +// function EtikettenDrucker($kennung,$anzahl,$tabelle,$id,$variables="",$xml="",$druckercode="",$filenameprefix="",$xmlaspdf=false,$adresse=0,$verwendenals="") + $this->app->erp->EtikettenDrucker($etikettenauswahl,1,'lager_platz',$selectedId,'','',$etikettendrucker); + } + } + $this->LagerHauptmenu(); $etiketten = $this->app->erp->GetSelectEtiketten("lagerplatz_klein",$etikettenauswahl); if($etiketten=="") $etiketten=""; - + $this->app->Tpl->Set('ETIKETTENOPTIONS',$etiketten); + $drucker = $this->app->erp->GetSelectEtikettenDrucker($etikettendrucker); + $this->app->Tpl->Set('DRUCKEROPTIONS',$drucker); $druckbutton = ""; - $this->app->Tpl->Set('FORMULAR'," + /* $this->app->Tpl->Set('FORMULAR',"
{|Lagerplatz|} ({|von|}):
{|Lagerplatz|} ({|bis|}): $druckbutton
{|Etikett|}:
{|Drucker|}:
-

"); +

");*/ + + $this->app->YUI->TableSearch('TABELLE', 'lagerplatz_etiketten', 'show','','',basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', 'lager_etikettenlist.tpl'); } diff --git a/www/widgets/templates/_gen/etiketten.tpl b/www/widgets/templates/_gen/etiketten.tpl index ae5f4eaf..1aa929d3 100644 --- a/www/widgets/templates/_gen/etiketten.tpl +++ b/www/widgets/templates/_gen/etiketten.tpl @@ -35,7 +35,9 @@
- + + +
{|Textbaustein|}:<line x="5" y="1" size="3">Test</line>
{|Barcode|}:<barcode x="5" y="1" size="3" type="1">Test</barcode>
{|Barcode Code 39 (Standard)|}:<barcode x="5" y="1" linewidth="0.5" size="3" type="2">Test</barcode>
{|Barcode Code 128|}:<barcode x="5" y="1" size="3" type="1">Test</barcode>
{|Barcode Code GS1-128|}:<barcode x="5" y="1" size="3" type="GS1-128">Test</barcode>
{|QR-Code|}:<qrcode x="5" y="1" size="3" type="3">Test</qrcode>

{|Artikel klein|}:
{|Angelegt am|}:
{|Materiallager|}:
- +
- {|Aktionen|} + {|Aktionen|} - +
@@ -76,19 +76,19 @@ {|Seriennummer erstellen|}: {|Unterseriennummer erfassen|}: - +
-
+
{|Auslieferung Lager|}:
{|Bereitstellung Start|}:
{|Produktion Start|}:
{|Produktion Ende|}:
-
+
@@ -101,7 +101,7 @@ {|Freitext|} - + @@ -113,17 +113,17 @@
{|Interne Bemerkung|} -
+ - +
[MESSAGE] -
+ [FORMHANDLEREVENT]
@@ -131,9 +131,9 @@
{|Produktion [BELEGNR]|} - [STATUSICONS] + [STATUSICONS] [TEILPRODUKTIONINFO] -
+
@@ -143,13 +143,13 @@
- {|Zu produzierende Artikel|} - {|Produktionsfortschritt|} + {|Zu produzierende Artikel|} + {|Produktionsfortschritt|} - + - + @@ -170,7 +170,7 @@ - +
{|Artikel|}:
{|Planmenge|}:
{|Geplant|}: [MENGE_GEPLANT]
{|Ausschuss|}:{|Ausschuss|}: [MENGE_AUSSCHUSS]
@@ -180,7 +180,7 @@
- {|Parameter|} + {|Parameter|} @@ -202,12 +202,12 @@
{|Menge|}:
- {|Anpassen|} - - - - - + {|Anpassen|} + + + + +
@@ -216,9 +216,10 @@
- {|Produzieren|} - - + {|Produzieren|} + + +
@@ -239,18 +240,18 @@
-
+
[MESSAGE] -
+ [FORMHANDLEREVENT]
- {|Positionen|} + {|Positionen|} [PRODUKTION_POSITION_SOURCE_POSITION_TABELLE] @@ -259,21 +260,21 @@ - +
{|Menge|}:
-
+
-
+
[MESSAGE] -
+ [MINIDETAILINEDIT]
-
+ diff --git a/www/pages/produktion.php b/www/pages/produktion.php index 35594b99..d97f22a9 100644 --- a/www/pages/produktion.php +++ b/www/pages/produktion.php @@ -20,12 +20,12 @@ class Produktion { return; $this->app->ActionHandlerInit($this); - $this->app->ActionHandler("list", "produktion_list"); + $this->app->ActionHandler("list", "produktion_list"); $this->app->ActionHandler("create", "produktion_edit"); // This automatically adds a "New" button $this->app->ActionHandler("edit", "produktion_edit"); $this->app->ActionHandler("copy", "produktion_copy"); $this->app->ActionHandler("minidetail", "produktion_minidetail"); - $this->app->ActionHandler("delete", "produktion_delete"); + $this->app->ActionHandler("delete", "produktion_delete"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); @@ -53,9 +53,9 @@ class Produktion { IFNULL((SELECT CONCAT(a.name_de,' (',a.nummer,')','
') FROM artikel a INNER JOIN produktion_position pp ON pp.artikel = a.id WHERE pp.stuecklistestufe = 1 AND pp.produktion = p.id LIMIT 1),''), CONCAT('',internebezeichnung,'') )"; - - $adresse = "(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1)"; - + + $adresse = "(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1)"; + $findcols = array('p.id','p.id','p.belegnr','p.kundennummer',$adresse,'p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id'); $searchsql = array('p.belegnr','p.kundennummer','p.name',$bezeichnung); @@ -63,24 +63,24 @@ class Produktion { $defaultorder = 1; $defaultorderdesc = 0; - $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; + $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; - $menu = "
" . + $menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> ". - "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . - "Conf->WFconf['defaulttheme']}/images/copy.svg\" border=\"0\">" . + "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . + "Conf->WFconf['defaulttheme']}/images/copy.svg\" border=\"0\">" . "
"; // $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.datum, p.art, p.projekt, p.belegnr, p.internet, p.bearbeiter, p.angebot, p.freitext, p.internebemerkung, p.status, p.adresse, p.name, p.abteilung, p.unterabteilung, p.strasse, p.adresszusatz, p.ansprechpartner, p.plz, p.ort, p.land, p.ustid, p.ust_befreit, p.ust_inner, p.email, p.telefon, p.telefax, p.betreff, p.kundennummer, p.versandart, p.vertrieb, p.zahlungsweise, p.zahlungszieltage, p.zahlungszieltageskonto, p.zahlungszielskonto, p.bank_inhaber, p.bank_institut, p.bank_blz, p.bank_konto, p.kreditkarte_typ, p.kreditkarte_inhaber, p.kreditkarte_nummer, p.kreditkarte_pruefnummer, p.kreditkarte_monat, p.kreditkarte_jahr, p.firma, p.versendet, p.versendet_am, p.versendet_per, p.versendet_durch, p.autoversand, p.keinporto, p.keinestornomail, p.abweichendelieferadresse, p.liefername, p.lieferabteilung, p.lieferunterabteilung, p.lieferland, p.lieferstrasse, p.lieferort, p.lieferplz, p.lieferadresszusatz, p.lieferansprechpartner, p.packstation_inhaber, p.packstation_station, p.packstation_ident, p.packstation_plz, p.packstation_ort, p.autofreigabe, p.freigabe, p.nachbesserung, p.gesamtsumme, p.inbearbeitung, p.abgeschlossen, p.nachlieferung, p.lager_ok, p.porto_ok, p.ust_ok, p.check_ok, p.vorkasse_ok, p.nachnahme_ok, p.reserviert_ok, p.bestellt_ok, p.zeit_ok, p.versand_ok, p.partnerid, p.folgebestaetigung, p.zahlungsmail, p.stornogrund, p.stornosonstiges, p.stornorueckzahlung, p.stornobetrag, p.stornobankinhaber, p.stornobankkonto, p.stornobankblz, p.stornobankbank, p.stornogutschrift, p.stornogutschriftbeleg, p.stornowareerhalten, p.stornomanuellebearbeitung, p.stornokommentar, p.stornobezahlt, p.stornobezahltam, p.stornobezahltvon, p.stornoabgeschlossen, p.stornorueckzahlungper, p.stornowareerhaltenretour, p.partnerausgezahlt, p.partnerausgezahltam, p.kennen, p.logdatei, p.bezeichnung, p.datumproduktion, p.anschreiben, p.usereditid, p.useredittimestamp, p.steuersatz_normal, p.steuersatz_zwischen, p.steuersatz_ermaessigt, p.steuersatz_starkermaessigt, p.steuersatz_dienstleistung, p.waehrung, p.schreibschutz, p.pdfarchiviert, p.pdfarchiviertversion, p.typ, p.reservierart, p.auslagerart, p.projektfiliale, p.datumauslieferung, p.datumbereitstellung, p.unterlistenexplodieren, p.charge, p.arbeitsschrittetextanzeigen, p.einlagern_ok, p.auslagern_ok, p.mhd, p.auftragmengenanpassen, p.internebezeichnung, p.mengeoriginal, p.teilproduktionvon, p.teilproduktionnummer, p.parent, p.parentnummer, p.bearbeiterid, p.mengeausschuss, p.mengeerfolgreich, p.abschlussbemerkung, p.auftragid, p.funktionstest, p.seriennummer_erstellen, p.unterseriennummern_erfassen, p.datumproduktionende, p.standardlager, p.id FROM produktion p"; // $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.belegnr, p.kundennummer, p.name, p.datum, \"SUBSELECT\", \"SUBSELECT\", p.mengeerfolgreich, \"-\", \"-\", p.projekt, p.status, p.status, p.id FROM produktion p"; - $sql = "SELECT SQL_CALC_FOUND_ROWS + $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.belegnr, p.kundennummer, ".$adresse." as name, DATE_FORMAT(datum,'%d.%m.%Y') as datum, - + ".$bezeichnung." as bezeichnung, FORMAT((SELECT SUM(menge) FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1),0,'de_DE') as soll, @@ -91,7 +91,7 @@ class Produktion { p.status, (" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`, p.id - FROM produktion p + FROM produktion p "; $where = "0"; @@ -111,9 +111,9 @@ class Produktion { else oMoreData' . $r . $name . ' = 1; - $(\'#' . $name . '\').dataTable().fnFilter( + $(\'#' . $name . '\').dataTable().fnFilter( \'\', - i, + i, 0,0 ); } @@ -132,21 +132,21 @@ class Produktion { $where .= " OR p.status IN ('freigegeben','gestartet')"; } else { - } + } $more_data3 = $this->app->Secure->GetGET("more_data3"); - if ($more_data3 == 1) { + if ($more_data3 == 1) { $where .= " OR p.status IN ('abgeschlossen')"; } else { - } + } $more_data4 = $this->app->Secure->GetGET("more_data4"); if ($more_data4 == 1) { $where .= " OR p.status IN ('storniert')"; } else { - } + } // END Toggle filters $moreinfo = true; // Allow drop down details @@ -178,24 +178,24 @@ class Produktion { if (in_array($status,array('angelegt','freigegeben'))) { $heading = array('','','Nummer', 'Artikel', 'Projekt', 'Planmenge pro Stück', 'Lager alle (verfügbar)', 'Lager (verfügbar)', 'Reserviert', 'Planmenge', 'Verbraucht', 'Menü'); - $width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%'); - $menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
"; + $width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%'); + $menu = "
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> " . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "
"; } else { $heading = array('','','Nummer', 'Artikel', 'Projekt','Planmenge pro Stück', 'Lager alle (verfügbar)', 'Lager (verfügbar)', 'Reserviert', 'Planmenge', 'Verbraucht', ''); - $width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%'); + $width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%'); $menu = ""; - } + } $alignright = array(6,7,8,9,10); $findcols = array('','p.artikel','(SELECT a.nummer FROM artikel a WHERE a.id = p.artikel LIMIT 1)','(SELECT a.name_de FROM artikel a WHERE a.id = p.artikel LIMIT 1)','projekt','stueckmenge','lageralle','lager','reserviert','menge','geliefert_menge'); $searchsql = array('p.artikel','nummer','name','projekt','lager','menge','reserviert','geliefert_menge'); - + $defaultorder = 1; $defaultorderdesc = 0; $dropnbox = "'' AS `open`, CONCAT('') AS `auswahl`"; - + $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, @@ -227,12 +227,12 @@ class Produktion { ), ')' ) - ,'' + ,'' ) as lager, FORMAT ((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel AND r.objekt = 'produktion' AND r.parameter = $id AND r.posid = p.id),0,'de_DE') as Reserviert, FORMAT(p.menge,0,'de_DE'), FORMAT(p.geliefert_menge,0,'de_DE') as geliefert_menge, - p.id + p.id FROM produktion_position p"; $where = " stuecklistestufe = 0 AND produktion = $id"; @@ -296,12 +296,12 @@ class Produktion { ), ')' ) - ,'' + ,'' ) as lager, FORMAT ((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel AND r.objekt = 'produktion' AND r.parameter = $id),0,'de_DE') as reserviert, FORMAT(SUM(p.menge),0,'de_DE') as menge, FORMAT(SUM(p.geliefert_menge),0,'de_DE') as geliefert_menge, - p.id + p.id FROM produktion_position p"; $where = " stuecklistestufe = 0 AND produktion = $id"; @@ -321,7 +321,7 @@ class Produktion { } return $erg; } - + function produktion_list() { $this->app->erp->MenuEintrag("index.php?module=produktion&action=list", "Übersicht"); $this->app->erp->MenuEintrag("index.php?module=produktion&action=create", "Neu anlegen"); @@ -332,32 +332,32 @@ class Produktion { $this->app->YUI->TableSearch('TAB1', 'produktion_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "produktion_list.tpl"); - } + } public function produktion_delete() { $id = (int) $this->app->Secure->GetGET('id'); - + // Check if storno possible -> No partial production yet $geliefert_menge = $this->app->DB->SelectArr("SELECT SUM(geliefert_menge) as menge FROM produktion_position pp WHERE pp.produktion = $id")[0]['menge']; - + if ($geliefert_menge == 0) { $sql = "UPDATE produktion SET status='storniert' WHERE id = '$id'"; $this->app->DB->Update($sql); - $this->app->Tpl->Set('MESSAGE', "
Der Eintrag wurde storniert.
"); + $this->app->Tpl->Set('MESSAGE', "
Der Eintrag wurde storniert.
"); } else { - $this->app->Tpl->Set('MESSAGE', "
Der Eintrag kann nicht storniert werden, da bereits Buchungen vorhanden sind.
"); - } + $this->app->Tpl->Set('MESSAGE', "
Der Eintrag kann nicht storniert werden, da bereits Buchungen vorhanden sind.
"); + } $this->produktion_list(); - } + } /* * Edit produktion item * If id is empty, create a new one */ - + function produktion_edit($id = NULL) { if (empty($id)) { @@ -375,25 +375,25 @@ class Produktion { $this->app->erp->MenuEintrag("index.php?module=produktion&action=edit&id=$id", "Details"); $this->app->erp->MenuEintrag("index.php?module=produktion&action=list", "Zurück zur Übersicht"); $input = $this->GetInput(); - $msg = $this->app->erp->base64_url_decode($this->app->Secure->GetGET('msg')); + $msg = $this->app->erp->base64_url_decode($this->app->Secure->GetGET('msg')); $sql = "SELECT status, belegnr, projekt, standardlager FROM produktion WHERE id = '$id'"; - $from_db = $this->app->DB->SelectArr($sql)[0]; + $from_db = $this->app->DB->SelectArr($sql)[0]; $global_status = $from_db['status']; $global_produktionsnummer = $from_db['belegnr']; - $global_projekt = $from_db['projekt']; - $global_standardlager = $from_db['standardlager']; - + $global_projekt = $from_db['projekt']; + $global_standardlager = $from_db['standardlager']; + // foreach ($input as $key => $value) { // echo($key." -> ".$value."
\n"); // } - $this->app->Tpl->Set('MESSAGE', ""); + $this->app->Tpl->Set('MESSAGE', ""); if (empty($id)) { // New item - $id = 'NULL'; - + $id = 'NULL'; + } else { } @@ -405,7 +405,7 @@ class Produktion { switch ($submit) { case 'speichern': // Write to database - + // Add checks here if (empty($input['datum'])) { @@ -427,21 +427,21 @@ class Produktion { $columns = "id, "; $values = "$id, "; $update = ""; - + $fix = ""; foreach ($input as $key => $value) { $columns = $columns.$fix.$key; $values = $values.$fix."'".$value."'"; $update = $update.$fix.$key." = '$value'"; - $fix = ", "; + $fix = ", "; } $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update; $this->app->DB->Update($sql); if ($id == 'NULL') { - + $id = $this->app->DB->GetInsertID(); if (!empty($id)) { @@ -450,25 +450,25 @@ class Produktion { $msg = $this->app->erp->base64_url_encode($msg); header("Location: index.php?module=produktion&action=edit&id=$id&msg=$msg"); } - + } else { $msg .= "
Die Einstellungen wurden erfolgreich übernommen.
"; } break; case 'planen': - - // Check - // Parse positions + + // Check + // Parse positions $sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; $produktionsartikel = $this->app->DB->SelectArr($sql); if (!empty($produktionsartikel)) { $msg .= "
Bereits geplant.
"; - break; + break; } $artikel_planen_id = $this->app->erp->ReplaceArtikel(true, $this->app->Secure->GetPOST('artikel_planen'),true); // Convert from form to artikel number - $artikel_planen_menge = $this->app->Secure->GetPOST('artikel_planen_menge'); + $artikel_planen_menge = $this->app->Secure->GetPOST('artikel_planen_menge'); if (!$artikel_planen_id) { $msg .= "
Artikel ist keine Stückliste.
"; @@ -492,28 +492,28 @@ class Produktion { break; } - foreach ($stueckliste as $key => $value) { + foreach ($stueckliste as $key => $value) { $value['menge'] = $value['menge'] * $artikel_planen_menge; $position_values[] = '('.implode(",",$value).',\'\')'; } $sql = "INSERT INTO produktion_position (produktion, artikel, menge, stuecklistestufe, projekt) VALUES ( $id, $artikel_planen_id, $artikel_planen_menge, 1, '$global_projekt'), ".implode(',',$position_values); - $this->app->DB->Update($sql); + $this->app->DB->Update($sql); $msg .= "
Planung angelegt.
"; $this->ProtokollSchreiben($id,"Produktion geplant ($artikel_planen_menge)"); - break; + break; case 'freigeben': $this->app->erp->BelegFreigabe("produktion",$id); $this->ProtokollSchreiben($id,'Produktion freigegeben'); break; case 'reservieren': - + // Check quantities and reserve for every position if($global_standardlager == 0) { - break; + break; } $fortschritt = $this->MengeFortschritt($id,$global_standardlager); @@ -530,16 +530,16 @@ class Produktion { foreach ($materialbedarf as $materialbedarf_position) { // Calculate new needed quantity if there is scrap - $materialbedarf_position['menge'] = $materialbedarf_position['menge']*($fortschritt['ausschuss']+$fortschritt['geplant'])/$fortschritt['geplant']; + $materialbedarf_position['menge'] = $materialbedarf_position['menge']*($fortschritt['ausschuss']+$fortschritt['geplant'])/$fortschritt['geplant']; - $result = $this->ArtikelReservieren($materialbedarf_position['artikel'], $global_standardlager, $materialbedarf_position['menge']-$materialbedarf_position['geliefert_menge'], 0, 'produktion', $id, $materialbedarf_position['id'],"Produktion $global_produktionsnummer"); + $result = $this->ArtikelReservieren($materialbedarf_position['artikel'], $global_standardlager, $materialbedarf_position['menge']-$materialbedarf_position['geliefert_menge'], 0, 'produktion', $id, $materialbedarf_position['id'],"Produktion $global_produktionsnummer"); if ($result > 0) { - $reservierung_durchgefuehrt = true; - } - } + $reservierung_durchgefuehrt = true; + } + } // Message output - if ($reservierung_durchgefuehrt) { + if ($reservierung_durchgefuehrt) { $msg .= "
Reservierung durchgeführt.
"; } else { $msg .= "
Keine Reservierung durchgeführt!
"; @@ -560,11 +560,11 @@ class Produktion { $menge_produzieren = $this->app->Secure->GetPOST('menge_produzieren'); if (empty($menge_produzieren)) { $menge_produzieren = 0; - } - $menge_ausschuss = $this->app->Secure->GetPOST('menge_ausschuss_produzieren'); + } + $menge_ausschuss = $this->app->Secure->GetPOST('menge_ausschuss_produzieren'); if (empty($menge_ausschuss)) { $menge_ausschuss = 0; - } + } $menge_plan = $produktionsartikel_position['menge']; $menge_geliefert = $produktionsartikel_position['geliefert_menge']; @@ -607,16 +607,16 @@ class Produktion { } // Update position - $sql = "UPDATE produktion_position SET geliefert_menge = geliefert_menge + $menge_artikel_auslagern WHERE id = ".$material_position['id']; + $sql = "UPDATE produktion_position SET geliefert_menge = geliefert_menge + $menge_artikel_auslagern WHERE id = ".$material_position['id']; $this->app->DB->Update($sql); - } + } if ($error) { break; } - // Insert produced parts into stock + // Insert produced parts into stock // Check target stock, if not existing, use default stock of article, if not given use production stock @@ -627,19 +627,19 @@ class Produktion { if (!empty($ziellager_from_form)) { $sql = "SELECT id FROM lager_platz WHERE id = ".$ziellager_from_form; - $result = $this->app->DB->SelectArr($sql); - if (!empty($result)) { + $result = $this->app->DB->SelectArr($sql); + if (!empty($result)) { $ziellager = $ziellager_from_form; } else { $use_artikel_lager = true; } } else { - $use_artikel_lager = true; + $use_artikel_lager = true; } - if ($use_artikel_lager) { + if ($use_artikel_lager) { $sql = "SELECT lager_platz FROM artikel WHERE id = ".$produktionsartikel_position['artikel']; - $result = $this->app->DB->SelectArr($sql); + $result = $this->app->DB->SelectArr($sql); if (!empty($result) && !empty($result[0]['lager_platz'])) { $ziellager = $result[0]['lager_platz']; } else { @@ -649,7 +649,7 @@ class Produktion { } $sql = "SELECT kurzbezeichnung FROM lager_platz WHERE id = $ziellager"; - $lagername = $this->app->DB->SelectArr($sql)[0]['kurzbezeichnung']; + $lagername = $this->app->DB->SelectArr($sql)[0]['kurzbezeichnung']; // ERPAPI // function LagerEinlagern($artikel,$menge,$regal,$projekt,$grund="",$importer="",$paketannahme="",$doctype = "", $doctypeid = 0, $vpeid = 0, $permanenteinventur = 0, $adresse = 0) @@ -726,14 +726,14 @@ class Produktion { $columns = ""; $values = ""; $update = ""; - + $fix = ""; foreach ($produktion_neu as $key => $value) { $columns = $columns.$fix.$key; $values = $values.$fix."'".$value."'"; $update = $update.$fix.$key." = '$value'"; - $fix = ", "; + $fix = ", "; } $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.")"; @@ -742,7 +742,7 @@ class Produktion { // Now add the positions $sql = "SELECT * FROM produktion_position WHERE produktion = $id"; - $positionen = $this->app->DB->SelectArr($sql); + $positionen = $this->app->DB->SelectArr($sql); foreach ($positionen as $position) { @@ -802,20 +802,20 @@ class Produktion { break; case 'leeren': - + if ($global_status == 'angelegt' || $global_status == 'freigegeben') { $sql = "SELECT id, artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0"; $material = $this->app->DB->SelectArr($sql); - foreach ($material as $material_position) { + foreach ($material as $material_position) { // Remove reservation $result = $this->ArtikelReservieren($material_position['artikel'],$global_standardlager,0,0,'produktion',$id,$material_position['id'],"Produktion $global_produktionsnummer"); } $sql = "DELETE FROM produktion_position WHERE produktion = $id"; - $this->app->DB->Update($sql); - $msg .= "
Planung geleert.
"; + $this->app->DB->Update($sql); + $msg .= "
Planung geleert.
"; } else { - $msg .= "
Planung kann nicht geleert werden.
"; - } + $msg .= "
Planung kann nicht geleert werden.
"; + } break; case 'anpassen': @@ -842,31 +842,55 @@ class Produktion { $this->ProtokollSchreiben($id,"Menge angepasst auf ".$this->FormatMenge($menge_anpassen)); - break; + break; case 'abschliessen': $sql = "UPDATE produktion SET status = 'abgeschlossen' WHERE id=$id"; - $this->app->DB->Update($sql); + $this->app->DB->Update($sql); $sql = "SELECT id, artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0"; $material = $this->app->DB->SelectArr($sql); - foreach ($material as $material_position) { + foreach ($material as $material_position) { // Remove reservation $result = $this->ArtikelReservieren($material_position['artikel'],$global_standardlager,0,0,'produktion',$id,$material_position['id'],"Produktion $global_produktionsnummer"); } - + $this->ProtokollSchreiben($id,'Produktion abgeschlossen'); break; + case 'etikettendrucken': - } + $menge_drucken = $this->app->Secure->GetPOST('menge_produzieren'); + if ($menge_drucken) { + $sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; + $produktionsartikel_position = $this->app->DB->SelectArr($sql)[0]; + $produktionsartikel_id = $produktionsartikel_position['artikel']; + + $sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion' AND al.article_id = ".$produktionsartikel_id; + $produktionsetiketten = $this->app->DB->SelectArr($sql); + + if (!empty($produktionsetiketten)) { + foreach ($produktionsetiketten as $produktionsetikett) { + $this->app->erp->EtikettenDrucker( + kennung: $produktionsetikett['label_id'], + anzahl: $menge_drucken*$produktionsetikett['amount'], + tabelle: 'artikel', + id: $produktionsartikel_id, + variables: null, + druckercode: $produktionsetikett['printer_id'] + ); + } + } + } + break; + } } - + // Load values again from database // toDo: cleanup - $sql = "SELECT SQL_CALC_FOUND_ROWS + $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, (SELECT pp.bezeichnung FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1 LIMIT 1) as artikelname, p.datum, @@ -1027,12 +1051,12 @@ class Produktion { $produktion_from_db = $this->app->DB->SelectArr($sql)[0]; foreach ($produktion_from_db as $key => $value) { - $this->app->Tpl->Set(strtoupper($key), $value); + $this->app->Tpl->Set(strtoupper($key), $value); } - + /* * Add displayed items later - */ + */ $this->StatusBerechnen((int)$id); @@ -1099,24 +1123,25 @@ class Produktion { AKTION_FREIGEBEN_VISIBLE AKTION_RESERVIEREN_VISIBLE AKTION_PRODUZIEREN_VISIBLE + AKTION_ETIKETTEN_DRUCKEN_DISABLED AKTION_ABSCHLIESSEN_VISIBLE POSITIONEN_TAB_VISIBLE */ - // Reparse positions + // Reparse positions $sql = "SELECT id,artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; $produktionsartikel_position = $this->app->DB->SelectArr($sql)[0]; // Not planned if (empty($produktionsartikel_position)) { - $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); - $this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden'); + $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); + $this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden'); - $this->app->Tpl->Set('AKTION_LEEREN_VISIBLE','hidden'); - $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); - $this->app->Tpl->Set('AKTION_TEILEN_VISIBLE','hidden'); - } else { + $this->app->Tpl->Set('AKTION_LEEREN_VISIBLE','hidden'); + $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); + $this->app->Tpl->Set('AKTION_TEILEN_VISIBLE','hidden'); + } else { // Planned $fortschritt = $this->MengeFortschritt((int) $id, 0); @@ -1144,19 +1169,29 @@ class Produktion { $produktionsartikel = $this->app->DB->SelectArr($sql)[0]; $produktionsartikel_name = $produktionsartikel['name_de']; $produktionsartikel_nummer = $produktionsartikel['nummer']; - } + + $sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion'"; + + + $sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; + + $sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion' AND al.article_id = ".$produktionsartikel_id; + $produktionsetiketten = $this->app->DB->SelectArr($sql); + } + + if (empty($produktionsetiketten)) { + $this->app->Tpl->Set('AKTION_ETIKETTEN_DRUCKEN_DISABLED','disabled'); + } if (empty($produktion_from_db['belegnr'])) { $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', 'ENTWURF - '.$produktionsartikel_name." (".$produktionsartikel_nummer.")"); } else { - $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktion_from_db['belegnr']." ".$produktionsartikel_name." (".$produktionsartikel_nummer.")"); + $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktion_from_db['belegnr']." ".$produktionsartikel_name." (".$produktionsartikel_nummer.")", html: true); } - $this->app->Tpl->SetText('ARTIKELNAME', $produktionsartikel_name); - // Action menu switch ($produktion_from_db['status']) { - case 'angelegt': + case 'angelegt': $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_ABSCHLIESSEN_VISIBLE','hidden'); @@ -1172,7 +1207,7 @@ class Produktion { case 'abgeschlossen': case 'storniert': $this->app->Tpl->Set('AKTION_SPEICHERN_DISABLED','disabled'); - $this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden'); + $this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden'); @@ -1196,7 +1231,7 @@ class Produktion { /* Create a copy as draft */ - + function produktion_copy() { $id = (int) $this->app->Secure->GetGET('id'); if (empty($id)) { @@ -1205,14 +1240,14 @@ class Produktion { $result = $this->Copy($id,0); if ($result <= 0) { $msg .= "
Fehler beim Anlegen der Kopie.
"; - $this->app->Tpl->Set('MESSAGE', $msg); + $this->app->Tpl->Set('MESSAGE', $msg); $this->produktion_list(); } else { $msg .= "
Kopie angelegt. $result new $id old
"; - $this->app->Tpl->Set('MESSAGE', $msg); + $this->app->Tpl->Set('MESSAGE', $msg); $this->produktion_edit((int) $result); - } + } } public function produktion_minidetail($parsetarget='',$menu=true) { @@ -1252,16 +1287,16 @@ class Produktion { $input['kundennummer'] = $this->app->Secure->GetPOST('kundennummer'); $input['projekt'] = $this->app->Secure->GetPOST('projekt'); $input['auftragid'] = $this->app->Secure->GetPOST('auftragid'); - $input['internebezeichnung'] = $this->app->Secure->GetPOST('internebezeichnung'); + $input['internebezeichnung'] = $this->app->Secure->GetPOST('internebezeichnung'); $input['datum'] = $this->app->Secure->GetPOST('datum'); $input['standardlager'] = $this->app->Secure->GetPOST('standardlager'); $input['standardlager'] = $this->app->erp->ReplaceLagerPlatz(true,$input['standardlager'],true); // Parameters: Target db?, value, from form? $input['reservierart'] = $this->app->Secure->GetPOST('reservierart'); - $input['auslagerart'] = $this->app->Secure->GetPOST('auslagerart'); + $input['auslagerart'] = $this->app->Secure->GetPOST('auslagerart'); $input['unterlistenexplodieren'] = $this->app->Secure->GetPOST('unterlistenexplodieren'); - $input['funktionstest'] = $this->app->Secure->GetPOST('funktionstest'); + $input['funktionstest'] = $this->app->Secure->GetPOST('funktionstest'); $input['arbeitsschrittetextanzeigen'] = $this->app->Secure->GetPOST('arbeitsschrittetextanzeigen'); $input['seriennummer_erstellen'] = $this->app->Secure->GetPOST('seriennummer_erstellen'); @@ -1306,7 +1341,7 @@ class Produktion { $sql = "SELECT SUM(menge) as menge FROM lager_reserviert r WHERE lager_platz=$lager AND artikel = $artikel AND r.objekt = 'produktion' AND r.parameter = $produktion_id"; $menge_reserviert_diese = $this->app->DB->SelectArr($sql)[0]['menge']; - + if ($only_reservations) { $menge_verfuegbar = $menge_reserviert_diese; } else { @@ -1329,8 +1364,8 @@ class Produktion { } // echo("------------------------Lager $lager a $artikel menge_plan_artikel $menge_plan_artikel menge_geliefert $menge_geliefert menge_lager $menge_lager menge_reserviert_diese $menge_reserviert_diese menge_reserviert_gesamt $menge_reserviert_gesamt menge_verfuegbar $menge_verfuegbar menge_moeglich_artikel $menge_moeglich_artikel menge_moeglich $menge_moeglich
"); - - } + + } if ($menge_moeglich < 0) { $menge_moeglich = 0; @@ -1338,7 +1373,7 @@ class Produktion { return($menge_moeglich); - } + } // Modify or add reservation // If quantity is negative, the existing reservation will be reduced @@ -1367,18 +1402,18 @@ class Produktion { if ($menge_lager == null) { $menge_lager = 0; } - + if ($menge_reservieren < 0) { // Relative reduction $menge_reservieren = $menge_reserviert_diese+$menge_reservieren; - - if ($menge_reservieren < 0) { + + if ($menge_reservieren < 0) { $menge_reservieren = 0; - } - } + } + } if (($menge_reservieren == 0) && ($menge_reservieren_limit <= 0)) { $sql = "DELETE FROM lager_reserviert WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id"; - $this->app->DB->Update($sql); + $this->app->DB->Update($sql); return(0); } @@ -1391,7 +1426,7 @@ class Produktion { // Nothing to do return($menge_reserviert_diese); } - } + } if ($menge_lager_reservierbar > 0) { if ($menge_reserviert_diese > 0) { @@ -1399,9 +1434,9 @@ class Produktion { if ($menge_reservieren > $menge_lager_reservierbar) { $menge_reservieren = $menge_lager_reservierbar; // Take all that is there } - $sql = "UPDATE lager_reserviert SET menge = $menge_reservieren WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id"; - $this->app->DB->Update($sql); - } else { + $sql = "UPDATE lager_reserviert SET menge = $menge_reservieren WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id"; + $this->app->DB->Update($sql); + } else { // Create new entry if ($menge_reservieren > $menge_lager_reservierbar) { $menge_reservieren = $menge_lager_reservierbar; // Take all that is there @@ -1415,15 +1450,15 @@ class Produktion { $lager.",". "'$text'". ")"; - $this->app->DB->Update($sql); - } + $this->app->DB->Update($sql); + } } else { $menge_reservieren = 0; - } + } return ($menge_reservieren); - } + } /* @@ -1450,7 +1485,7 @@ class Produktion { // Process positions $sql = "SELECT * FROM produktion_position WHERE produktion = $produktion_id"; - $positionen = $this->app->DB->SelectArr($sql); + $positionen = $this->app->DB->SelectArr($sql); foreach ($positionen as $position) { $menge_pro_stueck = $position['menge']/$produktionsmengen_alt['menge']; @@ -1519,7 +1554,7 @@ class Produktion { return($result); } - + // Do calculations for the status icon display // id = 0 for all open ones function StatusBerechnen(int $produktion_id) { @@ -1532,7 +1567,7 @@ class Produktion { $sql = "SELECT id, lager_ok, reserviert_ok, auslagern_ok, einlagern_ok, zeit_ok, versand_ok FROM produktion ".$where; $produktionen = $this->app->DB->SelectArr($sql); - + foreach ($produktionen as $produktion) { $produktion_id = $produktion['id']; @@ -1600,9 +1635,9 @@ class Produktion { } } - // Copy an existing produktion as draft, with option to adjust the quantity + // Copy an existing produktion as draft, with option to adjust the quantity // return id on sucess, else negative number - + function Copy($produktion_id, $menge_abteilen) : int { if (empty($produktion_id)) { @@ -1644,8 +1679,8 @@ class Produktion { } else { $produktion_neu['internebezeichnung '] = $produktion_alt['internebezeichnung']; } - - $produktion_neu['standardlager'] = $produktion_alt['standardlager']; + + $produktion_neu['standardlager'] = $produktion_alt['standardlager']; $columns = ""; @@ -1658,7 +1693,7 @@ class Produktion { $columns = $columns.$fix.$key; $values = $values.$fix."'".$value."'"; $update = $update.$fix.$key." = '$value'"; - $fix = ", "; + $fix = ", "; } $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.")"; @@ -1667,7 +1702,7 @@ class Produktion { // Now add the positions $sql = "SELECT * FROM produktion_position WHERE produktion = $produktion_id"; - $positionen = $this->app->DB->SelectArr($sql); + $positionen = $this->app->DB->SelectArr($sql); foreach ($positionen as $position) { @@ -1699,7 +1734,7 @@ class Produktion { Write something into the log */ function ProtokollSchreiben(int $produktion_id, string $text) { - $sql = "INSERT INTO produktion_protokoll (produktion, zeit, bearbeiter, grund) VALUES ($produktion_id, NOW(), '".$this->app->DB->real_escape_string($this->app->User->GetName())."','".$this->app->DB->real_escape_string($text)."')"; + $sql = "INSERT INTO produktion_protokoll (produktion, zeit, bearbeiter, grund) VALUES ($produktion_id, NOW(), '".$this->app->DB->real_escape_string($this->app->User->GetName())."','".$this->app->DB->real_escape_string($text)."')"; $this->app->DB->Insert($sql); } From c2dbc20f37944fd177c7fdb2965b856206ef5db2 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 6 Feb 2025 18:00:21 +0100 Subject: [PATCH 18/22] produktion added overview PDF print --- upgrade/data/db_schema.json | 11 +++++++ www/lib/class.erpapi.php | 1 + www/pages/content/produktion_edit.tpl | 4 +-- www/pages/produktion.php | 45 +++++++++++++++++++-------- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index 5484bc0b..31427fdd 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -70961,6 +70961,17 @@ "Extra": "", "Privileges": "select,insert,update,references", "Comment": "" + }, + { + "Field": "sprache", + "Type": "varchar(32)", + "Collation": "utf8mb3_general_ci", + "Null": "NO", + "Key": "", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" } ], "keys": [ diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index d758f98a..25968da1 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -25361,6 +25361,7 @@ function MailSendFinal($from,$from_name,$to,$to_name,$betreff,$text,$files="",$p $uebersetzung['dokument_lieferschein']['deutsch'] = "Lieferschein"; $uebersetzung['dokument_retoure']['deutsch'] = "Retoure"; $uebersetzung['dokument_kommissionierschein']['deutsch'] = "Kommissionierschein"; + $uebersetzung['dokument_produktion']['deutsch'] = "Produktion"; $uebersetzung['dokument_ansprechpartner']['deutsch'] = "Ansprechpartner"; $uebersetzung['dokument_rechnungsdatum']['deutsch'] = "Rechnungsdatum"; $uebersetzung['dokument_proformarechnungsdatum']['deutsch'] = "Datum"; diff --git a/www/pages/content/produktion_edit.tpl b/www/pages/content/produktion_edit.tpl index 3befb3d3..0d926ba7 100644 --- a/www/pages/content/produktion_edit.tpl +++ b/www/pages/content/produktion_edit.tpl @@ -29,9 +29,9 @@
{|Allgemein|} - + - +
{|Kunde|}:
{|Kunde|}:
{|Projekt|}:
{|Auftrag|}:
{|Auftrag|}:
{|Interne Bezeichnung|}:
diff --git a/www/pages/produktion.php b/www/pages/produktion.php index d97f22a9..7c329792 100644 --- a/www/pages/produktion.php +++ b/www/pages/produktion.php @@ -26,6 +26,7 @@ class Produktion { $this->app->ActionHandler("copy", "produktion_copy"); $this->app->ActionHandler("minidetail", "produktion_minidetail"); $this->app->ActionHandler("delete", "produktion_delete"); + $this->app->ActionHandler("pdf", "produktion_pdf"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); @@ -54,9 +55,7 @@ class Produktion { CONCAT('',internebezeichnung,'') )"; - $adresse = "(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1)"; - - $findcols = array('p.id','p.id','p.belegnr','p.kundennummer',$adresse,'p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id'); + $findcols = array('p.id','p.id','p.belegnr','adresse.kundennummer','adresse.name','p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id'); $searchsql = array('p.belegnr','p.kundennummer','p.name',$bezeichnung); @@ -69,16 +68,18 @@ class Produktion { "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"> ". "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . "Conf->WFconf['defaulttheme']}/images/copy.svg\" border=\"0\">" . + "Conf->WFconf['defaulttheme']}/images/pdf.svg\" border=\"0\">". "
"; + // $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.datum, p.art, p.projekt, p.belegnr, p.internet, p.bearbeiter, p.angebot, p.freitext, p.internebemerkung, p.status, p.adresse, p.name, p.abteilung, p.unterabteilung, p.strasse, p.adresszusatz, p.ansprechpartner, p.plz, p.ort, p.land, p.ustid, p.ust_befreit, p.ust_inner, p.email, p.telefon, p.telefax, p.betreff, p.kundennummer, p.versandart, p.vertrieb, p.zahlungsweise, p.zahlungszieltage, p.zahlungszieltageskonto, p.zahlungszielskonto, p.bank_inhaber, p.bank_institut, p.bank_blz, p.bank_konto, p.kreditkarte_typ, p.kreditkarte_inhaber, p.kreditkarte_nummer, p.kreditkarte_pruefnummer, p.kreditkarte_monat, p.kreditkarte_jahr, p.firma, p.versendet, p.versendet_am, p.versendet_per, p.versendet_durch, p.autoversand, p.keinporto, p.keinestornomail, p.abweichendelieferadresse, p.liefername, p.lieferabteilung, p.lieferunterabteilung, p.lieferland, p.lieferstrasse, p.lieferort, p.lieferplz, p.lieferadresszusatz, p.lieferansprechpartner, p.packstation_inhaber, p.packstation_station, p.packstation_ident, p.packstation_plz, p.packstation_ort, p.autofreigabe, p.freigabe, p.nachbesserung, p.gesamtsumme, p.inbearbeitung, p.abgeschlossen, p.nachlieferung, p.lager_ok, p.porto_ok, p.ust_ok, p.check_ok, p.vorkasse_ok, p.nachnahme_ok, p.reserviert_ok, p.bestellt_ok, p.zeit_ok, p.versand_ok, p.partnerid, p.folgebestaetigung, p.zahlungsmail, p.stornogrund, p.stornosonstiges, p.stornorueckzahlung, p.stornobetrag, p.stornobankinhaber, p.stornobankkonto, p.stornobankblz, p.stornobankbank, p.stornogutschrift, p.stornogutschriftbeleg, p.stornowareerhalten, p.stornomanuellebearbeitung, p.stornokommentar, p.stornobezahlt, p.stornobezahltam, p.stornobezahltvon, p.stornoabgeschlossen, p.stornorueckzahlungper, p.stornowareerhaltenretour, p.partnerausgezahlt, p.partnerausgezahltam, p.kennen, p.logdatei, p.bezeichnung, p.datumproduktion, p.anschreiben, p.usereditid, p.useredittimestamp, p.steuersatz_normal, p.steuersatz_zwischen, p.steuersatz_ermaessigt, p.steuersatz_starkermaessigt, p.steuersatz_dienstleistung, p.waehrung, p.schreibschutz, p.pdfarchiviert, p.pdfarchiviertversion, p.typ, p.reservierart, p.auslagerart, p.projektfiliale, p.datumauslieferung, p.datumbereitstellung, p.unterlistenexplodieren, p.charge, p.arbeitsschrittetextanzeigen, p.einlagern_ok, p.auslagern_ok, p.mhd, p.auftragmengenanpassen, p.internebezeichnung, p.mengeoriginal, p.teilproduktionvon, p.teilproduktionnummer, p.parent, p.parentnummer, p.bearbeiterid, p.mengeausschuss, p.mengeerfolgreich, p.abschlussbemerkung, p.auftragid, p.funktionstest, p.seriennummer_erstellen, p.unterseriennummern_erfassen, p.datumproduktionende, p.standardlager, p.id FROM produktion p"; // $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.belegnr, p.kundennummer, p.name, p.datum, \"SUBSELECT\", \"SUBSELECT\", p.mengeerfolgreich, \"-\", \"-\", p.projekt, p.status, p.status, p.id FROM produktion p"; $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.belegnr, - p.kundennummer, - ".$adresse." as name, + adresse.kundennummer, + adresse.name as name, DATE_FORMAT(datum,'%d.%m.%Y') as datum, ".$bezeichnung." as bezeichnung, @@ -92,6 +93,7 @@ class Produktion { (" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`, p.id FROM produktion p + LEFT JOIN adresse ON adresse.id = p.adresse "; $where = "0"; @@ -422,6 +424,10 @@ class Produktion { $input['datumbereitstellung'] = $this->app->erp->ReplaceDatum(true,$input['datumbereitstellung'],true); $input['datumproduktion'] = $this->app->erp->ReplaceDatum(true,$input['datumproduktion'],true); $input['datumproduktionende'] = $this->app->erp->ReplaceDatum(true,$input['datumproduktionende'],true); + + $input['adresse'] = $this->app->erp->ReplaceKunde(true,$input['adresse'],true); + $input['auftragid'] = $this->app->erp->ReplaceAuftrag(true,$input['auftrag'],true); + unset($input['auftrag']); $input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],true); $columns = "id, "; @@ -438,6 +444,7 @@ class Produktion { } $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update; + $this->app->DB->Update($sql); if ($id == 'NULL') { @@ -861,6 +868,7 @@ class Produktion { case 'etikettendrucken': $menge_drucken = $this->app->Secure->GetPOST('menge_produzieren'); + if ($menge_drucken) { $sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; $produktionsartikel_position = $this->app->DB->SelectArr($sql)[0]; @@ -881,12 +889,13 @@ class Produktion { ); } } - } + } else { + $msg .= "
Ungültige Menge.
"; + } break; } } - // Load values again from database // toDo: cleanup @@ -1082,10 +1091,12 @@ class Produktion { } $this->app->Tpl->Set('PROJEKT',$this->app->erp->ReplaceProjekt(false,$produktion_from_db['projekt'],false)); + $this->app->Tpl->Set('ADRESSE',$this->app->erp->ReplaceKunde(false,$produktion_from_db['adresse'],false)); + $this->app->Tpl->Set('AUFTRAG',$this->app->erp->ReplaceAuftrag(false,$produktion_from_db['auftragid'],false)); $this->app->YUI->AutoComplete("projekt", "projektname", 1); - $this->app->YUI->AutoComplete("kundennummer", "kunde", 1); - $this->app->YUI->AutoComplete("auftragid", "auftrag", 1); + $this->app->YUI->AutoComplete("adresse", "kunde", 1); + $this->app->YUI->AutoComplete("auftrag", "auftrag", 1); $this->app->YUI->AutoComplete("artikel_planen", "stuecklistenartikel"); $this->app->YUI->AutoComplete("artikel_hinzu", "artikelnummer"); @@ -1284,9 +1295,10 @@ class Produktion { public function GetInput(): array { $input = array(); - $input['kundennummer'] = $this->app->Secure->GetPOST('kundennummer'); - $input['projekt'] = $this->app->Secure->GetPOST('projekt'); - $input['auftragid'] = $this->app->Secure->GetPOST('auftragid'); + $input['adresse'] = $this->app->Secure->GetPOST('adresse'); + $input['projekt'] = $this->app->Secure->GetPOST('projekt'); + $input['auftrag'] = $this->app->Secure->GetPOST('auftrag'); + $input['internebezeichnung'] = $this->app->Secure->GetPOST('internebezeichnung'); $input['datum'] = $this->app->Secure->GetPOST('datum'); @@ -1668,7 +1680,7 @@ class Produktion { $produktion_neu['art'] = $produktion_alt['art']; $produktion_neu['projekt'] = $produktion_alt['projekt']; $produktion_neu['angebot'] = $produktion_alt['angebot']; - $produktion_neu['kundennummer'] = $produktion_alt['kundennummer']; + $produktion_neu['adresse'] = $produktion_alt['adresse']; $produktion_neu['auftragid'] = $produktion_alt['auftragid']; $produktion_neu['freitext'] = $produktion_alt['freitext']; $produktion_neu['internebemerkung'] = $produktion_alt['internebemerkung']; @@ -1745,6 +1757,13 @@ class Produktion { $tmp->DisplayNew($parsetarget,'Protokoll','noAction'); } + function produktion_pdf() { + $id = $this->app->Secure->GetGET('id'); + $Brief = new ProduktionPDF($this->app, styleData: Array('herstellernummerimdokument' => 1, 'ohne_steuer' => true, 'artikeleinheit' => false, 'abstand_boxrechtsoben' => -70, 'abstand_artikeltabelleoben' => -80, 'abstand_betreffzeileoben' => -70, 'preise_ausblenden' => true, 'hintergrund' => 'none')); + $Brief->GetProduktion($id); + $Brief->displayDocument(false); + exit(); + } } From 0dd54fe09998fc08cd0a39d064e5b6b6e650f60d Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 6 Feb 2025 18:19:41 +0100 Subject: [PATCH 19/22] produktion PDF class --- www/lib/dokumente/class.produktion.php | 244 +++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 www/lib/dokumente/class.produktion.php diff --git a/www/lib/dokumente/class.produktion.php b/www/lib/dokumente/class.produktion.php new file mode 100644 index 00000000..3108727b --- /dev/null +++ b/www/lib/dokumente/class.produktion.php @@ -0,0 +1,244 @@ + +app=$app; + //parent::Briefpapier(); + $this->doctype="produktion"; + $this->doctypeOrig="produktion"; + parent::__construct($this->app,$projekt,$styleData); + } + + /** + * @param array $articleList + * + * @return array + */ + protected function sortAricleExploded($articleList) + { + if(empty($articleList)) { + return $articleList; + } + + $ret = []; + + $articleIdToKey = []; + $children = []; + foreach($articleList as $aricleKey => $article) { + $articleIdToKey[$article['id']] = $aricleKey; + if(!empty($article['explodiert_parent_artikel'])) { + $children[$article['explodiert_parent']][] = $aricleKey; + } + elseif(empty($ret)) { + $ret[] = $article; + unset($articleList[$aricleKey]); + } + } + if(empty($ret)) { + $ret[] = reset($articleList); + $key = array_keys($articleList); + $key = reset($key); + unset($articleList[$key]); + } + + while(!empty($articleList)) { + $cRet = count($ret); + for($i = $cRet -1; $i >= 0; $i--) { + $last= $ret[$i]; + if(!empty($children[$last['id']])) { + $child = reset($children[$last['id']]); + $childKey = array_keys($children[$last['id']]); + $childKey = reset($childKey); + $ret[] = $articleList[$child]; + unset($articleList[$child]); + unset($children[$last['id']][$childKey]); + break; + } + } + + if($cRet === count($ret)) { + $ret[] = reset($articleList); + $key = array_keys($articleList); + $key = reset($key); + unset($articleList[$key]); + } + } + + return $ret; + } + + + function GetProduktion($id,$info="",$extrafreitext="") + { + $this->doctypeid = $id; + $this->id = $id; + $this->table = 'produktion'; // Alles doppelt und dreifach... $#%#! + $this->parameter = $info; + $this->nichtsichtbar_summe = true; +// $this->nichtsichtbar_box = true; + $this->nichtsichtbar_empfaenger = true; + $this->nichtsichtbar_zeileabsender = true; + $this->nichtsichtbar_footer = true; + + $briefpapier_bearbeiter_ausblenden = $this->app->erp->Firmendaten('briefpapier_bearbeiter_ausblenden'); + $briefpapier_vertrieb_ausblenden = $this->app->erp->Firmendaten('briefpapier_vertrieb_ausblenden'); + $lvl = null; + + $data = $this->app->DB->SelectRow(" + SELECT + a.name as adressname, + DATE_FORMAT(p.datum,'%d.%m.%Y') as datum, + p.belegnr, + p.freitext, + p.internebemerkung, + p.bearbeiter, + p.internebezeichnung, + auf.belegnr auftragsnummer, + projekt.name projekt + FROM + produktion p + LEFT JOIN + adresse a + ON + a.id = p.adresse + LEFT JOIN + auftrag auf + ON + auf.id = p.auftragid + LEFT JOIN projekt ON projekt.id = p.projekt + WHERE p.id='$id' + "); + + $this->zusatzfooter = " (PD".$data['belegnr'].")"; + + $this->doctypeOrig = $this->app->erp->Beschriftung("dokument_produktion") ." ".$data['belegnr']; + + $produktionsartikel = $this->app->DB->SelectRow(" + SELECT + a.name_de, + a.nummer, + a.internerkommentar, + a.hinweis_einfuegen + FROM + produktion p + INNER JOIN produktion_position pp ON p.id = pp.produktion + INNER JOIN artikel a ON a.id = pp.artikel + WHERE pp.stuecklistestufe = 1 + "); + + $bodytexte = Array(); + if (!empty($produktionsartikel['internerkommentar'])) { + $bodytext['Artikelkommentar'] = $produktionsartikel['internerkommentar']; + } + if (!empty($produktionsartikel['hinweis_einfuegen'])) { + $bodytext['Artikelhinweis'] = $produktionsartikel['hinweis_einfuegen']; + } + if (!empty($data['freitext'])) { + $bodytext['Freitext'] = $data['freitext']; + } + if (!empty($data['internebemerkung'])) { + $bodytext['Interne Bemerkung'] = $data['internebemerkung']; + } + + $nlbr = ""; + foreach ($bodytext as $key => $value) { + $body .= $nlbr.$key.":\n".$value; + $nlbr = "\n\n"; + } + + $artikel = $this->app->DB->SelectArr( + sprintf( + "SELECT + p.id, + a.nummer as itemno, + a.name_de as name, + a.herstellernummer, + TRIM(pp.menge)+0 as amount, + '' as steuersatz_ermaessigt, + DATE_FORMAT(datum,'%%Y%%m%%d') as datum + FROM + produktion p + INNER JOIN produktion_position pp ON p.id = pp.produktion + INNER JOIN artikel a ON a.id = pp.artikel + WHERE p.id = %d + AND pp.stuecklistestufe = 0 + ", + $id + ) + ); + + /* + $item['name'] = ($langeartikelnummern?"\r\n\r\n":'').$this->app->erp->ReadyForPDF($item['name']); + $item['desc'] = $this->app->erp->ReadyForPDF($item['desc']); + $item['itemno'] = $this->app->erp->ReadyForPDF($item['itemno']); + $item['herstellernummer'] = $this->app->erp->ReadyForPDF($item['herstellernummer']); + $item['artikelnummerkunde'] = $this->app->erp->ReadyForPDF($item['artikelnummerkunde']); + $item['lieferdatum'] = $this->app->erp->ReadyForPDF($item['lieferdatum']); + $item['hersteller'] = $this->app->erp->ReadyForPDF($item['hersteller']); + + if($this->getStyleElement('herstellernummerimdokument')=='1' && $item['herstellernummer']!='') + + */ + + foreach($artikel as $key=>$value) { + $this->addItem($value); + } + + if($this->app->erp->Firmendaten("footer_reihenfolge_Produktion_aktivieren")=="1") { + $footervorlage = $this->app->erp->Firmendaten("footer_reihenfolge_Produktion"); + if($footervorlage=='') { + $footervorlage = "{FOOTERVERSANDINFO}{FOOTERFREITEXT}{FOOTEREXTRAFREITEXT}\r\n{FOOTERTEXTVORLAGEProduktion}"; + } + $footervorlage = str_replace('{FOOTERVERSANDINFO}',$versandinfo,$footervorlage); + $footervorlage = str_replace('{FOOTERFREITEXT}',$freitext,$footervorlage); + $footervorlage = str_replace('{FOOTEREXTRAFREITEXT}',$extrafreitext,$footervorlage); + $footervorlage = str_replace('{FOOTERTEXTVORLAGEProduktion}',$this->app->erp->Beschriftung("Produktion_footer"),$footervorlage); + $footervorlage = $this->app->erp->ParseUserVars("Produktion",$id,$footervorlage); + $footer = $footervorlage; + } + else { + $footer = $versandinfo."$freitext\r\n$extrafreitext\r\n".$this->app->erp->ParseUserVars("Produktion",$id,$this->app->erp->Beschriftung("Produktion_footer")); + } + + $this->filename = $data['datum']."_PD".$data['belegnr'].".pdf"; + $this->setBarcode($data['belegnr']); + + $corrDetails = array(); + + $corrDetails['Artikel'] = $produktionsartikel['name_de']." (".$produktionsartikel['nummer'].")"; + $corrDetails['Projekt'] = $data['projekt']; + $corrDetails['Adresse'] = $data['adressname']; + $corrDetails['Auftrag'] = $data['auftragsnummer']; + $corrDetails['Interne Bezeichnung'] = $data['internebezeichnung']; + $corrDetails['Datum'] = $data['datum']; + + $body = $this->app->erp->ParseUserVars("Produktion",$id,$body); + + $this->setTextDetails( + array( + 'body' => $body, + 'footer'=> $footer + ) + ); + + $this->setCorrDetails($corrDetails, true); + } +} From b9f9c68d15622651087502ca0f3523ee62367eb5 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 6 Feb 2025 20:42:13 +0100 Subject: [PATCH 20/22] briefpapier fix corrDetails --- www/lib/dokumente/class.briefpapier.php | 12 +++++++----- www/lib/dokumente/class.produktion.php | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index 2bb0643e..f94ee9bb 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -1922,7 +1922,7 @@ class Briefpapier extends SuperFPDF { { if(!empty($this->corrDetails) || !empty($this->boldCorrDetails) || !empty($this->italicCorrDetails) || !empty($this->italicBoldCorrDetails)) - $this->renderCorrDetails(); + $corrDetailsY = $this->renderCorrDetails(); } $this->renderDoctype(); @@ -1932,6 +1932,10 @@ class Briefpapier extends SuperFPDF { $this->textDetails['body']=$this->letterDetails['body']; } + if ($corrDetailsY > $this->GetY()) { + $this->SetY($corrDetailsY); + } + $this->renderText(); if(!empty($this->items)) { $this->renderItems(); @@ -1943,7 +1947,7 @@ class Briefpapier extends SuperFPDF { $this->renderFooter(); $this->logofile = ""; $this->briefpapier=""; - $this->briefpapier2=""; + $this->briefpapier2=""; if($this->addpdf) { foreach($this->addpdf as $addpdf) @@ -2311,11 +2315,9 @@ class Briefpapier extends SuperFPDF { $this->SetXY($startpos_links_rechts+$breite_spalte_rechts,$tempY); $this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR - $this->SetY(80+$this->abstand_artikeltabelleoben); //Hoehe Box - //$this->SetY(60);//+$this->abstand_artikeltabelleoben); //Hoehe Box + return($this->GetY()); } - public function renderDoctype() { //$this->Ln(1); diff --git a/www/lib/dokumente/class.produktion.php b/www/lib/dokumente/class.produktion.php index 3108727b..308c958e 100644 --- a/www/lib/dokumente/class.produktion.php +++ b/www/lib/dokumente/class.produktion.php @@ -141,7 +141,7 @@ class ProduktionPDF extends BriefpapierCustom { produktion p INNER JOIN produktion_position pp ON p.id = pp.produktion INNER JOIN artikel a ON a.id = pp.artikel - WHERE pp.stuecklistestufe = 1 + WHERE p.id = ".$id." AND pp.stuecklistestufe = 1 "); $bodytexte = Array(); From 4b4a1dbbdab73be653379f5d7f22392b392396c6 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 6 Feb 2025 20:56:37 +0100 Subject: [PATCH 21/22] briefpapier fix corrDetails line break --- www/lib/dokumente/class.briefpapier.php | 26 ++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index f94ee9bb..5ff8de04 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -2309,15 +2309,35 @@ class Briefpapier extends SuperFPDF { $this->SetY($this->GetY()+$this->abstand_boxrechtsoben); $this->SetFont($this->GetFont(),'',$fontinfobox); - $tempY = $this->GetY(); + /* $tempY = $this->GetY(); $this->SetX($startpos_links_rechts); $this->MultiCell($this->box_breite1,4,$titleStr,"",$this->boxausrichtung); //BL $this->SetXY($startpos_links_rechts+$breite_spalte_rechts,$tempY); - $this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR + $this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR*/ + + foreach($this->corrDetails as $title => $value) { + if($value!="") + { + $titleStr = $title !== ''?$this->app->erp->ReadyForPDF($title).": \n":" \n"; + $valueStr = $this->app->erp->ReadyForPDF($value)."\n"; + $startY = $this->GetY(); + $this->SetX($startpos_links_rechts); + $this->MultiCell($this->box_breite1,4,$titleStr,"",$this->boxausrichtung); //BL + $tempY = $this->GetY(); + $this->SetY($startY); + $this->SetX($startpos_links_rechts+$breite_spalte_rechts); + $this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR*/ + + if ($tempY > $this->GetY()) { + $this->SetY($tempY); + } + + } + } return($this->GetY()); } - + public function renderDoctype() { //$this->Ln(1); From f5565f54a2dcf4b170e339c5689dfc25476573f7 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 6 Feb 2025 21:13:48 +0100 Subject: [PATCH 22/22] produktion PDF added etiketten --- www/lib/dokumente/class.produktion.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/www/lib/dokumente/class.produktion.php b/www/lib/dokumente/class.produktion.php index 308c958e..29e72447 100644 --- a/www/lib/dokumente/class.produktion.php +++ b/www/lib/dokumente/class.produktion.php @@ -133,6 +133,7 @@ class ProduktionPDF extends BriefpapierCustom { $produktionsartikel = $this->app->DB->SelectRow(" SELECT + a.id, a.name_de, a.nummer, a.internerkommentar, @@ -158,6 +159,25 @@ class ProduktionPDF extends BriefpapierCustom { $bodytext['Interne Bemerkung'] = $data['internebemerkung']; } + $sql = "SELECT + etiketten.name, + al.amount + FROM article_label al + INNER JOIN artikel a ON a.id = al.article_id + INNER JOIN etiketten ON etiketten.id = al.label_id + WHERE + al.type = 'produktion' AND al.article_id = ".$produktionsartikel['id']; + $produktionsetiketten = $this->app->DB->SelectArr($sql); + + if (!empty($produktionsetiketten)) { + $komma = ""; + foreach ($produktionsetiketten as $produktionsetikett) { + $etikettentext .= $komma.$produktionsetikett['name']." (".$produktionsetikett['amount'].")"; + $komma = ", "; + } + $bodytext['Etiketten'] = $etikettentext; + } + $nlbr = ""; foreach ($bodytext as $key => $value) { $body .= $nlbr.$key.":\n".$value;