From 3b804ef745418022d7e388176e765f6f22b35c62 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 8 Nov 2022 22:22:27 +0000 Subject: [PATCH] Produktion Teilproduktion WIP --- www/pages/content/produktion_edit.tpl | 7 +- www/pages/produktion.php | 177 +++++++++++++++++++++++--- www/pages/produktion_position.php | 25 +++- 3 files changed, 185 insertions(+), 24 deletions(-) diff --git a/www/pages/content/produktion_edit.tpl b/www/pages/content/produktion_edit.tpl index a00e2154..40fcef36 100644 --- a/www/pages/content/produktion_edit.tpl +++ b/www/pages/content/produktion_edit.tpl @@ -14,8 +14,9 @@
- {|Produktion [BELEGNR]|} - [STATUSICONS] + {|Produktion [BELEGNR]|} + [STATUSICONS] + [TEILPRODUKTIONINFO]
@@ -131,6 +132,7 @@
{|Produktion [BELEGNR]|} [STATUSICONS] + [TEILPRODUKTIONINFO]
@@ -176,6 +178,7 @@ + diff --git a/www/pages/produktion.php b/www/pages/produktion.php index e54078c4..d2461bfb 100644 --- a/www/pages/produktion.php +++ b/www/pages/produktion.php @@ -64,9 +64,14 @@ class Produktion { $dropnbox, p.belegnr, p.kundennummer, - p.name, + (SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1) as name, DATE_FORMAT(datum,'%d.%m.%Y') as datum, - CONCAT(a.name_de,' (',a.nummer,')','
',internebezeichnung,'') as bezeichnung, + + CONCAT ( + IFNULL((SELECT CONCAT(a.name_de,' (',a.nummer,')','
') FROM artikel a INNER JOIN produktion_position pp WHERE pp.stuecklistestufe = 1 AND pp.produktion = p.id LIMIT 1),''), + CONCAT('',internebezeichnung,'') + ) as bezeichnung, + FORMAT((SELECT SUM(menge) FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1),0,'de_DE') as soll, FORMAT(p.mengeerfolgreich,0,'de_DE') as ist, \"-\" as zeit_geplant, @@ -76,11 +81,9 @@ class Produktion { (" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`, p.id FROM produktion p - LEFT JOIN produktion_position pp ON pp.produktion = p.id - LEFT JOIN artikel a ON pp.artikel = a.id "; - $where = " (pp.stuecklistestufe = 1 OR pp.stuecklistestufe IS NULL) "; + $where = " 1 "; $count = "SELECT count(DISTINCT p.id) FROM produktion p INNER JOIN produktion_position pp ON pp.produktion = pp.id WHERE $where"; // $groupby = ""; @@ -262,6 +265,7 @@ class Produktion { $this->app->erp->MenuEintrag("index.php?module=produktion&action=list", "Zurück zur Übersicht"); $id = $this->app->Secure->GetGET('id'); $input = $this->GetInput(); + $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]; @@ -326,7 +330,7 @@ class Produktion { $msg = $this->app->erp->base64_url_encode("
Das Element wurde erfolgreich angelegt.
"); header("Location: index.php?module=produktion&action=list&msg=$msg"); } else { - $this->app->Tpl->Set('MESSAGE', "
Die Einstellungen wurden erfolgreich übernommen.
"); + $msg = "
Die Einstellungen wurden erfolgreich übernommen.
"; } break; case 'planen': @@ -337,7 +341,7 @@ class Produktion { $produktionsartikel = $this->app->DB->SelectArr($sql); if (!empty($produktionsartikel)) { - $this->app->Tpl->Set('MESSAGE', "
Bereits geplant.
"); + $msg = "
Bereits geplant.
"; break; } @@ -345,7 +349,12 @@ class Produktion { $artikel_planen_menge = $this->app->Secure->GetPOST('artikel_planen_menge'); if (!$artikel_planen_id) { - $this->app->Tpl->Set('MESSAGE', "
Artikel ist keine Stückliste.
"); + $msg = "
Artikel ist keine Stückliste.
"; + break; + } + + if ($artikel_planen_menge < 1) { + $msg = "
Ungültige Planmenge.
"; break; } @@ -357,7 +366,7 @@ class Produktion { $stueckliste = $this->app->DB->SelectArr($sql); if (empty($stueckliste)) { - $this->app->Tpl->Set('MESSAGE', "
Stückliste ist leer.
"); + $msg = "
Stückliste ist leer.
"; break; } @@ -369,7 +378,7 @@ class Produktion { $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->Tpl->Set('MESSAGE', "
Planung angelegt.
"); + $msg = "
Planung angelegt.
"; break; case 'freigeben': @@ -380,7 +389,7 @@ class Produktion { // Check quantities and reserve for every position if($global_standardlager == 0) { - $this->app->Tpl->Set('MESSAGE', "
Kein Lager ausgewählt.
"); + $msg = "
Kein Lager ausgewählt.
"; break; } @@ -398,9 +407,9 @@ class Produktion { // Message output if ($reservierung_durchgefuehrt) { - $this->app->Tpl->Add('MESSAGE', "
Reservierung durchgeführt.
"); + $msg = "
Reservierung durchgeführt.
"; } else { - $this->app->Tpl->Add('MESSAGE', "
Keine Reservierung durchgeführt!
"); + $msg = "
Keine Reservierung durchgeführt!
"; } break; @@ -413,7 +422,7 @@ class Produktion { $produktionsartikel_position = $this->app->DB->SelectArr($sql)[0]; if (empty($produktionsartikel_position)) { - $this->app->Tpl->Set('MESSAGE', "
Keine Planung vorhanden.
"); + $msg = "
Keine Planung vorhanden.
"; break; } @@ -431,10 +440,15 @@ class Produktion { $menge_auslagern = $menge_produzieren+$menge_ausschuss; + if ($menge_auslagern < 1) { + $msg = "
Ungültige Menge.
"; + break; + } + $menge_moeglich = $this->LagerCheckProduktion($id, $global_standardlager); if ($menge_auslagern > $menge_moeglich) { - $this->app->Tpl->Set('MESSAGE', "
Lagermenge nicht ausreichend. ($menge_auslagern > $menge_moeglich)
"); + $msg = "
Lagermenge nicht ausreichend. ($menge_auslagern > $menge_moeglich)
"; break; } @@ -452,7 +466,7 @@ class Produktion { // Remove material from stock $result = $this->app->erp->LagerAuslagernRegal($material_position['artikel'],$global_standardlager,$menge_artikel_auslagern,$global_projekt,'Produktion '.$produktion_belegnr); if ($result != 1) { - $this->app->Tpl->Set('MESSAGE', "
Kritischer Fehler beim Ausbuchen! (Position ".$material_position['id'].", Menge ".$menge_artikel_auslagern.").
"); + $msg = "error\">Kritischer Fehler beim Ausbuchen! (Position ".$material_position['id'].", Menge ".$menge_artikel_auslagern.")."; $error = true; break; } @@ -479,7 +493,119 @@ class Produktion { $sql = "UPDATE produktion SET mengeerfolgreich = mengeerfolgreich + $menge_produzieren, mengeausschuss = mengeausschuss + $menge_ausschuss WHERE id = $id"; $this->app->DB->Update($sql); - $this->app->Tpl->Add('MESSAGE', "
Produktion durchgeführt.
"); + $msg = "
Produktion durchgeführt.
"; + break; + case 'teilen': + + // Create partial sub production + /* + Check open quantities + Reduce open quantities by partial + Adjust reservations + Add new production + Add partial quantities to new production +*/ + + $menge_abteilen = $this->app->Secure->GetPOST('menge_produzieren'); + + if ($menge_abteilen < 1) { + $msg = "
Ungültige Teilmenge.
"; + break; + } + + $sql = "SELECT * from produktion WHERE id = $id"; + $produktion_alt = $this->app->DB->SelectArr($sql)[0]; + + // Part production of part production -> select parent + $hauptproduktion_id = $produktion_alt['teilproduktionvon']; + if ($hauptproduktion_id != 0) { + $sql = "SELECT belegnr FROM produktion WHERE id = $hauptproduktion_id"; + $hauptproduktion_belegnr = $this->app->DB->SelectArr($sql)[0]['belegnr']; + } else { + $hauptproduktion_id = $produktion_alt['id']; + $hauptproduktion_belegnr = $produktion_alt['belegnr']; + } + + $sql = "SELECT MAX(teilproduktionnummer) as tpn FROM produktion WHERE teilproduktionvon = $hauptproduktion_id"; + $teilproduktionnummer = $this->app->DB->SelectArr($sql)[0]['tpn']; + if (empty($teilproduktionnummer) || $teilproduktionnummer == 0) { + $teilproduktionnummer = '1'; + } else { + $teilproduktionnummer++; + } + + $produktion_neu = array(); + $produktion_neu['status'] = 'angelegt'; + $produktion_neu['datum'] = date("Y-m-d"); + $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['auftragid'] = $produktion_alt['auftragid']; + $produktion_neu['freitext'] = $produktion_alt['freitext']; + $produktion_neu['internebemerkung'] = $produktion_alt['internebemerkung']; + $produktion_neu['adresse'] = $produktion_alt['adresse']; + $produktion_neu['internebemerkung'] = $produktion_alt['internebemerkung']; + $produktion_neu['internebezeichnung '] = $produktion_alt['internebezeichnung']; + $produktion_neu['standardlager'] = $produktion_alt['standardlager']; + $produktion_neu['belegnr'] = $hauptproduktion_belegnr."-".$teilproduktionnummer; + $produktion_neu['teilproduktionvon'] = $hauptproduktion_id; + $produktion_neu['teilproduktionnummer'] = $teilproduktionnummer; + + $columns = ""; + $values = ""; + $update = ""; + + $fix = ""; + + foreach ($produktion_neu as $key => $value) { + $columns = $columns.$fix.$key; + $values = $values.$fix."'".$value."'"; + $update = $update.$fix.$key." = '$value'"; + $fix = ", "; + } + + $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.")"; + $this->app->DB->Update($sql); + $produktion_neu_id = $this->app->DB->GetInsertID(); + + $sql = "SELECT menge FROM produktion_position WHERE produktion = $id AND stuecklistestufe = 1"; + $planmenge_alt = $this->app->DB->SelectArr($sql)[0]; + + // Now add the positions + $sql = "SELECT * FROM produktion_position WHERE produktion = $id"; + $positionen = $this->app->DB->SelectArr($sql); + + foreach ($positionen as $position) { + $position['id'] = 'NULL'; + $position['geliefert_menge'] = 0; + $position['menge'] = $menge_abteilen*($position['menge']/$planmenge_alt['menge']); + $position['produktion'] = $produktion_neu_id; + + $columns = ""; + $values = ""; + $update = ""; + $fix = ""; + + foreach ($position as $key => $value) { + $columns = $columns.$fix.$key; + $values = $values.$fix."'".$value."'"; + $update = $update.$fix.$key." = '$value'"; + $fix = ", "; + } + + $sql = "INSERT INTO produktion_position (".$columns.") VALUES (".$values.")"; + $this->app->DB->Update($sql); + + } + + // Reduce positions in old production TODO + + // Correct reservations in old production TODO + + $msg = $this->app->erp->base64_url_encode("
Das Element wurde erfolgreich angelegt.
"); + header("Location: index.php?module=produktion&action=list&msg=$msg"); + break; case 'abschliessen': $sql = "UPDATE produktion SET status = 'abgeschlossen' WHERE id=$id"; @@ -675,6 +801,19 @@ class Produktion { $icons = $this->app->DB->SelectArr($sql); $this->app->Tpl->Add('STATUSICONS', $icons[0]['icons']); + if ($produktion_from_db['teilproduktionvon'] != 0) { + $sql = "SELECT belegnr FROM produktion WHERE id = ".$produktion_from_db['teilproduktionvon']; + $hauptproduktion_belegnr = $this->app->DB->SelectArr($sql)[0]['belegnr']; + $this->app->Tpl->Set('TEILPRODUKTIONINFO',"Teilproduktion von ".$hauptproduktion_belegnr); + } + + $sql = "SELECT belegnr FROM produktion WHERE teilproduktionvon = $id"; + $teilproduktionen = $this->app->DB->SelectArr($sql); + + if (!empty($teilproduktionen)) { + $this->app->Tpl->Set('TEILPRODUKTIONINFO',"Zu dieser Produktion gehören diese Teilproduktionen: ".implode(', ',array_column($teilproduktionen,'belegnr'))); + } + $this->app->YUI->AutoComplete("projekt", "projektname", 1); $this->app->YUI->AutoComplete("kundennummer", "kunde", 1); $this->app->YUI->AutoComplete("auftragid", "auftrag", 1); @@ -728,7 +867,7 @@ class Produktion { $menge_offen = $produktionsartikel_position['menge']-$produktion_from_db['mengeerfolgreich']; if ($menge_offen < 0) { $menge_offen = 0; - $this->app->Tpl->Set('MESSAGE', "
Planmenge überschritten.
"); + $msg = "
Planmenge überschritten.
"; } $this->app->Tpl->Set('MENGE_OFFEN',$menge_offen); @@ -777,6 +916,7 @@ class Produktion { $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden'); + $this->app->Tpl->Set('AKTION_TEILEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_ABSCHLIESSEN_VISIBLE','hidden'); break; default: // new item @@ -784,6 +924,7 @@ class Produktion { break; } + $this->app->Tpl->Set('MESSAGE', $msg); $this->app->Tpl->Parse('PAGE', "produktion_edit.tpl"); } diff --git a/www/pages/produktion_position.php b/www/pages/produktion_position.php index f5f937d9..19477b3d 100644 --- a/www/pages/produktion_position.php +++ b/www/pages/produktion_position.php @@ -97,6 +97,7 @@ class Produktion_position { } else { header("Location: index.php?module=produktion_position&action=list&msg=$msg"); } + exit(); } @@ -139,6 +140,15 @@ class Produktion_position { $id = 'NULL'; } + $sql = "SELECT p.status, p.id from produktion p INNER JOIN produktion_position pp ON pp.produktion = p.id WHERE pp.id = $id"; + $result = $this->app->DB->SelectArr($sql)[0]; + $status = $result['status']; + $produktion_id = $result['id']; + + $sql = "SELECT FORMAT(menge,0) as menge FROM produktion_position WHERE produktion = $produktion_id AND stuecklistestufe = 1"; + $result = $this->app->DB->SelectArr($sql)[0]; + $planmenge = $result['menge']; + if ($submit != '') { @@ -148,14 +158,19 @@ class Produktion_position { $input['artikel'] = $this->app->erp->ReplaceArtikel(true, $input['artikel'],true); // Convert from form to db // Only allowed when produktion is 'freigegeben or angelegt' - - $sql = "SELECT p.status, p.id from produktion p INNER JOIN produktion_position pp ON pp.produktion = p.id WHERE pp.id = $id"; - $result = $this->app->DB->SelectArr($sql)[0]; - $status = $result['status']; if (!in_array($status,array('angelegt','freigegeben'))) { $this->produktion_position_edit_end("Bearbeiten nicht möglich, Produktionsstatus ist '$status'",true, true); } + if ($input['menge'] < 0) { + $this->produktion_position_edit_end("Ungültige Menge.",true, true); + } + + // Only allow quantities that are a multiple of the target quantity + if ($input['menge'] % $planmenge != 0) { + $this->produktion_position_edit_end("Positionsmenge muss Vielfaches von $planmenge sein.",true, true); + } + $columns = "id, "; $values = "$id, "; $update = ""; @@ -214,6 +229,8 @@ class Produktion_position { $this->app->Tpl->Set('PRODUKTIONID',$result[0]['produktion']); $this->app->Tpl->Set('PRODUKTIONBELEGNR',$result[0]['belegnr']); + $this->app->Tpl->Add('MESSAGE',"
Positionsmenge muss Vielfaches von $planmenge sein.
"); + $this->app->Tpl->Parse('PAGE', "produktion_position_edit.tpl"); }