Rechnungsmodul auf Prepared Statements umgebaut
- incs/rechnung.php: alle Abfragen mit Platzhaltern. saveRechnung() setzte $_POST ungeprueft in SQL (Injection; ein Apostroph im Text brach das Speichern ab). Speichern, Kopieren und Loeschen laufen in Transaktionen, bei Fehlern bleibt nichts Halbes zurueck. Formularwerte ueber formularText/-Zahl/-Ganzzahl (strikter Modus). - copyRech() trug die Rechnungsnummer ohne typ_id ein (Fehler im strikten Modus) und zaehlte typuebergreifend; jetzt wie beim Anlegen pro Typ (neueRechnungsnummer()). Artikel und Eigenschaften per INSERT ... SELECT. - Adressblock-Formatierung aus makeadressblock() und makeadressblockUmschlag() in formatiereAdressblock() zusammengefuehrt. - ajax/autosave.php und ajax/preview.php teilen sich saveTmpRechnung(); ueberzaehlige Entwuerfe werden samt Artikeln entfernt (vorher FK-Fehler). - sites/rechnungadd.php: Storno ohne SQL-Injection ueber $_GET["id"], Auswahllisten ueber db_zuordnung(), tote Kommissions-Abfrage entfernt. - Rechnungssuche (createRechQry/createKdnRechQry) liefert SQL und Parameter getrennt; Suchbegriffe waren ungeprueft im SQL. - saveLog() mit Platzhaltern, Protokolltext ueber db_sql_text(). - db.php: db_zuordnung(), db_sql_text(); Helfer liefern Strings wie mysqli_query(), damit alter Code sich gleich verhaelt. Getestet: alter und neuer Code lesen dieselbe migrierte Datenbank, 150 von 155 Pruefungen (10.936 Werte) identisch, die uebrigen 5 sind der Injection-Suchbegriff (alt: SQL-Fehler). Schreibtests fuer Entwurf, Anlegen, Nummernkreise, Aendern, Rollback, Kopieren, Adresse, Storno und Loeschen im strikten Modus. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+11
-183
@@ -1,4 +1,4 @@
|
||||
<?php
|
||||
<?php
|
||||
require_once("../incs/connectmysql.php");
|
||||
require_once("../incs/funcs.php");
|
||||
require_once("../incs/listfuncs.php");
|
||||
@@ -9,202 +9,30 @@ require('../smarty/libs/Smarty.class.php');
|
||||
$smarty = new Smarty;
|
||||
|
||||
|
||||
|
||||
if(!isset($err))
|
||||
{
|
||||
$show = "";
|
||||
if(isset($_POST["show_firmaanr"]))
|
||||
$show .= str_pad($_POST["show_firmaanr"],1,"0");
|
||||
// Entwurf speichern, alle Artikel (auch deaktivierte)
|
||||
list($progressid, $fehler) = saveTmpRechnung($dbconn, false);
|
||||
if($fehler)
|
||||
$err = $fehler;
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_firma"]))
|
||||
$show .= str_pad($_POST["show_firma"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_anr"]))
|
||||
$show .= str_pad($_POST["show_anr"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if( isset($_POST["show_titel"]))
|
||||
$show .= str_pad($_POST["show_titel"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_name"]))
|
||||
$show .= str_pad($_POST["show_name"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_anr2"]))
|
||||
$show .= str_pad($_POST["show_anr2"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_titel2"]))
|
||||
$show .= str_pad($_POST["show_titel2"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_name2"]))
|
||||
$show .= str_pad($_POST["show_name2"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_str"]))
|
||||
$show .= str_pad($_POST["show_str"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_ort"]))
|
||||
$show .= str_pad($_POST["show_ort"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_land"]))
|
||||
$show .= str_pad($_POST["show_land"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
if(isset($_POST["show_zusatz"]))
|
||||
$show .= str_pad($_POST["show_zusatz"],1,"0");
|
||||
else
|
||||
$show .= "0";
|
||||
|
||||
if(isset($_POST["anr1"]))
|
||||
$anr1 = trim($_POST["anr1"]);
|
||||
else
|
||||
$anr1 = "";
|
||||
if(isset($_POST["anr2"]))
|
||||
$anr2 = trim($_POST["anr2"]);
|
||||
else
|
||||
$anr2 = "";
|
||||
if(isset($_POST["intro"]))
|
||||
$intro = trim($_POST["intro"]);
|
||||
else
|
||||
$intro = "";
|
||||
|
||||
$adrerw = trim($_POST["adresserweiterung"]);
|
||||
$outro = trim($_POST["outro"]);
|
||||
$type = $_POST["type"];
|
||||
$adressid = $_POST["adressid"];
|
||||
$partnerid = $_POST["partnerid"];
|
||||
$mwst = $_POST["mwst"];
|
||||
$zahlziel = $_POST["zahlziel"];
|
||||
$wahrung = $_POST["wahrung"];
|
||||
if(isset($_POST["sub_mwst"]))
|
||||
$sub_mwst = $_POST["sub_mwst"];
|
||||
else
|
||||
$sub_mwst = "";
|
||||
$rabatt = $_POST["rabatt"];
|
||||
$rabattdesc = $_POST["rabattdesc"];
|
||||
$lieferdatum = $_POST["lieferdatum"];
|
||||
$buchKto = $_POST["buchKto"];
|
||||
|
||||
$qry = mysqli_query($dbconn, "SELECT id FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type'") or $err=error("Fehler beim ermitteln der Rechnung <br />".mysqli_error($dbconn));
|
||||
$progressid = mysqli_fetch_array($qry);
|
||||
$progressid = $progressid[0];
|
||||
if(!$progressid)
|
||||
{
|
||||
|
||||
$qry = mysqli_query($dbconn, "INSERT INTO tmp_rechnung SET
|
||||
user_id = '".$_SESSION["user"]."',
|
||||
adressfields='$show',
|
||||
anrede1='$anr1',
|
||||
anrede2='$anr2',
|
||||
intro='$intro',
|
||||
outro='$outro',
|
||||
typ_id = '$type',
|
||||
adresse_id='$adressid',
|
||||
partner_id='$partnerid',
|
||||
mwst_id = '$mwst',
|
||||
zahlziel_id = '$zahlziel',
|
||||
wahrung_id='$wahrung',
|
||||
sub_mwst='$sub_mwst',
|
||||
rabatt='$rabatt',
|
||||
rabattdesc='$rabattdesc',
|
||||
adresserweiterung='$adrerw',
|
||||
lieferdatum='$lieferdatum',
|
||||
buchungsKto_id = '$buchKto',
|
||||
datetime=NOW()") or $err=error("[autosave.js] Fehler beim erstellen der Rechnung <br />".mysqli_error($dbconn));
|
||||
$progressid = mysqli_insert_id($dbconn);
|
||||
}
|
||||
else
|
||||
{
|
||||
$qry = mysqli_query($dbconn, "UPDATE tmp_rechnung SET
|
||||
user_id = '".$_SESSION["user"]."',
|
||||
adressfields='$show',
|
||||
anrede1='$anr1',
|
||||
anrede2='$anr2',
|
||||
intro='$intro',
|
||||
outro='$outro',
|
||||
typ_id = '$type',
|
||||
adresse_id='$adressid',
|
||||
partner_id='$partnerid',
|
||||
mwst_id = '$mwst',
|
||||
zahlziel_id = '$zahlziel',
|
||||
wahrung_id='$wahrung',
|
||||
sub_mwst='$sub_mwst',
|
||||
rabatt='$rabatt',
|
||||
rabattdesc='$rabattdesc',
|
||||
lieferdatum='$lieferdatum',
|
||||
adresserweiterung='$adrerw',
|
||||
buchungsKto_id = '$buchKto',
|
||||
datetime=NOW() WHERE id='$progressid'") or $err=error("Fehler beim aktualisieren der Rechnung <br />".mysqli_error($dbconn));
|
||||
$qry = mysqli_query($dbconn, "DELETE FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type' AND id != '$progressid' LIMIT 1") or $err=error("Fehler beim löschen alter tmp Rechnungen <br />".mysqli_error($dbconn));
|
||||
}
|
||||
|
||||
$qry= mysqli_query($dbconn, "SELECT id FROM tmp_artikel WHERE rech_id = '".$progressid."'");
|
||||
while($res=mysqli_fetch_assoc($qry))
|
||||
{
|
||||
mysqli_query($dbconn, "DELETE FROM tmp_eigensch WHERE art_id = '".$res["id"]."'") or $err=error("Fehler beim löschen der eigenschaften <br />".mysqli_error($dbconn));
|
||||
}
|
||||
|
||||
$qry = mysqli_query($dbconn, "DELETE FROM tmp_artikel WHERE rech_id = '".$progressid."'") or $err=error("Fehler beim löschen der Artikel <br />".mysqli_error($dbconn));
|
||||
if(!isset($err))
|
||||
{
|
||||
$i = 1;
|
||||
while($_POST["arthead".$i] && !isset($err))
|
||||
{
|
||||
$angtyp = trim($_POST["angtyp".$i]);
|
||||
$arttyp = trim($_POST["arttyp".$i]);
|
||||
$arthead = trim($_POST["arthead".$i]);
|
||||
$artpr = str_replace(",",".",trim($_POST["artpr".$i]));
|
||||
$artmen = str_replace(",",".",trim($_POST["artmen".$i]));
|
||||
$artrab = trim($_POST["artrab".$i]);
|
||||
if(!isset($_POST["artrabtyp".$i]))
|
||||
$_POST["artrabtyp".$i] = "";
|
||||
$artrabtyp = trim($_POST["artrabtyp".$i]);
|
||||
$artmeneinh = trim($_POST["artmeneinh".$i]);
|
||||
$artwa = trim($_POST["artwa".$i]);
|
||||
$artmwst = trim($_POST["artmwst".$i]);
|
||||
$pagebreak = trim($_POST["pagebreak".$i]);
|
||||
|
||||
|
||||
$qry = mysqli_query($dbconn, "INSERT INTO tmp_artikel SET bezeichn='$arthead', preis='$artpr', mwst_id='$artmwst', pagebreak='$pagebreak', einheit_id='$artmeneinh', typ_id='$arttyp', datetime=NOW(), wanr='$artwa', rech_id='$progressid',posnr='$i',rabatt='$artrab',rabatttyp='$artrabtyp',menge='$artmen',angtyp='$angtyp'") or $err=error("Fehler beim anlegen der Artikel <br />".mysqli_error($dbconn));
|
||||
$artid=mysqli_insert_id($dbconn);
|
||||
$ii = 1;
|
||||
while($_POST["arteig".$i."_".$ii] && !isset($err))
|
||||
{
|
||||
$arteig = trim($_POST["arteig".$i."_".$ii]);
|
||||
$artval = trim($_POST["artval".$i."_".$ii]);
|
||||
$arteinh = trim($_POST["arteinh".$i."_".$ii]);
|
||||
$qry = mysqli_query($dbconn, "INSERT INTO tmp_eigensch SET bezeichn='$arteig', wert='$artval', einheit_id='$arteinh', datetime=NOW(), posnr='$ii', art_id='$artid'") or $err=error("Fehler beim anlegen der Eigenschaften <br />".mysqli_error($dbconn));
|
||||
$eigid=mysqli_insert_id($dbconn);
|
||||
$ii++;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
if(!isset($err))
|
||||
{
|
||||
$type = formularGanzzahl("type");
|
||||
$adresse = makeadressblock($dbconn,$progressid,1);
|
||||
$rechnung = makerechnungsarray($dbconn,$progressid,1);
|
||||
$artikel = makeartikelarray($dbconn,$progressid,1);
|
||||
if($adresse["lines"]>6)
|
||||
error("Die Adresse hat zu viele Zeilen!<br />Bitte wählen Sie einige Elemente ab.");
|
||||
if(!$_POST["show_ort"] || !$_POST["show_str"])
|
||||
error("Die Adresse erscheint nicht vollständig auf der Rechnung!<br />Falls die Rechnung über den Postweg zugestellt werden soll muss die Adresse vervollständigt werden!");
|
||||
if(!formularText("show_ort") || !formularText("show_str"))
|
||||
error("Die Adresse erscheint nicht vollständig auf der Rechnung!<br />Falls die Rechnung über den Postweg zugestellt werden soll muss die Adresse vervollständigt werden!");
|
||||
if($rechnung["rabatt"] && !$rechnung["rabattdesc"])
|
||||
warning("Ein Rabatt wird von der Gesamtsumme abgezogen, jedoch ist die Rabattbeschreibung leer!<br />Bitte geben Sie eine Rabattbeschreibung ein (z.B.: Sonderrabatt, Winterrabatt, etc.).");
|
||||
if(!$artikel[0] && $type != 5)
|
||||
if(empty($artikel) && $type != 5)
|
||||
warning("Es sind noch keine Artikel vorhanden. Bitte Fügen Sie Artikel durch eintragen einer Artikelbeschreibung ein.");
|
||||
if(!is_file("../".UPLOADS_PATH."signs/".$_SESSION["user"].".png"))
|
||||
error("Für Ihren Benutzer wurde noch keine Unterschrift hinterlegt. Bitte vergessen Sie nicht zu unterschreiben.<br />("."./".UPLOADS_PATH."signs/".$_SESSION["user"].".png");
|
||||
|
||||
|
||||
ok("<img src='' id='saveimg' class='saveimg' /><br />Dokument wurde um ".date("H:i:s")." Uhr gespeichert!");
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user