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("");
+ }
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("
");
}
@@ -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("");
}
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
)
);