From 73725a31bb35b107b2b32b0fd92fabfac854f999 Mon Sep 17 00:00:00 2001
From: OpenXE <>
Date: Wed, 7 Jun 2023 15:30:44 +0200
Subject: [PATCH] rechnung calculate payment status with skonto

---
 phpwf/plugins/class.yui.php              |  2 +-
 www/lib/class.erpapi.php                 | 34 ++++++++-
 www/pages/content/firmendaten.tpl        |  5 +-
 www/pages/content/rechnunguebersicht.tpl |  6 +-
 www/pages/firmendaten.php                |  9 ++-
 www/pages/rechnung.php                   | 97 ++++++++++++++++--------
 6 files changed, 114 insertions(+), 39 deletions(-)

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 @@
 						<legend>{|Finanzbuchhaltung Einstellungen|}</legend>
 						<table width="100%">
 							<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>							
 						</table>
 					</fieldset>
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 @@
           <label for="rechnungenstorniert">{|Storniert|}</label>
         </li>
       </ul>
-    </div>
+      <form method="post" action="#">
+        <input type="submit" class="btnBlue" name="zahlungsstatus_berechnen" value="{|Zahlungsstatus berechnen|}" />
+      </form>              
+    </div>    
   </div>
 
+
 [MESSAGE]
 <form method="post" action="#">
 [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','&Uuml;bersicht');
     $this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen');
-
     if(strlen($backurl)>5){
       $this->app->erp->MenuEintrag("$backurl", 'Zur&uuml;ck');
     }
@@ -2765,4 +2800,6 @@ class Rechnung extends GenRechnung
         return($et->DisplayNew('return',""));           
     }
   }
+
+
 }