From a3255065e9fd3fcc9992aab33bc97ecc1087b774 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Thu, 3 Oct 2024 13:43:45 +0200 Subject: [PATCH 1/9] 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"); From 29040e71b5a73193f13b458496f167fe4744b661 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sat, 5 Oct 2024 11:50:25 +0200 Subject: [PATCH 2/9] rechnung schnelleingabe added skonto display --- www/pages/rechnung.php | 7 ++++++- www/widgets/templates/_gen/rechnung.tpl | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/www/pages/rechnung.php b/www/pages/rechnung.php index 623160f4..5656ada0 100644 --- a/www/pages/rechnung.php +++ b/www/pages/rechnung.php @@ -1081,6 +1081,7 @@ class Rechnung extends GenRechnung $intern = true; $freigabe=$intern; } + $allowedFrm = true; $showDefault = true; $this->app->erp->CheckVertrieb($id,'rechnung'); @@ -1096,6 +1097,7 @@ class Rechnung extends GenRechnung if($belegnr=='') { $this->app->erp->BelegFreigabe('rechnung',$id); + $this->rechnung_zahlstatus_berechnen($id); if($intern) { return 1; } @@ -1119,7 +1121,7 @@ class Rechnung extends GenRechnung jetzt freigegeben werden? "); } - + $this->RechnungMenu(); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } @@ -1661,12 +1663,15 @@ class Rechnung extends GenRechnung $bonuspunkte = $rechnungarr['bonuspunkte'];//$this->app->DB->Select("SELECT bonuspunkte FROM rechnung WHERE id='$id' LIMIT 1"); $soll = $rechnungarr['soll'];//$this->app->DB->Select("SELECT soll FROM rechnung WHERE id='$id' LIMIT 1"); $projekt = $rechnungarr['projekt']; + + $skontosoll = $this->app->DB->Select("SELECT TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll FROM rechnung where id = '".$id."' LIMIT 1"); } $this->app->Tpl->Set('PUNKTE',""); $this->app->Tpl->Set('BONUSPUNKTE',""); $this->app->Tpl->Set('SOLL',"$soll".""); + $this->app->Tpl->Set('SKONTOSOLL',$skontosoll); if($schreibschutz!='1')// && $this->app->erp->RechteVorhanden("rechnung","schreibschutz")) { diff --git a/www/widgets/templates/_gen/rechnung.tpl b/www/widgets/templates/_gen/rechnung.tpl index 08ce1829..2745e0b3 100644 --- a/www/widgets/templates/_gen/rechnung.tpl +++ b/www/widgets/templates/_gen/rechnung.tpl @@ -121,15 +121,23 @@ - + + + + - From 1f7b1af1f196741cf096ef1113e1f7de95d08ba6 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Mon, 14 Oct 2024 18:55:46 +0200 Subject: [PATCH 3/9] mahnwesen added tabs --- www/pages/content/mahnwesen_list.tpl | 1 - www/pages/mahnwesen.php | 149 ++++++++++++++++----------- 2 files changed, 86 insertions(+), 64 deletions(-) diff --git a/www/pages/content/mahnwesen_list.tpl b/www/pages/content/mahnwesen_list.tpl index c55980bd..c2ae4a75 100644 --- a/www/pages/content/mahnwesen_list.tpl +++ b/www/pages/content/mahnwesen_list.tpl @@ -30,7 +30,6 @@ - diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index b93ca08a..62f8ea0b 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -40,6 +40,8 @@ class Mahnwesen { // columns that are aligned right (numbers etc) // $alignright = array(4,5,6,7,8); + $mahnwesen_stufe_filter = $this->app->DB->real_escape_string($this->app->User->GetParameter('mahnwesen_stufe_filter')); + $faellig_datum = "DATE_ADD(r.datum, INTERVAL r.zahlungszieltage DAY)"; $faellig_tage = "DATEDIFF(CURRENT_DATE,DATE_ADD(r.datum, INTERVAL r.zahlungszieltage DAY))"; $mahn_druck = "if(m.druck,'Ja','')"; @@ -56,6 +58,8 @@ class Mahnwesen { $menu = "
{|Mahnstufe|}: {|SOLL|}: + [SOLL]
+ {|SKONTOSOLL|}: + + [SKONTOSOLL] +
{|FEHLT|}: + [ISTDB]
" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">" . "
"; + $sql_tables = "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 LEFT JOIN mahnwesen m ON r.mahnwesen = m.id"; + $sql = "SELECT SQL_CALC_FOUND_ROWS r.id, $dropnbox, @@ -81,9 +85,13 @@ class Mahnwesen { if(r.mahnwesen_gesperrt,'Ja',''), REPLACE(r.mahnwesen_internebemerkung,'\r\n','
'), 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 LEFT JOIN mahnwesen m ON r.mahnwesen = m.id"; + FROM ".$sql_tables; $where = " r.belegnr <> ''"; + + if (!empty($mahnwesen_stufe_filter)) { + $where .= " AND m.id = '".$mahnwesen_stufe_filter."'"; + } // Toggle filters $this->app->Tpl->Add('JQUERYREADY', "$('#zu_mahnen').click( function() { fnFilterColumn1( 0 ); } );"); @@ -126,8 +134,7 @@ class Mahnwesen { } // END Toggle filters - - $count = "SELECT count(DISTINCT id) FROM rechnung r WHERE $where"; + $count = "SELECT count(DISTINCT r.id) FROM ".$sql_tables." WHERE $where"; // $groupby = ""; break; @@ -178,66 +185,6 @@ class Mahnwesen { function mahnwesen_list() { $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list", "Übersicht"); -// $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=create", "Neu anlegen"); -// $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=einstellungen", "Einstellungen"); - - if($this->app->Secure->GetPOST('mahnstufe_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { - $this->app->erp->rechnung_zahlstatus_berechnen(); - - $sql = " - SELECT - r.id, r.mahnwesen, rid_mid.mahnwesen_neu - FROM - rechnung r - INNER JOIN - ( - SELECT - id_tage.id, - m.id AS mahnwesen_neu - FROM - mahnwesen m - INNER JOIN( - SELECT - id, - MAX(tage) AS tage - FROM - ( - SELECT - r.id, - m.tage - FROM - rechnung r - INNER JOIN mahnwesen m ON - DATEDIFF( - CURRENT_DATE, - DATE_ADD( - r.datum, - INTERVAL r.zahlungszieltage DAY - ) - ) > m.tage - WHERE - r.zahlungsstatus = 'offen' - ORDER BY - `r`.`id` ASC - ) temp - GROUP BY - id - ) id_tage - ON - m.tage = id_tage.tage - ) rid_mid - ON r.id = rid_mid.id - "; - $offene_rechnungen = $this->app->DB->SelectArr($sql); - - foreach ($offene_rechnungen as $offene_rechnung) { - if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) { - $sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id']; - $this->app->DB->Update($sql); - } - } - - } if($this->app->Secure->GetPOST('sel_aktion') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { @@ -354,6 +301,76 @@ class Mahnwesen { } } // ende ausfuehren + // Refresh status and create tabs + $this->app->erp->rechnung_zahlstatus_berechnen(); + $sql = " + SELECT + r.id, + r.mahnwesen, + r.versendet_mahnwesen, + rid_mid.mahnwesen_neu, + rid_mid.name + FROM + rechnung r + INNER JOIN + ( + SELECT + id_tage.id, + m.id AS mahnwesen_neu, + m.name, + m.tage + FROM + mahnwesen m + INNER JOIN( + SELECT + id, + MAX(tage) AS tage + FROM + ( + SELECT + r.id, + m.tage + FROM + rechnung r + INNER JOIN mahnwesen m ON + DATEDIFF( + CURRENT_DATE, + DATE_ADD( + r.datum, + INTERVAL r.zahlungszieltage DAY + ) + ) > m.tage + WHERE + r.zahlungsstatus = 'offen' + ORDER BY + `r`.`id` ASC + ) temp + GROUP BY + id + ) id_tage + ON + m.tage = id_tage.tage + ) rid_mid + ON r.id = rid_mid.id + WHERE mahnwesen <> mahnwesen_neu OR versendet_mahnwesen = 0 + ORDER BY rid_mid.tage + "; + $offene_rechnungen = $this->app->DB->SelectArr($sql); + + $menus = array(); + + foreach ($offene_rechnungen as $offene_rechnung) { + if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) { + $sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id']; + $this->app->DB->Update($sql); + } + + if (!in_array($offene_rechnung['mahnwesen_neu'],$menus) && count($menus) < 5) { + $menus[] = $offene_rechnung['mahnwesen_neu']; + $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list&stufe=".$offene_rechnung['mahnwesen_neu'], $this->app->DB->real_escape_string($offene_rechnung['name'])); + } + } + if (!empty($msg)) { $this->app->Tpl->Set('MESSAGE', $msg); } @@ -364,6 +381,12 @@ class Mahnwesen { $this->app->Tpl->Set('SELDRUCKER', $this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker'))); + $mahnwesen_stufe_filter = $this->app->Secure->GetGET('stufe'); + $this->app->User->SetParameter('mahnwesen_stufe_filter', $mahnwesen_stufe_filter); + if (!empty($mahnwesen_stufe_filter)) { + $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"Stufe: ".$this->app->DB->Select("SELECT name FROM mahnwesen WHERE id = ".$mahnwesen_stufe_filter." LIMIT 1")); + } + $this->app->YUI->TableSearch('TAB1', 'mahnwesen_list', "show", "", "", basename(__FILE__), __CLASS__); $this->app->Tpl->Parse('PAGE', "mahnwesen_list.tpl"); } From bf242623c43f1d512000ca2aaf1367369ceb2015 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Tue, 15 Oct 2024 15:31:21 +0200 Subject: [PATCH 4/9] mahnwesen bugfix tab logic --- www/pages/content/mahnwesen_list.tpl | 2 +- www/pages/mahnwesen.php | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/www/pages/content/mahnwesen_list.tpl b/www/pages/content/mahnwesen_list.tpl index c2ae4a75..7dc32262 100644 --- a/www/pages/content/mahnwesen_list.tpl +++ b/www/pages/content/mahnwesen_list.tpl @@ -4,7 +4,7 @@
-
+
{|Filter|}
    diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index 62f8ea0b..e2c24952 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -14,7 +14,8 @@ class Mahnwesen { return; $this->app->ActionHandlerInit($this); - $this->app->ActionHandler("list", "mahnwesen_list"); + $this->app->ActionHandler("list", "mahnwesen_list"); + $this->app->ActionHandler("stufe_list", "mahnwesen_stufe_list"); $this->app->ActionHandler("create", "mahnwesen_edit"); // This automatically adds a "New" button $this->app->ActionHandler("edit", "mahnwesen_edit"); $this->app->ActionHandler("einstellungen", "mahnwesen_einstellungen"); @@ -90,7 +91,7 @@ class Mahnwesen { $where = " r.belegnr <> ''"; if (!empty($mahnwesen_stufe_filter)) { - $where .= " AND m.id = '".$mahnwesen_stufe_filter."'"; + $where .= " AND m.id = '".$mahnwesen_stufe_filter."' AND r.versendet_mahnwesen "; } // Toggle filters @@ -116,7 +117,7 @@ class Mahnwesen { } $more_data1 = $app->Secure->GetGET("more_data1"); - if ($more_data1 == 1) { + if ($more_data1 == 1 && empty($mahnwesen_stufe_filter)) { $where .= " AND NOT r.versendet_mahnwesen AND r.mahnwesen <> ''"; } else { } @@ -182,6 +183,11 @@ class Mahnwesen { } return $erg; } + + // For Tab-highlighting + function mahnwesen_stufe_list() { + $this->mahnwesen_list(); + } function mahnwesen_list() { $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list", "Übersicht"); @@ -351,8 +357,7 @@ class Mahnwesen { ON m.tage = id_tage.tage ) rid_mid - ON r.id = rid_mid.id - WHERE mahnwesen <> mahnwesen_neu OR versendet_mahnwesen = 0 + ON r.id = rid_mid.id ORDER BY rid_mid.tage "; $offene_rechnungen = $this->app->DB->SelectArr($sql); @@ -365,9 +370,9 @@ class Mahnwesen { $this->app->DB->Update($sql); } - if (!in_array($offene_rechnung['mahnwesen_neu'],$menus) && count($menus) < 5) { + if (!in_array($offene_rechnung['mahnwesen_neu'],$menus) && ($offene_rechnung['versendet_mahnwesen']) && count($menus) < 5) { $menus[] = $offene_rechnung['mahnwesen_neu']; - $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list&stufe=".$offene_rechnung['mahnwesen_neu'], $this->app->DB->real_escape_string($offene_rechnung['name'])); + $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=stufe_list&stufe=".$offene_rechnung['mahnwesen_neu'], $this->app->DB->real_escape_string($offene_rechnung['name'])); } } @@ -385,6 +390,7 @@ class Mahnwesen { $this->app->User->SetParameter('mahnwesen_stufe_filter', $mahnwesen_stufe_filter); if (!empty($mahnwesen_stufe_filter)) { $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"Stufe: ".$this->app->DB->Select("SELECT name FROM mahnwesen WHERE id = ".$mahnwesen_stufe_filter." LIMIT 1")); + $this->app->Tpl->Set('ZU_MAHNEN_HIDDEN', 'hidden'); } $this->app->YUI->TableSearch('TAB1', 'mahnwesen_list', "show", "", "", basename(__FILE__), __CLASS__); From 943bac22a30d78660bff7088e201f9e122add68b Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 16 Oct 2024 14:24:13 +0200 Subject: [PATCH 5/9] mahnwesen changed tab behaviour, tabs always visible with counter --- www/pages/mahnwesen.php | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index e2c24952..3a2d675a 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -361,19 +361,41 @@ class Mahnwesen { ORDER BY rid_mid.tage "; $offene_rechnungen = $this->app->DB->SelectArr($sql); - - $menus = array(); - + foreach ($offene_rechnungen as $offene_rechnung) { if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) { $sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id']; $this->app->DB->Update($sql); - } - - if (!in_array($offene_rechnung['mahnwesen_neu'],$menus) && ($offene_rechnung['versendet_mahnwesen']) && count($menus) < 5) { - $menus[] = $offene_rechnung['mahnwesen_neu']; - $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=stufe_list&stufe=".$offene_rechnung['mahnwesen_neu'], $this->app->DB->real_escape_string($offene_rechnung['name'])); - } + } + } + + $menus = $this->app->DB->SelectArr(" + SELECT + m.id mahnung, + m.name, + SUM(if(r.versendet_mahnwesen = 1,1,0)) anzahl + FROM + mahnwesen m + LEFT JOIN rechnung r ON + m.id = r.mahnwesen + WHERE + r.id IS NULL OR + ( + r.zahlungsstatus <> 'bezahlt' AND + r.mahnwesen_gesperrt <> 1 + ) + GROUP BY + m.id + ORDER BY + m.tage ASC + "); + + foreach ($menus as $menu) { + $suffix = ""; + if ($menu['anzahl']) { + $suffix = " (".$menu['anzahl'].")"; + } + $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=stufe_list&stufe=".$menu['mahnung'], $this->app->DB->real_escape_string($menu['name']).$suffix); } if (!empty($msg)) { From 69ef3d4ed63fe232119c79027f2c1bebc3acd5d9 Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 18 Oct 2024 18:41:17 +0200 Subject: [PATCH 6/9] auftrag refresh only open items --- www/pages/auftrag.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 1436153c..8dc72a09 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -6690,7 +6690,7 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. { // refresh all open items - $openids = $this->app->DB->SelectArr("SELECT id from auftrag WHERE status <> 'abgeschlossen'"); + $openids = $this->app->DB->SelectArr("SELECT id from auftrag WHERE status <>'abgeschlossen' and status <>'storniert' and status <>'angelegt'"); foreach ($openids as $openid) { $this->app->erp->AuftragAutoversandBerechnen($openid['id']); } From d92105316e339e9ca1dd68552a0e84b0ad3affed Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Fri, 18 Oct 2024 18:55:37 +0200 Subject: [PATCH 7/9] mahnwesen exclude cancelled items --- www/pages/mahnwesen.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index 3a2d675a..fea96a0d 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -88,7 +88,7 @@ class Mahnwesen { r.id FROM ".$sql_tables; - $where = " r.belegnr <> ''"; + $where = " r.belegnr <> '' AND r.status <> 'storniert'"; if (!empty($mahnwesen_stufe_filter)) { $where .= " AND m.id = '".$mahnwesen_stufe_filter."' AND r.versendet_mahnwesen "; From 05d7a394b4ede297e1e92d5d8164d6060782fc7a Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Sun, 20 Oct 2024 13:59:56 +0200 Subject: [PATCH 8/9] mahnwesen refresh status button reinstated --- www/pages/content/mahnwesen_list.tpl | 1 + www/pages/mahnwesen.php | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/www/pages/content/mahnwesen_list.tpl b/www/pages/content/mahnwesen_list.tpl index 7dc32262..4bbe9056 100644 --- a/www/pages/content/mahnwesen_list.tpl +++ b/www/pages/content/mahnwesen_list.tpl @@ -30,6 +30,7 @@
+
diff --git a/www/pages/mahnwesen.php b/www/pages/mahnwesen.php index fea96a0d..61d48e44 100644 --- a/www/pages/mahnwesen.php +++ b/www/pages/mahnwesen.php @@ -307,8 +307,12 @@ class Mahnwesen { } } // ende ausfuehren - // Refresh status and create tabs - $this->app->erp->rechnung_zahlstatus_berechnen(); + // Refresh status + if($this->app->Secure->GetPOST('mahnstufe_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) { + $this->app->erp->rechnung_zahlstatus_berechnen(); + } + + // Create tabs $sql = " SELECT r.id, From 3178f12821024d2bebd9960939959747889f551e Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Mon, 21 Oct 2024 20:09:25 +0200 Subject: [PATCH 9/9] auftrag refresh on list only when no cronjob is set --- www/pages/auftrag.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php index 8dc72a09..df5f3517 100644 --- a/www/pages/auftrag.php +++ b/www/pages/auftrag.php @@ -6689,12 +6689,14 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '. public function AuftragList() { - // refresh all open items - $openids = $this->app->DB->SelectArr("SELECT id from auftrag WHERE status <>'abgeschlossen' and status <>'storniert' and status <>'angelegt'"); - foreach ($openids as $openid) { - $this->app->erp->AuftragAutoversandBerechnen($openid['id']); - } - + // refresh all open items if no cronjob is set + if (!$this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'autoversand_berechnung' AND aktiv = 1 LIMIT 1")) { + $openids = $this->app->DB->SelectArr("SELECT id from auftrag WHERE status <>'abgeschlossen' and status <>'storniert' and status <>'angelegt'"); + foreach ($openids as $openid) { + $this->app->erp->AuftragAutoversandBerechnen($openid['id']); + } + } + if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('auftrag', 'edit')) { $drucker = $this->app->Secure->GetPOST('seldrucker');