Files
adminandClaude Opus 5 e2124220e5 Initialer Commit: Kundenverwaltung (PHP/Smarty)
Bestehende Codebasis als Ausgangsstand aufgenommen.

- .gitignore: Kundendaten (uploads_*), Smarty-Compile-Cache
  (templates_c), Laufzeit-Temp und Datenbank-Dumps ausgeschlossen;
  Verzeichnisstruktur ueber .gitkeep erhalten
- .gitattributes: Zeilenenden normalisiert (LF im Repo),
  Binaerformate markiert
- db-backup.php: MySQL-Zugangsdaten kommen jetzt wie im Rest der
  Anwendung aus der externen Konfiguration statt hartkodiert aus der
  Datei; Passwort wird ueber eine temporaere Optionsdatei statt per
  Kommandozeile uebergeben, Fehler von mysqldump/gzip werden gemeldet,
  Aufraeumen aelterer Backups berechnet Jahr und Monat konsistent

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:41:18 +02:00

362 lines
18 KiB
PHP

<?php
require_once ("./incs/rechnung.php");
$smarty->assign("heading","Steuerexport");
$smarty->display("heading.tpl");
if($_GET["do"] == "generate"){
echo "Generating...";
$month = mysql_escape_string($_POST["month"]);
//RECHNUNGEN
$qry = mysqli_query($dbconn,"SELECT rechnung.adressfields AS adressfields, adresserweiterung, rechnung.id AS rech, ort.plz AS plz, adresse.nname2 AS nname2, adresse.vname2 AS vname2, adresse.nname AS nname, adresse.vname AS vname, adresse.firma AS firma, rechnung. rechnr AS rechnr, DATE_FORMAT(rechnung.datetime,'%d.%m.') AS date, rechnung.partner_id as kundennr, buchungsKontos.kto as buchungsKto
FROM rechnung
JOIN adresse ON rechnung.adresse_id = adresse.id
JOIN strasse ON adresse.str_id = strasse.id
JOIN ort ON ort.id = strasse.ort_id
JOIN wahrung ON wahrung_id = wahrung.id
JOIN rechtyp ON rechnung.typ_id = rechtyp.id
JOIN zahlziel ON zahlziel_id = zahlziel.id
JOIN mwst ON mwst_id = mwst.id
JOIN user ON user_id = user.id
JOIN buchungsKontos ON buchungsKto_id = buchungsKontos.id
WHERE rechnung.typ_id = 1 AND DATE_FORMAT(rechnung.datetime, '%Y%m') = '".$month."' ORDER BY rechnung.datetime DESC") or error(mysqli_error($dbconn));
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
$fhandle = fopen("./temp/pdftemp/$tmppdfname.csv","w");
fwrite($fhandle,"Umsatz (ohne Soll/Haben-Kz);Soll/Haben-Kennzeichen;WKZ Umsatz;Kurs;Basis-Umsatz;WKZ Basis-Umsatz;Konto;Gegenkonto (ohne BU-Schlüssel);BU-Schlüssel;Belegdatum;Belegfeld 1;Belegfeld 2;Skonto;Buchungstext;Postensperre;Diverse Adressnummer;Geschäftspartnerbank;Sachverhalt;Zinssperre;Beleglink;Beleginfo - Art 1;Beleginfo - Inhalt 1;Beleginfo - Art 2;Beleginfo - Inhalt 2;Beleginfo - Art 3;Beleginfo - Inhalt 3;Beleginfo - Art 4;Beleginfo - Inhalt 4;Beleginfo - Art 5;Beleginfo - Inhalt 5;Beleginfo - Art 6;Beleginfo - Inhalt 6;Beleginfo - Art 7;Beleginfo - Inhalt 7;Beleginfo - Art 8;Beleginfo - Inhalt 8;KOST1 - Kostenstelle;KOST2 - Kostenstelle;Kost-Menge;EU-Land u. UStID;EU-Steuersatz;Abw. Versteuerungsart;Sachverhalt L+L;Funktionsergänzung L+L;BU 49 Hauptfunktionstyp;BU 49 Hauptfunktionsnummer;BU 49 Funktionsergänzung;Zusatzinformation - Art 1;Zusatzinformation- Inhalt 1;Zusatzinformation - Art 2;Zusatzinformation- Inhalt 2;Zusatzinformation - Art 3;Zusatzinformation- Inhalt 3;Zusatzinformation - Art 4;Zusatzinformation- Inhalt 4;Zusatzinformation - Art 5;Zusatzinformation- Inhalt 5;Zusatzinformation - Art 6;Zusatzinformation- Inhalt 6;Zusatzinformation - Art 7;Zusatzinformation- Inhalt 7;Zusatzinformation - Art 8;Zusatzinformation- Inhalt 8;Zusatzinformation - Art 9;Zusatzinformation- Inhalt 9;Zusatzinformation - Art 10;Zusatzinformation- Inhalt 10;Zusatzinformation - Art 11;Zusatzinformation- Inhalt 11;Zusatzinformation - Art 12;Zusatzinformation- Inhalt 12;Zusatzinformation - Art 13;Zusatzinformation- Inhalt 13;Zusatzinformation - Art 14;Zusatzinformation- Inhalt 14;Zusatzinformation - Art 15;Zusatzinformation- Inhalt 15;Zusatzinformation - Art 16;Zusatzinformation- Inhalt 16;Zusatzinformation - Art 17;Zusatzinformation- Inhalt 17;Zusatzinformation - Art 18;Zusatzinformation- Inhalt 18;Zusatzinformation - Art 19;Zusatzinformation- Inhalt 19;Zusatzinformation - Art 20;Zusatzinformation- Inhalt 20;Stück;Gewicht;Zahlweise;Forderungsart;Veranlagungsjahr;Zugeordnete Fälligkeit;Skontotyp;Auftragsnummer;Buchungstyp;Ust-Schlüssel (Anzahlungen);EU-Land (Anzahlungen);Sachverhalt L+L (Anzahlungen);EU-Steuersatz (Anzahlungen);Erlöskonto (Anzahlungen);Herkunft-Kz;Buchungs GUID;KOST-Datum;Mandatsreferenz\r\n");
while($res = mysqli_fetch_assoc($qry))
{
$adressfields= $res["adressfields"];
if($adresse["sks"])
$adressfields = "011111111100";
$firmaanr = substr($adressfields,ADRFIELD_FIRMAANR,1);
$firma = substr($adressfields,ADRFIELD_FIRMA,1);
$anr1 = substr($adressfields,ADRFIELD_ANR1,1);
$titel1 = substr($adressfields,ADRFIELD_TITEL1,1);
$name1 = substr($adressfields,ADRFIELD_NAME1,1);
$anr2 = substr($adressfields,ADRFIELD_ANR2,1);
$titel2 = substr($adressfields,ADRFIELD_TITEL2,1);
$name2 = substr($adressfields,ADRFIELD_NAME2,1);
$str = substr($adressfields,ADRFIELD_STR,1);
$ort = substr($adressfields,ADRFIELD_ORT,1);
$land = substr($adressfields,ADRFIELD_LAND,1);
$zusatz = substr($adressfields,ADRFIELD_ZUSATZ,1);
$qry2 = mysqli_query($dbconn,"SELECT artikel.bezeichn as bezeichn, preis, wanr, posnr, pagebreak, rabatt, rabatttyp, artikeltyp.bezeichn AS typ, typ_id, menge, angtyp, artikel.id as id
FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id
JOIN artikel_rechn ON artikel.id = art_id
WHERE rech_id = ".$res["rech"]." AND artikel.bezeichn NOT LIKE '%Arbeitswert%' AND artikel.bezeichn NOT LIKE '%Wegewert%' AND artikel.bezeichn NOT LIKE '%Fahrt%' AND artikel.bezeichn NOT LIKE '%Kfz-%' ORDER BY preis DESC LIMIT 1") or error(mysqli_error($dbconn));
if(mysqli_num_rows($qry2) < 1){
$res2["bezeichn"] = "Reparatur";
}
else{
$res2 = mysqli_fetch_assoc($qry2);
if(trim($res2["bezeichn"]) == "")
$res2["bezeichn"] = "Reparatur";
else if(strstr(strtolower($res2["bezeichn"]),"ladengurt") or strstr(strtolower($res2["bezeichn"]),"dämmfeder"))
$res2["bezeichn"] = "Rolladenreparatur";
else if(strstr(strtolower($res2["bezeichn"]),"textband"))
$res2["bezeichn"] = "Jalousienreparatur";
}
$res["drechnr"] = substr($res["rechnr"],0,4)."-".substr($res["rechnr"],4,2)."-".substr($res["rechnr"],6,2).substr($res["rechnr"],8,2);
$res["drechnr"] = $res["drechnr"];
$sumincl = calculateRechnungsSum($dbconn, $res["rech"],1);
$adrstr = trim($res["adresserweiterung"]);
if($firma && trim($res["firma"]))
{
$adrstr .= trim($res["firma"]);
}
elseif( $name1 && !$name2)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
elseif( $name2 && !$name1)
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
else
{
if($name1)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
if(trim($name2))
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
}
fwrite($fhandle,number_format($sumincl,2,",",".").";H;;;;;".$res["buchungsKto"].";1210;;".$res["date"].";".$res["drechnr"].";;;".$res["kundennr"]." - ".$adrstr.";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RE;;;104040000001\r\n");
}
//STORNOS
$qry = mysqli_query($dbconn,"SELECT rechnung.adressfields AS adressfields, adresserweiterung, rechnung.id AS rech, ort.plz AS plz, adresse.nname2 AS nname2, adresse.vname2 AS vname2, adresse.nname AS nname, adresse.vname AS vname, adresse.firma AS firma, rechnung. rechnr AS rechnr, DATE_FORMAT(rechnung.stornodate,'%d.%m.') AS date, rechnung.partner_id as kundennr, buchungsKontos.kto as buchungsKto
FROM rechnung
JOIN adresse ON rechnung.adresse_id = adresse.id
JOIN strasse ON adresse.str_id = strasse.id
JOIN ort ON ort.id = strasse.ort_id
JOIN wahrung ON wahrung_id = wahrung.id
JOIN rechtyp ON rechnung.typ_id = rechtyp.id
JOIN zahlziel ON zahlziel_id = zahlziel.id
JOIN mwst ON mwst_id = mwst.id
JOIN user ON user_id = user.id
JOIN buchungsKontos ON buchungsKto_id = buchungsKontos.id
WHERE rechnung.typ_id = 1 AND DATE_FORMAT(rechnung.stornodate, '%Y%m') = '".$month."' AND storno = 1 ORDER BY rechnung.stornodate DESC") or error(mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$adressfields= $res["adressfields"];
if($adresse["sks"])
$adressfields = "011111111100";
$firmaanr = substr($adressfields,ADRFIELD_FIRMAANR,1);
$firma = substr($adressfields,ADRFIELD_FIRMA,1);
$anr1 = substr($adressfields,ADRFIELD_ANR1,1);
$titel1 = substr($adressfields,ADRFIELD_TITEL1,1);
$name1 = substr($adressfields,ADRFIELD_NAME1,1);
$anr2 = substr($adressfields,ADRFIELD_ANR2,1);
$titel2 = substr($adressfields,ADRFIELD_TITEL2,1);
$name2 = substr($adressfields,ADRFIELD_NAME2,1);
$str = substr($adressfields,ADRFIELD_STR,1);
$ort = substr($adressfields,ADRFIELD_ORT,1);
$land = substr($adressfields,ADRFIELD_LAND,1);
$zusatz = substr($adressfields,ADRFIELD_ZUSATZ,1);
$adrstr = trim($res["adresserweiterung"]);
if($firma && trim($res["firma"]))
{
$adrstr .= trim($res["firma"]);
}
elseif( $name1 && !$name2)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
elseif( $name2 && !$name1)
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
else
{
if($name1)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
if(trim($name2))
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
}
$qry2 = mysqli_query($dbconn,"SELECT artikel.bezeichn as bezeichn, preis, wanr, posnr, pagebreak, rabatt, rabatttyp, artikeltyp.bezeichn AS typ, typ_id, menge, angtyp, artikel.id as id
FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id
JOIN artikel_rechn ON artikel.id = art_id
WHERE rech_id = ".$res["rech"]." AND artikel.bezeichn NOT LIKE '%Arbeitswert%' AND artikel.bezeichn NOT LIKE '%Wegewert%' AND artikel.bezeichn NOT LIKE '%Fahrt%' AND artikel.bezeichn NOT LIKE '%Kfz-%' ORDER BY preis DESC LIMIT 1") or error(mysqli_error($dbconn));
if(mysqli_num_rows($qry2) < 1){
$res2["bezeichn"] = "Reparatur";
}
else{
$res2 = mysqli_fetch_assoc($qry2);
if(trim($res2["bezeichn"]) == "")
$res2["bezeichn"] = "Reparatur";
else if(strstr(strtolower($res2["bezeichn"]),"ladengurt") or strstr(strtolower($res2["bezeichn"]),"dämmfeder"))
$res2["bezeichn"] = "Rolladenreparatur";
else if(strstr(strtolower($res2["bezeichn"]),"textband"))
$res2["bezeichn"] = "Jalousienreparatur";
}
$res["drechnr"] = substr($res["rechnr"],0,4)."-".substr($res["rechnr"],4,2)."-".substr($res["rechnr"],6,2).substr($res["rechnr"],8,2);
$res["drechnr"] = $res["drechnr"];
$sumincl = calculateRechnungsSum($dbconn, $res["rech"],1);
fwrite($fhandle,number_format($sumincl,2,",",".").";H;;;;;1210;".$res["buchungsKto"].";;".$res["date"].";".$res["drechnr"].";;;".$res["kundennr"]." - ".$adrstr.";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RE;;;104040000001\r\n");
}
//GUTSCHRIFTEN
$qry = mysqli_query($dbconn,"SELECT rechnung.adressfields AS adressfields, adresserweiterung, rechnung.id AS rech, ort.plz AS plz, adresse.nname2 AS nname2, adresse.vname2 AS vname2, adresse.nname AS nname, adresse.vname AS vname, adresse.firma AS firma, rechnung. rechnr AS rechnr, DATE_FORMAT(rechnung.datetime,'%d.%m.') AS date, rechnung.partner_id as kundennr
FROM rechnung
JOIN adresse ON rechnung.adresse_id = adresse.id
JOIN strasse ON adresse.str_id = strasse.id
JOIN ort ON ort.id = strasse.ort_id
JOIN wahrung ON wahrung_id = wahrung.id
JOIN rechtyp ON rechnung.typ_id = rechtyp.id
JOIN zahlziel ON zahlziel_id = zahlziel.id
JOIN mwst ON mwst_id = mwst.id
JOIN user ON user_id = user.id
WHERE rechnung.typ_id = 2 AND DATE_FORMAT(rechnung.datetime, '%Y%m') = '".$month."' ORDER BY rechnung.datetime DESC") or error(mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$adressfields= $res["adressfields"];
if($adresse["sks"])
$adressfields = "011111111100";
$firmaanr = substr($adressfields,ADRFIELD_FIRMAANR,1);
$firma = substr($adressfields,ADRFIELD_FIRMA,1);
$anr1 = substr($adressfields,ADRFIELD_ANR1,1);
$titel1 = substr($adressfields,ADRFIELD_TITEL1,1);
$name1 = substr($adressfields,ADRFIELD_NAME1,1);
$anr2 = substr($adressfields,ADRFIELD_ANR2,1);
$titel2 = substr($adressfields,ADRFIELD_TITEL2,1);
$name2 = substr($adressfields,ADRFIELD_NAME2,1);
$str = substr($adressfields,ADRFIELD_STR,1);
$ort = substr($adressfields,ADRFIELD_ORT,1);
$land = substr($adressfields,ADRFIELD_LAND,1);
$zusatz = substr($adressfields,ADRFIELD_ZUSATZ,1);
$adrstr = trim($res["adresserweiterung"]);
if($firma && trim($res["firma"]))
{
$adrstr .= trim($res["firma"]);
}
elseif( $name1 && !$name2)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
elseif( $name2 && !$name1)
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
else
{
if($name1)
{
if($res["vname"])
$adrstr .= trim($res["vname"])." ".trim($res["nname"]);
else
$adrstr .= trim($res["nname"]);
}
if(trim($name2))
{
if($res["vname2"])
$adrstr .= trim($res["vname2"])." ".trim($res["nname2"]);
else
$adrstr .= trim($res["nname2"]);
}
}
$qry2 = mysqli_query($dbconn,"SELECT artikel.bezeichn as bezeichn, preis, wanr, posnr, pagebreak, rabatt, rabatttyp, artikeltyp.bezeichn AS typ, typ_id, menge, angtyp, artikel.id as id
FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id
JOIN artikel_rechn ON artikel.id = art_id
WHERE rech_id = ".$res["rech"]." AND artikel.bezeichn NOT LIKE '%Arbeitswert%' AND artikel.bezeichn NOT LIKE '%Wegewert%' AND artikel.bezeichn NOT LIKE '%Fahrt%' AND artikel.bezeichn NOT LIKE '%Kfz-%' ORDER BY preis DESC LIMIT 1") or error(mysqli_error($dbconn));
if(mysqli_num_rows($qry2) < 1){
$res2["bezeichn"] = "Reparatur";
}
else{
$res2 = mysqli_fetch_assoc($qry2);
if(trim($res2["bezeichn"]) == "")
$res2["bezeichn"] = "Reparatur";
else if(strstr(strtolower($res2["bezeichn"]),"ladengurt") or strstr(strtolower($res2["bezeichn"]),"dämmfeder"))
$res2["bezeichn"] = "Rolladenreparatur";
else if(strstr(strtolower($res2["bezeichn"]),"textband"))
$res2["bezeichn"] = "Jalousienreparatur";
}
$res["drechnr"] = substr($res["rechnr"],0,4)."-".substr($res["rechnr"],4,2)."-".substr($res["rechnr"],6,2).substr($res["rechnr"],8,2);
$res["drechnr"] = $res["drechnr"];
$sumincl = calculateRechnungsSum($dbconn, $res["rech"],1);
fwrite($fhandle,number_format($sumincl,2,",",".").";H;;;;;1210;4400;;".$res["date"].";".$res["drechnr"].";;;".$res["kundennr"]." - ".$adrstr.";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RE;;;104040000001\r\n");
}
fclose($fhandle);
echo "<a class='noloading' href='./temp/pdftemp/$tmppdfname.csv'>Öffnen</a><br />";
}
else{
for ($i=0; $i<12; $i++){
$monthID[$i] = date("Ym",strtotime("-".$i." month") );
$monthname[$i] = date("M Y",strtotime("-".$i." month"));
}
$smarty->assign('month_ids', $monthID);
$smarty->assign('month_names', $monthname);
$smarty->assign('curr_month_id', $monthID[0]);
$sum = 0;
$sumincl = 0;
$qry = mysqli_query($dbconn,"SELECT rechnung.id AS rech, ort.plz AS plz FROM rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON adresse.str_id = strasse.id JOIN ort ON ort.id = strasse.ort_id WHERE rechnung.typ_id = 1 AND ort.plz = '87509' AND DATE_FORMAT(rechnung.datetime, '%Y') = '".date("Y",strtotime("-0 year"))."'") or error(mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$sumincl += calculateRechnungsSum($dbconn, $res["rech"],1);
$sum += calculateRechnungsSum($dbconn, $res["rech"],0);
}
$smarty->assign("ffincl0",$sumincl);
$smarty->assign("ffexcl0",$sum);
$sum = 0;
$sumincl = 0;
$qry = mysqli_query($dbconn,"SELECT rechnung.id AS rech, ort.plz AS plz FROM rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON adresse.str_id = strasse.id JOIN ort ON ort.id = strasse.ort_id WHERE rechnung.typ_id = 1 AND ort.plz = '87509' AND DATE_FORMAT(rechnung.datetime, '%Y') = '".date("Y",strtotime("-1 year"))."'") or error(mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$sumincl += calculateRechnungsSum($dbconn, $res["rech"],1);
$sum += calculateRechnungsSum($dbconn, $res["rech"],0);
}
$smarty->assign("ffincl1",$sumincl);
$smarty->assign("ffexcl1",$sum);
$sum = 0;
$sumincl = 0;
$qry = mysqli_query($dbconn,"SELECT rechnung.id AS rech, ort.plz AS plz FROM rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON adresse.str_id = strasse.id JOIN ort ON ort.id = strasse.ort_id WHERE rechnung.typ_id = 1 AND ort.plz = '87509' AND DATE_FORMAT(rechnung.datetime, '%Y') = '".date("Y",strtotime("-2 years"))."'") or error(mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$sumincl += calculateRechnungsSum($dbconn, $res["rech"],1);
$sum += calculateRechnungsSum($dbconn, $res["rech"],0);
}
$smarty->assign("ffincl2",$sumincl);
$smarty->assign("ffexcl2",$sum);
$sum = 0;
$completesum = 0;
$partners = array();
$qry = mysqli_query($dbconn,"SELECT GROUP_CONCAT(rechnung.id SEPARATOR ',') AS rechs, partner_id FROM rechnung RIGHT OUTER JOIN partner ON partner_id = partner.id WHERE rechnung.typ_id = 1 AND DATE_FORMAT(rechnung.datetime, '%Y') = '".date("Y",strtotime("-0 year"))."' GROUP BY partner_id");
while($res = mysqli_fetch_assoc($qry))
{
$rechs = explode(',',$res["rechs"]);
$sum = 0;
Foreach($rechs AS $rech)
{
$sum += calculateRechnungsSum($dbconn, $rech,1);
}
$completesum +=$sum;
if($sum>0)
{
$partners[$res["partner_id"]] = $sum;
}
}
$smarty->display("stexp.tpl");
}
$_SESSION["camefrom"] ="stexp";
?>