Merge branch 'OpenXE-org:master' into master

This commit is contained in:
creatronics-de 2025-02-21 20:50:10 +01:00 committed by GitHub
commit 70ddff35bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 886 additions and 299 deletions

View File

@ -35,8 +35,10 @@ final class ErrorPageRenderer
$content .= '<h2>' . htmlspecialchars($data['exception']['message'], ENT_QUOTES) . '</h2>';
$content .= '</td></tr>';
$content .= '<tr>';
$content .= '<td width="20%" id="side">' . $this->renderInformationData($data['information']) . '</td>';
$content .= '<td width="80%" id="main">' . $this->renderExceptionData($data['exception']) . '</td>';
$content .= '</tr>';
$content .= '<tr>';
$content .= '<td width="20%" id="side">' . $this->renderInformationData($data['information']) . '</td>';
$content .= '</tr></table>';
$content .= $this->renderPageFooter();
@ -61,12 +63,10 @@ final class ErrorPageRenderer
h1, h2, h3, h4, h5, h6 { padding: 0; margin: 0.5em 0 0.5em 0; font-weight: bold; }
p { padding: 0; margin: 0 0 .25em 0; }
a, a:link, a:visited, a:hover, a:active { text-decoration: none; }
#headline { padding: 24px 12px 18px 12px; background-color: #42B8C5; }
#headline h1 { color: #F5F5F5; font-size: 2rem; margin: 1rem 0; }
#headline h2 { color: #9CD6DB; font-size: 1.1rem; font-weight: normal; margin: 1rem 0; }
#headline { padding: 5px 5px 5px 5px; background-color: #42B8C5; }
table { width: 100%; border-collapse: separate; border-spacing: 0; }
table td, table th { text-align: left; padding: 10px 0 10px 0; vertical-align: baseline; }
table th.head { padding: 5px 0 10px 0; background-color: #FFF; vertical-align: baseline; border-bottom: 2px solid #DBDBDB; }
table td, table th { text-align: left; padding: 5px 0 5px 0; vertical-align: baseline; }
table th.head { padding: 5px 0 5px 0; background-color: #FFF; vertical-align: baseline; border-bottom: 2px solid #DBDBDB; }
table th.head h3 { margin: 3px 0; }
table td.trace { background-color: #F5F5F5; vertical-align: baseline; }
table.exception { margin-bottom: 20px; border-top: 2px solid #DBDBDB; }
@ -76,8 +76,8 @@ final class ErrorPageRenderer
table.exception a:link code, table.exception a:visited code { color: #42B8C5; }
table.exception a:hover code, table.exception a:active code { color: #2F9099; }
td.stacktrace tr:last-child td { border: none; }
#main { background-color: #FFF; padding: 2rem; }
#side { min-width: 240px; padding: 5px 15px; background-color: #E9ECEF; }
#main { background-color: #FFF; padding: 5px; }
#side { min-width: 240px; padding: 5px 5px; background-color: #E9ECEF; }
#side h1, #side h2, #side h3, #side h4, #side h5, #side h6 { color: #7A7A7A; font-weight: normal; text-transform: uppercase; margin: 1em 0 0.5em 0; }
.float-right { float: right; }
.separator { color: #999; }

View File

@ -12,8 +12,9 @@ class CreateShipmentResult
{
public bool $Success = false;
public array $Errors = [];
public ?string $Label;
public ?string $ExportDocuments;
public ?string $TrackingNumber;
public ?string $TrackingUrl;
public ?string $Label = null;
public ?string $ExportDocuments = null;
public ?string $TrackingNumber = null;
public ?string $TrackingUrl = null;
public ?string $AdditionalInfo = null;
}

View File

@ -4230,7 +4230,12 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
if(!function_exists('imagejpeg'))
{
$img = "'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/icon_img_error.png title=\"Keine GD-Erweiterung installiert\" />'";
$img = "concat('
<span style=\"width:100px;text-align:center;display:block;\">
<a href=\"index.php?module=dateien&action=send&id=',d.id,'\">
<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/download.svg title=\"Datei anzeigen\" />
</a>
</span>')";
}else{
$img = "concat('<span style=\"width:100px;text-align:center;display:block;\"><a href=\"index.php?module=dateien&action=send&id=',d.id,'\"><img src=\"index.php?module=ajax&action=thumbnail&cmd=$cmd&id=',d.id,'\" style=\"border:0;max-width:100px;max-height:100px;\" /></a></span>')";
}

View File

@ -70961,6 +70961,17 @@
"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": ""
}
],
"keys": [
@ -80375,6 +80386,17 @@
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
},
{
"Field": "uebergeordnetes_projekt",
"Type": "int(11)",
"Collation": null,
"Null": "NO",
"Key": "",
"Default": "0",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
}
],
"keys": [

View File

@ -11953,6 +11953,7 @@ function SendPaypalFromAuftrag($auftrag, $test = false)
// darunter war ein else if
if($just_stueckliste=="1" && $explodiert=="0")
{
/* table lieferkette_bestellung does not exist
$checklieferkette = 0;
if($typ === 'auftrag'){
$checklieferkette = $this->app->DB->Select("SELECT id FROM lieferkette_bestellung WHERE belegtyp='auftrag' AND belegid='$auftrag' LIMIT 1");
@ -11966,14 +11967,14 @@ function SendPaypalFromAuftrag($auftrag, $test = false)
WHERE s.stuecklistevonartikel='$artikel' AND s.art!='it' AND s.art!='bt'"
);
}
else{
else{ */
$artikel_von_stueckliste = $this->app->DB->SelectArr(
"SELECT s.*, art.nummer AS artnummer,art.projekt AS artprojekt
FROM stueckliste AS s
INNER JOIN artikel AS art ON s.artikel = art.id
WHERE s.stuecklistevonartikel='$artikel'"
);
}
// }
$treffer++;
$changed = true;
@ -25360,6 +25361,7 @@ function MailSendFinal($from,$from_name,$to,$to_name,$betreff,$text,$files="",$p
$uebersetzung['dokument_lieferschein']['deutsch'] = "Lieferschein";
$uebersetzung['dokument_retoure']['deutsch'] = "Retoure";
$uebersetzung['dokument_kommissionierschein']['deutsch'] = "Kommissionierschein";
$uebersetzung['dokument_produktion']['deutsch'] = "Produktion";
$uebersetzung['dokument_ansprechpartner']['deutsch'] = "Ansprechpartner";
$uebersetzung['dokument_rechnungsdatum']['deutsch'] = "Rechnungsdatum";
$uebersetzung['dokument_proformarechnungsdatum']['deutsch'] = "Datum";
@ -27254,6 +27256,23 @@ function Firmendaten($field,$projekt="")
$eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1");
$belegnr = '';
$untergeordnetes_projekt = $projekt;
if (empty($eigenernummernkreis)) {
do {
$uebergeordnetes_projekt = $this->app->DB->Select("SELECT uebergeordnetes_projekt FROM projekt WHERE id='$untergeordnetes_projekt' LIMIT 1");
if (!empty($uebergeordnetes_projekt)) {
$eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$uebergeordnetes_projekt' LIMIT 1");
if ($eigenernummernkreis) {
$projekt = $uebergeordnetes_projekt;
break;
} else {
$untergeordnetes_projekt = $uebergeordnetes_projekt;
}
}
} while (!empty($uebergeordnetes_projekt) && $uebergeordnetes_projekt != $projekt);
}
if($eigenernummernkreis=='1')
{
$allowedtypes = ['angebot', 'auftrag', 'rechnung', 'lieferschein', 'arbeitsnachweis', 'reisekosten',

View File

@ -445,6 +445,8 @@ abstract class Versanddienstleister
$this->app->printer->Drucken($this->documentPrinterId, $filefullpath);
}
$ret['messages'][] = ['class' => 'info', 'text' => "Paketmarke wurde erfolgreich erstellt: $result->TrackingNumber"];
if ($result->AdditionalInfo != null)
$ret['messages'][] = ['class' => 'info', 'text' => $result->AdditionalInfo];
} else {
$ret['messages'] = array_map(fn(string $item) => ['class' => 'error', 'text' => $item], array_unique($result->Errors));
}

View File

@ -1922,7 +1922,7 @@ class Briefpapier extends SuperFPDF {
{
if(!empty($this->corrDetails) || !empty($this->boldCorrDetails) || !empty($this->italicCorrDetails)
|| !empty($this->italicBoldCorrDetails))
$this->renderCorrDetails();
$corrDetailsY = $this->renderCorrDetails();
}
$this->renderDoctype();
@ -1932,6 +1932,10 @@ class Briefpapier extends SuperFPDF {
$this->textDetails['body']=$this->letterDetails['body'];
}
if ($corrDetailsY > $this->GetY()) {
$this->SetY($corrDetailsY);
}
$this->renderText();
if(!empty($this->items)) {
$this->renderItems();
@ -1943,7 +1947,7 @@ class Briefpapier extends SuperFPDF {
$this->renderFooter();
$this->logofile = "";
$this->briefpapier="";
$this->briefpapier2="";
$this->briefpapier2="";
if($this->addpdf)
{
foreach($this->addpdf as $addpdf)
@ -2305,17 +2309,35 @@ class Briefpapier extends SuperFPDF {
$this->SetY($this->GetY()+$this->abstand_boxrechtsoben);
$this->SetFont($this->GetFont(),'',$fontinfobox);
$tempY = $this->GetY();
/* $tempY = $this->GetY();
$this->SetX($startpos_links_rechts);
$this->MultiCell($this->box_breite1,4,$titleStr,"",$this->boxausrichtung); //BL
$this->SetXY($startpos_links_rechts+$breite_spalte_rechts,$tempY);
$this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR
$this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR*/
$this->SetY(80+$this->abstand_artikeltabelleoben); //Hoehe Box
//$this->SetY(60);//+$this->abstand_artikeltabelleoben); //Hoehe Box
foreach($this->corrDetails as $title => $value) {
if($value!="")
{
$titleStr = $title !== ''?$this->app->erp->ReadyForPDF($title).": \n":" \n";
$valueStr = $this->app->erp->ReadyForPDF($value)."\n";
$startY = $this->GetY();
$this->SetX($startpos_links_rechts);
$this->MultiCell($this->box_breite1,4,$titleStr,"",$this->boxausrichtung); //BL
$tempY = $this->GetY();
$this->SetY($startY);
$this->SetX($startpos_links_rechts+$breite_spalte_rechts);
$this->MultiCell($this->box_breitexi21,4,$valueStr,"",$this->boxausrichtung); //BR*/
if ($tempY > $this->GetY()) {
$this->SetY($tempY);
}
}
}
return($this->GetY());
}
public function renderDoctype() {
//$this->Ln(1);

View File

@ -144,25 +144,29 @@ class EtikettenPDF extends SuperFPDF {
break;
case "barcode":
if((String)($items->attributes()->type)=="E30") {
if ((String)($items->attributes()->type)=="E30") {
$this->EAN13($items->attributes()->x,$items->attributes()->y, $items[0],$items->attributes()->size);
}
else if((String)($items->attributes()->type)=="Code128" || (String)($items->attributes()->type)=="1") {
else if ((String)($items->attributes()->type)=="Code128" || (String)($items->attributes()->type)=="1") {
$this->Code128($items->attributes()->x, $items->attributes()->y, $items[0], $items->attributes()->width, $items->attributes()->size);
}
else if((String)($items->attributes()->type)=="GS1-128" || (String)($items->attributes()->type)=="1") {
//$items[0] = "!FNC1!0104012345012345!FNC1!081231!FNC1!1012345";
$tmp =explode("!FNC1!",$items[0]);
$codewithfnc1 = implode(chr(206),$tmp);
//echo chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345";
//$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345", $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
$this->Code128($items->attributes()->x, $items->attributes()->y, $codewithfnc1, $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
//$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206).$items[0], $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
else if ((String)($items->attributes()->type)=="GS1-128") {
//$items[0] = "!FNC1!0104012345012345!FNC1!081231!FNC1!1012345";
$tmp =explode("!FNC1!",$items[0]);
$codewithfnc1 = implode(chr(206),$tmp);
//echo chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345";
//$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206)."0104012345012345".chr(206)."081231".chr(206)."1012345", $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
$this->Code128($items->attributes()->x, $items->attributes()->y, $codewithfnc1, $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
//$this->Code128($items->attributes()->x, $items->attributes()->y, chr(206).$items[0], $items->attributes()->width, $items->attributes()->size); // 206 = FNC1
}
else { // standard auf 2 bzw default
$this->Code39($items->attributes()->x,$items->attributes()->y, $items[0], 0.5, $items->attributes()->size);//, $printText=false)
else { // standard Type 2, Code39
if (isset($items->attributes()->linewidth)) {
$baseline = $items->attributes()->linewidth;
} else {
$baseline = 0.5;
}
$this->Code39($items->attributes()->x,$items->attributes()->y, $items[0], $baseline, $items->attributes()->size);//, $printText=false)
}
break;

View File

@ -0,0 +1,264 @@
<?php
/*
* SPDX-FileCopyrightText: 2024 OpenXE-org
* SPDX-FileCopyrightText: 2019 Xentral (c) Xentral ERP Software GmbH, Fuggerstrasse 11, D-86150 Augsburg, Germany
*
* SPDX-License-Identifier: LicenseRef-EGPL-3.1
*/
?>
<?php
if(!class_exists('BriefpapierCustom'))
{
class BriefpapierCustom extends Briefpapier
{
}
}
class ProduktionPDF extends BriefpapierCustom {
public $doctype;
function __construct($app,$projekt="", $styleData=null)
{
$this->app=$app;
//parent::Briefpapier();
$this->doctype="produktion";
$this->doctypeOrig="produktion";
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 GetProduktion($id,$info="",$extrafreitext="")
{
$this->doctypeid = $id;
$this->id = $id;
$this->table = 'produktion'; // 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
a.name as adressname,
DATE_FORMAT(p.datum,'%d.%m.%Y') as datum,
p.belegnr,
p.freitext,
p.internebemerkung,
p.bearbeiter,
p.internebezeichnung,
auf.belegnr auftragsnummer,
projekt.name projekt
FROM
produktion p
LEFT JOIN
adresse a
ON
a.id = p.adresse
LEFT JOIN
auftrag auf
ON
auf.id = p.auftragid
LEFT JOIN projekt ON projekt.id = p.projekt
WHERE p.id='$id'
");
$this->zusatzfooter = " (PD".$data['belegnr'].")";
$this->doctypeOrig = $this->app->erp->Beschriftung("dokument_produktion") ." ".$data['belegnr'];
$produktionsartikel = $this->app->DB->SelectRow("
SELECT
a.id,
a.name_de,
a.nummer,
a.internerkommentar,
a.hinweis_einfuegen
FROM
produktion p
INNER JOIN produktion_position pp ON p.id = pp.produktion
INNER JOIN artikel a ON a.id = pp.artikel
WHERE p.id = ".$id." AND pp.stuecklistestufe = 1
");
$bodytexte = Array();
if (!empty($produktionsartikel['internerkommentar'])) {
$bodytext['Artikelkommentar'] = $produktionsartikel['internerkommentar'];
}
if (!empty($produktionsartikel['hinweis_einfuegen'])) {
$bodytext['Artikelhinweis'] = $produktionsartikel['hinweis_einfuegen'];
}
if (!empty($data['freitext'])) {
$bodytext['Freitext'] = $data['freitext'];
}
if (!empty($data['internebemerkung'])) {
$bodytext['Interne Bemerkung'] = $data['internebemerkung'];
}
$sql = "SELECT
etiketten.name,
al.amount
FROM article_label al
INNER JOIN artikel a ON a.id = al.article_id
INNER JOIN etiketten ON etiketten.id = al.label_id
WHERE
al.type = 'produktion' AND al.article_id = ".$produktionsartikel['id'];
$produktionsetiketten = $this->app->DB->SelectArr($sql);
if (!empty($produktionsetiketten)) {
$komma = "";
foreach ($produktionsetiketten as $produktionsetikett) {
$etikettentext .= $komma.$produktionsetikett['name']." (".$produktionsetikett['amount'].")";
$komma = ", ";
}
$bodytext['Etiketten'] = $etikettentext;
}
$nlbr = "";
foreach ($bodytext as $key => $value) {
$body .= $nlbr.$key.":\n".$value;
$nlbr = "\n\n";
}
$artikel = $this->app->DB->SelectArr(
sprintf(
"SELECT
p.id,
a.nummer as itemno,
a.name_de as name,
a.herstellernummer,
TRIM(pp.menge)+0 as amount,
'' as steuersatz_ermaessigt,
DATE_FORMAT(datum,'%%Y%%m%%d') as datum
FROM
produktion p
INNER JOIN produktion_position pp ON p.id = pp.produktion
INNER JOIN artikel a ON a.id = pp.artikel
WHERE p.id = %d
AND pp.stuecklistestufe = 0
",
$id
)
);
/*
$item['name'] = ($langeartikelnummern?"\r\n\r\n":'').$this->app->erp->ReadyForPDF($item['name']);
$item['desc'] = $this->app->erp->ReadyForPDF($item['desc']);
$item['itemno'] = $this->app->erp->ReadyForPDF($item['itemno']);
$item['herstellernummer'] = $this->app->erp->ReadyForPDF($item['herstellernummer']);
$item['artikelnummerkunde'] = $this->app->erp->ReadyForPDF($item['artikelnummerkunde']);
$item['lieferdatum'] = $this->app->erp->ReadyForPDF($item['lieferdatum']);
$item['hersteller'] = $this->app->erp->ReadyForPDF($item['hersteller']);
if($this->getStyleElement('herstellernummerimdokument')=='1' && $item['herstellernummer']!='')
*/
foreach($artikel as $key=>$value) {
$this->addItem($value);
}
if($this->app->erp->Firmendaten("footer_reihenfolge_Produktion_aktivieren")=="1") {
$footervorlage = $this->app->erp->Firmendaten("footer_reihenfolge_Produktion");
if($footervorlage=='') {
$footervorlage = "{FOOTERVERSANDINFO}{FOOTERFREITEXT}{FOOTEREXTRAFREITEXT}\r\n{FOOTERTEXTVORLAGEProduktion}";
}
$footervorlage = str_replace('{FOOTERVERSANDINFO}',$versandinfo,$footervorlage);
$footervorlage = str_replace('{FOOTERFREITEXT}',$freitext,$footervorlage);
$footervorlage = str_replace('{FOOTEREXTRAFREITEXT}',$extrafreitext,$footervorlage);
$footervorlage = str_replace('{FOOTERTEXTVORLAGEProduktion}',$this->app->erp->Beschriftung("Produktion_footer"),$footervorlage);
$footervorlage = $this->app->erp->ParseUserVars("Produktion",$id,$footervorlage);
$footer = $footervorlage;
}
else {
$footer = $versandinfo."$freitext\r\n$extrafreitext\r\n".$this->app->erp->ParseUserVars("Produktion",$id,$this->app->erp->Beschriftung("Produktion_footer"));
}
$this->filename = $data['datum']."_PD".$data['belegnr'].".pdf";
$this->setBarcode($data['belegnr']);
$corrDetails = array();
$corrDetails['Artikel'] = $produktionsartikel['name_de']." (".$produktionsartikel['nummer'].")";
$corrDetails['Projekt'] = $data['projekt'];
$corrDetails['Adresse'] = $data['adressname'];
$corrDetails['Auftrag'] = $data['auftragsnummer'];
$corrDetails['Interne Bezeichnung'] = $data['internebezeichnung'];
$corrDetails['Datum'] = $data['datum'];
$body = $this->app->erp->ParseUserVars("Produktion",$id,$body);
$this->setTextDetails(
array(
'body' => $body,
'footer'=> $footer
)
);
$this->setCorrDetails($corrDetails, true);
}
}

View File

@ -128,6 +128,7 @@ class Versandart_go extends Versanddienstleister
$ret->TrackingNumber = $result->hwbNumber;
$ret->TrackingUrl = 'https://www.general-overnight.com/deu_de/versenden/sendungsverfolgung.html?reference='.$result->hwbNumber;
$ret->Label = base64_decode($result->hwbOrPackageLabel);
$ret->AdditionalInfo = "Abholtag: ".$result->pickupDate->format('d.m.Y')." / Zustelltag: ".$result->deliveryDate->format('d.m.Y');
} else {
$ret->Errors[] = $result;
}

View File

@ -7635,7 +7635,7 @@ class Artikel extends GenArtikel {
$this->app->YUI->CkEditor('artikelbeschreibung_de_anzeige','belege');
$this->app->Tpl->Set('ARTIKEL_DE_ANZEIGE','<input type="text" name="" readonly style="background-color:#eee; border-color:#ddd;" size="70" maxlength="60" value="'.$artikel_de_anzeige.'">');
$this->app->Tpl->Set('ARTIKEL_DE_ANZEIGE','<input type="text" name="" readonly style="background-color:#eee; border-color:#ddd;" size="70" maxlength="60" value="'.htmlentities($artikel_de_anzeige).'">');
$this->app->Tpl->Set('KURZTEXT_DE_ANZEIGE','<textarea readonly rows="2" cols="70" readonly style="background-color:#eee; border-color:#ddd;">'.$kurztext_de_anzeige.'</textarea>');
$this->app->Tpl->Set('ARTIKELBESCHREIBUNG_DE_ANZEIGE','<textarea style="background-color:#eee; border-color:#ddd;" readonly rows="5" cols="70" style="color:grey" name="artikelbeschreibung_de_anzeige" id="artikelbeschreibung_de_anzeige">'.$artikelbeschreibung_de_anzeige.'</textarea>');

View File

@ -1287,6 +1287,7 @@
<tr><td>Auftr&auml;ge zu Bestellungen im Wareneingang anzeigen:</td><td><input type="checkbox" name="wareneingangauftragzubestellung" [WARENEINGANGAUFTRAGZUBESTELLUNG]></td></tr>
<tr><td>{|Bildtyp beim Upload im Wareneingang|}:</td><td><select name="wareneingangbildtypvorauswahl" id="wareneingangbildtypvorauswahl">[WARENEINGANBILDTYPVORAUSWAHL]</select></td></tr>
<tr><td>{|Verhalten beim Scannen im Wareneingang|}:</td><td><select name="wareneingangscanverhalten" id="wareneingangscanverhalten">[WARENEINGANGSCANVERHALTENAUSWAHL]</select></td></tr>
<tr><td>Nur Lagerartikel im Wareneingang:</td><td><input type="checkbox" name="wareneingang_lagerartikel" [WARENEINGANG_LAGERARTIKEL]> </td></tr>
</table>
</fieldset>
</div>

View File

@ -9,6 +9,18 @@
<div id="tabs-1">
[MESSAGE]
[TAB1]
<form method="post" action="#" id="frmorder">
<div class="row">
<div class="row-height">
<fieldset>
<legend>{|Auswahl Lagerpl&auml;tze|}</legend>
</fieldset>
[TABELLE]
<fieldset>
<input type="checkbox" id="auswahlalle" onchange="alleauswaehlen();" />&nbsp;{|alle markieren|}
</fieldset>
</div>
</div>
<div class="row">
<div class="row-height">
@ -17,7 +29,13 @@
<fieldset>
<legend>{|Auswahl Etiketten|}</legend>
[FORMULAR]
<table class="mkTableFormular">
<tr><td>{|Etikett|}:</td><td><select name="etikettenauswahl" id="etikettenauswahl">[ETIKETTENOPTIONS]</select></td></tr>
<tr><td>{|Drucker|}:</td><td><select name="etikettendrucker" id="etikettendrucker">[DRUCKEROPTIONS]</select></td></tr>
<tr><td>
<input type="submit" class="btnBlue" name="drucken" id="drucken" value="Drucken" />
</td></tr>
</table>
</fieldset>
</div>
@ -36,7 +54,7 @@
</div>
</div>
</div> <!-- spalte 2 zu -->
<form>
[TAB1NEXT]
</div>
@ -93,8 +111,12 @@ function Etikettendrucken(id, anzahl) {
}
}
});
}
</script>
function alleauswaehlen()
{
var wert = $('#auswahlalle').prop('checked');
$('#lagerplatz_etiketten').find(':checkbox').prop('checked',wert);
}
</script>

View File

@ -42,7 +42,15 @@
</td>
<td>
<input type="checkbox" value="1" id="preiseineuro" name="preiseineuro" [PREISEINEURO]/>
<label for="preiseineuro">{|alle Preise in EUR anzeigen|}</label>
<label for="preiseineuro">{|Preise in EUR|}</label>
</td>
<td>
<input type="checkbox" value="1" id="sperrlager_nicht_bewerten" name="sperrlager_nicht_bewerten" [SPERRLAGER_NICHT_BEWERTEN]/>
<label for="sperrlager_nicht_bewerten">{|Sperrlager nicht bewerten|}</label>
</td>
<td>
<input type="checkbox" value="1" id="konsignationslager_nicht_bewerten" name="konsignationslager_nicht_bewerten" [KONSIGNATIONSLAGER_NICHT_BEWERTEN]/>
<label for="konsignationslager_nicht_bewerten">{|Konsignationslager nicht bewerten|}</label>
</td>
<td>
<input type="submit" value="{|Laden|}" name="laden"/>

View File

@ -7,17 +7,17 @@
</ul>
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS]
[TEILPRODUKTIONINFO]
</fieldset>
</fieldset>
</div>
</div>
</div>
@ -28,13 +28,13 @@
<div class="inside inside-full-height">
<fieldset>
<legend>{|Allgemein|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Kunde|}:</td><td><input type="text" name="kundennummer" id="kundennummer" value="[KUNDENNUMMER]" size="20"></td></tr>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Kunde|}:</td><td><input type="text" name="adresse" id="adresse" value="[ADRESSE]" size="20"></td></tr>
<tr><td>{|Projekt|}:</td><td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" size="20"></td></tr>
<tr><td>{|Auftrag|}:</td><td><input type="text" name="auftragid" id="auftragid" value="[AUFTRAGID]" size="20"></td></tr>
<tr><td>{|Interne Bezeichnung|}:</td><td><input type="text" name="internebezeichnung" value="[INTERNEBEZEICHNUNG]" size="20"></td></tr>
<tr><td>{|Auftrag|}:</td><td><input type="text" name="auftrag" id="auftrag" value="[AUFTRAG]" size="20"></td></tr>
<tr><td>{|Interne Bezeichnung|}:</td><td><input type="text" name="internebezeichnung" value="[INTERNEBEZEICHNUNG]" size="20"></td></tr>
</table>
</fieldset>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-6 col-md-height">
@ -45,16 +45,16 @@
<tr><td>{|Angelegt am|}:</td><td><input type="text" name="datum" id="datum" value="[DATUM]" size="10"></td></tr>
<tr><td>{|Materiallager|}:</td><td><input type="text" name="standardlager" id="standardlager" value="[STANDARDLAGER]" size="20"></td></tr>
</table>
</fieldset>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend>
<legend>{|Aktionen|}</legend>
<tr><td><button [AKTION_SPEICHERN_DISABLED] name="submit" value="speichern" class="ui-button-icon" style="width:100%;">Speichern</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>
</table>
</fieldset>
</div>
@ -76,19 +76,19 @@
<tr><td>{|Seriennummer erstellen|}:</td><td><input disabled type="checkbox" name="seriennummer_erstellen" value=1 [SERIENNUMMER_ERSTELLEN] size="20"></td></tr>
<tr><td>{|Unterseriennummer erfassen|}:</td><td><input disabled type="checkbox" name="unterseriennummer_erfassen" value=1 [UNTERSERIENNUMMER_ERFASSEN] size="20"></td></tr>
</table>
</fieldset>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-8 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Auslieferung Lager|}:</td><td><input type="text" name="datumauslieferung" id="datumauslieferung" value="[DATUMAUSLIEFERUNG]" size="10"></td></tr>
<tr><td>{|Bereitstellung Start|}:</td><td><input type="text" name="datumbereitstellung" id="datumbereitstellung" value="[DATUMBEREITSTELLUNG]" size="10"></td></tr>
<tr><td>{|Produktion Start|}:</td><td><input type="text" name="datumproduktion" id="datumproduktion" value="[DATUMPRODUKTION]" size="10"></td></tr>
<tr><td>{|Produktion Ende|}:</td><td><input type="text" name="datumproduktionende" id="datumproduktionende" value="[DATUMPRODUKTIONENDE]" size="10"></td></tr>
</table>
</fieldset>
</fieldset>
</div>
</div>
</div>
@ -101,7 +101,7 @@
<legend>{|Freitext|}</legend>
<textarea name="freitext" id="freitext" style="min-height: 180px;">[FREITEXT]</textarea>
</table>
</fieldset>
</fieldset>
</div>
</div>
</div>
@ -113,17 +113,17 @@
<fieldset>
<legend>{|Interne Bemerkung|}</legend>
<textarea name="internebemerkung" id="internebemerkung" style="min-height: 180px;">[INTERNEBEMERKUNG]</textarea>
</fieldset>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<div [POSITIONEN_TAB_VISIBLE]>
<div id="tabs-2">
[MESSAGE]
<form action="#tabs-2" method="post">
<form action="#tabs-2" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
@ -131,9 +131,9 @@
<div class="inside inside-full-height">
<fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS]
[STATUSICONS]
[TEILPRODUKTIONINFO]
</fieldset>
</fieldset>
</div>
</div>
</div>
@ -143,13 +143,13 @@
<div class="col-xs-14 col-md-5 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend [AKTION_PLANEN_VISIBLE]>{|Zu produzierende Artikel|}</legend>
<legend [ARTIKEL_MENGE_VISIBLE]>{|Produktionsfortschritt|}</legend>
<legend [AKTION_PLANEN_VISIBLE]>{|Zu produzierende Artikel|}</legend>
<legend [ARTIKEL_MENGE_VISIBLE]>{|Produktionsfortschritt|}</legend>
<table width="100%" border="0">
<tr [AKTION_PLANEN_VISIBLE]><td>{|Artikel|}:</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_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen" id="artikel_planen" value="[ARTIKEL_PLANEN]" size="20"></td></tr>
<tr [AKTION_PLANEN_VISIBLE]><td>{|Planmenge|}:</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 [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>{|Geplant|}:</td>
<td>[MENGE_GEPLANT]</td>
@ -170,7 +170,7 @@
</tr>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Ausschuss|}:</td>
<td>{|Ausschuss|}:</td>
<td>[MENGE_AUSSCHUSS]</td>
</tr>
</table>
@ -180,7 +180,7 @@
<div class="col-xs-14 col-md-5 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend [AKTION_PRODUZIEREN_VISIBLE]>{|Parameter|}</legend>
<legend [AKTION_PRODUZIEREN_VISIBLE]>{|Parameter|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr [AKTION_PRODUZIEREN_VISIBLE]>
<td>{|Menge|}:</td>
@ -202,12 +202,12 @@
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Anpassen|}</legend>
<tr [AKTION_PLANEN_VISIBLE]><td><button name="submit" value="planen" class="ui-button-icon" style="width:100%;">Planen</button></td></tr>
<tr [AKTION_LEEREN_VISIBLE]><td><button name="submit" value="leeren" class="ui-button-icon" style="width:100%;">Leeren</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_PRODUZIEREN_VISIBLE]><td><button name="submit" value="teilen" class="ui-button-icon" style="width:100%;">Teilen</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="anpassen" class="ui-button-icon" style="width:100%;">Anpassen</button></td></tr>
<legend>{|Anpassen|}</legend>
<tr [AKTION_PLANEN_VISIBLE]><td><button name="submit" value="planen" class="ui-button-icon" style="width:100%;">Planen</button></td></tr>
<tr [AKTION_LEEREN_VISIBLE]><td><button name="submit" value="leeren" class="ui-button-icon" style="width:100%;">Leeren</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_PRODUZIEREN_VISIBLE]><td><button name="submit" value="teilen" class="ui-button-icon" style="width:100%;">Teilen</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="anpassen" class="ui-button-icon" style="width:100%;">Anpassen</button></td></tr>
</table>
</fieldset>
</div>
@ -216,9 +216,10 @@
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Produzieren|}</legend>
<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>
<legend>{|Produzieren|}</legend>
<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="etikettendrucken" class="ui-button-icon" style="width:100%;" [AKTION_ETIKETTEN_DRUCKEN_DISABLED]>Etiketten drucken</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_ABSCHLIESSEN_VISIBLE]><td><button name="submit" value="abschliessen" class="ui-button-icon" style="width:100%;">Abschliessen</button></td></tr>
</table>
</fieldset>
@ -239,18 +240,18 @@
</div>
</div>
</form>
</div>
</div>
</div>
<div id="tabs-3">
[MESSAGE]
<form action="index.php?module=produktion_position&action=edit&produktion=[PRODUKTION_ID]" method="post">
<form action="index.php?module=produktion_position&action=edit&produktion=[PRODUKTION_ID]" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Positionen|}</legend>
<legend>{|Positionen|}</legend>
[PRODUKTION_POSITION_SOURCE_POSITION_TABELLE]
<table width="100%" border="0" class="mkTableFormular">
<tr [AKTION_FREIGEBEN]>
@ -259,21 +260,21 @@
<td>{|Menge|}:</td>
<td><input type="number" min="0" name="menge" id="menge" size="20"></td>
<td><button name="submit" value="hinzufuegen" class="ui-button-icon" style="width:100%;">Hinzuf&uuml;gen</button></td>
</tr>
</tr>
</table>
</fieldset>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<div id="tabs-4">
[MESSAGE]
<form action="" method="post">
<form action="" method="post">
[MINIDETAILINEDIT]
</form>
</div>
</div>
</div>

View File

@ -30,16 +30,19 @@
<td>
<input type="text" size="30" name="abkuerzung" id="abkuerzung" value="[ABKUERZUNG]">
</td>
</tr>
<tr>
<td>Status:</td>
<td>
<select id="status" name="status"><option [STATUSGEPLANT]>geplant</option><option [STATUSGESTARTET]>gestartet</option><option [STATUSABGESCHLOSSEN]>abgeschlossen</option></select>
</td>
</tr>
<tr class="gruppebestehend">
<td>Kunde:</td>
<td>
<input type="text" size="30" name="kunde" id="kunde" value="[KUNDE]">
</td>
</tr>
<tr class="gruppeneu">
<td>Verantwortlicher:</td>
<td>
@ -47,19 +50,22 @@
</td>
</tr>
<tr>
<td>Status:</td>
<td>&Uuml;bergeordnetes Projekt:</td>
<td>
<select id="status" name="status"><option [STATUSGEPLANT]>geplant</option><option [STATUSGESTARTET]>gestartet</option><option [STATUSABGESCHLOSSEN]>abgeschlossen</option></select>
<input type="text" name="uebergeordnetes_projekt" id="uebergeordnetes_projekt" size="30" value="[UEBERGEORDNETES_PROJEKT]"><i>Für Nummernkreise</i>
</td>
</tr>
<tr [PROJEKTBAUMHIDDEN]>
<td>Struktur:</td>
<td>
<pre>[PROJEKTBAUM]</pre>
</td>
</tr>
[FREIFELDER]
</table>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-8 col-md-height">
<div class="inside inside-full-height">
<fieldset>
@ -78,15 +84,11 @@
<textarea name="sonstiges" id="sonstiges">[SONSTIGES]</textarea>
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<table width="100%"><tr><td align="right"><input type="submit" value="Speichern" name="speichern"></td></tr></table>
</form>

View File

@ -182,16 +182,16 @@ class Lager extends GenLager {
$defaultCountry = 'DE';
}
// headings
$heading = array('Bezeichnung', 'Projekt','Kommissions- / Produktionslager','Land','Men&uuml;');
$width = array('60%', '10%','20%','5%', '8%');
$findcols = array('l.bezeichnung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)", 'l.id');
$searchsql = array('l.bezeichnung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)",'p.name');
$heading = array('Bezeichnung','Beschreibung', 'Projekt','Kommissions- / Produktionslager','Land','Men&uuml;');
$width = array('20%','60%', '10%','20%','5%', '8%');
$findcols = array('l.bezeichnung','l.beschreibung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)", 'l.id');
$searchsql = array('l.bezeichnung','l.beschreibung', 'p.abkuerzung','a.name',"IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land)",'p.name');
$defaultorder = 4;
$defaultorderdesc = 1;
$menu = "<table><tr><td nowrap><a href=\"index.php?module=lager&action=edit&id=%value%\"><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>" . "&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=lager&action=delete&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "&nbsp;<a href=\"#\" onclick=PrintDialog(\"index.php?module=lager&action=regaletiketten&id=%value%&cmd=all\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/labelprinter.png\" border=\"0\"></a></td></tr></table>";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS l.id, l.bezeichnung, p.abkuerzung, a.name,
$sql = "SELECT SQL_CALC_FOUND_ROWS l.id, l.bezeichnung, l.beschreibung, p.abkuerzung, a.name,
IF(a.land IS NULL OR a.land = '', '$defaultCountry', a.land),
l.id as menu
FROM `lager` AS `l`
@ -287,6 +287,8 @@ class Lager extends GenLager {
$datum = $app->User->GetParameter('datum');
$gruppierenlager = $app->User->GetParameter('gruppierenlager');
$preiseineuro = $app->User->GetParameter('preiseineuro');
$sperrlager_nicht_bewerten = $app->User->GetParameter('sperrlager_nicht_bewerten');
$konsignationslager_nicht_bewerten = $app->User->GetParameter('konsignationslager_nicht_bewerten');
if($datum)
{
@ -310,9 +312,9 @@ class Lager extends GenLager {
}
}
$heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Menge','Gewicht','Volumen','Preistyp','EK-Preis','W&auml;hrung','Kurs','', 'Gesamt','');
$width = array( '5%', '05%', '20%', '10%', '10%', '5%' , '5%', '5%', '5%', '1%', '5%', '1%', '1%', '1%','2%', '1%');
$findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername', 'name',$colmenge,$colgewicht,$colvolumen);
$heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Adresse','Lagerplatz','gesp.','Adresse','Menge','Gewicht','Volumen','Preistyp','EK-Preis','W&auml;hrung','Kurs', 'Gesamt','');
$width = array( '5%', '05%', '20%', '10%', '10%', '5%', '5%' ,'5%','1%', '5%', '5%', '1%', '1%', '5%', '1%', '1%', '1%','2%', '1%');
$findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', 'lagername','lageradressename', 'lagerplatzname','lagerplatz.sperrlager','lagerplatzadressename',$colmenge,$colgewicht,$colvolumen);
if ($preiseineuro) {
$preisEUR = "((SELECT preisfinal)*if((SELECT waehrungfinal) = 'EUR' OR (SELECT waehrungfinal) = NULL,1,kurs))";
@ -322,12 +324,19 @@ class Lager extends GenLager {
$gesamtcol = "((SELECT preisfinal)*lw.menge)";
$kurs = 1;
}
if ($sperrlager_nicht_bewerten) {
$gesamtcol = "if (lagerplatz.sperrlager,0,".$gesamtcol.")";
}
if ($konsignationslager_nicht_bewerten) {
$gesamtcol = "if (lagerplatz.lagerplatzadresse OR lagerplatz.lageradresse,0,".$gesamtcol.")";
}
$findcols[] = self::PreisTypErgebnis($preisart);
$findcols[] = $preis;
$findcols[] = 'waehrung';
$findcols[] = 'kurs';
$findcols[] = '';
$findcols[] = $gesamtcol;
$findcols[] = 'art.id';
@ -336,9 +345,9 @@ class Lager extends GenLager {
$defaultorder = 1;
$defaultorderdesc = 0;
$alignright = array(7,8,9,10,11,11,13,15);
$sumcol = array(7,15);
$numbercols = array(7,8,9,11,13,15);
$alignright = array(9,10,11,12,13,15,16);
$sumcol = array(9,16);
$numbercols = array(9,10,11,12,13,15);
$datecols = array(0);
$onequeryperuser = true;
@ -472,7 +481,9 @@ class Lager extends GenLager {
GROUP BY
artikel,
waehrung
";
";
$lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung lagerplatzname, lager_platz.adresse lagerplatzadresse, lager_platz.sperrlager, lager.adresse lageradresse from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz";
$sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS
art.id,
@ -481,26 +492,27 @@ class Lager extends GenLager {
art.name_de,
(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, 'kat', 1), '_', 1) as type from artikel where id=art.id)) as artikelkategorie,
lagerplatz.lagername,
lagerplatz.name,
lageradressename,
lagerplatzname,
if(sperrlager,'ja',''),
lagerplatzadressename,
".$app->erp->FormatMenge('lw.menge',2).",".$app->erp->FormatPreis($colgewicht,2).",".$app->erp->FormatPreis($colvolumen,2)." as menge,
".self::PreisTypErgebnis($preisart)." as preisart,
".self::EinzelPreis($preisart)." AS preisfinal,
".self::Waehrung($preisart)." AS waehrungfinal,
".$kurs." AS kurs,
'' as hidden,
".$app->erp->FormatPreis($gesamtcol,2)." as gesamt,
art.id
FROM
artikel art
INNER JOIN ".$lagermengen_sql." AS lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1
INNER JOIN ".$lagermengen_sql." AS lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1
INNER JOIN ".$lagerplatz_sql." ON lw.lager_platz = lagerplatz.id
LEFT JOIN (SELECT id, name lageradressename FROM adresse) lageradr ON lageradr.id = lagerplatz.lageradresse
LEFT JOIN (SELECT id, name lagerplatzadressename FROM adresse) adr ON adr.id = lagerplatz.lagerplatzadresse
LEFT JOIN (".$prices_sql.") AS ek ON art.id = ek.artikel AND ".self::Waehrung($preisart)." = ek.waehrung
LEFT JOIN (".$currency_sql.") AS kurs ON kurs.waehrung_von = ".self::Waehrung($preisart)." AND kurs.waehrung_nach = 'EUR'
";
$lagerplatz_sql = "(SELECT lager_platz.id, lager.bezeichnung lagername, lager_platz.kurzbezeichnung name from lager INNER JOIN lager_platz on lager_platz.lager = lager.id) lagerplatz";
$sql .= "INNER JOIN ".$lagerplatz_sql." ON lw.lager_platz = lagerplatz.id";
$where .= " AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 ";
$sql = $app->YUI->CodiereSQLForOneQuery($sql, $name);
@ -1048,6 +1060,47 @@ class Lager extends GenLager {
JOIN lager_platz lp2 ON lp2.id = vorschlag.storage_area_id";
break;
case 'lagerplatz_etiketten':
$allowed['lager'] = array('platz');
// headings
$heading = array('','Lager', 'Bezeichnung', 'Nachschublager', 'Verbrauchslager','POS Lager', 'kein Auto-Versand','Volumen','Regalart','Kategorie','Kommissions- / Produktionslager','Men&uuml;');
$width = array('1%','15%','15%', '10%', '10%','5%','5%','10%','10%','5%','10%','8%','1%');
$findcols = array('lp.id','l.bezeichnung','lp.kurzbezeichnung', "IF(lp.autolagersperre,'kein Versand aus diesem Lager','')", "IF(lp.verbrauchslager,'ja','')","IF(lp.poslager,'ja','')","IF(lp.sperrlager,'ja','')",'breite','regalart','abckategorie','a.name','id');
$searchsql = array('lp.kurzbezeichnung','regalart','abckategorie','a.name');
$defaultorder = 4;
$defaultorderdesc = 1;
$alignright = [10];
$menu = "<table><tr><td nowrap><a href=\"index.php?module=lager&action=platzeditpopup&id=%value%\"><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>"
// . "&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=lager&action=deleteplatz&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>"
// . "&nbsp;<a href=\"#\" onclick=PrintDialog(\"index.php?module=lager&action=regaletiketten&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/labelprinter.png\" border=\"0\"></a>"
."</td></tr></table>";
$box = "CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',lp.id,'\" />') AS `auswahl`";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS
lp.id,
$box,
l.bezeichnung,
lp.kurzbezeichnung, if(lp.autolagersperre,'kein Versand aus diesem Lager','') as autolagersperre,
if(lp.verbrauchslager,'ja','') as verbrauchslager,
if(lp.poslager,'ja','') as poslager,
if(lp.sperrlager,'ja','') as sperrlager,
if(lp.laenge!=0.0,CONCAT(lp.laenge,'/',lp.breite,'/',lp.hoehe),'-') as volumen,
lp.regalart,lp.abckategorie, a.name,
lp.id as menu
FROM lager_platz lp
INNER JOIN lager l ON l.id = lp.lager
LEFT JOIN adresse a ON a.id=lp.adresse ";
// fester filter
$where = " lp.geloescht=0 AND lp.id!=0";
$count = "SELECT COUNT(id) FROM lager_platz WHERE geloescht=0";
break;
}
$erg = [];
@ -1677,10 +1730,18 @@ class Lager extends GenLager {
$preisart = $this->app->Secure->GetPOST('preisart');
$this->app->User->SetParameter('preisart', $preisart);
$sperrlager_nicht_bewerten = $this->app->Secure->GetPOST('sperrlager_nicht_bewerten');
$this->app->User->SetParameter('sperrlager_nicht_bewerten', $sperrlager_nicht_bewerten);
$konsignationslager_nicht_bewerten = $this->app->Secure->GetPOST('konsignationslager_nicht_bewerten');
$this->app->User->SetParameter('konsignationslager_nicht_bewerten', $konsignationslager_nicht_bewerten);
$this->app->YUI->DatePicker("datum");
$this->app->Tpl->Set('DATUM', $datum);
$this->app->Tpl->Set('PREISEINEURO', $preiseineuro==1?"checked":"");
$this->app->Tpl->Set('SPERRLAGER_NICHT_BEWERTEN', $sperrlager_nicht_bewerten==1?"checked":"");
$this->app->Tpl->Set('KONSIGNATIONSLAGER_NICHT_BEWERTEN', $konsignationslager_nicht_bewerten==1?"checked":"");
$this->app->Tpl->Set('GRUPPIERENLAGER', $gruppierenlager==1?"checked":"");
$this->app->Tpl->Set(strtoupper($preisart), 'selected');
@ -4288,7 +4349,7 @@ $check_charge=="2" || $check_charge=="1" || $check_mhd=="1")
public function LagerEtikettenlist()
{
$this->app->erp->Headlines('','Etiketten');
/*
$this->app->YUI->AutoComplete('von','lagerplatz');
$this->app->YUI->AutoComplete('bis','lagerplatz');
@ -4339,19 +4400,48 @@ $check_charge=="2" || $check_charge=="1" || $check_mhd=="1")
echo json_encode(array('status'=>1));
$this->app->ExitXentral();
}
*/
// Process multi action
$auswahl = $this->app->Secure->GetPOST('auswahl');
$drucken = $this->app->Secure->GetPOST('drucken');
$selectedIds = [];
if(!empty($auswahl)) {
foreach($auswahl as $selectedId) {
$selectedId = (int)$selectedId;
if ($selectedId > 0) {
$selectedIds[] = $selectedId;
}
}
}
$etikettenauswahl = $this->app->Secure->GetPOST('etikettenauswahl');
$etikettendrucker = $this->app->Secure->GetPOST('etikettendrucker');
if ($drucken) {
foreach ($selectedIds as $selectedId) {
// function EtikettenDrucker($kennung,$anzahl,$tabelle,$id,$variables="",$xml="",$druckercode="",$filenameprefix="",$xmlaspdf=false,$adresse=0,$verwendenals="")
$this->app->erp->EtikettenDrucker($etikettenauswahl,1,'lager_platz',$selectedId,'','',$etikettendrucker);
}
}
$this->LagerHauptmenu();
$etiketten = $this->app->erp->GetSelectEtiketten("lagerplatz_klein",$etikettenauswahl);
if($etiketten=="") $etiketten="<option>Standard</option>";
$this->app->Tpl->Set('ETIKETTENOPTIONS',$etiketten);
$drucker = $this->app->erp->GetSelectEtikettenDrucker($etikettendrucker);
$this->app->Tpl->Set('DRUCKEROPTIONS',$drucker);
$druckbutton = "<input type=\"button\" onclick=\"Etikettendrucken()\" class=\"btnBlue\" value=\"{|Drucken|}\">";
$this->app->Tpl->Set('FORMULAR',"<form action=\"\" method=\"post\"><table class=\"mkTableFormular\">
/* $this->app->Tpl->Set('FORMULAR',"<form action=\"\" method=\"post\"><table class=\"mkTableFormular\">
<tr><td>{|Lagerplatz|} ({|von|}):</td><td><input type=\"text\" name=\"von\" id=\"von\" value=\"$von\"></td></tr>
<tr><td>{|Lagerplatz|} ({|bis|}):</td><td><input type=\"text\" name=\"bis\" id=\"bis\" value=\"$bis\">&nbsp;$druckbutton</td></tr>
<tr><td>{|Etikett|}:</td><td><select name=\"etikettenauswahl\" id=\"etikettenauswahl\">".$etiketten."</select></td></tr>
<tr><td>{|Drucker|}:</td><td><select name=\"etikettendrucker\" id=\"etikettendrucker\">".$drucker."</select></td></tr></table>
</form><br><br>");
</form><br><br>");*/
$this->app->YUI->TableSearch('TABELLE', 'lagerplatz_etiketten', 'show','','',basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', 'lager_etikettenlist.tpl');
}

View File

@ -1739,7 +1739,14 @@ class Lieferschein extends GenLieferschein
$this->app->erp->MenuEintrag("index.php?module=lieferschein&action=paketmarke&id=$id","Paketmarke");
}
}
$anzahldateien = '';
if ($id > 0) {
$anzahldateien = $this->app->erp->AnzahlDateien('lieferschein', $id);
$anzahldateien = $anzahldateien > 0?' ('.$anzahldateien.')':'';
}
$this->app->erp->MenuEintrag("index.php?module=lieferschein&action=dateien&id=$id", 'Dateien'.$anzahldateien);
$this->app->erp->MenuEintrag("index.php?module=lieferschein&action=list","Zur&uuml;ck zur &Uuml;bersicht");
$this->app->erp->RunMenuHook('lieferschein');

View File

@ -20,12 +20,13 @@ class Produktion {
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "produktion_list");
$this->app->ActionHandler("list", "produktion_list");
$this->app->ActionHandler("create", "produktion_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "produktion_edit");
$this->app->ActionHandler("copy", "produktion_copy");
$this->app->ActionHandler("minidetail", "produktion_minidetail");
$this->app->ActionHandler("delete", "produktion_delete");
$this->app->ActionHandler("delete", "produktion_delete");
$this->app->ActionHandler("pdf", "produktion_pdf");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
@ -53,34 +54,34 @@ class Produktion {
IFNULL((SELECT CONCAT(a.name_de,' (',a.nummer,')','<br>') FROM artikel a INNER JOIN produktion_position pp ON pp.artikel = a.id WHERE pp.stuecklistestufe = 1 AND pp.produktion = p.id LIMIT 1),''),
CONCAT('<i>',internebezeichnung,'</i>')
)";
$adresse = "(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1)";
$findcols = array('p.id','p.id','p.belegnr','p.kundennummer',$adresse,'p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id');
$findcols = array('p.id','p.id','p.belegnr','adresse.kundennummer','adresse.name','p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id');
$searchsql = array('p.belegnr','p.kundennummer','p.name',$bezeichnung);
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',p.id,'\" />') AS `auswahl`";
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',p.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" .
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" .
"<a href=\"index.php?module=produktion&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;".
"<a href=\"#\" onclick=DeleteDialog(\"index.php?module=produktion&action=delete&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" .
"<a href=\"#\" onclick=CopyDialog(\"index.php?module=produktion&action=copy&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/copy.svg\" border=\"0\"></a>" .
"<a href=\"#\" onclick=DeleteDialog(\"index.php?module=produktion&action=delete&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" .
"<a href=\"#\" onclick=CopyDialog(\"index.php?module=produktion&action=copy&id=%value%\");><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/copy.svg\" border=\"0\"></a>" .
"<a href=\"index.php?module=produktion&action=pdf&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/pdf.svg\" border=\"0\"></a>".
"</td></tr></table>";
// $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.datum, p.art, p.projekt, p.belegnr, p.internet, p.bearbeiter, p.angebot, p.freitext, p.internebemerkung, p.status, p.adresse, p.name, p.abteilung, p.unterabteilung, p.strasse, p.adresszusatz, p.ansprechpartner, p.plz, p.ort, p.land, p.ustid, p.ust_befreit, p.ust_inner, p.email, p.telefon, p.telefax, p.betreff, p.kundennummer, p.versandart, p.vertrieb, p.zahlungsweise, p.zahlungszieltage, p.zahlungszieltageskonto, p.zahlungszielskonto, p.bank_inhaber, p.bank_institut, p.bank_blz, p.bank_konto, p.kreditkarte_typ, p.kreditkarte_inhaber, p.kreditkarte_nummer, p.kreditkarte_pruefnummer, p.kreditkarte_monat, p.kreditkarte_jahr, p.firma, p.versendet, p.versendet_am, p.versendet_per, p.versendet_durch, p.autoversand, p.keinporto, p.keinestornomail, p.abweichendelieferadresse, p.liefername, p.lieferabteilung, p.lieferunterabteilung, p.lieferland, p.lieferstrasse, p.lieferort, p.lieferplz, p.lieferadresszusatz, p.lieferansprechpartner, p.packstation_inhaber, p.packstation_station, p.packstation_ident, p.packstation_plz, p.packstation_ort, p.autofreigabe, p.freigabe, p.nachbesserung, p.gesamtsumme, p.inbearbeitung, p.abgeschlossen, p.nachlieferung, p.lager_ok, p.porto_ok, p.ust_ok, p.check_ok, p.vorkasse_ok, p.nachnahme_ok, p.reserviert_ok, p.bestellt_ok, p.zeit_ok, p.versand_ok, p.partnerid, p.folgebestaetigung, p.zahlungsmail, p.stornogrund, p.stornosonstiges, p.stornorueckzahlung, p.stornobetrag, p.stornobankinhaber, p.stornobankkonto, p.stornobankblz, p.stornobankbank, p.stornogutschrift, p.stornogutschriftbeleg, p.stornowareerhalten, p.stornomanuellebearbeitung, p.stornokommentar, p.stornobezahlt, p.stornobezahltam, p.stornobezahltvon, p.stornoabgeschlossen, p.stornorueckzahlungper, p.stornowareerhaltenretour, p.partnerausgezahlt, p.partnerausgezahltam, p.kennen, p.logdatei, p.bezeichnung, p.datumproduktion, p.anschreiben, p.usereditid, p.useredittimestamp, p.steuersatz_normal, p.steuersatz_zwischen, p.steuersatz_ermaessigt, p.steuersatz_starkermaessigt, p.steuersatz_dienstleistung, p.waehrung, p.schreibschutz, p.pdfarchiviert, p.pdfarchiviertversion, p.typ, p.reservierart, p.auslagerart, p.projektfiliale, p.datumauslieferung, p.datumbereitstellung, p.unterlistenexplodieren, p.charge, p.arbeitsschrittetextanzeigen, p.einlagern_ok, p.auslagern_ok, p.mhd, p.auftragmengenanpassen, p.internebezeichnung, p.mengeoriginal, p.teilproduktionvon, p.teilproduktionnummer, p.parent, p.parentnummer, p.bearbeiterid, p.mengeausschuss, p.mengeerfolgreich, p.abschlussbemerkung, p.auftragid, p.funktionstest, p.seriennummer_erstellen, p.unterseriennummern_erfassen, p.datumproduktionende, p.standardlager, p.id FROM produktion p";
// $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.belegnr, p.kundennummer, p.name, p.datum, \"SUBSELECT\", \"SUBSELECT\", p.mengeerfolgreich, \"-\", \"-\", p.projekt, p.status, p.status, p.id FROM produktion p";
$sql = "SELECT SQL_CALC_FOUND_ROWS
$sql = "SELECT SQL_CALC_FOUND_ROWS
p.id,
$dropnbox,
p.belegnr,
p.kundennummer,
".$adresse." as name,
adresse.kundennummer,
adresse.name as name,
DATE_FORMAT(datum,'%d.%m.%Y') as datum,
".$bezeichnung." as bezeichnung,
FORMAT((SELECT SUM(menge) FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1),0,'de_DE') as soll,
@ -91,7 +92,8 @@ class Produktion {
p.status,
(" . $app->YUI->IconsSQL_produktion('p') . ") AS `icons`,
p.id
FROM produktion p
FROM produktion p
LEFT JOIN adresse ON adresse.id = p.adresse
";
$where = "0";
@ -111,9 +113,9 @@ class Produktion {
else
oMoreData' . $r . $name . ' = 1;
$(\'#' . $name . '\').dataTable().fnFilter(
$(\'#' . $name . '\').dataTable().fnFilter(
\'\',
i,
i,
0,0
);
}
@ -132,21 +134,21 @@ class Produktion {
$where .= " OR p.status IN ('freigegeben','gestartet')";
}
else {
}
}
$more_data3 = $this->app->Secure->GetGET("more_data3");
if ($more_data3 == 1) {
if ($more_data3 == 1) {
$where .= " OR p.status IN ('abgeschlossen')";
}
else {
}
}
$more_data4 = $this->app->Secure->GetGET("more_data4");
if ($more_data4 == 1) {
$where .= " OR p.status IN ('storniert')";
}
else {
}
}
// END Toggle filters
$moreinfo = true; // Allow drop down details
@ -178,24 +180,24 @@ class Produktion {
if (in_array($status,array('angelegt','freigegeben'))) {
$heading = array('','','Nummer', 'Artikel', 'Projekt', 'Planmenge pro St&uuml;ck', 'Lager alle (verf&uuml;gbar)', 'Lager (verf&uuml;gbar)', 'Reserviert', 'Planmenge', 'Verbraucht', 'Men&uuml;');
$width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%');
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=produktion_position&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=produktion_position&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%');
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=produktion_position&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=produktion_position&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
} else {
$heading = array('','','Nummer', 'Artikel', 'Projekt','Planmenge pro St&uuml;ck', 'Lager alle (verf&uuml;gbar)', 'Lager (verf&uuml;gbar)', 'Reserviert', 'Planmenge', 'Verbraucht', '');
$width = array( '1%','1%','5%', '30%', '5%', '1%', '1%', '1%' , '1%', '1%', '1%' ,'1%');
$width = array( '1%','1%','5%', '30%', '5%', '1%', '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','lageralle','lager','reserviert','menge','geliefert_menge');
$searchsql = array('p.artikel','nummer','name','projekt','lager','menge','reserviert','geliefert_menge');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',p.id,'\" />') AS `auswahl`";
$sql = "SELECT SQL_CALC_FOUND_ROWS
p.id,
$dropnbox,
@ -227,12 +229,12 @@ class Produktion {
),
')'
)
,''
,''
) 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
p.id
FROM produktion_position p";
$where = " stuecklistestufe = 0 AND produktion = $id";
@ -296,12 +298,12 @@ class Produktion {
),
')'
)
,''
,''
) 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(SUM(p.geliefert_menge),0,'de_DE') as geliefert_menge,
p.id
p.id
FROM produktion_position p";
$where = " stuecklistestufe = 0 AND produktion = $id";
@ -321,7 +323,7 @@ class Produktion {
}
return $erg;
}
function produktion_list() {
$this->app->erp->MenuEintrag("index.php?module=produktion&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=produktion&action=create", "Neu anlegen");
@ -332,32 +334,32 @@ class Produktion {
$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', "<div class=\"info\">Der Eintrag wurde storniert.</div>");
$this->app->Tpl->Set('MESSAGE', "<div class=\"info\">Der Eintrag wurde storniert.</div>");
} 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>");
}
$this->produktion_list();
}
}
/*
* Edit produktion item
* If id is empty, create a new one
*/
function produktion_edit($id = NULL) {
if (empty($id)) {
@ -375,25 +377,25 @@ class Produktion {
$this->app->erp->MenuEintrag("index.php?module=produktion&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=produktion&action=list", "Zur&uuml;ck zur &Uuml;bersicht");
$input = $this->GetInput();
$msg = $this->app->erp->base64_url_decode($this->app->Secure->GetGET('msg'));
$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];
$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'];
$global_projekt = $from_db['projekt'];
$global_standardlager = $from_db['standardlager'];
// foreach ($input as $key => $value) {
// echo($key." -> ".$value."<br>\n");
// }
$this->app->Tpl->Set('MESSAGE', "");
$this->app->Tpl->Set('MESSAGE', "");
if (empty($id)) {
// New item
$id = 'NULL';
$id = 'NULL';
} else {
}
@ -405,7 +407,7 @@ class Produktion {
switch ($submit) {
case 'speichern':
// Write to database
// Add checks here
if (empty($input['datum'])) {
@ -422,26 +424,31 @@ class Produktion {
$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);
$input['adresse'] = $this->app->erp->ReplaceKunde(true,$input['adresse'],true);
$input['auftragid'] = $this->app->erp->ReplaceAuftrag(true,$input['auftrag'],true);
unset($input['auftrag']);
$input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],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 = ", ";
$fix = ", ";
}
$sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$id = $this->app->DB->GetInsertID();
if (!empty($id)) {
@ -450,25 +457,25 @@ class Produktion {
$msg = $this->app->erp->base64_url_encode($msg);
header("Location: index.php?module=produktion&action=edit&id=$id&msg=$msg");
}
} else {
$msg .= "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>";
}
break;
case 'planen':
// Check
// Parse positions
// 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 .= "<div class=\"success\">Bereits geplant.</div>";
break;
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');
$artikel_planen_menge = $this->app->Secure->GetPOST('artikel_planen_menge');
if (!$artikel_planen_id) {
$msg .= "<div class=\"error\">Artikel ist keine St&uuml;ckliste.</div>";
@ -492,28 +499,28 @@ class Produktion {
break;
}
foreach ($stueckliste as $key => $value) {
foreach ($stueckliste as $key => $value) {
$value['menge'] = $value['menge'] * $artikel_planen_menge;
$position_values[] = '('.implode(",",$value).',\'\')';
}
$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->DB->Update($sql);
$msg .= "<div class=\"success\">Planung angelegt.</div>";
$this->ProtokollSchreiben($id,"Produktion geplant ($artikel_planen_menge)");
break;
break;
case 'freigeben':
$this->app->erp->BelegFreigabe("produktion",$id);
$this->ProtokollSchreiben($id,'Produktion freigegeben');
break;
case 'reservieren':
// Check quantities and reserve for every position
if($global_standardlager == 0) {
break;
break;
}
$fortschritt = $this->MengeFortschritt($id,$global_standardlager);
@ -530,16 +537,16 @@ class Produktion {
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'];
$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");
$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;
}
}
$reservierung_durchgefuehrt = true;
}
}
// Message output
if ($reservierung_durchgefuehrt) {
if ($reservierung_durchgefuehrt) {
$msg .= "<div class=\"info\">Reservierung durchgeführt.</div>";
} else {
$msg .= "<div class=\"error\">Keine Reservierung durchgeführt!</div>";
@ -560,11 +567,11 @@ class Produktion {
$menge_produzieren = $this->app->Secure->GetPOST('menge_produzieren');
if (empty($menge_produzieren)) {
$menge_produzieren = 0;
}
$menge_ausschuss = $this->app->Secure->GetPOST('menge_ausschuss_produzieren');
}
$menge_ausschuss = $this->app->Secure->GetPOST('menge_ausschuss_produzieren');
if (empty($menge_ausschuss)) {
$menge_ausschuss = 0;
}
}
$menge_plan = $produktionsartikel_position['menge'];
$menge_geliefert = $produktionsartikel_position['geliefert_menge'];
@ -607,16 +614,16 @@ class Produktion {
}
// Update position
$sql = "UPDATE produktion_position SET geliefert_menge = geliefert_menge + $menge_artikel_auslagern WHERE id = ".$material_position['id'];
$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
// Insert produced parts into stock
// Check target stock, if not existing, use default stock of article, if not given use production stock
@ -627,19 +634,19 @@ class Produktion {
if (!empty($ziellager_from_form)) {
$sql = "SELECT id FROM lager_platz WHERE id = ".$ziellager_from_form;
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$ziellager = $ziellager_from_form;
} else {
$use_artikel_lager = true;
}
} else {
$use_artikel_lager = true;
$use_artikel_lager = true;
}
if ($use_artikel_lager) {
if ($use_artikel_lager) {
$sql = "SELECT lager_platz FROM artikel WHERE id = ".$produktionsartikel_position['artikel'];
$result = $this->app->DB->SelectArr($sql);
$result = $this->app->DB->SelectArr($sql);
if (!empty($result) && !empty($result[0]['lager_platz'])) {
$ziellager = $result[0]['lager_platz'];
} else {
@ -649,7 +656,7 @@ class Produktion {
}
$sql = "SELECT kurzbezeichnung FROM lager_platz WHERE id = $ziellager";
$lagername = $this->app->DB->SelectArr($sql)[0]['kurzbezeichnung'];
$lagername = $this->app->DB->SelectArr($sql)[0]['kurzbezeichnung'];
// ERPAPI
// function LagerEinlagern($artikel,$menge,$regal,$projekt,$grund="",$importer="",$paketannahme="",$doctype = "", $doctypeid = 0, $vpeid = 0, $permanenteinventur = 0, $adresse = 0)
@ -726,14 +733,14 @@ class Produktion {
$columns = "";
$values = "";
$update = "";
$fix = "";
foreach ($produktion_neu as $key => $value) {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'";
$fix = ", ";
$fix = ", ";
}
$sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.")";
@ -742,7 +749,7 @@ class Produktion {
// Now add the positions
$sql = "SELECT * FROM produktion_position WHERE produktion = $id";
$positionen = $this->app->DB->SelectArr($sql);
$positionen = $this->app->DB->SelectArr($sql);
foreach ($positionen as $position) {
@ -802,20 +809,20 @@ class Produktion {
break;
case 'leeren':
if ($global_status == 'angelegt' || $global_status == 'freigegeben') {
$sql = "SELECT id, artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0";
$material = $this->app->DB->SelectArr($sql);
foreach ($material as $material_position) {
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 .= "<div class=\"warning\">Planung geleert.</div>";
$this->app->DB->Update($sql);
$msg .= "<div class=\"warning\">Planung geleert.</div>";
} else {
$msg .= "<div class=\"error\">Planung kann nicht geleert werden.</div>";
}
$msg .= "<div class=\"error\">Planung kann nicht geleert werden.</div>";
}
break;
case 'anpassen':
@ -842,31 +849,57 @@ class Produktion {
$this->ProtokollSchreiben($id,"Menge angepasst auf ".$this->FormatMenge($menge_anpassen));
break;
break;
case 'abschliessen':
$sql = "UPDATE produktion SET status = 'abgeschlossen' WHERE id=$id";
$this->app->DB->Update($sql);
$this->app->DB->Update($sql);
$sql = "SELECT id, artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=0";
$material = $this->app->DB->SelectArr($sql);
foreach ($material as $material_position) {
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");
}
$this->ProtokollSchreiben($id,'Produktion abgeschlossen');
break;
case 'etikettendrucken':
}
$menge_drucken = $this->app->Secure->GetPOST('menge_produzieren');
if ($menge_drucken) {
$sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$produktionsartikel_position = $this->app->DB->SelectArr($sql)[0];
$produktionsartikel_id = $produktionsartikel_position['artikel'];
$sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion' AND al.article_id = ".$produktionsartikel_id;
$produktionsetiketten = $this->app->DB->SelectArr($sql);
if (!empty($produktionsetiketten)) {
foreach ($produktionsetiketten as $produktionsetikett) {
$this->app->erp->EtikettenDrucker(
kennung: $produktionsetikett['label_id'],
anzahl: $menge_drucken*$produktionsetikett['amount'],
tabelle: 'artikel',
id: $produktionsartikel_id,
variables: null,
druckercode: $produktionsetikett['printer_id']
);
}
}
} else {
$msg .= "<div class=\"error\">Ung&uuml;ltige Menge.</div>";
}
break;
}
}
// Load values again from database
// toDo: cleanup
$sql = "SELECT SQL_CALC_FOUND_ROWS
$sql = "SELECT SQL_CALC_FOUND_ROWS
p.id,
(SELECT pp.bezeichnung FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1 LIMIT 1) as artikelname,
p.datum,
@ -1027,12 +1060,12 @@ class Produktion {
$produktion_from_db = $this->app->DB->SelectArr($sql)[0];
foreach ($produktion_from_db as $key => $value) {
$this->app->Tpl->Set(strtoupper($key), $value);
$this->app->Tpl->Set(strtoupper($key), $value);
}
/*
* Add displayed items later
*/
*/
$this->StatusBerechnen((int)$id);
@ -1058,10 +1091,12 @@ class Produktion {
}
$this->app->Tpl->Set('PROJEKT',$this->app->erp->ReplaceProjekt(false,$produktion_from_db['projekt'],false));
$this->app->Tpl->Set('ADRESSE',$this->app->erp->ReplaceKunde(false,$produktion_from_db['adresse'],false));
$this->app->Tpl->Set('AUFTRAG',$this->app->erp->ReplaceAuftrag(false,$produktion_from_db['auftragid'],false));
$this->app->YUI->AutoComplete("projekt", "projektname", 1);
$this->app->YUI->AutoComplete("kundennummer", "kunde", 1);
$this->app->YUI->AutoComplete("auftragid", "auftrag", 1);
$this->app->YUI->AutoComplete("adresse", "kunde", 1);
$this->app->YUI->AutoComplete("auftrag", "auftrag", 1);
$this->app->YUI->AutoComplete("artikel_planen", "stuecklistenartikel");
$this->app->YUI->AutoComplete("artikel_hinzu", "artikelnummer");
@ -1099,24 +1134,25 @@ class Produktion {
AKTION_FREIGEBEN_VISIBLE
AKTION_RESERVIEREN_VISIBLE
AKTION_PRODUZIEREN_VISIBLE
AKTION_ETIKETTEN_DRUCKEN_DISABLED
AKTION_ABSCHLIESSEN_VISIBLE
POSITIONEN_TAB_VISIBLE
*/
// Reparse positions
// Reparse positions
$sql = "SELECT id,artikel, menge, geliefert_menge FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$produktionsartikel_position = $this->app->DB->SelectArr($sql)[0];
// Not planned
if (empty($produktionsartikel_position)) {
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('ARTIKEL_MENGE_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_LEEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_TEILEN_VISIBLE','hidden');
} else {
$this->app->Tpl->Set('AKTION_LEEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_TEILEN_VISIBLE','hidden');
} else {
// Planned
$fortschritt = $this->MengeFortschritt((int) $id, 0);
@ -1144,19 +1180,29 @@ class Produktion {
$produktionsartikel = $this->app->DB->SelectArr($sql)[0];
$produktionsartikel_name = $produktionsartikel['name_de'];
$produktionsartikel_nummer = $produktionsartikel['nummer'];
}
$sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion'";
$sql = "SELECT artikel FROM produktion_position pp WHERE produktion=$id AND stuecklistestufe=1";
$sql = "SELECT al.* FROM article_label al INNER JOIN artikel a ON a.id = al.article_id WHERE type = 'produktion' AND al.article_id = ".$produktionsartikel_id;
$produktionsetiketten = $this->app->DB->SelectArr($sql);
}
if (empty($produktionsetiketten)) {
$this->app->Tpl->Set('AKTION_ETIKETTEN_DRUCKEN_DISABLED','disabled');
}
if (empty($produktion_from_db['belegnr'])) {
$this->app->Tpl->SetText('KURZUEBERSCHRIFT2', 'ENTWURF - '.$produktionsartikel_name." (".$produktionsartikel_nummer.")");
} else {
$this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktion_from_db['belegnr']." ".$produktionsartikel_name." (".$produktionsartikel_nummer.")");
$this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $produktion_from_db['belegnr']." ".$produktionsartikel_name." (<a href=\"index.php?module=artikel&action=edit&id=".$produktionsartikel_id."\">".$produktionsartikel_nummer."</a>)", html: true);
}
$this->app->Tpl->SetText('ARTIKELNAME', $produktionsartikel_name);
// Action menu
switch ($produktion_from_db['status']) {
case 'angelegt':
case 'angelegt':
$this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_ABSCHLIESSEN_VISIBLE','hidden');
@ -1172,7 +1218,7 @@ class Produktion {
case 'abgeschlossen':
case 'storniert':
$this->app->Tpl->Set('AKTION_SPEICHERN_DISABLED','disabled');
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PLANEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_FREIGEBEN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_RESERVIEREN_VISIBLE','hidden');
$this->app->Tpl->Set('AKTION_PRODUZIEREN_VISIBLE','hidden');
@ -1196,7 +1242,7 @@ class Produktion {
/*
Create a copy as draft
*/
function produktion_copy() {
$id = (int) $this->app->Secure->GetGET('id');
if (empty($id)) {
@ -1205,14 +1251,14 @@ class Produktion {
$result = $this->Copy($id,0);
if ($result <= 0) {
$msg .= "<div class=\"error\">Fehler beim Anlegen der Kopie.</div>";
$this->app->Tpl->Set('MESSAGE', $msg);
$this->app->Tpl->Set('MESSAGE', $msg);
$this->produktion_list();
}
else {
$msg .= "<div class=\"success\">Kopie angelegt. $result new $id old</div>";
$this->app->Tpl->Set('MESSAGE', $msg);
$this->app->Tpl->Set('MESSAGE', $msg);
$this->produktion_edit((int) $result);
}
}
}
public function produktion_minidetail($parsetarget='',$menu=true) {
@ -1249,19 +1295,20 @@ class Produktion {
public function GetInput(): array {
$input = array();
$input['kundennummer'] = $this->app->Secure->GetPOST('kundennummer');
$input['projekt'] = $this->app->Secure->GetPOST('projekt');
$input['auftragid'] = $this->app->Secure->GetPOST('auftragid');
$input['internebezeichnung'] = $this->app->Secure->GetPOST('internebezeichnung');
$input['adresse'] = $this->app->Secure->GetPOST('adresse');
$input['projekt'] = $this->app->Secure->GetPOST('projekt');
$input['auftrag'] = $this->app->Secure->GetPOST('auftrag');
$input['internebezeichnung'] = $this->app->Secure->GetPOST('internebezeichnung');
$input['datum'] = $this->app->Secure->GetPOST('datum');
$input['standardlager'] = $this->app->Secure->GetPOST('standardlager');
$input['standardlager'] = $this->app->erp->ReplaceLagerPlatz(true,$input['standardlager'],true); // Parameters: Target db?, value, from form?
$input['reservierart'] = $this->app->Secure->GetPOST('reservierart');
$input['auslagerart'] = $this->app->Secure->GetPOST('auslagerart');
$input['auslagerart'] = $this->app->Secure->GetPOST('auslagerart');
$input['unterlistenexplodieren'] = $this->app->Secure->GetPOST('unterlistenexplodieren');
$input['funktionstest'] = $this->app->Secure->GetPOST('funktionstest');
$input['funktionstest'] = $this->app->Secure->GetPOST('funktionstest');
$input['arbeitsschrittetextanzeigen'] = $this->app->Secure->GetPOST('arbeitsschrittetextanzeigen');
$input['seriennummer_erstellen'] = $this->app->Secure->GetPOST('seriennummer_erstellen');
@ -1306,7 +1353,7 @@ class Produktion {
$sql = "SELECT SUM(menge) as menge FROM lager_reserviert r WHERE lager_platz=$lager AND artikel = $artikel AND r.objekt = 'produktion' AND r.parameter = $produktion_id";
$menge_reserviert_diese = $this->app->DB->SelectArr($sql)[0]['menge'];
if ($only_reservations) {
$menge_verfuegbar = $menge_reserviert_diese;
} else {
@ -1329,8 +1376,8 @@ class Produktion {
}
// echo("------------------------Lager $lager a $artikel menge_plan_artikel $menge_plan_artikel menge_geliefert $menge_geliefert menge_lager $menge_lager menge_reserviert_diese $menge_reserviert_diese menge_reserviert_gesamt $menge_reserviert_gesamt menge_verfuegbar $menge_verfuegbar menge_moeglich_artikel $menge_moeglich_artikel menge_moeglich $menge_moeglich<br>");
}
}
if ($menge_moeglich < 0) {
$menge_moeglich = 0;
@ -1338,7 +1385,7 @@ class Produktion {
return($menge_moeglich);
}
}
// Modify or add reservation
// If quantity is negative, the existing reservation will be reduced
@ -1367,18 +1414,18 @@ class Produktion {
if ($menge_lager == null) {
$menge_lager = 0;
}
if ($menge_reservieren < 0) { // Relative reduction
$menge_reservieren = $menge_reserviert_diese+$menge_reservieren;
if ($menge_reservieren < 0) {
if ($menge_reservieren < 0) {
$menge_reservieren = 0;
}
}
}
}
if (($menge_reservieren == 0) && ($menge_reservieren_limit <= 0)) {
$sql = "DELETE FROM lager_reserviert WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id";
$this->app->DB->Update($sql);
$this->app->DB->Update($sql);
return(0);
}
@ -1391,7 +1438,7 @@ class Produktion {
// Nothing to do
return($menge_reserviert_diese);
}
}
}
if ($menge_lager_reservierbar > 0) {
if ($menge_reserviert_diese > 0) {
@ -1399,9 +1446,9 @@ class Produktion {
if ($menge_reservieren > $menge_lager_reservierbar) {
$menge_reservieren = $menge_lager_reservierbar; // Take all that is there
}
$sql = "UPDATE lager_reserviert SET menge = $menge_reservieren WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id";
$this->app->DB->Update($sql);
} else {
$sql = "UPDATE lager_reserviert SET menge = $menge_reservieren WHERE objekt = '$objekt' AND parameter = $objekt_id AND artikel = $artikel AND posid = $position_id";
$this->app->DB->Update($sql);
} else {
// Create new entry
if ($menge_reservieren > $menge_lager_reservierbar) {
$menge_reservieren = $menge_lager_reservierbar; // Take all that is there
@ -1415,15 +1462,15 @@ class Produktion {
$lager.",".
"'$text'".
")";
$this->app->DB->Update($sql);
}
$this->app->DB->Update($sql);
}
} else {
$menge_reservieren = 0;
}
}
return ($menge_reservieren);
}
}
/*
@ -1450,7 +1497,7 @@ class Produktion {
// Process positions
$sql = "SELECT * FROM produktion_position WHERE produktion = $produktion_id";
$positionen = $this->app->DB->SelectArr($sql);
$positionen = $this->app->DB->SelectArr($sql);
foreach ($positionen as $position) {
$menge_pro_stueck = $position['menge']/$produktionsmengen_alt['menge'];
@ -1519,7 +1566,7 @@ class Produktion {
return($result);
}
// Do calculations for the status icon display
// id = 0 for all open ones
function StatusBerechnen(int $produktion_id) {
@ -1532,7 +1579,7 @@ class Produktion {
$sql = "SELECT id, lager_ok, reserviert_ok, auslagern_ok, einlagern_ok, zeit_ok, versand_ok FROM produktion ".$where;
$produktionen = $this->app->DB->SelectArr($sql);
foreach ($produktionen as $produktion) {
$produktion_id = $produktion['id'];
@ -1600,9 +1647,9 @@ class Produktion {
}
}
// Copy an existing produktion as draft, with option to adjust the quantity
// Copy an existing produktion as draft, with option to adjust the quantity
// return id on sucess, else negative number
function Copy($produktion_id, $menge_abteilen) : int {
if (empty($produktion_id)) {
@ -1633,7 +1680,7 @@ class Produktion {
$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['adresse'] = $produktion_alt['adresse'];
$produktion_neu['auftragid'] = $produktion_alt['auftragid'];
$produktion_neu['freitext'] = $produktion_alt['freitext'];
$produktion_neu['internebemerkung'] = $produktion_alt['internebemerkung'];
@ -1644,8 +1691,8 @@ class Produktion {
} else {
$produktion_neu['internebezeichnung '] = $produktion_alt['internebezeichnung'];
}
$produktion_neu['standardlager'] = $produktion_alt['standardlager'];
$produktion_neu['standardlager'] = $produktion_alt['standardlager'];
$columns = "";
@ -1658,7 +1705,7 @@ class Produktion {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'";
$fix = ", ";
$fix = ", ";
}
$sql = "INSERT INTO produktion (".$columns.") VALUES (".$values.")";
@ -1667,7 +1714,7 @@ class Produktion {
// Now add the positions
$sql = "SELECT * FROM produktion_position WHERE produktion = $produktion_id";
$positionen = $this->app->DB->SelectArr($sql);
$positionen = $this->app->DB->SelectArr($sql);
foreach ($positionen as $position) {
@ -1699,7 +1746,7 @@ class Produktion {
Write something into the log
*/
function ProtokollSchreiben(int $produktion_id, string $text) {
$sql = "INSERT INTO produktion_protokoll (produktion, zeit, bearbeiter, grund) VALUES ($produktion_id, NOW(), '".$this->app->DB->real_escape_string($this->app->User->GetName())."','".$this->app->DB->real_escape_string($text)."')";
$sql = "INSERT INTO produktion_protokoll (produktion, zeit, bearbeiter, grund) VALUES ($produktion_id, NOW(), '".$this->app->DB->real_escape_string($this->app->User->GetName())."','".$this->app->DB->real_escape_string($text)."')";
$this->app->DB->Insert($sql);
}
@ -1710,6 +1757,13 @@ class Produktion {
$tmp->DisplayNew($parsetarget,'Protokoll','noAction');
}
function produktion_pdf() {
$id = $this->app->Secure->GetGET('id');
$Brief = new ProduktionPDF($this->app, styleData: Array('herstellernummerimdokument' => 1, 'ohne_steuer' => true, 'artikeleinheit' => false, 'abstand_boxrechtsoben' => -70, 'abstand_artikeltabelleoben' => -80, 'abstand_betreffzeileoben' => -70, 'preise_ausblenden' => true, 'hintergrund' => 'none'));
$Brief->GetProduktion($id);
$Brief->displayDocument(false);
exit();
}
}

View File

@ -152,7 +152,7 @@ class Projekt extends GenProjekt {
$width = array('1%','8%', '20%','5%','15%', '15%');
$moreinfo = true;
$moreinfoaction='projektuebersicht';
$findcols = array('p.abkuerzung','p.name','a.kundennummer','a.name','p.verantwortlicher');
$findcols = array('','p.abkuerzung','p.name','a.kundennummer','a.name','a2.name');
$defaultorder = 6;
$menu = "<table class=\"nopadding\" cellpadding=\"0\" cellspacing=\"0\">";
@ -161,8 +161,12 @@ class Projekt extends GenProjekt {
$width[] = '8%';
$heading[] = '&Ouml;ffentlich';
$findcols[] = "if(p.oeffentlich,'ja','-')";
$searchsql = array('p.name', 'p.abkuerzung', 'a2.name', 'a.kundennummer', 'a.name',"if(p.oeffentlich,'ja','-')");
$width[] = '1%';
$heading[] = 'Nummern-Kreis';
$findcols[] = "if(p.eigenernummernkreis,'ja','-')";
$searchsql = array('p.name', 'p.abkuerzung', 'a2.name', 'a.kundennummer', 'a.name',"if(p.oeffentlich,'ja','-')");
$heading[] = 'Men&uuml;';
@ -192,8 +196,10 @@ class Projekt extends GenProjekt {
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS p.id, '<img src=./themes/".$app->Conf->WFconf['defaulttheme']."/images/details_open.png class=details>' as open,";
$sql .= " p.abkuerzung, p.name, a.kundennummer,a.name, a2.name,";
$sql .= "if(p.oeffentlich,'ja','-') as oeffentlich, $freifeldsql
p.id as menu FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON p.verantwortlicher = a2.id ";
$sql .= " if(p.oeffentlich,'ja','-') as oeffentlich,";
$sql .= " if(p.eigenernummernkreis,'ja','-') as eigenernummernkreis,";
$sql .= $freifeldsql;
$sql .= "p.id as menu FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON p.verantwortlicher = a2.id ";
//if(p.status like 'abgeschlossen','abgeschlossen','offen') as status,
// fester filter
$where = " p.geloescht=0 " . $app->erp->ProjektRechte();
@ -1884,12 +1890,15 @@ class Projekt extends GenProjekt {
$id = (int)$this->app->Secure->GetGET('id');
$this->ProjektMenu();
$speichern = $this->app->Secure->GetPOST('speichern');
if($speichern!='')
{
$kunde = $this->app->Secure->GetPOST("kunde");
$verantwortlicher = $this->app->Secure->GetPOST("verantwortlicher");
$uebergeordnetes_projekt = $this->app->Secure->GetPOST('uebergeordnetes_projekt');
$uebergeordnetes_projekt = $this->app->erp->ReplaceProjektName(true,$uebergeordnetes_projekt,true);
$kundennummer = strstr($kunde,' ',true);
$mitarbeiternummer = strstr($verantwortlicher,' ',true);
$kundeid = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer!='' AND kundennummer='$kundennummer' AND geloescht!=1 LIMIT 1");
@ -1921,7 +1930,7 @@ class Projekt extends GenProjekt {
}
$this->app->FormHandler->FormUpdateDatabase("projekt",$id);
$this->app->DB->Update("UPDATE projekt SET kunde='$kundeid', verantwortlicher='$verantwortlicherid' WHERE id='$id' LIMIT 1");
$this->app->DB->Update("UPDATE projekt SET kunde='$kundeid', verantwortlicher='$verantwortlicherid', uebergeordnetes_projekt='$uebergeordnetes_projekt' WHERE id='$id' LIMIT 1");
if($msg!="")
{
header("Location: index.php?module=projekt&action=uebersicht&id=$id&msg=$msg");
@ -1931,12 +1940,13 @@ class Projekt extends GenProjekt {
}
$this->app->FormHandler->FormGetVars("projekt",$id);
$data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status FROM projekt p
$data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status, uebergeordnetes_projekt, abkuerzung FROM projekt p
LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON a2.id=p.verantwortlicher WHERE p.id='$id' LIMIT 1");
if(isset($data[0]))
{
$this->app->Tpl->Set('KUNDE',$data[0]['kunde']);
$this->app->Tpl->Set('VERANTWORTLICHER',$data[0]['mitarbeiter']);
$this->app->Tpl->Set('VERANTWORTLICHER',$data[0]['mitarbeiter']);
$this->app->Tpl->Set('UEBERGEORDNETES_PROJEKT',$this->app->erp->ReplaceProjektName(false,$data[0]['uebergeordnetes_projekt'],false));
switch($data[0]['status']){
case 'gestartet':
case 'geplant':
@ -1946,8 +1956,6 @@ class Projekt extends GenProjekt {
}
}
for($i = 0; $i <= 10; $i++)
{
$n1 = 'projektfreifeld'.$i.'typ';
@ -2041,9 +2049,52 @@ class Projekt extends GenProjekt {
$this->app->Tpl->Set("FREIFELDER",$output);
$this->app->YUI->AutoComplete("abkuerzung","projektname",1);
// Build simple tree view
$projekte = $this->app->DB->SelectArr("SELECT id, abkuerzung, name, uebergeordnetes_projekt FROM projekt");
function buildTree(array $elements, $parentId = 0, $limit = 10) {
$limit--;
if ($limit < 1) {
return;
}
$branch = array();
foreach ($elements as $element) {
if ($element['uebergeordnetes_projekt'] == $parentId) {
$children = buildTree($elements, $element['id'], $limit);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}
$projektbaum = buildTree($projekte, $id);
if (!empty($projektbaum)) {
$root = array();
$root['abkuerzung'] = $data[0]['abkuerzung'];
$root['children'] = $projektbaum;
function printleaf($leaf, $level, $first = false) {
if (!$first) {
$s = $level;
}
$s .= "- ".$leaf['abkuerzung']."\n";
if ($leaf['children']) {
foreach ($leaf['children'] as $childleaf) {
$s .= printleaf($childleaf, $level.$level);
}
}
return($s);
}
$baum .= printleaf($root," ", true);
$this->app->Tpl->Set("PROJEKTBAUM",$baum);
} else {
$this->app->Tpl->Set("PROJEKTBAUMHIDDEN",'hidden');
}
// $this->app->YUI->AutoComplete("abkuerzung","projektname",1);
$this->app->YUI->AutoComplete("kunde","kunde");
$this->app->YUI->AutoComplete("verantwortlicher","adresse");
$this->app->YUI->AutoComplete("uebergeordnetes_projekt","projektname");
$this->app->YUI->CkEditor("beschreibung","belege");
$this->app->YUI->CkEditor("sonstiges","internal");
$this->app->Tpl->Parse('PAGE','projekt_uebersicht.tpl');
@ -2825,9 +2876,14 @@ class Projekt extends GenProjekt {
if($check > 0){
$this->app->DB->Update(
"UPDATE `projekt`
SET `name` = '" . $data['name'] . "', `abkuerzung` = '" . $data['abkuerzung'] . "',
`kunde` = '" . $data['kunde'] . "', `verantwortlicher` = '" . $data['verantwortlicher'] . "',
`beschreibung` = '" . $data['beschreibung'] . "', `status` = '" . $data['status'] . "'
SET
`name` = '" . $data['name'] . "',
`abkuerzung` = '" . $data['abkuerzung'] . "',
`kunde` = '" . $data['kunde'] . "',
`verantwortlicher` = '" . $data['verantwortlicher'] . "',
`uebergeordnetes_projekt` = '" . $data['uebergeordnetes_projekt'] . "',
`beschreibung` = '" . $data['beschreibung'] . "',
`status` = '" . $data['status'] . "'
WHERE `id` = '$check'
LIMIT 1"
);

View File

@ -1345,7 +1345,7 @@ class Rechnung extends GenRechnung
$this->app->erp->GetSteuerPosition('rechnung', $position['id'], $steuersatz, $steuertext, $erloes);
$positionen[$key]['steuersatz'] = $steuersatz;
$positionen[$key]['steuertext'] = $steuertext;
$positionen[$key]['erloese'] = round($erloes,2);
$positionen[$key]['erloes'] = $erloes;
$positionen[$key]['umsatz_netto_gesamt'] = round($position['umsatz_netto_gesamt'],2);
$positionen[$key]['umsatz_brutto_gesamt'] = round($position['umsatz_brutto_gesamt'],2);

View File

@ -350,7 +350,11 @@ class Wareneingang {
// $menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>Menge:&nbsp;<input type=\"text\" size=\"5\" name=\"pos[%value%]\">&nbsp;</td></tr></table>";
$menucol = 4;
$lagerartikel = "";
if($this->app->erp->Firmendaten("wareneingang_lagerartikel")) {
$lagerartikel = "AND art.lagerartikel = 1";
} else {
$lagerartikel = "";
}
$receiptDocument = $this->app->erp->ModulVorhanden('receiptdocument');
if ($receiptDocument) {
$this->app->DB->Select('SELECT id FROM receiptdocument LIMIT 1');

View File

@ -35,7 +35,9 @@
<br>
<table>
<tr><td width="150">{|Textbaustein|}:</td><td>&lt;line x="5" y="1" size="3"&gt;Test&lt;/line&gt;</td></tr>
<tr><td width="150">{|Barcode|}:</td><td>&lt;barcode x="5" y="1" size="3" type="1"&gt;Test&lt;/barcode&gt;</td></tr>
<tr><td width="150">{|Barcode Code 39 (Standard)|}:</td><td>&lt;barcode x="5" y="1" linewidth="0.5" size="3" type="2"&gt;Test&lt;/barcode&gt;</td></tr>
<tr><td width="150">{|Barcode Code 128|}:</td><td>&lt;barcode x="5" y="1" size="3" type="1"&gt;Test&lt;/barcode&gt;</td></tr>
<tr><td width="150">{|Barcode Code GS1-128|}:</td><td>&lt;barcode x="5" y="1" size="3" type="GS1-128"&gt;Test&lt;/barcode&gt;</td></tr>
<tr><td width="150" valign="top">{|QR-Code|}:</td><td>&lt;qrcode x="5" y="1" size="3" type="3"&gt;Test&lt;/qrcode&gt;<br /><br /></td></tr>
<tr><td width="150" valign="top">{|Artikel klein|}:</td><td>
<label>

View File

@ -23,8 +23,8 @@
<tr><td>{|Lager|}</td><td>[BEZEICHNUNG][MSGBEZEICHNUNG]&nbsp;<i>{|z.B. Raum 1, Lager Berlin|}</i></td></tr>
<tr><td>{|Projekt|}</td><td>[PROJEKT][MSGPROJEKT]&nbsp;<i>{|Optional Angabe|}</i></td></tr>
<tr><td>{|Adresse|}</td><td>[ADRESSE][MSGADRESSE]&nbsp;<i>{|Optional Angabe Adresse für Kommissionslager, externe Produktion oder Anschrift bzw. Land vom Lager|}</i></td></tr>
<!--<tr><td></td><td>[MANUELL][MSGMANUELL]Lager darf ohne Barcode-Scanner betrieben werden</td></tr>
<tr><td>Kurzbeschreibung</td><td>[BESCHREIBUNG][MSGBESCHREIBUNG]</td></tr>-->
<!--<tr><td></td><td>[MANUELL][MSGMANUELL]Lager darf ohne Barcode-Scanner betrieben werden</td></tr>-->
<tr><td>Beschreibung</td><td>[BESCHREIBUNG][MSGBESCHREIBUNG]</td></tr>
</tbody>
</table>
</td>