From a3255065e9fd3fcc9992aab33bc97ecc1087b774 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 3 Oct 2024 13:43:45 +0200 Subject: [PATCH] rechnung schnelleingabe initial --- phpwf/htmltags/class.form.php | 5 ++ www/lib/class.erpapi.php | 14 +++ www/pages/ajax.php | 11 +++ www/pages/content/firmendaten.tpl | 18 ++-- www/pages/firmendaten.php | 7 +- www/pages/rechnung.php | 109 +++++++++++++++++++---- www/widgets/_gen/widget.gen.rechnung.php | 3 + www/widgets/templates/_gen/rechnung.tpl | 21 ++++- www/widgets/widget.rechnung.php | 1 + 9 files changed, 160 insertions(+), 29 deletions(-) diff --git a/phpwf/htmltags/class.form.php b/phpwf/htmltags/class.form.php index 221a477c..3b2317fd 100644 --- a/phpwf/htmltags/class.form.php +++ b/phpwf/htmltags/class.form.php @@ -194,6 +194,11 @@ class HTMLInput name=\"{$this->name}\" value=\"{$this->value}\" size=\"{$this->size}\" maxlength=\"{$this->maxlength}\" {$this->readonly} {$this->disabled}>"; break; + case "money": + $html = "id}\" class=\"{$this->class}\" tabindex=\"{$this->tabindex}\" + name=\"{$this->name}\" value=\"".preg_replace("/\"/",""",$this->value)."\" size=\"{$this->size}\" placeholder=\"{$this->placeholder}\" + maxlength=\"{$this->maxlength}\" {$this->readonly} {$this->disabled} [COMMONREADONLYINPUT]>"; + break; } return $html; diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php index 157c08d3..3f0697cb 100644 --- a/www/lib/class.erpapi.php +++ b/www/lib/class.erpapi.php @@ -13811,6 +13811,20 @@ function SendPaypalFromAuftrag($auftrag, $test = false) } } + function ReplaceKonto($db,$value,$fromform = null) { + $value = $this->app->DB->real_escape_string($value); + + if ($db) { + $konto = explode(' ',$value)[0]; + $kontoid = $this->app->DB->Select("SELECT id FROM konten WHERE kurzbezeichnung = '$konto' LIMIT 1"); + return($kontoid); + } else { + $konto = $this->app->DB->Select("SELECT CONCAT(kurzbezeichnung,' ',bezeichnung) FROM konten WHERE id = '$value' LIMIT 1"); + return($konto); + } + } + + // @refactor FormHelper Komponente function ReplaceLieferant($db,$value,$fromform) { diff --git a/www/pages/ajax.php b/www/pages/ajax.php index 3a08c07e..c57e5204 100644 --- a/www/pages/ajax.php +++ b/www/pages/ajax.php @@ -4014,6 +4014,17 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku } break; break; + case "konto": + $cmd = $this->app->Secure->GetGET("cmd"); + + $arr = $this->app->DB->SelectArr(" + SELECT CONCAT(kurzbezeichnung,' ',bezeichnung) as name FROM konten + WHERE (kurzbezeichnung LIKE '%$term%' OR bezeichnung LIKE '%$term%') ORDER by kurzbezeichnung"); + + $carr = !empty($arr)?count($arr):0; + for($i = 0; $i < $carr; $i++) + $newarr[] = $arr[$i]['name']; + break; case "datevkonto": $arr = $this->app->DB->SelectArr("SELECT DISTINCT t.gegenkonto FROM ( (SELECT concat(datevkonto, ' ',bezeichnung) as gegenkonto FROM konten WHERE datevkonto <> 0 AND datevkonto <> '' AND aktiv = 1) diff --git a/www/pages/content/firmendaten.tpl b/www/pages/content/firmendaten.tpl index 003b3c38..2ac2daea 100644 --- a/www/pages/content/firmendaten.tpl +++ b/www/pages/content/firmendaten.tpl @@ -1112,13 +1112,19 @@
{|Finanzbuchhaltung Einstellungen|} - - - - - -
Buchungen erzeugen ab Datum:Für die Nutzung mit dem Modul Buchhaltung-Buchungen (Zahlungseingang, Zahlungsstatus, Mahnwesen)
Konto für Rechnung-Skontobuchungen:Auf dieses Sachkonto werden Skontobuchungen mithilfe der Funktion "Zahlungsstatus berechnen" im Rechnungsmodul gebucht
+ Buchungen erzeugen ab Datum: + Für die Nutzung mit dem Modul Buchhaltung-Buchungen (Zahlungseingang, Zahlungsstatus, Mahnwesen) + + + Sachkonto für Rechnung-Skontobuchungen: + Auf dieses Sachkonto werden Skontobuchungen mithilfe der Funktion "Zahlungsstatus berechnen" im Rechnungsmodul gebucht + + + Geschäftskonto für Schnelleingabe: + Auf dieses Geschäftskonto werden Zahlungen mithilfe der Funktion "Schnelleingabe" im Rechnungsmodul gebucht + +
diff --git a/www/pages/firmendaten.php b/www/pages/firmendaten.php index c8360255..d7d2d615 100644 --- a/www/pages/firmendaten.php +++ b/www/pages/firmendaten.php @@ -1044,7 +1044,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", "rechnung_skonto_kontorahmen" + ,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge", "fibu_buchungen_startdatum", "rechnung_skonto_kontorahmen", "rechnung_schnelleingabe_konto" ); if(isset($sql2a)){ @@ -1384,6 +1384,7 @@ class Firmendaten { $this->app->YUI->DatePicker('fibu_buchungen_startdatum'); $this->app->YUI->AutoComplete('rechnung_skonto_kontorahmen', 'sachkonto'); + $this->app->YUI->AutoComplete('rechnung_schnelleingabe_konto', 'konto'); $this->app->Tpl->Parse('PAGE','firmendaten.tpl'); } @@ -1853,8 +1854,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'])); - - + $this->app->Tpl->Set('RECHNUNG_SCHNELLEINGABE_KONTO', $this->app->erp->ReplaceKonto(false,$data[0]['rechnung_schnelleingabe_konto'])); } } @@ -2299,6 +2299,7 @@ class Firmendaten { $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"]); + $data['rechnung_schnelleingabe_konto'] = $this->app->erp->ReplaceKonto(true,$this->app->Secure->POST["rechnung_schnelleingabe_konto"]); return $data; } diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index 4e423c12..623160f4 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -1613,18 +1613,18 @@ class Rechnung extends GenRechnung $invoiceArr = $this->app->DB->SelectRow( sprintf( - 'SELECT zahlungsweise,zahlungszieltage,dta_datei,status,schreibschutz FROM rechnung WHERE id= %d LIMIT 1', + 'SELECT zahlungsweise,zahlungszieltage,dta_datei,status,zahlungsstatus,schreibschutz FROM rechnung WHERE id= %d LIMIT 1', (int)$id ) ); $zahlungsweise= $invoiceArr['zahlungsweise']; $zahlungszieltage= $invoiceArr['zahlungszieltage']; + $zahlungsstatus= $invoiceArr['zahlungsstatus']; if($zahlungsweise==='rechnung' && $zahlungszieltage<1) { $this->app->Tpl->Add('MESSAGE',"
Hinweis: Fälligkeit auf \"sofort\", da Zahlungsziel in Tagen auf 0 Tage gesetzt ist!
"); } - $status= $invoiceArr['status']; $schreibschutz= $invoiceArr['schreibschutz']; if($status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a') @@ -1743,10 +1743,7 @@ class Rechnung extends GenRechnung if($zahlungsweise==='vorkasse' || $zahlungsweise==='kreditkarte' || $zahlungsweise==='paypal' || $zahlungsweise==='bar') { $this->app->Tpl->Set('VORKASSE',''); } - - $ist = $this->app->erp->EUR($this->app->erp->GetSaldoDokument($id,'rechnung')['betrag']); - $this->app->Tpl->Set('ISTDB',$ist); - + if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz')) { $this->app->Tpl->Set('MESSAGE',"
Diese Rechnung ist schreibgeschützt und darf daher nicht mehr bearbeitet werden! 
"); @@ -1756,15 +1753,20 @@ class Rechnung extends GenRechnung $this->app->erp->CommonReadonly(); } + if($schreibschutz=='1' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && $zahlungsstatus=="offen") + { + $this->app->erp->RemoveReadonly('bezahlt_am'); + $this->app->erp->RemoveReadonly('zahlbetrag'); + $this->app->erp->RemoveReadonly('zahlungsstatus'); + } + if($schreibschutz=='1' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen')) { $this->app->erp->RemoveReadonly('mahnwesen_datum'); $this->app->erp->RemoveReadonly('mahnwesen_gesperrt'); $this->app->erp->RemoveReadonly('mahnwesen_internebemerkung'); - $this->app->erp->RemoveReadonly('zahlungsstatus'); $this->app->erp->RemoveReadonly('mahnwesenfestsetzen'); $this->app->erp->RemoveReadonly('mahnwesen'); - $this->app->erp->RemoveReadonly('bezahlt_am'); /* 'ist' should not be edited manually @@ -1795,9 +1797,9 @@ class Rechnung extends GenRechnung if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen')) { - $mahnwesen_datum = $this->app->Secure->GetPOST('mahnwesen_datum'); $bezahlt_am = $this->app->Secure->GetPOST('bezahlt_am'); + $zahlbetrag = $this->app->Secure->GetPOST('zahlbetrag'); $mahnwesen_gesperrt = $this->app->Secure->GetPOST('mahnwesen_gesperrt'); $mahnwesen_internebemerkung = $this->app->Secure->GetPOST('mahnwesen_internebemerkung'); $zahlungsstatus = $this->app->Secure->GetPOST('zahlungsstatus'); @@ -1823,14 +1825,77 @@ class Rechnung extends GenRechnung /* if($mahnwesenfestsetzen=='1') {*/ - $this->app->DB->Update("UPDATE rechnung SET mahnwesen_internebemerkung='$mahnwesen_internebemerkung',zahlungsstatus='$zahlungsstatus',versendet_mahnwesen='$versendet', - mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum', mahnwesenfestsetzen='$mahnwesenfestsetzen',internebemerkung='$internebemerkung', - mahnwesen='$mahnwesen',skonto_gegeben='$skonto_gegeben',bezahlt_am='$bezahlt_am' WHERE id='$id' LIMIT 1"); + $this->app->DB->Update(" + UPDATE rechnung SET + mahnwesen_internebemerkung='$mahnwesen_internebemerkung', + zahlungsstatus='$zahlungsstatus', + versendet_mahnwesen='$versendet', + mahnwesen_gesperrt='$mahnwesen_gesperrt', + mahnwesen_datum='$mahnwesen_datum', + mahnwesenfestsetzen='$mahnwesenfestsetzen', + internebemerkung='$internebemerkung' + WHERE id='$id' LIMIT 1"); /* } else { $this->app->DB->Update("UPDATE rechnung SET mahnwesen='$mahnwesen', mahnwesenfestsetzen='$mahnwesenfestsetzen', mahnwesen_internebemerkung='$mahnwesen_internebemerkung', mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum' WHERE id='$id' LIMIT 1"); }*/ } + if ($zahlungsstatus == 'bezahlt') { + $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); + $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); + } + + $saldo = $this->app->erp->GetSaldoDokument($id,'rechnung'); + if (empty($saldo)) { + $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); + $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); + } else { + $ist = $this->app->erp->EUR($saldo['betrag']); + $this->app->Tpl->Set('ISTDB',$ist); + if ($ist > $soll) { + $this->app->Tpl->addMessage('error','Rechnung ist überzahlt!'); + } + } + + $rechnung_schnelleingabe_konto = $this->app->erp->Firmendaten('rechnung_schnelleingabe_konto'); + + if (!empty($rechnung_schnelleingabe_konto)) { + $this->app->Tpl->Set('SCHNELLEINGABE_TOOLTIP_HIDDEN', 'hidden'); + if ($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','manuellbezahltmarkiert') && !empty($zahlbetrag)) { + if ($bezahlt_am == '0000-00-00') { + $bezahlt_am = date('Y-m-d'); + } + $sql = " + INSERT INTO kontoauszuege + ( + konto, + buchung, + importdatum, + buchungstext, + soll, + waehrung, + bearbeiter + ) + VALUES + ( + $rechnung_schnelleingabe_konto, + '$bezahlt_am', + '".date("Y-m-d")."', + 'Rechnung ".$nummer." Schnelleingabe', + $zahlbetrag, + 'EUR', + '".$this->app->User->GetName()."' + ) + "; + $this->app->DB->Insert($sql); + $kontoauszug = $this->app->DB->GetInsertID(); + $this->app->erp->fibu_buchungen_buchen("kontoauszuege",$kontoauszug, "rechnung", $id, -$zahlbetrag, 'EUR', $bezahlt_am, "Rechnung ".$nummer." Schnelleingabe"); + $this->rechnung_zahlstatus_berechnen($id); + } + } else { + $this->app->Tpl->Set('SCHNELLEINGABE_HIDDEN', 'hidden'); + } + if($status=='') $this->app->DB->Update("UPDATE rechnung SET status='angelegt' WHERE id='$id' LIMIT 1"); @@ -2749,9 +2814,14 @@ class Rechnung extends GenRechnung * Recalculate the payments status with skonto */ - function rechnung_zahlstatus_berechnen() { + function rechnung_zahlstatus_berechnen($rechnung_id = null) { // START RECALCULATE $this->app->erp->fibu_rebuild_tables(); + + if (!empty($rechnung_id)) { + $condition = " AND id = '".$rechnung_id."'"; + } + $offene_rechnungen = $this->app->DB->SelectArr(" SELECT id, soll, @@ -2768,9 +2838,9 @@ class Rechnung extends GenRechnung rechnung WHERE belegnr <> '' AND zahlungsstatus = 'offen' - "); + ".$condition); - foreach ($offene_rechnungen as $offene_rechnung) { + foreach ($offene_rechnungen as $offene_rechnung) { $saldo = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung'); if (!empty($saldo)) { if ($saldo['waehrung'] == $offene_rechnung['waehrung']) { @@ -2781,12 +2851,13 @@ class Rechnung extends GenRechnung // Check overall value if ($saldo['betrag'] == 0) { // ok -> will be marked as paid - } else if ($skontorelevante_zahlungen >= $offene_rechnung['skontosoll']) { + } else if (abs($skontorelevante_zahlungen-$offene_rechnung['skontosoll']) <= 0.01) { // 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'],date('Y-m-d'),''); + if (!empty($sachkonto)) { + $this->app->erp->fibu_buchungen_buchen('rechnung',$offene_rechnung['id'],'kontorahmen',$sachkonto,$offene_rechnung['soll']-$skontorelevante_zahlungen,$offene_rechnung['waehrung'],date('Y-m-d'),''); $offene_rechnung['ist'] = $offene_rechnung['soll']; + $saldo['betrag'] = 0; } else { } } else if ($offene_rechnung['faellig']) { @@ -2800,7 +2871,7 @@ class Rechnung extends GenRechnung SET ist = ".$saldo['betrag']."+soll, zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen') - WHERE id=".$offene_rechnung['id']; + WHERE id=".$offene_rechnung['id']; $this->app->DB->Update($sql); } } diff --git a/www/widgets/_gen/widget.gen.rechnung.php b/www/widgets/_gen/widget.gen.rechnung.php index 0f20817b..d4f198d4 100644 --- a/www/widgets/_gen/widget.gen.rechnung.php +++ b/www/widgets/_gen/widget.gen.rechnung.php @@ -125,6 +125,9 @@ class WidgetGenrechnung $field = new HTMLInput("bezahlt_am","text","","10","","","","","","","","0","",""); $this->form->NewField($field); + $field = new HTMLInput("zahlbetrag","money","","10","","","","","","","","0","",""); + $this->form->NewField($field); + $field = new HTMLInput("ist","text","","10","","","","","","","","0","",""); $this->form->NewField($field); diff --git a/www/widgets/templates/_gen/rechnung.tpl b/www/widgets/templates/_gen/rechnung.tpl index d6ec54ff..08ce1829 100644 --- a/www/widgets/templates/_gen/rechnung.tpl +++ b/www/widgets/templates/_gen/rechnung.tpl @@ -104,7 +104,9 @@
[MAHNWESENIF]
- {|Zahlungsstatus|} + + {|Zahlungsstatus|}  + @@ -135,6 +137,23 @@
{|Zahlungsstatus|}:
+
+
+ {|Schnelleingabe|} + + + + + + + + + +
{|Bezahlt am|}:[BEZAHLT_AM][MSGBEZAHLT_AM] +
{|Zahlbetrag|}:[ZAHLBETRAG][MSGZAHLBETRAG]
+
+
+ {|Mahnwesen|} diff --git a/www/widgets/widget.rechnung.php b/www/widgets/widget.rechnung.php index 01142b8b..26acf279 100644 --- a/www/widgets/widget.rechnung.php +++ b/www/widgets/widget.rechnung.php @@ -84,6 +84,7 @@ class WidgetRechnung extends WidgetGenRechnung $this->app->erp->AnzeigeAbweichendeBezeichnung("rechnung"); $this->form->ReplaceFunction("ist",$this,"ReplaceDecimal"); + $this->form->ReplaceFunction("zahlbetrag",$this,"ReplaceDecimal"); $this->form->ReplaceFunction("kurs",$this,"ReplaceBetrag"); $this->form->ReplaceFunction("skonto_gegeben",$this,"ReplaceDecimal");
{|Mahnstufe|}: