diff --git a/phpwf/plugins/class.yui.php b/phpwf/plugins/class.yui.php index eae058dc..8b9a07ea 100644 --- a/phpwf/plugins/class.yui.php +++ b/phpwf/plugins/class.yui.php @@ -6844,10 +6844,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise, as fehlt, if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status ".(!empty($zusatzcols)?','.implode(', ',$zusatzcols):'').", - IF(r.xmlrechnung, - CONCAT('app->Conf->WFconf['defaulttheme']."/images/xml.svg\" border=\"0\">'), - CONCAT('app->Conf->WFconf['defaulttheme']."/images/pdf.svg\" border=\"0\">') - ), + ".$this->GetRechnungFileDownloadLinkIconSQL().", r.id FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id LEFT JOIN auftrag au ON au.id = r.auftragid "; if(isset($parameter['artikel']) && !empty($parameter['artikel'])) { @@ -15941,4 +15938,24 @@ function IframeDialog($width, $height, $src = "") { return 'convert(cast(convert('.$field.' using latin1) as binary) using utf8)'; //return $field.' COLLATE utf8_general_ci'; ersetzt Original } + + public function GetRechnungFileDownloadLinkIconSQL($tablename = 'r') { + return( + "IF(".$tablename.".xmlrechnung, + CONCAT('app->Conf->WFconf['defaulttheme']."/images/xml.svg\" border=\"0\">'), + CONCAT('app->Conf->WFconf['defaulttheme']."/images/pdf.svg\" border=\"0\">') + )" + ); + } + + public function GetRechnungFileDownloadLinkIcon($id) { + $xmlrechnung = $this->app->DB->SelectRow("SELECT belegnr, xmlrechnung FROM rechnung WHERE id = '".$id."' LIMIT 1"); + if ($xmlrechnung['belegnr'] == '') { + return(''); + } else if ($xmlrechnung['xmlrechnung']) { + return(""); + } else { + return(""); + } + } } diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 8041d826..02d59d24 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -2199,6 +2199,18 @@ public function NavigationHooks(&$menu) return false; } + // Rechnung special treatment because of XML + function RechnungArchivieren($id) { + $sql = "SELECT xmlrechnung FROM rechnung WHERE id = '".$id."' LIMIT 1"; + $xmlrechnung = $this->app->DB->Select($sql); + if ($xmlrechnung) { + $rechnungsmodul = $this->app->loadModule('rechnung', false); + return($rechnungsmodul->RechnungArchiviereXML($id)); + } else { + $this->PDFArchivieren('rechnung',$id,true); + } + } + // @refactor in Location Klasse function UrlOrigin($s, $use_forwarded_host=false) { @@ -3267,7 +3279,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu ); $this->app->erp->ANABREGSNeuberechnen($invoice['id'], 'rechnung'); if($invoice['schreibschutz']) { - $this->app->erp->PDFArchivieren('rechunng', $invoice['id'], true); + $this->app->erp->RechnungArchivieren($invoice['id']); } } } @@ -15234,20 +15246,21 @@ function Gegenkonto($ust_befreit,$ustid='', $doctype = '', $doctypeId = 0) } $rechnungarr = $this->app->DB->SelectRow( - "SELECT adresse, email, name,belegnr,projekt,sprache,schreibschutz,zuarchivieren + "SELECT adresse, email, name,belegnr,projekt,sprache,schreibschutz,zuarchivieren,xmlrechnung FROM rechnung WHERE id='$id' LIMIT 1" ); if(empty($rechnungarr)) { return; } if(!empty($rechnungarr['schreibschutz']) && !empty($rechnungarr['zuarchivieren'])) { - $this->app->erp->PDFArchivieren('rechnung', $id, true); + $this->app->erp->RechnungArchivieren($id); } $adresse = $rechnungarr['adresse']; $to = $rechnungarr['email']; $to_name = $rechnungarr['name']; $belegnr = $rechnungarr['belegnr']; $projekt = $rechnungarr['projekt']; + $xmlrechnung = $rechnungarr['xmlrechnung']; $sprache = $rechnungarr['sprache']; if($sprache=='' && $adresse > 0) { @@ -15272,21 +15285,27 @@ function Gegenkonto($ust_befreit,$ustid='', $doctype = '', $doctypeId = 0) $betreff = $this->ParseUserVars('rechnung',$id,$betreff); // 19.01.2018 eingefuegt BW if($id > 0) { - $this->app->erp->BriefpapierHintergrunddisable = false; - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projekt); - }else{ - $Brief = new RechnungPDF($this->app,$projekt); - } - $Brief->GetRechnung($id); - $arrtmpfile[] = $Brief->displayTMP(); - if(!$Brief->DocumentArchiviert()) { - $Brief->ArchiviereDocument(true, true); + if (!$xmlrechnung) { + $this->app->erp->BriefpapierHintergrunddisable = false; + if(class_exists('RechnungPDFCustom')) + { + $Brief = new RechnungPDFCustom($this->app,$projekt); + }else{ + $Brief = new RechnungPDF($this->app,$projekt); + } + $Brief->GetRechnung($id); + $arrtmpfile[] = $Brief->displayTMP(); + + if(!$Brief->DocumentArchiviert()) { + $Brief->ArchiviereDocument(true, true); + } + $md5arr[] = @md5_file($arrtmpfile[(!empty($arrtmpfile)?count($arrtmpfile):0)-1]); + } else { + $arrtmpfile = Array(); + $md5arr = Array(); } - $md5arr[] = @md5_file($arrtmpfile[(!empty($arrtmpfile)?count($arrtmpfile):0)-1]); // anhaenge automatisch mitversenden $resultdateien = $this->app->DB->SelectArr("SELECT datei FROM datei_stichwoerter WHERE objekt LIKE 'Rechnung' AND parameter='$id'"); $cResultdateien = !empty($resultdateien)?count($resultdateien):0; @@ -23477,54 +23496,63 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert, if($typ=="rechnung") { // sende - $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); - }else{ - $Brief = new RechnungPDF($this->app,$projektbriefpapier); - } - $Brief->GetRechnung($id); + $xmlrechnug = $this->app->DB->Select("SELECT xmlrechnung FROM rechnung WHERE id ='".$id."' LIMIT 1"); + if ($xmlrechnung) { + $xmlrechnungresult = $this->app->erp->GetXMLRechnung($id); + if ($xmlrechnungresult['success']) { + $tmpfile = $xmlrechnungresult['xml']; + } else { + throw new exception("XML Rechnung fehlgeschlagen!"); + } + } else { + $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; + if(class_exists('RechnungPDFCustom')) + { + $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); + }else{ + $Brief = new RechnungPDF($this->app,$projektbriefpapier); + } + $Brief->GetRechnung($id); - if(isset($sammelpdf)) - { - foreach($sammelpdf as $dat) - { - $Brief->AddPDF($dat); - } - } + if(isset($sammelpdf)) + { + foreach($sammelpdf as $dat) + { + $Brief->AddPDF($dat); + } + } - //$Brief->ArchiviereDocument(); - $tmpfile = $Brief->displayTMP(); - $Brief->ArchiviereDocument(true); - unlink($tmpfile); - $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); - }else{ - $Brief = new RechnungPDF($this->app,$projektbriefpapier); + //$Brief->ArchiviereDocument(); + $tmpfile = $Brief->displayTMP(); + $Brief->ArchiviereDocument(true); + unlink($tmpfile); + $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; + if(class_exists('RechnungPDFCustom')) + { + $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); + }else{ + $Brief = new RechnungPDF($this->app,$projektbriefpapier); + } + $Brief->GetRechnung($id); + $tmpfile = $Brief->displayTMP(); + $Brief->ArchiviereDocument(true); + if(isset($sammelpdf)) + { + unlink($tmpfile); + if(class_exists('RechnungPDFCustom')) + { + $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); + }else{ + $Brief = new RechnungPDF($this->app,$projektbriefpapier); + } + $Brief->GetRechnung($id); + foreach($sammelpdf as $dat) + { + $Brief->AddPDF($dat); + } + $tmpfile = $Brief->displayTMP(); + } } - $Brief->GetRechnung($id); - $tmpfile = $Brief->displayTMP(); - $Brief->ArchiviereDocument(true); - if(isset($sammelpdf)) - { - unlink($tmpfile); - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); - }else{ - $Brief = new RechnungPDF($this->app,$projektbriefpapier); - } - $Brief->GetRechnung($id); - foreach($sammelpdf as $dat) - { - $Brief->AddPDF($dat); - } - $tmpfile = $Brief->displayTMP(); - } - //$Brief->ArchiviereDocument(); } @@ -29219,7 +29247,6 @@ function Firmendaten($field,$projekt="") function SetXMLRechnung($id) { - /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'SetXMLRechnung')) { return $obj->SetXMLRechnung($id); @@ -29227,6 +29254,15 @@ function Firmendaten($field,$projekt="") return 0; } + function GetXMLRechnung($id) + { + $obj = $this->app->erp->LoadModul('rechnung'); + if(!empty($obj) && method_exists($obj,'RechnungSmarty')) { + return $obj->RechnungSmarty(id: $id, returnvalue: true); + } + return 0; + } + function BelegFreigabe($beleg,$id) { if($id <= 0 || empty($beleg)) { @@ -33043,7 +33079,6 @@ function Firmendaten($field,$projekt="") } } - function DeleteBestellung($id) { /** @var Bestellung $obj */ @@ -33054,7 +33089,6 @@ function Firmendaten($field,$projekt="") } } - function CreateRechnung($adresse="") { /** @var Rechnung $obj */ @@ -33064,7 +33098,6 @@ function Firmendaten($field,$projekt="") } } - public function GetStandardWaehrung($projekt=0) { if(is_array($projekt) && isset($projekt['eigenesteuer']) && isset($projekt['waehrung'])) { diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 27d0e000..fdcecd1a 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -1640,6 +1640,7 @@ class Auftrag extends GenAuftrag * * @return string */ +/* XENTRAL Legacy public function AuftragTrackingTabelle($id) { $table = new EasyTable($this->app); @@ -1676,6 +1677,7 @@ class Auftrag extends GenAuftrag return $result; } +*/ function AuftragPDFfromArchiv() { @@ -2117,26 +2119,28 @@ class Auftrag extends GenAuftrag /* rechnungen */ + $link_zur_rechnung = "CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),' ',".$this->app->YUI->GetRechnungFileDownloadLinkIconSQL().",'  ')"; + $sammelrechnungcheck = $this->app->DB->Select("SELECT * FROM sammelrechnung_position LIMIT 1"); if($sammelrechnungcheck) { $rechnung = $this->app->DB->SelectPairs( "SELECT - r.id, CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),'   - ') as rechnung + r.id, + ".$link_zur_rechnung." as rechnung FROM rechnung r WHERE r.auftragid='$id' union SELECT - r.id,CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),'   - ') as rechnung + r.id, + ".$link_zur_rechnung." as rechnung FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN auftrag_position p ON s.auftrag_position_id = p.id WHERE p.auftrag='$id' union SELECT - r.id,CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),'   - ') as rechnung + r.id, + ".$link_zur_rechnung." as rechnung FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN lieferschein_position lp ON lp.id = s.lieferschein_position_id @@ -2158,9 +2162,8 @@ class Auftrag extends GenAuftrag else{ $rechnung = $this->app->DB->SelectPairs( "SELECT - r.id, CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),'   - ' - ) as rechnung + r.id, + ".$link_zur_rechnung." as rechnung FROM rechnung r WHERE r.auftragid='$id'" ); @@ -2176,10 +2179,9 @@ class Auftrag extends GenAuftrag if(!$rechnung) { $rechnung = $this->app->DB->SelectPairs( "SELECT - r.id, CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),'   - ' - ) as rechnung - FROM rechnung r + r.id, + ".$link_zur_rechnung." as rechnung + FROM rechnung r INNER JOIN auftrag a ON a.rechnungid = r.id WHERE a.id='$id' "); @@ -5071,7 +5073,7 @@ class Auftrag extends GenAuftrag foreach($lieferscheine as $deliveryNoteId => $deliveryNoteNumber) { $optional .= " "; } } @@ -5084,7 +5086,7 @@ class Auftrag extends GenAuftrag foreach($rechnungen as $invoiceId => $invoiceNumber) { $optional .= " "; } } @@ -5260,11 +5262,13 @@ class Auftrag extends GenAuftrag $this->app->Tpl->Add('AUFTRAGSDOKUMENTE',""); } +/* XENTRAL Legacy //suche alle LS zu diesem Auftrag if($auftragsnummer>0) { $trackingInfo = $this->AuftragTrackingTabelle(empty($deliveryNoteIds)?0: $id); $this->app->Tpl->Set('VERSAND', $trackingInfo); } +*/ // UST $ust_ok = $orderRow['ust_ok'];//$this->app->DB->Select("SELECT ust_ok FROM auftrag WHERE id='$id' LIMIT 1"); @@ -5717,7 +5721,7 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. $this->app->erp->ANABREGSNeuberechnen($rechnung,"rechnung"); $this->app->erp->rechnung_zahlstatus_berechnen($id); - $this->app->erp->PDFArchivieren("rechnung",$rechnung); + $this->app->erp->RechnungArchivieren($rechnung); } } // auftrag_position geliefert_menge und geliefert anpassen @@ -6129,15 +6133,12 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. } unlink($tmpfile); } - // Send the invoice as last step if($autodruckrechnungstufe1mail && $rechnung > 0) { $this->app->erp->Rechnungsmail($rechnung); } - $this->app->erp->RunHook('auftrag_versand_ende', 1, $id); - // wenn per URL aufgerufen if($internmodus!='1') { diff --git a/www/pages/lieferschein.php b/www/pages/lieferschein.php index cfe08757..4b80a518 100644 --- a/www/pages/lieferschein.php +++ b/www/pages/lieferschein.php @@ -876,22 +876,19 @@ class Lieferschein extends GenLieferschein $this->app->Tpl->Set('AUFTRAG','-'); } + $link_zur_rechnung = "CONCAT('','>'),if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),if(r.status='storniert','',''),' ',".$this->app->YUI->GetRechnungFileDownloadLinkIconSQL().",'  ')"; + if($auftragArr[0]['auftragid'] > 0){ $rechnung = $this->app->DB->SelectArr( ($auftragArr[0]['auftragid']? "SELECT - CONCAT('',if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),'   - ') as rechnung - FROM rechnung r WHERE r.auftragid='".$auftragArr[0]['auftragid']."' AND r.auftragid <> '0' + ".$link_zur_rechnung." as rechnung FROM rechnung r WHERE r.auftragid='".$auftragArr[0]['auftragid']."' AND r.auftragid <> '0' union SELECT - CONCAT('',if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),'   - ') as rechnung - FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN auftrag_position p ON s.auftrag_position_id = p.id WHERE p.auftrag='".$auftragArr[0]['auftragid']."' + ".$link_zur_rechnung." as rechnung FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN auftrag_position p ON s.auftrag_position_id = p.id WHERE p.auftrag='".$auftragArr[0]['auftragid']."' union ":"")." SELECT - CONCAT('',if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),'   - ') as rechnung + ".$link_zur_rechnung." as rechnung FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN lieferschein_position lp ON lp.id = s.lieferschein_position_id WHERE lp.lieferschein='$id' @@ -903,14 +900,11 @@ class Lieferschein extends GenLieferschein if($auftragArr[0]['rechnungid'] > 0){ $rechnung = $this->app->DB->SelectArr("SELECT - CONCAT('',if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),'   - ') as rechnung + ".$link_zur_rechnung." as rechnung FROM rechnung r WHERE r.id='".$auftragArr[0]['rechnungid']."' AND r.id <> '0' - union - + union SELECT - CONCAT('',if(r.belegnr='0' OR r.belegnr='','ENTWURF',r.belegnr),'   - ') as rechnung + ".$link_zur_rechnung." as rechnung FROM rechnung r INNER JOIN sammelrechnung_position s ON r.id = s.rechnung INNER JOIN lieferschein_position lp ON lp.id = s.lieferschein_position_id WHERE lp.lieferschein='$id' diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index c214525f..86fc9c41 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -76,6 +76,7 @@ class Rechnung extends GenRechnung $this->app->ActionHandler("dateien","RechnungDateien"); $this->app->ActionHandler("pdffromarchive","RechnungPDFfromArchiv"); $this->app->ActionHandler("archivierepdf","RechnungArchivierePDF"); + $this->app->ActionHandler("archivierexml","RechnungArchiviereXML"); $this->app->ActionHandler("summe","RechnungSumme"); // nur fuer rechte $this->app->ActionHandler("belegnredit","belegnredit"); // nur fuer rechte @@ -201,33 +202,61 @@ class Rechnung extends GenRechnung $this->app->ExitXentral(); } - + function RechnungArchiviereXML($id = null) { + if ($id === null) { + $id = (int)$this->app->Secure->GetGET('id'); + $redirect = true; + } + $result = $this->RechnungSmarty(id: $id, json: false, returnvalue: true); + + if ($result['success']) { + + // Check for old files + $existing = false; + $existing_ids = $this->app->erp->GetDateiSubjektObjekt('rechnung','rechnung',$id); + foreach ($existing_ids as $existing_id) { + if($this->app->erp->GetDateiEndung($existing_id) == 'xml') { + $existing = true; + break; + } + } + + if ($existing) { + $this->app->erp->AddDateiVersion( + id: $existing_id, + ersteller: $this->app->User->GetName(), + dateiname: $result['filename'].'.xml', + bemerkung: '', + datei: $result['xml'], + path: "" + ); + } else { + $this->app->erp->CreateDateiWithStichwort( + name: $result['filename'].'.xml', + titel: $result['title'], + beschreibung: '', + nummer: '', + datei: $result['xml'], + ersteller: $this->app->User->GetName(), + subjekt: 'rechnung', + objekt: 'rechnung', + parameter: $id + ); + } + } else { + throw new exception("XML Rechnung fehlgeschlagen!"); + } + + $this->app->DB->Update("UPDATE rechnung SET schreibschutz='1', zuarchivieren = '0' WHERE id='$id'"); + if ($redirect) { + $this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id); + } + } + function RechnungArchivierePDF() { $id = (int)$this->app->Secure->GetGET('id'); - $projekt = $this->app->DB->Select("SELECT projekt FROM rechnung WHERE id = '$id' LIMIT 1"); - $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projekt); - }else{ - $Brief = new RechnungPDF($this->app,$projekt); - } - $Brief->GetRechnung($id); - $tmpfile = $Brief->displayTMP(); - $Brief->ArchiviereDocument(1); - unlink($tmpfile); - $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; - if(class_exists('RechnungPDFCustom')) - { - $Brief = new RechnungPDFCustom($this->app,$projekt); - }else{ - $Brief = new RechnungPDF($this->app,$projekt); - } - $Brief->GetRechnung($id); - $tmpfile = $Brief->displayTMP(); - $Brief->ArchiviereDocument(1); - + $this->app->erp->PDFArchivieren('rechnung', $id, true); $this->app->DB->Update("UPDATE rechnung SET schreibschutz='1' WHERE id='$id'"); $this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id); } @@ -548,15 +577,7 @@ class Rechnung extends GenRechnung   "; - if (!empty($rechnungarr['belegnr'])) { - if ($rechnungarr['xmlrechnung']) { - $downloadicon = ""; - } else { - $downloadicon = ""; - } - } else { - $downloadicon = ''; - } + $downloadicon = $this->app->YUI->GetRechnungFileDownloadLinkIcon($id); $menu .= $downloadicon; @@ -1234,7 +1255,7 @@ class Rechnung extends GenRechnung $doppel = $this->app->Secure->GetGET('doppel'); $invoiceArr = $this->app->DB->SelectRow("SELECT schreibschutz, projekt, zuarchivieren FROM rechnung WHERE id='$id' LIMIT 1"); if(!empty($invoiceArr['schreibschutz']) && !empty($invoiceArr['zuarchivieren'])) { - $this->app->erp->PDFArchivieren('rechnung', $id, true); + $this->app->erp->RechnungArchivieren($id); } $projekt = $invoiceArr['projekt']; $schreibschutz = $invoiceArr['schreibschutz']; @@ -1259,7 +1280,7 @@ class Rechnung extends GenRechnung // Print PHP array for SmartyXML function RechnungJSON() { - $this->RechnungSmarty(true); + $this->RechnungSmarty(json: true); } function remove_html_entities_from_array(&$array) { @@ -1284,16 +1305,19 @@ class Rechnung extends GenRechnung } } - function RechnungSmarty($json = false) { - $id = $this->app->Secure->GetGET('id'); + function RechnungSmarty($id = null, $json = false, $returnvalue = false) { + if ($id === null) { + $id = $this->app->Secure->GetGET('id'); + } $result = Array(); + $success = true; $result['rechnungssteller']['name'] = $this->app->erp->Firmendaten('name'); $result['rechnungssteller']['strasse'] = $this->app->erp->Firmendaten('strasse'); $result['rechnungssteller']['ort'] = $this->app->erp->Firmendaten('ort'); $result['rechnungssteller']['plz'] = $this->app->erp->Firmendaten('plz'); $result['rechnungssteller']['land'] = $this->app->erp->Firmendaten('land'); - $result['rechnungssteller']['steuernummer'] = $this->app->erp->Firmendaten('steuernummer'); + $result['rechnungssteller']['steuernummer'] = $this->app->erp->Firmendaten('steuernummer'); $rechnung = $this->app->DB->SelectRow(" SELECT * FROM rechnung WHERE id = $id LIMIT 1 @@ -1314,13 +1338,13 @@ class Rechnung extends GenRechnung throw new exception("Rechnung enthält keine Positionen!"); } - $steuern = Array(); - foreach ($positionen as $key => $position) { + $steuern = Array(); + foreach ($positionen as $key => $position) { $this->app->erp->GetSteuerPosition('rechnung', $position['id'], $steuersatz, $steuertext, $erloes); $positionen[$key]['steuersatz'] = $steuersatz; $positionen[$key]['steuertext'] = $steuertext; $positionen[$key]['erloese'] = $erloes; - + $steuern[$steuersatz]['umsatz_netto'] += $position['umsatz_netto_gesamt']; $steuern[$steuersatz]['umsatz_brutto'] += $position['umsatz_brutto_gesamt']; $steuern[$steuersatz]['prozent'] = $steuersatz; @@ -1335,31 +1359,43 @@ class Rechnung extends GenRechnung $this->remove_CDATA_fragments_from_array($result); if ($json) { - header('Content-type:text/plain'); - header('Content-Disposition: attachment;filename='.$filename.'.json'); - echo(json_encode($result,JSON_PRETTY_PRINT)); + $headers[] = 'Content-type:text/plain'; + $headers[] = 'Content-Disposition: attachment;filename='.$filename.'.json'; + $output = json_encode($result,JSON_PRETTY_PRINT); } else { + $headers[] = 'Content-type:text/xml'; + $headers[] = 'Content-Disposition: attachment;filename='.$filename.'.xml'; $template_id = $this->GetXMLSmartyTemplate($id); if(empty($template_id)) { - header('Content-type:text/xml'); - header('Content-Disposition: attachment;filename='.$filename.'.xml'); - echo(' + $output = ' Kein Smarty Template an der Addresse hinterlegt! -'); +'; + $success = false; } else { $template = $this->app->DB->Select("SELECT template from smarty_templates WHERE id = '$template_id' LIMIT 1"); - $smarty = new Smarty; - $directory = $this->app->erp->GetTMP().'/smarty/templates'; - $smarty->setCompileDir($directory); - $smarty->assign('rechnung', $result); - $html = $smarty->fetch('string:'.$template); - header('Content-type:application/xml'); - header('Content-Disposition: attachment;filename='.$filename.'.xml'); - echo($html); - } + $smarty = new Smarty; + $directory = $this->app->erp->GetTMP().'/smarty/templates'; + $smarty->setCompileDir($directory); + $smarty->assign('rechnung', $output); + $output = $smarty->fetch('string:'.$template); + } } - $this->app->ExitXentral(); + + if ($returnvalue) { + return(Array( + 'success' => $success, + 'title' => 'Rechnung '.$result['kopf']['belegnr'], + 'filename' => $filename, + 'xml' => $output + )); + } else { + foreach ($headers as $header) { + header($header); + } + echo($output); + $this->app->ExitXentral(); + } } function RechnungSuche() @@ -1463,7 +1499,7 @@ class Rechnung extends GenRechnung public function CopyRechnungPosition() { $this->app->YUI->SortListEvent('copy','rechnung_position','rechnung'); - $this->RechnungPositionen(); + $this->RechnungPositionen(); } public function DelRechnungPosition() @@ -1732,38 +1768,6 @@ class Rechnung extends GenRechnung $this->app->erp->CheckBearbeiter($id,'rechnung'); $this->app->erp->CheckBuchhaltung($id,'rechnung'); - $invoiceArr = $this->app->DB->SelectRow( - sprintf( - 'SELECT zahlungsweise,zahlungszieltage,dta_datei,status,zahlungsstatus,schreibschutz FROM rechnung WHERE id= %d LIMIT 1', - (int)$id - ) - ); - $zahlungsweise= $invoiceArr['zahlungsweise']; - $zahlungszieltage= $invoiceArr['zahlungszieltage']; - $zahlungsstatus= $invoiceArr['zahlungsstatus']; - if($zahlungsweise==='rechnung' && $zahlungszieltage<1) - { - $this->app->Tpl->Add('MESSAGE',"
Hinweis: Fälligkeit auf \"sofort\", da Zahlungsziel in Tagen auf 0 Tage gesetzt ist!
"); - } - - $status= $invoiceArr['status']; - $schreibschutz= $invoiceArr['schreibschutz']; - if($status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a') - { - $Brief = new Briefpapier($this->app); - if($Brief->zuArchivieren($id, "rechnung")) - { - $this->app->Tpl->Add('MESSAGE',"
Die Rechnung ist noch nicht archiviert! Bitte versenden oder manuell archivieren.
"); - }elseif(!$this->app->DB->Select("SELECT versendet FROM rechnung WHERE id = '$id' LIMIT 1")) - { - $this->app->Tpl->Add('MESSAGE',"
Die Rechnung wurde noch nicht versendet!
"); - } - } - $this->app->erp->RechnungNeuberechnen($id); //BENE - - $this->RechnungMiniDetail('MINIDETAIL',false); //BENE - $this->app->Tpl->Set('ICONMENU',$this->RechnungIconMenu($id)); - $this->app->Tpl->Set('ICONMENU2',$this->RechnungIconMenu($id,2)); if($id > 0){ $rechnungarr = $this->app->DB->SelectRow("SELECT * FROM rechnung WHERE id='$id' LIMIT 1"); } @@ -1775,18 +1779,46 @@ class Rechnung extends GenRechnung $soll = 0; $projekt = 0; if(!empty($rechnungarr)){ - $nummer = $rechnungarr['belegnr'];//$this->app->DB->Select("SELECT belegnr FROM rechnung WHERE id='$id' LIMIT 1"); - $kundennummer = $rechnungarr['kundennummer'];//$this->app->DB->Select("SELECT kundennummer FROM rechnung WHERE id='$id' LIMIT 1"); - $adresse = $rechnungarr['adresse'];//$this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1"); - $punkte = $rechnungarr['punkte'];//$this->app->DB->Select("SELECT punkte FROM rechnung WHERE id='$id' LIMIT 1"); - $bonuspunkte = $rechnungarr['bonuspunkte'];//$this->app->DB->Select("SELECT bonuspunkte FROM rechnung WHERE id='$id' LIMIT 1"); - $soll = $rechnungarr['soll'];//$this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1"); - $projekt = $rechnungarr['projekt']; - - $skontosoll = $this->app->DB->Select("SELECT TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll FROM rechnung where id = '".$id."' LIMIT 1"); - - $xmlrechnung = $rechnungarr['xmlrechnung']; + $nummer = $rechnungarr['belegnr'];//$this->app->DB->Select("SELECT belegnr FROM rechnung WHERE id='$id' LIMIT 1"); + $kundennummer = $rechnungarr['kundennummer'];//$this->app->DB->Select("SELECT kundennummer FROM rechnung WHERE id='$id' LIMIT 1"); + $adresse = $rechnungarr['adresse'];//$this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1"); + $punkte = $rechnungarr['punkte'];//$this->app->DB->Select("SELECT punkte FROM rechnung WHERE id='$id' LIMIT 1"); + $bonuspunkte = $rechnungarr['bonuspunkte'];//$this->app->DB->Select("SELECT bonuspunkte FROM rechnung WHERE id='$id' LIMIT 1"); + $soll = $rechnungarr['soll'];//$this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1"); + $projekt = $rechnungarr['projekt']; + $skontosoll = $this->app->DB->Select("SELECT TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll FROM rechnung where id = '".$id."' LIMIT 1"); + $xmlrechnung = $rechnungarr['xmlrechnung']; + $zahlungsweise= $rechnungarr['zahlungsweise']; + $zahlungszieltage= $rechnungarr['zahlungszieltage']; + $zahlungsstatus= $rechnungarr['zahlungsstatus']; + if($zahlungsweise==='rechnung' && $zahlungszieltage<1) + { + $this->app->Tpl->Add('MESSAGE',"
Hinweis: Fälligkeit auf \"sofort\", da Zahlungsziel in Tagen auf 0 Tage gesetzt ist!
"); + } + $status= $rechnungarr['status']; + $schreibschutz= $rechnungarr['schreibschutz']; } + if($status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a') + { + $Brief = new Briefpapier($this->app); + if($Brief->zuArchivieren($id, "rechnung")) + { + if ($xmlrechnung) { + $archiviere = "archivierexml"; + } else { + $archiviere = "archivierepdf"; + } + $this->app->Tpl->Add('MESSAGE',"
Die Rechnung ist noch nicht archiviert! Bitte versenden oder manuell archivieren.
"); + }elseif(!$this->app->DB->Select("SELECT versendet FROM rechnung WHERE id = '$id' LIMIT 1")) + { + $this->app->Tpl->Add('MESSAGE',"
Die Rechnung wurde noch nicht versendet!
"); + } + } + $this->app->erp->RechnungNeuberechnen($id); //BENE + + $this->RechnungMiniDetail('MINIDETAIL',false); //BENE + $this->app->Tpl->Set('ICONMENU',$this->RechnungIconMenu($id)); + $this->app->Tpl->Set('ICONMENU2',$this->RechnungIconMenu($id,2)); $this->app->Tpl->Set('PUNKTE',""); $this->app->Tpl->Set('BONUSPUNKTE',""); @@ -1802,7 +1834,7 @@ class Rechnung extends GenRechnung if($nummer!='') { - $this->app->Tpl->Set('NUMMER',$nummer); + $this->app->Tpl->Set('NUMMER',$nummer); if (($schreibschutz!='1') && $this->app->erp->RechteVorhanden('rechnung','belegnredit')){ $this->app->Tpl->Set('BELEGNRHIDDEN','hidden'); @@ -1911,7 +1943,7 @@ class Rechnung extends GenRechnung $this->app->erp->RemoveReadonly('ist'); - if($this->app->erp->Firmendaten('mahnwesenmitkontoabgleich')!='1' || $this->app->DB->Select("SELECT mahnwesenfestsetzen FROM rechnung WHERE id='$id' LIMIT 1")==1) + if($this->app->erp->Firmendaten('mahnwesenmitkontoabgleich')!='1' || $this->app->DB->Select("SELECT mahnwesenfestsetzen FROM rechnung WHERE id='$id' LIMIT 1")==1) $this->app->erp->RemoveReadonly('ist');*/ //$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1"); @@ -1994,7 +2026,7 @@ class Rechnung extends GenRechnung $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); } - $saldo = $this->app->erp->GetSaldoDokument($id,'rechnung'); + $saldo = $this->app->erp->GetSaldoDokument($id,'rechnung'); if (empty($saldo)) { $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); @@ -2010,7 +2042,7 @@ class Rechnung extends GenRechnung if (!empty($rechnung_schnelleingabe_konto)) { $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); - if ($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && !empty($zahlbetrag)) { + if ($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && !empty($zahlbetrag)) { if ($bezahlt_am == '0000-00-00') { $bezahlt_am = date('Y-m-d'); } @@ -2039,7 +2071,7 @@ class Rechnung extends GenRechnung $this->app->DB->Insert($sql); $kontoauszug = $this->app->DB->GetInsertID(); $this->app->erp->fibu_buchungen_buchen("kontoauszuege",$kontoauszug, "rechnung", $id, -$zahlbetrag, 'EUR', $bezahlt_am, "Rechnung ".$nummer." Schnelleingabe"); - $this->rechnung_zahlstatus_berechnen($id); + $this->rechnung_zahlstatus_berechnen($id); } } else { $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); @@ -2157,7 +2189,7 @@ class Rechnung extends GenRechnung ' überein ' ); } - + parent::RechnungEdit(); if($id > 0 && $this->app->DB->Select( sprintf( @@ -2166,7 +2198,7 @@ class Rechnung extends GenRechnung ) ) ) { - $this->app->erp->PDFArchivieren('rechnung', $id, true); + $this->app->erp->RechnungArchivieren($id); } $this->app->erp->MessageHandlerStandardForm(); @@ -2255,25 +2287,14 @@ class Rechnung extends GenRechnung $invoiceId ) ); - $this->app->erp->PDFArchivieren('rechnung', $invoiceId, true); - if(class_exists('RechnungPDFCustom')) { - $Brief = new RechnungPDFCustom($this->app,$projekt); - } - else { - $Brief = new RechnungPDF($this->app,$projekt); - } - $Brief->GetRechnung($invoiceId); - $tmpfile = $Brief->displayTMP(); - $Brief->ArchiviereDocument(); - @unlink($tmpfile); - + $this->app->erp->RechnungArchivieren($invoiceId); return true; } public function RechnungList() { - $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''"); + $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''"); if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { @@ -2307,17 +2328,20 @@ class Rechnung extends GenRechnung implode(', ', $auswahl) ) ); + foreach($auswahl as $v) { if(!$v) { continue; } + $xmlrechnung = $this->app->DB->Select("SELECT xmlrechnung FROM rechnung WHERE id=$v LIMIT 1"); $checkpapier = $this->app->DB->Select( "SELECT a.rechnung_papier FROM rechnung AS r LEFT JOIN adresse AS a ON r.adresse=a.id WHERE r.id='$v' LIMIT 1" ); - if($checkpapier!=1 && + + if((($checkpapier !=1) || $erechnung) && $this->app->DB->Select( "SELECT r.id FROM rechnung AS r @@ -2326,11 +2350,11 @@ class Rechnung extends GenRechnung LIMIT 1" ) ) { - $this->app->erp->PDFArchivieren('rechnung', $v, true); + $this->app->erp->RechnungArchivieren($v); $this->app->erp->Rechnungsmail($v); } - else if($checkpapier && $drucker) { - $this->app->erp->PDFArchivieren('rechnung', $v, true); + else if($checkpapier && $drucker && !$erechnung) { + $this->app->erp->RechnungArchivieren($v); $projekt = $this->app->DB->Select( "SELECT projekt FROM rechnung WHERE id='$v' LIMIT 1" ); @@ -2384,12 +2408,13 @@ class Rechnung extends GenRechnung $reArr = $this->app->DB->SelectRow( sprintf( "SELECT projekt,belegnr,status,usereditid,adresse, - DATE_SUB(NOW(), INTERVAL 30 SECOND) < useredittimestamp AS `open` + DATE_SUB(NOW(), INTERVAL 30 SECOND) < useredittimestamp AS `open`, + xmlrechnung FROM rechnung WHERE id=%d LIMIT 1", $v ) ); - if($reArr['belegnr'] === '' || ($reArr['open'] && $reArr['status'] === 'freigegeben')) { + if($reArr['belegnr'] === '' || $reArr['xmlrechnung'] || ($reArr['open'] && $reArr['status'] === 'freigegeben')) { continue; } if($reArr['status'] === 'freigegeben') { @@ -2399,7 +2424,7 @@ class Rechnung extends GenRechnung $this->app->erp->RechnungProtokoll($v,'Rechnung gedruckt'); $this->app->DB->Update("UPDATE rechnung SET schreibschutz=1, versendet = 1 WHERE id = '$v' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET status='versendet' WHERE id = '$v' AND status!='storniert' LIMIT 1"); - $this->app->erp->PDFArchivieren('rechnung', $v, true); + $this->app->erp->RechnungArchivieren($v); if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); } @@ -2419,6 +2444,10 @@ class Rechnung extends GenRechnung case 'pdf': $tmpfile = []; foreach($auswahl as $v) { + $xmlrechnung = $this->app->DB->Select("SELECT xmlrechnung FROM rechnung WHERE id=$v LIMIT 1"); + if ($xmlrechnung) { + continue; + } $projekt = $this->app->DB->Select("SELECT projekt FROM rechnung WHERE id=$v LIMIT 1"); if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); @@ -2621,7 +2650,7 @@ class Rechnung extends GenRechnung $zahlungszieltageskonto = 0; $zahlungszielskonto = 0; } - + $this->app->DB->Insert("INSERT INTO rechnung ( id, datum, @@ -2640,8 +2669,7 @@ class Rechnung extends GenRechnung ohne_briefpapier, angelegtam, usereditid, - abweichendebezeichnung, - xmlrechnung + abweichendebezeichnung ) VALUES ( '', @@ -2661,8 +2689,7 @@ class Rechnung extends GenRechnung '".$ohnebriefpapier."', NOW(), '$usereditid', - '$abweichendebezeichnung', - '$xmlrechnung' + '$abweichendebezeichnung' )" ); @@ -2679,8 +2706,8 @@ class Rechnung extends GenRechnung $deliverythresholdvatid = $this->app->DB->real_escape_string($deliverythresholdvatid); $this->app->DB->Update("UPDATE rechnung SET deliverythresholdvatid = '$deliverythresholdvatid' WHERE id = $id LIMIT 1"); } + $this->SetXMLRechnung($id); $this->app->erp->SchnellFreigabe('rechnung',$id); - $this->app->erp->LoadSteuersaetzeWaehrung($id,'rechnung',$projekt); $this->app->erp->EventAPIAdd('EventRechnungCreate',$id,'rechnung','create'); @@ -2991,7 +3018,7 @@ class Rechnung extends GenRechnung foreach ($zahlungen as $zahlung) { $row = array( $zahlung['datum'], - " + " ".ucfirst($zahlung['doc_typ'])." ".$zahlung['doc_info']." ", @@ -3002,7 +3029,7 @@ class Rechnung extends GenRechnung } $salden = $this->app->erp->GetSaldenDokument($id,'rechnung'); - foreach ($salden as $saldo) { + foreach ($salden as $saldo) { $row = array( '', 'Saldo', @@ -3011,7 +3038,7 @@ class Rechnung extends GenRechnung ); $et->AddRow($row); } - return($et->DisplayNew('return',"")); + return($et->DisplayNew('return',"")); } } @@ -3033,8 +3060,8 @@ class Rechnung extends GenRechnung waehrung, datum, zahlungszieltage, - DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as zieldatum, - CURRENT_DATE > DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as faellig, + DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as zieldatum, + CURRENT_DATE > DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as faellig, zahlungszielskonto, TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll, zahlungszieltageskonto, @@ -3049,7 +3076,7 @@ class Rechnung extends GenRechnung $saldo = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung'); if (!empty($saldo)) { if ($saldo['waehrung'] == $offene_rechnung['waehrung']) { - $offene_rechnung['ist'] = $offene_rechnung['soll']+$saldo['betrag']; + $offene_rechnung['ist'] = $offene_rechnung['soll']+$saldo['betrag']; // Check for skonto $skontorelevante_zahlungen = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung','zubuchung',$offene_rechnung['zieldatumskonto'])['betrag']; $zielkonforme_zahlungen = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung','zubuchung',$offene_rechnung['zieldatum'])['betrag']; @@ -3059,7 +3086,7 @@ class Rechnung extends GenRechnung } else if (abs($skontorelevante_zahlungen-$offene_rechnung['skontosoll']) <= 0.01) { // Skonto ok -> book difference $sachkonto = $this->app->erp->Firmendaten('rechnung_skonto_kontorahmen'); - if (!empty($sachkonto)) { + if (!empty($sachkonto)) { $this->app->erp->fibu_buchungen_buchen('rechnung',$offene_rechnung['id'],'kontorahmen',$sachkonto,$offene_rechnung['soll']-$skontorelevante_zahlungen,$offene_rechnung['waehrung'],date('Y-m-d'),''); $offene_rechnung['ist'] = $offene_rechnung['soll']; $saldo['betrag'] = 0; @@ -3076,16 +3103,16 @@ class Rechnung extends GenRechnung SET ist = ".$saldo['betrag']."+soll, zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen') - WHERE id=".$offene_rechnung['id']; + WHERE id=".$offene_rechnung['id']; $this->app->DB->Update($sql); } } else { - $this->app->DB->Update("UPDATE rechnung SET ist = null WHERE id=".$offene_rechnung['id']); + $this->app->DB->Update("UPDATE rechnung SET ist = null WHERE id=".$offene_rechnung['id']); } } $this->app->erp->fibu_rebuild_tables(); - // END RECALCULATE + // END RECALCULATE } }