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 @@
Freigeben
Reservieren
Produzieren
+ Teilproduktion erstellen
Abschliessen
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");
}