diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php
index 32b2a4bb..7fd43400 100644
--- a/www/lib/class.erpapi.php
+++ b/www/lib/class.erpapi.php
@@ -36096,6 +36096,18 @@ function Firmendaten($field,$projekt="")
}
}
+ /*
+ * Recalculate payment status and skonto
+ * using module rechnung
+ */
+ public function rechnung_zahlstatus_berechnen() {
+ $rechnung = $this->app->loadModule('rechnung', false);
+ if($rechnung !== null && method_exists($rechnung, 'rechnung_zahlstatus_berechnen')) {
+ return $rechnung->rechnung_zahlstatus_berechnen();
+ }
+ }
+
+
public function ANABREGSNeuberechnen($id,$art,$force=false)
{
if($id <= 0 || empty($art))
diff --git a/www/pages/content/mahnwesen_list.tpl b/www/pages/content/mahnwesen_list.tpl
new file mode 100644
index 00000000..c3e87d82
--- /dev/null
+++ b/www/pages/content/mahnwesen_list.tpl
@@ -0,0 +1,56 @@
+
+
+
diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php
new file mode 100644
index 00000000..f4c7d88d
--- /dev/null
+++ b/www/pages/mahnwesen.php
@@ -0,0 +1,454 @@
+app = $app;
+ if ($intern)
+ return;
+
+ $this->app->ActionHandlerInit($this);
+ $this->app->ActionHandler("list", "mahnwesen_list");
+ $this->app->ActionHandler("create", "mahnwesen_edit"); // This automatically adds a "New" button
+ $this->app->ActionHandler("edit", "mahnwesen_edit");
+ $this->app->ActionHandler("delete", "mahnwesen_delete");
+ $this->app->DefaultActionHandler("list");
+ $this->app->ActionHandlerListen($app);
+ }
+
+ public function Install() {
+ /* Fill out manually later */
+ }
+
+ public function TableSearch($app, $name, $erlaubtevars) {
+ switch ($name) {
+ case "mahnwesen_list":
+
+ $extended_mysql55 = ",'de_DE'";
+
+ $allowed['mahnwesen_list'] = array('list');
+ $heading = array('', '', 'Rechnung', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt', 'Zahlung', 'Betrag (brutto)', 'Währung', 'Zahlstatus', 'Differenz', 'Status','Mahnstufe','Mahn-Datum','Gemahnt','Sperre','Interne Bemerkung','Menü');
+ $width = array('1%','1%','01%', '01%', '01%', '05%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '20%', '1%'); // Fill out manually later
+
+ // columns that are aligned right (numbers etc)
+ // $alignright = array(4,5,6,7,8);
+
+ $findcols = array('r.id','r.id','r.belegnr', $app->erp->FormatDateShort('r.datum'), 'r.kundennummer','r.name', 'r.land','p.abkuerzung','r.zahlungsweise','r.soll','r.waehrung','r.zahlungsstatus','r.soll','r.status','r.mahnwesen');
+ $searchsql = array('belegnr', 'kunde', 'datum');
+
+ $defaultorder = 1;
+ $defaultorderdesc = 0;
+
+ $dropnbox = "'
' AS `open`, CONCAT('') AS `auswahl`";
+
+ $menu = "";
+
+ $sql = "SELECT SQL_CALC_FOUND_ROWS
+ r.id,
+ $dropnbox,
+ r.belegnr,
+ ".$app->erp->FormatDateShort('r.datum')." as vom,
+ if(r.kundennummer <> '',r.kundennummer,adr.kundennummer),
+ CONCAT(" . $app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('
',r.internebezeichnung,''),'')) as kunde,
+ r.land as land,
+ p.abkuerzung as projekt,
+ r.zahlungsweise as zahlungsweise,
+ FORMAT(r.soll,2{$extended_mysql55} ) as soll,
+ ifnull(r.waehrung,'EUR'),
+ r.zahlungsstatus as zahlung,
+ if(r.soll-r.ist!=0 AND r.ist > 0,FORMAT(r.ist-r.soll,2{$extended_mysql55}),FORMAT((r.soll-r.ist)*-1,2{$extended_mysql55})) as fehlt,
+ if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status,
+ r.mahnwesen,
+ ".$app->erp->FormatDateShort('mahnwesen_datum')." as datum,
+ if(r.versendet_mahnwesen,'Ja',''),
+ if(r.mahnwesen_gesperrt,'Ja',''),
+ REPLACE(r.mahnwesen_internebemerkung,'\r\n','
'),
+ r.id
+ FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id LEFT JOIN auftrag au ON au.id = r.auftragid ";
+
+ $where = " r.belegnr <> ''";
+
+ // Toggle filters
+ $this->app->Tpl->Add('JQUERYREADY', "$('#inkl_bezahlte').click( function() { fnFilterColumn1( 0 ); } );");
+ $this->app->Tpl->Add('JQUERYREADY', "$('#inkl_gesperrte').click( function() { fnFilterColumn2( 0 ); } );");
+
+ for ($r = 1;$r <= 2;$r++) {
+ $this->app->Tpl->Add('JAVASCRIPT', '
+ function fnFilterColumn' . $r . ' ( i )
+ {
+ if(oMoreData' . $r . $name . '==1)
+ oMoreData' . $r . $name . ' = 0;
+ else
+ oMoreData' . $r . $name . ' = 1;
+
+ $(\'#' . $name . '\').dataTable().fnFilter(
+ \'\',
+ i,
+ 0,0
+ );
+ }
+ ');
+ }
+
+
+ $more_data1 = $app->Secure->GetGET("more_data1");
+ if ($more_data1 == 1) {
+ } else {
+ $where .= " AND r.zahlungsstatus <> 'bezahlt' ";
+ }
+
+ $more_data2 = $app->Secure->GetGET("more_data2");
+ if ($more_data2 == 1) {
+ }
+ else {
+ $where .= " AND NOT r.mahnwesen_gesperrt ";
+ }
+ // END Toggle filters
+
+
+ $count = "SELECT count(DISTINCT id) FROM rechnung r WHERE $where";
+// $groupby = "";
+
+ break;
+ }
+
+ $erg = false;
+
+ foreach ($erlaubtevars as $k => $v) {
+ if (isset($$v)) {
+ $erg[$v] = $$v;
+ }
+ }
+ return $erg;
+ }
+
+ function mahnwesen_list() {
+ $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list", "Übersicht");
+// $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=create", "Neu anlegen");
+ $this->app->erp->MenuEintrag("index.php", "Zurück");
+
+ if($this->app->Secure->GetPOST('zahlungsstatus_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) {
+ $this->app->erp->rechnung_zahlstatus_berechnen();
+ }
+
+ if($this->app->Secure->GetPOST('sel_aktion') && $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;
+ }
+ $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 &&
+ $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->PDFArchivieren('rechnung', $v, true);
+ $this->app->erp->Rechnungsmail($v);
+ }
+ else if($checkpapier && $drucker) {
+ $this->app->erp->PDFArchivieren('rechnung', $v, true);
+ $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`
+ FROM rechnung WHERE id=%d LIMIT 1",
+ $v
+ )
+ );
+ if($reArr['belegnr'] === '' || ($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->PDFArchivieren('rechnung', $v, true);
+ 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) {
+ $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->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->YUI->TableSearch('TAB1', 'mahnwesen_list', "show", "", "", basename(__FILE__), __CLASS__);
+ $this->app->Tpl->Parse('PAGE', "mahnwesen_list.tpl");
+ }
+
+ public function mahnwesen_delete() {
+ $id = (int) $this->app->Secure->GetGET('id');
+
+ $this->app->DB->Delete("DELETE FROM `mahnwesen` WHERE `id` = '{$id}'");
+ $this->app->Tpl->Set('MESSAGE', "Der Eintrag wurde gelöscht.
");
+
+ $this->mahnwesen_list();
+ }
+
+ /*
+ * Edit mahnwesen item
+ * If id is empty, create a new one
+ */
+
+ function mahnwesen_edit() {
+ $id = $this->app->Secure->GetGET('id');
+
+ // Check if other users are editing this id
+ if($this->app->erp->DisableModul('artikel',$id))
+ {
+ return;
+ }
+
+ $this->app->Tpl->Set('ID', $id);
+
+ $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=edit&id=$id", "Details");
+ $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list", "Zurück zur Übersicht");
+ $id = $this->app->Secure->GetGET('id');
+ $input = $this->GetInput();
+ $submit = $this->app->Secure->GetPOST('submit');
+
+ if (empty($id)) {
+ // New item
+ $id = 'NULL';
+ }
+
+ if ($submit != '')
+ {
+
+ // Write to database
+
+ // Add checks here
+
+ $columns = "id, ";
+ $values = "$id, ";
+ $update = "";
+
+ $fix = "";
+
+ foreach ($input as $key => $value) {
+ $columns = $columns.$fix.$key;
+ $values = $values.$fix."'".$value."'";
+ $update = $update.$fix.$key." = '$value'";
+
+ $fix = ", ";
+ }
+
+// echo($columns."
");
+// echo($values."
");
+// echo($update."
");
+
+ $sql = "INSERT INTO mahnwesen (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
+
+// echo($sql);
+
+ $this->app->DB->Update($sql);
+
+ if ($id == 'NULL') {
+ $msg = $this->app->erp->base64_url_encode("Das Element wurde erfolgreich angelegt.
");
+ header("Location: index.php?module=mahnwesen&action=list&msg=$msg");
+ } else {
+ $this->app->Tpl->Set('MESSAGE', "Die Einstellungen wurden erfolgreich übernommen.
");
+ }
+ }
+
+
+ // Load values again from database
+ $dropnbox = "'
' AS `open`, CONCAT('') AS `auswahl`";
+ $result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS m.id, $dropnbox, m.name, m.rest, m.test, m.id FROM mahnwesen m"." WHERE id=$id");
+
+ foreach ($result[0] as $key => $value) {
+ $this->app->Tpl->Set(strtoupper($key), $value);
+ }
+
+ /*
+ * Add displayed items later
+ *
+
+ $this->app->Tpl->Add('KURZUEBERSCHRIFT2', $email);
+ $this->app->Tpl->Add('EMAIL', $email);
+ $this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername);
+ */
+
+// $this->SetInput($input);
+ $this->app->Tpl->Parse('PAGE', "mahnwesen_edit.tpl");
+ }
+
+ /**
+ * Get all paramters from html form and save into $input
+ */
+ public function GetInput(): array {
+ $input = array();
+ //$input['EMAIL'] = $this->app->Secure->GetPOST('email');
+
+ $input['name'] = $this->app->Secure->GetPOST('name');
+ $input['rest'] = $this->app->Secure->GetPOST('rest');
+ $input['test'] = $this->app->Secure->GetPOST('test');
+
+
+ return $input;
+ }
+
+ /*
+ * Set all fields in the page corresponding to $input
+ */
+ function SetInput($input) {
+ // $this->app->Tpl->Set('EMAIL', $input['email']);
+
+ $this->app->Tpl->Set('NAME', $input['name']);
+ $this->app->Tpl->Set('REST', $input['rest']);
+ $this->app->Tpl->Set('TEST', $input['test']);
+
+ }
+
+}
diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php
index fad4b4de..9f8415cc 100644
--- a/www/pages/rechnung.php
+++ b/www/pages/rechnung.php
@@ -1816,7 +1816,7 @@ class Rechnung extends GenRechnung
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; else $versendet=1;
+ if($alte_mahnstufe!=$mahnwesen) $versendet=0;
/* if($mahnwesenfestsetzen=='1')
{*/
@@ -2239,68 +2239,7 @@ class Rechnung extends GenRechnung
} // ende ausfuehren
if($this->app->Secure->GetPOST('zahlungsstatus_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) {
-
- // START RECALCULATE
- $this->app->erp->fibu_rebuild_tables();
- $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 <> ''
- ");
-
- 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 ($skontorelevante_zahlungen >= $offene_rechnung['skontosoll']) {
- // 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,-$saldo['betrag'],$offene_rechnung['waehrung'],'CURRENT_DATE','');
- $offene_rechnung['ist'] = $offene_rechnung['soll'];
- } 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
-
+ $this->rechnung_zahlstatus_berechnen();
}
$this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen');
@@ -2801,5 +2740,71 @@ class Rechnung extends GenRechnung
}
}
+ /*
+ * Recalculate the payments status with skonto
+ */
+
+ function rechnung_zahlstatus_berechnen() {
+ // START RECALCULATE
+ $this->app->erp->fibu_rebuild_tables();
+ $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 <> ''
+ ");
+
+ 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 ($skontorelevante_zahlungen >= $offene_rechnung['skontosoll']) {
+ // 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,-$saldo['betrag'],$offene_rechnung['waehrung'],'CURRENT_DATE','');
+ $offene_rechnung['ist'] = $offene_rechnung['soll'];
+ } 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
+ }
}