Zahlungen improvements

This commit is contained in:
OpenXE 2023-03-22 14:33:34 +01:00
parent 1f52278758
commit e356051f5a
8 changed files with 781 additions and 536 deletions

View File

@ -6551,13 +6551,24 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
// $columnfilter = true;
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS r.id,'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open,concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />')as auswahl, r.belegnr, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom,
if(r.kundennummer <> '',r.kundennummer,adr.kundennummer),
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) 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'),
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0 AND r.zahlungsstatus!='bezahlt','teilbezahlt',r.zahlungsstatus) as zahlung,
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0,FORMAT(r.ist-r.soll+r.skonto_gegeben,2{$extended_mysql55}),FORMAT((r.soll-r.ist+r.skonto_gegeben)*-1,2{$extended_mysql55})) as fehlt, if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status, ".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')." r.id
$sql = "SELECT SQL_CALC_FOUND_ROWS
r.id,
'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open,
concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />') as auswahl,
r.belegnr,
DATE_FORMAT(r.datum,'%d.%m.%Y') as vom,
if(r.kundennummer <> '',r.kundennummer,adr.kundennummer),
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) 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'),
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0 AND r.zahlungsstatus!='bezahlt','teilbezahlt',r.zahlungsstatus) as zahlung,
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0,FORMAT(r.ist-r.soll+r.skonto_gegeben,2{$extended_mysql55}),FORMAT((r.soll-r.ist+r.skonto_gegeben)*-1,2{$extended_mysql55})) as fehlt,
if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status,
".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')."
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 ";
if(isset($parameter['artikel']) && !empty($parameter['artikel'])) {
$artikelid = $this->app->DB->Select("SELECT id FROM artikel where geloescht != 1 AND nummer != 'DEL' AND nummer != '' AND nummer = '".$this->app->DB->real_escape_string(reset(explode(' ',trim($parameter['artikel']))))."' LIMIT 1");

View File

@ -7088,6 +7088,7 @@ title: 'Abschicken',
$navarray['menu']['admin'][$menu]['sec'][] = array('Arbeitsnachweis','arbeitsnachweis','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Gutschrift / '.$this->Firmendaten("bezeichnungstornorechnung"),'gutschrift','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Proformarechnung','proformarechnung','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Kontoausz&uuml;ge','kontoauszuege','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Abolauf','rechnungslauf','rechnungslauf');
$navarray['menu']['admin'][$menu]['sec'][] = array('Mahnwesen','mahnwesen','list');
@ -36021,7 +36022,7 @@ function Firmendaten($field,$projekt="")
* Gutschrift -> Rechnung -> Auftrag OR Verbindlichkeit
* Results array of ids, types, belegnr
*/
public function GetZahlungenAssociatedDocuments(int $id, string $type) : array {
public function GetZahlungenAssociatedDocuments(int $id, string $type, string $lastlevel = 'auftrag') : array {
$assocs = array(
array(
@ -36056,6 +36057,11 @@ function Firmendaten($field,$projekt="")
// Go to highest level
$above = $assocs[array_search($type,array_column($assocs,'type'))]['above'];
while ($above) {
if ($type == $lastlevel) {
break;
}
$sql = "SELECT ".$above."id as id FROM ".$type." WHERE id = ".$id;
$above_id = $this->app->DB->SelectArr($sql)[0];
if (!empty($above)) {
@ -36090,16 +36096,18 @@ function Firmendaten($field,$projekt="")
* Results array of payments with information
* Gutschrift -> Rechnungid, Rechnung -> Auftragid
*/
public function GetZahlungen(int $id, string $type) : array {
public function GetZahlungen(int $id, string $type, bool $cascade = false, string $lastlevel = 'auftrag') : array {
$documents = $this->GetZahlungenAssociatedDocuments($id, $type);
if ($cascade) {
$documents = $this->GetZahlungenAssociatedDocuments($id, $type, $lastlevel);
} else {
$documents = array(array('id' => $id, 'type' => $type));
}
if (empty($documents)) {
return(array());
}
// print_r($documents);
$zahlungen = array();
$tables = array(
@ -36148,9 +36156,44 @@ function Firmendaten($field,$projekt="")
return($zahlungen);
}
public function GetZahlung(int $id, string $type, bool $cascade = false, string $lastlevel = 'auftrag') {
$zahlungen = $this->GetZahlungen($id, $type, $cascade);
if (empty($zahlungen)) {
$zahlbetrag = 0;
} else {
$zahlbetrag = array_sum(array_column($zahlungen,'betrag'));
}
return($zahlbetrag);
}
/*
* Calculate the payment saldo of a document
* Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag
*/
public function GetSaldoDokument($id, $type, string $lastlevel = 'auftrag') {
$zahlbetrag = $this->GetZahlung($id, $type, false);
$sollspalten = array(
'auftrag' => 'gesamtsumme',
'rechnung' => 'soll',
'gutschrift' => 'soll',
'verbindlichkeit' => 'betrag'
);
$sql = "SELECT ".$sollspalten[$type]." as sollbetrag FROM ".$type." WHERE id =".$id;
// echo($sql);
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$sollbetrag = $result[0]['sollbetrag'];
} else {
$sollbetrag = 0;
}
return($sollbetrag-$zahlbetrag);
}
public function ANABREGSNeuberechnen($id,$art,$force=false)
{

View File

@ -3423,7 +3423,7 @@ class Auftrag extends GenAuftrag
{
$id = $this->app->Secure->GetGET('id');
$zahlungen = $this->app->erp->GetZahlungen($id,'auftrag');
$zahlungen = $this->app->erp->GetZahlungen($id,'auftrag',true);
// print_r($zahlungen);
@ -3451,6 +3451,17 @@ class Auftrag extends GenAuftrag
</td>
</tr>";
}
$saldo = $this->app->erp->GetSaldoDokument($id,'auftrag');
$result .= "
<tr>
<td>
".$saldo."
</td>
</tr>
";
return("<table width=100% border=0 class=auftrag_cell cellpadding=0 cellspacing=0>".$result."</table>");
}

View File

@ -39,7 +39,7 @@
</div>
<div style="background-color:white">
<h2 class="greyh2">{|Zahlungen|}</h2>
<h2 class="greyh2">Zahlungs&uuml;bersicht</h2>
<div style="padding:10px">
[ZAHLUNGEN]
</div>

View File

@ -44,7 +44,7 @@
</div>
<div style="background-color:white">
<h2 class="greyh2">Zahlungen</h2>
<h2 class="greyh2">Zahlungs&uuml;bersicht</h2>
<div style="padding:10px">
[ZAHLUNGEN]
</div>
@ -69,15 +69,12 @@
[PDFARCHIV]
</div>
</div>
<div style="background-color:white">
<h2 class="greyh2">Deckungsbeitrag</h2>
<div style="padding:10px">
<div class="info">Dieses Modul ist erst ab Version Professional verfügbar</div>
</div>
</div>
</div>
<!--
<div style="background-color:white">
<h2 class="greyh2">Deckungsbeitrag</h2>
<div style="padding:10px">
<div class="info">Dieses Modul ist erst ab Version Professional verfügbar</div>
</div>
</div>
</div>
-->

View File

@ -659,7 +659,7 @@ class Gutschrift extends GenGutschrift
{
$id = $this->app->Secure->GetGET('id');
$zahlungen = $this->app->erp->GetZahlungen($id,'gutschrift');
$zahlungen = $this->app->erp->GetZahlungen($id,'gutschrift',true);
// print_r($zahlungen);
@ -687,6 +687,30 @@ class Gutschrift extends GenGutschrift
</td>
</tr>";
}
$sum = array_sum(array_column($zahlungen,'betrag'))." ".$zahlung['waehrung'];
if ($sum != 0) {
$result .= "
<tr>
<td>
</td>
<td>
</td>
<td>
<b>
Summe:
</b>
</td>
<td>
<b>
".$sum."
</b>
</td>
</tr>
";
}
return("<table width=100% border=0 class=auftrag_cell cellpadding=0 cellspacing=0>".$result."</table>");
}

View File

@ -1770,11 +1770,12 @@ class Rechnung extends GenRechnung
$this->app->Tpl->Set('VORKASSE','');
}
// $saldo=$this->app->DB->Select("SELECT ist-skonto_gegeben FROM rechnung WHERE id='$id'");
$ist = $this->app->erp->EUR($this->app->erp->GetZahlung($id,'rechnung'));
$this->app->Tpl->Set('ISTDB',$ist);
$saldo = $this->app->erp->EUR($this->RechnungSaldo($id));
$istgs = $this->app->erp->EUR($this->app->erp->GetZahlung($id,'rechnung',true,'rechnung'));
$this->app->Tpl->Set('ISTGS',$istgs);
$this->app->Tpl->Set('LIVEIST',"$saldo");
if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz'))
{
@ -2086,8 +2087,17 @@ class Rechnung extends GenRechnung
public function RechnungList()
{
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''");
// First refresh all open items
$openids = $this->app->DB->SelectArr("SELECT id from rechnung WHERE zahlungsstatus = 'offen'");
foreach ($openids as $openid) {
$saldo = $this->app->erp->GetSaldoDokument($openid['id'],'rechnung');
$this->app->DB->Update("UPDATE rechnung SET ist = soll-".$saldo." WHERE id=".$openid['id']);
}
if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('rechnung', 'edit'))
{
$drucker = $this->app->Secure->GetPOST('seldrucker');
@ -2734,7 +2744,7 @@ class Rechnung extends GenRechnung
{
$id = $this->app->Secure->GetGET('id');
$zahlungen = $this->app->erp->GetZahlungen($id,'rechnung');
$zahlungen = $this->app->erp->GetZahlungen($id,'rechnung',true);
// print_r($zahlungen);
@ -2760,86 +2770,35 @@ class Rechnung extends GenRechnung
".$zahlung['betrag']." ".$zahlung['waehrung']."
</a>
</td>
</tr>";
</tr>
";
}
$sum = array_sum(array_column($zahlungen,'betrag'))." ".$zahlung['waehrung'];
if ($sum != 0) {
$result .= "
<tr>
<td>
</td>
<td>
</td>
<td>
<b>
Summe:
</b>
</td>
<td>
<b>
".$sum."
</b>
</td>
</tr>
";
}
return("<table width=100% border=0 class=auftrag_cell cellpadding=0 cellspacing=0>".$result."</table>");
}
public function RechnungSaldo($id)
{
if($id <= 0) {
return 0;
}
$rechnungid = $this->app->DB->Select(
sprintf(
'SELECT `id` FROM `rechnung` WHERE `id`= %d LIMIT 1',
$id
)
);
$auftragid = $rechnungid <= 0?0:$this->app->DB->Select(
sprintf(
'SELECT `auftragid` FROM `rechnung` WHERE `id`=%d LIMIT 1',
$rechnungid
)
);
$eingangArr = $this->app->DB->SelectArr(
sprintf(
"SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%%d.%%m.%%Y') as datum, k.id as kontoauszuege, ke.betrag as betrag
FROM `kontoauszuege_zahlungseingang` AS `ke`
LEFT JOIN `kontoauszuege` AS `k` ON ke.kontoauszuege=k.id
LEFT JOIN `konten` AS `ko` ON k.konto=ko.id
WHERE (ke.objekt='rechnung' AND ke.parameter=%d)
OR (ke.objekt='auftrag' AND ke.parameter=%d AND ke.parameter>0)
OR (ke.objekt='rechnung' AND ke.parameter=%d AND ke.parameter>0)",
$id, $auftragid, $rechnungid
)
);
$einnahmen = 0;
if(!empty($eingangArr)) {
foreach($eingangArr AS $eingangRow) {
$einnahmen += $eingangRow['betrag'];
}
}
//$rechnungen = $this->app->DB->SelectArr("SELECT belegnr, DATE_FORMAT(datum,'%d.%m.%Y') as datum,soll FROM rechnung WHERE rechnungid='$id' "); // alt
$rechnungen = $this->app->DB->SelectArr(
sprintf(
"SELECT ro.belegnr, DATE_FORMAT(ro.datum,'%%d.%%m.%%Y') as datum, ro.soll
FROM `rechnung` AS `ro`
WHERE ro.`id` = %d ",
$id
)
);
if(!empty($rechnungen)) {
foreach($rechnungen as $rechnungRow) {
$einnahmen += $rechnungRow['soll'];
}
}
$ausgangArr = $this->app->DB->SelectArr(
sprintf(
"SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%%d.%%m') as datum, ke.betrag as betrag
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=%d)
OR (ke.objekt='rechnung' AND ke.parameter=%d AND ke.parameter>0)
OR (ke.objekt='auftrag' AND ke.parameter=%d AND ke.parameter>0)",
$id, $rechnungid, $auftragid
)
);
$ausgaben = 0;
if(!empty($ausgangArr)){
foreach($ausgangArr as $ausgangRow) {
$ausgaben += $ausgangRow['betrg'];
}
}
return $einnahmen - $ausgaben;
}
}

File diff suppressed because it is too large Load Diff