rechnung calculate payment status with skonto

This commit is contained in:
OpenXE 2023-06-07 15:30:44 +02:00
parent 06686a6020
commit 73725a31bb
6 changed files with 114 additions and 39 deletions

View File

@ -6576,7 +6576,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
r.zahlungsweise as zahlungsweise, r.zahlungsweise as zahlungsweise,
FORMAT(r.soll,2{$extended_mysql55} ) as soll, FORMAT(r.soll,2{$extended_mysql55} ) as soll,
ifnull(r.waehrung,'EUR'), 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.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, if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status,
".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')." ".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')."

View File

@ -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 // @refactor FormHelper Komponente
function ReplaceLieferant($db,$value,$fromform) function ReplaceLieferant($db,$value,$fromform)
{ {
@ -36033,7 +36046,7 @@ function Firmendaten($field,$projekt="")
* Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag * Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag
* returns array(betrag, waehrung) or empty array if multiple * 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 = " $sql = "
SELECT SELECT
@ -36042,10 +36055,15 @@ function Firmendaten($field,$projekt="")
FROM FROM
fibu_buchungen_alle fibu_buchungen_alle
WHERE 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 GROUP BY
waehrung"; waehrung";
$result = $this->app->DB->SelectArr($sql); $result = $this->app->DB->SelectArr($sql);
if (!empty($result)) { 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) public function ANABREGSNeuberechnen($id,$art,$force=false)
{ {

View File

@ -1109,7 +1109,10 @@
<legend>{|Finanzbuchhaltung Einstellungen|}</legend> <legend>{|Finanzbuchhaltung Einstellungen|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="300">Buchungen erzeugen ab Datum:</td><td colspan="3"><input type="text" id= "fibu_buchungen_startdatum" name="fibu_buchungen_startdatum" size="10" value="[FIBU_BUCHUNGEN_STARTDATUM]"></td> <td width="300">Buchungen erzeugen ab Datum:</td><td colspan="3"><input type="text" id= "fibu_buchungen_startdatum" name="fibu_buchungen_startdatum" size="10" value="[FIBU_BUCHUNGEN_STARTDATUM]"><i>F&uuml;r die Nutzung mit dem Modul Buchhaltung-Buchungen (Zahlungseingang, Zahlungsstatus, Mahnwesen)</i></td>
</tr>
<tr>
<td width="300">Konto f&uuml;r Rechnung-Skontobuchungen:</td><td colspan="3"><input type="text" id= "rechnung_skonto_kontorahmen" name="rechnung_skonto_kontorahmen" size="10" value="[RECHNUNG_SKONTO_KONTORAHMEN]"><i>Auf dieses Sachkonto werden Skontobuchungen mithilfe der Funktion "Zahlungsstatus berechnen" im Rechnungsmodul gebucht</i></td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>

View File

@ -39,9 +39,13 @@
<label for="rechnungenstorniert">{|Storniert|}</label> <label for="rechnungenstorniert">{|Storniert|}</label>
</li> </li>
</ul> </ul>
</div> <form method="post" action="#">
<input type="submit" class="btnBlue" name="zahlungsstatus_berechnen" value="{|Zahlungsstatus berechnen|}" />
</form>
</div>
</div> </div>
[MESSAGE] [MESSAGE]
<form method="post" action="#"> <form method="post" action="#">
[TAB1] [TAB1]

View File

@ -1043,7 +1043,7 @@ class Firmendaten {
'arbeitsnachweis_header','arbeitsnachweis_footer','provisionsgutschrift_header','provisionsgutschrift_footer','proformarechnung_header','proformarechnung_footer','eu_lieferung_vermerk','export_lieferung_vermerk' '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' ,'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' ,'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)){ if(isset($sql2a)){
@ -1380,9 +1380,10 @@ class Firmendaten {
$this->app->YUI->AutoComplete('steuersatz_normal','steuersatz',1); $this->app->YUI->AutoComplete('steuersatz_normal','steuersatz',1);
$this->app->YUI->AutoComplete('steuersatz_ermaessigt','steuersatz',1); $this->app->YUI->AutoComplete('steuersatz_ermaessigt','steuersatz',1);
$this->app->YUI->DatePicker('fibu_buchungen_startdatum'); $this->app->YUI->DatePicker('fibu_buchungen_startdatum');
$this->app->YUI->AutoComplete('rechnung_skonto_kontorahmen', 'sachkonto');
$this->app->Tpl->Parse('PAGE','firmendaten.tpl'); $this->app->Tpl->Parse('PAGE','firmendaten.tpl');
} }
@ -1849,6 +1850,7 @@ class Firmendaten {
// Fibu // Fibu
$this->app->Tpl->Set('FIBU_BUCHUNGEN_STARTDATUM', $this->app->erp->ReplaceDatum(false,$data[0]['fibu_buchungen_startdatum'],false)); $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['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['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; return $data;
} }

View File

@ -236,13 +236,6 @@ class Rechnung extends GenRechnung
$this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg");
} }
function RechnungMahnwesen()
{
}
function RechnungLastschriftWdh() function RechnungLastschriftWdh()
{ {
@ -2243,29 +2236,72 @@ class Rechnung extends GenRechnung
break; 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'); $this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen');
@ -2274,7 +2310,6 @@ class Rechnung extends GenRechnung
$this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','&Uuml;bersicht'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','&Uuml;bersicht');
$this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen');
if(strlen($backurl)>5){ if(strlen($backurl)>5){
$this->app->erp->MenuEintrag("$backurl", 'Zur&uuml;ck'); $this->app->erp->MenuEintrag("$backurl", 'Zur&uuml;ck');
} }
@ -2765,4 +2800,6 @@ class Rechnung extends GenRechnung
return($et->DisplayNew('return',"")); return($et->DisplayNew('return',""));
} }
} }
} }