";
} else {
$heading = array('','','Nummer', 'Artikel', 'Projekt','Planmenge pro Stück', 'Lager (verfügbar)', 'Reserviert','Planmenge', 'Verbraucht','');
$width = array('1%','1%', '5%','30%', '5%', '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','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,
(SELECT a.nummer FROM artikel a WHERE a.id = p.artikel LIMIT 1) as nummer,
(SELECT a.name_de FROM artikel a WHERE a.id = p.artikel LIMIT 1) as name,
(SELECT projekt.abkuerzung FROM projekt INNER JOIN artikel a WHERE a.projekt = projekt.id AND a.id = p.artikel LIMIT 1) as projekt,
FORMAT(p.menge/$produktionsmenge,0,'de_DE') as stueckmenge,
CONCAT (
FORMAT (IFNULL((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0),0,'de_DE'),
' (',
FORMAT (
IFNULL((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0)-
IFNULL((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel),0),
0,
'de_DE'
),
')'
) 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
FROM produktion_position p";
$where = " stuecklistestufe = 0 AND produktion = $id";
$count = "SELECT count(DISTINCT id) FROM produktion_position WHERE $where";
// $groupby = "";
break;
case "produktion_source_list": // Aggregated per artikel
$id = $app->Secure->GetGET('id');
$sql = "SELECT menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$produktionsmenge = $app->DB->SelectArr($sql)[0]['menge'];
$sql = "SELECT standardlager FROM produktion WHERE id=$id";
$standardlager = $app->DB->SelectArr($sql)[0]['standardlager'];
$allowed['produktion_position_list'] = array('list');
$heading = array('','Nummer', 'Artikel', 'Projekt','Planmenge pro Stück', 'Lager (verfügbar)', 'Reserviert','Planmenge', 'Verbraucht','');
$width = array('1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%' ,'1%');
$alignright = array(5,6,7,8,9);
$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','lager','reserviert','menge','geliefert_menge');
$searchsql = array('p.artikel','nummer','name','projekt','lager','menge','reserviert','geliefert_menge');
$defaultorder = 1;
$defaultorderdesc = 0;
$drop = "'' AS `open`";
$sql = "SELECT SQL_CALC_FOUND_ROWS
p.artikel,
$drop,
(SELECT a.nummer FROM artikel a WHERE a.id = p.artikel LIMIT 1) as nummer,
(SELECT a.name_de FROM artikel a WHERE a.id = p.artikel LIMIT 1) as name,
(SELECT projekt.abkuerzung FROM projekt INNER JOIN artikel a WHERE a.projekt = projekt.id AND a.id = p.artikel LIMIT 1) as projekt,
FORMAT(SUM(p.menge)/$produktionsmenge,0,'de_DE') as stueckmenge,
CONCAT (
FORMAT (IFNULL((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0),0,'de_DE'),
' (',
FORMAT (
IFNULL((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0)-
IFNULL((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel),0),
0,
'de_DE'
),
')'
) 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(p.geliefert_menge,0,'de_DE') as geliefert_menge,
p.id
FROM produktion_position p";
$where = " stuecklistestufe = 0 AND produktion = $id";
$count = "SELECT count(DISTINCT id) FROM produktion_position WHERE $where";
$groupby = " GROUP BY p.artikel ";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
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");
$this->app->erp->MenuEintrag("index.php", "Zurück");
$this->StatusBerechnen(0); // all open ones
$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.
");
} else {
$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 = $this->app->Secure->GetGET('id');
if($this->app->erp->DisableModul('produktion',$id))
{
return;
}
$submit = $this->app->Secure->GetPOST('submit');
$this->app->Tpl->Set('ID', $id);
$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");
$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];
$global_status = $from_db['status'];
$global_produktionsnummer = $from_db['belegnr'];
$global_projekt = $from_db['projekt'];
$global_standardlager = $from_db['standardlager'];
// foreach ($input as $key => $value) {
// echo($key." -> ".$value." \n");
// }
$this->app->Tpl->Set('MESSAGE', "");
if (empty($id)) {
// New item
$id = 'NULL';
} else {
}
if ($submit != '')
{
switch ($submit) {
case 'speichern':
// Write to database
// Add checks here
$input['standardlager'] = $this->app->erp->ReplaceLagerPlatz(true,$input['standardlager'],true); // Parameters: Target db?, value, from form?
if (empty($input['datum'])) {
$input['datum'] = date("Y-m-d");
} else {
$input['datum'] = $this->app->erp->ReplaceDatum(true,$input['datum'],true);
}
if ($id == 'NULL') {
$input['status'] = 'angelegt';
}
$input['datumauslieferung'] = $this->app->erp->ReplaceDatum(true,$input['datumauslieferung'],true);
$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);
$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 = ", ";
}
$sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg .= $this->app->erp->base64_url_encode("
";
}
break;
case 'planen':
// 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;
}
$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');
if (!$artikel_planen_id) {
$msg .= "
";
break;
case 'freigeben':
$this->app->erp->BelegFreigabe("produktion",$id);
break;
case 'reservieren':
// Check quantities and reserve for every position
if($global_standardlager == 0) {
break;
}
$fortschritt = $this->MengeFortschritt($id,$global_standardlager);
if (empty($fortschritt)) {
break;
}
$sql = "SELECT pp.id, pp.artikel, a.name_de, a.nummer, FORMAT(pp.menge,0) as menge, FORMAT(pp.geliefert_menge,0) as geliefert_menge FROM produktion_position pp INNER JOIN artikel a ON a.id = pp.artikel WHERE pp.produktion=$id AND pp.stuecklistestufe=0";
$materialbedarf = $this->app->DB->SelectArr($sql);
// Try to reserve material
$reservierung_durchgefuehrt = false;
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'];
$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;
}
}
// Message output
if ($reservierung_durchgefuehrt) {
$msg .= "
Reservierung durchgeführt.
";
} else {
$msg .= "
Keine Reservierung durchgeführt!
";
}
break;
case 'produzieren':
// Check quanitites
// Parse positions
$sql = "SELECT artikel, FORMAT(menge,0) as menge, FORMAT(geliefert_menge,0) as geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$produktionsartikel_position = $this->app->DB->SelectArr($sql)[0];
if (empty($produktionsartikel_position)) {
$msg .= "
Lagermenge nicht ausreichend. ($menge_auslagern > $menge_moeglich)
";
break;
}
$sql = "UPDATE produktion SET status = 'gestartet' WHERE id=$id";
$this->app->DB->Update($sql);
$sql = "SELECT id, artikel, FORMAT(menge,0) as menge, FORMAT(geliefert_menge,0) as geliefert_menge, stuecklistestufe FROM produktion_position pp WHERE produktion=$id";
$material = $this->app->DB->SelectArr($sql);
foreach ($material as $material_position) {
// Calculate quantity to be removed
$menge_artikel_auslagern = $material_position['menge']/$produktionsartikel_position['menge']*$menge_auslagern;
// Remove material from stock
if ($material_position['stuecklistestufe'] == 0) {
$result = $this->app->erp->LagerAuslagernRegal($material_position['artikel'],$global_standardlager,$menge_artikel_auslagern,$global_projekt,'Produktion '.$produktion_belegnr);
if ($result != 1) {
$msg .= "
Kritischer Fehler beim Ausbuchen! (Position ".$material_position['id'].", Menge ".$menge_artikel_auslagern.").
".
$error = true;
break;
}
// Adjust reservation
$result = $this->ArtikelReservieren($material_position['artikel'],$global_standardlager,-$menge_artikel_auslagern,0,'produktion',$id,$material_position['id'],"Produktion $global_produktionsnummer");
}
// Update position
$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
// ERPAPI
// function LagerEinlagern($artikel,$menge,$regal,$projekt,$grund="",$importer="",$paketannahme="",$doctype = "", $doctypeid = 0, $vpeid = 0, $permanenteinventur = 0, $adresse = 0)
$this->app->erp->LagerEinlagern($produktionsartikel_position['artikel'],$menge_produzieren,$global_standardlager,$global_projekt,"Produktion $global_produktionsnummer");
// No error handling in LagerEinlagern...
$sql = "UPDATE produktion SET mengeerfolgreich = mengeerfolgreich + $menge_produzieren, mengeausschuss = mengeausschuss + $menge_ausschuss WHERE id = $id";
$this->app->DB->Update($sql);
$msg .= "
Produktion durchgeführt.
";
break;
case 'teilen':
// Create partial production
$menge_abteilen = $this->app->Secure->GetPOST('menge_produzieren');
$fortschritt = $this->MengeFortschritt($id,$global_standardlager);
if (empty($fortschritt)) {
break;
}
if ($menge_abteilen < 1 || $menge_abteilen > ($fortschritt['geplant']-$fortschritt['produziert'])) {
$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();
// Now add the positions
$sql = "SELECT * FROM produktion_position WHERE produktion = $id";
$positionen = $this->app->DB->SelectArr($sql);
foreach ($positionen as $position) {
$columns = "";
// Preserve these values
$pos_id = $position['id'];
$geliefert_menge = $position['geliefert_menge'];
$menge = $position['menge'];
$produktion_alt_id = $position['produktion'];
$menge_pro_stueck = $menge/$fortschritt['geplant'];
// For the new positions
$position['id'] = 'NULL';
$position['geliefert_menge'] = 0;
$position['menge'] = $menge_abteilen*$menge_pro_stueck;
$position['produktion'] = $produktion_neu_id;
$values = "";
$fix = "";
foreach ($position as $key => $value) {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$fix = ", ";
}
$sql = "INSERT INTO produktion_position (".$columns.") VALUES (".$values.")";
$this->app->DB->Update($sql);
// For the old positions
// Reduce positions in old production
$position['id'] = $pos_id;
$position['geliefert_menge'] = $geliefert_menge;
$position['menge'] = $menge - $position['menge']; // old quantity - partial quantity
$position['produktion'] = $produktion_alt_id;
$fix = "";
$update = "";
foreach ($position as $key => $value) {
$update = $update.$fix.$key." = '".($value)."'";
$fix = ", ";
}
$sql = "UPDATE produktion_position SET $update WHERE id = $pos_id";
$this->app->DB->Update($sql);
// Free surplus reservations
$restreservierung = $menge_pro_stueck * $fortschritt['offen']-$menge_abteilen;
$result = $this->ArtikelReservieren($position['artikel'],$global_standardlager,0,$restreservierung,'produktion',$id,$position['id'],"Produktion $global_produktionsnummer");
}
$msg .= $this->app->erp->base64_url_encode("
Das Element wurde erfolgreich angelegt.
");
header("Location: index.php?module=produktion&action=list&msg=$msg");
break;
case 'leeren':
if ($global_status == 'angelegt' || $global_status == 'freigegeben') {
$sql = "SELECT id, artikel, FORMAT(menge,0) as menge, FORMAT(geliefert_menge,0) as geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0";
$material = $this->app->DB->SelectArr($sql);
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.
";
} else {
$msg .= "
Planung kann nicht geleert werden.
";
}
break;
case 'anpassen':
if ($global_status == 'angelegt' || $global_status == 'freigegeben' || $global_status == 'gestartet') {
$menge_anpassen = $this->app->Secure->GetPOST('menge_produzieren');
if (empty($menge_anpassen)) {
$msg .= "