Rechnungen: Anrede beim Bearbeiten, lokale Testumgebung, BOMs
Beim Test der Oberflaeche im Browser gefunden:
- addrechnung.tpl fragte die gespeicherte Anrede als $rechnung.anr1 ab
(die Daten heissen anrede1) und gab sie ohne Klammern aus. Beim
Bearbeiten von Angeboten/Briefen erschien deshalb immer die
Standard-Anrede, eine geaenderte ging beim erneuten Speichern verloren.
- |escape innerhalb von {if}-Bedingungen wieder entfernt (dort ohne
Wirkung, gehoert nicht dorthin).
- UTF-8-BOM aus sechs Dateien entfernt; makepdf.php gab es auf jeder
Rechnungsseite vor dem HTML aus.
- makeImageFromPDF() loeschte bei der Aufraeumrunde auch .gitkeep;
Pfade fuer convert per escapeshellarg().
- constants.php: Instanzname auch unter Windows (getcwd() mit
Backslashes) korrekt; KV_CONFIG_PATH als Config-Pfad fuer lokale Tests.
Im Browser getestet (lokaler PHP-Webserver, migrierte Testdatenbank):
Login mit Sonderzeichen-Passwort, Entwurf automatisch speichern und
laden, Rechnung mit Umlauten/Anfuehrungszeichen/HTML im Artikelnamen und
Komma-Betraegen speichern, Anzeige als PDF (Original und Kopie),
Kundensuche nach Dokumenten mit Umlaut, Artikelnamen escaped, Storno,
Kopie auf andere Adresse, Umschlag, Angebot mit eigener Anrede anlegen und
wieder bearbeiten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,8 @@ for f in $(git ls-files "*.php" | grep -vE "^(incs/(tcpdf|pChart|PHPMailer|WebAu
|
|||||||
|
|
||||||
Zum Ausführen braucht es einen Webserver mit PHP, eine MariaDB/MySQL-Instanz und die externe Konfigurationsdatei (siehe unten). Ohne die Konfiguration springt `index.php` in den Setup-Modus (`update/firststart.php`). **Nur** dann: Das Setup läuft ohne Login, schreibt die Config und kann die Datenbank leeren. Deshalb wird `action=setup` bei gültiger Config verworfen, und `firststart.php` und `rebuild-settings.php` brechen selbst ab. Werte, die in die Config geschrieben werden, immer über `var_export()` maskieren – die Config ist ausführbarer PHP-Code.
|
Zum Ausführen braucht es einen Webserver mit PHP, eine MariaDB/MySQL-Instanz und die externe Konfigurationsdatei (siehe unten). Ohne die Konfiguration springt `index.php` in den Setup-Modus (`update/firststart.php`). **Nur** dann: Das Setup läuft ohne Login, schreibt die Config und kann die Datenbank leeren. Deshalb wird `action=setup` bei gültiger Config verworfen, und `firststart.php` und `rebuild-settings.php` brechen selbst ab. Werte, die in die Config geschrieben werden, immer über `var_export()` maskieren – die Config ist ausführbarer PHP-Code.
|
||||||
|
|
||||||
|
**Lokal testen** (auch unter Windows): Die Umgebungsvariable `KV_CONFIG_PATH` ersetzt `CONFIG_PATH`. Die Config-Datei heißt nach dem Verzeichnisnamen des Checkouts, also z.B. `Kundenverwaltung_settings.conf`; `$lokale_netze` muss `127.0.0.1`/`::1` enthalten, sonst gibt es kein Passwortfeld. Start im Repo-Verzeichnis mit `php -S 127.0.0.1:8765`. Die PDF-Vorschau als Bild (`makeImageFromPDF()`) braucht ImageMagick unter `/opt/bin/convert` und funktioniert lokal nicht.
|
||||||
|
|
||||||
## Die zwei zentralen Mechanismen
|
## Die zwei zentralen Mechanismen
|
||||||
|
|
||||||
### 1. Das Verzeichnis bestimmt die Instanz
|
### 1. Das Verzeichnis bestimmt die Instanz
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once("../incs/connectmysql.php");
|
require_once("../incs/connectmysql.php");
|
||||||
require_once("../incs/funcs.php");
|
require_once("../incs/funcs.php");
|
||||||
require_once("../incs/listfuncs.php");
|
require_once("../incs/listfuncs.php");
|
||||||
|
|||||||
+6
-2
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
$dirs = explode("/",getcwd());
|
// Unter Windows liefert getcwd() Backslashes
|
||||||
|
$dirs = preg_split('#[/\\\\]#', getcwd());
|
||||||
|
|
||||||
$dir = $dirs[count($dirs)-1];
|
$dir = $dirs[count($dirs)-1];
|
||||||
if($dir == "ajax")
|
if($dir == "ajax")
|
||||||
@@ -7,7 +8,10 @@ if($dir == "ajax")
|
|||||||
else if($dir == "auto")
|
else if($dir == "auto")
|
||||||
$dir = $dirs[count($dirs)-3];
|
$dir = $dirs[count($dirs)-3];
|
||||||
|
|
||||||
if(DIRECTORY_SEPARATOR == "/")
|
// KV_CONFIG_PATH erlaubt einen anderen Ort, etwa für eine lokale Testumgebung
|
||||||
|
if(getenv("KV_CONFIG_PATH"))
|
||||||
|
define("CONFIG_PATH", rtrim(getenv("KV_CONFIG_PATH"), "/\\")."/");
|
||||||
|
elseif(DIRECTORY_SEPARATOR == "/")
|
||||||
define("CONFIG_PATH", "/volume1/homes/wagner/kundenconfig/");
|
define("CONFIG_PATH", "/volume1/homes/wagner/kundenconfig/");
|
||||||
else
|
else
|
||||||
define("CONFIG_PATH", "c:/kundenverwaltung/config/");
|
define("CONFIG_PATH", "c:/kundenverwaltung/config/");
|
||||||
|
|||||||
+4
-4
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once('tcpdf/tcpdf.php');
|
require_once('tcpdf/tcpdf.php');
|
||||||
function makerawPDF($ajax)
|
function makerawPDF($ajax)
|
||||||
@@ -1144,8 +1144,8 @@ function makeImageFromPDF($PDFpath)
|
|||||||
$handle=opendir($PDFpathpart);
|
$handle=opendir($PDFpathpart);
|
||||||
while ($file = readdir($handle))
|
while ($file = readdir($handle))
|
||||||
{
|
{
|
||||||
if (preg_match("=^\.{1,2}$=", $file))
|
if (preg_match("=^\.=", $file))
|
||||||
continue; # . und .. Dateien ignorieren
|
continue; # ., .. und versteckte Dateien (.gitkeep) ignorieren
|
||||||
|
|
||||||
if (is_dir($PDFpathpart.$file))
|
if (is_dir($PDFpathpart.$file))
|
||||||
{
|
{
|
||||||
@@ -1164,7 +1164,7 @@ function makeImageFromPDF($PDFpath)
|
|||||||
}
|
}
|
||||||
mkdir(dirname($PDFpath)."/".basename($PDFpath,".pdf")."/");
|
mkdir(dirname($PDFpath)."/".basename($PDFpath,".pdf")."/");
|
||||||
//exec('');
|
//exec('');
|
||||||
exec("export PATH=\"/opt/bin\";/opt/bin/convert $PDFpath ".dirname($PDFpath)."/".basename($PDFpath,".pdf")."/".basename($PDFpath,".pdf").".png");
|
exec("export PATH=\"/opt/bin\";/opt/bin/convert ".escapeshellarg($PDFpath)." ".escapeshellarg(dirname($PDFpath)."/".basename($PDFpath,".pdf")."/".basename($PDFpath,".pdf").".png"));
|
||||||
$i="0";
|
$i="0";
|
||||||
$ret = "";
|
$ret = "";
|
||||||
if(is_file(dirname($PDFpath)."/".basename($PDFpath,".pdf")."/".basename($PDFpath,".pdf").".png"))
|
if(is_file(dirname($PDFpath)."/".basename($PDFpath,".pdf")."/".basename($PDFpath,".pdf").".png"))
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
function generateSalt() {
|
function generateSalt() {
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once ("./incs/rechnung.php");
|
require_once ("./incs/rechnung.php");
|
||||||
$smarty->assign("heading","Steuerexport");
|
$smarty->assign("heading","Steuerexport");
|
||||||
$smarty->display("heading.tpl");
|
$smarty->display("heading.tpl");
|
||||||
|
|||||||
+19
-19
@@ -1,4 +1,4 @@
|
|||||||
<div class="centersidebyside">
|
<div class="centersidebyside">
|
||||||
<div class="sidebyside">
|
<div class="sidebyside">
|
||||||
{if $rechnung.typ_id && !$newtype}
|
{if $rechnung.typ_id && !$newtype}
|
||||||
{$type = $rechnung.typ_id}
|
{$type = $rechnung.typ_id}
|
||||||
@@ -114,11 +114,11 @@
|
|||||||
<p>
|
<p>
|
||||||
<br />
|
<br />
|
||||||
<label>Anrede:</label>
|
<label>Anrede:</label>
|
||||||
{if $anrs.{$adresse.anrede_id|escape} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
{if $anrs.{$adresse.anrede_id} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anrede1}
|
||||||
$rechnung.anr1
|
{$rechnung.anrede1|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrter Herr{" "}
|
Sehr geehrter Herr{" "}
|
||||||
{if $adresse.titel_id > 1}
|
{if $adresse.titel_id > 1}
|
||||||
@@ -131,11 +131,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anrede1}
|
||||||
$rechnung.anr1
|
{$rechnung.anrede1|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrter Herr{" "}
|
Sehr geehrter Herr{" "}
|
||||||
{if $adresse.titel2_id > 1}
|
{if $adresse.titel2_id > 1}
|
||||||
@@ -148,11 +148,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anrede1}
|
||||||
$rechnung.anr1
|
{$rechnung.anrede1|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrte Frau{" "}
|
Sehr geehrte Frau{" "}
|
||||||
{if $adresse.titel_id > 1}
|
{if $adresse.titel_id > 1}
|
||||||
@@ -165,11 +165,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anrede1}
|
||||||
$rechnung.anr1
|
{$rechnung.anrede1|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrte Frau{" "}
|
Sehr geehrte Frau{" "}
|
||||||
{if $adresse.titel2_id > 1}
|
{if $adresse.titel2_id > 1}
|
||||||
@@ -187,11 +187,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<label>Zweite Anrede:</label>
|
<label>Zweite Anrede:</label>
|
||||||
{if $anrs.{$adresse.anrede_id|escape} == "Frau" && $anrs.{$adresse.anrede2_id|escape} == "Herrn"}
|
{if $anrs.{$adresse.anrede_id} == "Frau" && $anrs.{$adresse.anrede2_id|escape} == "Herrn"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr2}
|
{if $rechnung.anrede2}
|
||||||
$rechnung.anr2
|
{$rechnung.anrede2|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrte Frau{" "}
|
Sehr geehrte Frau{" "}
|
||||||
{if $adresse.titel_id > 1}
|
{if $adresse.titel_id > 1}
|
||||||
@@ -204,11 +204,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr2' maxlength='150' name='anr2' /><br />
|
' id='anr2' maxlength='150' name='anr2' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr2}
|
{if $rechnung.anrede2}
|
||||||
$rechnung.anr2
|
{$rechnung.anrede2|escape}
|
||||||
{else}
|
{else}
|
||||||
Sehr geehrte Frau{" "}
|
Sehr geehrte Frau{" "}
|
||||||
{if $adresse.titel2_id > 1}
|
{if $adresse.titel2_id > 1}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
<label>Betreff:</label>
|
<label>Betreff:</label>
|
||||||
<input value='{$smarty.session.firma|escape}: anbei das von Ihnen gewünschte Dokument' id='sub' maxlength='150' name='sub' /><br />
|
<input value='{$smarty.session.firma|escape}: anbei das von Ihnen gewünschte Dokument' id='sub' maxlength='150' name='sub' /><br />
|
||||||
<label>Anrede:</label>
|
<label>Anrede:</label>
|
||||||
{if $anrs.{$adresse.anrede_id|escape} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
{if $anrs.{$adresse.anrede_id} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anr1}
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Herrn" || $anrs.{$adresse.anrede_id|escape} == "Herr"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anr1}
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anr1}
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr1' maxlength='150' name='anr1' /><br />
|
' id='anr1' maxlength='150' name='anr1' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr1}
|
{if $rechnung.anr1}
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<label>Zweite Anrede:</label>
|
<label>Zweite Anrede:</label>
|
||||||
{if $anrs.{$adresse.anrede_id|escape} == "Frau" && $anrs.{$adresse.anrede2_id|escape} == "Herr" && $anrs.{$adresse.anrede2_id|escape} == "Herrn"}
|
{if $anrs.{$adresse.anrede_id} == "Frau" && $anrs.{$adresse.anrede2_id|escape} == "Herr" && $anrs.{$adresse.anrede2_id|escape} == "Herrn"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr2}
|
{if $rechnung.anr2}
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
' id='anr2' maxlength='150' name='anr2' /><br />
|
' id='anr2' maxlength='150' name='anr2' /><br />
|
||||||
{/strip}
|
{/strip}
|
||||||
{elseif $anrs.{$adresse.anrede2_id|escape} == "Frau"}
|
{elseif $anrs.{$adresse.anrede2_id} == "Frau"}
|
||||||
{strip}
|
{strip}
|
||||||
<input value='
|
<input value='
|
||||||
{if $rechnung.anr2}
|
{if $rechnung.anr2}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<a href='?action=termin'><span class='cal' title="Terminkalender anzeigen" style='margin-left: 50%;'></span></a><br />
|
<a href='?action=termin'><span class='cal' title="Terminkalender anzeigen" style='margin-left: 50%;'></span></a><br />
|
||||||
<div id="tabs">
|
<div id="tabs">
|
||||||
{* ANZEIGE PANE *}
|
{* ANZEIGE PANE *}
|
||||||
<div class='widthlimiter'>
|
<div class='widthlimiter'>
|
||||||
|
|||||||
Reference in New Issue
Block a user