From ab91715c204f5f49dd00ba7bdcd08415a0edbe75 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 15 Mar 2023 22:50:58 +0100 Subject: [PATCH] Zahlungen minidetail and collation of relevant documents as tree --- www/lib/class.erpapi.php | 136 ++++++++++++++++++ www/pages/auftrag.php | 43 ++++++ www/pages/content/auftrag_minidetail.tpl | 2 +- www/pages/content/gutschrift_minidetail.tpl | 8 +- www/pages/content/rechnung_minidetail.tpl | 2 +- www/pages/gutschrift.php | 143 +++++-------------- www/pages/rechnung.php | 144 +++++++------------- 7 files changed, 261 insertions(+), 217 deletions(-) diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 5eff2662..afe6628d 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -36016,6 +36016,142 @@ function Firmendaten($field,$projekt="") } } + /* + * Retrieve the associated documents regarding payments + * Gutschrift -> Rechnung -> Auftrag OR Verbindlichkeit + * Results array of ids, types, belegnr + */ + public function GetZahlungenAssociatedDocuments(int $id, string $type) : array { + + $assocs = array( + array( + 'type' => 'auftrag', + 'below' => 'rechnung', + ), + array( + 'above' => 'auftrag', + 'type' => 'rechnung', + 'below' => 'gutschrift' + ), + array( + 'above' => 'rechnung', + 'type' => 'gutschrift' + ), + array( + 'type' => 'verbindlichkeit' + ) + ); + + + if ($id <= 0) { + throw new exception('no id provided'); + } + + if (!in_array($type, array('rechnung','gutschrift','auftrag','verbindlichkeit'))) { + throw new exception('invalid type '.$type); + } + + $id = $this->app->Secure->GetGET('id'); + + // Go to highest level + $above = $assocs[array_search($type,array_column($assocs,'type'))]['above']; + while ($above) { + $sql = "SELECT ".$above."id as id FROM ".$type." WHERE id = ".$id; + $above_id = $this->app->DB->SelectArr($sql)[0]; + if (!empty($above)) { + $type = $above; + $id = $above_id['id']; + } + $above = $assocs[array_search($type,array_column($assocs,'type'))]['above']; + } + + // Cascade down and retrieve all documents + $result_documents = array(); + $ids = array($id); + $ref = 'id'; + do { + $sql = "SELECT id, '".$type."' AS type, belegnr FROM ".$type." WHERE ".$ref." IN (".implode(",",$ids).")"; + $result = $this->app->DB->SelectArr($sql); + if (!empty($result)) { + $result_documents = array_merge($result_documents, $result); + $ids = array_column($result,'id'); + $ref = $type."id"; + $type = $assocs[array_search($type,array_column($assocs,'type'))]['below']; + } else { + break; + } + } while ($type); + + return($result_documents); + } + + /* + * Calculate the payments of a document (rechnung, gutschrift, auftrag, verbindlichkeit) + * Results array of payments with information + * Gutschrift -> Rechnungid, Rechnung -> Auftragid + */ + public function GetZahlungen(int $id, string $type) : array { + + $documents = $this->GetZahlungenAssociatedDocuments($id, $type); + + if (empty($documents)) { + return(array()); + } + +// print_r($documents); + + $zahlungen = array(); + + $tables = array( + array( + 'minus' => '', + 'table' => 'kontoauszuege_zahlungseingang', + ), + array ( + 'minus' => '-', + 'table' => 'kontoauszuege_zahlungsausgang' + ) + ); + + foreach ($documents as $document) { + + foreach ($tables as $table) { + + $sql = " + SELECT + '".$document['type']."' as `doc_type`, + '".$document['id']."' as `doc_id`, + '".$document['belegnr']."' as `doc_belegnr`, + ko.bezeichnung AS konto, + DATE_FORMAT(ke.datum, '%d.%m.%Y') AS datum, + k.id AS kontoauszuege, + ".$table['minus']."ke.betrag AS betrag, + k.id AS zeile, + k.waehrung + FROM + ".$table['table']." ke + LEFT JOIN kontoauszuege k ON + ke.kontoauszuege = k.id + LEFT JOIN konten ko ON + k.konto = ko.id + WHERE + ke.objekt = '".$document['type']."' AND ke.parameter = '".$document['id']."' + "; + + $result = $this->app->DB->SelectArr($sql); + + if (!empty($result)) { + $zahlungen = array_merge($zahlungen,$result); + } + } + } + return($zahlungen); + } + + /* + * Calculate the payment saldo of a document + */ + public function ANABREGSNeuberechnen($id,$art,$force=false) { if($id <= 0 || empty($art)) diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 372f252f..94e4a16c 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -3182,6 +3182,11 @@ class Auftrag extends GenAuftrag ); } + $this->app->Tpl->Add( + 'ZAHLUNGEN', + $this->AuftragZahlung(true) + ); + // schaue ob es eine GS zu diesem Auftrag gibt // schaue ob es eine GS zu diesem Auftrag gibt //$gutschriftid = $this->app->DB->Select("SELECT id FROM gutschrift WHERE rechnungid='$rechnungid' LIMIT 1"); @@ -3409,7 +3414,45 @@ class Auftrag extends GenAuftrag Lieferadresse:

$lieferadresse"; } + /* Build the html output for minidetail containing the payments + * @param bool $return + * + * @return string + */ + function AuftragZahlung($return=false) + { + $id = $this->app->Secure->GetGET('id'); + $zahlungen = $this->app->erp->GetZahlungen($id,'auftrag'); + +// print_r($zahlungen); + + $result = ""; + + foreach ($zahlungen as $zahlung) { + $result .= " + + + ".$zahlung['datum']." + + + + ".ucfirst($zahlung['doc_type'])." + ".$zahlung['doc_belegnr']." + + + + ".$zahlung['konto']." + + + + ".$zahlung['betrag']." ".$zahlung['waehrung']." + + + "; + } + return("".$result."
"); + } function AuftragZahlungsmail() { diff --git a/www/pages/content/auftrag_minidetail.tpl b/www/pages/content/auftrag_minidetail.tpl index dad0606e..46cea5af 100644 --- a/www/pages/content/auftrag_minidetail.tpl +++ b/www/pages/content/auftrag_minidetail.tpl @@ -87,7 +87,7 @@ -->
-

{|Zahlungseingang|}

+

{|Zahlungen|}

[ZAHLUNGEN]
diff --git a/www/pages/content/gutschrift_minidetail.tpl b/www/pages/content/gutschrift_minidetail.tpl index 553f2e94..9b11acf8 100644 --- a/www/pages/content/gutschrift_minidetail.tpl +++ b/www/pages/content/gutschrift_minidetail.tpl @@ -39,7 +39,7 @@
-

{|Zahlungseingang|}

+

{|Zahlungen|}

[ZAHLUNGEN]
@@ -58,12 +58,6 @@
-

Deckungsbeitrag

-
- -
Dieses Modul ist erst ab Version Professional verfügbar
- -
diff --git a/www/pages/content/rechnung_minidetail.tpl b/www/pages/content/rechnung_minidetail.tpl index 08392a68..1910123b 100644 --- a/www/pages/content/rechnung_minidetail.tpl +++ b/www/pages/content/rechnung_minidetail.tpl @@ -44,7 +44,7 @@
-

Zahlungseingang

+

Zahlungen

[ZAHLUNGEN]
diff --git a/www/pages/gutschrift.php b/www/pages/gutschrift.php index a64b86b8..0da05063 100644 --- a/www/pages/gutschrift.php +++ b/www/pages/gutschrift.php @@ -650,6 +650,7 @@ class Gutschrift extends GenGutschrift /** + * Build the html output for minidetail containing the payments * @param bool $return * * @return string @@ -658,102 +659,35 @@ class Gutschrift extends GenGutschrift { $id = $this->app->Secure->GetGET('id'); - $gutschriftArr = $this->app->DB->SelectArr( - "SELECT DATE_FORMAT(datum,'%d.%m.%Y') as datum, belegnr, soll, waehrung, rechnungid - FROM gutschrift WHERE id='$id' LIMIT 1" - ); - $waehrung = empty($gutschriftArr)?'EUR':$gutschriftArr[0]['waehrung']; - if(!$waehrung) { - $waehrung = 'EUR'; - } - - $rechnungid = empty($gutschriftArr)?0: $gutschriftArr[0]['rechnungid']; - - $auftragid = $rechnungid <= 0?0:$this->app->DB->Select( - sprintf( - 'SELECT `auftragid` FROM `rechnung` WHERE `id` = %d LIMIT 1', - $rechnungid - ) - ); - $eingang ="Zahlungen"; - - - $eingang .="".$gutschriftArr[0]['datum'] - ."GS ".$gutschriftArr[0]['belegnr'] - ."".$this->app->erp->EUR($gutschriftArr[0]['soll']) - ." $waehrung"; - - $eingangArr = $this->app->DB->SelectArr( - "SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, k.id as kontoauszuege, - ke.betrag as betrag, k.id as zeile,k.waehrung - FROM kontoauszuege_zahlungseingang ke - LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id - LEFT JOIN konten ko ON k.konto=ko.id - WHERE (ke.objekt='gutschrift' AND ke.parameter='$id') - OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0) - OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0)" - ); - $ceingangArr = empty($eingangArr)?0:(!empty($eingangArr)?count($eingangArr):0); - - for($i=0;$i<$ceingangArr;$i++) { - $waehrung = 'EUR'; - if($eingangArr[$i]['waehrung']) { - $waehrung = $eingangArr[$i]['waehrung']; - } - $eingang .="".$eingangArr[$i]['datum'] - ."".$eingangArr[$i]['konto'] - ." (zur Buchung)" - .$this->app->erp->EUR($eingangArr[$i]['betrag']) - ." $waehrung"; - } - // gutschriften zu dieser rechnung anzeigen -/* - $gutschriften = $this->app->DB->SelectArr("SELECT belegnr, DATE_FORMAT(datum,'%d.%m.%Y') as datum,soll FROM gutschrift WHERE rechnungid='$id'"); - - for($i=0;$i<(!empty($gutschriften)?count($gutschriften):0);$i++) - $eingang .="".$gutschriften[$i]['datum']."GS ".$gutschriften[$i]['belegnr']."".$this->app->erp->EUR($gutschriften[$i]['soll'])." EUR"; - -*/ - - $ausgang = ''; - $ausgangArr = $this->app->DB->SelectArr( - "SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, ke.betrag as betrag, - k.id as zeile,k.waehrung - FROM kontoauszuege_zahlungsausgang ke - LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id - LEFT JOIN konten ko ON k.konto=ko.id - WHERE (ke.objekt='gutschrift' AND ke.parameter='$id') - OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0) - OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0)" - ); - $cAusgangArr = empty($ausgangArr)?0:(!empty($ausgangArr)?count($ausgangArr):0); - for($i=0;$i<$cAusgangArr;$i++) { - $waehrung = 'EUR'; - if($ausgangArr[$i]['waehrung']) { - $waehrung = $ausgangArr[$i]['waehrung']; - } - $ausgang .="".$ausgangArr[$i]['datum']."" - .$ausgangArr[$i]['konto']." (zur Buchung)" - .$this->app->erp->EUR($ausgangArr[$i]['betrag']) - ." $waehrung"; - } - - $saldo = $this->app->erp->EUR($this->GutschriftSaldo($id)); - - if($saldo < 0) { - $saldo = "$saldo"; - } - $waehrung = $this->app->DB->Select("SELECT waehrung FROM gutschrift WHERE id = '$id' LIMIT 1"); - if(!$waehrung) { - $waehrung = 'EUR'; - } - $ausgang .="Saldo$saldo $waehrung"; - - if($return) { - return "".$eingang." ".$ausgang."
"; + $zahlungen = $this->app->erp->GetZahlungen($id,'gutschrift'); + +// print_r($zahlungen); + + $result = ""; + + foreach ($zahlungen as $zahlung) { + $result .= " + + + ".$zahlung['datum']." + + + + ".ucfirst($zahlung['doc_type'])." + ".$zahlung['doc_belegnr']." + + + + ".$zahlung['konto']." + + + + ".$zahlung['betrag']." ".$zahlung['waehrung']." + + + "; } + return("".$result."
"); } @@ -1251,25 +1185,12 @@ class Gutschrift extends GenGutschrift // $this->app->erp->CommonReadonly(); } - if($schreibschutz=="1") - $this->app->erp->CommonReadonly(); + if($schreibschutz=="1") { + $this->app->erp->CommonReadonly(); + } $rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1"); $rechnungid = $this->app->DB->Select("SELECT id FROM rechnung WHERE id='$rechnungid' AND belegnr!='' LIMIT 1"); - $alle_gutschriften = $this->app->DB->SelectArr("SELECT id,belegnr FROM gutschrift WHERE rechnungid='$rechnungid' AND rechnungid>0"); - - if (!is_null($alle_gutschriften)) { - if((!empty($alle_gutschriften)?count($alle_gutschriften):0) > 1) - { - for($agi=0;$agi<(!empty($alle_gutschriften)?count($alle_gutschriften):0);$agi++) - $gutschriften .= "".$alle_gutschriften[$agi][belegnr]." "; - $this->app->Tpl->Add('MESSAGE',"
Für die angebene Rechnung gibt es schon folgende Gutschriften: $gutschriften
"); - } - } - - - // if($status=="versendet") - // $this->app->Tpl->Set(MESSAGE,"
Diese Gutschrift wurde bereits versendet und darf daher nicht mehr bearbeitet werden!
"); if($status=="") $this->app->DB->Update("UPDATE gutschrift SET status='angelegt' WHERE id='$id' LIMIT 1"); diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index 1a251a4d..8b65fbe8 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -1583,6 +1583,9 @@ class Rechnung extends GenRechnung $this->app->erp->RechnungNeuberechnen($id); } + // ALWAYS + $this->app->erp->RechnungNeuberechnen($id); + if($cmd === 'dadown') { $erg['status'] = 0; @@ -1767,8 +1770,10 @@ class Rechnung extends GenRechnung $this->app->Tpl->Set('VORKASSE',''); } +// $saldo=$this->app->DB->Select("SELECT ist-skonto_gegeben FROM rechnung WHERE id='$id'"); + + $saldo = $this->app->erp->EUR($this->RechnungSaldo($id)); - $saldo=$this->app->DB->Select("SELECT ist-skonto_gegeben FROM rechnung WHERE id='$id'"); $this->app->Tpl->Set('LIVEIST',"$saldo"); if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz')) @@ -1789,10 +1794,13 @@ class Rechnung extends GenRechnung $this->app->erp->RemoveReadonly('mahnwesenfestsetzen'); $this->app->erp->RemoveReadonly('mahnwesen'); $this->app->erp->RemoveReadonly('bezahlt_am'); +/* + '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'); + $this->app->erp->RemoveReadonly('ist');*/ //$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1"); @@ -1805,7 +1813,7 @@ class Rechnung extends GenRechnung { $gutschriften = ''; for($agi=0;$agi<$cgutschriften;$agi++) - $gutschriften .= "".$alle_gutschriften[$agi][belegnr]." "; + $gutschriften .= "".$alle_gutschriften[$agi]['belegnr']." "; $this->app->Tpl->Add('MESSAGE',"
Für die angebene Rechnung gibt es schon folgende Gutschriften: $gutschriften
"); } @@ -1963,6 +1971,7 @@ class Rechnung extends GenRechnung ' überein
' ); } + parent::RechnungEdit(); if($id > 0 && $this->app->DB->Select( sprintf( @@ -2715,104 +2724,45 @@ class Rechnung extends GenRechnung } + /** + * Build the html output for minidetail containing the payments + * @param bool $return + * + * @return string + */ function RechnungZahlung($return=false) { $id = $this->app->Secure->GetGET('id'); - $rechnungArr = $this->app->DB->SelectArr( - "SELECT DATE_FORMAT(datum,'%d.%m.%Y') as datum, belegnr, soll, waehrung, rechnungid - FROM rechnung WHERE id='$id' LIMIT 1" - ); - $waehrung = empty($rechnungArr)?'EUR':$rechnungArr[0]['waehrung']; - if(!$waehrung) { - $waehrung = 'EUR'; - } - - $rechnungid = empty($rechnungArr)?0: $rechnungArr[0]['rechnungid']; - - $auftragid = $rechnungid <= 0?0:$this->app->DB->Select( - sprintf( - 'SELECT `auftragid` FROM `rechnung` WHERE `id` = %d LIMIT 1', - $rechnungid - ) - ); - $eingang ="Zahlungen"; - - - $eingang .="".$rechnungArr[0]['datum'] - ."RG ".$rechnungArr[0]['belegnr'] - ."".$this->app->erp->EUR($rechnungArr[0]['soll']) - ." $waehrung"; - - $eingangArr = $this->app->DB->SelectArr( - "SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, k.id as kontoauszuege, - ke.betrag as betrag, k.id as zeile,k.waehrung - FROM kontoauszuege_zahlungseingang ke - LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id - LEFT JOIN konten ko ON k.konto=ko.id - WHERE (ke.objekt='rechnung' AND ke.parameter='$id') - OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0) - OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0)" - ); - $ceingangArr = empty($eingangArr)?0:(!empty($eingangArr)?count($eingangArr):0); - - for($i=0;$i<$ceingangArr;$i++) { - $waehrung = 'EUR'; - if($eingangArr[$i]['waehrung']) { - $waehrung = $eingangArr[$i]['waehrung']; - } - $eingang .="".$eingangArr[$i]['datum'] - ."".$eingangArr[$i]['konto'] - ." (zur Buchung)" - .$this->app->erp->EUR($eingangArr[$i]['betrag']) - ." $waehrung"; - } - // rechnungen zu dieser rechnung anzeigen - - $rechnungen = $this->app->DB->SelectArr("SELECT belegnr, DATE_FORMAT(datum,'%d.%m.%Y') as datum,soll FROM rechnung WHERE rechnungid='$id'"); - - for($i=0;$i<(!empty($rechnungen)?count($rechnungen):0);$i++) - $eingang .="".$rechnungen[$i]['datum']."GS ".$rechnungen[$i]['belegnr']."".$this->app->erp->EUR($rechnungen[$i]['soll'])." EUR"; - - $ausgang = ''; - $ausgangArr = $this->app->DB->SelectArr( - "SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, ke.betrag as betrag, - k.id as zeile,k.waehrung - FROM kontoauszuege_zahlungsausgang ke - LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id - LEFT JOIN konten ko ON k.konto=ko.id - WHERE (ke.objekt='rechnung' AND ke.parameter='$id') - OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0) - OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0)" - ); - $cAusgangArr = empty($ausgangArr)?0:(!empty($ausgangArr)?count($ausgangArr):0); - for($i=0;$i<$cAusgangArr;$i++) { - $waehrung = 'EUR'; - if($ausgangArr[$i]['waehrung']) { - $waehrung = $ausgangArr[$i]['waehrung']; - } - $ausgang .="".$ausgangArr[$i]['datum']."" - .$ausgangArr[$i]['konto']." (zur Buchung)" - .$this->app->erp->EUR($ausgangArr[$i]['betrag']) - ." $waehrung"; - } - - $saldo = $this->app->erp->EUR($this->RechnungSaldo($id)); - - if($saldo < 0) { - $saldo = "$saldo"; - } - $waehrung = $this->app->DB->Select("SELECT waehrung FROM rechnung WHERE id = '$id' LIMIT 1"); - if(!$waehrung) { - $waehrung = 'EUR'; - } - $ausgang .="Saldo$saldo $waehrung"; - - if($return) { - return "".$eingang." ".$ausgang."
"; + $zahlungen = $this->app->erp->GetZahlungen($id,'rechnung'); + +// print_r($zahlungen); + + $result = ""; + + foreach ($zahlungen as $zahlung) { + $result .= " + + + ".$zahlung['datum']." + + + + ".ucfirst($zahlung['doc_type'])." + ".$zahlung['doc_belegnr']." + + + + ".$zahlung['konto']." + + + + ".$zahlung['betrag']." ".$zahlung['waehrung']." + + + "; } + return("".$result."
"); } public function RechnungSaldo($id) @@ -2823,7 +2773,7 @@ public function RechnungSaldo($id) $rechnungid = $this->app->DB->Select( sprintf( - 'SELECT `rechnungid` FROM `rechnung` WHERE `id`= %d LIMIT 1', + 'SELECT `id` FROM `rechnung` WHERE `id`= %d LIMIT 1', $id ) );