diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json index 4401be0a..b9527d97 100644 --- a/upgrade/data/db_schema.json +++ b/upgrade/data/db_schema.json @@ -50385,6 +50385,72 @@ "Privileges": "select,insert,update,references", "Comment": "" }, + { + "Field": "usereditid", + "Type": "int(11)", + "Collation": null, + "Null": "YES", + "Key": "MUL", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "projekt", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "MUL", + "Default": "0", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "adresse", + "Type": "int(10)", + "Collation": null, + "Null": "NO", + "Key": "MUL", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "belegnr", + "Type": "varchar(255)", + "Collation": "utf8mb3_general_ci", + "Null": "NO", + "Key": "MUL", + "Default": null, + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "schreibschutz", + "Type": "int(1)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "0", + "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": "" + }, { "Field": "zeitstempel", "Type": "timestamp", @@ -50472,6 +50538,28 @@ "Extra": "", "Privileges": "select,insert,update,references", "Comment": "" + }, + { + "Field": "lieferschein", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, + { + "Field": "auftrag", + "Type": "int(11)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" } ], "keys": [ @@ -50534,6 +50622,17 @@ "Privileges": "select,insert,update,references", "Comment": "" }, + { + "Field": "menge", + "Type": "decimal(14,4)", + "Collation": null, + "Null": "NO", + "Key": "", + "Default": "0.0000", + "Extra": "", + "Privileges": "select,insert,update,references", + "Comment": "" + }, { "Field": "ausgeblendet", "Type": "tinyint(1)", diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index e62985c2..1d37cb17 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -1,5 +1,6 @@ array('lager_platz', 'artikel', 'menge'); function LieferscheinAuslagern($lieferschein,$anzeige_lagerplaetze_in_lieferschein=false, $standardlager = 0, $belegtyp = 'lieferschein', $chargenmhdnachprojekt = 0, $forceseriennummerngeliefertsetzen = false,$nurrestmenge = false, $lager_platz_vpe = 0, $lpiid = 0) { if($lieferschein <= 0) { @@ -3138,6 +3141,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } } $storageLocations = []; + $storageMovements = []; $cartikel = $artikelarr?count($artikelarr):0; for($i= ($belegtyp==='produktion'?1:0) ;$i<$cartikel;$i++) { $beschreibung = $artikelarr[$i]['beschreibung']; @@ -3454,51 +3458,33 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu } if((round($maxAuslagern,8) > round($lager_max[0]['menge'],8)) && ($lager_max[0]['menge'] > 0)) { // es werden mehr gebraucht als im lager sind - $this->LagerAuslagernRegal($artikel,$lager_max[0]['lager_platz'],$lager_max[0]['menge'],$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein, $lager_max[0]['lager_platz_vpe'], $lager_max[0]['id']); - if($anzeige_lagerplaetze_in_lieferschein){ - $this->LagerAuslagernText($artikel, $subid, $lager_max[0]['lager_platz'], $lager_max[0]['menge'], $belegtyp); - }else{ - $this->LagerAuslagernObjektLagerPlatz($artikel, $subid, $lager_max[0]['lager_platz'], $lager_max[0]['menge'], $belegtyp); - } - $storageLocations[] = $lager_max[0]['lager_platz']; - $regal_name = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id='".$lager_max[0]['lager_platz']."' LIMIT 1"); - $lager_string .= $regal_name."(".$lager_max[0]['menge'].") "; - $restmenge = round($restmenge - $lager_max[0]['menge'],8); - if(!$nurrestmenge){ - $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_max[0]['lager_platz'],$lager_max[0]['menge'],$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein,$subid, $chargenauslagern, $mhdauslagern, $seriennummernauslagern); - } + $menge_auslagern = $lager_max[0]['menge']; } else if( ($lager_max[0]['menge'] >= $maxAuslagern) && ($maxAuslagern > 0) ) { // es sind genuegend lager - $this->LagerAuslagernRegal($artikel,$lager_max[0]['lager_platz'],$maxAuslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein, $lager_max[0]['lager_platz_vpe'], $lager_max[0]['id']); - $storageLocations[] = $lager_max[0]['lager_platz']; - if($anzeige_lagerplaetze_in_lieferschein){ - $this->LagerAuslagernText($artikel, $subid, $lager_max[0]['lager_platz'], $maxAuslagern, $belegtyp); - }else{ - $this->LagerAuslagernObjektLagerPlatz($artikel, $subid, $lager_max[0]['lager_platz'], $maxAuslagern, $belegtyp); - } - $regal_name = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id='".$lager_max[0]['lager_platz']."' LIMIT 1"); - $lager_string .= $regal_name."(".(float)$maxAuslagern.") "; - - if(!$nurrestmenge){ - $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_max[0]['lager_platz'],$maxAuslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein,$subid, $chargenauslagern, $mhdauslagern, $seriennummernauslagern); - } - $restmenge = round($restmenge - $maxAuslagern, 8); + $menge_auslagern = $maxAuslagern; } else { break; } - } -/* -// neue datenstruktue - if($lager_string=='') { - $beschreibung .="\r\nLager: manuell"; + $this->LagerAuslagernRegal($artikel,$lager_max[0]['lager_platz'],$menge_auslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein, $lager_max[0]['lager_platz_vpe'], $lager_max[0]['id']); + $storageLocations[] = $lager_max[0]['lager_platz']; + if($anzeige_lagerplaetze_in_lieferschein){ + $this->LagerAuslagernText($artikel, $subid, $lager_max[0]['lager_platz'], $menge_auslagern, $belegtyp); + } else { + $this->LagerAuslagernObjektLagerPlatz($artikel, $subid, $lager_max[0]['lager_platz'], $menge_auslagern, $belegtyp); + } + $regal_name = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id='".$lager_max[0]['lager_platz']."' LIMIT 1"); + $lager_string .= $regal_name."(".(float)$menge_auslagern.") "; + if(!$nurrestmenge){ + $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_max[0]['lager_platz'],$menge_auslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein,$subid, $chargenauslagern, $mhdauslagern, $seriennummernauslagern); + } + $restmenge = round($restmenge - $menge_auslagern, 8); + + $storageMovements[] = array('lager_platz' => $lager_max[0]['lager_platz'], 'artikel' => $artikel,'menge' => $menge_auslagern); + } - else { - $beschreibung .="\r\nLager: $lager_string"; - } -*/ } $geliefert = $menge; @@ -3553,6 +3539,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu $this->RunHook('erpapi_lieferschein_auslagern', 1, $lieferschein); $this->LieferscheinProtokoll($lieferschein,"Lieferschein ausgelagert"); } + return(array('storageMovements' => $storageMovements)); } /** diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php index dcecb9b2..46d1811d 100644 --- a/www/lib/dokumente/class.briefpapier.php +++ b/www/lib/dokumente/class.briefpapier.php @@ -69,6 +69,7 @@ class Briefpapier extends SuperFPDF { public function __construct($app,$projekt="", $styleData = null) { if($styleData != null) $this->setStyleData($styleData); + //$orientation='P';$unit='mm';$format='A4'; //parent::PDF_EPS($orientation,$unit,$format); $this->projekt = $projekt; @@ -94,6 +95,9 @@ class Briefpapier extends SuperFPDF { $this->ust_spalteausblende=true; } + if ($this->getStyleElement('ohne_steuer')) { + $this->ust_spalteausblende=true; + } $hintergrund = $this->getStyleElement('hintergrund'); @@ -2023,7 +2027,6 @@ class Briefpapier extends SuperFPDF { //$this->SetFont($this->GetFont(),'',9); //if(isset($this->recipient['country'])) $this->Cell_typed(80,5,$this->recipient['country'],0,1); - //FREITEXT1 $freitext1aktiv = $this->getStyleElement('freitext1aktiv'); if($freitext1aktiv){ @@ -2297,6 +2300,7 @@ class Briefpapier extends SuperFPDF { $this->SetFont($this->GetFont(),'B',$betreffszeile); $this->SetY($this->GetY()+$this->abstand_betreffzeileoben); + //$this->Cell_typed(85,6,$this->doctypeOrig); $this->MultiCell(210-83+$this->abstand_boxrechtsoben_lr-$this->getStyleElement("abstand_seitenrandlinks")-5,6,html_entity_decode($this->doctypeOrig,ENT_QUOTES),0,'L'); $this->SetY($this->GetY()-$this->abstand_betreffzeileoben); @@ -2559,25 +2563,30 @@ class Briefpapier extends SuperFPDF { $inventurohnepreis = null; if(!in_array($this->table ? $this->table : $this->doctype, ['rechnung','auftrag','angebot','bestellung'])) { - $from = $this->table ? $this->table : $this->doctype; + $from = $this->table ? $this->table : $this->doctype; - if ($this->app->DB->Select("SHOW COLUMNS FROM `$from` LIKE 'noprice'")) { + if ($this->app->DB->Select("SHOW COLUMNS FROM `$from` LIKE 'noprice'")) { - $inventurohnepreis = $this->app->DB->Select( - sprintf( - 'SELECT noprice - FROM `%s` - WHERE id = %d - LIMIT 1', - $from, - $this->id - ) - ); - } - else { - $inventurohnepreis = false; - } + $inventurohnepreis = $this->app->DB->Select( + sprintf( + 'SELECT noprice + FROM `%s` + WHERE id = %d + LIMIT 1', + $from, + $this->id + ) + ); + } + else { + $inventurohnepreis = false; + } } + + if ($this->getStyleElement("preise_ausblenden")) { + $inventurohnepreis = true; + } + if($inventurohnepreis){ $descWidth += 40; } @@ -2731,7 +2740,13 @@ class Briefpapier extends SuperFPDF { $this->SetTextColor(0,0,0); for ($l=$pos; $l <= $pos+$jitposfix ; $l++) { //Arbeitet die Zwischenpositionen durch falls der vorherige Artikel ein Stücklistenartikel war bei dem Teile ausgeblendet wurden - $iszwichenpos = $this->DrawZwischenpositionen($l+$jitposfixbase); + + if ($has_steuer) { + $iszwichenpos = $this->DrawZwischenpositionen($l+$jitposfixbase); + } else { + $iszwichenpos = $this->DrawZwischenpositionen($l+$jitposfixbase,'',''); + } + } $jitposfixbase += $jitposfix; if($item['keineeinzelartikelanzeigen'] == 1){ diff --git a/www/lib/dokumente/class.kommissionierung.php b/www/lib/dokumente/class.kommissionierung.php new file mode 100644 index 00000000..467dc6fc --- /dev/null +++ b/www/lib/dokumente/class.kommissionierung.php @@ -0,0 +1,207 @@ + +app=$app; + //parent::Briefpapier(); + $this->doctype="kommissionierung"; + $this->doctypeOrig="Kommissionierung"; + 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 GetKommissionierung($id,$info="",$extrafreitext="") + { + $this->doctypeid = $id; + $this->id = $id; + $this->table = 'kommissionierung'; // 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 + k.kommentar, + k.bezeichnung, + k.bearbeiter, + DATE_FORMAT(k.zeitstempel,'%Y%m%d') as datum, + l.belegnr as lieferscheinnummer, + ab.belegnr as auftragnummer, + DATE_FORMAT(ab.tatsaechlicheslieferdatum,'%d.%m.%Y') as tatsaechlicheslieferdatum, + a.name + FROM + kommissionierung k + LEFT JOIN + lieferschein l + ON + k.lieferschein = l.id + LEFT JOIN + auftrag ab + ON + l.auftragid = ab.id + LEFT JOIN + adresse a + ON + a.id = l.adresse + WHERE k.id='$id' + "); + + $this->zusatzfooter = " (KS$id)"; + + $this->doctypeOrig = $this->app->erp->Beschriftung("dokument_kommissionierschein") . " $id"; + + $body = $this->app->erp->Beschriftung("Kommissionierung_header"); + $body = $this->app->erp->ParseUserVars("Kommissionierung",$id,$body); + + if($this->app->erp->Firmendaten("footer_reihenfolge_Kommissionierung_aktivieren")=="1") { + $footervorlage = $this->app->erp->Firmendaten("footer_reihenfolge_Kommissionierung"); + if($footervorlage=='') { + $footervorlage = "{FOOTERVERSANDINFO}{FOOTERFREITEXT}{FOOTEREXTRAFREITEXT}\r\n{FOOTERTEXTVORLAGEKommissionierung}"; + } + $footervorlage = str_replace('{FOOTERVERSANDINFO}',$versandinfo,$footervorlage); + $footervorlage = str_replace('{FOOTERFREITEXT}',$freitext,$footervorlage); + $footervorlage = str_replace('{FOOTEREXTRAFREITEXT}',$extrafreitext,$footervorlage); + $footervorlage = str_replace('{FOOTERTEXTVORLAGEKommissionierung}',$this->app->erp->Beschriftung("Kommissionierung_footer"),$footervorlage); + $footervorlage = $this->app->erp->ParseUserVars("Kommissionierung",$id,$footervorlage); + $footer = $footervorlage; + } + else { + $footer = $versandinfo."$freitext\r\n$extrafreitext\r\n".$this->app->erp->ParseUserVars("Kommissionierung",$id,$this->app->erp->Beschriftung("Kommissionierung_footer")); + } + + $this->setTextDetails( + array( + 'body' => $body, + 'footer'=> $footer + ) + ); + + $orderpicking_sort = $this->app->erp->Projektdaten($this->projekt, 'orderpicking_sort'); + + $artikel = $this->app->DB->SelectArr( + sprintf( + "SELECT + ks.id, + a.nummer as itemno, + lp.kurzbezeichnung as `desc`, + ksp.menge as amount, + a.herstellernummer as `name`, + '' as steuersatz_ermaessigt, + DATE_FORMAT(zeitstempel,'%%Y%%m%%d') as datum + FROM + kommissionierung ks + INNER JOIN kommissionierung_position ksp ON ks.id = ksp.kommissionierung + INNER JOIN artikel a ON a.id = ksp.artikel + INNER JOIN lager_platz lp ON lp.id = ksp.lager_platz + WHERE ks.id = %d", + $id + ) + ); + + foreach($artikel as $key=>$value) { + $this->addItem($value); + } + + $this->filename = $data['datum']."_KS".$id.".pdf"; + $this->setBarcode($id); + + $corrDetails = array(); + + if (!empty($data['auftragnummer'])) { + $corrDetails['Auftrag'] = $data['auftragnummer']; + } + if (!empty($data['lieferscheinnummer'])) { + $corrDetails['Lieferschein'] = $data['lieferscheinnummer']; + } + if (!empty($data['name'])) { + $corrDetails['Adresse'] = $data['name']; + } + if (!empty($data['tatsaechlicheslieferdatum'])) { + $corrDetails['Liefertermin'] = $data['tatsaechlicheslieferdatum']; + } + $this->setCorrDetails($corrDetails, true); + } +} diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 2f2b14bb..a070509b 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -5636,6 +5636,8 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. { $this->kommissionierung = $this->app->erp->GetNextKommissionierung(); } + + // mit der funktionen koennen nur erstauftraege abgewickelt koennen!!! $internmodus = 0; if($id!='') @@ -5710,7 +5712,7 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. { $useredittimestamp = 1000; } - + $anzahl_artikel = $this->app->DB->Select("SELECT id FROM auftrag_position WHERE auftrag=$id LIMIT 1"); if($anzahl_artikel <= 0) { @@ -5920,7 +5922,6 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. $druckercode = $this->app->erp->Firmendaten('standardversanddrucker'); - $this->app->erp->Protokoll("WeiterfuehrenAuftragZuRechnung AB $belegnr Kommissionierverfahren: $kommissionierverfahren Projekt $projekt"); switch($kommissionierverfahren) @@ -5949,12 +5950,14 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. if($this->kommissionierung){ $this->app->DB->Update( sprintf( - "UPDATE lieferschein SET kommissionierung = %d WHERE id = %d LIMIT 1", - $this->kommissionierung, $lieferschein + "UPDATE kommissionierung SET lieferschein = %d WHERE id = %d LIMIT 1", + $id, + $this->kommissionierung ) ); - $this->updateCase($this->kommissionierung); } + + $auslagernresult = $this->app->erp->LieferscheinAuslagern( $lieferschein, true, @@ -5965,9 +5968,31 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. $nurRestmenge ); + foreach ($auslagernresult['storageMovements'] as $storageMovement) { + $this->app->DB->Update( + sprintf( + "INSERT INTO kommissionierung_position (kommissionierung, artikel, lager_platz, menge) VALUES (%d, %d, %d, %d)", + $this->kommissionierung, + $storageMovement['artikel'], + $storageMovement['lager_platz'], + $storageMovement['menge'] + ) + ); + } + + // Kommissionierschein drucken? + if ($projektarr['autodruckkommissionierscheinstufe1']) { + $Brief = new KommissionierungPDF($this->app, styleData: array('ohne_steuer' => true, 'artikeleinheit' => false, 'abstand_boxrechtsoben' => -70, 'abstand_artikeltabelleoben' => -70, 'abstand_betreffzeileoben' => -70, 'preise_ausblenden' => true)); + $Brief->GetKommissionierung($this->kommissionierung); + $tmpfile = $Brief->displayTMP(); + for($mengedruck=$projektarr['autodruckkommissionierscheinstufe1menge'];$mengedruck > 0;$mengedruck--) { + $druckercode = $this->app->erp->Projektdaten($projekt,'druckerlogistikstufe1'); + $this->app->printer->Drucken($druckercode, $tmpfile); + } + unlink($tmpfile); + } + // Prozesse ohne Versandzentrum - - $this->app->erp->BriefpapierHintergrundDisable($druckercode); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable;