diff --git a/phpwf/plugins/class.yui.php b/phpwf/plugins/class.yui.php index ca9ff155..8cde715e 100644 --- a/phpwf/plugins/class.yui.php +++ b/phpwf/plugins/class.yui.php @@ -6576,7 +6576,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise, r.zahlungsweise as zahlungsweise, FORMAT(r.soll,2{$extended_mysql55} ) as soll, ifnull(r.waehrung,'EUR'), - if(r.soll-r.ist=0 AND r.ist > 0 AND r.zahlungsstatus!='bezahlt','teilbezahlt',r.zahlungsstatus) as zahlung, + 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, ".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')." diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 061202d9..32b2a4bb 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -13780,6 +13780,19 @@ function SendPaypalFromAuftrag($auftrag, $test = false) } } + function ReplaceKontorahmen($db,$value,$fromform = null) { + $value = $this->app->DB->real_escape_string($value); + + if ($db) { + $sachkonto = explode(' ',$value)[0]; + $kontoid = $this->app->DB->Select("SELECT id FROM kontorahmen WHERE sachkonto = '$sachkonto' LIMIT 1"); + return($kontoid); + } else { + $sachkonto = $this->app->DB->Select("SELECT CONCAT(sachkonto,' ',beschriftung) FROM kontorahmen WHERE id = '$value' LIMIT 1"); + return($sachkonto); + } + } + // @refactor FormHelper Komponente function ReplaceLieferant($db,$value,$fromform) { @@ -36033,7 +36046,7 @@ function Firmendaten($field,$projekt="") * Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag * returns array(betrag, waehrung) or empty array if multiple */ - public function GetSaldoDokument(int $id, string $type) : array { + public function GetSaldoDokument(int $id, string $type, string $buchungsart = '', string $datum_bis = '') : array { $sql = " SELECT @@ -36042,10 +36055,15 @@ function Firmendaten($field,$projekt="") FROM fibu_buchungen_alle WHERE - typ = '".$type."' AND id = ".$id." + typ = '".$type."' + AND + id = ".$id." + AND + (buchungsart = '".$buchungsart."' OR '".$buchungsart."' = '') + AND + (datum <= '".$datum_bis."' OR '".$datum_bis."' = '') GROUP BY waehrung"; - $result = $this->app->DB->SelectArr($sql); if (!empty($result)) { @@ -36067,6 +36085,16 @@ function Firmendaten($field,$projekt="") } } + /* + * Refresh fibu buchung_alle tables + * using module fibu_buchungen + */ + public function fibu_rebuild_tables() { + $fibu_buchungen = $this->app->loadModule('fibu_buchungen', false); + if($fibu_buchungen !== null && method_exists($fibu_buchungen, 'fibu_buchungen_buchen')) { + return $fibu_buchungen->fibu_rebuild_tables(); + } + } public function ANABREGSNeuberechnen($id,$art,$force=false) { diff --git a/www/pages/content/firmendaten.tpl b/www/pages/content/firmendaten.tpl index 5143fce6..a3110f77 100644 --- a/www/pages/content/firmendaten.tpl +++ b/www/pages/content/firmendaten.tpl @@ -1109,7 +1109,10 @@ {|Finanzbuchhaltung Einstellungen|} - + + + +
Buchungen erzeugen ab Datum:Buchungen erzeugen ab Datum:Für die Nutzung mit dem Modul Buchhaltung-Buchungen (Zahlungseingang, Zahlungsstatus, Mahnwesen)
Konto für Rechnung-Skontobuchungen:Auf dieses Sachkonto werden Skontobuchungen mithilfe der Funktion "Zahlungsstatus berechnen" im Rechnungsmodul gebucht
diff --git a/www/pages/content/rechnunguebersicht.tpl b/www/pages/content/rechnunguebersicht.tpl index 62f6d2d7..17e8f30a 100644 --- a/www/pages/content/rechnunguebersicht.tpl +++ b/www/pages/content/rechnunguebersicht.tpl @@ -39,9 +39,13 @@ - +
+ +
+ + [MESSAGE]
[TAB1] diff --git a/www/pages/firmendaten.php b/www/pages/firmendaten.php index a526ee8c..6d9acea9 100644 --- a/www/pages/firmendaten.php +++ b/www/pages/firmendaten.php @@ -1043,7 +1043,7 @@ class Firmendaten { 'arbeitsnachweis_header','arbeitsnachweis_footer','provisionsgutschrift_header','provisionsgutschrift_footer','proformarechnung_header','proformarechnung_footer','eu_lieferung_vermerk','export_lieferung_vermerk' ,'wareneingang_kamera_waage','layout_iconbar','passwort','host','port','mailssl','signatur','email','absendername','bcc1','bcc2','bcc3' ,'firmenfarbe','name','strasse','plz','ort','steuernummer','projekt','steuer_positionen_export','tabsnavigationfarbe','tabsnavigationfarbeschrift' - ,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge", "fibu_buchungen_startdatum" + ,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge", "fibu_buchungen_startdatum", "rechnung_skonto_kontorahmen" ); if(isset($sql2a)){ @@ -1380,9 +1380,10 @@ class Firmendaten { $this->app->YUI->AutoComplete('steuersatz_normal','steuersatz',1); $this->app->YUI->AutoComplete('steuersatz_ermaessigt','steuersatz',1); - $this->app->YUI->DatePicker('fibu_buchungen_startdatum'); + $this->app->YUI->AutoComplete('rechnung_skonto_kontorahmen', 'sachkonto'); + $this->app->Tpl->Parse('PAGE','firmendaten.tpl'); } @@ -1849,6 +1850,7 @@ class Firmendaten { // Fibu $this->app->Tpl->Set('FIBU_BUCHUNGEN_STARTDATUM', $this->app->erp->ReplaceDatum(false,$data[0]['fibu_buchungen_startdatum'],false)); + $this->app->Tpl->Set('RECHNUNG_SKONTO_KONTORAHMEN', $this->app->erp->ReplaceKontorahmen(false,$data[0]['rechnung_skonto_kontorahmen'])); } @@ -2292,7 +2294,8 @@ class Firmendaten { $data['buchhaltung_sachkontenlaenge'] = ($this->app->Secure->POST["buchhaltung_sachkontenlaenge"]); $data['fibu_buchungen_startdatum'] = $this->app->erp->ReplaceDatum(true,$this->app->Secure->POST["fibu_buchungen_startdatum"],false); - + $data['rechnung_skonto_kontorahmen'] = $this->app->erp->ReplaceKontorahmen(true,$this->app->Secure->POST["rechnung_skonto_kontorahmen"]); + return $data; } diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index 46ce4573..fad4b4de 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -236,13 +236,6 @@ class Rechnung extends GenRechnung $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); } - function RechnungMahnwesen() - { - - - } - - function RechnungLastschriftWdh() { @@ -2243,29 +2236,72 @@ class Rechnung extends GenRechnung break; } } + } // 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 + } - - // refresh all open items - $openids = $this->app->DB->SelectArr("SELECT id, waehrung from rechnung WHERE zahlungsstatus = 'offen'"); - - foreach ($openids as $openid) { - $saldo = $this->app->erp->GetSaldoDokument($openid['id'],'rechnung'); - - if (!empty($saldo)) { - if ($saldo['waehrung'] == $openid['waehrung']) { - $sql = "UPDATE - rechnung - SET - ist = ".$saldo['betrag']."+soll, - zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen') - WHERE id=".$openid['id']; - $this->app->DB->Update($sql); - } - } - else { - $this->app->DB->Update("UPDATE rechnung SET ist = null WHERE id=".$openid['id']); - } - } $this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen'); @@ -2274,7 +2310,6 @@ class Rechnung extends GenRechnung $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'); } @@ -2765,4 +2800,6 @@ class Rechnung extends GenRechnung return($et->DisplayNew('return',"")); } } + + }