app=$app; if($intern) { return; } $this->app->ActionHandlerInit($this); $this->app->ActionHandler("list","RechnungList"); $this->app->ActionHandler("create","RechnungCreate"); $this->app->ActionHandler("positionen","RechnungPositionen"); $this->app->ActionHandler("uprechnungposition","UpRechnungPosition"); $this->app->ActionHandler("delrechnungposition","DelRechnungPosition"); $this->app->ActionHandler("copyrechnungposition","CopyRechnungPosition"); $this->app->ActionHandler("downrechnungposition","DownRechnungPosition"); $this->app->ActionHandler("positioneneditpopup","RechnungPositionenEditPopup"); $this->app->ActionHandler("search","RechnungSuche"); $this->app->ActionHandler("mahnwesen","RechnungMahnwesen"); $this->app->ActionHandler("edit","RechnungEdit"); $this->app->ActionHandler("delete","RechnungDelete"); $this->app->ActionHandler("gutschrift","RechnungGutschrift"); $this->app->ActionHandler("copy","RechnungCopy"); $this->app->ActionHandler("zertifikate","RechnungZertifikate"); $this->app->ActionHandler("freigabe","RechnungFreigabe"); $this->app->ActionHandler("abschicken","RechnungAbschicken"); $this->app->ActionHandler("pdf","RechnungPDF"); $this->app->ActionHandler("xml","RechnungSmarty"); $this->app->ActionHandler("json","RechnungJSON"); $this->app->ActionHandler("alternativpdf","RechnungAlternativPDF"); $this->app->ActionHandler("inlinepdf","RechnungInlinePDF"); $this->app->ActionHandler("lastschrift","RechnungLastschrift"); $this->app->ActionHandler("protokoll","RechnungProtokoll"); $this->app->ActionHandler("zahlungseingang","RechnungZahlungseingang"); $this->app->ActionHandler("minidetail","RechnungMiniDetail"); $this->app->ActionHandler("editable","RechnungEditable"); $this->app->ActionHandler("livetabelle","RechnungLiveTabelle"); $this->app->ActionHandler("schreibschutz","RechnungSchreibschutz"); $this->app->ActionHandler("undostorno","RechnungUndostorno"); $this->app->ActionHandler("manuellbezahltmarkiert","RechnungManuellBezahltMarkiert"); $this->app->ActionHandler("manuellbezahltentfernen","RechnungManuellBezahltEntfernen"); $this->app->ActionHandler("zahlungsmahnungswesen","RechnungZahlungMahnungswesen"); $this->app->ActionHandler("deleterabatte","RechnungDeleteRabatte"); $this->app->ActionHandler("updateverband","RechnungUpdateVerband"); $this->app->ActionHandler("lastschriftwdh","RechnungLastschriftWdh"); $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 $this->app->ActionHandler("einkaufspreise","RechnungEinkaufspreise"); $this->app->ActionHandler("steuer","RechnungSteuer"); $this->app->ActionHandler("formeln","RechnungFormeln"); $this->app->DefaultActionHandler("list"); $id = $this->app->Secure->GetGET("id"); $nummer = $this->app->Secure->GetPOST("adresse"); if($nummer==''){ if($id > 0){ $adresse = $this->app->DB->Select("SELECT a.name FROM rechnung b INNER JOIN adresse a ON a.id=b.adresse WHERE b.id='$id' LIMIT 1"); }else{ $adresse = ''; } } else{ $adresse = $nummer; } if($id > 0){ $nummer = $this->app->DB->Select("SELECT b.belegnr FROM rechnung b WHERE b.id='$id' LIMIT 1"); }else{ $nummer = ''; } if($nummer=="" || $nummer==0) $nummer="ohne Nummer"; $this->app->Tpl->Set('UEBERSCHRIFT',"Rechnung: ".$adresse." (".$nummer.")"); $this->app->Tpl->Set('FARBE',"[FARBE4]"); $this->app->erp->Headlines('Rechnung'); $this->app->ActionHandlerListen($app); } public function Install() { $this->app->erp->RegisterHook('supersearch_detail', 'rechnung', 'RechnungSupersearchDetail'); } /** * @param \Xentral\Widgets\SuperSearch\Query\DetailQuery $detailQuery * @param \Xentral\Widgets\SuperSearch\Result\ResultDetail $detailResult * * @return void */ public function RechnungSupersearchDetail($detailQuery, $detailResult) { if ($detailQuery->getGroupKey() !== 'invoices') { return; } $rechnungId = $detailQuery->getItemIdentifier(); $sql = sprintf( "SELECT r.id, r.belegnr, r.datum, r.soll FROM `rechnung` AS `r` WHERE r.id = '%s' LIMIT 1", $this->app->DB->real_escape_string($rechnungId) ); $rechnung = $this->app->DB->SelectRow($sql); if (empty($rechnung)) { return; } $datum = date('d.m.Y', strtotime($rechnung['datum'])); $detailResult->setTitle(sprintf('Rechnung %s', $rechnung['belegnr'])); $detailResult->addButton('Rechnung Details', sprintf('index.php?module=rechnung&action=edit&id=%s', $rechnung['id'])); $detailResult->setMiniDetailUrl(sprintf('index.php?module=rechnung&action=minidetail&id=%s', $rechnung['id'])); } /** @var Application app */ function RechnungFormeln() { } /** * @param string $typ * * @return string */ function Custom($typ) { return ''; } function RechnungSteuer() { } function RechnungEinkaufspreise() { } function RechnungSumme() { } function RechnungAlternativPDF() { $id = (int)$this->app->Secure->GetGET('id'); $abweichendebezeichnung = $this->app->DB->Select("SELECT abweichendebezeichnung FROM rechnung WHERE id='$id' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM rechnung WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET abweichendebezeichnung=1 WHERE id='$id' LIMIT 1"); // Rechnungen if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($id); if($abweichendebezeichnung!="1") $this->app->DB->Update("UPDATE rechnung SET abweichendebezeichnung=0 WHERE id='$id' LIMIT 1"); $Brief->displayDocument(); $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'); $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); } function RechnungUpdateVerband() { $id=$this->app->Secure->GetGET('id'); $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Die Verbandsinformation wurde neu geladen!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } function RechnungLastschriftWdh() { $id=$this->app->Secure->GetGET('id'); $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen',dta_datei=0 WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Die Rechnung kann nochmal eingezogen werden!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } function RechnungDateien() { $id = $this->app->Secure->GetGET('id'); $this->RechnungMenu(); $this->app->Tpl->Add('UEBERSCHRIFT',' (Dateien)'); $this->app->YUI->DateiUpload('PAGE','Rechnung',$id); } function RechnungDeleteRabatte() { $id=$this->app->Secure->GetGET('id'); $this->app->DB->Update("UPDATE rechnung SET rabatt='',rabatt1='',rabatt2='',rabatt3='',rabatt4='',rabatt5='',realrabatt='' WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Die Rabatte wurden entfernt!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } /** * @param int $invoiceId * * @return bool */ public function removeManualPayed($invoiceId) { if(empty($invoiceId) || !$this->app->DB->Select(sprintf('SELECT id FROM rechnung WHERE id = %d', $invoiceId))) { return false; } $this->app->erp->RechnungProtokoll($invoiceId,'Rechnung manuell als bezahlt entfernt'); $this->app->DB->Update( "UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') WHERE id='$invoiceId'" ); return true; } public function RechnungManuellBezahltEntfernen() { $id = $this->app->Secure->GetGET('id'); $this->removeManualPayed($id); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id"); } public function RechnungUndostorno() { $id = $this->app->Secure->GetGET('id'); $this->app->erp->RechnungProtokoll($id,'Rechnung Stornierung rückgängig gemacht'); $this->app->DB->Update("UPDATE rechnung SET status='freigegeben',zahlungsstatus='offen',schreibschutz=0,bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Rechnung Stornierung rückgängig gemacht ".date('d.m.Y')."') WHERE id='$id'"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id"); } /** * @param int $innoiceId * * @return bool */ public function setManualPayed($invoiceId) { if(empty($invoiceId) || !$this->app->DB->Select(sprintf('SELECT id FROM rechnung WHERE id = %d', $invoiceId))) { return false; } $this->app->erp->RechnungProtokoll($invoiceId,'Rechnung manuell als bezahlt markiert'); $this->app->DB->Update( "UPDATE rechnung SET zahlungsstatus='bezahlt',bezahlt_am = now(), mahnwesenfestsetzen='1', mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') WHERE id='$invoiceId'" ); return true; } public function RechnungManuellBezahltMarkiert() { $id = $this->app->Secure->GetGET('id'); $this->setManualPayed($id); $this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id); } /** * @param int $invoiceId */ public function removeWriteProtection($invoiceId) { if($invoiceId <= 0) { return; } $this->app->DB->Update( sprintf( 'UPDATE rechnung SET zuarchivieren=1, schreibschutz = 0 WHERE id=%d', $invoiceId ) ); $this->app->erp->RechnungProtokoll($invoiceId,'Schreibschutz entfernt'); } public function RechnungSchreibschutz() { $id = $this->app->Secure->GetGET('id'); $this->removeWriteProtection($id); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id"); } function RechnungCopy() { $id = $this->app->Secure->GetGET('id'); $newid = $this->CopyRechnung($id); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$newid"); } /** * @param int $invoiceId */ public function addZertificates($invoiceId) { if($invoiceId <= 0) { return; } $addressId = $this->app->DB->Select( sprintf( 'SELECT adresse FROM rechnung WHERE id = %d', $invoiceId ) ); if($addressId <= 0) { return; } $zertificates = $this->app->DB->SelectArr( sprintf( "SELECT ds.datei FROM datei_stichwoerter ds INNER JOIN datei_stichwoerter ds2 ON ds.datei = ds2.datei AND ds2.objekt = 'Artikel' INNER JOIN rechnung_position ap ON ap.artikel = ds2.parameter AND ap.rechnung = %d WHERE ds.objekt = 'Adressen' AND ds.parameter = %d GROUP BY ds.datei", $invoiceId, $addressId ) ); if(empty($zertificates)) { return; } foreach($zertificates as $zertificate) { $this->app->erp->AddDateiStichwort($zertificate['datei'],'Sonstige','Rechnung',$invoiceId); } } function RechnungZertifikate() { $id = $this->app->Secure->GetGET('id'); $this->addZertificates($id); $this->app->Location->execute("index.php?module=rechnung&action=dateien&id=$id"); } public function RechnungIconMenu($id, $prefix = '') { if($id > 0){ $rechnungarr = $this->app->DB->SelectRow( "SELECT status,zahlungsstatus,xmlrechnung,belegnr FROM rechnung WHERE id='$id' LIMIT 1" ); } $status = ''; $zahlungsstatus = ''; if(!empty($rechnungarr)){ $status = $rechnungarr['status'];//$this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1"); $zahlungsstatus = $rechnungarr['zahlungsstatus'];//$this->app->DB->Select("SELECT zahlungsstatus FROM rechnung WHERE id='$id' LIMIT 1"); } $freigabe =""; $storno=""; $bezahlt=""; $weiterfuehren=""; $optionteilstorno = ""; $checkifgsexists = $this->app->DB->Select("SELECT id FROM gutschrift WHERE rechnungid='$id' LIMIT 1"); if($status==="angelegt" || $status=="") { $freigabe = ""; $storno = ""; } else { $weiterfuehren = ""; } $casehook = ''; $optionhook = ''; $this->app->erp->RunHook('rechnungiconmenu_option', 5, $id, $casehook, $optionhook, $status, $prefix); if($this->app->erp->RechteVorhanden("rechnung","undostorno") && !$checkifgsexists) $undostorno = ""; if($this->app->erp->RechteVorhanden("rechnung","manuellbezahltmarkiert") && $zahlungsstatus=="offen") $bezahlt = ""; if($this->app->erp->RechteVorhanden("rechnung","manuellbezahltentfernen") && $zahlungsstatus=="bezahlt") $bezahlt = ""; $zertifikatoption = ''; $zertifikatcase = ''; $optioncustom = $this->Custom('option'); $casecustom = $this->Custom('case'); $hookoption = ''; $hookcase = ''; $this->app->erp->RunHook('Rechnung_Aktion_option',3, $id, $status, $hookoption); $this->app->erp->RunHook('Rechnung_Aktion_case',3, $id, $status, $hookcase); /* //TODO das muss dann später in den Hook $RechnungzuVerbindlichkeitOption = ""; $RechnungzuVerbindlichkeitCase = "case 'rechnungzuverbindlichkeit': if(!confirm('Wirklich Verbindlichkeit anlegen?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=rechnungzuverbindlichkeit&action=create&id=%value%'; break;"; */ if($this->app->erp->RechteVorhanden('zertifikatgenerator','list')) { $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id = '$id' LIMIT 1"); if($adresse) { $zertifikate = $this->app->DB->Select("SELECT ds.datei FROM datei_stichwoerter ds INNER JOIN datei_stichwoerter ds2 ON ds.datei = ds2.datei AND ds2.objekt = 'Artikel' INNER JOIN rechnung_position ap ON ap.artikel = ds2.parameter AND ap.rechnung = '$id' WHERE ds.objekt = 'Adressen' AND ds.parameter = '$adresse' GROUP BY ds.datei LIMIT 1"); if($zertifikate) { $zertifikatoption = ''; $zertifikatcase = "case 'zertifikate': if(!confirm('Zertifikate wirklich laden?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=rechnung&action=zertifikate&id=%value%'; break; "; } } } if($this->app->erp->RechteVorhanden('belegeimport', 'belegcsvexport')) { $casebelegeimport = "case 'belegeimport': window.location.href='index.php?module=belegeimport&action=belegcsvexport&cmd=rechnung&id=%value%'; break;"; $optionbelegeimport = ""; } if($checkifgsexists>0) $extendtext = "HINWEIS: Es existiert bereits eine Gutschrift zu dieser Rechnung! "; else $extendtext=""; $menu ="  Aktion:   "; if (!empty($rechnungarr['belegnr'])) { if ($rechnungarr['xmlrechnung']) { $downloadicon = ""; } else { $downloadicon = ""; } } else { $downloadicon = ''; } $menu .= $downloadicon; $menu .= ""; //$tracking = $this->AuftragTrackingTabelle($id); $menu = str_replace('%value%',$id,$menu); return $menu; } function RechnungLiveTabelle() { $id = $this->app->Secure->GetGET('id'); $table = new EasyTable($this->app); $table->Query( "SELECT ap.bezeichnung as artikel, ap.nummer as Nummer, ap.menge as Menge FROM rechnung_position ap, artikel a WHERE ap.rechnung='$id' AND a.id=ap.artikel" ); $artikel = $table->DisplayNew('return','Menge','noAction'); echo $artikel; $this->app->ExitXentral(); } public function RechnungEditable() { $this->app->YUI->AARLGEditable(); } public function RechnungPDFfromArchiv() { $id = $this->app->Secure->GetGET('id'); $archiv = $this->app->DB->Select("SELECT table_id from pdfarchiv where id = '$id' LIMIT 1"); if($archiv) { $projekt = $this->app->DB->Select("SELECT projekt from rechnung where id = '".(int)$archiv."'"); } if(class_exists('RechnungPDFCustom')) { if($archiv) { $Brief = new RechnungPDFCustom($this->app,$projekt); } } else{ if($archiv) { $Brief = new RechnungPDF($this->app,$projekt); } } if($archiv && $content = $Brief->getArchivByID($id)) { header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="'.$content['belegnr'].'.pdf"'); echo $content['file']; $this->app->ExitXentral(); } header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="Fehler.pdf"'); $this->app->ExitXentral(); } public function RechnungMiniDetail($parsetarget='',$menu=true) { $id = $this->app->Secure->GetGET('id'); if(!$this->app->DB->Select("SELECT deckungsbeitragcalc FROM rechnung WHERE id='$id' LIMIT 1")) { $this->app->erp->BerechneDeckungsbeitrag($id,'rechnung'); } $auftragArr = $this->app->DB->SelectArr("SELECT * FROM rechnung WHERE id='$id' LIMIT 1"); $kundennummer = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id='{$auftragArr[0]['adresse']}' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='{$auftragArr[0]['projekt']}' LIMIT 1"); $kundenname = $this->app->DB->Select("SELECT name FROM adresse WHERE id='{$auftragArr[0]['adresse']}' LIMIT 1"); $this->app->Tpl->Set('DECKUNGSBEITRAG',0); $this->app->Tpl->Set('DBPROZENT',0); $this->app->Tpl->Set('KUNDE',"".$kundennummer." ".$kundenname); if($this->app->erp->RechteVorhanden('projekt','dashboard')){ $this->app->Tpl->Set('PROJEKT', "$projekt"); } else{ $this->app->Tpl->Set('PROJEKT', $projekt); } $this->app->Tpl->Set('ZAHLWEISE',ucfirst($auftragArr[0]['zahlungsweise'])); $this->app->Tpl->Set('STATUS',($auftragArr[0]['status'] === 'storniert' && $auftragArr[0]['teilstorno'] == 1?'teilstorniert':$auftragArr[0]['status'])); $this->app->Tpl->Set('IHREBESTELLNUMMER',$auftragArr[0]['ihrebestellnummer']); $this->app->Tpl->Set('DEBITORENNUMMER', $auftragArr[0]['kundennummer_buchhaltung']); if($auftragArr[0]['mahnwesen']=='') { $auftragArr[0]['mahnwesen']='-'; } $mahnwesen_name = $this->app->DB->SelectArr("SELECT name FROM mahnwesen WHERE id='".$auftragArr[0]['mahnwesen']."' LIMIT 1")[0]['name']; $this->app->Tpl->Set('MAHNWESEN',$mahnwesen_name); if($auftragArr[0]['mahnwesen_datum']=='0000-00-00') { $auftragArr[0]['mahnwesen_datum']='-'; } if(!empty($auftragArr[0]['kundennummer_buchhaltung'])) { $this->app->Tpl->Set('DEBITORENNUMMER', $auftragArr[0]['kundennummer_buchhaltung']); } $internet = $this->app->DB->Select("SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id='$id' AND r.id > 0 LIMIT 1"); $this->app->Tpl->Set('INTERNET',$internet); $this->app->Tpl->Set('MAHNWESENDATUM',$this->app->String->Convert($auftragArr[0]['mahnwesen_datum'],"%1-%2-%3","%3.%2.%1")); $ab_datum = $this->app->String->Convert($auftragArr[0]['datum'],"%1-%2-%3","%3.%2.%1"); if($auftragArr[0]['auftragid']==0) $auftragArr[0]['auftrag']="kein Auftrag"; $auftragArr[0]['auftrag'] = $this->app->DB->Select("SELECT belegnr FROM auftrag WHERE id='".$auftragArr[0]['auftragid']."' LIMIT 1"); if($auftragArr[0]['auftragid'] > 0) { $this->app->Tpl->Set('AUFTRAG',"".$auftragArr[0]['auftrag']."     "); }else{ $this->app->Tpl->Set('AUFTRAG', '-'); } $auftraege = $this->app->DB->SelectArr("(SELECT a.belegnr, a.id FROM sammelrechnung_position s INNER JOIN auftrag_position ap on ap.id = s.auftrag_position_id INNER JOIN auftrag a on a.id = ap.auftrag WHERE s.rechnung = '".$id."' GROUP BY a.id ORDER BY a.belegnr) union (SELECT a.belegnr, a.id FROM sammelrechnung_position s INNER JOIN lieferschein_position lp ON lp.id = s.lieferschein_position_id INNER JOIN auftrag_position ap on ap.id = lp.auftrag_position_id INNER JOIN auftrag a on a.id = ap.auftrag WHERE s.rechnung = '".$id."' GROUP BY a.id ORDER BY a.belegnr) "); if($auftraege) { $this->app->Tpl->Set('AUFTRAG',''); $first = true; foreach($auftraege as $k => $v) { if(!$first)$this->app->Tpl->Add('AUFTRAG','
'); if($v['id'] > 0) { if(empty($v['belegnr'])) { $v['belegnr'] = 'ENTWURF'; } $this->app->Tpl->Add('AUFTRAG',"".$v['belegnr']."     "); } $first = false; } } $gutschrift = $this->app->DB->SelectArr("SELECT CONCAT('',if(g.belegnr='0' OR g.belegnr='','ENTWURF',g.belegnr),'   ') as gutschrift FROM gutschrift g WHERE g.rechnungid='$id'"); if(!empty($gutschrift)) { $cgutschrift = !empty((!empty($gutschrift)?count($gutschrift):0))?:0; for($li=0;$li<$cgutschrift;$li++) { $this->app->Tpl->Add('GUTSCHRIFT',$gutschrift[$li]['gutschrift']); if($li<(!empty($gutschrift)?count($gutschrift):0)){ $this->app->Tpl->Add('GUTSCHRIFT', "
"); } } } else{ $this->app->Tpl->Set('GUTSCHRIFT', "-"); } $returnOrders = (array)$this->app->DB->SelectArr( sprintf( 'SELECT ro.id, ro.belegnr, ro.status FROM `rechnung` AS `i` INNER JOIN `auftrag` AS `o` ON i.auftragid = o.id OR i.id = o.rechnungid LEFT JOIN `lieferschein` AS `dn` ON o.id = dn.auftragid INNER JOIN `retoure` AS `ro` ON o.id = ro.auftragid OR dn.id = ro.lieferscheinid WHERE i.id = %d ORDER BY ro.id', $id ) ); $returnOrderHtml = []; foreach($returnOrders as $returnOrderKey => $returnOrder) { $returnOrderId = $returnOrder['id']; $returnOrderNumber = $returnOrder['belegnr']; if(empty($returnOrderNumber)) { $returnOrderNumber = 'ENTWURF'; } $isReturnOrderCanceled = $returnOrder['status'] === 'storniert'; $returnOrderHtml[] = '' .($isReturnOrderCanceled?'':'').$returnOrderNumber.($isReturnOrderCanceled?'':'') .' Retoure PDF Retoure bearbeiten'; } $this->app->Tpl->Set('RETOURE', implode('
', $returnOrderHtml)); $sammelrechnung = false; if($this->app->DB->Select("SELECT id FROM sammelrechnung_position LIMIT 1"))$sammelrechnung = true; $gruppenrechnung = false; // if($this->app->DB->Select("SELECT id FROM gruppenrechnung_position LIMIT 1"))$gruppenrechnung = true; $rechnungid = false; $this->app->DB->Select("SELECT rechnungid FROM lieferschein LIMIT 1"); if(!$this->app->DB->error())$rechnungid =true; $lieferscheinsql = " SELECT CONCAT('',if(l.status!='angelegt',l.belegnr,'ENTWURF'),'    ') as LS FROM lieferschein l INNER JOIN ( (SELECT id FROM lieferschein WHERE id = '{$auftragArr[0]['lieferschein']}') "; if($rechnungid) { $lieferscheinsql .= " UNION ALL (SELECT id FROM lieferschein WHERE rechnungid = '$id')"; } if($sammelrechnung) { $lieferscheinsql .= "UNION ALL (SELECT l2.id FROM lieferschein l2 INNER JOIN lieferschein_position lp2 ON lp2.lieferschein = l2.id INNER JOIN sammelrechnung_position s ON lp2.id = s.lieferschein_position_id WHERE s.rechnung = '$id' ) UNION ALL (SELECT l3.id FROM lieferschein l3 INNER JOIN lieferschein_position lp3 ON lp3.lieferschein = l3.id INNER JOIN auftrag_position ap3 ON ap3.id = lp3.auftrag_position_id INNER JOIN sammelrechnung_position s3 ON ap3.id = s3.auftrag_position_id WHERE s3.rechnung = '$id' ) "; } if($gruppenrechnung) { $lieferscheinsql .= " UNION ALL (SELECT l4.id FROM lieferschein l4 INNER JOIN lieferschein_position lp4 ON lp4.lieferschein = l4.id INNER JOIN gruppenrechnung_position s4 ON lp4.id = s4.lieferschein_position_id WHERE s4.rechnung = '$id' ) UNION ALL (SELECT l5.id FROM lieferschein l5 INNER JOIN lieferschein_position lp5 ON lp5.lieferschein = l5.id INNER JOIN auftrag_position ap5 ON ap5.id = lp5.auftrag_position_id INNER JOIN gruppenrechnung_position s5 ON ap5.id = s5.auftrag_position_id WHERE s5.rechnung = '$id' ) "; } $lieferscheinsql .= " ) ls ON l.id = ls.id LEFT JOIN projekt p ON l.projekt = p.id WHERE 1 ".$this->app->erp->ProjektRechte('p.id'). " GROUP BY l.id "; $lieferschein = $this->app->DB->SelectArr($lieferscheinsql); if($lieferschein=="") $this->app->Tpl->Set('LIEFERSCHEIN','-'); else{ $first = true; $this->app->Tpl->Set('LIEFERSCHEIN',''); foreach($lieferschein as $ls) { if(!$first)$this->app->Tpl->Add('LIEFERSCHEIN','
'); $this->app->Tpl->Add('LIEFERSCHEIN',$ls['LS']); $first = false; } } if($auftragArr[0]['ust_befreit']==0) $this->app->Tpl->Set('STEUER',"Inland"); else if($auftragArr[0]['ust_befreit']==1) $this->app->Tpl->Set('STEUER',"EU-Lieferung"); else $this->app->Tpl->Set('STEUER',"Export"); $this->app->Tpl->Set('DELIVERYTHRESHOLDVATID',!empty($auftragArr[0]['deliverythresholdvatid'])?$auftragArr[0]['deliverythresholdvatid']:''); if($menu) { $menu = $this->RechnungIconMenu($id); $this->app->Tpl->Set('MENU',$menu); } // ARTIKEL $status = $this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1"); $table = new EasyTable($this->app); $table->Query("SELECT if(CHAR_LENGTH(ap.beschreibung) > 0,CONCAT(ap.bezeichnung,' *'),ap.bezeichnung) as artikel, CONCAT('', ap.nummer,'') as Nummer, ".$this->app->erp->FormatMenge("ap.menge")." as Menge,".$this->app->erp->FormatPreis("ap.preis*(100-ap.rabatt)/100",2)." as Preis FROM rechnung_position ap, artikel a WHERE ap.rechnung='$id' AND a.id=ap.artikel ORDER by ap.sort",0,""); $table->align = array('left','left','right','right'); $artikel = $table->DisplayNew("return","Preis","noAction","false",0,0,false); $this->app->Tpl->Set('ARTIKEL','
'.$artikel.'
'); if($auftragArr[0]['belegnr'] =="0" || $auftragArr[0]['belegnr']=="") $auftragArr[0]['belegnr'] = "ENTWURF"; $this->app->Tpl->Set('BELEGNR',"".$auftragArr[0]['belegnr'].""); $this->app->Tpl->Set('RECHNUNGID',$auftragArr[0]['id']); if($auftragArr[0]['status']=="freigegeben") { $this->app->Tpl->Set('ANGEBOTFARBE',"orange"); $this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot wurde noch nicht als Auftrag weitergeführt!"); } else if($auftragArr[0]['status']=="versendet") { $this->app->Tpl->Set('ANGEBOTFARBE',"red"); $this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot versendet aber noch kein Auftrag vom Kunden erhalten!"); } else if($auftragArr[0]['status']=="beauftragt") { $this->app->Tpl->Set('ANGEBOTFARBE',"green"); $this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot wurde beauftragt und abgeschlossen!"); } else if($auftragArr[0]['status']=="angelegt") { $this->app->Tpl->Set('ANGEBOTFARBE',"grey"); $this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot wird bearbeitet und wurde noch nicht freigegeben und abgesendet!"); } $this->app->Tpl->Set('ZAHLUNGEN',$this->RechnungZahlung(true)); $this->app->Tpl->Set('RECHNUNGADRESSE',$this->Rechnungsadresse($auftragArr[0]['id'])); $tmp = new EasyTable($this->app); $tmp->Query("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit DESC",0,""); $tmp->DisplayNew('PROTOKOLL',"Protokoll","noAction"); /* $query = $this->app->DB->SelectArr("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit"); if($query) { $zeit = 0; foreach($query as $k => $row) { if(strpos($row['grund'], 'Zahlungserinnerung') === 0 || strpos($row['grund'], 'Mahnung') === 0 ) { if(!$zeit)$zeit = $row['zeit']; } } if($zeit) { $tmp2 = new EasyTable($this->app); $tmp2->Query("SELECT concat('app->Conf->WFconf['defaulttheme']}/images/pdf.svg\" border=\"0\">') as PDF, Date(zeit) as Datum, bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' AND zeit >= '".$zeit."' ORDER by zeit DESC"); $tmp2->DisplayNew('MAHNPROTOKOLL',"Protokoll","noAction"); } }*/ if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$auftragArr[0]['projekt']); }else{ $Brief = new RechnungPDF($this->app,$auftragArr[0]['projekt']); } $Dokumentenliste = $Brief->getArchivedFiles($id, 'rechnung'); if($Dokumentenliste) { $tmp3 = new EasyTable($this->app); $tmp3->headings = array('Datum','Belegnr','Bearbeiter','Menü'); foreach($Dokumentenliste as $k => $v) { if(!$v['erstesoriginal']) { $tmpr['datum'] = date('d.m.Y H:i:s',strtotime($v['zeitstempel'])); $tmpr['belegnr'] = str_replace('.pdf','',$v['file']); $tmpr['belegnr'] = substr($tmpr['belegnr'],strrpos($tmpr['belegnr'],'_')+1); if(isset($v['belegnummer']) && $v['belegnummer'])$tmpr['belegnr'] = $v['belegnummer']; $tmpr['bearbeiter'] = $v['bearbeiter']; $tmpr['menu'] = ''; $tmp3->datasets[] = $tmpr; } } $tmp3->DisplayNew('PDFARCHIV','Menü',"noAction"); } if($parsetarget=='') { $this->app->Tpl->Output('rechnung_minidetail.tpl'); $this->app->ExitXentral(); } $this->app->Tpl->Parse($parsetarget,'rechnung_minidetail.tpl'); } /** * @param int $id * * @return string */ public function Rechnungsadresse($id) { $data = $this->app->DB->SelectArr( "SELECT r.*, a.abweichende_rechnungsadresse FROM rechnung AS r INNER JOIN adresse AS a ON r.adresse = a.id WHERE r.id='$id' LIMIT 1" ); foreach($data[0] as $key=>$value) { if($data[0][$key]!='' && $key!=='abweichendelieferadresse' && $key!=='land' && $key!=='plz' && $key!=='lieferland' && $key!=='lieferplz') { $data[0][$key] = $data[0][$key].'
'; } } $rechnungsadresse = $data[0]['name']."".$data[0]['ansprechpartner']."".$data[0]['abteilung']."".$data[0]['unterabteilung']. "".$data[0]['strasse']."".$data[0]['adresszusatz']."".$data[0]['land']."-".$data[0]['plz']." ".$data[0]['ort']; $isAbweichend = false; if($data[0]['abweichende_rechnungsadresse']==1){ $isAbweichend=true; } $abweichendString = ($isAbweichend?' (abweichend)':''); return "
Rechnungsadresse".$abweichendString.":

$rechnungsadresse
"; } function RechnungLastschrift() { $this->app->Tpl->Set('UEBERSCHRIFT','Lastschrift / Sammelüberweisung'); $erzeugen = $this->app->Secure->GetPOST('erzeugen'); $lastschrift= $this->app->Secure->GetPOST('lastschrift'); $kontointern=$this->app->Secure->GetPOST('konto'); $this->app->erp->Headlines('Lastschriften'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','Zur Rechnungsübersicht'); if($erzeugen!='') { //erzeugen $rechnung= $this->app->Secure->GetPOST('rechnung'); $crechnung = !empty($rechnung)?count($rechnung):0; for($i=0;$i<$crechnung;$i++) { //rechnung auf bezahlt markieren + soll auf ist $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='abgebucht' WHERE id='{$rechnung[$i]}' AND firma='".$this->app->User->GetFirma()."' LIMIT 1"); } } // offene Rechnungen $this->app->Tpl->Set('SUB1TABTEXT',"Offene Rechnungen"); $table = new EasyTable($this->app); $table->Query("SELECT CONCAT('') as auswahl, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom, if(r.belegnr!='',r.belegnr,'ohne Nummer') as beleg, r.name, p.abkuerzung as projekt, r.soll as betrag, r.ist as ist, r.zahlungsweise, a.bank_inhaber, a.bank_institut, a.bank_blz, a.bank_konto, r.id FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN zahlungsweisen z ON z.type=r.zahlungsweise LEFT JOIN auftrag a ON a.id=r.auftragid WHERE (r.zahlungsstatus!='bezahlt' AND r.zahlungsstatus!='abgebucht') AND (r.zahlungsweise='lastschrift' OR r.zahlungsweise='einzugsermaechtigung' OR z.verhalten='lastschrift') AND (r.belegnr!='') order by r.datum DESC, r.id DESC"); $table->DisplayNew('SUB1TAB'," "); $summe = $this->app->DB->Select("SELECT SUM(r.soll) FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt WHERE (r.zahlungsstatus!='bezahlt' AND r.zahlungsstatus!='abgebucht') AND (r.zahlungsweise='lastschrift' OR r.zahlungsweise='einzug') AND r.belegnr!='' "); if($summe <=0) { $summe = '0,00'; } $this->app->Tpl->Set('TAB1',"
Gesamt offen: $summe EUR
"); $this->app->YUI->TableSearch('TAB1',"lastschriften"); $this->app->Tpl->Add('TAB1',"
"); $this->app->YUI->TableSearch('TAB2','lastschriftenarchiv'); $this->app->Tpl->Parse('PAGE','rechnung_lastschrift.tpl'); } public function RechnungGutschrift() { $id = $this->app->Secure->GetGET('id'); $status = $this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1"); if($status==='angelegt') { $msg = $this->app->erp->base64_url_encode("
Die Rechnung ist noch nicht freigegeben und kann daher nicht storniert werden!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } $this->app->erp->RechnungProtokoll($id,'Rechnung als Gutschrift weitergeführt'); $newid = $this->app->erp->WeiterfuehrenRechnungZuGutschrift($id); // pruefe obes schon eine gutschrift fuer diese rechnung gibt $anzahlgutschriften = $this->app->DB->Select("SELECT COUNT(id) FROM gutschrift WHERE rechnungid='$id' AND rechnungid!=0 AND rechnungid!=''"); if($anzahlgutschriften>1){ $msg = $this->app->erp->base64_url_encode("
Achtung es gibt bereits eine oder mehrer Gutschriften für diese Rechnung!
"); } $this->app->Location->execute("index.php?module=gutschrift&action=edit&id=$newid&msg=$msg"); } function RechnungFreigabe($id='') { if($id=='') { $id = $this->app->Secure->GetGET('id'); $freigabe= $this->app->Secure->GetGET('freigabe'); $this->app->Tpl->Set('TABTEXT','Freigabe'); $this->app->erp->RechnungNeuberechnen($id); } else { $intern = true; $freigabe=$intern; } $allowedFrm = true; $showDefault = true; $this->app->erp->CheckVertrieb($id,'rechnung'); $this->app->erp->CheckBearbeiter($id,'rechnung'); $doctype = 'rechnung'; if(empty($intern)){ $this->app->erp->RunHook('beleg_freigabe', 4, $doctype, $id, $allowedFrm, $showDefault); } if($allowedFrm && $freigabe==$id) { $belegnr = $this->app->DB->Select("SELECT belegnr FROM rechnung WHERE id='$id' LIMIT 1"); if($belegnr=='') { $this->app->erp->BelegFreigabe('rechnung',$id); $this->rechnung_zahlstatus_berechnen($id); if($intern) { return 1; } $msg = $this->app->erp->base64_url_encode("
Die Rechnung wurde freigegeben und kann jetzt versendet werden!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } if($intern) { return 0; } $msg = $this->app->erp->base64_url_encode("
Die Rechnung wurde bereits freigegeben!
"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } if($showDefault){ $name = $this->app->DB->Select("SELECT a.name FROM rechnung b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id='$id' LIMIT 1"); $summe = $this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM rechnung_position WHERE rechnung='$id' LIMIT 1"); $this->app->Tpl->Set('TAB1', "
Soll die Rechnung an $name im Wert von $summe $waehrung jetzt freigegeben werden?
"); } $this->RechnungMenu(); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } function RechnungAbschicken() { $this->RechnungMenu(); $this->app->erp->DokumentAbschicken(); } public function RechnungDelete() { $id = $this->app->Secure->GetGET('id'); $invoiceArr = $this->app->DB->SelectRow("SELECT belegnr, name FROM rechnung WHERE id='$id' LIMIT 1"); $belegnr = $invoiceArr['belegnr']; $name = $invoiceArr['name']; $msg = ''; if($belegnr=='0' || $belegnr=='') { $this->app->erp->DeleteRechnung($id); $belegnr='ENTWURF'; $msg = $this->app->erp->base64_url_encode("
Die Rechnung \"$belegnr\" von \"$name\" wurde gelöscht!
"); $this->app->Location->execute('index.php?module=rechnung&action=list&msg='.$msg); } $this->RechnungGutschrift(); $this->app->Location->execute('index.php?module=rechnung&action=list&msg='.$msg); } function RechnungProtokoll() { $this->RechnungMenu(); $id = $this->app->Secure->GetGET('id'); $this->app->Tpl->Set('TABTEXT','Protokoll'); $tmp = new EasyTable($this->app); $tmp->Query("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit DESC"); $tmp->DisplayNew('TAB1','Protokoll','noAction'); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } function RechnungMahnPDF() { $id = $this->app->Secure->GetGET('id'); $invoiceArr = $this->app->DB->SelectRow("SELECT belegnr, mahnwesen, projekt FROM rechnung WHERE id='$id' LIMIT 1"); $belegnr = $invoiceArr['belegnr']; $mahnwesen = $invoiceArr['mahnwesen']; $projekt = $invoiceArr['projekt']; if($belegnr!='' && $belegnr!='0') { $Brief = new MahnungPDF($this->app,$projekt); $Brief->GetRechnung($id,$mahnwesen); $Brief->displayDocument(); } $this->app->ExitXentral(); } function RechnungInlinePDF() { $id = $this->app->Secure->GetGET('id'); $invoiceArr = $this->app->DB->SelectRow("SELECT schreibschutz, projekt FROM rechnung WHERE id='$id' LIMIT 1"); $schreibschutz = $invoiceArr['schreibschutz']; if($schreibschutz!='1'){ $this->app->erp->RechnungNeuberechnen($id); } $frame = $this->app->Secure->GetGET('frame'); $projekt = $invoiceArr['projekt']; if($frame=='') { if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($id); $Brief->inlineDocument($schreibschutz); } else { $file = urlencode("../../../../index.php?module=rechnung&action=inlinepdf&id=$id"); echo ""; $this->app->ExitXentral(); } } function RechnungPDF() { $id = $this->app->Secure->GetGET('id'); $this->app->erp->RechnungNeuberechnen($id); $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->RechnungArchivieren($id); } $projekt = $invoiceArr['projekt']; $schreibschutz = $invoiceArr['schreibschutz']; // if(is_numeric($belegnr) && $belegnr!=0) // { if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } if($doppel=='1'){ $Brief->GetRechnung($id, 'doppel'); } else{ $Brief->GetRechnung($id); } $Brief->displayDocument($schreibschutz); $this->RechnungList(); } // Print PHP array for SmartyXML function RechnungJSON() { $this->RechnungSmarty(json: true); } function remove_html_entities_from_array(&$array) { foreach ($array as $key => $item) { if (is_array($item)) { $this->remove_html_entities_from_array($array[$key]); } else { $array[$key] = html_entity_decode($item); } } } function remove_CDATA_fragments_from_array(&$array) { foreach ($array as $key => $item) { if (is_array($item)) { $this->remove_CDATA_fragments_from_array($array[$key]); } else { $item = str_replace('','',$item); $array[$key] = $item; } } } 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'); $rechnung = $this->app->DB->SelectRow(" SELECT * FROM rechnung WHERE id = $id LIMIT 1 "); $result['kopf'] = $rechnung; $result['kopf']['internet_bestellnummer'] = $this->app->DB->Select("SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id='$id' AND r.id > 0 LIMIT 1"); $adresse = $this->app->DB->SelectArr(" SELECT * FROM adresse WHERE id = (SELECT adresse FROM rechnung WHERE id = $id LIMIT 1) "); $result['adresse'] = $adresse[0]; $positionen = $this->app->DB->SelectArr(" SELECT * FROM rechnung_position WHERE rechnung = $id ORDER BY sort ASC "); if (empty($positionen)) { throw new exception("Rechnung enthält keine Positionen!"); } $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; } $result['positionen'] = $positionen; $result['steuern'] = $steuern; $filename = str_replace('-','',$result['kopf']['datum']).'_RE'.$result['kopf']['belegnr']; $this->remove_html_entities_from_array($result); $this->remove_CDATA_fragments_from_array($result); if ($json) { $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)) { $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', $output); $output = $smarty->fetch('string:'.$template); } } 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() { $this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen'); $this->app->erp->Headlines('Rechnungen'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen'); $this->app->Tpl->Set('TABTEXT','Rechnungen'); $name = $this->app->Secure->GetPOST('name'); $plz = $this->app->Secure->GetPOST('plz'); $auftrag = $this->app->Secure->GetPOST('auftrag'); $kundennummer = $this->app->Secure->GetPOST('kundennummer'); $proforma = ''; if($name!='' || $plz!='' || $proforma!='' || $kundennummer!='' || $auftrag!='') { $table = new EasyTable($this->app); $this->app->Tpl->Add('ERGEBNISSE',"

Trefferliste:


"); if($name!="") $table->Query("SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a LEFT JOIN adresse adr ON adr.id = a.adresse WHERE (a.name LIKE '%$name%')"); else if($plz!="") $table->Query("SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a LEFT JOIN adresse adr ON adr.id = a.adresse WHERE (a.plz LIKE '$plz%')"); else if($kundennummer!="") $table->Query("SELECT a.name, a.belegnr as rechnung, adr.kundennummer, a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a LEFT JOIN adresse adr ON adr.id = a.adresse WHERE (adr.kundennummer='$kundennummer')"); else if($auftrag!="") $table->Query("SELECT a.name, a.belegnr as rechnung , adr.kundennummer,a.plz, a.ort, a.strasse, a.status, a.id FROM rechnung a LEFT JOIN adresse adr ON adr.id = a.adresse WHERE (a.belegnr='$auftrag')"); // $table->DisplayNew('ERGEBNISSE',"Lesen"); $table->DisplayNew('ERGEBNISSE'," \"weiterführen "); } else { $this->app->Tpl->Add('ERGEBNISSE',"
Rechnungssuche (bitte entsprechende Suchparameter eingeben)
"); } $this->app->Tpl->Parse('INHALT','rechnungssuche.tpl'); $this->app->Tpl->Set('AKTIV_TAB1','selected'); $this->app->Tpl->Parse('TAB1','rahmen77.tpl'); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } public function RechnungMenu() { $id = $this->app->Secure->GetGET('id'); $invoiceArr = $this->app->DB->SelectRow("SELECT belegnr, name,status FROM rechnung WHERE id='$id' LIMIT 1"); $belegnr = $invoiceArr['belegnr']; $name = $invoiceArr['name']; if($belegnr=='0' || $belegnr=='') { $belegnr ='(Entwurf)'; } $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"$name Rechnung $belegnr"); $this->app->erp->RechnungNeuberechnen($id); $status = $invoiceArr['status']; if ($status==='angelegt') { $this->app->erp->MenuEintrag("index.php?module=rechnung&action=freigabe&id=$id",'Freigabe'); } $this->app->erp->MenuEintrag("index.php?module=rechnung&action=edit&id=$id",'Details'); $anzahldateien = $this->app->erp->AnzahlDateien('Rechnung',$id); if($anzahldateien > 0) { $anzahldateien = ' ('.$anzahldateien.')'; } else { $anzahldateien=''; } $this->app->erp->MenuEintrag("index.php?module=rechnung&action=dateien&id=$id",'Dateien'.$anzahldateien); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','Zurück zur Übersicht'); $this->app->erp->RunMenuHook('rechnung'); } public function RechnungPositionen() { $id = $this->app->Secure->GetGET('id'); $this->app->erp->RechnungNeuberechnen($id); $this->app->YUI->AARLGPositionen(false); } public function CopyRechnungPosition() { $this->app->YUI->SortListEvent('copy','rechnung_position','rechnung'); $this->RechnungPositionen(); } public function DelRechnungPosition() { $this->app->YUI->SortListEvent('del','rechnung_position','rechnung'); $this->RechnungPositionen(); } public function UpRechnungPosition() { $this->app->YUI->SortListEvent('up','rechnung_position','rechnung'); $this->RechnungPositionen(); } public function DownRechnungPosition() { $this->app->YUI->SortListEvent('down','rechnung_position','rechnung'); $this->RechnungPositionen(); } public function RechnungPositionenEditPopup() { $cmd = $this->app->Secure->GetGET('cmd'); if($cmd === 'getopenaccordions') { $accordions = $this->app->Secure->GetPOST('accordions'); $accordions = explode('*|*',$accordions); foreach($accordions as $k => $v) { if(empty($v)) { unset($accordions[$k]); }else{ $accordions[$k] = 'rechnung_accordion'.$v; } } $ret = []; if(!empty($accordions)) { $accordions = $this->app->User->GetParameter($accordions); if(!empty($accordions)) { foreach($accordions as $v) { if(!empty($v['value'])) { $ret['accordions'][] = str_replace('rechnung_accordion','',$v['name']); } } } } echo json_encode($ret); $this->app->ExitXentral(); } if($cmd === 'setaccordion') { $name = $this->app->Secure->GetPOST('name'); $active = $this->app->Secure->GetPOST('active'); $this->app->User->SetParameter('rechnung_accordion'.$name, $active); echo json_encode(array('success'=>1)); $this->app->ExitXentral(); } $id = $this->app->Secure->GetGET('id'); $artikel= $this->app->DB->Select("SELECT artikel FROM angebot_position WHERE id='$id' LIMIT 1"); // nach page inhalt des dialogs ausgeben $filename = 'widgets/widget.rechnung_position_custom.php'; if(is_file($filename)) { include_once $filename; $widget = new WidgetRechnung_positionCustom($this->app,'PAGE'); } else { $widget = new WidgetRechnung_position($this->app,'PAGE'); } $sid= $this->app->DB->Select("SELECT rechnung FROM rechnung_position WHERE id='$id' LIMIT 1"); $widget->form->SpecialActionAfterExecute('close_refresh', "index.php?module=rechnung&action=positionen&id=$sid"); $widget->Edit(); $this->app->BuildNavigation=false; } //
  • Vorschau
  • /** * @param int $invoiceId * @param int $fileKeywordId * * @return int */ public function moveFileUp($invoiceId, $fileKeywordId) { $check = $this->app->DB->SelectRow( sprintf( 'SELECT ds.* FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id WHERE ds.id = %d and d.geloescht <> 1 LIMIT 1', $fileKeywordId ) ); if(empty($check)) { return 0; } $sort = $check['sort']-1; if($sort <= 0) { return 0; } $check2 = $this->app->DB->SelectArr( "SELECT ds.* FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id WHERE ds.objekt like 'rechnung' AND ds.sort = %d AND d.geloescht <> 1 AND ds.parameter = %d LIMIT 1", $sort, $invoiceId ); if(empty($check2)) { return 0; } $this->app->DB->Update( sprintf( 'UPDATE datei_stichwoerter SET sort = sort - 1 WHERE id = %d LIMIT 1', $fileKeywordId ) ); $this->app->DB->Update( sprintf( 'UPDATE datei_stichwoerter SET sort = sort + 1 WHERE id = %d LIMIT 1', $check2['id'] ) ); return $check2['id']; } /** * @param int $invoiceId * @param int $fileKeywordId * * @return int */ public function moveFileDown($invoiceId, $fileKeywordId) { $check = $this->app->DB->SelectRow( sprintf( 'SELECT ds.* FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id WHERE ds.id = %d and d.geloescht <> 1 LIMIT 1', $fileKeywordId ) ); if(empty($check)) { return 0; } $sort = $check['sort']+1; if($sort <= 1) { return 0; } $check2 = $this->app->DB->SelectArr( "SELECT ds.* FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id WHERE ds.objekt like 'rechnung' AND ds.sort = %d AND d.geloescht <> 1 AND ds.parameter = %d LIMIT 1", $sort, $invoiceId ); if(empty($check2)) { return 0; } $this->app->DB->Update( sprintf( 'UPDATE datei_stichwoerter SET sort = sort + 1 WHERE id = %d LIMIT 1', $fileKeywordId ) ); $this->app->DB->Update( sprintf( 'UPDATE datei_stichwoerter SET sort = sort - 1 WHERE id = %d LIMIT 1', $check2['id'] ) ); return $check2['id']; } public function RechnungEdit() { $id = $this->app->Secure->GetGET('id'); // zum aendern vom Vertrieb $sid = $this->app->Secure->GetGET('sid'); $cmd = $this->app->Secure->GetGET('cmd'); if($this->app->Secure->GetPOST('resetextsoll')) { $this->app->DB->Update( sprintf( 'UPDATE rechnung SET extsoll = 0 WHERE id = %d', $id ) ); $this->app->erp->RechnungNeuberechnen($id); } // ALWAYS $this->app->erp->RechnungNeuberechnen($id); if($cmd === 'dadown') { $erg['status'] = 0; $daid = $this->app->Secure->GetPOST('da_id'); $from = $this->moveFileDown($id, $daid); if($from > 0) { $erg['status'] = 1; $erg['from'] =$from; } echo json_encode($erg); $this->app->ExitXentral(); } if($cmd === 'daup') { $erg['status'] = 0; $daid = $this->app->Secure->GetPOST('da_id'); $from = $this->moveFileUp($id, $daid); if($from > 0) { $erg['status'] = 1; $erg['from'] =$from; } echo json_encode($erg); $this->app->ExitXentral(); } if($this->app->erp->VertriebAendern('rechnung',$id,$cmd,$sid)){ return; } if($this->app->erp->InnendienstAendern('rechnung',$id,$cmd,$sid)){ return; } if($this->app->erp->DisableModul('rechnung',$id)) { //$this->app->erp->MenuEintrag("index.php?module=auftrag&action=list","Zurück zur Übersicht"); $this->RechnungMenu(); return; } $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1"); if($adresse <=0) { $this->app->Tpl->Add('JAVASCRIPT','$(document).ready(function() { if(document.getElementById("adresse"))document.getElementById("adresse").focus(); });'); $this->app->Tpl->Set('MESSAGE',"
    Achtung! Dieses Dokument ist mit keiner Kunden-Nr. verlinkt. Bitte geben Sie die Kundennummer an und klicken Sie übernehmen oder Speichern!
    "); } $this->app->YUI->AARLGPositionen(); $this->app->erp->DisableVerband(); $this->app->erp->CheckBearbeiter($id,'rechnung'); $this->app->erp->CheckBuchhaltung($id,'rechnung'); if($id > 0){ $rechnungarr = $this->app->DB->SelectRow("SELECT * FROM rechnung WHERE id='$id' LIMIT 1"); } $nummer = ''; $kundennummer = ''; $adresse = 0; $punkte = null; $bonuspunkte = null; $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']; $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',""); $this->app->Tpl->Set('SOLL',"$soll".""); $this->app->Tpl->Set('SKONTOSOLL',$skontosoll); if($schreibschutz!='1')// && $this->app->erp->RechteVorhanden("rechnung","schreibschutz")) { $this->app->erp->AnsprechpartnerButton($adresse); $this->app->erp->LieferadresseButton($adresse); } if($nummer!='') { $this->app->Tpl->Set('NUMMER',$nummer); if (($schreibschutz!='1') && $this->app->erp->RechteVorhanden('rechnung','belegnredit')){ $this->app->Tpl->Set('BELEGNRHIDDEN','hidden'); } else { $this->app->Tpl->Set('BELEGNREDITHIDDEN','hidden'); } if($this->app->erp->RechteVorhanden('adresse','edit')){ $this->app->Tpl->Set('KUNDE', "   Kd-Nr. " . $kundennummer . ""); } else{ $this->app->Tpl->Set('KUNDE', "   Kd-Nr. " . $kundennummer); } } if ($xmlrechnung) { $this->app->Tpl->Set('PDFVORSCHAUHIDDEN', "hidden"); } $lieferdatum = ''; $rechnungsdatum = ''; $lieferscheinid = 0; if(!empty($rechnungarr)) { $lieferdatum = $rechnungarr['lieferdatum'];//$this->app->DB->Select("SELECT lieferdatum FROM rechnung WHERE id='$id' LIMIT 1"); $rechnungsdatum = $rechnungarr['datum'];//$this->app->DB->Select("SELECT datum FROM rechnung WHERE id='$id' LIMIT 1"); $lieferscheinid = $rechnungarr['lieferschein'];//$this->app->DB->Select("SELECT lieferschein FROM rechnung WHERE id='$id' LIMIT 1"); } $lieferscheiniddatum = ''; if($lieferscheinid > 0){ $lieferscheiniddatum = $this->app->DB->Select("SELECT datum FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1"); } if($lieferdatum=='0000-00-00' && $schreibschutz!='1') { if($lieferscheiniddatum!='0000-00-00'){ $this->app->DB->Update("UPDATE rechnung SET lieferdatum='$lieferscheiniddatum' WHERE id='$id' LIMIT 1"); } else{ $this->app->DB->Update("UPDATE rechnung SET lieferdatum='$rechnungsdatum' WHERE id='$id' LIMIT 1"); } } if($schreibschutz!='1') { $this->app->DB->Update("UPDATE rechnung SET auftrag='' WHERE id='$id' AND auftragid<=0 LIMIT 1"); } $zahlungsweise = $this->app->DB->Select("SELECT zahlungsweise FROM rechnung WHERE id='$id' LIMIT 1"); if($this->app->Secure->GetPOST('zahlungsweise')!='') { $zahlungsweise = $this->app->Secure->GetPOST('zahlungsweise'); } $zahlungsweise = strtolower($zahlungsweise); $zahlungsweisenmodule = $this->app->DB->SelectArr( "SELECT id, modul, verhalten FROM zahlungsweisen WHERE type = '".$this->app->DB->real_escape_string($zahlungsweise)."' AND (projekt = '$projekt' OR projekt = 0) ORDER BY projekt = '$projekt' DESC LIMIT 1" ); $this->app->Tpl->Set('RECHNUNG','none'); $this->app->Tpl->Set('KREDITKARTE','none'); $this->app->Tpl->Set('VORKASSE','none'); $this->app->Tpl->Set('PAYPAL','none'); $this->app->Tpl->Set('EINZUGSERMAECHTIGUNG','none'); if($zahlungsweise==='rechnung' || isset($zahlungsweisenmodule[0]['verhalten']) && $zahlungsweisenmodule[0]['verhalten']==='rechnung') { $this->app->Tpl->Set('RECHNUNG',""); } if($zahlungsweise==='paypal') { $this->app->Tpl->Set('PAYPAL',''); } if($zahlungsweise==='kreditkarte') { $this->app->Tpl->Set('KREDITKARTE',''); } if($zahlungsweise==='einzugsermaechtigung' || $zahlungsweise==='lastschrift') { $this->app->Tpl->Set('EINZUGSERMAECHTIGUNG',''); } if($zahlungsweise==='vorkasse' || $zahlungsweise==='kreditkarte' || $zahlungsweise==='paypal' || $zahlungsweise==='bar') { $this->app->Tpl->Set('VORKASSE',''); } if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz')) { $this->app->Tpl->Set('MESSAGE',"
    Diese Rechnung ist schreibgeschützt und darf daher nicht mehr bearbeitet werden! 
    "); } if($schreibschutz=='1'){ $this->app->erp->CommonReadonly(); } if($schreibschutz=='1' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && $zahlungsstatus=="offen") { $this->app->erp->RemoveReadonly('bezahlt_am'); $this->app->erp->RemoveReadonly('zahlbetrag'); $this->app->erp->RemoveReadonly('zahlungsstatus'); } if($schreibschutz=='1' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen')) { $this->app->erp->RemoveReadonly('mahnwesen_datum'); $this->app->erp->RemoveReadonly('mahnwesen_gesperrt'); $this->app->erp->RemoveReadonly('mahnwesen_internebemerkung'); $this->app->erp->RemoveReadonly('mahnwesenfestsetzen'); $this->app->erp->RemoveReadonly('mahnwesen'); /* 'ist' should not be edited manually $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) $this->app->erp->RemoveReadonly('ist');*/ //$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1"); $this->app->erp->RemoveReadonly('skonto_gegeben'); $this->app->erp->RemoveReadonly('internebemerkung'); $alle_gutschriften = $this->app->DB->SelectArr("SELECT id,belegnr FROM gutschrift WHERE rechnungid='$id' AND rechnungid>0"); $cgutschriften = !empty($alle_gutschriften)?count($alle_gutschriften):0; if($cgutschriften > 1) { $gutschriften = ''; for($agi=0;$agi<$cgutschriften;$agi++) $gutschriften .= "".$alle_gutschriften[$agi]['belegnr']." "; $this->app->Tpl->Add('MESSAGE',"
    Für die angebene Rechnung gibt es schon folgende Gutschriften: $gutschriften
    "); } $this->app->erp->CommonReadonly(); } $speichern = $this->app->Secure->GetPOST('speichern'); if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','belegnredit')) { $nummer_neu = $this->app->Secure->GetPOST('belegnredit'); $nummer_neu = $this->app->DB->real_escape_string($nummer_neu); if(!$this->app->DB->select("SELECT id from rechnung WHERE belegnr ='".$nummer_neu."'")) { $this->app->DB->update("UPDATE rechnung SET belegnr ='".$nummer_neu."' WHERE id = '".$id."'"); } } if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen')) { $mahnwesen_datum = $this->app->Secure->GetPOST('mahnwesen_datum'); $bezahlt_am = $this->app->Secure->GetPOST('bezahlt_am'); $zahlbetrag = $this->app->Secure->GetPOST('zahlbetrag'); $mahnwesen_gesperrt = $this->app->Secure->GetPOST('mahnwesen_gesperrt'); $mahnwesen_internebemerkung = $this->app->Secure->GetPOST('mahnwesen_internebemerkung'); $zahlungsstatus = $this->app->Secure->GetPOST('zahlungsstatus'); $mahnwesenfestsetzen = $this->app->Secure->GetPOST('mahnwesenfestsetzen'); $mahnwesen = $this->app->Secure->GetPOST('mahnwesen'); $internebemerkung = $this->app->Secure->GetPOST('internebemerkung'); $ist = str_replace(',','.',$this->app->Secure->GetPOST('ist')); $skonto_gegeben = str_replace(',','.',$this->app->Secure->GetPOST('skonto_gegeben')); if($mahnwesen_gesperrt!='1') { $mahnwesen_gesperrt='0'; } if($mahnwesenfestsetzen!='1') { $mahnwesenfestsetzen='0'; } $mahnwesen_datum = $this->app->String->Convert($mahnwesen_datum,'%1.%2.%3','%3-%2-%1'); $bezahlt_am = $this->app->String->Convert($bezahlt_am,'%1.%2.%3','%3-%2-%1'); if($bezahlt_am=='--')$bezahlt_am='0000-00-00'; $alte_mahnstufe = $this->app->DB->Select("SELECT mahnwesen FROM rechnung WHERE id='$id' LIMIT 1"); if($alte_mahnstufe!=$mahnwesen) $versendet=0; /* if($mahnwesenfestsetzen=='1') {*/ $this->app->DB->Update(" UPDATE rechnung SET mahnwesen_internebemerkung='$mahnwesen_internebemerkung', zahlungsstatus='$zahlungsstatus', versendet_mahnwesen='$versendet', mahnwesen_gesperrt='$mahnwesen_gesperrt', mahnwesen_datum='$mahnwesen_datum', mahnwesenfestsetzen='$mahnwesenfestsetzen', internebemerkung='$internebemerkung' WHERE id='$id' LIMIT 1"); /* } else { $this->app->DB->Update("UPDATE rechnung SET mahnwesen='$mahnwesen', mahnwesenfestsetzen='$mahnwesenfestsetzen', mahnwesen_internebemerkung='$mahnwesen_internebemerkung', mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum' WHERE id='$id' LIMIT 1"); }*/ } if ($zahlungsstatus == 'bezahlt') { $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); } $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'); } else { $ist = $this->app->erp->EUR($saldo['betrag']); $this->app->Tpl->Set('ISTDB',$ist); if ($ist > $soll) { $this->app->Tpl->addMessage('error','Rechnung ist überzahlt!'); } } $rechnung_schnelleingabe_konto = $this->app->erp->Firmendaten('rechnung_schnelleingabe_konto'); if (!empty($rechnung_schnelleingabe_konto)) { $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); if ($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && !empty($zahlbetrag)) { if ($bezahlt_am == '0000-00-00') { $bezahlt_am = date('Y-m-d'); } $sql = " INSERT INTO kontoauszuege ( konto, buchung, importdatum, buchungstext, soll, waehrung, bearbeiter ) VALUES ( $rechnung_schnelleingabe_konto, '$bezahlt_am', '".date("Y-m-d")."', 'Rechnung ".$nummer." Schnelleingabe', $zahlbetrag, 'EUR', '".$this->app->User->GetName()."' ) "; $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); } } else { $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); } if($status=='') $this->app->DB->Update("UPDATE rechnung SET status='angelegt' WHERE id='$id' LIMIT 1"); if($schreibschutz != '1'){ if($this->app->erp->Firmendaten('schnellanlegen') == '1'){ $this->app->Tpl->Set('BUTTON_UEBERNEHMEN', ' '); }else{ $this->app->Tpl->Set('BUTTON_UEBERNEHMEN', ' '); } } // immer wenn sich der lieferant genändert hat standartwerte setzen if($this->app->Secure->GetPOST('adresse')!='') { $tmp = $this->app->Secure->GetPOST('adresse'); $kundennummer = $this->app->erp->FirstTillSpace($tmp); //$name = substr($tmp,6); $filter_projekt = $this->app->DB->Select("SELECT projekt FROM rechnung WHERE id = '$id' LIMIT 1"); //if($filter_projekt)$filter_projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id= '$filter_projekt' and eigenernummernkreis = 1 LIMIT 1"); $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' AND geloescht=0 ".$this->app->erp->ProjektRechte("projekt", true, 'vertrieb')." ORDER by ".($filter_projekt?" projekt = '$filter_projekt' DESC, ":"")." projekt LIMIT 1"); $uebernehmen =$this->app->Secure->GetPOST('uebernehmen'); if($uebernehmen=='1' && $schreibschutz != '1') // nur neuladen bei tastendruck auf uebernehmen // FRAGEN!!!! { $this->LoadRechnungStandardwerte($id,$adresse); $this->app->erp->RechnungNeuberechnen($id); $this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id); } } $rechnungarr = null; if($id > 0) { $rechnungarr = $this->app->DB->SelectRow("SELECT * FROM rechnung WHERE id='$id' LIMIT 1"); } $land = ''; $ustid = ''; $ust_befreit = null; if(!empty($rechnungarr)) { $land = $rechnungarr['land'];//$this->app->DB->Select("SELECT land FROM rechnung WHERE id='$id' LIMIT 1"); $ustid = $rechnungarr['ustid'];//$this->app->DB->Select("SELECT ustid FROM rechnung WHERE id='$id' LIMIT 1"); $ust_befreit = $rechnungarr['ust_befreit'];//$this->app->DB->Select("SELECT ust_befreit FROM rechnung WHERE id='$id' LIMIT 1"); } if($ust_befreit) { $this->app->Tpl->Set('USTBEFREIT',"
    EU-Lieferung
    (bereits geprüft!)
    "); } else if($land!=='DE' && $ustid!='') { $this->app->Tpl->Set('USTBEFREIT',"
    EU-Lieferung
    (Fehler bei Prüfung!)
    "); } // easy table mit arbeitspaketen YUI als template $table = new EasyTable($this->app); $table->Query("SELECT bezeichnung as artikel, nummer as Nummer, menge, vpe as VPE, FORMAT(preis,4) as preis FROM rechnung_position WHERE rechnung='$id'",0,""); $table->DisplayNew('POSITIONEN',"Preis","noAction"); $summe = $this->app->DB->Select("SELECT FORMAT(SUM(menge*preis),2) FROM rechnung_position WHERE rechnung='$id'"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM rechnung_position WHERE rechnung='$id' LIMIT 1"); $summebrutto = $this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1"); $ust_befreit_check = $this->app->DB->Select("SELECT ust_befreit FROM rechnung WHERE id='$id' LIMIT 1"); $tmp = 'Kunde zahlt mit UST'; if($ust_befreit_check==1) { $tmp = 'Kunde ist UST befreit'; } if($summe > 0){ $this->app->Tpl->Add('POSITIONEN', "
    Zu zahlen: $summe (netto) $summebrutto (brutto) $waehrung ($tmp)  "); } $status= $this->app->DB->Select("SELECT status FROM rechnung WHERE id='$id' LIMIT 1"); $this->app->Tpl->Set('STATUS',""); $internet = $this->app->DB->Select("SELECT a.internet FROM rechnung r LEFT JOIN auftrag a ON a.id=r.auftragid WHERE r.id='$id' AND r.id > 0 LIMIT 1"); if($internet!='') { $this->app->Tpl->Set('INTERNET',"Internet:"); } $this->app->Tpl->Set('AKTIV_TAB1',"selected"); $sollExtSoll = $this->app->DB->SelectRow( sprintf( "SELECT extsoll, soll FROM rechnung WHERE id = %d AND schreibschutz = 0 AND status = 'versendet' AND extsoll <> 0", $id ) ); if(!empty($sollExtSoll['extsoll']) && $sollExtSoll['extsoll'] == $sollExtSoll['soll']) { $sollExtSoll['soll'] = $this->app->DB->Select( sprintf( 'SELECT ROUND(SUM(`umsatz_brutto_gesamt`),2) FROM `rechnung_position` WHERE `rechnung` = %d ', $id ) ); } if(!empty($sollExtSoll) && $sollExtSoll['soll'] != $sollExtSoll['extsoll']) { $extsoll = $sollExtSoll['extsoll']; $this->app->Tpl->Add( 'MESSAGE','
    Der Sollbetrag stimmt nicht mehr mit ursprünglich festgelegten Betrag '. number_format($extsoll,2,',','.'). ' überein
    ' ); } parent::RechnungEdit(); if($id > 0 && $this->app->DB->Select( sprintf( 'SELECT id FROM rechnung WHERE schreibschutz =1 AND zuarchivieren = 1 AND id = %d', $id ) ) ) { $this->app->erp->RechnungArchivieren($id); } $this->app->erp->MessageHandlerStandardForm(); if($this->app->Secure->GetPOST('weiter')!='') { $this->app->Location->execute('index.php?module=rechnung&action=positionen&id='.$id); } $this->RechnungMenu(); } function RechnungCreate() { $anlegen = $this->app->Secure->GetGET('anlegen'); if($this->app->erp->Firmendaten('schnellanlegen')=='1' && $anlegen!='1') { $this->app->Location->execute('index.php?module=rechnung&action=create&anlegen=1'); } if($anlegen != '') { $id = $this->CreateRechnung(); $this->app->Location->execute('index.php?module=rechnung&action=edit&id='.$id); } $this->app->Tpl->Add('KURZUEBERSCHRIFT','Rechnung'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','Zurück zur Übersicht'); $this->app->Tpl->Set('MESSAGE',"
    Möchten Sie eine Rechnung jetzt anlegen?  

    "); $this->app->Tpl->Set('TAB1',"

    Rechnungen in Bearbeitung

    Offene Aufträge, die durch andere Mitarbeiter in Bearbeitung sind.

    [AUFTRAGE]"); $this->app->Tpl->Set('AKTIV_TAB1','selected'); $this->app->YUI->TableSearch('AUFTRAGE','rechnungeninbearbeitung'); $this->app->Tpl->Set('TABTEXT','Rechnung anlegen'); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } /** * @param int $invoiceId * * @return bool */ public function markInvoiceAsClosed($invoiceId) { $reArr = $this->app->DB->SelectRow( sprintf( "SELECT projekt,belegnr,status,usereditid, DATE_SUB(NOW(), INTERVAL 30 SECOND) < useredittimestamp AS `open` FROM rechnung WHERE id=%d LIMIT 1", $invoiceId ) ); if($reArr['belegnr'] === '') { return false; } if($reArr['status'] === 'freigegeben') { $this->app->erp->RechnungNeuberechnen($invoiceId); } $projekt = $reArr['projekt']; $this->app->erp->RechnungProtokoll($invoiceId,'Rechnung versendet'); $this->app->erp->closeInvoice($invoiceId); $this->app->DB->Update( sprintf( 'UPDATE rechnung SET schreibschutz=1, versendet = 1 WHERE id = %d LIMIT 1', $invoiceId ) ); $this->app->DB->Update( sprintf( "UPDATE rechnung SET status='versendet' WHERE id = %d AND status!='storniert' LIMIT 1", $invoiceId ) ); $this->app->erp->RechnungArchivieren($invoiceId); return true; } public function RechnungList() { $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''"); if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { $drucker = $this->app->Secure->GetPOST('seldrucker'); $aktion = $this->app->Secure->GetPOST('sel_aktion'); $auswahl = $this->app->Secure->GetPOST('auswahl'); if($drucker > 0) { $this->app->erp->BriefpapierHintergrundDisable($drucker); } if(is_array($auswahl)) { foreach($auswahl as $auswahlKey => $auswahlValue) { if((int)$auswahlValue > 0) { $auswahl[$auswahlKey] = (int)$auswahlValue; } else { unset($auswahl[$auswahlKey]); } } switch($aktion) { case 'bezahlt': $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='bezahlt', bezahlt_am = now(), mahnwesenfestsetzen='1',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')'); break; case 'offen': $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')'); break; case 'mail': $auswahl = $this->app->DB->SelectFirstCols( sprintf( "SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s)", 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) || $erechnung) && $this->app->DB->Select( "SELECT r.id FROM rechnung AS r INNER JOIN adresse AS a ON r.adresse = a.id WHERE r.id = '$v' AND r.email <> '' OR a.email <> '' LIMIT 1" ) ) { $this->app->erp->RechnungArchivieren($v); $this->app->erp->Rechnungsmail($v); } else if($checkpapier && $drucker && !$erechnung) { $this->app->erp->RechnungArchivieren($v); $projekt = $this->app->DB->Select( "SELECT projekt FROM rechnung WHERE id='$v' LIMIT 1" ); if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); } else { $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($v); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(); $this->app->printer->Drucken($drucker,$tmpfile); unlink($tmpfile); } } break; case 'versendet': $auswahl = $this->app->DB->SelectFirstCols( sprintf( "SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s)", implode(', ', $auswahl) ) ); foreach($auswahl as $v) { if($v) { $reArr = $this->app->DB->SelectRow( sprintf( "SELECT projekt,belegnr,status,usereditid, DATE_SUB(NOW(), INTERVAL 30 SECOND) < useredittimestamp AS `open` FROM rechnung WHERE id=%d LIMIT 1", $v ) ); if($reArr['belegnr'] === '' || ($reArr['open'] && $reArr['status'] === 'freigegeben')) { continue; } $this->markInvoiceAsClosed($v); } } break; case 'drucken': if($drucker) { $auswahl = $this->app->DB->SelectFirstCols( sprintf( "SELECT id FROM rechnung WHERE belegnr <> '' AND id IN (%s)", implode(', ', $auswahl) ) ); foreach($auswahl as $v) { $reArr = $this->app->DB->SelectRow( sprintf( "SELECT projekt,belegnr,status,usereditid,adresse, DATE_SUB(NOW(), INTERVAL 30 SECOND) < useredittimestamp AS `open`, xmlrechnung FROM rechnung WHERE id=%d LIMIT 1", $v ) ); if($reArr['belegnr'] === '' || $reArr['xmlrechnung'] || ($reArr['open'] && $reArr['status'] === 'freigegeben')) { continue; } if($reArr['status'] === 'freigegeben') { $this->app->erp->RechnungNeuberechnen($v); } $projekt = $reArr['projekt'];//$this->app->DB->Select("SELECT projekt FROM rechnung WHERE id='$v' LIMIT 1"); $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->RechnungArchivieren($v); if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); } else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($v); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(); $this->app->printer->Drucken($drucker,$tmpfile); $doctype = 'rechnung'; $this->app->erp->RunHook('dokumentsend_ende', 5, $doctype, $v, $projekt, $reArr['adresse'], $aktion); @unlink($tmpfile); } } break; 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); } else { $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($v); $tmpfile[] = $Brief->displayTMP(); } if((!empty($tmpfile)?count($tmpfile):0) > 0) { try { /** @var PdfMerger $pdfMerger */ $pdfMerger = $this->app->Container->get('PdfMerger'); $mergeOutputPath = realpath($this->app->erp->GetTMP()) . '/' . uniqid('sammelpdf_', true) . '.pdf'; $pdfMerger->merge($tmpfile, $mergeOutputPath); foreach($tmpfile as $key=>$value) { unlink($value); } header('Content-type:application/pdf'); header('Content-Disposition: attachment;filename='.md5(microtime(true)).'.pdf'); readfile($mergeOutputPath); $this->app->ExitXentral(); } catch (PdfComponentExceptionInterface $exception) { echo 'Fehler beim Generieren der Sammelpdf: ' . htmlspecialchars($exception->getMessage()); $this->app->ExitXentral(); } } break; } } } // ende ausfuehren if($this->app->Secure->GetPOST('zahlungsstatus_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { $this->rechnung_zahlstatus_berechnen(); } $this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen'); $backurl = $this->app->Secure->GetGET('backurl'); $backurl = $this->app->erp->base64_url_decode($backurl); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','Übersicht'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen'); if(strlen($backurl)>5){ $this->app->erp->MenuEintrag("$backurl", 'Zurück'); } //else // $this->app->erp->MenuEintrag("index.php","Zurück zur Übersicht"); $zahlungsweisen = $this->app->DB->SelectArr(' SELECT zahlungsweise FROM rechnung GROUP BY zahlungsweise '); $zahlungsweiseStr = ''; if ($zahlungsweisen) { foreach ($zahlungsweisen as $zahlungsweise) { if (empty($zahlungsweise['zahlungsweise'])) { continue; } $zahlungsweiseStr .= ''; } } $status = $this->app->DB->SelectArr(' SELECT status FROM rechnung GROUP BY status '); $statusStr = ''; if ($status) { foreach ($status as $statusE) { if (empty($statusE['status'])) { continue; } $statusStr .= ''; } } $versandarten = $this->app->DB->SelectArr(' SELECT versandart FROM rechnung GROUP BY versandart '); $versandartenStr = ''; if ($versandarten) { foreach ($versandarten as $versandart) { if (empty($versandart['versandart'])) { continue; } $versandartenStr .= ''; } } $laender = $this->app->erp->GetSelectLaenderliste(); $laenderStr = ''; foreach ($laender as $landKey => $land) { $laenderStr .= ''; } $this->app->Tpl->Add('ZAHLUNGSWEISEN',$zahlungsweiseStr); $this->app->Tpl->Add('STATUS',$statusStr); $this->app->Tpl->Add('VERSANDARTEN',$versandartenStr); $this->app->Tpl->Add('LAENDER',$laenderStr); $this->app->YUI->DatePicker('datumVon'); $this->app->YUI->DatePicker('datumBis'); $this->app->YUI->AutoComplete("projekt", "projektname", 1); $this->app->YUI->AutoComplete("kundennummer", "kunde", 1); $this->app->YUI->AutoComplete("rechnungsnummer", "rechnung", 1); $this->app->YUI->AutoComplete("artikel", "artikelnummer", 1); $this->app->Tpl->Parse('TAB1',"rechnung_table_filter.tpl"); $this->app->Tpl->Set('AKTIV_TAB1',"selected"); $this->app->Tpl->Set('INHALT',''); $this->app->YUI->TableSearch('TAB2','rechnungenoffene'); $this->app->YUI->TableSearch('TAB1','rechnungen'); $this->app->YUI->TableSearch('TAB3','rechnungeninbearbeitung'); if($this->app->erp->RechteVorhanden('rechnung', 'manuellbezahltmarkiert')){ $this->app->Tpl->Set('ALSBEZAHLTMARKIEREN', ''); } $this->app->Tpl->Set('SELDRUCKER', $this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker'))); $this->app->Tpl->Parse('PAGE','rechnunguebersicht.tpl'); } public function GetXMLSmartyTemplate($id) { $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id = '".$id."'"); $rechnung_smarty_template = $this->app->DB->Select("SELECT rechnung_smarty_template FROM adresse WHERE id = '".$adresse."'"); if (!empty($rechnung_smarty_template)) { return($rechnung_smarty_template); } else { $sql = "SELECT id, rechnung_smarty_template FROM gruppen WHERE rechnung_smarty_template <> '' and aktiv"; $gruppen = $this->app->DB->SelectArr($sql); foreach ($gruppen as $gruppe) { if ($this->app->erp->IsAdresseInGruppe($adresse,$gruppe['id'])) { return($gruppe['rechnung_smarty_template']); } } } return(null); } // Decide if XML Smarty invoice according to address and group public function SetXMLRechnung($id) { $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id = '".$id."' LIMIT 1"); if (!empty($adresse)) { // Check XML Smarty template if (!empty($this->GetXMLSmartyTemplate($id))) { $this->app->DB->Update("UPDATE rechnung SET xmlrechnung = 1 WHERE id = '".$id."' AND schreibschutz <> 1"); } } } /** * @param string|int $adresse * * @return int */ public function CreateRechnung($adresse='') { $projekt = $this->app->erp->GetCreateProjekt($adresse); $belegmax = ''; $ohnebriefpapier = $this->app->erp->Firmendaten('rechnung_ohnebriefpapier'); $abweichendebezeichnung = $this->app->erp->Firmendaten('rechnungersatz_standard'); $usereditid = 0; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User,'GetID')){ $usereditid = $this->app->User->GetID(); } if($this->app->erp->StandardZahlungsweise($projekt)==='rechnung') { $zahlungszieltage = $this->app->erp->ZahlungsZielTage($projekt); $zahlungszieltageskonto = $this->app->erp->ZahlungsZielTageSkonto($projekt); $zahlungszielskonto = $this->app->erp->ZahlungsZielSkonto($projekt); } else { $zahlungszieltage = 0; $zahlungszieltageskonto = 0; $zahlungszielskonto = 0; } $this->app->DB->Insert("INSERT INTO rechnung ( id, datum, bearbeiter, firma, belegnr, zahlungsweise, zahlungszieltage, zahlungszieltageskonto, zahlungszielskonto, lieferdatum, status, projekt, adresse, auftragid, ohne_briefpapier, angelegtam, usereditid, abweichendebezeichnung ) VALUES ( '', NOW(), '', '".$this->app->User->GetFirma()."', '$belegmax', '".$this->app->erp->StandardZahlungsweise($projekt)."', '".$zahlungszieltage."', '".$zahlungszieltageskonto."', '".$zahlungszielskonto."', NOW(), 'angelegt', '$projekt', '$adresse', 0, '".$ohnebriefpapier."', NOW(), '$usereditid', '$abweichendebezeichnung' )" ); $id = $this->app->DB->GetInsertID(); $this->app->erp->CheckVertrieb($id,'rechnung'); $this->app->erp->CheckBearbeiter($id,'rechnung'); $this->app->erp->RechnungProtokoll($id,'Rechnung angelegt'); $type='rechnung'; $this->app->erp->ObjektProtokoll($type,$id,$type.'_create',ucfirst($type).' angelegt'); $deliverythresholdvatid = $this->app->erp->getDeliverythresholdvatid($projekt); if($id > 0 && !empty($deliverythresholdvatid)){ $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'); return $id; } /** * @param int $id * * @return int */ public function CopyRechnung($id) { $this->app->DB->Insert("INSERT INTO rechnung (angelegtam) VALUES (NOW())"); $newid = $this->app->DB->GetInsertID(); $arr = $this->app->DB->SelectRow("SELECT NOW() as datum,projekt,bodyzusatz,freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,bearbeiter,zahlungszieltage,zahlungszieltageskonto,zahlungsweise,ohne_artikeltext,ohne_briefpapier,'angelegt' as status, zahlungszielskonto,ust_befreit,rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe,typ, firma,sprache,anzeigesteuer,waehrung,kurs,kostenstelle FROM rechnung WHERE id='$id' LIMIT 1"); $arr['kundennummer'] = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id = '".$arr['adresse']."' LIMIT 1"); $arr['bundesstaat'] = $this->app->DB->Select("SELECT bundesstaat FROM rechnung WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('rechnung',$newid,'id',$arr, true); $pos = $this->app->DB->SelectArr("SELECT * FROM rechnung_position WHERE rechnung='$id'"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++){ $this->app->DB->Insert("INSERT INTO rechnung_position (rechnung) VALUES($newid)"); $newposid = $this->app->DB->GetInsertID(); $pos[$i]['rechnung']=$newid; $this->app->DB->UpdateArr('rechnung_position',$newposid,'id',$pos[$i], true); if($pos[$i]['steuersatz'] === null){ $this->app->DB->Update("UPDATE rechnung_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->app->erp->CheckFreifelder('rechnung',$newid); $this->app->erp->CopyBelegZwischenpositionen('rechnung',$id,'rechnung',$newid); $this->app->erp->LoadSteuersaetzeWaehrung($newid,'rechnung'); $this->app->erp->SchnellFreigabe('rechnung',$newid); return $newid; } /** * @param int $id * @param int $adresse */ public function LoadRechnungStandardwerte($id,$adresse) { if($id==0 || $id=='' || $adresse=='' || $adresse=='0'){ return; } $this->app->erp->StartChangeLog('rechnung', $id); // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT *,vertrieb as vertriebid,'' as bearbeiter,innendienst as bearbeiterid FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($arr[0]['bearbeiterid'] <=0 ){ $arr[0]['bearbeiterid'] = $this->app->User->GetAdresse(); } $arr[0]['gruppe'] = $this->app->erp->GetVerband($adresse); $rolle_projekt = $this->app->DB->Select("SELECT parameter FROM adresse_rolle WHERE adresse='$adresse' AND subjekt='Kunde' AND objekt='Projekt' AND (bis ='0000-00-00' OR bis <= NOW()) LIMIT 1"); if($arr[0]['abweichende_rechnungsadresse']=='1') { $arr = $this->app->DB->SelectArr("SELECT projekt, rechnung_name as name, rechnung_abteilung as abteilung, rechnung_ansprechpartner as ansprechpartner, rechnung_unterabteilung as unterabteilung, rechnung_strasse as strasse, rechnung_adresszusatz as adresszusatz, rechnung_plz as plz, rechnung_ort as ort, rechnung_land as land, rechnung_telefon as telefon, rechnung_titel as titel, rechnung_email as email, rechnung_telefax as telefax, rechnung_vorname as vorname, rechnung_typ as typ, rechnung_bundesstaat as bundesstaat, rechnung_gln as gln, ustid, kundennummer, lieferbedingung, vertrieb as vertriebid, innendienst as bearbeiterid, '' as bearbeiter, rechnung_anschreiben as anschreiben FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $arr[0]['gruppe'] = $this->app->erp->GetVerband($adresse); } $field = array('gln','anschreiben','name','abteilung','typ','unterabteilung','strasse','adresszusatz','plz','ort','land','ustid','email','telefon','telefax','kundennummer','projekt','ust_befreit','gruppe','vertriebid','bearbeiter','ansprechpartner','bearbeiterid','titel','lieferbedingung','bundesstaat'); if($rolle_projekt > 0) { $arr[0]['projekt'] = $rolle_projekt; } foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!=""&&0) { $uparr[$value] = str_replace("'", ''',$this->app->Secure->POST[$value]); } else { $this->app->Secure->POST[$value] = str_replace("'", ''',$arr[0][$value]); $uparr[$value] = str_replace("'", ''',$arr[0][$value]); } } $uparr['adresse'] = $adresse; $uparr['ust_befreit'] = $this->app->erp->AdresseUSTCheck($adresse); $uparr['zahlungsstatusstatus']='offen'; if($this->app->erp->Firmendaten('rechnung_ohnebriefpapier')=='1'){ $uparr['ohne_briefpapier'] = '1'; } if($this->app->erp->Firmendaten('rechnungersatz_standard')=='1'){ $uparr['abweichendebezeichnung']=1; } $this->app->DB->UpdateArr('rechnung',$id,'id',$uparr,true); $uparr=null; //liefernantenvorlage $arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); if($arr[0]['abweichende_rechnungsadresse']=='1') { $arr = $this->app->DB->SelectArr("SELECT projekt, rechnung_name as name, rechnung_abteilung as abteilung, rechnung_unterabteilung as unterabteilung, rechnung_strasse as strasse, rechnung_adresszusatz as adresszusatz, rechnung_plz as plz, rechnung_ort as ort, rechnung_land as land, rechnung_telefon as telefon, rechnung_telefax as telefax, rechnung_vorname as vorname, rechnung_typ as typ, zahlungsweise,zahlungszieltage,zahlungszieltageskonto,zahlungszielskonto,versandart, rechnung_anschreiben as anschreiben FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); } $field = array('zahlungsweise','zahlungszieltage','zahlungszieltageskonto','zahlungszielskonto','versandart'); $this->app->erp->LoadZahlungsweise($adresse,$arr); // falls von Benutzer projekt ueberladen werden soll $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $uparr['projekt'] = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $arr[0]['projekt'] = $uparr['projekt']; $this->app->Secure->POST['projekt']=$this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$arr[0]['projekt']."' AND id > 0 LIMIT 1"); } if(isset($arr[0]['usereditid'])){ unset($arr[0]['usereditid']); } $this->app->Secure->POST['zahlungsweise'] = strtolower($arr[0]['zahlungsweise']); $this->app->Secure->POST['zahlungszieltage'] = strtolower($arr[0]['zahlungszieltage']); $this->app->Secure->POST['zahlungszieltageskonto'] = strtolower($arr[0]['zahlungszieltageskonto']); $this->app->Secure->POST['zahlungszielskonto'] = strtolower($arr[0]['zahlungszielskonto']); $this->app->Secure->POST['versandart'] = strtolower($arr[0]['versandart']); /* foreach($field as $key=>$value) { $uparr[$value] = $arr[0][$value]; $this->app->Secure->POST[$value] = $arr[0][$value]; } */ $this->app->DB->UpdateArr('rechnung',$id,'id',$arr[0],true); $this->app->erp->WriteChangeLog(); $this->app->erp->LoadSteuersaetzeWaehrung($id,'rechnung'); $this->app->erp->StartChangeLog('rechnung', $id); $this->app->erp->LoadAdresseStandard('rechnung',$id,$adresse); $this->app->erp->WriteChangeLog(); } /** * @param int $id */ public function DeleteRechnung($id) { if($id <= 0) { return; } $belegnr = $this->app->DB->Select("SELECT belegnr FROM rechnung WHERE id='$id' LIMIT 1"); if($belegnr=='' || $belegnr=='0') { $this->app->DB->Delete("DELETE FROM rechnung_position WHERE rechnung='$id'"); $this->app->DB->Delete("DELETE FROM rechnung_protokoll WHERE rechnung='$id'"); $this->app->DB->Delete("DELETE FROM rechnung WHERE id='$id' LIMIT 1"); } } /** * @param int $rechnung * @param int $verkauf * @param float $menge * @param string $datum */ public function AddRechnungPosition($rechnung, $verkauf,$menge,$datum) { $artikel = 0; $preis = 0; $projekt = 0; $waehrung = 0; $vpe = ''; if($verkauf){ $verkaufspreisearr = $this->app->SelectRow("SELECT * FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); } if(!empty($verkaufspreisearr)) { $artikel = $verkaufspreisearr['artikel']; $preis = $verkaufspreisearr['preis']; $projekt = $verkaufspreisearr['projekt']; $waehrung = $verkaufspreisearr['waehrung']; $vpe = $verkaufspreisearr['vpe']; } if($artikel > 0){ $artikelarr = $this->app->SelectRow("SELECT * FROM artikel WHERE id='$artikel' LIMIT 1"); } $bezeichnunglieferant = ''; $umsatzsteuer = ''; $bestellnummer = ''; if(!empty($artikelarr)) { $bezeichnunglieferant = $artikelarr['name_de']; $umsatzsteuer = $artikelarr['umsatzsteuer']; $bestellnummer = $artikelarr['nummer']; } $sort = (int)$this->app->DB->Select("SELECT MAX(sort) FROM rechnung_position WHERE rechnung='$rechnung' LIMIT 1"); $sort++; $this->app->DB->Insert("INSERT INTO rechnung_position (rechnung,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe) VALUES ('$rechnung','$artikel','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe')"); } /** * @param int $rechnung * @param int $artikel * @param float $preis * @param float $menge * @param string $bezeichnung * @param string $beschreibung * @param string $waehrung * @param int $rabatt * * @return int */ public function AddRechnungPositionManuell($rechnung, $artikel,$preis, $menge,$bezeichnung,$beschreibung='',$waehrung='EUR',$rabatt=0) { $bezeichnung = $this->app->DB->real_escape_string($bezeichnung); $beschreibung = $this->app->DB->real_escape_string($beschreibung); $bezeichnunglieferant = $bezeichnung; $artArr = $this->app->DB->SelectRow( sprintf( 'SELECT nummer, projekt, umsatzsteuer FROM artikel WHERE id = %d', $artikel ) ); $bestellnummer = !empty($artArr)?$artArr['nummer']: $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $projekt = !empty($artArr)?$artArr['projekt']:$this->app->DB->Select("SELECT projekt FROM artikel WHERE id='$artikel' LIMIT 1"); $bestellnummer = $this->app->DB->real_escape_string($bestellnummer); if($waehrung!='') { $this->app->DB->Update("UPDATE rechnung SET waehrung='$waehrung' WHERE id='$rechnung' AND waehrung='' LIMIT 1"); } $keinrabatterlaubt=0; if($rabatt <> 0) { $keinrabatterlaubt=1; } //$waehrung = $this->app->DB->Select("SELECT waehrung FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $umsatzsteuer = !empty($artArr)?$artArr['umsatzsteuer']:$this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $umsatzsteuer = $this->app->DB->real_escape_string($umsatzsteuer); $vpe = ''; //$vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = (int)$this->app->DB->Select("SELECT MAX(sort) FROM rechnung_position WHERE rechnung='$rechnung' LIMIT 1"); $sort++; $this->app->DB->Insert("INSERT INTO rechnung_position (rechnung,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,beschreibung,rabatt,keinrabatterlaubt) VALUES ('$rechnung','$artikel','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe','$beschreibung','$rabatt','$keinrabatterlaubt')"); return $this->app->DB->GetInsertID(); } /** * Build the html output for minidetail containing the payments * @param bool $return * * @return string */ function RechnungZahlung($return=false) { $id = $this->app->Secure->GetGET('id'); $zahlungen = $this->app->erp->GetZahlungen($id,'rechnung'); if (!empty($zahlungen)) { $et = new EasyTable($this->app); $et->headings = array('Datum','Beleg','Betrag','Währung'); foreach ($zahlungen as $zahlung) { $row = array( $zahlung['datum'], " ".ucfirst($zahlung['doc_typ'])." ".$zahlung['doc_info']." ", $zahlung['betrag'], $zahlung['waehrung'] ); $et->AddRow($row); } $salden = $this->app->erp->GetSaldenDokument($id,'rechnung'); foreach ($salden as $saldo) { $row = array( '', 'Saldo', "".$saldo['betrag']."", "".$saldo['waehrung']."" ); $et->AddRow($row); } return($et->DisplayNew('return',"")); } } /* * Recalculate the payments status with skonto */ function rechnung_zahlstatus_berechnen($rechnung_id = null) { // START RECALCULATE $this->app->erp->fibu_rebuild_tables(); if (!empty($rechnung_id)) { $condition = " AND id = '".$rechnung_id."'"; } $offene_rechnungen = $this->app->DB->SelectArr(" SELECT id, soll, waehrung, datum, zahlungszieltage, 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, DATE_ADD(datum, INTERVAL zahlungszieltageskonto DAY) as zieldatumskonto FROM rechnung WHERE belegnr <> '' AND zahlungsstatus = 'offen' ".$condition); foreach ($offene_rechnungen as $offene_rechnung) { $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']; // 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']; // Check overall value if ($saldo['betrag'] == 0) { // ok -> will be marked as paid } 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)) { $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; } else { } } else if ($offene_rechnung['faellig']) { // Overdue } else { // Not due } // Update rechnung $sql = "UPDATE rechnung SET ist = ".$saldo['betrag']."+soll, zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen') 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->erp->fibu_rebuild_tables(); // END RECALCULATE } }