Produktion WIP reservieren

This commit is contained in:
OpenXE 2022-11-03 12:23:53 +00:00
parent 202892b9da
commit 13d776750e
3 changed files with 245 additions and 80 deletions

View File

@ -9571,7 +9571,7 @@ CREATE TABLE IF NOT EXISTS `produktion` (
`angebot` varchar(255) NOT NULL, `angebot` varchar(255) NOT NULL,
`freitext` text NOT NULL, `freitext` text NOT NULL,
`internebemerkung` text NOT NULL, `internebemerkung` text NOT NULL,
`status` varchar(64) NOT NULL, `status` varchar(64) NOT NULL default 'angelegt',
`adresse` int(11) NOT NULL, `adresse` int(11) NOT NULL,
`name` varchar(255) NOT NULL, `name` varchar(255) NOT NULL,
`abteilung` varchar(255) NOT NULL, `abteilung` varchar(255) NOT NULL,

View File

@ -1,7 +1,7 @@
<div id="tabs"> <div id="tabs">
<ul> <ul>
<li><a href="#tabs-1">Produktion</a></li> <li><a href="#tabs-1">Allgemein</a></li>
<li><a href="#tabs-2">Positionen</a></li> <li><a href="#tabs-2">Produktion</a></li>
<li><a href="#tabs-3">Vorschau</a></li> <li><a href="#tabs-3">Vorschau</a></li>
<li><a href="#tabs-4">Protokoll</a></li> <li><a href="#tabs-4">Protokoll</a></li>
</ul> </ul>
@ -14,7 +14,7 @@
<div class="col-xs-12 col-md-12 col-md-height"> <div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height"> <div class="inside inside-full-height">
<fieldset> <fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>[ARTIKELNR] - [ARTIKELNAME]|}</legend> <legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS] [STATUSICONS]
</fieldset> </fieldset>
</div> </div>
@ -129,7 +129,7 @@
<div class="col-xs-14 col-md-12 col-md-height"> <div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height"> <div class="inside inside-full-height">
<fieldset> <fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>[ARTIKELNR] - [ARTIKELNAME]|}</legend> <legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS] [STATUSICONS]
</fieldset> </fieldset>
</div> </div>
@ -141,13 +141,13 @@
<div class="col-xs-14 col-md-6 col-md-height"> <div class="col-xs-14 col-md-6 col-md-height">
<div class="inside inside-full-height"> <div class="inside inside-full-height">
<fieldset> <fieldset>
<legend [AKTION_ARTIKEL_PLANEN_VISIBLE]>{|Zu produzierende Artikel|}</legend> <legend [AKTION_PLANEN_VISIBLE]>{|Zu produzierende Artikel|}</legend>
<legend [ARTIKEL_MENGE_VISIBLE]>{|Produktionsfortschritt|}</legend> <legend [ARTIKEL_MENGE_VISIBLE]>{|Produktionsfortschritt|}</legend>
<table width="100%" border="0"> <table width="100%" border="0">
<tr [AKTION_ARTIKEL_PLANEN_VISIBLE]><td>{|Artikel|}:</td></tr> <tr [AKTION_PLANEN_VISIBLE]><td>{|Artikel|}:</td></tr>
<tr [AKTION_ARTIKEL_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen" id="artikel_planen" value="[ARTIKEL_PLANEN]" size="20"></td></tr> <tr [AKTION_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen" id="artikel_planen" value="[ARTIKEL_PLANEN]" size="20"></td></tr>
<tr [AKTION_ARTIKEL_PLANEN_VISIBLE]><td>{|Planmenge|}:</td></tr> <tr [AKTION_PLANEN_VISIBLE]><td>{|Planmenge|}:</td></tr>
<tr [AKTION_ARTIKEL_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen_menge" id="artikel_planen_menge" value="[ARTIKEL_PLANEN_MENGE]" size="20"></td></tr> <tr [AKTION_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen_menge" id="artikel_planen_menge" value="[ARTIKEL_PLANEN_MENGE]" size="20"></td></tr>
<tr [ARTIKEL_MENGE_VISIBLE]><td>{|Menge geplant|}:</td><td>{|Menge erfolgreich|}:</td><td>{|Ausschuss|}:</td></tr> <tr [ARTIKEL_MENGE_VISIBLE]><td>{|Menge geplant|}:</td><td>{|Menge erfolgreich|}:</td><td>{|Ausschuss|}:</td></tr>
<tr [ARTIKEL_MENGE_VISIBLE]><td>[MENGE_GEPLANT]</td><td>[MENGEERFOLGREICH]</td><td>[MENGEAUSSCHUSS]</td></tr> <tr [ARTIKEL_MENGE_VISIBLE]><td>[MENGE_GEPLANT]</td><td>[MENGEERFOLGREICH]</td><td>[MENGEAUSSCHUSS]</td></tr>
</table> </table>
@ -172,7 +172,7 @@
<fieldset> <fieldset>
<table width="100%" border="0" class="mkTableFormular"> <table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend> <legend>{|Aktionen|}</legend>
<tr [AKTION_ARTIKEL_PLANEN_VISIBLE]><td><button name="submit" value="planen" class="ui-button-icon" style="width:100%;">Planen</button></td></tr> <tr [AKTION_PLANEN_VISIBLE]><td><button name="submit" value="planen" class="ui-button-icon" style="width:100%;">Planen</button></td></tr>
<tr [AKTION_FREIGEBEN_VISIBLE]><td><button name="submit" value="freigeben" class="ui-button-icon" style="width:100%;">Freigeben</button></td></tr> <tr [AKTION_FREIGEBEN_VISIBLE]><td><button name="submit" value="freigeben" class="ui-button-icon" style="width:100%;">Freigeben</button></td></tr>
<tr [AKTION_RESERVIEREN_VISIBLE]><td><button name="submit" value="reservieren" class="ui-button-icon" style="width:100%;">Reservieren</button></td></tr> <tr [AKTION_RESERVIEREN_VISIBLE]><td><button name="submit" value="reservieren" class="ui-button-icon" style="width:100%;">Reservieren</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="produzieren" class="ui-button-icon" style="width:100%;">Produzieren</button></td></tr> <tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="produzieren" class="ui-button-icon" style="width:100%;">Produzieren</button></td></tr>

View File

@ -30,21 +30,6 @@ class Produktion {
switch ($name) { switch ($name) {
case "produktion_list": case "produktion_list":
$allowed['produktion_list'] = array('list'); $allowed['produktion_list'] = array('list');
/*
Produktion
Kd-Nr.
Kunde
Vom
Bezeichnung
Soll
Ist
Zeit geplant
Zeit gebucht
Projekt
Status
Monitor
Menü
*/
// $heading = array('','','datum', 'art', 'projekt', 'belegnr', 'internet', 'bearbeiter', 'angebot', 'freitext', 'internebemerkung', 'status', 'adresse', 'name', 'abteilung', 'unterabteilung', 'strasse', 'adresszusatz', 'ansprechpartner', 'plz', 'ort', 'land', 'ustid', 'ust_befreit', 'ust_inner', 'email', 'telefon', 'telefax', 'betreff', 'kundennummer', 'versandart', 'vertrieb', 'zahlungsweise', 'zahlungszieltage', 'zahlungszieltageskonto', 'zahlungszielskonto', 'bank_inhaber', 'bank_institut', 'bank_blz', 'bank_konto', 'kreditkarte_typ', 'kreditkarte_inhaber', 'kreditkarte_nummer', 'kreditkarte_pruefnummer', 'kreditkarte_monat', 'kreditkarte_jahr', 'firma', 'versendet', 'versendet_am', 'versendet_per', 'versendet_durch', 'autoversand', 'keinporto', 'keinestornomail', 'abweichendelieferadresse', 'liefername', 'lieferabteilung', 'lieferunterabteilung', 'lieferland', 'lieferstrasse', 'lieferort', 'lieferplz', 'lieferadresszusatz', 'lieferansprechpartner', 'packstation_inhaber', 'packstation_station', 'packstation_ident', 'packstation_plz', 'packstation_ort', 'autofreigabe', 'freigabe', 'nachbesserung', 'gesamtsumme', 'inbearbeitung', 'abgeschlossen', 'nachlieferung', 'lager_ok', 'porto_ok', 'ust_ok', 'check_ok', 'vorkasse_ok', 'nachnahme_ok', 'reserviert_ok', 'bestellt_ok', 'zeit_ok', 'versand_ok', 'partnerid', 'folgebestaetigung', 'zahlungsmail', 'stornogrund', 'stornosonstiges', 'stornorueckzahlung', 'stornobetrag', 'stornobankinhaber', 'stornobankkonto', 'stornobankblz', 'stornobankbank', 'stornogutschrift', 'stornogutschriftbeleg', 'stornowareerhalten', 'stornomanuellebearbeitung', 'stornokommentar', 'stornobezahlt', 'stornobezahltam', 'stornobezahltvon', 'stornoabgeschlossen', 'stornorueckzahlungper', 'stornowareerhaltenretour', 'partnerausgezahlt', 'partnerausgezahltam', 'kennen', 'logdatei', 'bezeichnung', 'datumproduktion', 'anschreiben', 'usereditid', 'useredittimestamp', 'steuersatz_normal', 'steuersatz_zwischen', 'steuersatz_ermaessigt', 'steuersatz_starkermaessigt', 'steuersatz_dienstleistung', 'waehrung', 'schreibschutz', 'pdfarchiviert', 'pdfarchiviertversion', 'typ', 'reservierart', 'auslagerart', 'projektfiliale', 'datumauslieferung', 'datumbereitstellung', 'unterlistenexplodieren', 'charge', 'arbeitsschrittetextanzeigen', 'einlagern_ok', 'auslagern_ok', 'mhd', 'auftragmengenanpassen', 'internebezeichnung', 'mengeoriginal', 'teilproduktionvon', 'teilproduktionnummer', 'parent', 'parentnummer', 'bearbeiterid', 'mengeausschuss', 'mengeerfolgreich', 'abschlussbemerkung', 'auftragid', 'funktionstest', 'seriennummer_erstellen', 'unterseriennummern_erfassen', 'datumproduktionende', 'standardlager', 'Men&uuml;'); // $heading = array('','','datum', 'art', 'projekt', 'belegnr', 'internet', 'bearbeiter', 'angebot', 'freitext', 'internebemerkung', 'status', 'adresse', 'name', 'abteilung', 'unterabteilung', 'strasse', 'adresszusatz', 'ansprechpartner', 'plz', 'ort', 'land', 'ustid', 'ust_befreit', 'ust_inner', 'email', 'telefon', 'telefax', 'betreff', 'kundennummer', 'versandart', 'vertrieb', 'zahlungsweise', 'zahlungszieltage', 'zahlungszieltageskonto', 'zahlungszielskonto', 'bank_inhaber', 'bank_institut', 'bank_blz', 'bank_konto', 'kreditkarte_typ', 'kreditkarte_inhaber', 'kreditkarte_nummer', 'kreditkarte_pruefnummer', 'kreditkarte_monat', 'kreditkarte_jahr', 'firma', 'versendet', 'versendet_am', 'versendet_per', 'versendet_durch', 'autoversand', 'keinporto', 'keinestornomail', 'abweichendelieferadresse', 'liefername', 'lieferabteilung', 'lieferunterabteilung', 'lieferland', 'lieferstrasse', 'lieferort', 'lieferplz', 'lieferadresszusatz', 'lieferansprechpartner', 'packstation_inhaber', 'packstation_station', 'packstation_ident', 'packstation_plz', 'packstation_ort', 'autofreigabe', 'freigabe', 'nachbesserung', 'gesamtsumme', 'inbearbeitung', 'abgeschlossen', 'nachlieferung', 'lager_ok', 'porto_ok', 'ust_ok', 'check_ok', 'vorkasse_ok', 'nachnahme_ok', 'reserviert_ok', 'bestellt_ok', 'zeit_ok', 'versand_ok', 'partnerid', 'folgebestaetigung', 'zahlungsmail', 'stornogrund', 'stornosonstiges', 'stornorueckzahlung', 'stornobetrag', 'stornobankinhaber', 'stornobankkonto', 'stornobankblz', 'stornobankbank', 'stornogutschrift', 'stornogutschriftbeleg', 'stornowareerhalten', 'stornomanuellebearbeitung', 'stornokommentar', 'stornobezahlt', 'stornobezahltam', 'stornobezahltvon', 'stornoabgeschlossen', 'stornorueckzahlungper', 'stornowareerhaltenretour', 'partnerausgezahlt', 'partnerausgezahltam', 'kennen', 'logdatei', 'bezeichnung', 'datumproduktion', 'anschreiben', 'usereditid', 'useredittimestamp', 'steuersatz_normal', 'steuersatz_zwischen', 'steuersatz_ermaessigt', 'steuersatz_starkermaessigt', 'steuersatz_dienstleistung', 'waehrung', 'schreibschutz', 'pdfarchiviert', 'pdfarchiviertversion', 'typ', 'reservierart', 'auslagerart', 'projektfiliale', 'datumauslieferung', 'datumbereitstellung', 'unterlistenexplodieren', 'charge', 'arbeitsschrittetextanzeigen', 'einlagern_ok', 'auslagern_ok', 'mhd', 'auftragmengenanpassen', 'internebezeichnung', 'mengeoriginal', 'teilproduktionvon', 'teilproduktionnummer', 'parent', 'parentnummer', 'bearbeiterid', 'mengeausschuss', 'mengeerfolgreich', 'abschlussbemerkung', 'auftragid', 'funktionstest', 'seriennummer_erstellen', 'unterseriennummern_erfassen', 'datumproduktionende', 'standardlager', 'Men&uuml;');
$heading = array('','','Produktion','Kd-Nr.','Kunde','Vom','Bezeichnung','Soll','Ist','Zeit geplant','Zeit gebucht','Projekt','Status','Monitor','Men&uuml;'); $heading = array('','','Produktion','Kd-Nr.','Kunde','Vom','Bezeichnung','Soll','Ist','Zeit geplant','Zeit gebucht','Projekt','Status','Monitor','Men&uuml;');
@ -84,7 +69,6 @@ Menü
(SELECT projekt.abkuerzung FROM projekt WHERE p.projekt = projekt.id LIMIT 1), (SELECT projekt.abkuerzung FROM projekt WHERE p.projekt = projekt.id LIMIT 1),
p.status, p.status,
(" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`, (" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`,
p.id,
p.id p.id
FROM produktion p"; FROM produktion p";
@ -129,9 +113,13 @@ Menü
break; break;
case "produktion_position_source_list": case "produktion_position_source_list":
$id = $app->Secure->GetGET('id'); $id = $app->Secure->GetGET('id');
$sql = "SELECT standardlager FROM produktion WHERE id=$id";
$standardlager = $app->DB->SelectArr($sql)[0]['standardlager'];
$allowed['produktion_position_list'] = array('list'); $allowed['produktion_position_list'] = array('list');
$heading = array('','','Nummer', 'Artikel', 'Projekt', 'Planmenge', 'Lager', 'Reserviert', 'Verbraucht', 'Men&uuml;'); $heading = array('','','Nummer', 'Artikel', 'Projekt', 'Planmenge', 'Lager (verf&uuml;gbar)', 'Reserviert', 'Verbraucht', 'Men&uuml;');
$width = array('1%','1%', '5%','30%', '5%', '1%', '1%', '1%', '1%' , '1%'); // Fill out manually later $width = array('1%','1%', '5%','30%', '5%', '1%', '1%', '1%' , '1%', '1%'); // Fill out manually later
$findcols = array('(SELECT a.name FROM artikel a WHERE a.id = p.artikel LIMIT 1)', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt'); $findcols = array('(SELECT a.name FROM artikel a WHERE a.id = p.artikel LIMIT 1)', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt');
$searchsql = array('p.produktion', 'p.artikel', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt'); $searchsql = array('p.produktion', 'p.artikel', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt');
@ -150,8 +138,14 @@ Menü
(SELECT a.name_de FROM artikel a WHERE a.id = p.artikel LIMIT 1) as name, (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, (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,0,'de_DE'), FORMAT(p.menge,0,'de_DE'),
'tbd' as Lager, CONCAT (
'tbd' as Reserviert, COALESCE(FORMAT ((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0),0),
' (',
COALESCE(FORMAT ((SELECT SUM(menge) FROM lager_platz_inhalt lpi WHERE lpi.lager_platz = $standardlager AND lpi.artikel = p.artikel),0),0)-
COALESCE(FORMAT ((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel),0),0),
')'
) 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) as Reserviert,
FORMAT(p.geliefert_menge,0,'de_DE'), FORMAT(p.geliefert_menge,0,'de_DE'),
p.id p.id
FROM produktion_position p"; FROM produktion_position p";
@ -192,6 +186,9 @@ Menü
$geliefert_menge = $this->app->DB->SelectArr("SELECT geliefert_menge FROM produktion_position pp WHERE pp.produktion = $id"); $geliefert_menge = $this->app->DB->SelectArr("SELECT geliefert_menge FROM produktion_position pp WHERE pp.produktion = $id");
if (empty($geliefert_menge)) { if (empty($geliefert_menge)) {
$sql = "UPDATE produktion SET status='storniert' WHERE id = '$id'";
$this->app->DB->Update($sql);
$this->app->Tpl->Set('MESSAGE', "<div class=\"info\">Der Eintrag wurde storniert.</div>"); $this->app->Tpl->Set('MESSAGE', "<div class=\"info\">Der Eintrag wurde storniert.</div>");
} else { } else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag kann nicht storniert werden, da bereits Buchungen vorhanden sind.</div>"); $this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag kann nicht storniert werden, da bereits Buchungen vorhanden sind.</div>");
@ -217,6 +214,8 @@ Menü
$id = $this->app->Secure->GetGET('id'); $id = $this->app->Secure->GetGET('id');
$input = $this->GetInput(); $input = $this->GetInput();
$sql = "SELECT status FROM produktion WHERE id = '$id'";
$status = $this->app->DB->SELECT($sql);
// foreach ($input as $key => $value) { // foreach ($input as $key => $value) {
// echo($key." -> ".$value."<br>\n"); // echo($key." -> ".$value."<br>\n");
@ -226,6 +225,7 @@ Menü
if (empty($id)) { if (empty($id)) {
// New item // New item
$id = 'NULL'; $id = 'NULL';
} else { } else {
} }
@ -248,11 +248,11 @@ Menü
$columns = $columns.$fix.$key; $columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'"; $values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'"; $update = $update.$fix.$key." = '$value'";
$fix = ", "; $fix = ", ";
} }
$sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update; $sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
if ($id == 'NULL') { if ($id == 'NULL') {
@ -274,13 +274,10 @@ Menü
break; break;
} }
$artikel_planen = $this->app->Secure->GetPOST('artikel_planen'); $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');
$sql = "SELECT id FROM artikel WHERE stueckliste = '1' AND nummer = '".$artikel_planen."'"; if (!$artikel_planen_id) {
$artikel_id = $this->app->DB->SelectArr($sql)[0]['id'];
if (!$artikel_id) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Artikel ist keine St&uuml;ckliste.</div>"); $this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Artikel ist keine St&uuml;ckliste.</div>");
break; break;
} }
@ -289,7 +286,7 @@ Menü
$position_array = array(); $position_array = array();
$sql = "SELECT '".$id."' as id, artikel, menge, '0' as stuecklistestufe FROM stueckliste WHERE stuecklistevonartikel = ".$artikel_id; $sql = "SELECT '".$id."' as id, artikel, menge, '0' as stuecklistestufe FROM stueckliste WHERE stuecklistevonartikel = ".$artikel_planen_id;
$stueckliste = $this->app->DB->SelectArr($sql); $stueckliste = $this->app->DB->SelectArr($sql);
if (empty($stueckliste)) { if (empty($stueckliste)) {
@ -302,21 +299,173 @@ Menü
$position_values[] = '('.implode(",",$value).',\'\')'; $position_values[] = '('.implode(",",$value).',\'\')';
} }
$sql = "INSERT INTO produktion_position (produktion, artikel, menge, stuecklistestufe, projekt) VALUES ( $id, $artikel_id, $artikel_planen_menge, 1, ''), ".implode(',',$position_values); $sql = "INSERT INTO produktion_position (produktion, artikel, menge, stuecklistestufe, projekt) VALUES ( $id, $artikel_planen_id, $artikel_planen_menge, 1, ''), ".implode(',',$position_values);
// echo($sql);
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Planung angelegt.</div>"); $this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Planung angelegt.</div>");
break; break;
case 'freigeben': case 'freigeben':
$sql = "UPDATE produktion SET status = 'freigegeben' WHERE id=$id"; $this->app->erp->BelegFreigabe("produktion",$id);
break;
case 'reservieren':
// Check quantities and reserve for every position
$sql = "SELECT standardlager FROM produktion WHERE id=$id";
$standardlager = $this->app->DB->SelectArr($sql)[0]['standardlager'];
if($standardlager == 0) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Kein Lager ausgew&auml;hlt.</div>");
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
$teilreservierung_durchgefuehrt = false;
$reservierung_durchgefuehrt = false;
foreach ($materialbedarf as $materialbedarf_position) {
$menge_reservieren = $materialbedarf_position['menge'] - $materialbedarf_position['geliefert_menge'];
$sql = "SELECT menge FROM lager_reserviert WHERE objekt='produktion' AND parameter = $id AND artikel = ".$materialbedarf_position['artikel']." AND posid = ".$materialbedarf_position['id'];
$menge_reserviert_lager_platz_diese_produktion = $this->app->DB->SelectArr($sql)[0];
if ($menge_reserviert_lager_platz_diese_produktion == null) {
$menge_reserviert_lager_platz_diese_produktion = 0;
}
$sql = "SELECT SUM(menge) as menge FROM lager_reserviert WHERE objekt='produktion' AND parameter = $id AND artikel = ".$materialbedarf_position['artikel'];
$menge_reserviert_lager_platz = $this->app->DB->SelectArr($sql)[0]['menge'];
if ($menge_reserviert_lager_platz == null) {
$menge_reserviert_lager_platz = 0;
}
$sql = "SELECT menge FROM lager_platz_inhalt WHERE lager_platz = $standardlager AND artikel = ".$materialbedarf_position['artikel'];
$lagermenge = $this->app->DB->SelectArr($sql)[0]['menge'];
if ($lagermenge == null) {
$lagermenge = 0;
}
$lagermenge_frei = $lagermenge - $menge_reserviert_lager_platz;
// echo($materialbedarf_position['nummer']." Lager ".$lagermenge." frei ".$lagermenge_frei." reserviert ".$menge_reserviert_lager_platz."<br>");
if ($lagermenge_frei > 0) {
if ($menge_reservieren > $lagermenge_frei) {
// partial
$teilreservierung_durchgefuehrt = true;
$menge_reservieren = $lagermenge_frei;
}
// Reserve stock items
if ($menge_reserviert_lager_platz_diese_produktion > 0) {
// Modify given entry
$sql = "UPDATE lager_reserviert SET menge=$menge_reservieren WHERE objekt='produktion' AND parameter = $id AND artikel = ".$materialbedarf_position['artikel']." AND posid = ".$materialbedarf_position['id'];
echo($sql);
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
} else {
// Create new entry
$sql = "INSERT INTO lager_reserviert (menge,objekt,parameter,artikel,posid,lager_platz) VALUES (".
$menge_reservieren.",".
"'produktion',".
$id.",".
$materialbedarf_position['artikel'].",".
$materialbedarf_position['id'].",".
$standardlager.
")";
echo($sql);
$this->app->DB->Update($sql);
}
$reservierung_durchgefuehrt = true;
}
}
// Message output
if ($reservierung_durchgefuehrt) {
if ($teilreservierung_durchgefuehrt) {
$this->app->Tpl->Add('MESSAGE', "<div class=\"info\">Teilreservierung durchgeführt.</div>");
}
else {
$this->app->Tpl->Add('MESSAGE', "<div class=\"info\">Reservierung durchgeführt.</div>");
}
} else {
$this->app->Tpl->Add('MESSAGE', "<div class=\"error\">Keine Reservierung durchgeführt!</div>");
}
break; break;
case 'produzieren': case 'produzieren':
// Check quanitites -> all must be reserved before production
// 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)) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Keine Planung vorhanden.</div>");
break;
}
$menge_produzieren = $this->app->Secure->GetPOST('menge_produzieren');
$menge_ausschuss = $this->app->Secure->GetPOST('menge_ausschuss');
if (empty($menge_ausschuss)) {
$menge_ausschuss = 0;
}
$menge_plan = $produktionsartikel_position['menge'];
$menge_geliefert = $produktionsartikel_position['geliefert_menge'];
if ($menge_produzieren + $menge_ausschuss + $menge_geliefert > $menge_plan) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Planmenge überschritten.</div>");
break;
}
$sql = "SELECT standardlager FROM produktion WHERE id=$id";
$standardlager = $this->app->DB->SelectArr($sql)[0]['standardlager'];
// Remove parts from stock using LieferscheinAuslagern -> Don't use it, because it will automatically remove from any stock
// function LieferscheinAuslagern($lieferschein,$anzeige_lagerplaetze_in_lieferschein=false, $standardlager = 0, $belegtyp = 'lieferschein', $chargenmhdnachprojekt = 0, $forceseriennummerngeliefertsetzen = false,$nurrestmenge = false, $lager_platz_vpe = 0, $lpiid = 0)
// $this->app->erp->LieferscheinAuslagern($id, true, $standardlager, 'produktion', 0, false, true, 0, 0);
// Collate parts, check stock and remove from stock
// ERPAPI function LagerFreieMenge($artikel, $mitautolagersperre = false, $standardlager = 0, $projektlager = 0)
$sql = "SELECT artikel, FORMAT(menge,0) as menge, FORMAT(geliefert_menge,0) as geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0";
$materialbedarf = $this->app->DB->SelectArr($sql);
foreach ($materialbedarf as $materialbedarf_position) {
if ($materialbedarf_position['menge'] > $this->app->erp->LagerFreieMenge($materialbedarf_position['artikel'], false, $standardlager, 0)) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Lagermenge nicht ausreichend.</div>");
$error = true;
break;
}
}
if ($error) {
break;
}
// ERPAPI
// return -1 on error, 1 on success
// function LagerAuslagernRegal($artikel,$regal,$menge,$projekt,$grund,$importer="", $doctype = "", $doctypeid = 0, $lager_platz_vpe = 0, $lpiid = 0)
// Insert produced parts into stock
// ERPAPI
// function LagerEinlagern($artikel,$menge,$regal,$projekt,$grund="",$importer="",$paketannahme="",$doctype = "", $doctypeid = 0, $vpeid = 0, $permanenteinventur = 0, $adresse = 0)
// ... todo
$sql = "UPDATE produktion SET status = 'gestartet' WHERE id=$id"; $sql = "UPDATE produktion SET status = 'gestartet' WHERE id=$id";
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
$this->app->Tpl->Set('MESSAGE', "<div class=\"info\">Produktion durchgeführt.</div>");
break; break;
case 'abschliessen': case 'abschliessen':
$sql = "UPDATE produktion SET status = 'abgeschlossen' WHERE id=$id"; $sql = "UPDATE produktion SET status = 'abgeschlossen' WHERE id=$id";
@ -328,6 +477,7 @@ Menü
// Load values again from database // Load values again from database
// toDo: cleanup
$sql = "SELECT SQL_CALC_FOUND_ROWS $sql = "SELECT SQL_CALC_FOUND_ROWS
p.id, p.id,
@ -505,7 +655,7 @@ Menü
$this->app->YUI->AutoComplete("kundennummer", "kunde", 1); $this->app->YUI->AutoComplete("kundennummer", "kunde", 1);
$this->app->YUI->AutoComplete("auftragid", "auftrag", 1); $this->app->YUI->AutoComplete("auftragid", "auftrag", 1);
$this->app->YUI->AutoComplete("artikel_planen", "artikelnummer", 1); $this->app->YUI->AutoComplete("artikel_planen", "stuecklistenartikel");
$this->app->YUI->AutoComplete("standardlager", "lagerplatz"); $this->app->YUI->AutoComplete("standardlager", "lagerplatz");
$this->app->Tpl->Set('STANDARDLAGER', $this->app->erp->ReplaceLagerPlatz(false,$produktion_from_db['standardlager'],false)); // Convert ID to form display $this->app->Tpl->Set('STANDARDLAGER', $this->app->erp->ReplaceLagerPlatz(false,$produktion_from_db['standardlager'],false)); // Convert ID to form display
@ -520,25 +670,42 @@ Menü
$this->app->YUI->CkEditor("freitext","internal", null, 'JQUERY'); $this->app->YUI->CkEditor("freitext","internal", null, 'JQUERY');
$this->app->YUI->CkEditor("internebemerkung","internal", null, 'JQUERY'); $this->app->YUI->CkEditor("internebemerkung","internal", null, 'JQUERY');
/*
UI Elements
AKTION_SPEICHERN_DISABLED
AKTION_PLANEN_VISIBLE
AKTION_FREIGEBEN_VISIBLE
AKTION_RESERVIEREN_VISIBLE
AKTION_PRODUZIEREN_VISIBLE
AKTION_ABSCHLIESSEN_VISIBLE
POSITIONEN_TAB_VISIBLE
*/
// Reparse positions // Reparse positions
$sql = "SELECT id,artikel, FORMAT(menge,0) as menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1"; $sql = "SELECT id,artikel, FORMAT(menge,0) as menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$produktionsartikel = $this->app->DB->SelectArr($sql)[0]; $produktionsartikel_position = $this->app->DB->SelectArr($sql)[0];
$this->app->Tpl->Set('MENGE_GEPLANT',$produktionsartikel['menge']); if (empty($produktionsartikel_position)) {
if (empty($produktionsartikel)) {
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden'); $this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden');
} else { } else {
$this->app->Tpl->Set('AKTION_ARTIKEL_PLANEN_VISIBLE','hidden');
$this->app->Tpl->Set('MENGE_GEPLANT',$produktionsartikel_position['menge']);
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
$this->app->YUI->TableSearch('PRODUKTION_POSITION_TARGET_TABELLE', 'produktion_position_target_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->TableSearch('PRODUKTION_POSITION_TARGET_TABELLE', 'produktion_position_target_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->YUI->TableSearch('PRODUKTION_POSITION_SOURCE_TABELLE', 'produktion_position_source_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->YUI->TableSearch('PRODUKTION_POSITION_SOURCE_TABELLE', 'produktion_position_source_list', "show", "", "", basename(__FILE__), __CLASS__);
$produktionsartikel_id = $produktionsartikel['artikel']; $produktionsartikel_id = $produktionsartikel_position['artikel'];
$sql = "SELECT name_de,nummer FROM artikel WHERE id=".$produktionsartikel_id; $sql = "SELECT name_de,nummer FROM artikel WHERE id=".$produktionsartikel_id;
$produktionsartikel_name = $this->app->DB->SelectArr($sql)[0]['name_de']; $produktionsartikel = $this->app->DB->SelectArr($sql)[0];
$produktionsartikel_name = $produktionsartikel['name_de'];
$produktionsartikel_nummer = $produktionsartikel['nummer'];
} }
$this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktionsartikel_name." (Produktion ".$produktion_from_db['belegnr'].")"); $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktion_from_db['belegnr']." ".$produktionsartikel_name." (".$produktionsartikel_nummer.")");
$this->app->Tpl->SetText('ARTIKELNAME', $produktionsartikel_name);
// Action menu // Action menu
switch ($produktion_from_db['status']) { switch ($produktion_from_db['status']) {
@ -549,19 +716,16 @@ Menü
break; break;
case 'freigegeben': case 'freigegeben':
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
break; break;
case 'gestartet': case 'gestartet':
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
break; break;
case 'abgeschlossen': case 'abgeschlossen':
$this->app->Tpl->Set('AKTION_SPEICHERN_DISABLED','disabled');
$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_ABSCHLIESSEN_VISIBLE','hidden');
break;
case 'storniert': case 'storniert':
$this->app->Tpl->Set('AKTION_SPEICHERN_DISABLED','disabled'); $this->app->Tpl->Set('AKTION_SPEICHERN_DISABLED','disabled');
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden'); $this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden');
@ -607,4 +771,5 @@ Menü
return $input; return $input;
} }
} }