Compare commits

..
19 Commits
Author SHA1 Message Date
adminandClaude Opus 5 5b7704ff03 Testumgebung neben dem Repo dokumentiert
Die Umgebung zum Umbau (portable MariaDB, Testdaten, Vergleich von altem
und neuem Code) liegt jetzt dauerhaft in ../kundentest statt in einem
sitzungsgebundenen Temp-Verzeichnis.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:19:36 +02:00
adminandClaude Opus 5 2779f505df Termine: mehrtaegige Termine behalten beim Aendern ihre id
Bisher wurde eine mehrtaegige Terminreihe beim Speichern komplett geloescht
und neu angelegt, der Termin bekam also jedes Mal eine neue id. Jetzt bleibt
der Hauptsatz stehen und wird aktualisiert; nur die Folgetage werden neu
angelegt. Damit bleiben Verweise auf die id gueltig (Drucken, Links,
Aenderungsprotokoll), und Anlegen und Aendern laufen ueber denselben Weg.

terminHauptsatz() loest jede Zeilen-id auf ihre Reihe auf, so dass auch der
Einstieg ueber eine Nebenzeile oder ueber Altdaten ohne main_id funktioniert;
loescheTerminreihe() und setzeTerminErledigt() nutzen das ebenfalls.

templates/calendar_month.tpl entfernt: kein Code band die Monatsansicht ein,
und unter PHP 8 lief sie in einen Fehler.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 08:05:27 +02:00
adminandClaude Opus 5 490c4f12a4 Termine auf Prepared Statements umgebaut
Kalender, Terminliste, Terminformular und Terminzettel laufen ueber
db_abfrage() mit Platzhaltern; das Anlegen einer mehrtaegigen Terminreihe
liegt in einer Transaktion. Die Logik steckt jetzt in incs/termin.php,
sites/termin*.php rufen sie nur noch auf.

Dabei behoben:
- SQL-Injektion ueber die Suchbegriffe der Terminliste, ueber die
  Mehrfachauswahl (Ankreuzfelder del<N>/erl<N> gingen roh in DELETE bzw.
  UPDATE), ueber die Wiedervorlage-Tage (INTERVAL $folgedays DAY) und ueber
  ?action=terminshow&id=... in maketerminarray(), maketerminadresse(),
  maketelnrn() und makegooglestring()
- gespeichertes XSS: Beschreibung, Notiz, Termintyp, Ort, Kundenname und
  Mitarbeiterfarbe im Kalender, in der Terminliste und im Formular
- "or $err=error(...)" stand innerhalb des Abfrage-Strings, dadurch wurden
  die Nebenzeilen einer Terminreihe beim Loeschen nie entfernt
- die Abfrage zum Folgetermin las eine Spalte typ_id, die es in termin nicht
  gibt; Typ und Wiedervorlage fehlten deshalb beim Bearbeiten
- ein Folgetermin wurde mit termtime='' und termdauer='' angelegt, ein
  Termin ohne Folgetermin mit followed_by='' - im strikten Modus Fehler
- ein Termin ohne Datum landete auf dem 01.01.1970 und gab dabei
  "NICHTTERMINIERT!!" mitten in die Seite aus
- die Ueberschneidungspruefung verglich ab dem zweiten Tag gegen das Ende
  des ersten Tages
- eine unbekannte Registerkarte der Terminliste ergab ein leeres WHERE und
  damit einen SQL-Fehler; jetzt gilt die Standardansicht
- terminshow.php pruefte den Typ mit = statt ==
- der Kalender haengt nicht mehr an der Locale de_DE (strftime)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 00:04:38 +02:00
adminandClaude Opus 5 3dfbf1c9c7 Kunden und Adressen auf Prepared Statements umgebaut
incs/saveNchange.php neu geschrieben: Adressen, Telefonnummern, Kontakte,
Notizen und Konten laufen ueber db_abfrage() mit Platzhaltern, mehrschrittiges
Speichern in einer Transaktion. Weil sich die Speicherfunktionen gegenseitig
aufrufen, klammern beginneSpeichern()/beendeSpeichern() die Verschachtelung;
incs/rechnung.php nutzt sie ebenfalls.

Kunden- und Lieferantenseiten waren zwei fast gleiche Kopien und teilen sich
jetzt partnerAddSeite(), partnerChangeSeite() und partnerShowDaten().

Dabei behoben:
- SQL-Injektion ueber die Suchbegriffe der Kunden-, Lieferanten-, Adress-,
  Kommissions- und Projektsuche sowie ueber die Artikel-Autovervollstaendigung
- gespeichertes XSS: Notizen (nl2br escapt nicht), Bankname, Dokumenttyp,
  Namen und Adressen in allen Trefferlisten
- sites/liefershow.php war unter PHP 8 ein Fatal ($kdnres.id)
- "Telefonnummer loeschen" im Kundenbereich lief in einen Fatal, die Nummern
  einer geloeschten Adresse blieben stehen (Spalte hiess adress_id statt
  adresse_id, mysql_fetch_assoc gibt es nicht mehr)
- Geburtstag ohne Jahr wurde im Formular verschluckt, die IBAN kam beim
  Bearbeiten aus $_GET statt aus dem Konto
- die Versionskette eines Kunden brach nach einem Schritt ab
- Kommissionsadressen speicherten die Ortsangabe der Adresse statt der des
  Telefonformulars und einen Adresstyp als Telefontyp
- Blaettern in den Trefferlisten: ohne ORDER BY konnte dieselbe Zeile zweimal
  oder gar nicht erscheinen; ajax_searchadress() bekam die Seite nicht
- Hauptadresse laesst sich nicht mehr loeschen, Kundendaten nicht mehr ueber
  die Lieferantenseite (und umgekehrt)
- ajax/auto/* baute JSON von Hand zusammen, ein Anfuehrungszeichen im Ort
  machte die Liste unbrauchbar

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 19:47:01 +02:00
adminandClaude Opus 5 3f7d070d7f PDF: Unicode-Schriften und temporaere Dateien 20 Minuten statt Sekunden
- makepdf.php nutzt FreeSerif/FreeSans (bei TCPDF dabei) statt der
  eingebauten PDF-Schriften Times/Helvetica. Die kennen nur westeuropaeische
  Zeichen, Namen wie Dvorak mit Hacek oder Lukasz mit L-Strich wurden zu
  "?". Die Breiten weichen um hoechstens 0,8 % (Serif) bzw. 3 % (Sans) ab.
  Die Schriften stehen als Konstanten PDF_SCHRIFT_SERIF/-_SANS an einer
  Stelle. Die PDFs werden durch die eingebetteten Zeichen etwa 130 KB
  groesser.
- savePDF() und makeImageFromPDF() raeumten Dateien auf, die aelter als
  20 Sekunden waren; laut Kommentar waren Minuten gemeint. Oeffneten zwei
  Personen kurz nacheinander Dokumente, konnte das PDF der ersten weg sein,
  bevor ihr Browser es geladen hatte. Jetzt PDF_TEMP_MAX_ALTER = 20 Minuten.

Getestet: Rechnungs-PDF fuer alle drei Briefkoepfe mit Namen/Firma in
tschechischen und polnischen Zeichen, im Browser gerendert; Aufraeumen
mit 5, 19 und 25 Minuten alten Dateien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 11:33:54 +02:00
adminandClaude Opus 5 8fe43d6802 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>
2026-09-17 11:27:27 +02:00
adminandClaude Opus 5 b76d883fbe Rechnungen: Betraege mit Tausenderpunkt, XSS in Templates und Suche
- formularZahl(): steht ein Komma im Betrag, sind Punkte Tausendertrenner
  ("1.234,50" -> 1234.50, vorher 1.23); ohne Komma bleibt der Punkt
  Dezimaltrenner wie bei der Artikel-Autovervollstaendigung ("12.50").
- Rechnungs-Templates (addrechnung, mailrechnung, changeadr, copyrech,
  umschlagshow, rechshow) geben alle Daten mit |escape aus; Werte aus der
  URL (id, type, newtype) als int.
- Rechnungssuche: Artikelnamen werden escaped statt als HTML ausgegeben
  (Trennung per Zeilenumbruch in SQL, artikelListeHtml() in PHP).
- Suchbegriffe kommen per encodeURIComponent als UTF-8, utf8_encode()
  entfaellt; vorher gingen Zeichen ausserhalb von Latin-1 verloren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 11:18:29 +02:00
adminandClaude Opus 5 d8fff4aeb6 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>
2026-09-17 10:41:43 +02:00
admin a130ed56a3 Merge branch 'main' into db-umbau 2026-09-17 10:30:31 +02:00
adminandClaude Opus 5 c59e7fb393 Sicherheit: AJAX-Endpunkte und Statistik nur mit Anmeldung
Keiner der AJAX-Endpunkte hat einen Login geprueft. Ohne Anmeldung liessen
sich Kunden, Adressen und Rechnungen durchsuchen, und ajax/autosave.php
setzt $_POST ungeprueft in SQL (SQL-Injection ohne Login).

- incs/connectmysql.php und ajax/auto/connectmysql.php, die alle
  AJAX-Endpunkte laden, antworten ohne gueltige Session mit 403
- stats.php verlangt eine Anmeldung
- db-backup.php und clean_db.php laufen nur noch per Kommandozeile;
  ueber den Webserver konnte jeder einen Datenbank-Dump anstossen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:30:30 +02:00
adminandClaude Opus 5 f24a7a88dd Schema: Pflichtspalten mit den frueheren impliziten Standardwerten
Der alte Code fuegt fast ueberall Zeilen ein, ohne alle NOT-NULL-Spalten zu
setzen; der nicht strikte Modus hat dann '', 0 oder ein Nulldatum
eingesetzt. Diese Werte stehen jetzt als DEFAULT im Schema. Weggelassene
Spalten verhalten sich damit wie bisher, ungueltige Werte, zu lange Texte
und falsche Verweise lehnt der strikte Modus weiterhin ab.

Das Migrationsskript meldet Spalten, die in der Quelle fehlen und ueber den
Standardwert gefuellt werden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:28:44 +02:00
adminandClaude Opus 5 6306bfba17 Login und Passkeys auf Prepared Statements umgebaut
- sites/start.php: ein Query statt zwei, Passwortvergleich per hash_equals
  in PHP statt im SQL, Updates per id. Die Eingaben gehen nicht mehr durch
  htmlspecialchars(): Passwoerter werden beim Anlegen roh gehasht, mit
  & < > " ' konnte man sich deshalb bisher nie anmelden.
- getUserSetting/updateUserSetting mit Platzhaltern; behoben: INSERT-Zweig
  rief mysqli_real_escape_string ohne Verbindung auf (Fatal Error),
  $mysqli_error als Variable, ungewolltes echo "update". Aufrufer escapen
  nicht mehr vor (sonst doppelt), settings.php: Tippfehler
  mysqi_real_escape_string beim Speichern von show_sks behoben, style nur
  als Dateiname ohne Pfad.
- authServer.php, addKey.php, userkeys.php, checkAdduser(): Platzhalter.
  Passkey-INSERT setzt lastAuth/authKey (Pflichtfelder im strikten Modus).
  addKey nur als reine Ziffern, sonst passte "12345678xyz" per Typumwandlung.
- checkLogin() entfernt: nirgends aufgerufen, fragte die nicht existierende
  Tabelle users ab.
- userkeys.tpl: Passkey-Name escaped.

Getestet gegen die migrierte Testdatenbank im strikten Modus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:24:17 +02:00
adminandClaude Opus 5 7dd6580bcc Sicherheit: Erkennung des lokalen Netzes ueber konfigurierte Netze
isLocal() hielt jede Adresse aus 192.168.147.* fuer lokal. Das ist das
Docker-Netz auf dem NAS: Anfragen ueber den Docker- oder einen Reverse
Proxy tragen dessen Adresse und waeren damit als lokal durchgegangen
(Passwort-Login und Passkey-Freigabe von aussen). Der IPv6-Vergleich per
explode(":") scheiterte ausserdem an komprimierten Adressen.

- lokale Netze stehen als CIDR-Liste $lokale_netze in der externen Config
- ipImNetz() vergleicht IPv4/IPv6 korrekt per inet_pton, inkl. ::ffff:-Form
- Anfragen mit Proxy-Headern gelten nie als lokal
- ohne Konfiguration nur noch dasselbe IPv6-/64 wie der Server, kein IPv4

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:17:00 +02:00
admin e2596b6e1c Merge branch 'main' into db-umbau 2026-09-17 10:17:00 +02:00
adminandClaude Opus 5 a6758ae63b Sicherheit: Passkey-Registrierung nur mit Freigabe durch Superadmin
authServer.php nahm getCreateArgs/processCreate ohne jede Pruefung an und
uebernahm die Benutzer-id aus der URL. Jeder konnte damit aus dem Internet
einen Passkey fuer ein beliebiges Konto (auch Superadmin) registrieren und
sich anschliessend anmelden.

- sites/userkeys.php loest den addKey ein und legt eine Freigabe in der
  Session ab (5 Minuten, ein Benutzer, einmalig); der addKey wird geloescht
- authServer.php verlangt fuer getCreateArgs/processCreate Login,
  Superadmin-Recht und diese Freigabe; die Benutzer-id kommt aus der
  Freigabe, nicht aus der URL
- queryFidoMetaDataService nur fuer Superadmins
- Passkey-Login verweigert gesperrte Benutzer und meldet keinen Erfolg
  mehr, wenn der Benutzer fehlt
- addKey.php verlangt wie userkeys.php das Superadmin-Recht
- session_regenerate_id() nach Passwort- und Passkey-Login
- userkeys.php/addKey.php: $_GET["id"] als int statt ungequotet in SQL

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:09:54 +02:00
admin a66ace58c4 Merge branch 'main' into db-umbau 2026-09-17 10:09:54 +02:00
adminandClaude Opus 5 0d0059f033 Migrationsskript auf utf8mb4 mit Reparatur doppelt kodierter Texte
update/migration-utf8mb4.php kopiert eine Instanz-Datenbank in eine neue
Datenbank mit update/schema.sql. Jeder Textwert wird einzeln eingeordnet
(korrekt, doppelt, mehrfach kodiert, unklar) und nur repariert, wenn die
Rueckfuehrung ueber MySQLs latin1-Abbildung eindeutig ist. Die Quelle bleibt
unveraendert.

- "pruefen" liest nur und gibt einen Bericht aus
- "migrieren <ziel>" legt das Ziel an, kopiert im strikten Modus, fuellt
  fehlende Spalten und NULL in Pflichtfeldern mit Leerwerten, prueft die
  Fremdschluessel und meldet verwaiste Verweise

Getestet gegen Dummy-Daten im alten Schema (778 doppelt, 28 mehrfach,
180 korrekt, 24 gemischt: alle Werte wie erwartet) und gegen das
abweichende ingwa-Schema.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:03:45 +02:00
adminandClaude Opus 5 ec6222c4eb Einheitliches Schema in utf8mb4 (update/schema.sql)
Grundlage ist die Struktur der kunden-Datenbank. project und work kommen
aus ingwa, weil der Code sie fuer das Projekte-Modul braucht, sie in kunden
aber fehlen. Die Sicherungskopien altlasten_backup* sind nicht enthalten.
Tabellen, Spalten, Schluessel und Fremdschluessel sind sonst unveraendert,
nur Zeichensatz und Sortierung sind einheitlich utf8mb4_unicode_ci.

.gitignore laesst update/schema.sql als einzige .sql-Datei zu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 09:53:16 +02:00
adminandClaude Opus 5 210a6c47a8 Zentrale DB-Verbindung und Helfer fuer Prepared Statements
- incs/db.php: db_verbinden() setzt utf8mb4, strikten sql_mode und schaltet
  die mysqli-Exceptions von PHP 8.1+ ab, damit die bestehenden
  "or error(mysqli_error())"-Pruefungen weiter greifen.
- db_abfrage/db_zeilen/db_zeile/db_wert mit ?-Platzhaltern
  (mysqli_execute_query, PHP 8.2).
- Alle neun kopierten mysqli_connect/select_db-Stellen nutzen jetzt
  db_verbinden().

Nur zusammen mit der auf utf8mb4 migrierten Datenbank einsetzbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 09:42:52 +02:00
80 changed files with 5052 additions and 5057 deletions
+2
View File
@@ -11,6 +11,8 @@
# --- Datenbank-Dumps / Backups --------------------------------- # --- Datenbank-Dumps / Backups ---------------------------------
*.sql *.sql
*.sql.gz *.sql.gz
# Ausnahme: das Schema selbst enthaelt keine Daten
!update/schema.sql
*.dump *.dump
*.bak *.bak
+34
View File
@@ -16,6 +16,10 @@ 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 Testumgebung zum Umbau liegt **neben** dem Repo in `../kundentest` (portable MariaDB auf Port 3307, Testdatengenerator, Vergleich von altem und neuem Code, Schreib- und Template-Tests). `../kundentest/LIESMICH.md` erklärt sie; alles auf einmal läuft mit `sh alles.sh neu` in dem Verzeichnis.
## Die zwei zentralen Mechanismen ## Die zwei zentralen Mechanismen
### 1. Das Verzeichnis bestimmt die Instanz ### 1. Das Verzeichnis bestimmt die Instanz
@@ -84,14 +88,39 @@ Eine Schemaänderung besteht also aus: neuer Eintrag **vorn** in `update/version
## Datenbankzugriff ## Datenbankzugriff
**Umbau läuft (Branch `db-umbau`):** Verbindungen entstehen nur noch über `db_verbinden()` aus `incs/db.php`. Die Funktion setzt `utf8mb4`, den strikten `sql_mode` und schaltet die mysqli-Exceptions ab. Neue und umgebaute Abfragen nutzen `db_abfrage()`, `db_zeilen()`, `db_zeile()` und `db_wert()` mit `?`-Platzhaltern statt String-Verkettung. Ziel-Schema ist das der Instanz `kunden` in `utf8mb4`; die Altdaten sind teils doppelt kodiert und werden per Migration repariert. Dieser Stand darf nur zusammen mit der migrierten Datenbank live gehen.
Regeln für den Umbau:
- **Ergebnisse sind Strings** wie früher bei `mysqli_query()`: `db_zeilen()`, `db_zeile()`, `db_wert()` und `db_zuordnung()` wandeln die nativen int/float-Werte der Prepared Statements um. Wer `db_abfrage()` selbst ausliest, bekommt native Typen.
- **Formularwerte** über `formularText()`, `formularZahl()` (Komma als Dezimaltrenner, leer wird 0) und `formularGanzzahl()` aus `incs/saveNchange.php` holen der strikte Modus lehnt `''` in Zahlenspalten ab.
- **Änderungsprotokoll:** `saveLog()` bekommt den Text aus `db_sql_text()`. Die Tabelle `log` ist reine Dokumentation, nichts daraus wird ausgeführt.
- **Mehrschrittiges Speichern** in eine Transaktion, damit bei Fehlern keine halben Datensätze bleiben — aber über `beginneSpeichern()` / `beendeSpeichern()` aus `incs/saveNchange.php`, nicht über `mysqli_begin_transaction()` direkt. Die Speicherfunktionen rufen sich gegenseitig auf (`savePart()``saveAdress()``updateKunde()``saveAdress()`, `loeschePartner()``delRechnung()`), MariaDB kennt aber keine geschachtelten Transaktionen; ein Zähler sorgt dafür, dass nur der äußerste Aufruf öffnet und schließt.
- **Tabellen- und Spaltennamen** lassen sich nicht binden; nur feste Werte aus dem Code einsetzen, `LIMIT` als `(int)`.
- **Suchabfragen** (`create*Qry()` in `incs/listfuncs.php`) liefern `array("all", "limited", "params")`. Aufrufer nutzen `db_abfrage($dbconn, $q["limited"], $q["params"])` und `zaehleTreffer()`. Die Suchbegriffe sind Platzhalterwerte, `%` und `_` darin bleiben absichtlich Jokerzeichen — so ist die Suche dokumentiert. In der Autovervollständigung (`ajax/auto/`) werden sie dagegen über `db_like_praefix()` entwertet.
- **Werte aus der Datenbank sind kein HTML.** `GROUP_CONCAT` trennt mit einem Zeilenumbruch; zusammengebaut und escaped wird erst in `zeilenHtml()` bzw. `makenameline()`/`makeadressline()`/`maketelline()`.
Umgebaut: Login/Passkeys, Benutzereinstellungen, Änderungsprotokoll, Rechnungsmodul (`incs/rechnung.php`, `sites/rechnungadd.php`, `sites/umschlagshow.php`, `ajax/autosave.php`, `ajax/preview.php`, Rechnungssuche), Kunden und Lieferanten (`incs/saveNchange.php` samt `sites/kunden*.php`, `sites/liefer*.php`, Kunden-, Lieferanten-, Adress- und Kommissionssuche, `ajax/auto/`), Termine (`incs/termin.php` samt `sites/termin*.php`, Terminliste, Terminzettel). Offen: Projekte, Zeiten, Benutzerverwaltung, der Rest von `incs/makepdf.php`, `update/`.
Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird. Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird.
SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden. SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden.
## Termine
Ein Termin über mehrere Tage ist eine **Reihe einzelner Zeilen** in `termin`, die alle dieselbe `main_id` tragen — die id der ersten Zeile (des „Hauptsatzes“). Der Kalender zeigt die Zeilen einzeln, die Terminliste fasst sie über `main_id` zusammen.
Beim Speichern bleibt der Hauptsatz immer stehen und wird aktualisiert; nur die Folgetage werden gelöscht und neu angelegt. Der Termin behält dadurch seine id, egal ob aus einem Tag mehrere werden oder umgekehrt — Verweise auf die id (Drucken, Links, Protokoll) bleiben gültig. `terminHauptsatz()` löst dafür jede Zeilen-id auf ihre Reihe auf, damit auch der Einstieg über eine Nebenzeile funktioniert.
Urlaub und Krankheit sind Termine ohne Kundenadresse. Ihre Typ-ids sind fest verdrahtet — `TERMTYP_URLAUB` = 0 und `TERMTYP_KRANKHEIT` = 5 in `incs/termin.php`; `incs/users.php` rechnet den Urlaubsanspruch über `typ = 0` aus und `templates/addtermin.tpl` blendet danach die Felder um. `termtyp` muss also eine Zeile mit der id 0 enthalten; beim Kopieren einer Datenbank braucht es dafür `NO_AUTO_VALUE_ON_ZERO`, sonst macht MariaDB eine 1 daraus.
Ganztägige Termine haben die Dauer `24:00:00` — die Terminliste unterscheidet die Registerkarten daran.
## Fallstricke ## Fallstricke
- **`smarty/` enthält Smarty 4.5.6** — der schlichte Verzeichnisname sagt nichts über die Version. - **`smarty/` enthält Smarty 4.5.6** — der schlichte Verzeichnisname sagt nichts über die Version.
- **PHPMailer liegt in zwei Versionen parallel und beide sind aktiv:** `index.php` lädt `incs/PHPMailer_v6` für den Rechnungsversand, `sites/projectadd.php` dagegen `incs/PHPMailer_v5.1`. Keine der beiden ist entfernbar, ohne den jeweiligen Aufrufer umzustellen. - **PHPMailer liegt in zwei Versionen parallel und beide sind aktiv:** `index.php` lädt `incs/PHPMailer_v6` für den Rechnungsversand, `sites/projectadd.php` dagegen `incs/PHPMailer_v5.1`. Keine der beiden ist entfernbar, ohne den jeweiligen Aufrufer umzustellen.
- **PDF-Schriften nur über `PDF_SCHRIFT_SERIF` / `PDF_SCHRIFT_SANS`** (oben in `incs/makepdf.php`, FreeSerif/FreeSans). Die eingebauten PDF-Schriften Times/Helvetica können nur westeuropäische Zeichen; aus ř, ł, č würde ein „?“.
- **`incs/font/` gehört zu pChart, nicht zu TCPDF.** Die TTFs dort werden von `stats.php` für die Diagramme geladen; TCPDF bringt seine Schriften in `incs/tcpdf/fonts/` selbst mit. - **`incs/font/` gehört zu pChart, nicht zu TCPDF.** Die TTFs dort werden von `stats.php` für die Diagramme geladen; TCPDF bringt seine Schriften in `incs/tcpdf/fonts/` selbst mit.
- **`index.php` setzt `error_reporting(E_ERROR | E_PARSE)`.** Warnungen und Notices sind unterdrückt, und der Code verlässt sich darauf — nicht ohne Not hochdrehen, sonst überflutet es die Ausgabe. - **`index.php` setzt `error_reporting(E_ERROR | E_PARSE)`.** Warnungen und Notices sind unterdrückt, und der Code verlässt sich darauf — nicht ohne Not hochdrehen, sonst überflutet es die Ausgabe.
- **`templates_c/`, `ajax/templates_c/` und `temp/` müssen für den Webserver schreibbar sein.** Sie sind git-ignoriert und nur über `.gitkeep` im Repo vorhanden. - **`templates_c/`, `ajax/templates_c/` und `temp/` müssen für den Webserver schreibbar sein.** Sie sind git-ignoriert und nur über `.gitkeep` im Repo vorhanden.
@@ -102,8 +131,13 @@ SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über
Klassischer Login plus WebAuthn/FIDO2. Server-Seite: `authServer.php` mit `incs/WebAuthn` (Bibliothek von Lukas Buchs) und `incs/authHelper.php`; Client-Seite `js/auth.js`. Schlüsselverwaltung über `addKey.php` und `sites/userkeys.php`. Klassischer Login plus WebAuthn/FIDO2. Server-Seite: `authServer.php` mit `incs/WebAuthn` (Bibliothek von Lukas Buchs) und `incs/authHelper.php`; Client-Seite `js/auth.js`. Schlüsselverwaltung über `addKey.php` und `sites/userkeys.php`.
- **Passwort-Login nur aus dem lokalen Netz**, von außen nur per Passkey. „Lokal“ entscheidet `isLocal()` in `incs/authHelper.php` anhand von `$lokale_netze` (CIDR-Liste) aus der externen Config. Anfragen mit Proxy-Headern (`X-Forwarded-For`, `Forwarded` …) gelten nie als lokal. Webserver und MariaDB laufen in Docker auf dem NAS: **Das Docker-Netz gehört nicht in die Liste**, sonst gilt jede über den Docker- oder Reverse-Proxy eingehende Anfrage als lokal.
- **Passkeys anlegen** geht nur über eine Einmal-Freigabe: Ein Superadmin erzeugt in `addKey.php` einen `addKey`, `sites/userkeys.php` löst ihn ein und legt `$_SESSION["passkey_freigabe"]` (Benutzer-id, 5 Minuten) ab. `authServer.php` akzeptiert `getCreateArgs`/`processCreate` nur mit dieser Freigabe und nimmt die Benutzer-id von dort, nie aus der URL.
## Historie ## Historie
Am 2026-08-28 wurden tote Pfade entfernt: `smarty3/` (ungenutztes Smarty 3.1.6), `incs/tcpdf_old/`, `incs/fpdf.php` samt FPDF-Schriftmetriken und `incs/font/makefont/`, `sites/makepdf_OLD.php`, `incs/users_old.php` und `oldindex.php`. Auf keines davon verwies noch Code. Am 2026-08-28 wurden tote Pfade entfernt: `smarty3/` (ungenutztes Smarty 3.1.6), `incs/tcpdf_old/`, `incs/fpdf.php` samt FPDF-Schriftmetriken und `incs/font/makefont/`, `sites/makepdf_OLD.php`, `incs/users_old.php` und `oldindex.php`. Auf keines davon verwies noch Code.
Am 2026-09-22 kam `templates/calendar_month.tpl` dazu (Monatsansicht des Kalenders): kein Code band es ein, und unter PHP 8 lief es in einen Fehler.
Das Repository wurde am 2026-08-28 neu initialisiert. Die mitgelieferte Historie von 2014 war irreparabel beschädigt und wurde verworfen — der erste Commit ist der Ausgangsstand, nicht der Projektbeginn. Das Repository wurde am 2026-08-28 neu initialisiert. Die mitgelieferte Historie von 2014 war irreparabel beschädigt und wurde verworfen — der erste Commit ist der Ausgangsstand, nicht der Projektbeginn.
+8 -13
View File
@@ -11,22 +11,17 @@ if($settings != "valid")
if($settings == "valid") if($settings == "valid")
{ {
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw)) if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
$err = error("Verbindung zur Datenbank fehlgeschlagen!!"); $err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
if(!@mysqli_select_db($dbconn,$mysql_db))
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
} }
if($_SESSION["login"] == "valid" && isset($_GET["id"])){ // Wie sites/userkeys.php: nur Superadmins dürfen Passkeys vergeben
if(!mysqli_query($dbconn,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){ if($_SESSION["login"] == "valid" && isset($_GET["id"]) && ((int)substr($_SESSION["rights"], RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE)){
echo mysqli_error($dbconn); db_abfrage($dbconn, "DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE)") or print(mysqli_error($dbconn));
}
if(isLocal()){ if(isLocal()){
$accessKey = strval(random_int(0,99999999)); $accessKey = strval(random_int(0,99999999));
if(!mysqli_query($dbconn,"INSERT INTO addKey SET accesskey=".$accessKey.", datetime=NOW();")){ db_abfrage($dbconn, "INSERT INTO addKey SET accesskey = ?, datetime = NOW()", array($accessKey)) or print(mysqli_error($dbconn));
echo mysqli_error($dbconn); header('Location: https://wm.el-wa.org/kunden?action=userkeys&id='.(int)$_GET["id"].'&addKey='.$accessKey);
} echo 'https://wm.el-wa.org/kunden?action=userkeys&id='.(int)$_GET["id"].'&addKey='.$accessKey;
header('Location: https://wm.el-wa.org/kunden?action=userkeys&id='.$_GET["id"].'&addKey='.$accessKey);
echo 'https://wm.el-wa.org/kunden?action=userkeys&id='.$_GET["id"].'&addKey='.$accessKey;
}else{ }else{
echo "Keine Berechtigung."; echo "Keine Berechtigung.";
} }
+40 -44
View File
@@ -1,50 +1,46 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) /*
* Artikel-Autovervollständigung für das Rechnungsformular: je Bezeichnung
* der zuletzt angelegte Artikel, dazu Preis und Eigenschaften aus seiner
* letzten Verwendung.
*/
if(!$err && autoBegriff() !== "")
{ {
if($_GET["term"]) $treffer = db_zeilen($dbconn, "SELECT MAX(artikel.id) AS id FROM artikel
{
$qry = mysqli_query($dbconn,"SELECT MAX(artikel.id) AS id FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id
WHERE artikel.bezeichn LIKE '".$_GET["term"]."%' AND dropdown = 1 AND YEAR(artikel.datetime) >= YEAR(NOW())-1 GROUP BY artikel.bezeichn") or die(mysqli_error($dbconn));
if($tmpres=mysqli_fetch_array($qry))
{
$innerqry = mysqli_query($dbconn,"SELECT artikel.bezeichn, artikel.typ_id, artikel.einheit_id, artikel.id, artikel_rechn.preis, artikel_rechn.rech_id, artikel_rechn.posnr FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id
JOIN artikel_rechn ON artikel.id = art_id
WHERE artikel.id = ".$tmpres["id"]." ORDER BY artikel_rechn.art_id DESC LIMIT 1") or die(mysqli_error($dbconn));
$res = mysqli_fetch_array($innerqry);
echo "[ ";
echo '{"value": "'.$res[0].'","typ": "'.$res[1].'","einh": "'.$res[2].'","preis": "'.number_format($res[4],2,",","").'","eig":[';
$qry2 = mysqli_query($dbconn,"SELECT bezeichn, wert, einheit_id FROM eigensch
JOIN artikel_eigensch ON eig_id = eigensch.id
WHERE art_id='".$res[3]."' AND rech_id='".$res[5]."' AND artposnr = '".$res[6]."' ORDER BY posnr ASC");
if($res2 = mysqli_fetch_array($qry2))
echo '{"des":"'.$res2[0].'","val":"'.$res2[1].'", "einh":"'.$res2[2].'"}';
while($res2=mysqli_fetch_array($qry2))
echo ',{"des":"'.$res2[0].'","val":"'.$res2[1].'", "einh":"'.$res2[2].'"}';
echo ']}';
while($tmpres=mysqli_fetch_array($qry))
{
$innerqry = mysqli_query($dbconn,"SELECT artikel.bezeichn, artikel.typ_id, artikel.einheit_id, artikel.id, artikel_rechn.preis, artikel_rechn.rech_id, artikel_rechn.posnr FROM artikel
JOIN artikeltyp ON typ_id = artikeltyp.id JOIN artikeltyp ON typ_id = artikeltyp.id
JOIN artikel_rechn ON artikel.id = art_id WHERE artikel.bezeichn LIKE ? AND dropdown = 1
WHERE artikel.id = ".$tmpres["id"]." ORDER BY artikel_rechn.art_id DESC LIMIT 1") or die(mysqli_error($dbconn)); AND YEAR(artikel.datetime) >= YEAR(NOW())-1
$res = mysqli_fetch_array($innerqry); GROUP BY artikel.bezeichn LIMIT 25",
echo ',{"value": "'.$res[0].'","typ": "'.$res[1].'","einh": "'.$res[2].'","preis": "'.number_format($res[4],2,",","").'","eig":['; array(db_like_praefix(autoBegriff())));
$qry2 = mysqli_query($dbconn,"SELECT bezeichn, wert, einheit_id FROM eigensch
JOIN artikel_eigensch ON eig_id = eigensch.id $liste = array();
WHERE art_id='".$res[0]."' AND rech_id='".$res[5]."' AND artposnr = '".$res[6]."' ORDER BY posnr ASC"); foreach((array)$treffer as $t)
if($res2 = mysqli_fetch_array($qry2)) {
echo '{"des":"'.$res2[0].'","val":"'.$res2[1].'", "einh":"'.$res2[2].'"}'; $art = db_zeile($dbconn, "SELECT artikel.bezeichn, artikel.typ_id, artikel.einheit_id, artikel.id,
while($res2=mysqli_fetch_array($qry2)) artikel_rechn.preis, artikel_rechn.rech_id, artikel_rechn.posnr
echo ',{"des":"'.$res2[0].'","val":"'.$res2[1].'", "einh":"'.$res2[2].'"}'; FROM artikel
echo ']}'; JOIN artikeltyp ON artikel.typ_id = artikeltyp.id
} JOIN artikel_rechn ON artikel.id = art_id
echo "]"; WHERE artikel.id = ? ORDER BY artikel_rechn.art_id DESC LIMIT 1",
} array($t["id"]));
if(!$art)
continue;
$eigensch = db_zeilen($dbconn, "SELECT bezeichn AS des, wert AS val, einheit_id AS einh
FROM eigensch
JOIN artikel_eigensch ON eig_id = eigensch.id
WHERE art_id = ? AND rech_id = ? AND artposnr = ? ORDER BY posnr ASC",
array($art["id"], $art["rech_id"], $art["posnr"]));
$liste[] = array(
"value" => $art["bezeichn"],
"typ" => $art["typ_id"],
"einh" => $art["einheit_id"],
"preis" => number_format((float)$art["preis"], 2, ",", ""),
"eig" => $eigensch ? $eigensch : array(),
);
} }
header("Content-Type: application/json; charset=utf-8");
echo json_encode($liste, JSON_UNESCAPED_UNICODE);
} }
?>
+28
View File
@@ -0,0 +1,28 @@
<?php
/*
* Gemeinsames für die Autovervollständigung der Formulare.
*
* Die Endpunkte liefern eine JSON-Liste, die jQuery UI direkt als
* Vorschlagsliste verwendet: "value" ist der Vorschlag selbst, die übrigen
* Schlüssel füllen weitere Felder desselben Formulars (siehe die
* focus-Handler in den Templates).
*/
/* Suchbegriff aus der Anfrage, "" wenn keiner da ist */
function autoBegriff()
{
return isset($_GET["term"]) && is_string($_GET["term"]) ? trim($_GET["term"]) : "";
}
/*
* Führt die Abfrage aus und gibt das Ergebnis als JSON aus. Die Spalten
* heißen bereits so, wie das Formular sie erwartet. json_encode() kümmert
* sich ums Maskieren - früher war die Liste von Hand zusammengesetzt und
* ein Anführungszeichen im Ortsnamen machte sie unbrauchbar.
*/
function autoAusgabe($dbconn, $sql, $params)
{
$zeilen = db_zeilen($dbconn, $sql, $params);
header("Content-Type: application/json; charset=utf-8");
echo json_encode($zeilen ? $zeilen : array(), JSON_UNESCAPED_UNICODE);
}
+6 -20
View File
@@ -1,22 +1,8 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
if(!$err) require_once("./autofuncs.php");
{
if($_GET["term"]) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT bank AS value, blz FROM bank
$qry = mysqli_query($dbconn,"SELECT bank,blz FROM bank WHERE bank LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY bank ORDER BY bank ASC") or die(mysqli_error($dbconn)); WHERE bank LIKE ? GROUP BY bank ORDER BY bank ASC LIMIT 25",
if($res=mysqli_fetch_array($qry)) array(db_like_praefix(autoBegriff())));
{
echo "[ ";
echo '{"value": "'.$res[0].'","blz":"'.$res[1].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'","blz":"'.$res[1].'"}';
}
echo "]";
}
}
}
?>
+7 -19
View File
@@ -1,20 +1,8 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
if(!$err) require_once("./autofuncs.php");
{
if($_GET["term"]) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT blz AS value, bank FROM bank
$qry = mysqli_query($dbconn,"SELECT blz,bank FROM bank WHERE blz LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY blz ORDER BY blz ASC") or die(mysqli_error($dbconn)); WHERE blz LIKE ? GROUP BY blz ORDER BY blz ASC LIMIT 25",
if($res=mysqli_fetch_array($qry)) array(db_like_praefix(autoBegriff())));
{
echo "[ ";
echo '{"value": "'.$res[0].'","bank":"'.$res[1].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'","bank":"'.$res[1].'"}';
}
echo "]";
}
}
}
?>
+9 -2
View File
@@ -2,13 +2,20 @@
require_once("../../incs/constants.php"); require_once("../../incs/constants.php");
session_name(SESSION_NAME); session_name(SESSION_NAME);
session_start(); session_start();
// Alle AJAX-Endpunkte laden diese Datei: ohne Anmeldung gibt es keine Daten.
if(($_SESSION["login"] ?? "") !== "valid")
{
http_response_code(403);
exit("Nicht angemeldet.");
}
require_once("../../incs/settings.php"); require_once("../../incs/settings.php");
$settings=readsettings(); $settings=readsettings();
if($settings == "valid") if($settings == "valid")
{ {
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw); $dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
mysqli_select_db($dbconn,$mysql_db); if(!$dbconn)
$err = 1;
} }
else else
$err = 1; $err = 1;
+6 -20
View File
@@ -1,22 +1,8 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT land AS value FROM land
WHERE land LIKE ? ORDER BY land ASC LIMIT 25",
if($_GET["term"]) array(db_like_praefix(autoBegriff())));
{
$qry = mysqli_query($dbconn,"SELECT land FROM land WHERE land LIKE '".mysql_escape_string($_GET["term"])."%' ORDER BY land ASC") or die(mysqli_error($dbconn));
if($res=mysqli_fetch_array($qry))
{
echo "[ ";
echo '{"value": "'.$res[0].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'"}';
}
echo "]";
}
}
}
?>
+7 -20
View File
@@ -1,22 +1,9 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT ort AS value, plz, land AS lnd, vwahl AS vwl
FROM ort JOIN land ON land.id = ort.land_id
if($_GET["term"]) WHERE ort LIKE ? GROUP BY ort ORDER BY ort ASC LIMIT 25",
{ array(db_like_praefix(autoBegriff())));
$qry = mysqli_query($dbconn,"SELECT ort, plz, land, vwahl FROM ort JOIN land ON land.id = ort.land_id WHERE ort LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY ort ORDER BY ort ASC") or die(mysqli_error($dbconn));
if($res=mysqli_fetch_array($qry))
{
echo "[ ";
echo '{"value": "'.$res[0].'","plz":"'.$res[1].'","lnd":"'.$res[2].'","vwl":"'.$res[3].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'","plz":"'.$res[1].'","lnd":"'.$res[2].'","vwl":"'.$res[3].'"}';
}
echo "]";
}
}
}
?>
+7 -21
View File
@@ -1,23 +1,9 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT ortsteil AS value, plz, ort, land AS lnd, vwahl AS vwl
FROM ort JOIN land ON land.id = ort.land_id
if($_GET["term"]) WHERE ortsteil LIKE ? GROUP BY ortsteil ORDER BY ort ASC LIMIT 25",
{ array(db_like_praefix(autoBegriff())));
$qry = mysqli_query($dbconn,"SELECT ortsteil, plz, ort, land, vwahl FROM ort JOIN land ON land.id = ort.land_id WHERE ortsteil LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY ortsteil ORDER BY ort ASC") or die(mysqli_error($dbconn));
if($res=mysqli_fetch_array($qry))
{
echo "[ ";
echo '{"value": "'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].',"lnd":"'.$res[3].'","vwl":"'.$res[3].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].',"lnd":"'.$res[3].'","vwl":"'.$res[3].'"}';
}
echo "]";
}
}
}
?>
+7 -21
View File
@@ -1,23 +1,9 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT plz AS value, ort, land AS lnd, vwahl AS vwl
FROM ort JOIN land ON land.id = ort.land_id
if($_GET["term"]) WHERE plz LIKE ? GROUP BY plz ORDER BY plz ASC LIMIT 25",
{ array(db_like_praefix(autoBegriff())));
$qry = mysqli_query($dbconn,"SELECT plz, ort, land FROM ort JOIN land ON land.id = ort.land_id WHERE plz LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY plz ORDER BY plz ASC") or die(mysqli_error($dbconn));
if($res=mysqli_fetch_array($qry))
{
echo "[ ";
echo '{"value": "'.$res[0].'","ort":"'.$res[1].'","lnd":"'.$res[2].'","vwl":"'.$res[3].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value":"'.$res[0].'","ort":"'.$res[1].'","lnd":"'.$res[2].'","vwl":"'.$res[3].'"}';
}
echo "]";
}
}
}
?>
+9 -21
View File
@@ -1,23 +1,11 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT str AS value, plz, ort, ortsteil AS otl, land AS lnd
FROM strasse
if($_GET["term"]) JOIN ort ON ort.id = strasse.ort_id
{ JOIN land ON land.id = ort.land_id
$qry = mysqli_query($dbconn,"SELECT str, plz, ort, land FROM strasse JOIN ort ON ort.id = strasse.ort_id JOIN land ON land.id = ort.land_id WHERE str LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY str ORDER BY str ASC") or die(mysqli_error($dbconn)); WHERE str LIKE ? GROUP BY str ORDER BY str ASC LIMIT 25",
if($res=mysqli_fetch_array($qry)) array(db_like_praefix(autoBegriff())));
{
echo "[ ";
echo '{"value": "'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].'","lnd":"'.$res[3].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value": "'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].'","lnd":"'.$res[3].'"}';
}
echo "]";
}
}
}
?>
+7 -20
View File
@@ -1,22 +1,9 @@
<?php <?php
require_once("./connectmysql.php"); require_once("./connectmysql.php");
require_once("./autofuncs.php");
if(!$err) if(!$err && autoBegriff() !== "")
{ autoAusgabe($dbconn, "SELECT vwahl AS value, plz, ort, ortsteil AS otl, land AS lnd
FROM ort JOIN land ON land.id = ort.land_id
if($_GET["term"]) WHERE vwahl LIKE ? GROUP BY vwahl ORDER BY vwahl ASC LIMIT 25",
{ array(db_like_praefix(autoBegriff())));
$qry = mysqli_query($dbconn,"SELECT vwahl, plz, ort, ortsteil, land FROM ort JOIN land ON land.id = ort.land_id WHERE vwahl LIKE '".mysql_escape_string($_GET["term"])."%' GROUP BY vwahl ORDER BY vwahl ASC") or die(mysqli_error($dbconn));
if($res=mysqli_fetch_array($qry))
{
echo "[ ";
echo '{"value": "'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].'","otl":"'.$res[3].'","lnd":"'.$res[4].'"}';
while($res=mysqli_fetch_array($qry))
{
echo ',{"value": "'.$res[0].'","plz":"'.$res[1].'","ort":"'.$res[2].'","otl":"'.$res[3].'","lnd":"'.$res[4].'"}';
}
echo "]";
}
}
}
?>
+11 -183
View File
@@ -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");
@@ -9,202 +9,30 @@ require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
if(!isset($err)) if(!isset($err))
{ {
$show = ""; // Entwurf speichern, alle Artikel (auch deaktivierte)
if(isset($_POST["show_firmaanr"])) list($progressid, $fehler) = saveTmpRechnung($dbconn, false);
$show .= str_pad($_POST["show_firmaanr"],1,"0"); if($fehler)
$err = $fehler;
else 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); $adresse = makeadressblock($dbconn,$progressid,1);
$rechnung = makerechnungsarray($dbconn,$progressid,1); $rechnung = makerechnungsarray($dbconn,$progressid,1);
$artikel = makeartikelarray($dbconn,$progressid,1); $artikel = makeartikelarray($dbconn,$progressid,1);
if($adresse["lines"]>6) if($adresse["lines"]>6)
error("Die Adresse hat zu viele Zeilen!<br />Bitte wählen Sie einige Elemente ab."); error("Die Adresse hat zu viele Zeilen!<br />Bitte wählen Sie einige Elemente ab.");
if(!$_POST["show_ort"] || !$_POST["show_str"]) 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!"); 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"]) 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.)."); 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."); 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")) 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"); 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!"); ok("<img src='' id='saveimg' class='saveimg' /><br />Dokument wurde um ".date("H:i:s")." Uhr gespeichert!");
} }
} }
?> ?>
+11 -193
View File
@@ -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");
@@ -10,213 +10,31 @@ require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
if(!isset($err)) if(!isset($err))
{ {
$show = ""; // Entwurf speichern, nur aktive Artikel, und daraus die Vorschau erzeugen
if(isset($_POST["show_firmaanr"])) list($progressid, $fehler) = saveTmpRechnung($dbconn, true);
$show .= str_pad($_POST["show_firmaanr"],1,"0"); if($fehler)
$err = $fehler;
else 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"]))
$_POST["sub_mwst"] = "";
$sub_mwst = $_POST["sub_mwst"];
$rabatt = $_POST["rabatt"];
$rabattdesc = $_POST["rabattdesc"];
$buchKto = $_POST["buchKto"];
$lieferdatum = $_POST["lieferdatum"];
$qry = mysqli_query($dbconn, "SELECT id FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type' LIMIT 1") 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',
adresserweiterung='$adrerw',
rabattdesc='$rabattdesc',
buchungsKto_id = '$buchKto',
lieferdatum='$lieferdatum',
datetime=NOW()") or $err=error("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',
adresserweiterung='$adrerw',
rabattdesc='$rabattdesc',
buchungsKto_id = '$buchKto',
lieferdatum='$lieferdatum',
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))
{
if($_POST["artact".$i])
{
$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))
{ {
$adresse = makeadressblock($dbconn,$progressid,1); $adresse = makeadressblock($dbconn,$progressid,1);
$rechnung = makerechnungsarray($dbconn,$progressid,1); $rechnung = makerechnungsarray($dbconn,$progressid,1);
$artikel = makeartikelarray($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($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)
warning("Es sind noch keine Artikel vorhanden. Bitte Fügen Sie Artikel durch eintragen einer Artikelbeschreibung ein.");
if(!is_file("../pics/users/".$_SESSION["user"].".png"))
error("Für Ihren Benutzer wurde noch keine Unterschrift hinterlegt. Bitte vergessen Sie nicht zu unterschreiben.");
*/
$pdf = makerawPDF(1); $pdf = makerawPDF(1);
makefirstpage($pdf,$adresse["adresse"],$rechnung,1); makefirstpage($pdf,$adresse["adresse"],$rechnung,1);
$gesamtpreis = 0;
if(count($artikel)) if(count($artikel))
{ {
$gesamtpreis = maketable($pdf,$artikel,$rechnung,1); $gesamtpreis = maketable($pdf,$artikel,$rechnung,1);
} }
makeEndPage($pdf,$rechnung,$gesamtpreis,1); makeEndPage($pdf,$rechnung,$gesamtpreis,1);
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime()); $tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
savePDF($pdf,"../temp/pdfpreview/$tmppdfname.pdf"); savePDF($pdf,"../temp/pdfpreview/$tmppdfname.pdf");
echo makeImageFromPDF("../temp/pdfpreview/$tmppdfname.pdf"); echo makeImageFromPDF("../temp/pdfpreview/$tmppdfname.pdf");
} }
} }
?> ?>
+34 -38
View File
@@ -1,56 +1,52 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 50; $pagesize = 50;
if(!isset($err))
$err = "";
if(!$err) if(!$err)
{ {
$speciallines=array(); // kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$fulltag = utf8_encode($_GET["search"]); $link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
$src = explode(" ",$fulltag); $field = isset($_GET["field"]) && is_string($_GET["field"]) ? $_GET["field"] : "";
$combiner = mysql_escape_string($_GET["link"]); $page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
if($combiner != "AND" && $combiner != "OR") $rechid = isset($_GET["rechid"]) ? (int)$_GET["rechid"] : 0;
{ // steuert, wofür die gewählte Adresse verwendet wird
$combiner = "AND"; $subact = (isset($_GET["subact"]) && $_GET["subact"] == "copy") ? "copy" : "changeadr";
}
$page = $_GET["page"]; $speciallines = array();
$listlines = array();
$queries = createAdressQry($page,$pagesize,$src,$combiner,$_GET["field"],0,1); $src = explode(" ", $fulltag);
$qry = mysqli_query($dbconn,$queries["all"]) $combiner = $link == "OR" ? "OR" : "AND";
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $queries = createAdressQry($page,$pagesize,$src,$combiner,$field,0,1);
$numres = zaehleTreffer($dbconn, $queries);
if(!$numres) if(!$numres)
{ {
$queries = createAdressQry($page,$pagesize,$src,$combiner,$_GET["field"],1,1); $queries = createAdressQry($page,$pagesize,$src,$combiner,$field,1,1);
$qry = mysqli_query($dbconn,$queries["all"]) $numres = zaehleTreffer($dbconn, $queries);
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
} }
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$name = $res["vname"]." ".$res["nname"]; $adresse = makeadressline($res);
if($res["firma"]) $waehlen = "<a href='?action=rechnungadd&id=".$rechid."&".$subact."=1&adrid=".(int)$res["adrid"]."'><span class='check' title='Diese Adresse verwenden'></span></a>";
$name .= " <i><u>".$res["firma"]."</u></i>"; $zeile = array($waehlen." &nbsp;&nbsp;".(int)$res["kdnr"], makenameline($res), $adresse["ort"], $adresse["str"], maketelline($res));
if($res["vwahl"]) if(empty($res["updated_by"]))
$res["tel"] = $res["vwahl"]."/".$res["tel"]; $listlines[] = $zeile;
if(!$res["updated_by"])
$listlines[] = array("<a href='?action=rechnungadd&id=".$_GET["rechid"]."&".$_GET["subact"]."=1&adrid=".$res["adrid"]."'><span class='check' title='Diese Adresse verwenden'></span></a> &nbsp;&nbsp;".$res["kdnr"]."",$name,$res["plz"]." ".$res["ort"], $res["str"]." ".$res["hnr"], $res["tel"]);
else else
$speciallines[] = array("<a href='?action=rechnungadd&id=".$_GET["rechid"]."&".$_GET["subact"]."=1&adrid=".$res["adrid"]."'><span class='check' title='Diese Adresse verwenden'></span></a> &nbsp;&nbsp;".$res["kdnr"]."",$name,$res["plz"]." ".$res["ort"], $res["str"]." ".$res["hnr"], $res["tel"]); $speciallines[] = $zeile;
} }
$headings = array("Kd.Nr.","Name/<i><u>Firma</u></i>","Ort","Straße","Telefon"); $headings = array("Kd.Nr.","Name/<i><u>Firma</u></i>","Ort","Straße","Telefon");
$lastdisplay = ($page+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
@@ -60,12 +56,12 @@ if(!$err)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Adressen sind insgesamt gespeichert."); ok($numres." Adressen sind insgesamt gespeichert.");
displayPages($pagesize,$page,$numres,"ajax_searchadress"); displayPages($pagesize,$page,$numres,"ajax_searchadress",",".$rechid.",'".$subact."'");
displayList($headings,$listlines,$speciallines); displayList($headings,$listlines,$speciallines);
displayPages($pagesize,$page,$numres,"ajax_searchadress"); displayPages($pagesize,$page,$numres,"ajax_searchadress",",".$rechid.",'".$subact."'");
} }
else else
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
} }
?> ?>
+31 -76
View File
@@ -1,89 +1,45 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 20; $pagesize = 20;
if(!isset($err))
$err = "";
if(!$err) if(!$err)
{ {
// kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
$page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
$id = isset($_GET["kdnid"]) ? (int)$_GET["kdnid"] : 0;
$src = explode(" ", $fulltag);
$combiner = $link == "OR" ? "OR" : "AND";
$listlines = array();
$fulltag = utf8_encode($_GET["search"]);
$src = explode(" ",$fulltag);
$combiner = mysql_escape_string($_GET["link"]);
if($combiner != "AND" && $combiner != "OR")
{
$combiner = "AND";
}
$page = $_GET["page"];
$skspage = $_GET["skspage"];
$typ = $_GET["typ"];
$id = $_GET["kdnid"];
$queries = createKdnProjectQry($page,$pagesize,$src,$combiner,$id); $queries = createKdnProjectQry($page,$pagesize,$src,$combiner,$id);
$qry = mysqli_query($dbconn,$queries["all"]) $numres = zaehleTreffer($dbconn, $queries);
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
}
*/
if($numres) if($numres)
{ {
$listlines=array(); $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
$qry = mysqli_query($dbconn,$queries["limited"]) or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Projekt ".$res["name"]."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=projectadd&id=".$res["id"]."&del=1\")'></span>"; $projektid = (int)$res["id"];
$actions .= "<a href='?action=projectadd&id=".$res["id"]."'><span class='edit' title='Projekt ändern'></span></a>"; $name = htmlspecialchars((string)$res["name"]);
//$actions .= "<a href='?action=projectadd&id=".$res["id"]."&copy=1'><span class='copy' title='Projekt kopieren'></span></a>"; $actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Projekt ".$name."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=projectadd&id=".$projektid."&del=1\")'></span>";
//$tmpqry = mysqli_query($dbconn,"SELECT id FROM kontakt WHERE partner_id = '$id' AND typ_id = 1"); $actions .= "<a href='?action=projectadd&id=".$projektid."'><span class='edit' title='Projekt ändern'></span></a>";
//if(mysqli_fetch_array($tmpqry)) $listlines[] = array("<a href='?action=projectshow&id=".$projektid."'>".$name."</a>",
// $actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&mail=1'><span class='mail' title='Dokument per E-Mail versenden'></span></a>"; htmlspecialchars((string)$res["date"]),
/* htmlspecialchars((string)$res["work"]),
$res["drechnr"] = substr($res["rechnr"],0,4)."-".substr($res["rechnr"],4,2)."-".substr($res["rechnr"],6,2).".".substr($res["rechnr"],8,2); $actions);
switch($res["typ_id"])
{
case 1:
$res["drechnr"] = "R".$res["drechnr"];
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&newtype=2'><span class='gutschradd' title='Gutschrift aus dieser Rechnung erstellen'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&newtype=6'><span class='mahnadd' title='Mahnung aus dieser Rechnung erstellen'></span></a>";
break;
case 2:
$res["drechnr"] = "G".$res["drechnr"];
break;
case 3:
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&newtype=1'><span class='rechnadd' title='Rechnung aus diesem Angebot erstellen'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&newtype=4'><span class='bestadd' title='Auftragsbestätigung aus diesem Angebot erstellen'></span></a>";
$res["drechnr"] = "A".$res["drechnr"];
break;
case 4:
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&newtype=1'><span class='rechnadd' title='Rechnung aus dieser Auftragsbestätigung erstellen'></span></a>";
$res["drechnr"] = "B".$res["drechnr"];
break;
}
if(!$res["drechnr"])
$res["drechnr"] = $res["drechnr"];
*/
$listlines[] = array("<a href='?action=projectshow&id=".$res["id"]."'>".$res["name"]."</a>",
$res["date"],
$res["work"],
$actions
);
} }
$headings = array("Name","Datum","Unberechnete<br />Stunden","Aktionen"); $headings = array("Name","Datum","Unberechnete<br />Stunden","Aktionen");
$lastdisplay = ($page+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
if($numres < $lastdisplay) if($numres < $lastdisplay)
@@ -92,18 +48,17 @@ if(!$err)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Projekte sind insgesamt gespeichert."); ok($numres." Projekte sind insgesamt gespeichert.");
displaySplitPages($pagesize,$page,$skspage,0,$numres,"ajax_searchkdnprojects",",$typ,$id"); displayPages($pagesize,$page,$numres,"ajax_searchkdnprojects",",".$id);
displayList($headings,$listlines,$speciallines); displayList($headings,$listlines,array());
displaySplitPages($pagesize,$page,$skspage,0,$numres,"ajax_searchkdnprojects",",$typ,$id"); displayPages($pagesize,$page,$numres,"ajax_searchkdnprojects",",".$id);
} }
else else
{ {
if($fulltag) if($fulltag)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
else else
ok("Keine Einträge."); ok("Keine Einträge.");
} }
} }
?> ?>
+19 -18
View File
@@ -16,26 +16,28 @@ if(!isset($err))
if(!isset($_GET["link"])){ if(!isset($_GET["link"])){
$_GET["link"] =""; $_GET["link"] ="";
} }
$fulltag = utf8_encode($_GET["search"]); // kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$src = explode(" ",$fulltag); $src = explode(" ",$fulltag);
$combiner = mysql_escape_string($_GET["link"]); $combiner = $_GET["link"];
if($combiner != "AND" && $combiner != "OR") if($combiner != "AND" && $combiner != "OR")
{ {
$combiner = "AND"; $combiner = "AND";
} }
$page = $_GET["page"]; $page = (int)$_GET["page"];
$skspage = $_GET["skspage"]; $skspage = (int)$_GET["skspage"];
$typ = $_GET["typ"]; // landen auch in JavaScript-Aufrufen der Seitennavigation
$id = $_GET["kdnid"]; $typ = (int)$_GET["typ"];
$id = (int)$_GET["kdnid"];
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,0); $queries = createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,0);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
/* /*
if(!$numres) if(!$numres)
{ {
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1); $queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -44,7 +46,7 @@ if(!isset($err))
if($numres) if($numres)
{ {
$listlines=array(); $listlines=array();
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
@@ -53,8 +55,7 @@ if(!isset($err))
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."'><span class='edit' title='Dokument ändern'></span></a>"; $actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."'><span class='edit' title='Dokument ändern'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&changeadr=1'><span class='changeadr' title='Adresse ändern'></span></a>"; $actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&changeadr=1'><span class='changeadr' title='Adresse ändern'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&copy=1'><span class='copy' title='Dokument kopieren'></span></a>"; $actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&copy=1'><span class='copy' title='Dokument kopieren'></span></a>";
$tmpqry = mysqli_query($dbconn,"SELECT id FROM kontakt WHERE partner_id = '$id' AND typ_id = 1"); if(db_wert($dbconn, "SELECT id FROM kontakt WHERE partner_id = ? AND typ_id = 1 LIMIT 1", array($id)))
if(mysqli_fetch_array($tmpqry))
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&mail=1'><span class='mail' title='Dokument per E-Mail versenden'></span></a>"; $actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&mail=1'><span class='mail' title='Dokument per E-Mail versenden'></span></a>";
switch($res["typ_id"]) switch($res["typ_id"])
@@ -87,14 +88,14 @@ if(!isset($err))
if($res["storno"] == 1){ if($res["storno"] == 1){
$listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'><font color='#FF0000'>".$res["drechnr"]."</font></a>", $listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'><font color='#FF0000'>".$res["drechnr"]."</font></a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
$actions $actions
); );
} }
else{ else{
$listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["drechnr"]."</a>", $listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["drechnr"]."</a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
$actions $actions
); );
} }
@@ -123,19 +124,19 @@ if(!isset($err))
//OLD SKS RECHNUNGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //OLD SKS RECHNUNGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(getUserSetting($dbconn,"show_sks", mysql_escape_string($_SESSION["user"]), 1)) //show sks rechnungen???? if(getUserSetting($dbconn,"show_sks", $_SESSION["user"], 1)) //show sks rechnungen????
{ {
echo "<h3>SKS Dokumente:</h3><div class='line'></div>"; echo "<h3>SKS Dokumente:</h3><div class='line'></div>";
$queries=""; $queries="";
$queries = createKdnRechQry($skspage,$pagesize,$src,$combiner,$id,$typ,1); $queries = createKdnRechQry($skspage,$pagesize,$src,$combiner,$id,$typ,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
/* /*
if(!$numres) if(!$numres)
{ {
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1); $queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -145,13 +146,13 @@ if(!isset($err))
{ {
$speciallines[]=array(); $speciallines[]=array();
$listlines[]=array(); $listlines[]=array();
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$speciallines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["rechnr"]."</a>", $speciallines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["rechnr"]."</a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
"<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Dokument ".$res["rechnr"]."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=rechadd&rechid=".$res["id"]."&del=1\")'></span>"); "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Dokument ".$res["rechnr"]."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=rechadd&rechid=".$res["id"]."&del=1\")'></span>");
} }
$headings = array("Nummer","Datum","Artikel","Aktion"); $headings = array("Nummer","Datum","Artikel","Aktion");
+36 -55
View File
@@ -1,66 +1,47 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 50; $pagesize = 50;
if(!isset($err))
$err = "";
if(!$err) if(!$err)
{ {
$fulltag = utf8_encode($_GET["search"]); // kommt per encodeURIComponent bereits als UTF-8
$src = explode(" ",$fulltag); $fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$combiner = mysql_escape_string($_GET["link"]); $link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
if($combiner != "AND" && $combiner != "OR") $page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
{ $id = isset($_GET["kdnid"]) ? (int)$_GET["kdnid"] : 0;
$combiner = "AND";
} $src = explode(" ", $fulltag);
$page = $_GET["page"]; $combiner = $link == "OR" ? "OR" : "AND";
$id = $_GET["kdnid"]; $listlines = array();
$queries = createKommQry($page,$pagesize,$src,$combiner,$id,$typ,0);
$qry = mysqli_query($dbconn,$queries["all"]) $queries = createKommQry($page,$pagesize,$src,$combiner,$id);
or die("Datenbank fehler: ".mysqli_error($dbconn)); $numres = zaehleTreffer($dbconn, $queries);
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
}
*/
if($numres) if($numres)
{ {
$listlines=array(); $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
$qry = mysqli_query($dbconn,$queries["limited"]) or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$actions = " <a href='?action=kundenchange&do=adress&adressid=".$res["id"]."&kunde=$id'><span class='edit' title='Adresse ändern'></span></a>"; $adrid = (int)$res["id"];
$actions .= " <span class='del' title='Adresse löschen' onClick='askdel(\"Möchten Sie diese Adresse<br /><b>UND ALLE ZUGEHÖRIGEN RECHNUNGEN</b><br />wirklich unwiederruflich löschen?\",\"?action=kundenchange&do=adress&adressid=".$res["id"]."&del=1\")'></span>"; $karte = rawurlencode($res["plz"]." ".$res["ort"]." ".$res["str"]." ".$res["hnr"]);
$actions .= " <a href='http://maps.google.com?q=".$res["plz"]."+".$res["ort"]."+".$res["str"]."+".$res["hnr"]."' class='noloading' target='_blank'><span class='map' title='Auf Karte zeigen'></span></a>"; $actions = " <a href='?action=kundenchange&do=adress&adressid=".$adrid."&kunde=".$id."'><span class='edit' title='Adresse ändern'></span></a>";
$actions .= " <a href='?action=terminadd&adressid=".$res["id"]."'><span class='termadd' title='Termin anlegen'></span></a><br />"; $actions .= " <span class='del' title='Adresse löschen' onClick='askdel(\"Möchten Sie diese Adresse<br /><b>UND ALLE ZUGEHÖRIGEN RECHNUNGEN</b><br />wirklich unwiederruflich löschen?\",\"?action=kundenchange&do=adress&adressid=".$adrid."&del=1\")'></span>";
$actions .= " <a href='?action=rechnungadd&type=1&adressid=".$res["id"]."'><span class='rechnadd' title='Rechnung anlegen'></span></a>"; $actions .= " <a href='https://maps.google.com/?q=".$karte."' class='noloading' target='_blank' rel='noopener'><span class='map' title='Auf Karte zeigen'></span></a>";
$actions .= " <a href='?action=rechnungadd&type=1&adressid=".$res["id"]."'><span class='gutschradd' title='Gutschrift anlegen'></span></a>"; $actions .= " <a href='?action=terminadd&adressid=".$adrid."'><span class='termadd' title='Termin anlegen'></span></a><br />";
$actions .= " <a href='?action=rechnungadd&type=3&adressid=".$res["id"]."'><span class='angadd' title='Angebot anlegen'></span></a>"; $actions .= " <a href='?action=rechnungadd&type=1&adressid=".$adrid."'><span class='rechnadd' title='Rechnung anlegen'></span></a>";
$actions .= " <a href='?action=rechnungadd&type=5&adressid=".$res["id"]."'><span class='letteradd' title='Brief anlegen'></span></a><br />"; $actions .= " <a href='?action=rechnungadd&type=2&adressid=".$adrid."'><span class='gutschradd' title='Gutschrift anlegen'></span></a>";
$tmpqry = mysqli_query($dbconn,"SELECT id FROM kontakt WHERE partner_id = '$id' AND typ_id = 1"); $actions .= " <a href='?action=rechnungadd&type=3&adressid=".$adrid."'><span class='angadd' title='Angebot anlegen'></span></a>";
if(mysqli_fetch_array($tmpqry)) $actions .= " <a href='?action=rechnungadd&type=5&adressid=".$adrid."'><span class='letteradd' title='Brief anlegen'></span></a><br />";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&mail=1'><span class='mail' title='Dokument per E-Mail versenden'></span></a>"; $adresse = makeadressline($res);
$name=makenameline($res); $listlines[] = array(makenameline($res), $adresse["ort"], $adresse["str"], maketelline($res), $actions);
$adresse=makeadressline($res);
$listlines[] = array($name,
$adresse["ort"], $adresse["str"],
maketelline($res),
$actions
);
} }
$headings = array("Name","Ort","Straße","Tel","Aktionen"); $headings = array("Name","Ort","Straße","Tel","Aktionen");
$lastdisplay = ($page+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
@@ -70,17 +51,17 @@ if(!$err)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Kommissionen sind insgesamt gespeichert."); ok($numres." Kommissionen sind insgesamt gespeichert.");
displaySplitPages($pagesize,$page,$skspage,0,$numres,"ajax_searchkomm",",$id"); displayPages($pagesize,$page,$numres,"ajax_searchkomm",",".$id);
displayList($headings,$listlines,$speciallines); displayList($headings,$listlines,array());
displaySplitPages($pagesize,$page,$skspage,0,$numres,"ajax_searchkomm",",$id"); displayPages($pagesize,$page,$numres,"ajax_searchkomm",",".$id);
} }
else else
{ {
if($fulltag) if($fulltag)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
else else
ok("Keine Einträge."); ok("Keine Einträge.");
} }
} }
?> ?>
+36 -50
View File
@@ -1,85 +1,71 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 50; $pagesize = 50;
if(!isset($err)){ if(!isset($err))
$err=""; $err = "";
}
if(!$err) if(!$err)
{ {
if(!isset($_GET["link"])){ // kommt per encodeURIComponent bereits als UTF-8
$_GET["link"] = ""; $fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
} $link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
if(!isset($_GET["field"])){ $field = isset($_GET["field"]) && is_string($_GET["field"]) ? $_GET["field"] : "";
$_GET["field"] = ""; $page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
}
$_SESSION["search"] = $_GET["search"]; $_SESSION["search"] = $fulltag;
$_SESSION["link"] = $_GET["link"]; $_SESSION["link"] = $link;
$_SESSION["field"] = $_GET["field"]; $_SESSION["field"] = $field;
$_SESSION["page"] = $_GET["page"]; $_SESSION["page"] = $page;
$speciallines=array();
$speciallines = array();
$fulltag = utf8_encode($_GET["search"]); $listlines = array();
$src = explode(" ",$fulltag); $src = explode(" ", $fulltag);
$combiner = mysql_escape_string($_GET["link"]); $combiner = $link == "OR" ? "OR" : "AND";
if($combiner != "AND" && $combiner != "OR")
{ $queries = createPartQry($page,$pagesize,$src,$combiner,$field,0,1);
$combiner = "AND"; $numres = zaehleTreffer($dbconn, $queries);
}
$page = $_GET["page"];
$queries = createPartQry($page,$pagesize,$src,$combiner,$_GET["field"],0,1);
$qry = mysqli_query($dbconn,$queries["all"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
if(!$numres) if(!$numres)
{ {
$queries = createPartQry($page,$pagesize,$src,$combiner,$_GET["field"],1,1); $queries = createPartQry($page,$pagesize,$src,$combiner,$field,1,1);
$qry = mysqli_query($dbconn,$queries["all"]) $numres = zaehleTreffer($dbconn, $queries);
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
} }
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$name = $res["vname"]." ".$res["nname"]; $adresse = makeadressline($res);
if(isset($res["firma"])) $kdnr = (int)$res["kdnr"];
$name .= " <i><u>".$res["firma"]."</u></i>"; $aktionen = "<span class='del' title='Kunde löschen' onClick='askdel(\"Möchten Sie den Kunden ".$kdnr." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=kundenadd&kundeid=".$kdnr."&del=1\")'></span>"
if(isset($res["vwahl"])) ."<a href='?action=projectlist&kundeid=".$kdnr."'><span class='projects' title='Projekte dieses Kunden auflisten'></span></a>";
$res["tel"] = $res["vwahl"]."/".$res["tel"]; $zeile = array("<a href='?action=kundenshow&id=".$kdnr."'>".$kdnr."</a>", makenameline($res), $adresse["ort"], $adresse["str"], maketelline($res), $aktionen);
$adresse=makeadressline($res); if(empty($res["updated_by"]))
if(!isset($res["updated_by"])) $listlines[] = $zeile;
$listlines[] = array("<a href='?action=kundenshow&id=".$res["kdnr"]."'>".$res["kdnr"]."</a>",makenameline($res),$adresse["ort"], $adresse["str"], maketelline($res),"<span class='del' title='Kunde löschen' onClick='askdel(\"Möchten Sie den Kunden ".$res["kdnr"]." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=kundenadd&kundeid=".$res["kdnr"]."&del=1\")'></span><a href='?action=projectlist&kundeid=".$res["kdnr"]."'><span class='projects' title='Projekte dieses Kunden auflisten'></span></a>");
else else
$speciallines[] = array("<a href='?action=kundenshow&id=".$res["kdnr"]."'>".$res["kdnr"]."</a>",makenameline($res),$adresse["ort"], $adresse["str"], maketelline($res),"<span class='del' title='Kunde löschen' onClick='askdel(\"Möchten Sie den Kunden ".$res["kdnr"]." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=kundenadd&kundeid=".$res["kdnr"]."&del=1\")'></span><a href='?action=projectlist&kundeid=".$res["kdnr"]."'><span class='projects' title='Projekte dieses Kunden auflisten'></span></a>"); $speciallines[] = $zeile;
} }
$headings = array("Kd.Nr.","Name/<i><u>Firma</u></i>","Ort","Straße","Telefon","Löschen"); $headings = array("Kd.Nr.","Name/<i><u>Firma</u></i>","Ort","Straße","Telefon","Löschen");
$lastdisplay = (intval($page)+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
if($numres < $lastdisplay) if($numres < $lastdisplay)
$lastdisplay = $numres; $lastdisplay = $numres;
if($fulltag) if($fulltag)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Kunden sind insgesamt gespeichert."); ok($numres." Kunden sind insgesamt gespeichert.");
displayPages($pagesize,$page,$numres,"ajax_searchkunden"); displayPages($pagesize,$page,$numres,"ajax_searchkunden");
displayList($headings,$listlines,$speciallines); displayList($headings,$listlines,$speciallines);
displayPages($pagesize,$page,$numres,"ajax_searchkunden"); displayPages($pagesize,$page,$numres,"ajax_searchkunden");
} }
else else
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
} }
?> ?>
+29 -44
View File
@@ -1,61 +1,47 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 50; $pagesize = 50;
if(!isset($err)) if(!isset($err))
$err = "";
if(!$err)
{ {
// kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
$field = isset($_GET["field"]) && is_string($_GET["field"]) ? $_GET["field"] : "";
$page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
if(!isset($_GET["link"])){ $listlines = array();
$_GET["link"]=""; $src = explode(" ", $fulltag);
} $combiner = $link == "OR" ? "OR" : "AND";
$fulltag = utf8_encode($_GET["search"]); $queries = createPartQry($page,$pagesize,$src,$combiner,$field,0,2);
$src = explode(" ",$fulltag); $numres = zaehleTreffer($dbconn, $queries);
$combiner = mysql_escape_string($_GET["link"]);
if($combiner != "AND" && $combiner != "OR")
{
$combiner = "AND";
}
$page = $_GET["page"];
$queries = createPartQry($page,$pagesize,$src,$combiner,$_GET["field"],0,2);
$qry = mysqli_query($dbconn,$queries["all"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
if(!$numres) if(!$numres)
{ {
$queries = createPartQry($page,$pagesize,$src,$combiner,$_GET["field"],1,2); $queries = createPartQry($page,$pagesize,$src,$combiner,$field,1,2);
$qry = mysqli_query($dbconn,$queries["all"]) $numres = zaehleTreffer($dbconn, $queries);
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
} }
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
if(!isset($res["nname"])) $adresse = makeadressline($res);
$name = $res["firma"]; $kdnr = (int)$res["kdnr"];
else $aktionen = "<span class='del' title='Lieferant löschen' onClick='askdel(\"Möchten Sie den Lieferanten ".$kdnr." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=lieferadd&kundeid=".$kdnr."&del=1\")'></span>";
$name = $res["vname"]." ".$res["nname"]; $listlines[] = array("<a href='?action=liefershow&id=".$kdnr."'>".$kdnr."</a>", makenameline($res), $adresse["ort"], $adresse["str"], maketelline($res), $aktionen);
if(isset($res["vwahl"]))
$res["tel"] = $res["vwahl"]."/".$res["tel"];
if(!isset($res["updated_by"]))
$listlines[] = array("<a href='?action=liefershow&id=".$res["kdnr"]."'>".$res["kdnr"]."</a>",$name,$res["plz"]." ".$res["ort"], $res["str"]." ".$res["hnr"], $res["tel"],"<span class='del' title='Kunde löschen' onClick='askdel(\"Möchten Sie den Kunden ".$res["kdnr"]." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=kundenadd&kundeid=".$res["kdnr"]."&del=1\")'></span>");
else
$speciallines[] = array("<a href='?action=liefershow&id=".$res["kdnr"]."'>".$res["kdnr"]."</a>",$name,$res["plz"]." ".$res["ort"], $res["str"]." ".$res["hnr"], $res["tel"],"<span class='del' title='Kunde löschen' onClick='askdel(\"Möchten Sie den Kunden ".$res["kdnr"]." und<br />ALLE ZUGEHÖRIGEN DATEN<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=kundenadd&kundeid=".$res["kdnr"]."&del=1\")'></span>");
} }
$headings = array("Kd.Nr.","Name/Firma","Ort","Straße","Telefon","Löschen"); $headings = array("Kd.Nr.","Name/<i><u>Firma</u></i>","Ort","Straße","Telefon","Löschen");
$lastdisplay = ($page+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
if($numres < $lastdisplay) if($numres < $lastdisplay)
$lastdisplay = $numres; $lastdisplay = $numres;
@@ -63,13 +49,12 @@ if(!isset($err))
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Lieferanten sind insgesamt gespeichert."); ok($numres." Lieferanten sind insgesamt gespeichert.");
$speciallines = Array(); displayPages($pagesize,$page,$numres,"ajax_searchliefer");
displayPages($pagesize,$page,$numres,"ajax_searchkunden"); displayList($headings,$listlines,array());
displayList($headings,$listlines,$speciallines); displayPages($pagesize,$page,$numres,"ajax_searchliefer");
displayPages($pagesize,$page,$numres,"ajax_searchkunden");
} }
else else
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
} }
?> ?>
+15 -14
View File
@@ -22,26 +22,27 @@ if(!isset($err))
if(!isset($_GET["kdnid"])){ if(!isset($_GET["kdnid"])){
$_GET["kdnid"]=""; $_GET["kdnid"]="";
} }
$fulltag = utf8_encode($_GET["search"]); // kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$src = explode(" ",$fulltag); $src = explode(" ",$fulltag);
$combiner = mysql_escape_string($_GET["link"]); $combiner = $_GET["link"];
if($combiner != "AND" && $combiner != "OR") if($combiner != "AND" && $combiner != "OR")
{ {
$combiner = "AND"; $combiner = "AND";
} }
$page = $_GET["page"]; $page = (int)$_GET["page"];
$skspage = $_GET["skspage"]; $skspage = (int)$_GET["skspage"];
$typ = $_GET["typ"]; $typ = $_GET["typ"];
$id = $_GET["kdnid"]; $id = $_GET["kdnid"];
$queries = createRechQry($page,$pagesize,$src,$combiner,0); $queries = createRechQry($page,$pagesize,$src,$combiner,0);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
/* /*
if(!$numres) if(!$numres)
{ {
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1); $queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -49,7 +50,7 @@ if(!isset($err))
*/ */
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
@@ -82,14 +83,14 @@ if(!isset($err))
if($res["storno"] == 1){ if($res["storno"] == 1){
$listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'><font color='#FF0000'>".$res["drechnr"]."</font></a>", $listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'><font color='#FF0000'>".$res["drechnr"]."</font></a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
$actions $actions
); );
} }
else{ else{
$listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["drechnr"]."</a>", $listlines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["drechnr"]."</a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
$actions $actions
); );
} }
@@ -118,18 +119,18 @@ if(!isset($err))
//OLD SKS RECHNUNGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //OLD SKS RECHNUNGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(getUserSetting($dbconn,"show_sks", mysql_escape_string($_SESSION["user"]), 1)) //show sks rechnungen???? if(getUserSetting($dbconn,"show_sks", $_SESSION["user"], 1)) //show sks rechnungen????
{ {
echo "<h3>SKS Dokumente:</h3><div class='line'></div>"; echo "<h3>SKS Dokumente:</h3><div class='line'></div>";
$queries = createRechQry($skspage,$pagesize,$src,$combiner,1); $queries = createRechQry($skspage,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
/* /*
if(!$numres) if(!$numres)
{ {
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1); $queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"]) $qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry); $numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen"); message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -137,12 +138,12 @@ if(!isset($err))
*/ */
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]); $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"]);
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$speciallines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["rechnr"]."</a>", $speciallines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["rechnr"]."</a>",
$res["date"], $res["date"],
$res["artikel"], zeilenHtml($res["artikel"]),
"<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Dokument ".$res["rechnr"]."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=rechadd&rechid=".$res["id"]."&del=1\")'></span>"); "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie das Dokument ".$res["rechnr"]."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=rechadd&rechid=".$res["id"]."&del=1\")'></span>");
} }
$headings = array("Nummer","Datum","Artikel","Aktion"); $headings = array("Nummer","Datum","Artikel","Aktion");
+120 -158
View File
@@ -1,166 +1,132 @@
<?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");
require('../smarty/libs/Smarty.class.php'); require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty; $smarty = new Smarty;
$pagesize = 25; $pagesize = 25;
if(!isset($err)) if(!isset($err))
$err = "";
/*
* Datum und Dauer eines Termins für die Liste. Ab 24 Stunden zählt der
* Termin in Tagen, sonst in Stunden und Minuten.
*/
function terminZeitraum($termtime, $termdauer)
{ {
$usercolors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09"); $stunden = (int)strtok((string)$termdauer, ":");
$minuten = (int)substr((string)$termdauer, 3, 2);
$fulltag = utf8_encode($_GET["search"]);
$src = explode(" ",$fulltag); if($termtime == "0000-00-00 00:00:00")
if(isset($_GET["link"])){ $zeitpunkt = "N/A";
$combiner = mysql_escape_string($_GET["link"]); elseif($stunden > 23)
}else{
$combiner = "";
}
if($combiner != "AND" && $combiner != "OR")
{ {
$combiner = "AND"; $zeitpunkt = date("d.m.Y", strtotime($termtime));
if($stunden / 24 > 1)
$zeitpunkt .= " - ".date("d.m", strtotime("+".(($stunden / 24) - 1)." day", strtotime($termtime)));
} }
$page = $_GET["page"]; else
$termtyp = $_GET["termtyp"]; $zeitpunkt = date("d.m.Y H:i ", strtotime($termtime))."Uhr";
$dauer = "";
if($stunden > 23)
$dauer = ($stunden / 24)." Tag".($stunden / 24 > 1 ? "e" : "");
elseif($stunden > 0)
$dauer = $stunden." Std";
if($stunden <= 23 && $stunden > 0 && $minuten > 0)
$dauer .= " - ";
if($stunden <= 23 && $minuten > 0)
$dauer .= $minuten." Min";
return array($zeitpunkt, $dauer);
}
if(!$err)
{
// kommt per encodeURIComponent bereits als UTF-8
$fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : "";
$link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : "";
$page = isset($_GET["page"]) ? (int)$_GET["page"] : 0;
$termtyp = isset($_GET["termtyp"]) ? (int)$_GET["termtyp"] : 1;
$_SESSION["termtyp"] = $termtyp; $_SESSION["termtyp"] = $termtyp;
$src = explode(" ", $fulltag);
$combiner = $link == "OR" ? "OR" : "AND";
$listlines = array();
$colors = array();
$queries = createTermQry($page,$pagesize,$src,$combiner,$termtyp); $queries = createTermQry($page,$pagesize,$src,$combiner,$termtyp);
$qry = mysqli_query($dbconn,$queries["all"]) $numres = zaehleTreffer($dbconn, $queries);
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
if($numres) if($numres)
{ {
$qry = mysqli_query($dbconn,$queries["limited"]) $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn)); or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
$counter = 0; $counter = 0;
while($res=mysqli_fetch_assoc($qry)) while($res=mysqli_fetch_assoc($qry))
{ {
$counter = $counter+1; $counter++;
$termdauer = ""; $id = (int)$res["id"];
$termtime =""; $kopf = htmlspecialchars((string)$res["head"]);
$telqry = mysqli_query($dbconn,"SELECT GROUP_CONCAT(nr SEPARATOR ', ') AS nr from tel WHERE partner_id = '".$res["partner_id"]."' AND RIGHT(nr,1) <> '-' GROUP BY partner_id")or $err=error("Fehler beim Listen der Termine <br />".mysqli_error($dbconn));
$telres=mysqli_fetch_assoc($telqry); $actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie den Termin ".$kopf."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=terminadd&id=".$id."&del=1\")'></span>";
//Normale Termine anzeigen $actions .= "<a href='?action=terminadd&id=".$id."&adressid=".(int)$res["adresse_id"]."'><span class='edit' title='Termin ändern'></span></a>";
if($res) $actions .= "<a href='?action=kundenshow&id=".(int)$res["partner_id"]."'><span class='partner' title='Kunden anzeigen'></span></a>";
$actions .= "<a href='?action=terminshow&id=".$id."'><span class='print' title='Termin drucken'></span></a>";
if(!$res["done"])
$actions .= "<span class='check' title='Termin als erledigt markieren' onClick='askbranch(\"Möchten Sie einen Folgetermin vormerken?\",\"?action=terminadd&id=".$id."\",\"?action=terminadd&id=".$id."&done=yes\")'></span>";
else
$actions .= "<a href='?action=terminadd&id=".$id."&done=no'><span class='cross' title='Termin als nicht erledigt markieren'></span></a>";
list($termtime, $termdauer) = terminZeitraum($res["termtime"], $res["termdauer"]);
$adresse = "<b>".htmlspecialchars($res["plz"]." ".$res["ort"]);
if($res["ortsteil"])
$adresse .= "-".htmlspecialchars((string)$res["ortsteil"]);
$adresse .= "</b><br />".htmlspecialchars($res["str"]." ".$res["hnr"]);
// Nummern ohne Durchwahl-Bindestrich am Ende
$nummern = db_wert($dbconn, "SELECT GROUP_CONCAT(nr ORDER BY id SEPARATOR ', ') FROM tel
WHERE partner_id = ? AND RIGHT(nr,1) != '-'", array($res["partner_id"]));
if($nummern)
{ {
$actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie den Termiiin ".htmlspecialchars($res["head"],ENT_QUOTES)."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=terminadd&id=".$res["id"]."&del=1\")'></span>"; $adresse .= "<br />Tel: ".htmlspecialchars($nummern);
$actions .= "<a href='?action=terminadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."'><span class='edit' title='Termin ändern'></span></a>"; if($res["vname"] || $res["nname"])
$actions .= "<a href='?action=kundenshow&id=".$res["partner_id"]."'><span class='partner' title='Kunden anzeigen'></span></a>"; $adresse .= "<br />(".htmlspecialchars(trim($res["vname"]." ".$res["nname"])).")";
$actions .= "<a href='?action=terminshow&id=".$res["id"]."'><span class='print' title='Termin drucken'></span></a>"; elseif($res["firma"])
if(!$res["done"]) $adresse .= "<br />(".htmlspecialchars((string)$res["firma"]).")";
$actions .= "<span class='check' title='Termin als erledigt markieren' onClick='askbranch(\"Möchten Sie einen Folgetermin vormerken?\",\"?action=terminadd&id=".$res["id"]."\",\"?action=terminadd&id=".$res["id"]."&done=yes\")'></span>";
else
$actions .= "<a href='?action=terminadd&id=".$res["id"]."&done=no'><span class='cross' title='Termin als nicht erledigt markieren'></span></a>";
$split_termdauer = explode(":",$res["termdauer"]);
if($res["termtime"] == "0000-00-00 00:00:00")
$termtime = "N/A";
else if($split_termdauer[0] > 23)
{
if($split_termdauer[0]/24 > 1)
{
$termtime = date("d.m.Y - ",strtotime($res["termtime"]));
$termtime .= date("d.m",strtotime("+".(($split_termdauer[0]/24)-1)." day",strtotime($res["termtime"])));
}
else
{
$termtime = date("d.m.Y",strtotime($res["termtime"]));
}
}
else
$termtime = date("d.m.Y H:i ",strtotime($res["termtime"]))."Uhr";
if($split_termdauer[0] > 23)
{
if($split_termdauer[0]/24 > 1)
$termdauer = ($split_termdauer[0]/24)." Tage";
else
$termdauer = ($split_termdauer[0]/24)." Tag";
}
else if($split_termdauer[0] > 0)
$termdauer = ltrim(substr($res["termdauer"],0,2),"0")." Std";
if($split_termdauer[0] > 0 && $split_termdauer[1] > 0)
$termdauer .= " - ";
if($split_termdauer[1] > 0)
$termdauer .= ltrim(substr($res["termdauer"],3,2),"0")." Min";
$adresse = "<b>".$res["plz"]." ".$res["ort"];
if($res["ortsteil"])
$adresse .= "-".$res["ortsteil"];
$adresse .= "</b><br />".$res["str"]." ".$res["hnr"];
if(isset($telres)){
if($res["vname"])
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["vname"]." ".$res["nname"].")";
else if($res["nname"])
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["nname"].")";
else if($res["firma"])
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["firma"].")";
else
$adresse .= "<br />Tel: ".$telres["nr"];
}
$namelist = $res["uservname"]." ".substr($res["usernname"],0,1);
if($res["user2"])
$namelist .= ", ".$res["uservname2"]." ".substr($res["usernname2"],0,1);
if($res["user3"])
$namelist .= ", ".$res["uservname3"]." ".substr($res["usernname3"],0,1);
if($res["user4"])
$namelist .= ", ".$res["uservname4"]." ".substr($res["usernname4"],0,1);
if($termtyp == 1){
$checkbox = "<input type='checkbox' value='".$res["id"]."' id='erl".$counter."' name='erl".$counter."'></input>";
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
$termtime,
$termdauer,
$adresse,
$actions,
$checkbox
);
}
else if($termtyp == 3){
$checkbox = "<input type='checkbox' value='".$res["id"]."' id='del".$counter."' name='del".$counter."'></input>";
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
$termtime,
$termdauer,
$adresse,
$actions,
$checkbox
);
}
else{
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
$termtime,
$termdauer,
$adresse,
$actions
);
}
if($res["user2"] || $res["user3"] || $res["user4"])
$colors[] = "#fff";
else if($res["color"])
$colors[] = $res["color"];
else
$colors[] = "#fff";
} }
$namelist = htmlspecialchars($res["uservname"]." ".substr((string)$res["usernname"], 0, 1));
foreach(array(2, 3, 4) as $n)
if($res["user".$n])
$namelist .= ", ".htmlspecialchars($res["uservname".$n]." ".substr((string)$res["usernname".$n], 0, 1));
$zeile = array("<a href='?action=terminshow&id=".$id."'><b>".htmlspecialchars((string)$res["typ"])."</b></a><br />".$namelist,
"<a href='?action=terminshow&id=".$id."'>".$kopf."</a>",
$termtime,
$termdauer,
$adresse,
$actions);
// Registerkarte 1 hakt ab, Registerkarte 3 löscht - beides mehrfach
if($termtyp == 1 || $termtyp == 3)
{
$feld = $termtyp == 1 ? "erl" : "del";
$zeile[] = "<input type='checkbox' value='".$id."' id='".$feld.$counter."' name='".$feld.$counter."' />";
}
$listlines[] = $zeile;
if($res["user2"] || $res["user3"] || $res["user4"] || !$res["color"])
$colors[] = "#fff";
else
$colors[] = $res["color"];
} }
if($termtyp == 1){
$headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen","&nbsp;&nbsp;Erledigt&nbsp;"); $headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen");
} if($termtyp == 1)
else if($termtyp == 3){ $headings[] = "&nbsp;&nbsp;Erledigt&nbsp;";
$headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen","&nbsp;&nbsp;Löschen&nbsp;"); elseif($termtyp == 3)
} $headings[] = "&nbsp;&nbsp;Löschen&nbsp;";
else{
$headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen");
}
$lastdisplay = ($page+1)*$pagesize; $lastdisplay = ($page+1)*$pagesize;
if($numres < $lastdisplay) if($numres < $lastdisplay)
$lastdisplay = $numres; $lastdisplay = $numres;
@@ -168,27 +134,23 @@ if(!isset($err))
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.<br /> Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay);
else else
ok($numres." Termine sind insgesamt gespeichert."); ok($numres." Termine sind insgesamt gespeichert.");
displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp"); displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp);
if($termtyp == 1){ if($termtyp == 1)
echo "<form action='?action=terminadd&id=multi&done=yes' method='post'><input type='hidden' name='pagesize' value='".$pagesize."'></input>"; echo "<form action='?action=terminadd&id=multi&done=yes' method='post'><input type='hidden' name='pagesize' value='".$pagesize."' />";
} elseif($termtyp == 3)
else if($termtyp == 3){ echo "<form action='?action=terminadd&id=multi&del=1' method='post'><input type='hidden' name='pagesize' value='".$pagesize."' />";
echo "<form action='?action=terminadd&id=multi&del=1' method='post'><input type='hidden' name='pagesize' value='".$pagesize."'></input>"; displayList($headings,$listlines,array(),$colors);
} if($termtyp == 1 || $termtyp == 3)
displayList($headings,$listlines,Array(),$colors); echo "<input type='submit' value='Mehrfachänderung ausführen' /></form><br />";
if($termtyp == 1 || $termtyp == 3){ displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp);
echo "<input type='submit' value='Mehrfachänderung ausführen'></input></form><br />";
}
displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp");
} }
else else
{ {
if($fulltag) if($fulltag)
ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse.");
else else
ok("Keine Einträge."); ok("Keine Einträge.");
} }
} }
?> ?>
+48 -27
View File
@@ -50,10 +50,8 @@ try {
if($settings == "valid") if($settings == "valid")
{ {
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw)) if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
$err = error("Verbindung zur Datenbank fehlgeschlagen!!"); $err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
if(!@mysqli_select_db($dbconn,$mysql_db))
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
} }
// read get argument and post body // read get argument and post body
$fn = filter_input(INPUT_GET, 'fn'); $fn = filter_input(INPUT_GET, 'fn');
@@ -107,6 +105,24 @@ try {
// request for create arguments // request for create arguments
// ------------------------------------ // ------------------------------------
// Passkeys anlegen darf nur ein angemeldeter Superadmin, der vorher in
// sites/userkeys.php eine gültige Einmal-Freigabe (addKey) eingelöst hat.
// Die Freigabe liegt in der Session und legt fest, für welchen Benutzer
// der Schlüssel gilt - die id aus der URL zählt nicht.
$passkeyFreigabe = null;
if (isset($_SESSION["passkey_freigabe"]) && $_SESSION["passkey_freigabe"]["bis"] >= time()
&& ($_SESSION["login"] ?? "") == "valid"
&& ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE)) {
$passkeyFreigabe = $_SESSION["passkey_freigabe"];
}
if (($fn === 'getCreateArgs' || $fn === 'processCreate') && $passkeyFreigabe === null) {
throw new Exception('Keine Berechtigung, Passkeys anzulegen.');
}
if ($fn === 'queryFidoMetaDataService'
&& !(($_SESSION["login"] ?? "") == "valid" && ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE))) {
throw new Exception('Keine Berechtigung.');
}
if ($fn === 'getCreateArgs') { if ($fn === 'getCreateArgs') {
$createArgs = $WebAuthn->getCreateArgs(\hex2bin($userId), $userName, $userDisplayName, 60*4, $requireResidentKey, $userVerification, $crossPlatformAttachment); $createArgs = $WebAuthn->getCreateArgs(\hex2bin($userId), $userName, $userDisplayName, 60*4, $requireResidentKey, $userVerification, $crossPlatformAttachment);
@@ -123,22 +139,20 @@ try {
// ------------------------------------ // ------------------------------------
} else if ($fn === 'getGetArgs') { } else if ($fn === 'getGetArgs') {
$result = mysqli_query($dbconn,"SELECT id FROM user WHERE nick = '".mysqli_real_escape_string($dbconn,$_GET["user"])."';"); $userId = db_wert($dbconn, "SELECT id FROM user WHERE nick = ?", array((string)filter_input(INPUT_GET, 'user')));
if ($result->num_rows > 0) { if ($userId === false) {
$row = $result->fetch_assoc(); throw new Exception(mysqli_error($dbconn));
$userId = $row["id"]; }
}else{ if ($userId === null) {
throw new Exception('Username not found'); throw new Exception('Username not found');
} }
$ids = []; $ids = [];
$result = mysqli_query($dbconn,"SELECT credentialId FROM passkeys WHERE userId = '".$userId."';"); $zeilen = db_zeilen($dbconn, "SELECT credentialId FROM passkeys WHERE userId = ?", array($userId));
if(!$result){ if ($zeilen === false) {
$msg = "Error:<br>".mysqli_error($dbconn)."<br />"; throw new Exception(mysqli_error($dbconn));
} }
if ($result->num_rows > 0) { foreach ($zeilen as $row) {
while($row = $result->fetch_assoc()) { $ids[] = base64_decode($row["credentialId"]);
$ids[] = base64_decode($row["credentialId"]);
}
} }
if (count($ids) === 0) { if (count($ids) === 0) {
@@ -181,10 +195,13 @@ try {
if (!isset($_SESSION['registrations']) || !array_key_exists('registrations', $_SESSION) || !is_array($_SESSION['registrations'])) { if (!isset($_SESSION['registrations']) || !array_key_exists('registrations', $_SESSION) || !is_array($_SESSION['registrations'])) {
$_SESSION['registrations'] = []; $_SESSION['registrations'] = [];
}*/ }*/
if(!mysqli_query($dbconn,"INSERT INTO passkeys SET credentialId = '".base64_encode($data->credentialId)."', credentialPublicKey = '".base64_encode($data->credentialPublicKey)."', signatureCounter = '".base64_encode($data->signatureCounter)."', name = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'name'))."', userId = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'id'))."';")){ if(!db_abfrage($dbconn, "INSERT INTO passkeys SET credentialId = ?, credentialPublicKey = ?, signatureCounter = ?, name = ?, userId = ?, lastAuth = NOW(), authKey = 0",
array(base64_encode($data->credentialId), base64_encode($data->credentialPublicKey), base64_encode($data->signatureCounter), (string)filter_input(INPUT_GET, 'name'), $passkeyFreigabe["user"]))){
$msg = "Error:<br>".mysqli_error($dbconn)."<br />"; $msg = "Error:<br>".mysqli_error($dbconn)."<br />";
} }
else{ else{
// Freigabe gilt für genau einen Schlüssel
unset($_SESSION["passkey_freigabe"]);
if ($data->rootValid === false) { if ($data->rootValid === false) {
$msg = 'registration ok, but certificate does not match any of the selected root ca. NO PROBLEM FOR THIS APP'; $msg = 'registration ok, but certificate does not match any of the selected root ca. NO PROBLEM FOR THIS APP';
} }
@@ -218,12 +235,11 @@ try {
// looking up correspondending public key of the credential id // looking up correspondending public key of the credential id
// you should also validate that only ids of the given user name // you should also validate that only ids of the given user name
// are taken for the login. // are taken for the login.
$result = mysqli_query($dbconn,"SELECT credentialPublicKey, userId, name FROM passkeys WHERE credentialId = '".base64_encode($id)."';"); $row = db_zeile($dbconn, "SELECT credentialPublicKey, userId, name FROM passkeys WHERE credentialId = ?", array(base64_encode((string)$id)));
if(!$result){ if ($row === false) {
$msg = "Error:<br>".mysqli_error($dbconn)."<br />"; throw new Exception(mysqli_error($dbconn));
} }
if ($result->num_rows > 0) { if ($row) {
$row = $result->fetch_assoc();
$userId = $row["userId"]; $userId = $row["userId"];
$credentialPublicKey = base64_decode($row["credentialPublicKey"]); $credentialPublicKey = base64_decode($row["credentialPublicKey"]);
$reg = (object) ['userId' => base64_decode($row["userId"])]; $reg = (object) ['userId' => base64_decode($row["userId"])];
@@ -252,11 +268,16 @@ try {
$authKey = strval(random_int(0,99999999)); $authKey = strval(random_int(0,99999999));
$result = mysqli_query($dbconn,"UPDATE passkeys SET authKey=".$authKey.", lastAuth=NOW() WHERE credentialId = '".base64_encode($id)."';"); db_abfrage($dbconn, "UPDATE passkeys SET authKey = ?, lastAuth = NOW() WHERE credentialId = ?", array($authKey, base64_encode($id)));
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."'"); // Gesperrte Benutzer bleiben gesperrt, auch mit gültigem Passkey
if(mysqli_num_rows($qry) == 1) $udata = db_zeile($dbconn, "SELECT * FROM user WHERE id = ? AND blocked = 0", array($userId));
if(!$udata)
{ {
$udata = mysqli_fetch_assoc($qry); throw new Exception('Benutzer nicht gefunden oder gesperrt.');
}
else
{
session_regenerate_id(true);
$_SESSION["login"] = "valid"; $_SESSION["login"] = "valid";
$_SESSION["logedout"] = $udata["logedout"]; $_SESSION["logedout"] = $udata["logedout"];
$_SESSION["user"] = $udata["id"]; $_SESSION["user"] = $udata["id"];
@@ -275,7 +296,7 @@ try {
$_SESSION["zoom"] = getUserSetting($dbconn,"zoom", $_SESSION["user"], 1); $_SESSION["zoom"] = getUserSetting($dbconn,"zoom", $_SESSION["user"], 1);
$_SESSION["privateNotes"] = getUserSetting($dbconn,"privnotes", $_SESSION["user"], ""); $_SESSION["privateNotes"] = getUserSetting($dbconn,"privnotes", $_SESSION["user"], "");
mysqli_query($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."'"); db_abfrage($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE id = ?", array($userId));
} }
$return = new stdClass(); $return = new stdClass();
$return->success = true; $return->success = true;
+6 -2
View File
@@ -1,4 +1,7 @@
<?php <?php
// Wartungsskript: nur per Kommandozeile, nie über den Webserver
if(PHP_SAPI != "cli")
exit;
require_once("./incs/constants.php"); require_once("./incs/constants.php");
session_name(SESSION_NAME); session_name(SESSION_NAME);
session_start(); session_start();
@@ -7,8 +10,9 @@ $settings=readsettings();
if($settings == "valid") if($settings == "valid")
{ {
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw); $dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
mysqli_select_db($dbconn,$mysql_db); if(!$dbconn)
$err = 1;
} }
else else
$err = 1; $err = 1;
+3
View File
@@ -1,4 +1,7 @@
<?php <?php
// Nur per Kommandozeile (Cronjob), nie über den Webserver
if(PHP_SAPI != "cli")
exit;
/* /*
* Datenbank-Backup (Cronjob). * Datenbank-Backup (Cronjob).
* *
+72 -39
View File
@@ -8,60 +8,93 @@ if($settings != "valid")
if($settings == "valid") if($settings == "valid")
{ {
if(!$mysql = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw)) if(!$mysql = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
$err = error("Verbindung zur Datenbank fehlgeschlagen!!"); $err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
if(!@mysqli_select_db($mysql,$mysql_db))
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
} }
$_SESSION["local"] =false; $_SESSION["local"] =false;
/*
* Liegt $ip im Netz $netz (CIDR-Schreibweise, IPv4 oder IPv6)? Eine Adresse
* ohne /Präfix gilt als einzelner Host.
*/
function ipImNetz($ip, $netz)
{
if(!str_contains($netz, "/"))
$netz .= str_contains($netz, ":") ? "/128" : "/32";
list($adresse, $praefix) = explode("/", $netz, 2);
$ipBin = @inet_pton($ip);
$netzBin = @inet_pton($adresse);
if($ipBin === false || $netzBin === false || !ctype_digit($praefix))
return false;
// IPv4 in IPv6-Schreibweise (::ffff:192.168.1.2) wie IPv4 behandeln
if(strlen($ipBin) == 16 && strlen($netzBin) == 4 && substr($ipBin, 0, 12) === str_repeat("\0", 10)."\xff\xff")
$ipBin = substr($ipBin, 12);
$praefix = (int)$praefix;
if(strlen($ipBin) != strlen($netzBin) || $praefix > strlen($ipBin) * 8)
return false;
$bytes = intdiv($praefix, 8);
if(substr($ipBin, 0, $bytes) !== substr($netzBin, 0, $bytes))
return false;
$bits = $praefix % 8;
if($bits == 0)
return true;
$maske = (0xFF << (8 - $bits)) & 0xFF;
return (ord($ipBin[$bytes]) & $maske) == (ord($netzBin[$bytes]) & $maske);
}
/*
* Kommt die Anfrage aus dem lokalen Netz? Davon hängen Passwort-Login und das
* Vergeben von Passkeys ab.
*
* Maßgeblich ist $lokale_netze aus der externen Config, z.B.
* $lokale_netze = array("192.168.179.0/24", "2001:db8:1:2::/64");
* Fehlt die Liste, gelten nur Geräte im selben IPv6-/64-Netz wie der Server.
*
* Das Docker-Netz darf dort nicht stehen: Anfragen, die über den Docker-
* Proxy oder einen Reverse Proxy kommen, tragen dessen Adresse aus diesem
* Netz - dann wäre jeder Zugriff aus dem Internet "lokal".
*/
function isLocal(){ function isLocal(){
$ipv6_prefix = explode(":",$_SERVER['SERVER_ADDR'],5); global $lokale_netze;
$ipv6 = explode(":",$_SERVER['REMOTE_ADDR'],5); $_SESSION["local"] = false;
if(($ipv6_prefix[0] == $ipv6[0] && $ipv6_prefix[1] == $ipv6[1] && $ipv6_prefix[2] == $ipv6[2] && $ipv6_prefix[3] == $ipv6[3]) || str_starts_with($_SERVER['REMOTE_ADDR'],"192.168.147.")){
$_SESSION["local"] =true;
return true;
}else{
return false;
}
}
function checkLogin(){ // Über einen Proxy weitergereicht: REMOTE_ADDR ist dann die Adresse des
global $mysql; // Proxys, nicht die des Browsers. Solche Anfragen sind nie lokal.
//$mysql = new mysqli($GLOBALS["mysql_server"],$GLOBALS["mysql_user"],$GLOBALS["mysql_pass"],$GLOBALS["mysql_db"]); foreach(array("HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "HTTP_FORWARDED", "HTTP_X_FORWARDED_HOST", "HTTP_CLIENT_IP") as $kopf){
if(isLocal()){ if(!empty($_SERVER[$kopf]))
$_SESSION["local"] =true;
return true;
}
if(isset($_SESSION["authKey"])){
$res = mysqli_query($mysql,"SELECT id FROM users WHERE lastAuth > DATE_SUB(NOW(), INTERVAL 2 DAY) AND authKey = '".mysqli_real_escape_string($mysql,$_SESSION["authKey"])."' AND name = '".mysqli_real_escape_string($mysql,$_SESSION["user"])."';");
if(!$res){
echo mysqli_error($mysql);
return false; return false;
} }
if(mysqli_num_rows($res) == 1){
return isset($_SESSION["Logged"]); $remote = $_SERVER["REMOTE_ADDR"] ?? "";
$lokal = false;
if(is_array($lokale_netze)){
foreach($lokale_netze as $netz){
if(ipImNetz($remote, $netz)){
$lokal = true;
break;
}
} }
}else{ }else{
return false; $server = $_SERVER["SERVER_ADDR"] ?? "";
$lokal = str_contains($server, ":") && !str_starts_with(strtolower($server), "fe80") && ipImNetz($remote, $server."/64");
} }
$_SESSION["local"] = $lokal;
return $lokal;
} }
/* Ist $_GET["addKey"] eine gültige, höchstens eine Minute alte Freigabe? */
function checkAdduser(){ function checkAdduser(){
global $mysql; global $mysql;
//$mysql = new mysqli($GLOBALS["mysql_server"],$GLOBALS["mysql_user"],$GLOBALS["mysql_pass"],$GLOBALS["mysql_db"]); db_abfrage($mysql, "DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE)") or print(mysqli_error($mysql));
if(!mysqli_query($mysql,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){ // Nur reine Ziffern: accesskey ist eine Zahlenspalte, MariaDB würde
echo mysqli_error($mysql); // "12345678xyz" beim Vergleich stillschweigend zu 12345678 machen.
} $key = $_GET["addKey"] ?? "";
$result = mysqli_query($mysql,"SELECT * FROM addKey WHERE accesskey='".mysqli_real_escape_string($mysql,$_GET["addKey"])."';"); if(!is_string($key) || !ctype_digit($key))
if(!$result){
return false; return false;
} $anzahl = db_wert($mysql, "SELECT COUNT(*) FROM addKey WHERE accesskey = ?", array((int)$key));
if ($result->num_rows > 0) { return $anzahl > 0;
return true;
}
return false;
} }
?> ?>
+9 -2
View File
@@ -2,13 +2,20 @@
require_once("../incs/constants.php"); require_once("../incs/constants.php");
session_name(SESSION_NAME); session_name(SESSION_NAME);
session_start(); session_start();
// Alle AJAX-Endpunkte laden diese Datei: ohne Anmeldung gibt es keine Daten.
if(($_SESSION["login"] ?? "") !== "valid")
{
http_response_code(403);
exit("Nicht angemeldet.");
}
require_once("../incs/settings.php"); require_once("../incs/settings.php");
$settings=readsettings(); $settings=readsettings();
if($settings == "valid") if($settings == "valid")
{ {
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw); $dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
mysqli_select_db($dbconn,$mysql_db); if(!$dbconn)
$err = 1;
} }
else else
$err = 1; $err = 1;
+8 -4
View File
@@ -1,15 +1,19 @@
<?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")
$dir = $dirs[count($dirs)-2]; $dir = $dirs[count($dirs)-2];
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/");
define("CONFIG_FILE", $dir."_settings.conf"); define("CONFIG_FILE", $dir."_settings.conf");
+139
View File
@@ -0,0 +1,139 @@
<?php
/*
* Datenbankzugriff: Verbindungsaufbau und Prepared Statements.
*
* Neue und umgebaute Abfragen laufen über db_abfrage() und Co. Werte stehen
* im SQL nur als ? und kommen getrennt als Array - sie werden nie in den
* SQL-String eingesetzt, Escaping entfällt. Tabellen- und Spaltennamen
* (z.B. für ORDER BY) lassen sich nicht binden und müssen gegen eine feste
* Liste erlaubter Werte geprüft werden.
*
* Fehler verhalten sich wie bei mysqli_query(): Rückgabe false, Details über
* mysqli_error($dbconn). Das bestehende Muster
* db_abfrage(...) or $err = error(...mysqli_error($dbconn));
* funktioniert also unverändert.
*/
/*
* Baut die Verbindung auf und stellt sie einheitlich ein. Gibt die
* Verbindung zurück oder false; der Grund steht dann in
* mysqli_connect_error().
*/
function db_verbinden($server, $user, $pw, $db)
{
// Seit PHP 8.1 wirft mysqli standardmäßig Exceptions. Der Code prüft
// Rückgabewerte, also das alte Verhalten wiederherstellen.
mysqli_report(MYSQLI_REPORT_OFF);
$dbconn = @mysqli_connect($server, $user, $pw, $db);
if(!$dbconn)
return false;
// Ohne das behandelt der Server die Verbindung je nach Einstellung als
// latin1, und UTF-8 aus dem Browser wird doppelt kodiert gespeichert.
mysqli_set_charset($dbconn, "utf8mb4");
// Unabhängig von der Server-Konfiguration immer strikt: ungültige Werte
// und fehlende Pflichtfelder sind Fehler, statt still zu '' oder 0 zu
// werden.
mysqli_query($dbconn, "SET SESSION sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
return $dbconn;
}
/*
* Führt eine Abfrage mit ?-Platzhaltern aus. Gibt bei SELECT ein
* mysqli_result zurück, sonst true, bei Fehlern false.
*
* Achtung: Prepared Statements liefern Zahlen als int/float, mysqli_query()
* lieferte Strings. db_zeilen(), db_zeile(), db_wert() und db_zuordnung()
* wandeln deshalb in Strings um, damit sich alter Code (=== "0", "1" etc.)
* gleich verhält. Wer das Ergebnis von db_abfrage() selbst ausliest, bekommt
* die nativen Typen.
*/
function db_abfrage($dbconn, $sql, $params = array())
{
return mysqli_execute_query($dbconn, $sql, array_values($params));
}
/* Werte einer Zeile als Strings wie bei mysqli_query(), NULL bleibt NULL */
function db_als_text($zeile)
{
if(!is_array($zeile))
return $zeile;
foreach($zeile as $spalte => $wert)
if($wert !== null && !is_string($wert))
$zeile[$spalte] = (string)$wert;
return $zeile;
}
/* Alle Zeilen als Liste assoziativer Arrays, bei Fehlern false. */
function db_zeilen($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
return array_map("db_als_text", mysqli_fetch_all($res, MYSQLI_ASSOC));
}
/* Erste Zeile als assoziatives Array, null ohne Treffer, bei Fehlern false. */
function db_zeile($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
return db_als_text(mysqli_fetch_assoc($res));
}
/*
* Zwei Spalten als Zuordnung erste => zweite, etwa für Auswahllisten
* (SELECT id, anrede FROM anrede). Bei Fehlern false.
*/
function db_zuordnung($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
$zuordnung = array();
while($zeile = mysqli_fetch_row($res))
$zuordnung[$zeile[0]] = $zeile[1] === null ? null : (string)$zeile[1];
return $zuordnung;
}
/*
* Die Abfrage mit eingesetzten Werten als lesbarer Text - ausschließlich für
* das Änderungsprotokoll (Tabelle log). Nie ausführen.
*/
function db_sql_text($dbconn, $sql, $params = array())
{
$teile = explode("?", $sql);
$text = array_shift($teile);
foreach(array_values($params) as $i => $wert)
{
if($wert === null)
$text .= "NULL";
else
$text .= "'".mysqli_real_escape_string($dbconn, (string)$wert)."'";
$text .= isset($teile[$i]) ? $teile[$i] : "";
}
return $text;
}
/*
* Text als Praefix-Suchmuster fuer LIKE. % und _ waeren darin sonst
* Platzhalter; das Fluchtzeichen ist der Backslash.
*/
function db_like_praefix($text)
{
return str_replace(array("\\", "%", "_"), array("\\\\", "\%", "\_"), (string)$text)."%";
}
/* Erste Spalte der ersten Zeile, null ohne Treffer, bei Fehlern false. */
function db_wert($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
$zeile = mysqli_fetch_row($res);
return $zeile === null || $zeile[0] === null ? null : (string)$zeile[0];
}
+7
View File
@@ -36,6 +36,9 @@ function rrmdir($dir) {
function del_files($path, $pattern) { function del_files($path, $pattern) {
$matches = Array(); $matches = Array();
$entries = Array(); $entries = Array();
// Fehlt das Verzeichnis, gibt es auch nichts zu loeschen
if(!is_dir($path))
return;
$dir = dir($path); $dir = dir($path);
while ($entry = $dir->read()) while ($entry = $dir->read())
{ {
@@ -51,6 +54,10 @@ function del_files($path, $pattern) {
function search_file($path, $pattern) { function search_file($path, $pattern) {
$matches = Array(); $matches = Array();
$entries = Array(); $entries = Array();
$ret = "";
// Fehlt das Verzeichnis, gibt es auch nichts zu finden
if(!is_dir($path))
return $ret;
$dir = dir($path); $dir = dir($path);
while ($entry = $dir->read()) while ($entry = $dir->read())
{ {
+257 -264
View File
@@ -1,197 +1,119 @@
<?php <?php
/*
* Die Suchbedingung der Kunden-, Lieferanten- und Adresssuche. $fields
* waehlt aus, worin gesucht wird, $src sind die einzelnen Suchbegriffe.
* Die Werte kommen als Platzhalter dazu, die Spaltennamen stehen fest.
*/
function partnerSuchbedingung($src, $combiner, $fields, &$params)
{
$spalten = array(
"all" => array("vname", "nname", "vname2", "nname2", "firma", "ort", "str", "plz", "partner.id"),
"kdnr" => array("partner.id"),
"name" => array("vname", "nname", "vname2", "nname2", "firma"),
"str" => array("str"),
"plz" => array("plz"),
"ort" => array("ort"),
"tel" => array("tel.nr"),
"kont" => array("kontakt"),
);
if(!isset($spalten[$fields]))
return "";
$combiner = $combiner == "OR" ? "OR" : "AND";
$bedingung = "";
foreach($src AS $tag)
{
$teile = array();
foreach($spalten[$fields] as $spalte)
{
$teile[] = "$spalte LIKE ?";
$params[] = "%".$tag."%";
}
$bedingung .= " $combiner (".implode(" OR ", $teile).")";
}
return $bedingung;
}
/*
* Kunden- bzw. Lieferantensuche, eine Zeile je Partner. $typ ist 1 fuer
* Kunden, 2 fuer Lieferanten. Mit $full kommen auch veraltete Versionen
* dazu; ihre Namen, Adressen und Telefonnummern stehen dann untereinander
* in einer Zelle (siehe zeilenHtml()).
* Rueckgabe: array("all" => sql, "limited" => sql mit LIMIT, "params" => Werte).
*/
function createPartQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1) function createPartQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
{ {
$joins = "FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id";
if(!$full) if(!$full)
{ $query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr, tel.nr AS tel
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr, tel.nr AS tel FROM partner $joins
LEFT JOIN adresse ON adresse.partner_id = partner.id WHERE updated_by = 0 AND adresse.typ_id = 1 AND partner.typ_id = ?";
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE updated_by = 0 and adresse.typ_id = 1 AND partner.typ_id = $typ";
}
else else
{ $query = "SELECT partner.id AS kdnr,firma,
$query = "SELECT partner.id AS kdnr,firma,GROUP_CONCAT(CONCAT(vname,' ',nname) SEPARATOR '<br />') AS nname, '' AS vname,GROUP_CONCAT(CONCAT(vname2,' ',nname2) SEPARATOR '<br />') AS nname2,'' AS vname2,'' AS ort,GROUP_CONCAT(CONCAT(plz,' ',ort) SEPARATOR '<br />') AS plz,GROUP_CONCAT(CONCAT(str,' ',hnr) SEPARATOR '<br />') AS str,'' AS hnr, GROUP_CONCAT(tel.nr SEPARATOR '<br />') AS tel FROM partner GROUP_CONCAT(CONCAT(vname,' ',nname) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname, '' AS vname,
LEFT JOIN adresse ON adresse.partner_id = partner.id GROUP_CONCAT(CONCAT(vname2,' ',nname2) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname2,'' AS vname2,'' AS ort,
LEFT JOIN strasse ON strasse.id = str_id GROUP_CONCAT(CONCAT(plz,' ',ort) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS plz,
LEFT JOIN ort ON ort.id = ort_id GROUP_CONCAT(CONCAT(str,' ',hnr) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS str,'' AS hnr,
LEFT JOIN tel ON tel.partner_id = partner.id GROUP_CONCAT(tel.nr ORDER BY adresse.id, tel.id SEPARATOR '\n') AS tel
LEFT JOIN kontakt ON kontakt.partner_id = partner.id $joins
WHERE partner.typ_id = $typ"; WHERE partner.typ_id = ?";
} $params = array((int)$typ);
$query .= partnerSuchbedingung($src, $combiner, $fields, $params);
switch($fields) // Ohne feste Reihenfolge kann dieselbe Zeile beim Blaettern zweimal
{ // oder gar nicht auftauchen
case "all": $query .= " GROUP BY partner.id ORDER BY partner.id";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag' OR ort LIKE '$tag' OR str LIKE '$tag' OR plz LIKE '$tag' OR partner.id LIKE '$tag')";
}
break;
case "kdnr":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (partner.id LIKE '$tag')";
}
break;
case "name":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag')";
}
break;
case "str":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (str LIKE '$tag')";
}
break;
case "plz":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (plz LIKE '$tag')";
}
break;
case "ort":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (ort LIKE '$tag')";
}
break;
case "tel":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (tel.nr LIKE '$tag')";
}
break;
case "kont":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (kontakt LIKE '$tag')";
}
break;
}
$query .= " GROUP BY partner.id";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".(intval($page)*$pagesize).", $pagesize"; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["params"] = $params;
return $ret; return $ret;
} }
/*
* Adresssuche: wie createPartQry(), aber eine Zeile je Adresse statt je
* Partner. Damit laesst sich fuer ein Dokument eine Nebenadresse auswaehlen.
*/
function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1) function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
{ {
if(!$full) $query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel
{ FROM partner
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel LEFT JOIN adresse ON adresse.partner_id = partner.id
FROM partner LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN adresse ON adresse.partner_id = partner.id LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN strasse ON strasse.id = str_id LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN ort ON ort.id = ort_id LEFT JOIN kontakt ON kontakt.partner_id = partner.id
LEFT JOIN tel ON tel.partner_id = partner.id WHERE ".($full ? "" : "updated_by = 0 AND ")."partner.typ_id = ?";
LEFT JOIN kontakt ON kontakt.partner_id = partner.id $params = array((int)$typ);
WHERE updated_by = 0 AND partner.typ_id = $typ"; $query .= partnerSuchbedingung($src, $combiner, $fields, $params);
} $query .= " GROUP BY adresse.id ORDER BY adresse.id";
else
{
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel
FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE partner.typ_id = $typ";
}
switch($fields)
{
case "all":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag' OR ort LIKE '$tag' OR str LIKE '$tag' OR plz LIKE '$tag' OR partner.id LIKE '$tag')";
}
break;
case "kdnr":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (partner.id LIKE '$tag')";
}
break;
case "name":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag')";
}
break;
case "str":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (str LIKE '$tag')";
}
break;
case "plz":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (plz LIKE '$tag')";
}
break;
case "ort":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (ort LIKE '$tag')";
}
break;
case "tel":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (tel.nr LIKE '$tag')";
}
break;
case "kont":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (kontakt LIKE '$tag')";
}
break;
}
$query .= " GROUP BY adresse.id";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["params"] = $params;
return $ret; return $ret;
} }
/*
* Suche in den Dokumenten eines Kunden. Liefert array("all" => sql,
* "limited" => sql mit LIMIT, "params" => Platzhalterwerte für beide).
* $combiner muss "AND" oder "OR" sein.
*/
function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0) function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
{ {
if($typ == 1) $docnr = "rechnr";
$docnr = "rechnr"; $combiner = $combiner == "OR" ? "OR" : "AND";
else $params = array($id, $typ);
$docnr = "rechnr";
if(!$sks) if(!$sks)
{ {
$query = "SELECT rechnung.$docnr AS rechnr, $query = "SELECT rechnung.$docnr AS rechnr,
rechnung.id, rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date, DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '<br />') AS artikel, GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '\n') AS artikel,
adresse_id, adresse_id,
storno, storno,
rechnung.typ_id rechnung.typ_id
@@ -199,11 +121,12 @@ function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id
LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id
WHERE partner_id='".$id."' AND rechtyp.id = '".$typ."' AND rechnung.sks = 0 "; WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 0 ";
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag .= "%"; $tag .= "%";
$query .= " $combiner (artikel.bezeichn LIKE '$tag' OR rechnung.rechnr LIKE '$tag' OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$tag')"; $query .= " $combiner (artikel.bezeichn LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag);
} }
} }
else else
@@ -211,88 +134,104 @@ function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
$query = "SELECT rechnung.$docnr AS rechnr, $query = "SELECT rechnung.$docnr AS rechnr,
rechnung.id, rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date, DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '<br />') AS artikel, GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '\n') AS artikel,
adresse_id, adresse_id,
rechnung.typ_id rechnung.typ_id
FROM rechnung FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
WHERE partner_id='".$id."' AND rechtyp.id = '".$typ."' AND rechnung.sks = 1 "; WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 1 ";
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag .= "%"; $tag .= "%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE '$tag' OR artikelsks.bezeichn2 LIKE '$tag' OR rechnung.rechnr LIKE '$tag' OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$tag')"; $query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR artikelsks.bezeichn2 LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag, $tag);
} }
} }
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC "; $query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["limited"] = $query;
$ret["params"] = $params;
return $ret; return $ret;
} }
/* Projekte eines Kunden, Rueckgabe wie createKdnRechQry(). */
function createKdnProjectQry($page,$pagesize,$src,$combiner,$id) function createKdnProjectQry($page,$pagesize,$src,$combiner,$id)
{ {
$query = "SELECT project.id, project.name, $combiner = $combiner == "OR" ? "OR" : "AND";
$params = array($id);
$query = "SELECT project.id, project.name,
DATE_FORMAT(project.datetime, '%d.%m.%Y') AS date, DATE_FORMAT(project.datetime, '%d.%m.%Y') AS date,
SUM(CASE WHEN rechn = 0 THEN work.std ELSE 0 END) AS work SUM(CASE WHEN rechn = 0 THEN work.std ELSE 0 END) AS work
FROM project FROM project
JOIN work ON project.id = work.project_id JOIN work ON project.id = work.project_id
AND partner_id='".$id."'"; AND partner_id = ?";
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag .= "%"; $tag .= "%";
$query .= " $combiner (work.bezeichn LIKE '$tag' OR project.name LIKE '$tag' OR DATE_FORMAT(project.datetime, '%d.%m.%Y') LIKE '$tag')"; $query .= " $combiner (work.bezeichn LIKE ? OR project.name LIKE ? OR DATE_FORMAT(project.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag);
} }
$query .= " GROUP BY project.id ORDER BY project.datetime DESC "; $query .= " GROUP BY project.id ORDER BY project.datetime DESC ";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["params"] = $params;
return $ret; return $ret;
} }
/* Kommissionsadressen (adresstyp 5) eines Kunden, Rueckgabe wie createKdnRechQry(). */
function createKommQry($page,$pagesize,$src,$combiner,$id) function createKommQry($page,$pagesize,$src,$combiner,$id)
{ {
$query = "SELECT adresse.id, adresse.partner_id, firma, vname, nname, vname2, nname2, titel_id, titel2_id, anrede_id, anrede2_id, str, hnr, ort, ortsteil,plz,ort,nr AS tel,vwahl $combiner = $combiner == "OR" ? "OR" : "AND";
$params = array($id);
$query = "SELECT adresse.id, adresse.partner_id, firma, vname, nname, vname2, nname2, titel_id, titel2_id, anrede_id, anrede2_id, str, hnr, ort, ortsteil,plz,ort,nr AS tel,vwahl
FROM adresse FROM adresse
LEFT JOIN strasse ON adresse.str_id = strasse.id LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN tel ON adresse.id = tel.adresse_id LEFT JOIN tel ON adresse.id = tel.adresse_id
WHERE adresse.partner_id='".$id."' AND adresse.typ_id = '5' "; WHERE adresse.partner_id = ? AND adresse.typ_id = 5 ";
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag .= "%"; $tag .= "%";
$query .= " $combiner (ort LIKE '$tag' $query .= " $combiner (ort LIKE ?
OR str LIKE '$tag' OR str LIKE ?
OR nr LIKE '$tag' OR nr LIKE ?
OR vname LIKE '$tag' OR vname LIKE ?
OR nname LIKE '$tag' OR nname LIKE ?
OR vname2 LIKE '$tag' OR vname2 LIKE ?
OR nname2 LIKE '$tag' OR nname2 LIKE ?
OR firma LIKE '$tag')"; OR firma LIKE ?)";
for($i = 0; $i < 8; $i++)
$params[] = $tag;
} }
$query .= " GROUP BY adresse.id ORDER BY adresse.id DESC "; $query .= " GROUP BY adresse.id ORDER BY adresse.id DESC ";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["params"] = $params;
return $ret; return $ret;
} }
/*
* Suche über alle Dokumente, Rückgabe wie createKdnRechQry().
*/
function createRechQry($page,$pagesize,$src,$combiner,$sks=0) function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
{ {
$docnr = "rechnr"; $docnr = "rechnr";
$combiner = $combiner == "OR" ? "OR" : "AND";
$params = array();
if(!$sks) if(!$sks)
{ {
$query = "SELECT CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) AS drechnr, $query = "SELECT CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) AS drechnr,
rechnung.$docnr AS rechnr, rechnung.$docnr AS rechnr,
rechnung.id, rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date, DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '<br />') AS artikel, GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '\n') AS artikel,
adresse_id, adresse_id,
storno, storno,
rechnung.typ_id rechnung.typ_id
@@ -304,9 +243,10 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag = "%".$tag."%"; $tag = "%".$tag."%";
$query .= " $combiner (artikel.bezeichn LIKE '$tag' OR $query .= " $combiner (artikel.bezeichn LIKE ? OR
CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) LIKE '$tag' OR CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) LIKE ? OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$tag')"; DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag);
} }
} }
else else
@@ -315,7 +255,7 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
rechnung.$docnr AS rechnr, rechnung.$docnr AS rechnr,
rechnung.id, rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date, DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '<br />') AS artikel, GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '\n') AS artikel,
adresse_id, adresse_id,
storno = 0, storno = 0,
rechnung.typ_id rechnung.typ_id
@@ -326,77 +266,99 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag = "%".$tag."%"; $tag = "%".$tag."%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE '$tag' OR $query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR
artikelsks.bezeichn2 LIKE '$tag' OR artikelsks.bezeichn2 LIKE ? OR
rechnung.rechnr LIKE '$tag' OR rechnung.rechnr LIKE ? OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$tag')"; DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag, $tag);
} }
} }
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC "; $query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["limited"] = $query;
$ret["params"] = $params;
return $ret; return $ret;
} }
/*
* Terminliste. $termtyp waehlt die Registerkarte:
* 1 offene mit Datum, 2 offene ohne Datum, 3 erledigte,
* 4 vorgemerkte (Wiedervorlage in der Zukunft), 5 ganztaegige.
* Rueckgabe wie createKdnRechQry().
*/
function createTermQry($page,$pagesize,$src,$combiner,$termtyp) function createTermQry($page,$pagesize,$src,$combiner,$termtyp)
{ {
$combiner = $combiner == "OR" ? "OR" : "AND";
$query = "SELECT termin.id,termtyp.typ, termin.head, MIN(termtime) AS termtime, SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer, user, user2, user3, user4, done, partner_id, adresse_id, termin.id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname, $params = array();
adresse.firma as firma, $query = "SELECT termin.id, termtyp.typ, termin.head, MIN(termtime) AS termtime,
user.vname as uservname, user.nname as usernname, user.color as color, SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer,
user2.vname as uservname2, user2.nname as usernname2, user, user2, user3, user4, done, partner_id, adresse_id, main_id,
user3.vname as uservname3, user3.nname as usernname3, str, ort, ortsteil, plz, hnr, adresse.vname AS vname, adresse.nname AS nname,
user4.vname as uservname4, user4.nname as usernname4, user.vname AS uservname, user.nname AS usernname, user.color AS color,
firma, vname2, nname2 user2.vname AS uservname2, user2.nname AS usernname2,
FROM termin user3.vname AS uservname3, user3.nname AS usernname3,
LEFT JOIN termtyp ON termin.typ = termtyp.id user4.vname AS uservname4, user4.nname AS usernname4,
LEFT JOIN adresse ON termin.adresse_id = adresse.id firma, vname2, nname2
LEFT JOIN partner ON adresse.partner_id = partner.id FROM termin
LEFT JOIN strasse ON adresse.str_id = strasse.id LEFT JOIN termtyp ON termin.typ = termtyp.id
LEFT JOIN ort ON strasse.ort_id = ort.id LEFT JOIN adresse ON termin.adresse_id = adresse.id
LEFT JOIN user ON termin.user = user.id LEFT JOIN partner ON adresse.partner_id = partner.id
LEFT JOIN user AS user2 ON termin.user2 = user2.id LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id LEFT JOIN ort ON strasse.ort_id = ort.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id LEFT JOIN user ON termin.user = user.id
WHERE "; LEFT JOIN user AS user2 ON termin.user2 = user2.id
if($termtyp == 1) LEFT JOIN user AS user3 ON termin.user3 = user3.id
$query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()"; LEFT JOIN user AS user4 ON termin.user4 = user4.id
elseif($termtyp == 2) WHERE ";
$query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()"; switch((int)$termtyp)
elseif($termtyp == 3) {
$query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()"; case 2:
elseif($termtyp == 4) $query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
$query .= "termdauer != '24:00:00' AND act_date > NOW()"; break;
elseif($termtyp == 5) case 3:
$query .= "termdauer = '24:00:00'"; $query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()";
break;
case 4:
$query .= "termdauer != '24:00:00' AND act_date > NOW()";
break;
case 5:
$query .= "termdauer = '24:00:00'";
break;
// 1 ist die uebliche Ansicht und faengt zugleich unbekannte Werte ab
default:
$query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
break;
}
foreach($src AS $tag) foreach($src AS $tag)
{ {
$tag = "%".$tag."%"; $tag = "%".$tag."%";
$query .= " $combiner (termin.head LIKE '$tag' OR $query .= " $combiner (termin.head LIKE ? OR
termin.text LIKE '$tag' OR termin.text LIKE ? OR
adresse.firma LIKE '$tag' OR adresse.firma LIKE ? OR
adresse.vname LIKE '$tag' OR adresse.vname LIKE ? OR
adresse.nname LIKE '$tag' OR adresse.nname LIKE ? OR
ort LIKE '$tag' OR ort LIKE ? OR
plz LIKE '$tag' OR plz LIKE ? OR
str LIKE '$tag' OR str LIKE ? OR
DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE '$tag')"; DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE ?)";
for($i = 0; $i < 9; $i++)
$params[] = $tag;
} }
if($termtyp == 2) if((int)$termtyp == 2)
$query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC"; $query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC";
elseif($termtyp != 5 && $termtyp != 3) elseif((int)$termtyp != 5 && (int)$termtyp != 3)
$query .= " GROUP BY main_id ORDER BY termtime ASC"; $query .= " GROUP BY main_id ORDER BY termtime ASC";
else else
$query .= " GROUP BY main_id ORDER BY termtime DESC"; $query .= " GROUP BY main_id ORDER BY termtime DESC";
$ret["all"] = $query; $ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize"; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query; $ret["params"] = $params;
return $ret; return $ret;
} }
@@ -446,6 +408,31 @@ function createMsgQry($page,$pagesize,$src,$combiner,$user)
return $ret; return $ret;
} }
/*
* Zahl der Treffer einer Suche. Die Abfragen aus create*Qry() gruppieren,
* deshalb wird die ungekuerzte Abfrage ausgefuehrt und gezaehlt, statt mit
* COUNT(*) zu arbeiten.
*/
function zaehleTreffer($dbconn, $queries)
{
$res = isset($queries["params"])
? db_abfrage($dbconn, $queries["all"], $queries["params"])
: mysqli_query($dbconn, $queries["all"]);
if(!$res)
die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
return mysqli_num_rows($res);
}
/*
* Mit \n verbundene Werte aus GROUP_CONCAT als escaptes HTML, eine Zeile
* je Wert. Zusammengebaut wird erst hier, damit Daten aus der Datenbank
* nicht als HTML durchschlagen.
*/
function zeilenHtml($text)
{
return implode("<br />", array_map("htmlspecialchars", explode("\n", (string)$text)));
}
function displayPages($pagesize,$currpage,$numentries,$refreshfunc,$ad_params = "") function displayPages($pagesize,$currpage,$numentries,$refreshfunc,$ad_params = "")
{ {
echo "Seite: "; echo "Seite: ";
@@ -535,7 +522,8 @@ function displayList($header,$entries,$speciallines=array(),$colors=array())
echo "<tr style='background-color: #e2e2e2;'>"; echo "<tr style='background-color: #e2e2e2;'>";
if(isset($colors[$i])) if(isset($colors[$i]))
echo "<td bgcolor='".$colors[$i]."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>"; // die Farbe kommt aus der Benutzerverwaltung, nicht aus dem Code
echo "<td bgcolor='".htmlspecialchars((string)$colors[$i])."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>";
foreach($entry AS $element) foreach($entry AS $element)
{ {
@@ -564,25 +552,30 @@ function displayList($header,$entries,$speciallines=array(),$colors=array())
echo "</table>"; echo "</table>";
} }
/*
* Bausteine fuer die Trefferlisten. Sie liefern fertiges HTML und escapen
* die Werte aus der Datenbank deshalb selbst.
*/
function makenameline($adresse) function makenameline($adresse)
{ {
$ret = $adresse["vname"]." ".$adresse["nname"]; $ret = zeilenHtml(trim($adresse["vname"]." ".$adresse["nname"]));
if($adresse["firma"]) if(!empty($adresse["firma"]))
$ret .= "<br /><i><u>".$adresse["firma"]."</u></i>"; $ret .= "<br /><i><u>".zeilenHtml($adresse["firma"])."</u></i>";
return $ret; return $ret;
} }
function makeadressline($adresse) function makeadressline($adresse)
{ {
$ret["ort"] = $adresse["plz"]." ".$adresse["ort"]; $ret["ort"] = zeilenHtml(trim($adresse["plz"]." ".$adresse["ort"]));
$ret["str"] = $adresse["str"]." ".$adresse["hnr"]; $ret["str"] = zeilenHtml(trim($adresse["str"]." ".$adresse["hnr"]));
return $ret; return $ret;
} }
function maketelline($tel) function maketelline($tel)
{ {
$ret=""; $nr = isset($tel["tel"]) ? (string)$tel["tel"] : "";
if(isset($tel["vwahl"]) && !stristr($tel["tel"], "-") && !stristr($tel["tel"], "/")) $ret = "";
$ret = $tel["vwahl"]."-"; if(!empty($tel["vwahl"]) && !str_contains($nr, "-") && !str_contains($nr, "/"))
$ret .= $tel["tel"]; $ret = zeilenHtml($tel["vwahl"])."-";
$ret .= zeilenHtml($nr);
return $ret; return $ret;
} }
+160 -178
View File
@@ -1,6 +1,19 @@
<?php <?php
require_once(__DIR__."/db.php");
require_once('tcpdf/tcpdf.php'); require_once('tcpdf/tcpdf.php');
// Unicode-Schriften statt der eingebauten PDF-Schriften Times/Helvetica: Die kennen
// nur westeuropäische Zeichen, aus ř, ł, č usw. würde ein "?". FreeSerif und
// FreeSans (bei TCPDF dabei) sind im Schriftbild und in der Breite nahezu gleich.
define("PDF_SCHRIFT_SERIF", "freeserif");
define("PDF_SCHRIFT_SANS", "freesans");
// Temporäre PDFs und Vorschaubilder in temp/ werden beim Erzeugen neuer Dateien
// aufgeräumt, wenn sie älter sind als dies (Sekunden). Früher stand hier 20 -
// gemeint waren Minuten: Bei 20 Sekunden konnte ein PDF verschwinden, bevor der
// Browser es geladen hatte, sobald jemand anderes eins erzeugte.
define("PDF_TEMP_MAX_ALTER", 20 * 60);
function makerawPDF($ajax) function makerawPDF($ajax)
{ {
@@ -45,13 +58,13 @@ function makerawPDF($ajax)
$this->SetY(-16.5); $this->SetY(-16.5);
$linepos=$this->GetY(); $linepos=$this->GetY();
$this->setX(30); $this->setX(30);
$this->SetFont('Times','',9); $this->SetFont(PDF_SCHRIFT_SERIF,'',9);
$this->SetTextColor(20,47,119); $this->SetTextColor(20,47,119);
$this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R'); $this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R');
$this->SetY(-16.3); $this->SetY(-16.3);
$this->setX(15); $this->setX(15);
//Arial fett 6 //Arial fett 6
$this->SetFont('helvetica','B',7); $this->SetFont(PDF_SCHRIFT_SANS,'B',7);
//Seitenzahl //Seitenzahl
$this->SetDrawColor(20,47,119); $this->SetDrawColor(20,47,119);
@@ -100,12 +113,12 @@ function makerawPDF($ajax)
//Position 1,5 cm von unten //Position 1,5 cm von unten
$this->SetY(-23); $this->SetY(-23);
$this->setX(30); $this->setX(30);
$this->SetFont('Times','',9); $this->SetFont(PDF_SCHRIFT_SERIF,'',9);
$this->SetTextColor(0,0,0); $this->SetTextColor(0,0,0);
$this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R'); $this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R');
$this->SetY(-19); $this->SetY(-19);
//Arial fett 6 //Arial fett 6
$this->SetFont('helvetica','B',8); $this->SetFont(PDF_SCHRIFT_SANS,'B',8);
$this->SetTextColor(124,124,138); $this->SetTextColor(124,124,138);
//Seitenzahl //Seitenzahl
$this->setX(15); $this->setX(15);
@@ -164,13 +177,13 @@ function makerawPDF($ajax)
//Position 1,5 cm von unten //Position 1,5 cm von unten
$this->SetY(-17); $this->SetY(-17);
$this->setX(30); $this->setX(30);
$this->SetFont('Times','',9); $this->SetFont(PDF_SCHRIFT_SERIF,'',9);
$this->SetTextColor(0,0,0); $this->SetTextColor(0,0,0);
$this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R'); $this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R');
$this->SetY(-10); $this->SetY(-10);
$this->setX(15); $this->setX(15);
//Arial fett 6 //Arial fett 6
$this->SetFont('helvetica','B',6); $this->SetFont(PDF_SCHRIFT_SANS,'B',6);
$this->SetTextColor(124,124,138); $this->SetTextColor(124,124,138);
//Seitenzahl //Seitenzahl
@@ -214,7 +227,7 @@ function makeumschlagAddress($ajax, $address){
$pdf->SetAutoPageBreak(true,5); $pdf->SetAutoPageBreak(true,5);
$pdf->AddPage("L",$pagelayout); $pdf->AddPage("L",$pagelayout);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setY(55); $pdf->setY(55);
$pdf->setX(140); $pdf->setX(140);
$pdf->MultiCell(75,50,str_replace("<br />","\n",$address["adresse"]),0,"L",0); $pdf->MultiCell(75,50,str_replace("<br />","\n",$address["adresse"]),0,"L",0);
@@ -261,7 +274,7 @@ function makerawPDFcopy($ajax)
{ {
$this->SetY(-17); $this->SetY(-17);
$this->setX(30); $this->setX(30);
$this->SetFont('Times','',9); $this->SetFont(PDF_SCHRIFT_SERIF,'',9);
$this->SetTextColor(0,0,0); $this->SetTextColor(0,0,0);
$this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R'); $this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R');
$this->SetY(-10); $this->SetY(-10);
@@ -303,7 +316,7 @@ function makerawPDFanfahrt($ajax)
{ {
$this->SetY(-17); $this->SetY(-17);
$this->setX(30); $this->setX(30);
$this->SetFont('Times','',9); $this->SetFont(PDF_SCHRIFT_SERIF,'',9);
$this->SetTextColor(0,0,0); $this->SetTextColor(0,0,0);
$this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R'); $this->Cell(180,5,'Seite '.$this->getAliasNumPage().' von '.$this->getAliasNbPages(),0,0,'R');
$this->SetY(-10); $this->SetY(-10);
@@ -329,13 +342,13 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
//$pdf->SetDrawColor(0,0,0); //$pdf->SetDrawColor(0,0,0);
if($_SESSION["firma"] == "Wagner Markisen") if($_SESSION["firma"] == "Wagner Markisen")
{ {
$pdf->SetFont('helvetica','B',10); $pdf->SetFont(PDF_SCHRIFT_SANS,'B',10);
$pdf->setY(52); $pdf->setY(52);
$pdf->setX(165); $pdf->setX(165);
$pdf->cell(40,5,"Öffnungszeiten:",0,0); $pdf->cell(40,5,"Öffnungszeiten:",0,0);
$pdf->ln(5); $pdf->ln(5);
$pdf->setX(165); $pdf->setX(165);
$pdf->SetFont('helvetica','',9); $pdf->SetFont(PDF_SCHRIFT_SANS,'',9);
$pdf->cell(12,4,"Mo.:"); $pdf->cell(12,4,"Mo.:");
$pdf->cell(20,4," 8:00 bis 12:00",0,0); $pdf->cell(20,4," 8:00 bis 12:00",0,0);
$pdf->ln(3.8); $pdf->ln(3.8);
@@ -361,7 +374,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
} }
//STORNO!!! //STORNO!!!
if($rechnung["storno"] == 1){ if($rechnung["storno"] == 1){
$pdf->SetFont('helvetica','B',75); $pdf->SetFont(PDF_SCHRIFT_SANS,'B',75);
$pdf->setY(135); $pdf->setY(135);
$pdf->setX(70); $pdf->setX(70);
$pdf->SetTextColor(200,0,0); $pdf->SetTextColor(200,0,0);
@@ -372,7 +385,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
} }
//ADRESSE!!!! //ADRESSE!!!!
$pdf->SetFont('helvetica','B',6); $pdf->SetFont(PDF_SCHRIFT_SANS,'B',6);
$pdf->setY(35); $pdf->setY(35);
$pdf->setX(25); $pdf->setX(25);
@@ -392,7 +405,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
$pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L'); $pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L');
} }
$pdf->SetTextColor(0,0,0); $pdf->SetTextColor(0,0,0);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setY(40); $pdf->setY(40);
$pdf->setX(25); $pdf->setX(25);
$pdf->MultiCell(75,45,str_replace("<br />","\n",$adresse),0,"L",0); $pdf->MultiCell(75,45,str_replace("<br />","\n",$adresse),0,"L",0);
@@ -402,7 +415,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
$datum=strftime("%d.%m.%Y",strtotime($rechnung["datetime"])); $datum=strftime("%d.%m.%Y",strtotime($rechnung["datetime"]));
$pdf->Cell(0,5,$datum,0,0,'L'); $pdf->Cell(0,5,$datum,0,0,'L');
//typ //typ
$pdf->SetFont('Times','B',18); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',18);
$pdf->sety(80); $pdf->sety(80);
$pdf->setX(20); $pdf->setX(20);
if($rechnung["typ"] != "Brief") if($rechnung["typ"] != "Brief")
@@ -412,19 +425,19 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
if($rechnung["typ"] != "Brief") if($rechnung["typ"] != "Brief")
{ {
$pdf->SetFont('Times','B',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',12);
$pdf->sety(95); $pdf->sety(95);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(0,5,$rechnung["typ"].": ",0,0,'L'); $pdf->Cell(0,5,$rechnung["typ"].": ",0,0,'L');
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->sety(95); $pdf->sety(95);
$pdf->setX(60); $pdf->setX(60);
$pdf->Cell(0,5,$rechnung["drechnr"],0,0,'L'); $pdf->Cell(0,5,$rechnung["drechnr"],0,0,'L');
if($_SESSION["firma"] == "LSG Oberallgäu") if($_SESSION["firma"] == "LSG Oberallgäu")
{ {
$pdf->SetFont('Times','B',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',12);
$pdf->Cell(0,5,"Bitte bei der Überweisung angeben!!",0,0,'L'); $pdf->Cell(0,5,"Bitte bei der Überweisung angeben!!",0,0,'L');
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
} }
$currY = 100; $currY = 100;
} }
@@ -436,11 +449,11 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
if($_SESSION["firma"] == "Wagner Markisen") if($_SESSION["firma"] == "Wagner Markisen")
{ {
$pdf->SetFont('Times','B',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',12);
$pdf->sety(100); $pdf->sety(100);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(0,5,"Kundennummer: ",0,0,'L'); $pdf->Cell(0,5,"Kundennummer: ",0,0,'L');
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->sety(100); $pdf->sety(100);
$pdf->setX(60); $pdf->setX(60);
$pdf->Cell(0,5,$rechnung["partner_id"],0,0,'L'); $pdf->Cell(0,5,$rechnung["partner_id"],0,0,'L');
@@ -454,7 +467,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
//Begrüßung //Begrüßung
$pdf->SetFont('Times','B',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',12);
$pdf->setY($currY); $pdf->setY($currY);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(0,5,$rechnung["anrede1"],0,0,'L'); $pdf->Cell(0,5,$rechnung["anrede1"],0,0,'L');
@@ -470,7 +483,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
if ($rechnung["typ"] == "Rechnung") if ($rechnung["typ"] == "Rechnung")
{ {
// $currY += 5; // $currY += 5;
// $pdf->SetFont('Times','',12); // $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
// $pdf->sety($currY); // $pdf->sety($currY);
// $pdf->setX(20); // $pdf->setX(20);
// $pdf->Cell(0,5,"Wir bedanken uns für Ihr Vertrauen.",0,0,'L'); // $pdf->Cell(0,5,"Wir bedanken uns für Ihr Vertrauen.",0,0,'L');
@@ -478,7 +491,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
elseif ($rechnung["typ"] == "Auftragsbestätigung") elseif ($rechnung["typ"] == "Auftragsbestätigung")
{ {
$currY += 5; $currY += 5;
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->sety($currY); $pdf->sety($currY);
$pdf->setX(20); $pdf->setX(20);
if($_SESSION["firma"] == "Ingenieurbüro Wagner") if($_SESSION["firma"] == "Ingenieurbüro Wagner")
@@ -489,7 +502,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
elseif ($rechnung["typ"] == "Angebot") elseif ($rechnung["typ"] == "Angebot")
{ {
$currY += 5; $currY += 5;
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->sety($currY); $pdf->sety($currY);
$pdf->setX(20); $pdf->setX(20);
if($rechnung["anrede1"] || $rechnung["anrede2"]) if($rechnung["anrede1"] || $rechnung["anrede2"])
@@ -509,7 +522,7 @@ function makefirstpage($pdf,$adresse,$rechnung,$ajax)
if (rtrim($rechnung["intro"])!="" ) if (rtrim($rechnung["intro"])!="" )
{ {
$currY += 5; $currY += 5;
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->sety($currY); $pdf->sety($currY);
$pdf->setX(20); $pdf->setX(20);
if($rechnung["typ"] == "Brief") if($rechnung["typ"] == "Brief")
@@ -553,7 +566,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->setX(20); $newpdf->setX(20);
$newcurrY=3; $newcurrY=3;
$newpdf->setY($newcurrY); $newpdf->setY($newcurrY);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->setX(20); $newpdf->setX(20);
$newpdf->MultiCell(100-$mixedmwst*15,5,$artikel[0]["art"]["bezeichn"],0,'L',0,1); $newpdf->MultiCell(100-$mixedmwst*15,5,$artikel[0]["art"]["bezeichn"],0,'L',0,1);
$newpdf->setX(120-$mixedmwst*15); $newpdf->setX(120-$mixedmwst*15);
@@ -568,7 +581,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->Cell(15,5,$artikel[0]["art"]["artmwst"]."%",0,0,'R'); $newpdf->Cell(15,5,$artikel[0]["art"]["artmwst"]."%",0,0,'R');
} }
$newpdf->setY($newcurrY+2); $newpdf->setY($newcurrY+2);
$newpdf->SetFont('Times','',12); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
foreach($artikel[0]["eig"] as $eig) foreach($artikel[0]["eig"] as $eig)
{ {
$newpdf->Cell(100, 3, $eig["bezeichn"], 0, 1, "L", 0); $newpdf->Cell(100, 3, $eig["bezeichn"], 0, 1, "L", 0);
@@ -582,7 +595,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
} }
//Table-HEAD //Table-HEAD
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->sety($pdf->GetY()+5); $pdf->sety($pdf->GetY()+5);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(100-$mixedmwst*15,5,'Bezeichnung',0,0,'L'); $pdf->Cell(100-$mixedmwst*15,5,'Bezeichnung',0,0,'L');
@@ -619,7 +632,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$currY = $newpdf->GetY(); $currY = $newpdf->GetY();
if (($currY+$artheight > 255 && $artheight < 219) || ($art["art"]["pagebreak"] && !$wholetablebreak)) if (($currY+$artheight > 255 && $artheight < 219) || ($art["art"]["pagebreak"] && !$wholetablebreak))
{ {
$newpdf->SetFont('Times','B',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$newpdf->Line(18 , $currY+4.3, 200, $currY+4.3); $newpdf->Line(18 , $currY+4.3, 200, $currY+4.3);
$newpdf->setY($currY+7); $newpdf->setY($currY+7);
$newpdf->setX(130-$mixedmwst*15); $newpdf->setX(130-$mixedmwst*15);
@@ -632,7 +645,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->AddPage("P"); $newpdf->AddPage("P");
//Table-re-HEAD //Table-re-HEAD
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(100-$mixedmwst*15,5,'Bezeichnung',0,0,'L'); $pdf->Cell(100-$mixedmwst*15,5,'Bezeichnung',0,0,'L');
$pdf->setX(120-$mixedmwst*15); $pdf->setX(120-$mixedmwst*15);
@@ -651,7 +664,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
} }
$currY = $newpdf->GetY(); $currY = $newpdf->GetY();
} }
@@ -671,7 +684,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$currY= $newpdf->GetY()+5; $currY= $newpdf->GetY()+5;
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->setX(120-$mixedmwst*15); $newpdf->setX(120-$mixedmwst*15);
$newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C'); $newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C');
$newpdf->setX(135-$mixedmwst*15); $newpdf->setX(135-$mixedmwst*15);
@@ -689,7 +702,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
} }
if($art["art"]["rabatt"]) if($art["art"]["rabatt"])
{ {
$newpdf->SetFont('Times','I',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'I',14);
$newpdf->setX(110-$mixedmwst*15); $newpdf->setX(110-$mixedmwst*15);
if(!$art["art"]["rabatttyp"]) if(!$art["art"]["rabatttyp"])
$newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L'); $newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L');
@@ -707,10 +720,10 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->setX(20); $newpdf->setX(20);
$newpdf->SetFont('Times','B',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$newpdf->MultiCell(90-$mixedmwst*15,5,$art["art"]["bezeichn"],0,'L',0,1); $newpdf->MultiCell(90-$mixedmwst*15,5,$art["art"]["bezeichn"],0,'L',0,1);
$currY = $newpdf->GetY(); $currY = $newpdf->GetY();
$newpdf->SetFont('Times','',12); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
foreach($art["eig"] as $eig) foreach($art["eig"] as $eig)
{ {
if($eig["einheit"] == "keine") if($eig["einheit"] == "keine")
@@ -728,7 +741,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$currY= $newpdf->GetY()+3; $currY= $newpdf->GetY()+3;
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->setX(120-$mixedmwst*15); $newpdf->setX(120-$mixedmwst*15);
$newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C'); $newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C');
$newpdf->setX(135-$mixedmwst*15); $newpdf->setX(135-$mixedmwst*15);
@@ -743,7 +756,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->Ln(); $newpdf->Ln();
if($art["art"]["rabatt"]) if($art["art"]["rabatt"])
{ {
$newpdf->SetFont('Times','I',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'I',14);
$newpdf->setX(110-$mixedmwst*15); $newpdf->setX(110-$mixedmwst*15);
if(!$art["art"]["rabatttyp"]) if(!$art["art"]["rabatttyp"])
$newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L'); $newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L');
@@ -761,10 +774,10 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->setX(25); $newpdf->setX(25);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->MultiCell(85-$mixedmwst*15,5,"(Optional: " .$art["art"]["bezeichn"].")",0,'L',0,1); $newpdf->MultiCell(85-$mixedmwst*15,5,"(Optional: " .$art["art"]["bezeichn"].")",0,'L',0,1);
$currY = $newpdf->GetY(); $currY = $newpdf->GetY();
$newpdf->SetFont('Times','',12); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
foreach($art["eig"] as $eig) foreach($art["eig"] as $eig)
{ {
if($eig["einheit"] == "keine") if($eig["einheit"] == "keine")
@@ -780,7 +793,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$currY= $newpdf->GetY()+3; $currY= $newpdf->GetY()+3;
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->setX(120-$mixedmwst*15); $newpdf->setX(120-$mixedmwst*15);
$newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C'); $newpdf->Cell(15,5,number_significant($art["art"]["menge"], 3)." ".$art["art"]["einheit"],0,0,'C');
$newpdf->setX(135-$mixedmwst*15); $newpdf->setX(135-$mixedmwst*15);
@@ -796,7 +809,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
if($art["art"]["rabatt"]) if($art["art"]["rabatt"])
{ {
$newpdf->SetFont('Times','I',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'I',14);
$newpdf->setX(110-$mixedmwst*15); $newpdf->setX(110-$mixedmwst*15);
if(!$art["art"]["rabatttyp"]) if(!$art["art"]["rabatttyp"])
$newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L'); $newpdf->Cell(100,5,"Abzüglich ".$art["art"]["rabatt"]."% Rabatt",0,0,'L');
@@ -814,10 +827,10 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$newpdf->setY($currY); $newpdf->setY($currY);
$newpdf->setX(25); $newpdf->setX(25);
$newpdf->SetFont('Times','',14); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$newpdf->MultiCell(85-$mixedmwst*15,5,"(Alternativ: " .$art["art"]["bezeichn"].")",0,'L',0,1); $newpdf->MultiCell(85-$mixedmwst*15,5,"(Alternativ: " .$art["art"]["bezeichn"].")",0,'L',0,1);
$currY = $newpdf->GetY(); $currY = $newpdf->GetY();
$newpdf->SetFont('Times','',12); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
foreach($art["eig"] as $eig) foreach($art["eig"] as $eig)
{ {
if($eig["einheit"] == "keine") if($eig["einheit"] == "keine")
@@ -837,7 +850,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
{ {
$currY = $pdf->GetY(); $currY = $pdf->GetY();
//Endbetrag //Endbetrag
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->Line(18 , $currY+2, 200, $currY+2); $pdf->Line(18 , $currY+2, 200, $currY+2);
$pdf->setY($currY+2); $pdf->setY($currY+2);
@@ -874,7 +887,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$pdf->Cell(30,6,number_format($ubertr_all,2,",",".")." ".$wahrung,0,1,'R'); $pdf->Cell(30,6,number_format($ubertr_all,2,",",".")." ".$wahrung,0,1,'R');
$currY=$pdf->GetY()+10; $currY=$pdf->GetY()+10;
$pdf->setY($currY); $pdf->setY($currY);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setX(20); $pdf->setX(20);
$currY=$currY; $currY=$currY;
} }
@@ -883,7 +896,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
{ {
$currY = $pdf->GetY(); $currY = $pdf->GetY();
//Endbetrag //Endbetrag
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->Line(18 , $currY+2, 200, $currY+2); $pdf->Line(18 , $currY+2, 200, $currY+2);
$pdf->setY($currY+2); $pdf->setY($currY+2);
$pdf->setX(130-$mixedmwst*15); $pdf->setX(130-$mixedmwst*15);
@@ -936,7 +949,7 @@ function maketable($pdf,$artikel,$rechnung,$ajax)
$pdf->Cell(30,6,number_format($ubertr_all,2,",",".")." ".$wahrung,0,1,'R'); $pdf->Cell(30,6,number_format($ubertr_all,2,",",".")." ".$wahrung,0,1,'R');
$currY=$pdf->GetY()+10; $currY=$pdf->GetY()+10;
$pdf->setY($currY); $pdf->setY($currY);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setX(20); $pdf->setX(20);
$currY=$currY; $currY=$currY;
} }
@@ -978,7 +991,7 @@ function makeEndPage($pdf,$rechnung,$gesamtpreis,$ajax)
} }
if (rtrim($rechnung["outro"]) != "") if (rtrim($rechnung["outro"]) != "")
{ {
$newpdf->SetFont('Times','',12); $newpdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$newpdf->setX(20); $newpdf->setX(20);
$newpdf->MultiCell(0,5,rtrim($rechnung["outro"]),0,'L',0); $newpdf->MultiCell(0,5,rtrim($rechnung["outro"]),0,'L',0);
//ENDE!! //ENDE!!
@@ -1121,9 +1134,9 @@ function savePDF($pdf,$PDFpath)
if (preg_match("=^\.=", $file)) if (preg_match("=^\.=", $file))
continue; # ., .. und versteckte Dateien (.gitkeep) ignorieren continue; # ., .. und versteckte Dateien (.gitkeep) ignorieren
elseif(is_file($PDFpathpart.$file)) elseif(is_file($PDFpathpart.$file))
{ #Dateien prüfen, und löschen, wenn älter als $delFile - Minuten { #Dateien löschen, wenn älter als PDF_TEMP_MAX_ALTER
$lastTime = ceil((time() - filemtime($PDFpathpart.$file))); $lastTime = ceil((time() - filemtime($PDFpathpart.$file)));
if($lastTime > 20){ if($lastTime > PDF_TEMP_MAX_ALTER){
unlink($PDFpathpart.$file); unlink($PDFpathpart.$file);
} }
} }
@@ -1144,27 +1157,27 @@ 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))
{ {
$lastTime = ceil((time() - filemtime($PDFpathpart.$file))); $lastTime = ceil((time() - filemtime($PDFpathpart.$file)));
if($lastTime > 20){ if($lastTime > PDF_TEMP_MAX_ALTER){
rrmdir($PDFpathpart.$file."/"); rrmdir($PDFpathpart.$file."/");
} }
} }
else else
{ #Dateien prüfen, und löschen, wenn älter als $delFile - Minuten { #Dateien löschen, wenn älter als PDF_TEMP_MAX_ALTER
$lastTime = ceil((time() - filemtime($PDFpathpart.$file))); $lastTime = ceil((time() - filemtime($PDFpathpart.$file)));
if($lastTime > 20){ if($lastTime > PDF_TEMP_MAX_ALTER){
unlink($PDFpathpart.$file); unlink($PDFpathpart.$file);
} }
} }
} }
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"))
@@ -1202,24 +1215,24 @@ function makezettel($pdf,$termine,$anfahrt,$googleadressen='')
} }
$pdf->SetTextColor(0,0,0); $pdf->SetTextColor(0,0,0);
$pdf->SetFont('Times','',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$pdf->setY(20); $pdf->setY(20);
$pdf->setX(25); $pdf->setX(25);
$pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0); $pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0);
$pdf->Ln(10); $pdf->Ln(10);
$pdf->SetFont('Times','BU',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'BU',14);
$pdf->Cell(0,5,strtoupper($termin["typ"])." - ".$termin["head"],0,1,"C",0); $pdf->Cell(0,5,strtoupper($termin["typ"])." - ".$termin["head"],0,1,"C",0);
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
//$pdf->Line(35,$pdf->GetY(),180,$pdf->GetY()); //$pdf->Line(35,$pdf->GetY(),180,$pdf->GetY());
$notespos = $pdf->GetY(); $notespos = $pdf->GetY();
$pdf->setY(20); $pdf->setY(20);
$pdf->Cell(0,5,date("d.m.Y, H:i",strtotime($termin["termtime"]))." Uhr",0,1,"R",0); $pdf->Cell(0,5,date("d.m.Y, H:i",strtotime($termin["termtime"]))." Uhr",0,1,"R",0);
$pdf->Cell(0,5,"(".$dauer." geplant)",0,1,"R",0); $pdf->Cell(0,5,"(".$dauer." geplant)",0,1,"R",0);
$pdf->SetY($notespos); $pdf->SetY($notespos);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->MultiCell(0,0,$termin["text"],0,"C",0); $pdf->MultiCell(0,0,$termin["text"],0,"C",0);
$pdf->Ln(); $pdf->Ln();
$pdf->SetFont('Times','B',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',16);
$pdf->Cell(0,5,"Notizen:",0,1,"C",0); $pdf->Cell(0,5,"Notizen:",0,1,"C",0);
$pdf->Ln(12); $pdf->Ln(12);
$pdf->SetDrawColor(100,100,100); $pdf->SetDrawColor(100,100,100);
@@ -1261,17 +1274,17 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
$mitarbeiter .= ", ".$termin["uservname4"]." ".$termin["usernname4"]; $mitarbeiter .= ", ".$termin["uservname4"]." ".$termin["usernname4"];
$pdf->SetTextColor(0,0,0); $pdf->SetTextColor(0,0,0);
$pdf->SetFont('Times','',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',14);
$pdf->setY(20); $pdf->setY(20);
$pdf->setX(25); $pdf->setX(25);
$pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0); $pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0);
$pdf->SetFont('Times','B',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',12);
$pdf->ln(5); $pdf->ln(5);
$pdf->MultiCell(0,0,$telnrn,0,"L",0); $pdf->MultiCell(0,0,$telnrn,0,"L",0);
$pdf->Ln(10); $pdf->Ln(10);
$pdf->SetFont('Times','BU',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'BU',16);
$pdf->Cell(0,5,strtoupper($termin["typ"])." - ".$termin["head"],0,1,"C",0); $pdf->Cell(0,5,strtoupper($termin["typ"])." - ".$termin["head"],0,1,"C",0);
$pdf->SetFont('Times','B',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',16);
//$pdf->Line(35,$pdf->GetY(),180,$pdf->GetY()); //$pdf->Line(35,$pdf->GetY(),180,$pdf->GetY());
$notespos = $pdf->GetY(); $notespos = $pdf->GetY();
$pdf->setY(10); $pdf->setY(10);
@@ -1279,10 +1292,10 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
$pdf->Cell(0,5,"(".$dauer." geplant)",0,1,"R",0); $pdf->Cell(0,5,"(".$dauer." geplant)",0,1,"R",0);
$pdf->MultiCell(0,0,"(".$mitarbeiter.")",0,"R",0); $pdf->MultiCell(0,0,"(".$mitarbeiter.")",0,"R",0);
$pdf->SetY($notespos); $pdf->SetY($notespos);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->MultiCell(0,0,$termin["text"],0,"C",0); $pdf->MultiCell(0,0,$termin["text"],0,"C",0);
$pdf->Ln(); $pdf->Ln();
$pdf->SetFont('Times','B',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',16);
$pdf->Cell(0,5,"Notizen:",0,1,"C",0); $pdf->Cell(0,5,"Notizen:",0,1,"C",0);
$pdf->Ln(12); $pdf->Ln(12);
$pdf->SetDrawColor(100,100,100); $pdf->SetDrawColor(100,100,100);
@@ -1293,7 +1306,7 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
$pdf->line(10,$pdf->GetY(),200,$pdf->GetY()); $pdf->line(10,$pdf->GetY(),200,$pdf->GetY());
$pdf->Ln(12); $pdf->Ln(12);
} }
$pdf->SetFont('Times','',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',16);
$pdf->Cell(0,5,"Ankunft:______________________ Abfahrt:_____________________",0,1,"L",0); $pdf->Cell(0,5,"Ankunft:______________________ Abfahrt:_____________________",0,1,"L",0);
$pdf->Ln(12); $pdf->Ln(12);
$pdf->Cell(0,5,"Unterschrift Kunde:_____________________",0,1,"C",0); $pdf->Cell(0,5,"Unterschrift Kunde:_____________________",0,1,"C",0);
@@ -1312,7 +1325,7 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
$pdf->line(120,$pdf->GetY(),200,$pdf->GetY()); $pdf->line(120,$pdf->GetY(),200,$pdf->GetY());
$pdf->Ln(12); $pdf->Ln(12);
} }
$pdf->SetFont('Times','',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',16);
$pdf->Cell(0,5,"Ankunft:______________________ Abfahrt:_____________________",0,1,"L",0); $pdf->Cell(0,5,"Ankunft:______________________ Abfahrt:_____________________",0,1,"L",0);
$pdf->Ln(10); $pdf->Ln(10);
$pdf->Cell(0,5,"Unterschrift Kunde:_____________________",0,1,"C",0); $pdf->Cell(0,5,"Unterschrift Kunde:_____________________",0,1,"C",0);
@@ -1320,9 +1333,10 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
} }
} }
/* Die Daten eines Termins fuer den Terminzettel */
function maketerminarray($dbconn,$id) function maketerminarray($dbconn,$id)
{ {
$qry = mysqli_query($dbconn,"SELECT head, user, text, termin.id, termtime, termtyp.typ AS typ, termdauer, str, ort, hnr, plz, partner_id, land, $res = db_zeile($dbconn,"SELECT head, user, text, termin.id, termtime, termtyp.typ AS typ, termdauer, str, ort, hnr, plz, partner_id, land,
adresse.vname AS vname, adresse.nname AS nname, titel_id, titel2_id, anrede_id, anrede2_id, vname2, nname2, zusatz, adresse.vname AS vname, adresse.nname AS nname, titel_id, titel2_id, anrede_id, anrede2_id, vname2, nname2, zusatz,
user.vname as uservname, user.nname as usernname, user.vname as uservname, user.nname as usernname,
user2.vname as uservname2, user2.nname as usernname2, user2.vname as uservname2, user2.nname as usernname2,
@@ -1338,72 +1352,38 @@ function maketerminarray($dbconn,$id)
LEFT JOIN user AS user2 ON termin.user2 = user2.id LEFT JOIN user AS user2 ON termin.user2 = user2.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id LEFT JOIN user AS user3 ON termin.user3 = user3.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id LEFT JOIN user AS user4 ON termin.user4 = user4.id
WHERE termin.id = $id") or $err = error("Fehler beim ermitteln der Termindaten<br />".mysqli_error($dbconn)); WHERE termin.id = ?", array($id));
$res = mysqli_fetch_assoc($qry); if(!$res)
{
$qry = mysqli_query($dbconn,"SELECT anrede error("Fehler beim ermitteln der Termindaten<br />".mysqli_error($dbconn));
FROM anrede return array();
WHERE id = '".$res["anrede_id"]."'") or $err = error("Fehler beim ermitteln der Anrede<br />".mysqli_error($dbconn)); }
$res2 = mysqli_fetch_assoc($qry); $anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array();
$res["anrede"] = $res2["anrede"]; $titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array();
$res["anrede"] = $anrs[$res["anrede_id"]] ?? "";
$qry = mysqli_query($dbconn,"SELECT anrede $res["anrede2"] = $anrs[$res["anrede2_id"]] ?? "";
FROM anrede $res["titel"] = $titels[$res["titel_id"]] ?? "";
WHERE id = '".$res["anrede2_id"]."'") or $err = error("Fehler beim ermitteln der Anrede2<br />".mysqli_error($dbconn)); $res["titel2"] = $titels[$res["titel2_id"]] ?? "";
$res2 = mysqli_fetch_assoc($qry);
$res["anrede2"] = $res2["anrede"];
$qry = mysqli_query($dbconn,"SELECT titel
FROM titel
WHERE id = '".$res["titel_id"]."'") or $err = error("Fehler beim ermitteln des Titels<br />".mysqli_error($dbconn));
$res2 = mysqli_fetch_assoc($qry);
$res["titel"] = $res2["titel"];
$qry = mysqli_query($dbconn,"SELECT titel
FROM titel
WHERE id = '".$res["titel2_id"]."'") or $err = error("Fehler beim ermitteln des Titel2<br />".mysqli_error($dbconn));
$res2 = mysqli_fetch_assoc($qry);
$res["titel2"] = $res2["titel"];
return $res; return $res;
} }
function maketerminadresse($dbconn,$termid) function maketerminadresse($dbconn,$termid)
{ {
$qry=mysqli_query($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id, partner_id, adresse_id $adresse = db_zeile($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id, partner_id, adresse_id
FROM termin FROM termin
JOIN adresse ON termin.adresse_id = adresse.id JOIN adresse ON termin.adresse_id = adresse.id
JOIN strasse ON strasse.id = str_id JOIN strasse ON strasse.id = str_id
JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id
WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn)); WHERE termin.id = ?", array($termid));
if(!$adresse)
$adresse = mysqli_fetch_assoc($qry);
$qry = mysqli_query($dbconn,"SELECT * FROM anrede");
while($res=mysqli_fetch_assoc($qry))
{ {
$anrs[$res["id"]] = $res["anrede"]; error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn));
$adresse = array();
} }
// ADRFIELD_* stehen in incs/constants.php
$qry = mysqli_query($dbconn,"SELECT * FROM titel"); $anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array();
while($res=mysqli_fetch_assoc($qry)) $titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array();
{
$titels[$res["id"]] = $res["titel"];
}
define("ADRFIELD_FIRMAANR", 0);
define("ADRFIELD_FIRMA", 1);
define("ADRFIELD_ANR1", 2);
define("ADRFIELD_TITEL1", 3);
define("ADRFIELD_NAME1", 4);
define("ADRFIELD_ANR2", 5);
define("ADRFIELD_TITEL2", 6);
define("ADRFIELD_NAME2", 7);
define("ADRFIELD_STR", 8);
define("ADRFIELD_ORT", 9);
define("ADRFIELD_LAND", 10);
$adressfields = ""; $adressfields = "";
if($adresse["firma"]) if($adresse["firma"])
@@ -1788,50 +1768,52 @@ define("ADRFIELD_LAND", 10);
function maketelnrn($dbconn,$termid) function maketelnrn($dbconn,$termid)
{ {
$qry=mysqli_query($dbconn,"SELECT partner_id, adresse_id $telstr = "";
FROM termin $adresse = db_zeile($dbconn,"SELECT partner_id, adresse_id
FROM termin
JOIN adresse ON termin.adresse_id = adresse.id JOIN adresse ON termin.adresse_id = adresse.id
WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn)); WHERE termin.id = ?", array($termid));
if($adresse)
if($adresse = mysqli_fetch_assoc($qry))
{ {
$qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id WHERE partner_id='".$adresse["partner_id"]."' AND (tel.adresse_id = 0 OR tel.adresse_id = '".$adresse["adresse_id"]."') ORDER BY typ_id ASC"); $zeilen = db_zeilen($dbconn,"SELECT name, typ, tel.id, nr, ort, ortsteil, plz, vwahl FROM tel
while($res=mysqli_fetch_assoc($qry)) LEFT JOIN teltyp ON tel.typ_id = teltyp.id
{ LEFT JOIN ort ON tel.ort_id = ort.id
$telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\n"; WHERE partner_id = ? AND (tel.adresse_id = 0 OR tel.adresse_id = ?)
} ORDER BY tel.typ_id ASC", array($adresse["partner_id"], $adresse["adresse_id"]));
$qry = mysqli_query($dbconn,"SELECT kontakt,typ FROM kontakt LEFT JOIN kontakttyp ON typ_id = kontakttyp.id WHERE partner_id='".$adresse["partner_id"]."' ORDER BY typ_id ASC"); foreach((array)$zeilen as $res)
while($res=mysqli_fetch_assoc($qry)) $telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\\n";
{ $zeilen = db_zeilen($dbconn,"SELECT kontakt, typ FROM kontakt
$telstr .= trim($res["typ"]).": ".$res["kontakt"]."\n"; LEFT JOIN kontakttyp ON kontakt.typ_id = kontakttyp.id
} WHERE partner_id = ? ORDER BY kontakt.typ_id ASC", array($adresse["partner_id"]));
foreach((array)$zeilen as $res)
$telstr .= trim($res["typ"]).": ".$res["kontakt"]."\\n";
} }
return $telstr; return $telstr;
} }
function makeadrtelnrn($dbconn,$partnerid) function makeadrtelnrn($dbconn,$partnerid)
{ {
$qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id WHERE partner_id='".$partnerid."' ORDER BY typ_id ASC"); $telstr = "";
while($res=mysqli_fetch_assoc($qry)) $zeilen = db_zeilen($dbconn,"SELECT name, typ, tel.id, nr, ort, ortsteil, plz, vwahl FROM tel
{ LEFT JOIN teltyp ON tel.typ_id = teltyp.id
$telstr .= trim($res["typ"]).": "."(".$res["vwahl"].")".$res["nr"].",".$res["ort"]."(".$res["name"].")\n"; LEFT JOIN ort ON tel.ort_id = ort.id
} WHERE partner_id = ? ORDER BY tel.typ_id ASC", array($partnerid));
foreach((array)$zeilen as $res)
$telstr .= trim($res["typ"]).": "."(".$res["vwahl"].")".$res["nr"].",".$res["ort"]."(".$res["name"].")\\n";
return $telstr; return $telstr;
} }
function makegooglestring($dbconn,$termid) function makegooglestring($dbconn,$termid)
{ {
$qry=mysqli_query($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id $googlestr = "";
FROM termin $adresse = db_zeile($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id
JOIN adresse ON termin.adresse_id = adresse.id FROM termin
JOIN strasse ON strasse.id = str_id JOIN adresse ON termin.adresse_id = adresse.id
JOIN strasse ON strasse.id = str_id
JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id
WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn)); WHERE termin.id = ?", array($termid));
if($adresse)
if($adresse = mysqli_fetch_assoc($qry))
{ {
$googlestr = "http://maps.googleapis.com/maps/api/staticmap"; $googlestr = "http://maps.googleapis.com/maps/api/staticmap";
$googlestr .= "?markers=color:blue|label:A|"; $googlestr .= "?markers=color:blue|label:A|";
@@ -1852,7 +1834,7 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
else else
$picpath = "./pics/"; $picpath = "./pics/";
$pdf->SetFont('helvetica','B',6); $pdf->SetFont(PDF_SCHRIFT_SANS,'B',6);
$pdf->setY(35); $pdf->setY(35);
$pdf->setX(25); $pdf->setX(25);
@@ -1872,11 +1854,11 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
$pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L'); $pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L');
} }
$pdf->SetTextColor(0,0,0); $pdf->SetTextColor(0,0,0);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setY(40); $pdf->setY(40);
$pdf->setX(25); $pdf->setX(25);
$pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0); $pdf->MultiCell(85,0,str_replace("<br />","\n",$adresse["adresse"]),0,"L",0);
$pdf->SetFont('Times','B',10); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',10);
$tmpY = $pdf->getY(); $tmpY = $pdf->getY();
$pdf->setY(40); $pdf->setY(40);
$pdf->setX(110); $pdf->setX(110);
@@ -1885,13 +1867,13 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
$tmpY = $pdf->getY(); $tmpY = $pdf->getY();
$pdf->setY($tmpY); $pdf->setY($tmpY);
$pdf->Ln(5); $pdf->Ln(5);
$pdf->SetFont('Times','BU',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'BU',16);
$pdf->Cell(0,5,$project["name"],0,1,"C",0); $pdf->Cell(0,5,$project["name"],0,1,"C",0);
$pdf->SetFont('Times','B',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',16);
$pdf->Ln(12); $pdf->Ln(12);
//Table-re-HEAD //Table-re-HEAD
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(135,5,'Arbeit',0,0,'C'); $pdf->Cell(135,5,'Arbeit',0,0,'C');
$pdf->setX(155); $pdf->setX(155);
@@ -1906,7 +1888,7 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetDrawColor(100,100,100); $pdf->SetDrawColor(100,100,100);
//while($pdf->GetY() < 260) //while($pdf->GetY() < 260)
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$gesstd = 0; $gesstd = 0;
foreach($work as $workline) foreach($work as $workline)
{ {
@@ -1928,7 +1910,7 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
$pdf->AddPage("P"); $pdf->AddPage("P");
//Table-re-HEAD //Table-re-HEAD
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(135,5,'Arbeit',0,0,'C'); $pdf->Cell(135,5,'Arbeit',0,0,'C');
$pdf->setX(155); $pdf->setX(155);
@@ -1939,13 +1921,13 @@ function makeprojectpage($pdf,$adresse,$telnrn,$project,$work)
$pdf->Line(18 , $pdf->GetY(), 200, $pdf->GetY()); $pdf->Line(18 , $pdf->GetY(), 200, $pdf->GetY());
$pdf->Line(180 , $pdf->GetY()-5, 180, 270); $pdf->Line(180 , $pdf->GetY()-5, 180, 270);
$pdf->Line(155 , $pdf->GetY()-5, 155, 270); $pdf->Line(155 , $pdf->GetY()-5, 155, 270);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
} }
} }
$pdf->Line(18 , $pdf->GetY()+1, 200, $pdf->GetY()); $pdf->Line(18 , $pdf->GetY()+1, 200, $pdf->GetY());
$pdf->Line(18 , $pdf->GetY()+2, 200, $pdf->GetY()+1); $pdf->Line(18 , $pdf->GetY()+2, 200, $pdf->GetY()+1);
$pdf->SetY($pdf->GetY()+3); $pdf->SetY($pdf->GetY()+3);
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(135,5,'Arbeitsstunden Summe:',0,0,'C'); $pdf->Cell(135,5,'Arbeitsstunden Summe:',0,0,'C');
$pdf->setX(155); $pdf->setX(155);
@@ -1961,7 +1943,7 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
else else
$picpath = "./pics/"; $picpath = "./pics/";
$pdf->SetFont('helvetica','B',6); $pdf->SetFont(PDF_SCHRIFT_SANS,'B',6);
$pdf->setY(35); $pdf->setY(35);
$pdf->setX(25); $pdf->setX(25);
@@ -1981,11 +1963,11 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
$pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L'); $pdf->Cell(0,3,'LSG OBERALLGÄU e.V. PHILIPP WAGNER IM ENGELFELD 13 87509 IMMENSTADT TEL.: 0176/21938558',0,0,'L');
} }
$pdf->SetTextColor(0,0,0); $pdf->SetTextColor(0,0,0);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$pdf->setY(40); $pdf->setY(40);
$pdf->setX(25); $pdf->setX(25);
$pdf->MultiCell(85,0,str_replace("<br />","\n",$name),0,"L",0); $pdf->MultiCell(85,0,str_replace("<br />","\n",$name),0,"L",0);
$pdf->SetFont('Times','B',10); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',10);
$tmpY = $pdf->getY(); $tmpY = $pdf->getY();
$pdf->setY(40); $pdf->setY(40);
$pdf->setX(110); $pdf->setX(110);
@@ -1994,13 +1976,13 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
$tmpY = $pdf->getY(); $tmpY = $pdf->getY();
$pdf->setY($tmpY); $pdf->setY($tmpY);
$pdf->Ln(5); $pdf->Ln(5);
$pdf->SetFont('Times','BU',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'BU',16);
$pdf->Cell(0,5,$project["name"],0,1,"C",0); $pdf->Cell(0,5,$project["name"],0,1,"C",0);
$pdf->SetFont('Times','B',16); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',16);
$pdf->Ln(12); $pdf->Ln(12);
//Table-re-HEAD //Table-re-HEAD
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(35,5,'Kommen',0,0,'C'); $pdf->Cell(35,5,'Kommen',0,0,'C');
$pdf->setX(55); $pdf->setX(55);
@@ -2017,7 +1999,7 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetDrawColor(100,100,100); $pdf->SetDrawColor(100,100,100);
//while($pdf->GetY() < 260) //while($pdf->GetY() < 260)
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
$gesstd = 0; $gesstd = 0;
foreach($zeiten as $zeit) foreach($zeiten as $zeit)
{ {
@@ -2040,7 +2022,7 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
$pdf->AddPage("P"); $pdf->AddPage("P");
//Table-re-HEAD //Table-re-HEAD
$currY = $pdf->GetY(); $currY = $pdf->GetY();
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(35,5,'Kommen',0,0,'C'); $pdf->Cell(35,5,'Kommen',0,0,'C');
$pdf->setX(55); $pdf->setX(55);
@@ -2053,13 +2035,13 @@ function makezeitpage($pdf,$name,$daymins,$zeiten)
$pdf->Line(18 , $pdf->GetY(), 200, $pdf->GetY()); $pdf->Line(18 , $pdf->GetY(), 200, $pdf->GetY());
$pdf->Line(180 , $pdf->GetY()-5, 180, 270); $pdf->Line(180 , $pdf->GetY()-5, 180, 270);
$pdf->Line(155 , $pdf->GetY()-5, 155, 270); $pdf->Line(155 , $pdf->GetY()-5, 155, 270);
$pdf->SetFont('Times','',12); $pdf->SetFont(PDF_SCHRIFT_SERIF,'',12);
} }
} }
$pdf->Line(18 , $pdf->GetY()+1, 200, $pdf->GetY()); $pdf->Line(18 , $pdf->GetY()+1, 200, $pdf->GetY());
$pdf->Line(18 , $pdf->GetY()+2, 200, $pdf->GetY()+1); $pdf->Line(18 , $pdf->GetY()+2, 200, $pdf->GetY()+1);
$pdf->SetY($pdf->GetY()+3); $pdf->SetY($pdf->GetY()+3);
$pdf->SetFont('Times','B',14); $pdf->SetFont(PDF_SCHRIFT_SERIF,'B',14);
$pdf->setX(20); $pdf->setX(20);
$pdf->Cell(35,5,'Arbeitsstunden Summe:',0,0,'C'); $pdf->Cell(35,5,'Arbeitsstunden Summe:',0,0,'C');
$pdf->setX(55); $pdf->setX(55);
+437 -667
View File
File diff suppressed because it is too large Load Diff
+1149 -685
View File
File diff suppressed because it is too large Load Diff
+16 -18
View File
@@ -1,5 +1,6 @@
<?php <?php
include_once("constants.php"); include_once("constants.php");
require_once(__DIR__."/db.php");
function readsettings() function readsettings()
{ {
if(is_file(CONFIG_PATH.CONFIG_FILE)) if(is_file(CONFIG_PATH.CONFIG_FILE))
@@ -17,30 +18,27 @@ function readsettings()
} }
/*
* Benutzereinstellungen. Werte und ids roh übergeben - nicht escapen, das
* erledigen die Platzhalter.
*/
function getUserSetting($dbconn,$setting, $user, $default = 0) function getUserSetting($dbconn,$setting, $user, $default = 0)
{ {
$qry2 = mysqli_query($dbconn, "SELECT val FROM setting WHERE opt = '".mysqli_real_escape_string($dbconn, $setting)."' AND user_id = '".mysqli_real_escape_string($dbconn, $user)."'") or die(mysqli_error($dbconn)); $wert = db_wert($dbconn, "SELECT val FROM setting WHERE opt = ? AND user_id = ?", array($setting, $user));
if($res = mysqli_fetch_array($qry2)) if($wert === false)
$ret = $res[0]; die(mysqli_error($dbconn));
else return $wert === null ? $default : $wert;
$ret = $default;
return $ret;
} }
function updateUserSetting($dbconn,$setting, $value, $user) function updateUserSetting($dbconn,$setting, $value, $user)
{ {
$qry = mysqli_query($dbconn,"SELECT id FROM setting WHERE opt = '".mysqli_real_escape_string($dbconn, $setting)."' AND user_id = '".mysqli_real_escape_string($dbconn, $user)."'") or die(mysqli_error($dbconn)); $id = db_wert($dbconn, "SELECT id FROM setting WHERE opt = ? AND user_id = ?", array($setting, $user));
if(mysqli_num_rows($qry)) if($id === false)
{ die(mysqli_error($dbconn));
$res = mysqli_fetch_array($qry); if($id !== null)
mysqli_query($dbconn, "UPDATE setting SET val = '".mysqli_real_escape_string($dbconn, $value)."' WHERE id = ".$res[0]) or die($mysqli_error($dbconn)); db_abfrage($dbconn, "UPDATE setting SET val = ? WHERE id = ?", array($value, $id)) or die(mysqli_error($dbconn));
echo "update"; else
} db_abfrage($dbconn, "INSERT INTO setting SET val = ?, user_id = ?, opt = ?", array($value, $user, $setting)) or die(mysqli_error($dbconn));
else
{
mysqli_query($dbconn, "INSERT INTO setting SET val = '".mysqli_real_escape_string($dbconn, $value)."', user_id = '".mysqli_real_escape_string($dbconn, $user)."', opt = '".mysqli_real_escape_string($setting)."'") or die(mysqli_error($dbconn));
}
} }
+569
View File
@@ -0,0 +1,569 @@
<?php
/*
* Termine: Kalenderansicht, Terminliste, Anlegen, Ändern und Löschen.
*
* Ein Termin über mehrere Tage wird als Reihe einzelner Zeilen gespeichert,
* die alle dasselbe `main_id` tragen - die id der ersten Zeile. Der Kalender
* zeigt die Zeilen einzeln, die Liste fasst sie über `main_id` zusammen.
*
* Urlaub und Krankheit sind Termine ohne Kunden. Ihre Typ-ids stehen seit
* jeher fest im Code (auch in `incs/users.php` bei der Urlaubsberechnung und
* in `templates/addtermin.tpl`).
*/
require_once(__DIR__."/db.php");
require_once(__DIR__."/saveNchange.php");
define("TERMTYP_URLAUB", 0);
define("TERMTYP_KRANKHEIT", 5);
/* Ganztägige Termine bekommen diese Dauer; die Terminliste filtert darauf */
define("TERMIN_GANZTAG", "24:00:00");
/* Leerwerte der NOT-NULL-Spalten - der strikte Modus lehnt '' dort ab */
define("TERMIN_KEIN_DATUM", "0000-00-00 00:00:00");
define("TERMIN_KEINE_DAUER", "00:00:00");
/* Urlaub und Krankheit laufen immer über ganze Tage */
function terminIstGanztaegig($typ)
{
return $typ == TERMTYP_URLAUB || $typ == TERMTYP_KRANKHEIT;
}
/* ---------------------------------------------------------------------
* Formularwerte
* ------------------------------------------------------------------ */
/*
* Die Felder aus addtermin.tpl. `datetime_start` und `datetime_end` kommen
* in deutscher Schreibweise ("24.12.2026 um 09:30") und werden hier schon
* in das Datenbankformat gebracht.
*/
function terminFormularwerte()
{
return array(
"head" => formularText("head"),
"text" => formularText("text"),
"typ" => formularGanzzahl("typ"),
"done" => formularGanzzahl("done") ? 1 : 0,
"user" => formularGanzzahl("user"),
"user2" => formularGanzzahl("user2"),
"user3" => formularGanzzahl("user3"),
"user4" => formularGanzzahl("user4"),
"folge" => formularGanzzahl("folge") ? 1 : 0,
"folgetyp" => formularGanzzahl("folgetyp"),
"folgedays" => formularGanzzahl("folgedays"),
"start" => dispdate_to_mysql_date(formularText("datetime_start"), 0),
"ende" => dispdate_to_mysql_date(formularText("datetime_end"), 1),
);
}
/*
* Verteilt einen Termin auf Tage. Länger als zwölf Stunden oder Urlaub und
* Krankheit werden zu ganzen Tagen: Rückgabe ist
* array(erster Tag, Dauer je Tag, Anzahl Tage).
*/
function terminTageUndDauer($werte)
{
$start = $werte["start"];
$dauer = mysql_dauer($start, $werte["ende"]);
$stunden = (int)strtok($dauer, ":");
if($stunden <= 12 && !terminIstGanztaegig($werte["typ"]))
return array($start, $dauer, 1);
// ceil() rechnet mit der Stundenzahl, nicht mit dem ganzen Zeitstring
$tage = max(1, (int)ceil($stunden / 24));
if($start != TERMIN_KEIN_DATUM)
$start = substr($start, 0, 11)."00:00:00";
return array($start, TERMIN_GANZTAG, $tage);
}
/* Der $i-te Tag einer Terminreihe, ohne Datum bleibt es ohne Datum */
function terminTag($start, $i)
{
if($start == TERMIN_KEIN_DATUM)
return TERMIN_KEIN_DATUM;
return date("Y-m-d H:i:s", strtotime("+".$i." day", strtotime($start)));
}
/* ---------------------------------------------------------------------
* Überschneidungen
* ------------------------------------------------------------------ */
/*
* Sucht einen Termin, bei dem $benutzer schon zwischen $start und $ende
* eingetragen ist. $ausserMain schließt die gerade bearbeitete Reihe aus.
* Gibt die id des kollidierenden Termins zurück, sonst null (false bei
* Fehlern).
*/
function terminUeberschneidung($dbconn, $benutzer, $start, $ende, $ausserMain)
{
if(!$benutzer || $start == TERMIN_KEIN_DATUM)
return null;
$params = array(TERMIN_KEIN_DATUM, $benutzer, $benutzer, $benutzer, $benutzer);
// eine main_id von 0 gibt es nur bei Altdaten, dann darf nichts ausgenommen werden
$eigene = "";
if($ausserMain > 0)
{
$eigene = " AND main_id != ?";
$params[] = (int)$ausserMain;
}
array_push($params, $start, $start, $ende, $ende, $start, $ende);
$sql = "SELECT id FROM
(SELECT id, main_id, user, user2, user3, user4, termtime,
DATE_ADD(termtime, INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE) AS termend
FROM termin WHERE termtime != ? AND done = 0) AS belegt
WHERE (user = ? OR user2 = ? OR user3 = ? OR user4 = ?)$eigene
AND ((? >= termtime AND ? < termend)
OR (? > termtime AND ? <= termend)
OR (? <= termtime AND ? >= termend))
LIMIT 1";
return db_wert($dbconn, $sql, $params);
}
/*
* Prüft alle vier Mitarbeiter eines Termins für jeden Tag der Reihe.
* Rückgabe 0, wenn nichts kollidiert, sonst die Fehlermeldung.
*/
function pruefeUeberschneidungen($dbconn, $werte, $start, $dauer, $tage, $ausserMain)
{
foreach(range(0, $tage - 1) as $i)
{
$tagStart = terminTag($start, $i);
$tagEnde = dauer_to_date($tagStart, $dauer);
foreach(array("user", "user2", "user3", "user4") as $feld)
{
$treffer = terminUeberschneidung($dbconn, $werte[$feld], $tagStart, $tagEnde, $ausserMain);
if($treffer === false)
return error("Fehler beim überprüfen von Überlappungen:<br />".mysqli_error($dbconn));
if($treffer !== null)
return error("Dieser Mitarbeiter hat zu der Zeit bereits einen Termin, er kann nicht an zwei Orten gleichzeitig sein.");
}
}
return 0;
}
/* ---------------------------------------------------------------------
* Speichern
* ------------------------------------------------------------------ */
/*
* Der Hauptsatz der Reihe, zu der die Zeile $id gehoert. Altdaten ohne
* main_id bestehen nur aus sich selbst. null, wenn es die Zeile nicht gibt,
* false bei Fehlern.
*/
function terminHauptsatz($dbconn, $id)
{
$mainId = db_wert($dbconn, "SELECT main_id FROM termin WHERE id = ?", array($id));
if($mainId === false || $mainId === null)
return $mainId;
return (int)$mainId > 0 ? (int)$mainId : (int)$id;
}
/*
* Legt einen Folgetermin an: gleicher Kopf und dieselben Mitarbeiter, aber
* ohne Datum und mit einem Wiedervorlagedatum in $tage Tagen. Gibt dessen
* id zurück oder false.
*/
function legeFolgeterminAn($dbconn, $werte, $adressid)
{
$sql = "INSERT INTO termin SET head = ?, text = '', adresse_id = ?, typ = ?,
changetime = NOW(), datetime = NOW(), done = 0,
termtime = ?, termdauer = ?, followed_by = 0,
user = ?, user2 = ?, user3 = ?, user4 = ?, changeuser = ?,
act_date = DATE_ADD(CURDATE(), INTERVAL ? DAY)";
$params = array($werte["head"], $adressid, $werte["folgetyp"],
TERMIN_KEIN_DATUM, TERMIN_KEINE_DAUER,
$werte["user"], $werte["user2"], $werte["user3"], $werte["user4"],
$_SESSION["user"], $werte["folgedays"]);
if(!db_abfrage($dbconn, $sql, $params))
{
error("Fehler beim anlegen des Folgetermins:<br />".mysqli_error($dbconn));
return false;
}
$id = mysqli_insert_id($dbconn);
// Ein Termin ohne eigene Reihe ist sein eigener Hauptsatz
db_abfrage($dbconn, "UPDATE termin SET main_id = ? WHERE id = ?", array($id, $id));
if(saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [folgetermin, hat ID $id]",
"DELETE FROM termin WHERE id = $id", "anlegen"))
return false;
return $id;
}
/*
* Legt einen Termin an oder ändert ihn. $terminid ist die id der Reihe
* (0 = neu), $adressid die Kundenadresse (0 bei Urlaub und Krankheit).
*
* Wird aus einem eintägigen Termin ein mehrtägiger, wird die alte Reihe
* verworfen und neu angelegt - anders lässt sich die Reihe nicht umbauen.
*/
function speichereTermin($dbconn, $terminid, $adressid)
{
$werte = terminFormularwerte();
list($start, $dauer, $tage) = terminTageUndDauer($werte);
beginneSpeichern($dbconn);
$mainId = 0;
$alt = null;
if($terminid)
{
$mainId = terminHauptsatz($dbconn, $terminid);
if($mainId === false)
return beendeSpeichern($dbconn, error("Fehler beim ermitteln des Termins:<br />".mysqli_error($dbconn)));
if($mainId === null)
return beendeSpeichern($dbconn, error("Dieser Termin existiert nicht!"));
$alt = db_zeile($dbconn, "SELECT * FROM termin WHERE id = ?", array($mainId));
if($alt === false || !$alt)
return beendeSpeichern($dbconn, error("Dieser Termin existiert nicht!"));
/*
* Die Folgetage werden neu angelegt, der Hauptsatz bleibt stehen -
* so behaelt der Termin seine id, auch wenn aus einem Tag mehrere
* werden oder umgekehrt.
*/
db_abfrage($dbconn, "DELETE FROM termin WHERE main_id = ? AND id != ?", array($mainId, $mainId))
or $err = error("Konnte Nebentermine nicht löschen:<br />".mysqli_error($dbconn));
if(!empty($err))
return beendeSpeichern($dbconn, $err);
}
if(!$werte["done"])
{
$err = pruefeUeberschneidungen($dbconn, $werte, $start, $dauer, $tage, $mainId);
if($err)
return beendeSpeichern($dbconn, $err);
}
// Folgetermin nur einmal und nur, wenn der Termin gerade erledigt wird
$folgeId = $alt ? (int)$alt["followed_by"] : 0;
if($werte["done"] && $werte["folge"] && !$folgeId)
{
$folgeId = legeFolgeterminAn($dbconn, $werte, $adressid);
if($folgeId === false)
return beendeSpeichern($dbconn, 1);
}
$felder = array(
"head" => $werte["head"],
"text" => $werte["text"],
"adresse_id" => $adressid,
"typ" => $werte["typ"],
"done" => $werte["done"],
"termdauer" => $dauer,
"changeuser" => $_SESSION["user"],
"user" => $werte["user"],
"user2" => $werte["user2"],
"user3" => $werte["user3"],
"user4" => $werte["user4"],
"followed_by" => $folgeId,
);
$zuweisung = array();
foreach(array_keys($felder) as $spalte)
$zuweisung[] = "`$spalte` = ?";
$set = implode(", ", $zuweisung);
$err = 0;
// Tag 0 ist der Hauptsatz: beim Aendern bleibt er stehen, sonst entsteht er hier
if($mainId)
{
$sql = "UPDATE termin SET $set, termtime = ?, changetime = NOW() WHERE id = ?";
$params = array_merge(array_values($felder), array(terminTag($start, 0), $mainId));
if(!db_abfrage($dbconn, $sql, $params))
return beendeSpeichern($dbconn, error("Fehler beim ändern des Termins:<br />".mysqli_error($dbconn)));
$altWerte = array();
foreach(array_keys($felder) as $spalte)
$altWerte[] = $alt[$spalte];
$err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin change]",
db_sql_text($dbconn, $sql, array_merge($altWerte, array($alt["termtime"], $mainId))), "ändern");
}
else
{
$sql = "INSERT INTO termin SET $set, termtime = ?, changetime = NOW(), datetime = NOW()";
$params = array_merge(array_values($felder), array(terminTag($start, 0)));
if(!db_abfrage($dbconn, $sql, $params))
return beendeSpeichern($dbconn, error("Fehler beim anlegen des Termins:<br />".mysqli_error($dbconn)));
$mainId = mysqli_insert_id($dbconn);
db_abfrage($dbconn, "UPDATE termin SET main_id = ? WHERE id = ?", array($mainId, $mainId))
or $err = error("Fehler beim verknüpfen der Terminreihe:<br />".mysqli_error($dbconn));
if(!$err)
$err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin add, hat ID $mainId]",
"DELETE FROM termin WHERE id = $mainId", "anlegen");
}
// die weiteren Tage haengen als eigene Zeilen am Hauptsatz
// (range(1, 0) liefe rueckwaerts, deshalb eine normale Schleife)
for($i = 1; $i < $tage; $i++)
{
if($err)
break;
$sql = "INSERT INTO termin SET $set, termtime = ?, main_id = ?, changetime = NOW(), datetime = NOW()";
$params = array_merge(array_values($felder), array(terminTag($start, $i), $mainId));
if(!db_abfrage($dbconn, $sql, $params))
{
$err = error("Fehler beim anlegen des Termins:<br />".mysqli_error($dbconn));
break;
}
$id = mysqli_insert_id($dbconn);
$err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin add, hat ID $id]",
"DELETE FROM termin WHERE id = $id", "anlegen");
}
return beendeSpeichern($dbconn, $err);
}
/* Löscht eine Terminreihe samt Nebenzeilen */
function loescheTerminreihe($dbconn, $id)
{
beginneSpeichern($dbconn);
$err = 0;
$id = terminHauptsatz($dbconn, $id);
if($id === false)
return beendeSpeichern($dbconn, error("Fehler beim ermitteln des Termins:<br />".mysqli_error($dbconn)));
if($id === null)
return beendeSpeichern($dbconn, error("Dieser Termin existiert nicht!"));
$beschreibung = db_wert($dbconn, "SELECT head FROM termin WHERE id = ?", array($id));
// erst die Nebenzeilen, dann der Hauptsatz - sonst verliert main_id den Bezug
$sql = "DELETE FROM termin WHERE main_id = ? AND id != ?";
db_abfrage($dbconn, $sql, array($id, $id))
or $err = error("Konnte Nebentermine nicht löschen:<br />".mysqli_error($dbconn));
if(!$err)
{
$sql = "DELETE FROM termin WHERE id = ?";
db_abfrage($dbconn, $sql, array($id))
or $err = error("Konnte Haupttermin nicht löschen:<br />".mysqli_error($dbconn));
}
if(!$err)
$err = saveLog($dbconn, db_sql_text($dbconn, "DELETE FROM termin WHERE main_id = ?", array($id))." [$beschreibung]", "", "löschen");
return beendeSpeichern($dbconn, $err);
}
/* Markiert eine Terminreihe als erledigt ($erledigt = 1) oder offen (0) */
function setzeTerminErledigt($dbconn, $id, $erledigt)
{
$erledigt = $erledigt ? 1 : 0;
$id = terminHauptsatz($dbconn, $id);
if($id === false)
return error("Fehler beim ermitteln des Termins:<br />".mysqli_error($dbconn));
if($id === null)
return error("Dieser Termin existiert nicht!");
beginneSpeichern($dbconn);
$err = 0;
$sql = "UPDATE termin SET done = ?, changetime = NOW(), changeuser = ? WHERE main_id = ? OR id = ?";
$params = array($erledigt, $_SESSION["user"], $id, $id);
db_abfrage($dbconn, $sql, $params)
or $err = error("Konnte den Termin nicht umstellen:<br />".mysqli_error($dbconn));
if(!$err)
$err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin erledigt]", "", "ändern");
return beendeSpeichern($dbconn, $err);
}
/* ---------------------------------------------------------------------
* Lesen
* ------------------------------------------------------------------ */
/*
* Der Termin für das Formular: die Reihe zu einer Hauptsatz-id wird zu
* einem Eintrag zusammengefasst, Anfang und Gesamtdauer eingeschlossen.
*/
function terminZumBearbeiten($dbconn, $id)
{
$res = db_zeile($dbconn, "SELECT MIN(termtime) AS termtime,
SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer,
head, followed_by, MIN(id) AS id, main_id, typ, adresse_id,
done, user, user2, user3, user4, changeuser, act_date, text
FROM termin WHERE main_id = ? OR (id = ? AND main_id = 0)
GROUP BY main_id", array($id, $id));
if($res === false)
{
error("Fehler beim ermitteln des Termins:<br />".mysqli_error($dbconn));
return null;
}
if(!$res)
return null;
if($res["followed_by"] > 0)
{
$folge = db_zeile($dbconn, "SELECT DATE_FORMAT(act_date,'%Y-%m-%d') AS act_date, typ FROM termin WHERE id = ?",
array($res["followed_by"]));
if($folge)
{
$res["folgetyp"] = $folge["typ"];
$tage = (strtotime($folge["act_date"]) - strtotime(date("Y-m-d"))) / 86400;
if($tage > 0)
{
$res["folge"] = 1;
$res["folgedays"] = (int)$tage;
}
}
}
$res["termend"] = dauer_to_date($res["termtime"], $res["termdauer"]);
if(str_contains($res["termend"], "00:00:00"))
$res["termend"] = date("Y-m-d H:i:s", strtotime("-1 minutes", strtotime($res["termend"])));
return $res;
}
/* Die Auswahllisten des Terminformulars */
function terminAuswahllisten($dbconn, $smarty)
{
list($typids, $typs) = auswahlliste($dbconn, "SELECT id, typ FROM termtyp WHERE id > 0");
$smarty->assign("typids", $typids);
$smarty->assign("typs", $typs);
$benutzer = db_zeilen($dbconn, "SELECT id, vname, nname FROM user WHERE blocked = 0 AND id > 0 ORDER BY nname, vname");
$ids = array();
$namen = array();
foreach((array)$benutzer as $b)
{
$ids[] = $b["id"];
$namen[] = trim($b["vname"]." ".$b["nname"]);
}
$smarty->assign("userids", $ids);
$smarty->assign("users", $namen);
$ids[] = 0;
$namen[] = "Keiner";
$smarty->assign("optuserids", $ids);
$smarty->assign("optusers", $namen);
$smarty->assign("days", range(0, 40));
list($urlaubIds, $urlaubNamen) = auswahlliste($dbconn, "SELECT id, typ FROM termtyp WHERE typ = 'Urlaub' OR typ = 'Krankheit'");
$smarty->assign("vac_types_id", $urlaubIds);
$smarty->assign("vac_types_name", $urlaubNamen);
}
/* Die Adresse, an der ein Termin stattfindet - leer, wenn es keine gibt */
function terminAdresse($dbconn, $adressid)
{
$res = db_zeile($dbconn, "SELECT plz, ortsteil, ort, str, hnr, vname, partner_id, nname, vname2, nname2,
firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id
FROM adresse
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
WHERE adresse.id = ?", array($adressid));
if($res === false)
{
error("Fehler beim abrufen der Daten:<br />".mysqli_error($dbconn));
return array();
}
return $res ? $res : array();
}
/* ---------------------------------------------------------------------
* Kalender
* ------------------------------------------------------------------ */
/* Deutsche Wochentagsnamen - unabhängig davon, ob die Locale vorhanden ist */
function wochentag($zeitpunkt)
{
$namen = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
return $namen[(int)date("w", $zeitpunkt)];
}
/*
* Die Termine eines Tages. $ganztags trennt die ganztägigen (Dauer über
* zwölf Stunden) von den übrigen.
*/
function kalenderTermine($dbconn, $tag, $ganztags)
{
$vergleich = $ganztags ? ">" : "<";
$sql = "SELECT termin.id, termtyp.typ, termin.head, termtime, termdauer,
user, user2, user3, user4, done, partner_id, main_id,
str, ort, ortsteil, plz, hnr, adresse.vname AS vname, adresse.nname AS nname,
user.vname AS uservname, user.nname AS usernname,
user2.vname AS uservname2, user2.nname AS usernname2,
user3.vname AS uservname3, user3.nname AS usernname3,
user4.vname AS uservname4, user4.nname AS usernname4,
firma, vname2, nname2
FROM termin
LEFT JOIN termtyp ON termin.typ = termtyp.id
LEFT JOIN adresse ON termin.adresse_id = adresse.id
LEFT JOIN partner ON adresse.partner_id = partner.id
LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON strasse.ort_id = ort.id
LEFT JOIN user ON termin.user = user.id
LEFT JOIN user AS user2 ON termin.user2 = user2.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id
WHERE DATE(termtime) = ? AND termdauer $vergleich '12:00:00'
ORDER BY termtime ASC";
return db_zeilen($dbconn, $sql, array($tag)) ?: array();
}
/* Die an einem Tag gebuchten Arbeiten aus der Projektverwaltung */
function kalenderArbeiten($dbconn, $tag)
{
$sql = "SELECT work.id, project.id AS projectid, work.bezeichn AS head, work.rechn AS done,
project.name AS projectname, work.datetime AS termtime, work.std AS termdauer,
project.changeuser AS user, project.partner_id,
adresse.vname AS vname, adresse.nname AS nname, adresse.firma AS firma
FROM work
LEFT JOIN project ON work.project_id = project.id
LEFT JOIN partner ON project.partner_id = partner.id
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN user ON work.changeuser = user.id
WHERE adresse.typ_id = 1 AND DATE(work.datetime) = ?
ORDER BY work.datetime ASC";
return db_zeilen($dbconn, $sql, array($tag)) ?: array();
}
/* Wer an einem Tag gestempelt hat und ob der Tag abgeschlossen ist */
function kalenderAnwesenheit($dbconn, $tag)
{
$sql = "SELECT user.vname, user.nname, user.color,
CASE MAX(zeiten.gehen) WHEN MAX(zeiten.kommen) THEN 0 ELSE 1 END AS complete
FROM user
LEFT JOIN zeiten ON user.id = zeiten.ma_id
WHERE DATE(kommen) = ?
GROUP BY user.id ORDER BY user.nname ASC";
return db_zeilen($dbconn, $sql, array($tag)) ?: array();
}
/*
* Die acht Tage einer Kalenderseite, beginnend einen Tag vor dem
* Seitenanfang (so ist der Vortag immer sichtbar).
*/
function kalenderTage($dbconn, $seite)
{
$heute = strtotime("today");
$tage = array();
for($i = $seite * 8 - 1; $i < $seite * 8 + 7; $i++)
{
$zeitpunkt = strtotime("+".$i." day", $heute);
$datum = date("Y-m-d", $zeitpunkt);
$feiertag = feiertag_bayern((int)date("d", $zeitpunkt), (int)date("m", $zeitpunkt), (int)date("Y", $zeitpunkt));
$termine = array();
if(($_SESSION["firma"] ?? "") == "Ingenieurbüro Wagner")
$termine = kalenderArbeiten($dbconn, $datum);
$termine = array_merge($termine, kalenderTermine($dbconn, $datum, false));
$tage[] = array(
// am Feiertag steht der Name des Feiertags statt des Wochentags
"weekday" => ($feiertag ? date("d.m.Y", $zeitpunkt)."<br/>" : wochentag($zeitpunkt)."<br/>".date("d.m.Y", $zeitpunkt)),
"date" => date("Ymd", $zeitpunkt),
"termine" => $termine,
"fulldaytermine" => kalenderTermine($dbconn, $datum, true),
"numfulldaytermine" => 0,
"ma_check" => kalenderAnwesenheit($dbconn, $datum),
"feiertag" => $feiertag ? $feiertag : "",
);
}
return $tage;
}
/* Die Mitarbeiter der Kalenderspalte samt Resturlaub */
function kalenderBenutzer($dbconn)
{
$users = array();
$zeilen = db_zeilen($dbconn, "SELECT id, vname, nname, color FROM user WHERE blocked = 0 AND nick != 'ALL'");
foreach((array)$zeilen as $res)
{
$res["openvacation"] = urlaub_remaining($dbconn, $res["id"]);
$users[$res["id"]] = $res;
}
return $users;
}
?>
+1 -1
View File
@@ -1,4 +1,4 @@
<?php <?php
function generateSalt() { function generateSalt() {
+2 -4
View File
@@ -56,10 +56,8 @@ else if($action == "setup")
if($settings == "valid" && $action != "setup") if($settings == "valid" && $action != "setup")
{ {
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw)) if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
$err = error("Verbindung zur Datenbank fehlgeschlagen!!"); $err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
if(!@mysqli_select_db($dbconn,$mysql_db))
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
$newversion = checknewversion($version); $newversion = checknewversion($version);
$status = manageupdate($version, $newversion); $status = manageupdate($version, $newversion);
$version = $status[1]; $version = $status[1];
+17 -15
View File
@@ -7,8 +7,8 @@ function ajax_searchkunden(page)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("kdnsrc_field").value); field = encodeURIComponent(document.getElementById("kdnsrc_field").value);
search = escape(document.getElementById("kdnsrc_src").value); search = encodeURIComponent(document.getElementById("kdnsrc_src").value);
var url = "ajax/searchkunden.php?field=" + field + "&page=" + page + "&search=" + search; var url = "ajax/searchkunden.php?field=" + field + "&page=" + page + "&search=" + search;
reqkdnsrc = new XMLHttpRequest(); reqkdnsrc = new XMLHttpRequest();
@@ -35,7 +35,7 @@ function ajax_searchzeit(page,user)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("termcontainer-"+user).innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("termcontainer-"+user).innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("zeit_src-"+user).value); search = encodeURIComponent(document.getElementById("zeit_src-"+user).value);
var url = "ajax/searchzeit.php?page=" + page + "&user=" + user + "&search=" + search; var url = "ajax/searchzeit.php?page=" + page + "&user=" + user + "&search=" + search;
reqkdnsrc = new XMLHttpRequest(); reqkdnsrc = new XMLHttpRequest();
@@ -55,15 +55,17 @@ function ajax_searchzeit(page,user)
} }
} }
function ajax_searchadress(rechid,subact,page) // page zuerst, damit die Seitenschaltung (displayPages) die Nummer
// als erstes Argument uebergeben kann - wie bei den anderen Suchen
function ajax_searchadress(page,rechid,subact)
{ {
if(!search_in_progress) if(!search_in_progress)
{ {
search_in_progress = 1; search_in_progress = 1;
document.getElementById("adrsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("adrsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("adrsrc_field").value); field = encodeURIComponent(document.getElementById("adrsrc_field").value);
search = escape(document.getElementById("adrsrc_src").value); search = encodeURIComponent(document.getElementById("adrsrc_src").value);
var url = "ajax/searchadress.php?field=" + field + "&page=" + page + "&search=" + search + "&rechid=" + rechid + "&subact=" + subact; var url = "ajax/searchadress.php?field=" + field + "&page=" + page + "&search=" + search + "&rechid=" + rechid + "&subact=" + subact;
reqadrsrc = new XMLHttpRequest(); reqadrsrc = new XMLHttpRequest();
@@ -90,8 +92,8 @@ function ajax_searchliefer(page)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("kdnsrc_field").value); field = encodeURIComponent(document.getElementById("kdnsrc_field").value);
search = escape(document.getElementById("kdnsrc_src").value); search = encodeURIComponent(document.getElementById("kdnsrc_src").value);
var url = "ajax/searchliefer.php?field=" + field + "&page=" + page + "&search=" + search; var url = "ajax/searchliefer.php?field=" + field + "&page=" + page + "&search=" + search;
reqkdnsrc = new XMLHttpRequest(); reqkdnsrc = new XMLHttpRequest();
@@ -118,7 +120,7 @@ function ajax_searchkdnprojects(page,kdnid)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("projectlist").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("projectlist").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("src_project").value); search = encodeURIComponent(document.getElementById("src_project").value);
var url = "ajax/searchkdnprojects.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid; var url = "ajax/searchkdnprojects.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid;
@@ -146,7 +148,7 @@ function ajax_searchkdnrech(page,skspage,typ,kdnid)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("rechlist-"+typ).innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("rechlist-"+typ).innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("src_rech-"+typ).value); search = encodeURIComponent(document.getElementById("src_rech-"+typ).value);
var url = "ajax/searchkdnrech.php?page=" + page + "&skspage=" + skspage + "&search=" + search+"&typ=" + typ + "&kdnid=" + kdnid; var url = "ajax/searchkdnrech.php?page=" + page + "&skspage=" + skspage + "&search=" + search+"&typ=" + typ + "&kdnid=" + kdnid;
@@ -173,7 +175,7 @@ function ajax_searchkomm(page,kdnid)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("kommsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("kommsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("kommsrc_src").value); search = encodeURIComponent(document.getElementById("kommsrc_src").value);
var url = "ajax/searchkomm.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid; var url = "ajax/searchkomm.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid;
@@ -181,7 +183,7 @@ function ajax_searchkomm(page,kdnid)
reqkommsrc.open("GET", url, true); reqkommsrc.open("GET", url, true);
reqkommsrc.onreadystatechange = function() reqkommsrc.onreadystatechange = function()
{ {
if(reqkdnsrc.readyState == 4) if(reqkommsrc.readyState == 4)
{ {
// Get the data from the server's response // Get the data from the server's response
document.getElementById("kommsrc_list").innerHTML = reqkommsrc.responseText; document.getElementById("kommsrc_list").innerHTML = reqkommsrc.responseText;
@@ -200,7 +202,7 @@ function ajax_searchrech(page,skspage)
search_in_progress = 1; search_in_progress = 1;
document.getElementById("rechlist").innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("rechlist").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true; //document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("src_rech").value); search = encodeURIComponent(document.getElementById("src_rech").value);
var url = "ajax/searchrech.php?page=" + page + "&skspage=" + skspage + "&search=" + search; var url = "ajax/searchrech.php?page=" + page + "&skspage=" + skspage + "&search=" + search;
@@ -226,7 +228,7 @@ function ajax_searchterm(page, termtyp)
{ {
search_in_progress = 1; search_in_progress = 1;
document.getElementById("termcontainer-"+termtyp).innerHTML = "<p><img src='pics/progress_white.gif' /></p>"; document.getElementById("termcontainer-"+termtyp).innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
search = escape(document.getElementById("term_src-"+termtyp).value); search = encodeURIComponent(document.getElementById("term_src-"+termtyp).value);
var url = "ajax/searchterm.php?page=" + page + "&search=" + search + "&termtyp=" + termtyp; var url = "ajax/searchterm.php?page=" + page + "&search=" + search + "&termtyp=" + termtyp;
@@ -276,7 +278,7 @@ function ajax_displaymsgs(page,user)
} }
function sendmsg(touser) function sendmsg(touser)
{ {
msg = escape(document.getElementById("message-"+touser).value); msg = encodeURIComponent(document.getElementById("message-"+touser).value);
var url = "ajax/sendmsg.php?touser="+touser+"&msg="+msg; var url = "ajax/sendmsg.php?touser="+touser+"&msg="+msg;
reqsndmsgs = new XMLHttpRequest(); reqsndmsgs = new XMLHttpRequest();
reqsndmsgs.open("GET", url, true); reqsndmsgs.open("GET", url, true);
+4 -56
View File
@@ -1,59 +1,7 @@
<?php <?php
require_once "incs/saveNchange.php"; require_once "incs/saveNchange.php";
// loeschePartner() räumt die Dokumente des Kunden über delRechnung() mit ab
require_once "incs/rechnung.php"; require_once "incs/rechnung.php";
if($_GET["del"] == 1) $err = partnerAddSeite($dbconn, $smarty, 1);
{ ?>
$kundeid=mysql_escape_string($_GET["kundeid"]);
$qry=mysqli_query($dbconn,"SELECT partner.id, vname, nname, firma FROM partner JOIN adresse ON adresse.partner_id = partner.id WHERE partner_id = '$kundeid' AND adresse.typ_id = 1 AND partner.typ_id = 1") or $err=error("Fehler beim ermitteln der Kundendaten für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$kundeid=$res[0];
$vname=$res[1];
$nname=$res[2];
$firma=$res[3];
$qry=mysqli_query($dbconn,"SELECT id, rechnr FROM rechnung WHERE partner_id = '$kundeid'") or $err=error("Fehler beim ermitteln verknüpfter Rechnungen:<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_array($qry))
{
$qry2=mysqli_query($dbconn,"DELETE FROM artikel_rechn WHERE rech_id = '$res[0]'") or $err=error("Fehler beim löschen verknüpfter Artikel:<br />".mysqli_error($dbconn));
$qry2=mysqli_query($dbconn,"DELETE FROM artikelsks WHERE rechnr = '$res[1]'") or $err=error("Fehler beim löschen verknüpfter SKS Artikel:<br />".mysqli_error($dbconn));
}
$qry=mysqli_query($dbconn,"SELECT id FROM rechnung WHERE partner_id = '$kundeid'") or $err=error("Fehler beim ermitteln verknüpfter Rechnungen:<br />".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$err = delRechnung($dbconn,$res["id"]);
}
$qry=mysqli_query($dbconn,"DELETE FROM adresse WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Adressen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM tel WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Telefonnummern:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM kontakt WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Kontaktadressen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM notiz WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Notizen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM konto WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Konten:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM partner WHERE id = '$kundeid'") or $err=error("Fehler beim löschen des Kunden:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM partner WHERE id = $kundeid [$vname $nname - $firma]",
"",
"löschen");
if(!$err)
{
$qry=mysqli_query($dbconn,"UPDATE partner SET updated_by = 0 WHERE updated_by = '$kundeid'") or $err=error("Fehler beim unlinken einer eventuellen aktualisierung:<br />".mysqli_error($dbconn));
}
if(!$err)
{
doneNreturn("Erfolgreich gelöscht!");
}
}
}
elseif($_GET["formsent"] == 1)
{
$ret = savePart($dbconn,1);
$_SESSION["camefrom"] = "kundenshow&id=".$ret[1];
if(!$ret[0])
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispPartForm($dbconn,$smarty);
}
?>
+6 -206
View File
@@ -1,207 +1,7 @@
<?php <?php
require_once "incs/saveNchange.php"; require_once "incs/saveNchange.php";
if($_GET["do"] == "adress") // Beim Löschen einer Adresse verschwinden auch ihre Dokumente (delRechnung)
{ require_once "incs/rechnung.php";
if($_GET["del"] == 1)
{ $err = partnerChangeSeite($dbconn, $smarty, 1);
$adressid=mysql_escape_string($_GET["adressid"]); ?>
$qry=mysqli_query($dbconn,"SELECT vname, nname, firma, typ, partner.id FROM adresse
JOIN adresstyp ON adresstyp.id = adresse.typ_id
JOIN partner ON partner.id = adresse.partner_id
WHERE adresse.id = '$adressid' AND partner.typ_id = 1") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$vname = $res[0];
$nname = $res[1];
$firma = $res[2];
$typ = $res[3];
$kdnr = $res[4];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM adresse WHERE id = '$adressid'") or $err=error("Fehler beim löschen der Adresse:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM adresse WHERE id = $adressid [$typ von Kunde $kdnr ($vname $nname - $firma)]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
if(!$err)
{
$qry=mysqli_query($dbconn,"SELECT * FROM tel WHERE adresse_id = '$adressid'");
while($res = mysqli_fetch_assoc($dbconn,$qry))
{
mysqli_query($dbconn,"DELETE FROM tel WHERE id='".$res["id"]."'") or $err = error("Fehler beim löschen der zugehörigen Telefonnummern<br />".mysqli_error($dbconn));#
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM tel WHERE id = ".$res["$id"]." [$typ von Kunde $kdnr ($vname $nname - $firma)]","","löschen");
}
}
}
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
else
{
$err = error("Ungültiger Kunde!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveAdress($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispAdressForm($dbconn,$smarty,1);
}
}
elseif($_GET["do"] == "tel")
{
if($_GET["del"] == 1)
{
$telid=mysql_escape_string($_GET["telid"]);
$qry=mysqli_query($dbconn,"SELECT typ, partner.id FROM tel
JOIN teltyp ON teltyp.id = tel.typ_id
JOIN partner ON partner.id = tel.partner_id
WHERE adresse.id = '$adressid' AND partner.typ_id = 1") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($dbconn,$qry);
$typ = $res[0];
$kdnr = $res[1];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM tel WHERE id = '$telid'") or $err=error("Fehler beim löschen der Telefonnummer:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM tel WHERE id = $telid [$typ von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Kunde!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveTel($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispTelForm($dbconn,$smarty,1);
}
}
elseif($_GET["do"] == "kontakt")
{
if($_GET["del"] == 1)
{
$kontaktid=mysql_escape_string($_GET["kontaktid"]);
$qry=mysqli_query($dbconn,"SELECT typ, partner.id FROM kontakt
JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id
JOIN partner ON partner.id = kontakt.partner_id
WHERE kontakt.id = '$kontaktid'") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$typ = $res[0];
$kdnr = $res[1];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM kontakt WHERE id = '$kontaktid'") or $err=error("Fehler beim löschen der Kontaktinformation:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM kontakt WHERE id = $kontaktid [$typ von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Kunde!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveKontakt($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispKontaktForm($dbconn,$smarty,1);
}
}
elseif($_GET["do"] == "notiz")
{
if($_GET["del"] == 1)
{
$notizid=mysql_escape_string($_GET["notizid"]);
$qry=mysqli_query($dbconn,"SELECT partner_id FROM notiz
JOIN partner ON partner.id = notiz.partner_id
WHERE notiz.id = '$notizid' AND partner.typ_id = 1") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$kdnr = $res[0];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM notiz WHERE id = '$notizid'") or $err=error("Fehler beim löschen der Notiz:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM notiz WHERE id = $notizid [von Kunde $kdnr]","","löschen");
del_files("./".UPLOADS_PATH."notes/","!^".$notizid."\.(.)+$!");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Kunde!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveNotiz($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispNotizForm($dbconn,$smarty,1);
}
}
elseif($_GET["do"] == "konto")
{
if($_GET["del"] == 1)
{
$kontoid = mysql_escape_string($_GET["kontoid"]);
$qry = mysqli_query($dbconn,"SELECT konto.partner_id FROM konto
JOIN partner ON partner.id = konto.partner_id
WHERE konto.id = '$kontoid' AND partner.typ_id = 1") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res = mysqli_fetch_array($qry);
$kdnr = $res[0];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM konto WHERE id = '$kontoid'") or $err=error("Fehler beim löschen des Kontos:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM konto WHERE id = $kontoid [von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Kunde!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveKonto($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispKontoForm($dbconn,$smarty,2);
}
}
?>
+6 -120
View File
@@ -1,121 +1,7 @@
<?php <?php
if($_GET["id"]) require_once "incs/saveNchange.php";
{
$qry = mysqli_query($dbconn,"SELECT * FROM partner WHERE id='".mysql_escape_string($_GET["id"])."' AND typ_id = 1"); partnerShowDaten($dbconn, $smarty, parameterGanzzahl("id"), 1);
$kdnres=mysqli_fetch_assoc($qry); $_SESSION["camefrom"] = "kundenshow&id=".parameterGanzzahl("id");
$smarty->assign("kunde",$kdnres);
if($kdnres["id"])
{
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$kdnres["id"]."'");
while($res=mysqli_fetch_assoc($qry))
{
$oldrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$res["id"]."'");
}
$smarty->assign("oldrecords",$oldrecords);
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$kdnres["updated_by"]."'");
while($res=mysqli_fetch_assoc($qry))
{
$newrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$res["updated_by"]."'");
}
$smarty->assign("newrecords",$newrecords);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM anrede");
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["anrede"];
}
$smarty->assign("anr",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM titel");
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["titel"];
}
$smarty->assign("titel",$tmp);
$qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl, ort.id AS ort_id FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id WHERE partner_id='".mysql_escape_string($_GET["id"])."' AND tel.adresse_id = 0 ORDER BY typ_id ASC");
while($res=mysqli_fetch_assoc($qry))
{
$tels[] = $res;
}
$smarty->assign("telnrn",$tels);
$qry = mysqli_query($dbconn,"SELECT kontakt.id, kontakt, partner_id, typ FROM kontakt LEFT JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id WHERE partner_id='".mysql_escape_string($_GET["id"])."' ORDER BY typ_id ASC");
while($res=mysqli_fetch_assoc($qry))
{
$contacts[] = $res;
}
$smarty->assign("contacts",$contacts);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT ktonr,iban,swift,blz,bank,partner_id,konto.id,inhaber
FROM konto JOIN bank ON konto.bank_id = bank.id WHERE partner_id='".mysql_escape_string($_GET["id"])."'")
or $err=error("Fehler beim auslesen der Konten:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("kontos",$tmp);
$qry = mysqli_query($dbconn,"SELECT * FROM notiz WHERE partner_id='".mysql_escape_string($_GET["id"])."'");
while($res=mysqli_fetch_assoc($qry))
{
$res["file"] = search_file("./".UPLOADS_PATH."notes/","!^".$res["id"]."\.(.)+$!");
$notes[] = $res;
}
$qry = mysqli_query($dbconn,"SELECT COUNT(rechnr) AS nr_mahn, NOW() AS datetime FROM rechnung WHERE typ_id = 6 AND partner_id = '".mysql_escape_string($_GET["id"])."'") or $err=error("Fehler beim Auslesen der Daten:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_assoc($qry);
if($res["nr_mahn"] > 0)
{
$mahn["notiz"] = "ACHTUNG! Es sind bereits ".$res["nr_mahn"]." Mahnungen für diesen Kunden vorhanden!!";
$mahn["color"] = "#f76";
$mahn["datetime"] = $res["datetime"];
$notes[] = $mahn;
}
$smarty->assign("notes",$notes);
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, tel.nr, ort.vwahl, ort, str, DATE_FORMAT(gebdat,'%d.%m.%Y') AS gebdat, DATE_FORMAT(gebdat2,'%d.%m.%Y') AS gebdat2, hnr, vname, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id, adresstyp.typ, adresse.typ_id
FROM adresse JOIN
adresstyp ON adresstyp.id = adresse.typ_id
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
LEFT JOIN tel ON tel.adresse_id = adresse.id
WHERE adresse.partner_id='".mysql_escape_string($_GET["id"])."' AND adresse.typ_id != 5
ORDER BY typ_id ASC")or $err=error("Mysql-Fehler:<br />".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$adressen[] = $res;
}
$smarty->assign("adressen",$adressen);
$qry = mysqli_query($dbconn,"SELECT id
FROM adresse WHERE adresse.partner_id='".mysql_escape_string($_GET["id"])."' AND adresse.typ_id = 5
ORDER BY typ_id ASC")or $err=error("Mysql-Fehler:<br />".mysqli_error($dbconn));
if(mysqli_fetch_array($qry))
$smarty->assign("kommadressen",1);
$tmp=array();
$qry = mysqli_query($dbconn,"SELECT typ, id FROM rechtyp");
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("rechtypen",$tmp);
}
}
$_SESSION["camefrom"] ="kundenshow&id=".$_GET["id"];
$smarty->display("kundenshow.tpl"); $smarty->display("kundenshow.tpl");
?> ?>
+5 -55
View File
@@ -1,57 +1,7 @@
<?php <?php
require_once "incs/saveNchange.php"; require_once "incs/saveNchange.php";
// loeschePartner() räumt die Dokumente des Lieferanten über delRechnung() mit ab
require_once "incs/rechnung.php";
if($_GET["del"] == 1) $err = partnerAddSeite($dbconn, $smarty, 2);
{ ?>
$kundeid=mysql_escape_string($_GET["kundeid"]);
$qry=mysqli_query($dbconn,"SELECT partner.id, vname, nname, firma FROM partner JOIN adresse ON adresse.partner_id = partner.id WHERE partner_id = '$kundeid' AND adresse.typ_id = 1 AND partner.typ_id = 2") or $err=error("Fehler beim ermitteln der Kundendaten für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$kundeid=$res[0];
$vname=$res[1];
$nname=$res[2];
$firma=$res[3];
if($kundeid)
{
$qry=mysqli_query($dbconn,"SELECT id, rechnr FROM rechnung WHERE partner_id = '$kundeid'") or $err=error("Fehler beim ermitteln verknüpfter Rechnungen:<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_array($qry))
{
$qry2=mysqli_query($dbconn,"DELETE FROM artikel_rechn WHERE rech_id = '$res[0]'") or $err=error("Fehler beim löschen verknüpfter Artikel:<br />".mysqli_error($dbconn));
$qry2=mysqli_query($dbconn,"DELETE FROM artikelsks WHERE rechnr = '$res[1]'") or $err=error("Fehler beim löschen verknüpfter SKS Artikel:<br />".mysqli_error($dbconn));
}
$qry=mysqli_query($dbconn,"DELETE FROM rechnung WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Rechnungen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM adresse WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Adressen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM tel WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Telefonnummern:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM kontakt WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Kontaktadressen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM notiz WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Notizen:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM konto WHERE partner_id = '$kundeid'") or $err=error("Fehler beim Löschen verknüpfter Konten:<br />".mysqli_error($dbconn));
$qry=mysqli_query($dbconn,"DELETE FROM partner WHERE id = '$kundeid'") or $err=error("Fehler beim löschen des Kunden:<br />".mysqli_error($dbconn));
}
else
{
$err = error("Ungültiger Lieferant!");
}
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM partner WHERE id = $kundeid [$vname $nname - $firma]",
"",
"löschen");
echo "sadlk";
if(!$err)
{
doneNreturn("Erfolgreich gelöscht!");
}
}
}
elseif($_GET["formsent"] == 1)
{
$ret = savePart($dbconn,2);
$_SESSION["camefrom"] = "liefershow&id=".$ret[1];
if(!$ret[0])
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispPartForm($dbconn,$smarty,2);
}
?>
+6 -190
View File
@@ -1,191 +1,7 @@
<?php <?php
require_once "incs/saveNchange.php"; require_once "incs/saveNchange.php";
if($_GET["do"] == "adress") // Beim Löschen einer Adresse verschwinden auch ihre Dokumente (delRechnung)
{ require_once "incs/rechnung.php";
if($_GET["del"] == 1)
{ $err = partnerChangeSeite($dbconn, $smarty, 2);
$adressid=mysql_escape_string($_GET["adressid"]); ?>
$qry=mysqli_query($dbconn,"SELECT vname, nname, firma, typ, partner.id FROM adresse
JOIN adresstyp ON adresstyp.id = adresse.typ_id
JOIN partner ON partner.id = adresse.partner_id
WHERE adresse.id = '$adressid' AND partner.typ_id = 2") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$vname = $res[0];
$nname = $res[1];
$firma = $res[2];
$typ = $res[3];
$kdnr = $res[4];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM adresse WHERE id = '$adressid'") or $err=error("Fehler beim löschen der Adresse:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM adresse WHERE id = $adressid [$typ von Kunde $kdnr ($vname $nname - $firma)]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Lieferant!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveAdress($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispAdressForm($dbconn,$smarty,2);
}
}
elseif($_GET["do"] == "tel")
{
if($_GET["del"] == 1)
{
$telid=mysql_escape_string($_GET["telid"]);
$qry=mysqli_query($dbconn,"SELECT typ, partner.id FROM tel
JOIN teltyp ON teltyp.id = tel.typ_id
JOIN partner ON partner.id = tel.partner_id
WHERE adresse.id = '$adressid' AND partner.typ_id = 2") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$typ = $res[0];
$kdnr = $res[1];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM tel WHERE id = '$telid'") or $err=error("Fehler beim löschen der Telefonnummer:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM tel WHERE id = $telid [$typ von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Lieferant!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveTel($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispTelForm($dbconn,$smarty,2);
}
}
elseif($_GET["do"] == "kontakt")
{
if($_GET["del"] == 1)
{
$kontaktid=mysql_escape_string($_GET["kontaktid"]);
$qry=mysqli_query($dbconn,"SELECT konatkttyp.typ, partner.id FROM kontakt
JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id
JOIN partner ON partner.id = kontakt.partner_id WHERE kontakt.id = '$kontaktid' partner.typ_id = 2") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$typ = $res[0];
$kdnr = $res[1];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM kontakt WHERE id = '$kontaktid'") or $err=error("Fehler beim löschen der Kontaktinformation:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM kontakt WHERE id = $kontaktid [$typ von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Lieferant!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveKontakt($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispKontaktForm($dbconn,$smarty,2);
}
}
elseif($_GET["do"] == "notiz")
{
if($_GET["del"] == 1)
{
$notizid=mysql_escape_string($_GET["notizid"]);
$qry=mysqli_query($dbconn,"SELECT partner_id FROM notiz
JOIN partner ON partner.id = notiz.partner_id
WHERE notiz.id = '$notizid' AND partner.typ_id = 2") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$kdnr = $res[0];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM notiz WHERE id = '$notizid'") or $err=error("Fehler beim löschen der Notiz:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM notiz WHERE id = $notizid [von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Lieferant!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveNotiz($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispNotizForm($dbconn,$smarty,2);
}
}
elseif($_GET["do"] == "konto")
{
if($_GET["del"] == 1)
{
$kontoid = mysql_escape_string($_GET["kontoid"]);
$qry = mysqli_query($dbconn,"SELECT konto.partner_id FROM konto
JOIN partner ON partner.id = konto.partner_id
WHERE konto.id = '$kontoid' AND partner.typ_id = 2") or $err=error("Fehler beim abrufen der Informationen für die LOG:<br />".mysqli_error($dbconn));
$res = mysqli_fetch_array($qry);
$kdnr = $res[0];
if($kdnr)
{
$qry=mysqli_query($dbconn,"DELETE FROM konto WHERE id = '$kontoid'") or $err=error("Fehler beim löschen des Kontos:<br />".mysqli_error($dbconn));
if(!$err)
{
$err = saveLog($dbconn,"DELETE FROM konto WHERE id = $kontoid [von Kunde $kdnr]","","löschen");
if(!$err)
doneNreturn("Erfolgreich gelöscht!");
}
}
else
{
$err = error("Ungültiger Lieferant!");
}
}
elseif($_GET["formsent"] == 1)
{
$err = saveKonto($dbconn);
if(!$err)
doneNreturn("Erfolgreich erledigt!");
}
else
{
dispKontoForm($dbconn,$smarty,2);
}
}
?>
+5 -118
View File
@@ -1,120 +1,7 @@
<?php <?php
if($_GET["id"]) require_once "incs/saveNchange.php";
{
$qry = mysqli_query($dbconn,"SELECT * FROM partner WHERE id='".mysql_escape_string($_GET["id"])."' AND typ_id = 2")
or $err=error("Fehler beim auslesen des Zulieferers:<br />". mysqli_error($dbconn));
$kdnres=mysqli_fetch_assoc($qry);
$smarty->assign("kunde",$kdnres);
if($kdnres.id)
{
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$kdnres["id"]."'")
or $err=error("Fehler beim auslesen der neueren Versionen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$oldrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$res["id"]."'")
or $err=error("Fehler beim auslesen der neueren Versionen:<br />". mysqli_error($dbconn));
}
$smarty->assign("oldrecords",$oldrecords);
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$kdnres["updated_by"]."'")
or $err=error("Fehler beim auslesen der älteren Versionen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$newrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$res["updated_by"]."'")
or $err=error("Fehler beim auslesen der älteren Versionen:<br />". mysqli_error($dbconn));
}
$smarty->assign("newrecords",$newrecords);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM anrede")
or $err=error("Fehler beim auslesen der Anreden:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["anrede"];
}
$smarty->assign("anr",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM titel")
or $err=error("Fehler beim auslesen der Titel:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["titel"];
}
$smarty->assign("titel",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl
FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id
WHERE partner_id='".mysql_escape_string($_GET["id"])."' ORDER BY typ_id ASC")
or $err=error("Fehler beim auslesen der Telefonnummern:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("telnrn",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT kontakt.id, kontakt, partner_id, typ
FROM kontakt LEFT JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id
WHERE partner_id='".mysql_escape_string($_GET["id"])."' ORDER BY typ_id ASC")
or $err=error("Fehler beim auslesen der Kontakte:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("contacts",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM notiz WHERE partner_id='".mysql_escape_string($_GET["id"])."'")
or $err=error("Fehler beim auslesen der Notizen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("notes",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT ktonr,iban,swift,blz,bank,partner_id,konto.id,inhaber
FROM konto JOIN bank ON konto.bank_id = bank.id WHERE partner_id='".mysql_escape_string($_GET["id"])."'")
or $err=error("Fehler beim auslesen der Konten:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("kontos",$tmp);
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, hnr, vname, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, adresstyp.typ, adresse.typ_id
FROM adresse JOIN
adresstyp ON adresstyp.id = adresse.typ_id
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
WHERE partner_id='".mysql_escape_string($_GET["id"])."'
ORDER BY typ_id ASC") or $err=error("Fehler beim auslesen der Adressen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$adressen[] = $res;
}
$smarty->assign("adressen",$adressen);
$tmp=array();
$qry = mysqli_query($dbconn,"SELECT typ, id FROM rechtyp");
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("rechtypen",$tmp);
$_SESSION["camefrom"] ="liefershow&id=".$_GET["id"];
}
}
partnerShowDaten($dbconn, $smarty, parameterGanzzahl("id"), 2);
$_SESSION["camefrom"] = "liefershow&id=".parameterGanzzahl("id");
$smarty->display("liefershow.tpl"); $smarty->display("liefershow.tpl");
?> ?>
+49 -138
View File
@@ -17,7 +17,7 @@ elseif($_GET["changeadr"] == 1 && $_GET["id"])
if(!$_GET["adrid"]) if(!$_GET["adrid"])
{ {
$smarty->assign("felder",array("all"=>"Name, Adresse, Kd.Nr.","kdnr"=>"Kundennummer","name"=>"Name und Firma","str"=>"Straße","plz"=>"PLZ","ort"=>"Ort","tel"=>"Tel","kont"=>"Kontakt")); $smarty->assign("felder",array("all"=>"Name, Adresse, Kd.Nr.","kdnr"=>"Kundennummer","name"=>"Name und Firma","str"=>"Straße","plz"=>"PLZ","ort"=>"Ort","tel"=>"Tel","kont"=>"Kontakt"));
$smarty->assign("rechid",$_GET["id"]); $smarty->assign("rechid",(int)$_GET["id"]);
$smarty->display("changeadr.tpl"); $smarty->display("changeadr.tpl");
} }
else else
@@ -32,7 +32,7 @@ elseif($_GET["copy"] == 1 && $_GET["id"])
if(!$_GET["adrid"]) if(!$_GET["adrid"])
{ {
$smarty->assign("felder",array("all"=>"Name, Adresse, Kd.Nr.","kdnr"=>"Kundennummer","name"=>"Name und Firma","str"=>"Straße","plz"=>"PLZ","ort"=>"Ort","tel"=>"Tel","kont"=>"Kontakt")); $smarty->assign("felder",array("all"=>"Name, Adresse, Kd.Nr.","kdnr"=>"Kundennummer","name"=>"Name und Firma","str"=>"Straße","plz"=>"PLZ","ort"=>"Ort","tel"=>"Tel","kont"=>"Kontakt"));
$smarty->assign("rechid",$_GET["id"]); $smarty->assign("rechid",(int)$_GET["id"]);
$smarty->display("copyrech.tpl"); $smarty->display("copyrech.tpl");
} }
else else
@@ -42,58 +42,25 @@ elseif($_GET["copy"] == 1 && $_GET["id"])
doneNreturn("Erfolgreich geändert"); doneNreturn("Erfolgreich geändert");
} }
} }
elseif($_GET["storno"] == "YES" && $_GET["id"]){ elseif(($_GET["storno"] == "YES" || $_GET["storno"] == "NO") && $_GET["id"]){
$querystr = "UPDATE rechnung SET $err = stornoRechnung($dbconn, $_GET["id"], $_GET["storno"] == "YES");
storno = 1, stornodate = NOW() WHERE id = '".$_GET["id"]."'"; if(!$err)
mysqli_query($dbconn,$querystr) or $err=error("Fehler beim aktualisieren der Rechnung<br />".mysqli_error($dbconn)); doneNreturn("Erfolgreich geändert");
doneNreturn("Erfolgreich geändert");
}
elseif($_GET["storno"] == "NO" && $_GET["id"]){
$querystr = "UPDATE rechnung SET
storno = 0 WHERE id = '".$_GET["id"]."'";
mysqli_query($dbconn,$querystr) or $err=error("Fehler beim aktualisieren der Rechnung<br />".mysqli_error($dbconn));
doneNreturn("Erfolgreich geändert");
} }
elseif($_GET["mail"] == 1 && $_GET["id"]) elseif($_GET["mail"] == 1 && $_GET["id"])
{ {
$kdnres=makeadressarray($dbconn, $_GET["adressid"]); $kdnres=makeadressarray($dbconn, $_GET["adressid"]);
$typnames=array(); list($anrs, $titels) = anredenUndTitel($dbconn);
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede"); $smarty->assign("anrs",$anrs);
while($res=mysqli_fetch_assoc($qry)) $smarty->assign("titels",$titels);
{
$typnames[$res["id"]] = $res["anrede"]; $mails = db_zuordnung($dbconn, "SELECT id, kontakt FROM kontakt WHERE partner_id = ? AND typ_id = 1", array($kdnres["partner_id"] ?? 0)) ?: array();
} $smarty->assign("mails",array_values($mails));
$smarty->assign("anrs",$typnames); $smarty->assign("mailids",array_keys($mails));
$typnames=array(); $typen = db_zuordnung($dbconn, "SELECT id, bezeichn FROM artikeltyp") ?: array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel"); $smarty->assign("typids",array_keys($typen));
while($res=mysqli_fetch_assoc($qry)) $smarty->assign("typs",array_values($typen));
{
$typnames[$res["id"]] = $res["titel"];
}
$smarty->assign("titels",$typnames);
$mails=array();
$mailids=array();
$qry = mysqli_query($dbconn,"SELECT kontakt.id, kontakt, partner_id, typ FROM kontakt LEFT JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id WHERE partner_id='".mysql_escape_string($kdnres["partner_id"])."' AND typ_id = 1");
while($res=mysqli_fetch_assoc($qry))
{
$mails[] = $res["kontakt"];
$mailids[] = $res["id"];
}
$smarty->assign("mails",$mails);
$smarty->assign("mailids",$mailids);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,bezeichn FROM artikeltyp");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["bezeichn"];
}
$smarty->assign("typids",$typids);
$smarty->assign("typs",$typnames);
$rechnung=makerechnungsarray($dbconn, $_GET["id"], 0); $rechnung=makerechnungsarray($dbconn, $_GET["id"], 0);
$smarty->assign("rechnung",$rechnung); $smarty->assign("rechnung",$rechnung);
$smarty->assign("adresse",$kdnres); $smarty->assign("adresse",$kdnres);
@@ -174,7 +141,7 @@ else
} }
else else
{ {
$smarty->assign("loadrech",$_GET["id"]); $smarty->assign("loadrech",(int)$_GET["id"]);
$rechnung=makerechnungsarray($dbconn, $_GET["id"], 0); $rechnung=makerechnungsarray($dbconn, $_GET["id"], 0);
$kommission=makeadressarray($dbconn, $rechnung["kommission"]); $kommission=makeadressarray($dbconn, $rechnung["kommission"]);
$smarty->assign("rechnung",$rechnung); $smarty->assign("rechnung",$rechnung);
@@ -189,80 +156,37 @@ else
$smarty->assign("artikel",makeartikelarray($dbconn, $_GET["draft"], 1)); $smarty->assign("artikel",makeartikelarray($dbconn, $_GET["draft"], 1));
} }
$smarty->assign("type",$_GET["type"]); $smarty->assign("type",(int)$_GET["type"]);
$smarty->assign("newtype",$_GET["newtype"]); $smarty->assign("newtype",(int)$_GET["newtype"]);
$kdnres=makeadressarray($dbconn, $_GET["adressid"]); $kdnres=makeadressarray($dbconn, $_GET["adressid"]);
if($kdnres["adresstyp"] == "Kommission") if($kdnres["adresstyp"] == "Kommission")
{ {
$smarty->assign("kommission",$kdnres); $smarty->assign("kommission",$kdnres);
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, adresstyp.typ AS adresstyp, hnr, vname, partner_id, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id
FROM adresse
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
JOIN adresstyp ON adresse.typ_id = adresstyp.id
WHERE adresse.typ_id='1' AND adresse.partner_id = '".$kdnres["partner_id"]."'
ORDER BY typ_id ASC") or $err = error("Fehler beim abrufen der Daten ".mysqli_error($dbconn));
//$kdnres=mysqli_fetch_assoc($qry);
} }
if($kdnres["partner_id"]) if($kdnres["partner_id"])
{ {
$typnames=array(); list($anrs, $titels) = anredenUndTitel($dbconn);
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede"); $smarty->assign("anrs",$anrs);
while($res=mysqli_fetch_assoc($qry)) $smarty->assign("titels",$titels);
{
$typnames[$res["id"]] = $res["anrede"]; $liste = db_zuordnung($dbconn, "SELECT id, bezeichn FROM artikeltyp") ?: array();
} $smarty->assign("typids",array_keys($liste));
$smarty->assign("anrs",$typnames); $smarty->assign("typs",array_values($liste));
$typnames=array(); $liste = db_zuordnung($dbconn, "SELECT id, einheit FROM einheit") ?: array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel"); $smarty->assign("einhids",array_keys($liste));
while($res=mysqli_fetch_assoc($qry)) $smarty->assign("einhs",array_values($liste));
{
$typnames[$res["id"]] = $res["titel"]; $liste = db_zuordnung($dbconn, "SELECT id, wahrung FROM wahrung") ?: array();
} $smarty->assign("wahrids",array_keys($liste));
$smarty->assign("titels",$typnames); $smarty->assign("wahrs",array_values($liste));
$typids=array(); $typids=array();
$typnames=array(); $typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,bezeichn FROM artikeltyp"); foreach(db_zeilen($dbconn, "SELECT id, mwst FROM mwst") ?: array() as $res)
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["bezeichn"];
}
$smarty->assign("typids",$typids);
$smarty->assign("typs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,einheit FROM einheit");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["einheit"];
}
$smarty->assign("einhids",$typids);
$smarty->assign("einhs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,wahrung FROM wahrung");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["wahrung"];
}
$smarty->assign("wahrids",$typids);
$smarty->assign("wahrs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,mwst FROM mwst");
while($res=mysqli_fetch_assoc($qry))
{ {
if($res["mwst"] != "999") if($res["mwst"] != "999")
{ {
@@ -283,31 +207,18 @@ else
$smarty->assign("artmwstids",$typids2); $smarty->assign("artmwstids",$typids2);
$smarty->assign("artmwsts",$typnames2); $smarty->assign("artmwsts",$typnames2);
$typids=array(); $liste = db_zuordnung($dbconn, "SELECT id, ziel FROM zahlziel") ?: array();
$typnames=array(); $smarty->assign("zzielids",array_keys($liste));
$qry=mysqli_query($dbconn, "SELECT id,ziel FROM zahlziel"); $smarty->assign("zziels",array_values($liste));
while($res=mysqli_fetch_assoc($qry))
{ $liste = db_zuordnung($dbconn, "SELECT id, CONCAT(kto, ' (', name, ')') FROM buchungsKontos") ?: array();
$typids[] = $res["id"]; $smarty->assign("buchKtoids",array_keys($liste));
$typnames[] = $res["ziel"]; $smarty->assign("buchKtos",array_values($liste));
}
$smarty->assign("zzielids",$typids); $res = db_zeile($dbconn, "SELECT tmp_rechnung.id, adresse_id, vname, nname, str, hnr FROM tmp_rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON str_id = strasse.id WHERE tmp_rechnung.typ_id = ? AND user_id = ? ORDER BY datetime DESC LIMIT 1", array((string)$_GET["type"], $_SESSION["user"]));
$smarty->assign("zziels",$typnames); if($res === false)
$err = error("Fehler beim Suchen nach nicht gespeicherten Daten<br />".mysqli_error($dbconn));
$typids=array(); if($res)
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,kto,name FROM buchungsKontos");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["kto"]." (".$res["name"].")";
}
$smarty->assign("buchKtoids",$typids);
$smarty->assign("buchKtos",$typnames);
$qry=mysqli_query($dbconn,"SELECT tmp_rechnung.id,adresse_id, vname, nname, str, hnr FROM tmp_rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON str_id = strasse.id WHERE tmp_rechnung.typ_id='".mysql_escape_string($_GET["type"])."' AND user_id = '".mysql_escape_string($_SESSION["user"])."' ORDER BY datetime DESC LIMIT 1") or $err=error("Fehler beim Suchen nach nicht gespeicherten Daten<br />".mysqli_error($dbconn));
if($res = mysqli_fetch_assoc($qry))
{ {
$smarty->assign("draft",$res["id"]); $smarty->assign("draft",$res["id"]);
$smarty->assign("draftname",$res["vname"]." ".$res["nname"]); $smarty->assign("draftname",$res["vname"]." ".$res["nname"]);
+5 -4
View File
@@ -76,12 +76,13 @@ else
{ {
if($_GET["formsent"] == 1) if($_GET["formsent"] == 1)
{ {
if(is_file("./styles/".$_POST["style"])) // nur Dateien direkt in styles/, kein ../
if(basename($_POST["style"]) === $_POST["style"] && is_file("./styles/".$_POST["style"]))
{ {
updateUserSetting($dbconn,"style", mysqli_real_escape_string($dbconn,$_POST["style"]), mysqli_real_escape_string($dbconn,$_SESSION["user"])); updateUserSetting($dbconn,"style", $_POST["style"], $_SESSION["user"]);
$_SESSION["style"] = $_POST["style"]; $_SESSION["style"] = $_POST["style"];
} }
updateUserSetting($dbconn,"show_sks", mysqi_real_escape_string($dbconn,$_POST["show_sks"]), mysqli_real_escape_string($dbconn,$_SESSION["user"])); updateUserSetting($dbconn,"show_sks", (int)$_POST["show_sks"], $_SESSION["user"]);
} }
if(substr($_SESSION["rights"],RIGHTS_SUPERADMIN,1) & RIGHTS_CHANGE || substr($_SESSION["rights"],RIGHTS_SUPERADMIN,1) & RIGHTS_ADD) if(substr($_SESSION["rights"],RIGHTS_SUPERADMIN,1) & RIGHTS_CHANGE || substr($_SESSION["rights"],RIGHTS_SUPERADMIN,1) & RIGHTS_ADD)
$smarty->assign("superadmin","add"); $smarty->assign("superadmin","add");
@@ -129,7 +130,7 @@ else
} }
$show_sks = getUserSetting($dbconn,"show_sks", mysqli_real_escape_string($dbconn,$_SESSION["user"]), 1); $show_sks = getUserSetting($dbconn,"show_sks", $_SESSION["user"], 1);
$smarty->assign("show_sks",$show_sks); $smarty->assign("show_sks",$show_sks);
$smarty->assign("styles",$styles); $smarty->assign("styles",$styles);
+48 -62
View File
@@ -1,71 +1,57 @@
<?php <?php
if(!isset($_POST["user"]))
$_POST["user"] = "";
else
$_POST["user"] = htmlspecialchars($_POST["user"]);
if(!isset($_POST["pass"]))
$_POST["pass"] = "";
else
$_POST["pass"] = htmlspecialchars($_POST["pass"]);
$smarty->display("heading.tpl"); $smarty->display("heading.tpl");
$smarty->assign("local",isLocal()); $smarty->assign("local",isLocal());
if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal()) if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal())
{ {
$qry= mysqli_query($dbconn, "SELECT salt FROM user WHERE LOWER(nick) = '".mysql_escape_string(strtolower($_POST["user"]))."' AND blocked = 0") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn))); // Eingaben unverändert verwenden: Passwörter werden beim Anlegen roh
if(mysqli_num_rows($qry) == 1) // gehasht, ein htmlspecialchars() hier ließ Passwörter mit & < > " '
{ // nie passen. Ausgabe-Escaping übernimmt das Template.
$res = mysqli_fetch_array($qry); $nick = isset($_POST["user"]) && is_string($_POST["user"]) ? $_POST["user"] : "";
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE nick = '".mysql_escape_string($_POST["user"])."' AND pass = '".crypt($_POST["pass"],$res[0])."'") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn))); $pass = isset($_POST["pass"]) && is_string($_POST["pass"]) ? $_POST["pass"] : "";
if(mysqli_num_rows($qry) == 1)
{ $udata = db_zeile($dbconn, "SELECT * FROM user WHERE nick = ? AND blocked = 0", array($nick));
$udata = mysqli_fetch_assoc($qry); if($udata === false)
$_SESSION["login"] = "valid"; error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));
$_SESSION["logedout"] = $udata["logedout"]; elseif($udata === null)
$_SESSION["user"] = $udata["id"];
$_SESSION["nick"] = $udata["nick"];
$_SESSION["vname"] = $udata["vname"];
$_SESSION["nname"] = $udata["nname"];
$_SESSION["rights"] = $udata["rights"];
$_SESSION["lastlogin"] = $udata["lastlogin"];
$_SESSION["numlogins"] = $udata["numlogins"];
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
if(!is_file("styles/".$_SESSION["style"]))
{
updateUserSetting($dbconn,"style", "default.css", $udata["id"]);
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
}
$_SESSION["zoom"] = getUserSetting($dbconn,"zoom", $_SESSION["user"], 1);
$_SESSION["privateNotes"] = getUserSetting($dbconn,"privnotes", $_SESSION["user"], "");
mysqli_query($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
}
else
{
$qry= mysqli_query($dbconn, "SELECT wrongpw FROM user WHERE nick = '".mysql_escape_string($_POST["user"])."'") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));;
if(mysqli_num_rows($qry))
{
$wrongpw = mysqli_fetch_array($qry);
if($wrongpw[0] < 10)
{
mysqli_query($dbconn, "UPDATE user SET wrongpw = wrongpw + 1 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
$triesleft = 10 - $wrongpw[0];
if($triesleft > 1)
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Nach weiteren $triesleft Versuchen wird der Benutzer deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
else
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Wenn der nächste Versuch falsch ist, wird der Benutzer für deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
}
else
{
mysqli_query($dbconn, "UPDATE user SET blocked = 1 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
error("Der Benuzer wurde deaktiviert, er muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.");
}
}
}
}
else
error("Dieser Benutzername existiert nicht."); error("Dieser Benutzername existiert nicht.");
elseif(hash_equals($udata["pass"], crypt($pass, $udata["salt"])))
{
// neue Session-ID nach dem Login, sonst ist Session-Fixation möglich
session_regenerate_id(true);
$_SESSION["login"] = "valid";
$_SESSION["logedout"] = $udata["logedout"];
$_SESSION["user"] = $udata["id"];
$_SESSION["nick"] = $udata["nick"];
$_SESSION["vname"] = $udata["vname"];
$_SESSION["nname"] = $udata["nname"];
$_SESSION["rights"] = $udata["rights"];
$_SESSION["lastlogin"] = $udata["lastlogin"];
$_SESSION["numlogins"] = $udata["numlogins"];
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
if(!is_file("styles/".$_SESSION["style"]))
{
updateUserSetting($dbconn,"style", "default.css", $udata["id"]);
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
}
$_SESSION["zoom"] = getUserSetting($dbconn,"zoom", $_SESSION["user"], 1);
$_SESSION["privateNotes"] = getUserSetting($dbconn,"privnotes", $_SESSION["user"], "");
db_abfrage($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE id = ?", array($udata["id"]));
}
elseif($udata["wrongpw"] < 10)
{
db_abfrage($dbconn, "UPDATE user SET wrongpw = wrongpw + 1 WHERE id = ?", array($udata["id"]));
$triesleft = 10 - $udata["wrongpw"];
if($triesleft > 1)
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Nach weiteren $triesleft Versuchen wird der Benutzer deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
else
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Wenn der nächste Versuch falsch ist, wird der Benutzer für deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
}
else
{
db_abfrage($dbconn, "UPDATE user SET blocked = 1 WHERE id = ?", array($udata["id"]));
error("Der Benuzer wurde deaktiviert, er muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.");
}
} }
if($_SESSION["login"]=="valid"){ if($_SESSION["login"]=="valid"){
header('Location:?action=kunden'); header('Location:?action=kunden');
+1 -1
View File
@@ -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");
+14 -137
View File
@@ -1,148 +1,25 @@
<?php <?php
require_once("incs/users.php"); require_once "incs/termin.php";
$_SESSION["camefrom"] = "termin&show=".$_GET["show"]."&page=".$_GET["page"]; require_once "incs/users.php";
if($_GET["show"] == "list") $seite = parameterGanzzahl("page");
$_SESSION["camefrom"] = "termin&show=".(isset($_GET["show"]) && $_GET["show"] == "list" ? "list" : "")."&page=".$seite;
if(isset($_GET["show"]) && $_GET["show"] == "list")
{ {
$smarty->assign("heading", "Terminliste");
$smarty->assign("heading","Terminliste"); $smarty->assign("tabs", parameterGanzzahl("tabs") ?: ($_SESSION["termtyp"] ?? 1));
if($_GET["tabs"])
$smarty->assign("tabs",$_GET["tabs"]);
else
$smarty->assign("tabs",$_SESSION["termtyp"]);
$smarty->display("heading.tpl"); $smarty->display("heading.tpl");
$smarty->display("termlist.tpl"); $smarty->display("termlist.tpl");
} }
else else
{ {
$smarty->assign("heading","Termine"); $smarty->assign("heading", "Termine");
$smarty->display("heading.tpl"); $smarty->display("heading.tpl");
//$colors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09"); $smarty->assign("page", $seite);
$smarty->assign("weekdays", kalenderTage($dbconn, $seite));
//$weather = GetWeather(); $smarty->assign("users", kalenderBenutzer($dbconn));
//$smarty->assign("weather",$weather);
$start = $_GET["page"]*8 - 1;
$end = $_GET["page"]*8 + 7;
for($i=$start; $i<$end; $i++)
{
$qry = mysqli_query($dbconn,"SELECT user.vname,user.nname, user.color,
case MAX(zeiten.gehen)
when MAX(zeiten.kommen) then 0
else 1 end AS complete
FROM user
LEFT JOIN zeiten ON user.id = zeiten.ma_id
WHERE DATE_FORMAT(kommen,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."'
GROUP BY user.id ORDER BY user.nname ASC") or $err=error("fehler beim ermitteln der anwesenden Mitarbeiter<br />".mysqli_error($dbconn));
$ma_check=array();
while($res=mysqli_fetch_assoc($qry))
{
$ma_check[] = $res;
}
$qry = mysqli_query($dbconn,"SELECT termin.id,termtyp.typ, termin.head, termtime, termdauer, user, user2, user3, user4, done, partner_id, termin.id, main_id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname,
user.vname as uservname, user.nname as usernname,
user2.vname as uservname2, user2.nname as usernname2,
user3.vname as uservname3, user3.nname as usernname3,
user4.vname as uservname4, user4.nname as usernname4,
firma, vname2, nname2
FROM termin
LEFT JOIN termtyp ON termin.typ = termtyp.id
LEFT JOIN adresse ON termin.adresse_id = adresse.id
LEFT JOIN partner ON adresse.partner_id = partner.id
LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON strasse.ort_id = ort.id
LEFT JOIN user ON termin.user = user.id
LEFT JOIN user AS user2 ON termin.user2 = user2.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id
WHERE DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' AND termdauer > '12:00:00'
ORDER BY termtime ASC") or $err=error("fehler beim ermitteln der termine<br />".mysqli_error($dbconn));
$fulldaytermine=array();
while($res=mysqli_fetch_assoc($qry))
{
$fulldaytermine[] = $res;
}
$termine=array();
if($_SESSION["firma"] == "Ingenieurbüro Wagner"){
$qry = mysqli_query($dbconn,"SELECT work.id, project.id AS projectid, work.bezeichn AS head, work.rechn AS done, project.name AS projectname, work.datetime AS termtime, work.std AS termdauer, project.changeuser AS user, project.partner_id,
adresse.vname as vname, adresse.nname as nname, adresse.firma AS firma
FROM work
LEFT JOIN project ON work.project_id = project.id
LEFT JOIN partner ON project.partner_id = partner.id
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN user ON work.changeuser = user.id
WHERE adresse.typ_id = 1 AND DATE_FORMAT(work.datetime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."'
ORDER BY work.datetime ASC") or $err=error("fehler beim ermitteln der termine<br />".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$termine[] = $res;
}
}
$qry = mysqli_query($dbconn,"SELECT termin.id,termtyp.typ, termin.head, termtime, termdauer, user, user2, user3, user4, done, partner_id, termin.id, main_id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname,
user.vname as uservname, user.nname as usernname,
user2.vname as uservname2, user2.nname as usernname2,
user3.vname as uservname3, user3.nname as usernname3,
user4.vname as uservname4, user4.nname as usernname4,
firma, vname2, nname2
FROM termin
LEFT JOIN termtyp ON termin.typ = termtyp.id
LEFT JOIN adresse ON termin.adresse_id = adresse.id
LEFT JOIN partner ON adresse.partner_id = partner.id
LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON strasse.ort_id = ort.id
LEFT JOIN user ON termin.user = user.id
LEFT JOIN user AS user2 ON termin.user2 = user2.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id
WHERE DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' AND termdauer < '12:00:00'
ORDER BY termtime ASC") or $err=error("fehler beim ermitteln der termine<br />".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$termine[] = $res;
}
$feiertag = feiertag_bayern(idate("d",strtotime("+".$i." days")),idate("m",strtotime("+".$i." days")),idate("Y",strtotime("+".$i." days")));
if($feiertag){
$weekdays[]=array( "weekday"=>date("d.m.Y",strtotime("+".$i." days"))."<br/>",
"date"=>strftime("%Y%m%d",strtotime("+".$i." days")),
"termine"=>$termine,
"fulldaytermine"=>$fulldaytermine,
"numfulldaytermine" => 0,
"ma_check"=>$ma_check,
"feiertag" => $feiertag
);
}
else{
$weekdays[]=array( "weekday"=>strftime("%A",strtotime("+".$i." days"))."<br/>".date("d.m.Y",strtotime("+".$i." days")),
"date"=>strftime("%Y%m%d",strtotime("+".$i." days")),
"termine"=>$termine,
"fulldaytermine"=>$fulldaytermine,
"numfulldaytermine" => 0,
"ma_check"=>$ma_check,
"feiertag" => ""
);
}
}
$smarty->assign("page",$_GET["page"]);
$smarty->assign("weekdays",$weekdays);
$qry=mysqli_query($dbconn,"SELECT id, vname, nname, color FROM user WHERE blocked = 0 AND nick != 'ALL'");
while($res=mysqli_fetch_assoc($qry))
{
//$res["color"] = $colors[$res["id"]];
$res["openvacation"] = urlaub_remaining($dbconn, $res["id"]);
$users[$res["id"]] = $res;
}
$smarty->assign("users",$users);
$smarty->display("calendar.tpl"); $smarty->display("calendar.tpl");
} }
?> ?>
+76 -407
View File
@@ -1,422 +1,91 @@
<?php <?php
require_once "incs/termin.php";
if($_GET["id"] && $_GET["del"] == 1) /*
* Termin anlegen, ändern, löschen oder als erledigt markieren.
*
* Die Terminliste kann mehrere Termine auf einmal abhaken oder löschen;
* dafür kommt id=multi und je Zeile ein Ankreuzfeld erl<N> bzw. del<N>.
*/
/* Die angekreuzten Termine einer Mehrfachauswahl */
function angekreuzteTermine($praefix)
{ {
if($_GET["id"] == "multi"){ $ids = array();
for( $i=1; $i<=$_POST["pagesize"]; $i++){ $anzahl = isset($_POST["pagesize"]) ? (int)$_POST["pagesize"] : 0;
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$_POST["del".$i]."'") or $err=error("Konnte Haupttermin nicht löschen<br />".mysqli_error($dbconn)); for($i = 1; $i <= $anzahl; $i++)
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$_POST["del".$i]."'" or $err=error("Konnte Nebentermine nicht löschen<br />".mysqli_error($dbconn))); if(!empty($_POST[$praefix.$i]))
} $ids[] = (int)$_POST[$praefix.$i];
if(!$err) return $ids;
doneNreturn("Erfolgreich gelöscht"); }
}
else{
$qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
$res = mysqli_fetch_assoc($qry);
if(!$res)
$err = error("Dieser Termin existiert nicht!");
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht löschen<br />".mysqli_error($dbconn));
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$res["id"]."'" or $err=error("Konnte Nebentermine nicht löschen<br />".mysqli_error($dbconn)));
$mehrfach = isset($_GET["id"]) && $_GET["id"] === "multi";
$terminid = parameterGanzzahl("id");
$adressid = parameterGanzzahl("adressid");
$err = 0;
if(($mehrfach || $terminid) && parameterGanzzahl("del") == 1)
{
foreach($mehrfach ? angekreuzteTermine("del") : array($terminid) as $id)
if(!$err) if(!$err)
doneNreturn("Erfolgreich gelöscht"); $err = loescheTerminreihe($dbconn, $id);
if(!$err)
{
doneNreturn("Erfolgreich gelöscht");
return;
} }
} }
elseif($_GET["id"] && $_GET["done"]) elseif(($mehrfach || $terminid) && !empty($_GET["done"]))
{ {
if($_GET["id"] == "multi"){ $erledigt = $_GET["done"] != "no";
for( $i=1; $i<=$_POST["pagesize"]; $i++){ foreach($mehrfach ? angekreuzteTermine("erl") : array($terminid) as $id)
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$_POST["erl".$i]."'") or $err+=error("Konnte Haupttermin nicht als erledigt markieren<br />".mysqli_error($dbconn));
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE main_id='".$_POST["erl".$i]."'") or $err+=error("Konnte Nebentermine nicht als erledigt markieren<br />".mysqli_error($dbconn));
}
if(!$err) if(!$err)
doneNreturn("Erfolgreich geändert!"); $err = setzeTerminErledigt($dbconn, $id, $erledigt);
} if(!$err)
else{ {
$qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'"); doneNreturn("Erfolgreich geändert!");
$res = mysqli_fetch_assoc($qry); return;
if(!$res)
$err = error("Dieser Termin existiert nicht!");
if($_GET["done"] == "yes")
{
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht als erledigt markieren<br />".mysqli_error($dbconn));
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE main_id='".$res["id"]."'") or $err=error("Konnte Nebentermine nicht als erledigt markieren<br />".mysqli_error($dbconn));
}
elseif($_GET["done"] == "no")
{
mysqli_query($dbconn,"UPDATE termin SET done = 0 WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht als nicht erledigt markieren<br />".mysqli_error($dbconn));
mysqli_query($dbconn,"UPDATE termin SET done = 0 WHERE main_id='".$res["id"]."'") or $err=error("Konnte Nebentermine nicht als nicht erledigt markieren<br />".mysqli_error($dbconn));
}
if(!$err)
doneNreturn("Erfolgreich geändert!");
} }
} }
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, hnr, vname, partner_id, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id $kunde = terminAdresse($dbconn, $adressid);
FROM adresse if(empty($kunde["partner_id"]))
LEFT JOIN strasse ON str_id = strasse.id $adressid = 0;
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id if(!$err && parameterGanzzahl("formsent") == 1)
WHERE adresse.id='".mysql_escape_string($_GET["adressid"])."'
ORDER BY typ_id ASC") or $err = error("Fehler beim abrufen der Daten ".mysqli_error($dbconn));
$kdnres=mysqli_fetch_assoc($qry);
if($_GET["user"])
$smarty->assign("user",$_GET["user"]);
if(!$kdnres["partner_id"])
{ {
$_GET["adressid"] = 0; $err = speichereTermin($dbconn, $terminid, $adressid);
if(!$err)
{
doneNreturn("Erfolgreich eingetragen");
return;
}
// bei einem Fehler die Eingaben im Formular stehen lassen
$smarty->assign("termin", $_POST);
} }
if($_GET["formsent"] == 1)
{
$head = mysql_escape_string(trim($_POST["head"]));
$user = mysql_escape_string(trim($_POST["user"]));
$user2 = mysql_escape_string(trim($_POST["user2"]));
$user3 = mysql_escape_string(trim($_POST["user3"]));
$user4 = mysql_escape_string(trim($_POST["user4"]));
$text = mysql_escape_string(trim($_POST["text"]));
$typ = mysql_escape_string(trim($_POST["typ"]));
$done = mysql_escape_string(trim($_POST["done"]));
$folge = mysql_escape_string(trim($_POST["folge"]));
$folgetyp = mysql_escape_string(trim($_POST["folgetyp"]));
$folgedays = mysql_escape_string(trim($_POST["folgedays"]));
$datetime_start = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_start"])),0);
$datetime_end = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_end"])),1);
$_POST["termtime"] = $datetime_start;
$_POST["termend"] = $datetime_end;
$dauer = $_POST["termdauer"] = mysql_dauer($datetime_start,$datetime_end);
$days = 1;
$split_dauer = explode(":",$dauer);
if($split_dauer[0]>12 || $typ == 0)
{
$days = ceil($dauer/24);
$dauer = "24:00:00";
$_POST["termtime"] = $datetime_start = substr($datetime_start,0,11)."00:00:00";
$_POST["termend"] = $datetime_end = substr($datetime_start,0,11)."23:59:00";
}
$datetime_start_tmp =$datetime_start;
if($days > 1 && $_GET["id"])
{
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
$_GET["id"] = "";
}
else
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."' AND id != '".mysqli_escape_string($dbconn,$_GET["id"])."'");
if($done == 0){
for($i=0;$i<$days;$i++)
{
$datetime_start_tmp = date("Y-m-d H:i:s",strtotime("+".$i." day",strtotime($datetime_start)));
$qry = mysqli_query($dbconn,"SELECT * FROM
( SELECT id,user, user2, user3, user4, termtime,
DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend
FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0)
as subselect
WHERE
(user='$user' OR user2='$user' OR user3='$user' OR user4='$user') AND
(
('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR
('$datetime_end' > termtime AND '$datetime_end' <= termend) OR
('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend)
)") or $err=error("Fehler beim überprüfen von Überlappungen<br />".mysqli_error($dbconn));
$res=mysqli_fetch_assoc($qry);
if(!$res && $user2)
{
$qry = mysqli_query($dbconn,"SELECT * FROM
( SELECT id,user, user2, user3, user4, termtime,
DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend
FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0)
as subselect
WHERE
(user='$user2' OR user2='$user2' OR user3='$user2' OR user4='$user2') AND
(
('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR
('$datetime_end' > termtime AND '$datetime_end' <= termend) OR
('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend)
)") or $err=error("Fehler beim überprüfen von Überlappungen<br />".mysqli_error($dbconn));
$res=mysqli_fetch_assoc($qry);
}
if(!$res && $user3)
{
$qry = mysqli_query($dbconn,"SELECT * FROM
( SELECT id,user, user2, user3, user4, termtime,
DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend
FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0)
as subselect
WHERE
(user='$user3' OR user2='$user3' OR user3='$user3' OR user4='$user3') AND
(
('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR
('$datetime_end' > termtime AND '$datetime_end' <= termend) OR
('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend)
)") or $err=error("Fehler beim überprüfen von Überlappungen<br />".mysqli_error($dbconn));
$res=mysqli_fetch_assoc($qry);
}
if(!$res && $user4)
{
$qry = mysqli_query($dbconn,"SELECT * FROM
( SELECT id,user, user2, user3, user4, termtime,
DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend
FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0)
as subselect
WHERE
(user='$user4' OR user2='$user4' OR user3='$user4' OR user4='$user4') AND
(
('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR
('$datetime_end' > termtime AND '$datetime_end' <= termend) OR
('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend)
)") or $err=error("Fehler beim überprüfen von Überlappungen<br />".mysqli_error($dbconn));
$res=mysqli_fetch_assoc($qry);
}
if($res && $res["id"] != $_GET["id"])
{
$err=error("Dieser Mitarbeiter hat zu der Zeit bereits einen Termin, er kann nicht an zwei Orten gleichzeitig sein.");
break;
}
}
}
if(!$err)
{
for($i=0;$i<$days;$i++)
{
$datetime_start_tmp = date("Y-m-d H:i:s",strtotime("+".$i." day",strtotime($datetime_start)));
if(strstr($datetime_start_tmp,"1970")){
echo "NICHTTERMINIERT!!";
$datetime_start_tmp = "0000-00-00 00:00:00";
}
if($_GET["id"])
{
$qry=mysqli_query($dbconn,"SELECT * FROM termin WHERE id = '".mysqli_escape_string($dbconn,($_GET["id"]))."'");
if ($res=mysqli_fetch_assoc($qry))
{
if($done && $folge && !$res["followed_by"] && !$i)
{
mysqli_query($dbconn,"INSERT INTO termin SET head='$head',
text='',
adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."',
typ='$folgetyp',
changetime=NOW(),
datetime=NOW(),
done='0',
termtime='',
termdauer='',
user='$user',
user2='$user2',
user3='$user3',
user4='$user4',
changeuser='".$_SESSION["user"]."',
act_date=DATE_ADD(CURDATE(),INTERVAL $folgedays DAY)") or $err=error("Fehler beim anlegen des Folgetermins<br />".mysqli_error($dbconn));
$res["followed_by"] = mysqli_insert_id($dbconn);
mysqli_query($dbconn,"UPDATE termin SET main_id = '".$res["followed_by"]."' WHERE id='".$res["followed_by"]."'");
}
if(!$i)
{
mysqli_query($dbconn,"UPDATE termin SET head='$head',
text='$text',
adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."',
typ='$typ',
changetime=NOW(),
done='$done',
termtime='$datetime_start_tmp',
termdauer='$dauer',
changeuser='".$_SESSION["user"]."',
user='$user',
user2='$user2',
user3='$user3',
user4='$user4',
followed_by='".$res["followed_by"]."'
WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'") or $err=error("Fehler beim ändern des Termins<br />".mysqli_error($dbconn));
}
}
else
$err=error("dieser Termin existiert nicht!");
}
else
{
if($done && $folge && !$err && !$i)
{
mysqli_query($dbconn,"INSERT INTO termin SET head='$head',
text='',
adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."',
typ='$folgetyp',
changetime=NOW(),
datetime=NOW(),
done='0',
termtime='',
termdauer='',
changeuser='".$_SESSION["user"]."',
user='$user',
user2='$user2',
user3='$user3',
user4='$user4',
act_date=DATE_ADD(CURDATE(),INTERVAL $folgedays DAY)") or $err=error("Fehler beim anlegen des Folgetermins<br />".mysqli_error($dbconn));
$res["followed_by"] = mysqli_insert_id($dbconn);
mysqli_query($dbconn,"UPDATE termin SET main_id = '".$res["followed_by"]."' WHERE id='".$res["followed_by"]."'");
}
if(!$err)
{
if(!$i)
{
mysqli_query($dbconn,"INSERT INTO termin SET head='$head',
text='$text',
adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."',
typ='$typ',
changetime=NOW(),
datetime=NOW(),
done='$done',
termtime='$datetime_start_tmp',
termdauer='$dauer',
changeuser='".$_SESSION["user"]."',
user='$user',
user2='$user2',
user3='$user3',
user4='$user4',
followed_by='".$res["followed_by"]."'") or $err=error("Fehler beim anlegen des Termins<br />".mysqli_error($dbconn));
$main_id = mysqli_insert_id($dbconn);
mysqli_query($dbconn,"UPDATE termin SET main_id = '$main_id' WHERE id='$main_id'");
}
else
{
mysqli_query($dbconn,"INSERT INTO termin SET head='$head',
text='$text',
adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."',
typ='$typ',
changetime=NOW(),
datetime=NOW(),
done='$done',
termtime='$datetime_start_tmp',
termdauer='$dauer',
changeuser='".$_SESSION["user"]."',
user='$user',
user2='$user2',
user3='$user3',
user4='$user4',
main_id='$main_id',
followed_by='".$res["followed_by"]."'") or $err=error("Fehler beim anlegen des Termins<br />".mysqli_error($dbconn));
}
}
}
}
if(!$err)
{
doneNreturn("Erfolgreich eingetragen");
}
}
if($err){
$smarty->assign("termin",$_POST);
}
//elseif(!$head)
// $err=error("Bitte geben Sie eine Terminbeschreibung an!");
}
$qry = mysqli_query($dbconn,"SELECT id, typ
FROM termtyp WHERE id > 0") or $err = error("Fehler beim abrufen der Termintypen<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$typids[] =$res["id"];
$typs[] = $res["typ"];
}
$smarty->assign("typs",$typs);
$smarty->assign("typids",$typids);
$typids=array();
$typs=array();
$qry = mysqli_query($dbconn,"SELECT id, vname, nname
FROM user WHERE blocked = 0 AND id > 0") or $err = error("Fehler beim abrufen der Benutzer<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$typids[] =$res["id"];
$typs[] = $res["vname"]." ".$res["nname"];
}
$smarty->assign("users",$typs);
$smarty->assign("userids",$typids);
$typs[]="Keiner";
$typids[]=0;
$smarty->assign("optusers",$typs);
$smarty->assign("optuserids",$typids);
$smarty->assign("days",array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40));
$smarty->assign("kunde",$kdnres);
if($_GET["id"])
{
$qry=mysqli_query($dbconn,"SELECT MIN(termtime) AS termtime,
SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer,
head,
followed_by,
MIN(id) AS id,
main_id,
typ,adresse_id,
done,
user,
user2,
user3,
user4,
changeuser,
act_date,
text
FROM termin WHERE main_id = '".mysqli_escape_string($dbconn,$_GET["id"])."' GROUP BY main_id");
if ($res=mysqli_fetch_assoc($qry))
{
if($res["followed_by"] > 0)
{
$qry2=mysqli_query($dbconn, "SELECT DATE_FORMAT(act_date,'%Y-%m-%d'), typ_id FROM termin WHERE id = '".$res["followed_by"]."'");
$res2=mysqli_fetch_assoc($qry2);
$days = (strtotime($res2["act_date"]) - strtotime(date("Y-m-d"))) / (60 * 60 * 24);
$res["folgetyp"]= $res2["typ_id"];
if($days > 0)
$res["folgedays"] = $days;
}
$res["termend"] = dauer_to_date($res["termtime"], $res["termdauer"]);
if(strstr($res["termend"],"00:00:00")){
$res["termend"] = date("Y-m-d H:i:s",strtotime("-1 minutes",strtotime($res["termend"])));
}
$smarty->assign("termin",$res);
if($_GET["adressid"])
$smarty->assign("heading","Termin ändern");
else
$smarty->assign("heading","Urlaub / Krankheit ändern");
}
else
{
$err=error("Dieser Termin existiert nicht!");
}
}
else
{
$smarty->assign("termin",$_POST);
if($_GET["adressid"]){
$smarty->assign("heading","Neuer Termin");
}
else{
$smarty->assign("heading","Neuer Urlaub / Krankheitstag");
$typids=array();
$typs=array();
$qry = mysqli_query($dbconn,"SELECT id, typ
FROM termtyp WHERE typ = 'Urlaub' OR typ = 'Krankheit'") or $err = error("Fehler beim abrufen der Termintypen<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$typids[] =$res["id"];
$typs[] = $res["typ"];
}
$smarty->assign("vac_types_id",$typids);
$smarty->assign("vac_types_name",$typs);
}
}
$smarty->display("heading.tpl");
$smarty->display("addtermin.tpl");
terminAuswahllisten($dbconn, $smarty);
$smarty->assign("kunde", $kunde);
$smarty->assign("user", parameterGanzzahl("user"));
?> if($terminid && !$err)
{
$termin = terminZumBearbeiten($dbconn, $terminid);
if(!$termin)
$err = error("Dieser Termin existiert nicht!");
else
{
$smarty->assign("termin", $termin);
$smarty->assign("heading", $adressid ? "Termin ändern" : "Urlaub / Krankheit ändern");
}
}
elseif(!$terminid)
{
if(!$err)
$smarty->assign("termin", $_POST);
$smarty->assign("heading", $adressid ? "Neuer Termin" : "Neuer Urlaub / Krankheitstag");
}
$smarty->display("heading.tpl");
$smarty->display("addtermin.tpl");
?>
+38 -64
View File
@@ -1,71 +1,45 @@
<?php <?php
// GET: id OR date;type /*
* Terminzettel als PDF: eine Seite je Termin, einmal zum Abheften und
* einmal mit Anfahrtsskizze. Aufruf entweder mit id (ein Termin) oder mit
* date (alle Termine eines Tages).
*/
require_once "incs/termin.php";
include("incs/makepdf.php"); include("incs/makepdf.php");
$pdf = makerawPDFcopy(0); $terminid = parameterGanzzahl("id");
if($_GET["id"] && !$_GET["date"]) $datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : "";
{
$termin=maketerminarray($dbconn, $_GET["id"]);
$adresse=maketerminadresse($dbconn, $_GET["id"]);
$telnrn=maketelnrn($dbconn,$_GET["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
}
elseif($_GET["date"])
{
$qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC");
if($_GET["type"]="singlepages")
{
$prevpage=0;
while($res=mysqli_fetch_assoc($qry))
{
if($prevpage)
$pdf->addpage();
$prevpage=1;
$termin=maketerminarray($dbconn, $res["id"]);
$adresse=maketerminadresse($dbconn, $res["id"]);
$telnrn=maketelnrn($dbconn,$res["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
}
}
}
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
$smarty->assign("pdffile","./temp/pdftemp/$tmppdfname.pdf");
$pdf = makerawPDFanfahrt(0); $ids = array();
if($_GET["id"] && !$_GET["date"]) if($terminid && !$datum)
$ids[] = $terminid;
elseif($datum)
{ {
$termin=maketerminarray($dbconn, $_GET["id"]); $zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum));
$adresse=maketerminadresse($dbconn, $_GET["id"]); foreach((array)$zeilen as $z)
$googleadresse=makegooglestring($dbconn, $_GET["id"]); $ids[] = $z["id"];
$telnrn=maketelnrn($dbconn,$_GET["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
} }
elseif($_GET["date"])
{
$qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC");
if($_GET["type"]="singlepages")
{
$prevpage=0;
while($res=mysqli_fetch_assoc($qry))
{
if($prevpage)
$pdf->addpage();
$prevpage=1;
$termin=maketerminarray($dbconn, $res["id"]);
$adresse=maketerminadresse($dbconn, $res["id"]);
$googleadresse=makegooglestring($dbconn,$res["id"]);
$telnrn=maketelnrn($dbconn,$res["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
}
}
}
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
$smarty->assign("pdffile2","./temp/pdftemp/$tmppdfname.pdf");
/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */
function terminzettel($dbconn, $ids, $anfahrt)
{
$pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0);
$erste = true;
foreach($ids as $id)
{
if(!$erste)
$pdf->addpage();
$erste = false;
$googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : "";
makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id),
maketelnrn($dbconn, $id), $anfahrt, $googleadresse);
}
$name = str_replace(array(" ", "."), array("_", "_"), microtime());
savePDF($pdf, "./temp/pdftemp/$name.pdf");
return "./temp/pdftemp/$name.pdf";
}
$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0));
$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1));
$smarty->display("terminshow.tpl"); $smarty->display("terminshow.tpl");
?>
?>
+3 -15
View File
@@ -6,21 +6,9 @@ $kdnres=makeadressarray($dbconn, $_GET["adressid"]);
if($kdnres["partner_id"]) if($kdnres["partner_id"])
{ {
$kdnres["adressid"] = $_GET["adressid"]; $kdnres["adressid"] = $_GET["adressid"];
$typnames=array(); list($anrs, $titels) = anredenUndTitel($dbconn);
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede"); $smarty->assign("anrs",$anrs);
while($res=mysqli_fetch_assoc($qry)) $smarty->assign("titels",$titels);
{
$typnames[$res["id"]] = $res["anrede"];
}
$smarty->assign("anrs",$typnames);
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["titel"];
}
$smarty->assign("titels",$typnames);
$smarty->assign("adresse",$kdnres); $smarty->assign("adresse",$kdnres);
$smarty->display("umschlagshow.tpl"); $smarty->display("umschlagshow.tpl");
+12 -8
View File
@@ -2,7 +2,12 @@
if(isset($_GET["id"]) && isset($_GET["addKey"])){ if(isset($_GET["id"]) && isset($_GET["addKey"])){
if (checkAdduser($_GET["addUser"])) { if (checkAdduser()) {
// Freigabe einlösen: gilt 5 Minuten, nur für diesen Benutzer und nur
// in dieser Session (geprüft in authServer.php). Der addKey ist damit
// verbraucht.
$_SESSION["passkey_freigabe"] = array("user" => (int)$_GET["id"], "bis" => time() + 300);
db_abfrage($mysql, "DELETE FROM addKey WHERE accesskey = ?", array((int)$_GET["addKey"]));
echo <<<ENDE echo <<<ENDE
<html> <html>
<head></head> <head></head>
@@ -73,15 +78,14 @@ if(isset($_GET["id"]) && isset($_GET["addKey"])){
$smarty->assign("heading","Passkeys für externen Zugang verwalten"); $smarty->assign("heading","Passkeys für externen Zugang verwalten");
$smarty->display("heading.tpl"); $smarty->display("heading.tpl");
$qry = mysqli_query($_SESSION["dbconn"],"SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"])); $row = db_zeile($dbconn, "SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ?", array($_GET["id"]));
$row=mysqli_fetch_array($qry); if($row === false)
die("Datenbank fehler: ".mysqli_error($dbconn));
$smarty->assign("user",$row); $smarty->assign("user",$row);
$qry = mysqli_query($_SESSION["dbconn"],"SELECT passkeys.id , passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"])); $keys = db_zeilen($dbconn, "SELECT passkeys.id, passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ?", array($_GET["id"]));
$keys = array(); if($keys === false)
while($row=mysqli_fetch_array($qry)){ die("Datenbank fehler: ".mysqli_error($dbconn));
$keys[] = $row;
}
$smarty->assign("keys",$keys); $smarty->assign("keys",$keys);
$smarty->assign("local",isLocal()); $smarty->assign("local",isLocal());
$smarty->display("userkeys.tpl"); $smarty->display("userkeys.tpl");
+9 -2
View File
@@ -1,4 +1,12 @@
<?php <?php
require_once("incs/constants.php");
session_name(SESSION_NAME);
session_start();
if((($_SESSION["login"] ?? "") !== "valid"))
{
http_response_code(403);
exit("Nicht angemeldet.");
}
error_reporting(E_ERROR | E_WARNING | E_PARSE); error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Standard inclusions // Standard inclusions
@@ -9,8 +17,7 @@
// Zugang zur Statistik-Datenbank steht in der externen Config // Zugang zur Statistik-Datenbank steht in der externen Config
require_once("incs/settings.php"); require_once("incs/settings.php");
readsettings(); readsettings();
$dbconn = mysqli_connect($stats_mysql_server, $stats_mysql_user, $stats_mysql_pw) or die("Keine Verbindung zur Statistik-Datenbank."); $dbconn = db_verbinden($stats_mysql_server, $stats_mysql_user, $stats_mysql_pw, $stats_mysql_db) or die("Keine Verbindung zur Statistik-Datenbank.");
mysqli_select_db($dbconn, $stats_mysql_db);
$qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn)); $qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn));
// Dataset definition // Dataset definition
+138 -138
View File
@@ -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}
@@ -23,72 +23,72 @@
{elseif $type == 6} {elseif $type == 6}
{$typename="Mahnung"} {$typename="Mahnung"}
{/if} {/if}
<h2>{$typename} {$headstr}:</h2> <h2>{$typename|escape} {$headstr|escape}:</h2>
<form action="?action=rechnungadd&formsent=1&id={$loadrech}" name="mainform" id='rechnform' method='POST'> <form action="?action=rechnungadd&formsent=1&id={$loadrech|escape}" name="mainform" id='rechnform' method='POST'>
<input type="hidden" name="type" value="{$type|escape}" /> <input type="hidden" name="type" value="{$type|escape}" />
<input type="hidden" name="adressid" value="{$adresse.id|escape}" /> <input type="hidden" name="adressid" value="{$adresse.id|escape}" />
<input type="hidden" name="partnerid" value="{$adresse.partner_id|escape}" /> <input type="hidden" name="partnerid" value="{$adresse.partner_id|escape}" />
<fieldset class='nolim'> <fieldset class='nolim'>
<legend>{$typename} an <a href="?action=kundenshow&id={$adresse.partner_id}">Kunde {$adresse.partner_id}</a></legend> <legend>{$typename|escape} an <a href="?action=kundenshow&id={$adresse.partner_id|escape}">Kunde {$adresse.partner_id|escape}</a></legend>
{if $adresse.firma} {if $adresse.firma}
<label class='checktext'><input type="checkbox" name="show_firmaanr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMAANR:1 || $rechnung.adressfields==0}checked="checked"{/if} />Firma</label> <label class='checktext'><input type="checkbox" name="show_firmaanr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMAANR:1 || $rechnung.adressfields==0}checked="checked"{/if} />Firma</label>
<label class='checktext'><input type="checkbox" name="show_firma" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMA:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.firma}</label> <label class='checktext'><input type="checkbox" name="show_firma" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMA:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.firma|escape}</label>
{/if} {/if}
{if $adresse.anrede_id > 1} {if $adresse.anrede_id > 1}
<label class='checktext'><input type="checkbox" name="show_anr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede_id}}</label> <label class='checktext'><input type="checkbox" name="show_anr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede_id}|escape}</label>
{/if} {/if}
{if $adresse.titel_id > 1} {if $adresse.titel_id > 1}
<label class='checktext'><input type="checkbox" name="show_titel" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel_id}}</label> <label class='checktext'><input type="checkbox" name="show_titel" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel_id}|escape}</label>
{/if} {/if}
{if $adresse.vname || $adresse.nname} {if $adresse.vname || $adresse.nname}
<label class='checktext'><input type="checkbox" name="show_name" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname} {$adresse.nname}</label> <label class='checktext'><input type="checkbox" name="show_name" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname|escape} {$adresse.nname|escape}</label>
{/if} {/if}
<br /> <br />
{if $adresse.anrede2_id > 1} {if $adresse.anrede2_id > 1}
<label class='checktext'><input type="checkbox" name="show_anr2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede2_id}}</label> <label class='checktext'><input type="checkbox" name="show_anr2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede2_id}|escape}</label>
{/if} {/if}
{if $adresse.titel2_id > 1} {if $adresse.titel2_id > 1}
<label class='checktext'><input type="checkbox" name="show_titel2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel2_id}}</label> <label class='checktext'><input type="checkbox" name="show_titel2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel2_id}|escape}</label>
{/if} {/if}
{if $adresse.vname2 || $adresse.nname2} {if $adresse.vname2 || $adresse.nname2}
<label class='checktext'><input type="checkbox" name="show_name2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname2} {$adresse.nname2}</label> <label class='checktext'><input type="checkbox" name="show_name2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname2|escape} {$adresse.nname2|escape}</label>
{/if} {/if}
{if $adresse.str} {if $adresse.str}
<label class='checktext'><input type="checkbox" name="show_str" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_STR:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.str} {$adresse.hnr}</label> <label class='checktext'><input type="checkbox" name="show_str" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_STR:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.str|escape} {$adresse.hnr|escape}</label>
{/if} {/if}
{if $adresse.plz || $adresse.ort} {if $adresse.plz || $adresse.ort}
<label class='checktext'><input type="checkbox" name="show_ort" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ORT:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.plz} {$adresse.ort} <label class='checktext'><input type="checkbox" name="show_ort" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ORT:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.plz|escape} {$adresse.ort|escape}
{/if} {/if}
{if $adresse.ortsteil} {if $adresse.ortsteil}
- {$adresse.ortsteil} - {$adresse.ortsteil|escape}
{/if} {/if}
{if $adresse.plz || $adresse.ort} {if $adresse.plz || $adresse.ort}
</label> </label>
{/if} {/if}
{if $adresse.land} {if $adresse.land}
<label class='checktext'><input type="checkbox" name="show_land" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_LAND:1}checked="checked"{/if} />{$adresse.land}</label> <label class='checktext'><input type="checkbox" name="show_land" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_LAND:1}checked="checked"{/if} />{$adresse.land|escape}</label>
{/if} {/if}
{if $adresse.zusatz} {if $adresse.zusatz}
<label class='checktext'><input type="checkbox" name="show_zusatz" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ZUSATZ:1}checked="checked"{/if} />{$adresse.zusatz|truncate:60:"...":false}</label> <label class='checktext'><input type="checkbox" name="show_zusatz" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ZUSATZ:1}checked="checked"{/if} />{$adresse.zusatz|truncate:60:"...":false|escape}</label>
{/if} {/if}
<br /> <br />
<label>Adresserweiterung: </label><input name="adresserweiterung" value="{$rechnung.adresserweiterung}" /> <label>Adresserweiterung: </label><input name="adresserweiterung" value="{$rechnung.adresserweiterung|escape}" />
<br /> <br />
<p> <p>
<label>Währung:</label> <label>Währung:</label>
<select name='wahrung'> <select name='wahrung'>
{html_options values=$wahrids output=$wahrs selected="{$rechnung.wahrung_id|default:1}"} {html_options values=$wahrids output=$wahrs selected="{$rechnung.wahrung_id|default:1|escape}"}
</select><br /> </select><br />
<label>Mehrwertsteuer:</label> <label>Mehrwertsteuer:</label>
<select name='mwst'> <select name='mwst'>
{html_options values=$mwstids output=$mwsts selected="{$rechnung.mwst_id|default:2}"} {html_options values=$mwstids output=$mwsts selected="{$rechnung.mwst_id|default:2|escape}"}
</select> </select>
<br /> <br />
{if $type == 1} {if $type == 1}
<label>Zahlungsziel:</label> <label>Zahlungsziel:</label>
<select name='zahlziel'> <select name='zahlziel'>
{html_options values=$zzielids output=$zziels selected="{$rechnung.zahlziel_id|default:2}"} {html_options values=$zzielids output=$zziels selected="{$rechnung.zahlziel_id|default:2|escape}"}
</select> </select>
{else} {else}
<input type='hidden' name='zahlziel' value='1'> <input type='hidden' name='zahlziel' value='1'>
@@ -100,10 +100,10 @@
<div class="leftalign"> <div class="leftalign">
<br /> <br />
<label>Rabatt:</label> <label>Rabatt:</label>
<input name='rabatt' id='rabatt' maxlength='3' pattern="[0-9]{ldelim}0,3{rdelim}" value="{$rechnung.rabatt}" /><b>%</b> <input name='rabatt' id='rabatt' maxlength='3' pattern="[0-9]{ldelim}0,3{rdelim}" value="{$rechnung.rabatt|escape}" /><b>%</b>
<br /> <br />
<label>Rabatt Beschreibung:</label> <label>Rabatt Beschreibung:</label>
<input name='rabattdesc' id='rabattdesc' maxlength='100' value="{$rechnung.rabattdesc}" /> <input name='rabattdesc' id='rabattdesc' maxlength='100' value="{$rechnung.rabattdesc|escape}" />
</div> </div>
{/if} {/if}
@@ -114,71 +114,71 @@
<p> <p>
<br /> <br />
<label>Anrede:</label> <label>Anrede:</label>
{if $anrs.{$adresse.anrede_id} == "Herrn" || $anrs.{$adresse.anrede_id} == "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}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
{elseif $anrs.{$adresse.anrede2_id} == "Herrn" || $anrs.{$adresse.anrede_id} == "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}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
{elseif $anrs.{$adresse.anrede_id} == "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}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
{elseif $anrs.{$adresse.anrede2_id} == "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}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
@@ -187,37 +187,37 @@
{/if} {/if}
<label>Zweite Anrede:</label> <label>Zweite Anrede:</label>
{if $anrs.{$adresse.anrede_id} == "Frau" && $anrs.{$adresse.anrede2_id} == "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}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr2' maxlength='150' name='anr2' /><br /> ' id='anr2' maxlength='150' name='anr2' /><br />
{/strip} {/strip}
{elseif $anrs.{$adresse.anrede2_id} == "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}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr2' maxlength='150' name='anr2' /><br /> ' id='anr2' maxlength='150' name='anr2' /><br />
{/strip} {/strip}
@@ -226,22 +226,22 @@
{/if} {/if}
<label class='artlabel'>{if $type != 5}Einleitungstext{else}Text{/if}:</label><br /> <label class='artlabel'>{if $type != 5}Einleitungstext{else}Text{/if}:</label><br />
<center><textarea name='intro' id='intro' {if $type == 5}class='tinymce'{else}class='bigtextarea'{/if}>{$rechnung.intro} <center><textarea name='intro' id='intro' {if $type == 5}class='tinymce'{else}class='bigtextarea'{/if}>{$rechnung.intro|escape}
{if $newtype == 6}Leider haben wir bis zum heutigen Tag noch keinen vollständigen Zahlungseingang zur Rechnung Nr. {$rechnung.drechnr} erhalten. Deshalb bitten wir Sie, den fehlenden Betrag bis zum angegeben Zahlungsziel auf unser Konto zu überweisen.{/if} {if $newtype == 6}Leider haben wir bis zum heutigen Tag noch keinen vollständigen Zahlungseingang zur Rechnung Nr. {$rechnung.drechnr|escape} erhalten. Deshalb bitten wir Sie, den fehlenden Betrag bis zum angegeben Zahlungsziel auf unser Konto zu überweisen.{/if}
</textarea></center> </textarea></center>
</p> </p>
{/if} {/if}
{if $type == 1} {if $type == 1}
{if $smarty.session.firma == "Wagner Markisen"} {if $smarty.session.firma == "Wagner Markisen"}
<label>Lieferdatum:</label><input value='{$rechnung.lieferdatum|default:"Lieferdatum ist gleich Rechnungsdatum"}' id='lieferdatum' maxlength='100' name='lieferdatum' /><br /> <label>Lieferdatum:</label><input value='{$rechnung.lieferdatum|default:"Lieferdatum ist gleich Rechnungsdatum"|escape}' id='lieferdatum' maxlength='100' name='lieferdatum' /><br />
{else} {else}
<label>Lieferdatum:</label><input value='{$rechnung.lieferdatum|default:""}' id='lieferdatum' maxlength='100' name='lieferdatum' /><br /> <label>Lieferdatum:</label><input value='{$rechnung.lieferdatum|default:""|escape}' id='lieferdatum' maxlength='100' name='lieferdatum' /><br />
{/if} {/if}
{/if} {/if}
{if $type == 1} {if $type == 1}
<label>Buchungskonto:</label> <label>Buchungskonto:</label>
<select name='buchKto'> <select name='buchKto'>
{html_options values=$buchKtoids output=$buchKtos selected="{$rechnung.buchungsKto_id|default:1}"} {html_options values=$buchKtoids output=$buchKtos selected="{$rechnung.buchungsKto_id|default:1|escape}"}
</select> </select>
{else} {else}
<input type='hidden' name='buchKto' value='1'> <input type='hidden' name='buchKto' value='1'>
@@ -264,30 +264,30 @@
<button type="button" class='swart' onclick="swart({$artnr|escape});"></button> <button type="button" class='swart' onclick="swart({$artnr|escape});"></button>
{/if} {/if}
{if $type == 3} {if $type == 3}
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="1angtyp{$artnr}" value="1" {if $art.art.angtyp == 1}checked="checked"{/if} />Normal</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="1angtyp{$artnr|escape}" value="1" {if $art.art.angtyp == 1}checked="checked"{/if} />Normal</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="2angtyp{$artnr}" value="2" {if $art.art.angtyp == 2}checked="checked"{/if} />Optional</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="2angtyp{$artnr|escape}" value="2" {if $art.art.angtyp == 2}checked="checked"{/if} />Optional</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="3angtyp{$artnr}" value="3" {if $art.art.angtyp == 3}checked="checked"{/if} />Alternativ</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="3angtyp{$artnr|escape}" value="3" {if $art.art.angtyp == 3}checked="checked"{/if} />Alternativ</label><br />
{else} {else}
<input type="hidden" name="angtyp{$artnr}" id="1angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="1angtyp{$artnr|escape}" value="1" />
<input type="hidden" name="angtyp{$artnr}" id="2angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="2angtyp{$artnr|escape}" value="1" />
<input type="hidden" name="angtyp{$artnr}" id="3angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="3angtyp{$artnr|escape}" value="1" />
{/if} {/if}
</td> </td>
<td> <td>
{if $art.art.pagebreak} {if $art.art.pagebreak}
<button type="button" class='pagebreak' id='pagebreakimg{$artnr}' onclick="togglePageBreak({$artnr});" title='<b>Manueller Seitenumbruch</b><br />Durch klick wird der erzwungene Seitenumbruch an dieser Stelle entfernt.'></button> <button type="button" class='pagebreak' id='pagebreakimg{$artnr|escape}' onclick="togglePageBreak({$artnr|escape});" title='<b>Manueller Seitenumbruch</b><br />Durch klick wird der erzwungene Seitenumbruch an dieser Stelle entfernt.'></button>
<input type='hidden' id='pagebreak{$artnr}' name='pagebreak{$artnr}' value='1' /> <input type='hidden' id='pagebreak{$artnr|escape}' name='pagebreak{$artnr|escape}' value='1' />
{else} {else}
<button type="button" class='nopagebreak' id='pagebreakimg{$artnr}' onclick="togglePageBreak({$artnr});" title='<b>Automatischer Seitenumbruch</b><br />Durch klick wird eine neue Seite an dieser Stelle Erzwungen'></button> <button type="button" class='nopagebreak' id='pagebreakimg{$artnr|escape}' onclick="togglePageBreak({$artnr|escape});" title='<b>Automatischer Seitenumbruch</b><br />Durch klick wird eine neue Seite an dieser Stelle Erzwungen'></button>
<input type='hidden' id='pagebreak{$artnr}' name='pagebreak{$artnr}' value='' /> <input type='hidden' id='pagebreak{$artnr|escape}' name='pagebreak{$artnr|escape}' value='' />
{/if} {/if}
<label class='checktext'><input type="checkbox" class="artcheck" name="artact{$artnr}" id="artact{$artnr}" value="1" checked="checked" onclick="artactivate({$artnr|escape})" title='Ohne Haken wird dieser Artikel nicht angezeigt und nicht gespeichert' />Aktiv</label><br /> <label class='checktext'><input type="checkbox" class="artcheck" name="artact{$artnr|escape}" id="artact{$artnr|escape}" value="1" checked="checked" onclick="artactivate({$artnr|escape})" title='Ohne Haken wird dieser Artikel nicht angezeigt und nicht gespeichert' />Aktiv</label><br />
<label class='artlabel'>Artikeltyp:</label><select class='artselect' name='arttyp{$artnr}' id='arttyp{$artnr}'> <label class='artlabel'>Artikeltyp:</label><select class='artselect' name='arttyp{$artnr|escape}' id='arttyp{$artnr|escape}'>
{html_options values=$typids output=$typs selected="{$art.art.typ_id}"} {html_options values=$typids output=$typs selected="{$art.art.typ_id|escape}"}
</select><br /> </select><br />
<label class='artlabel'>Artikelbeschreibung:</label><br /> <label class='artlabel'>Artikelbeschreibung:</label><br />
<input class='art' value='{$art.art.bezeichn|escape}' id='arthead{$artnr}' maxlength='50' name='arthead{$artnr}' onInput='addArtBlock({$type|escape},{$artnr});' /><br /> <input class='art' value='{$art.art.bezeichn|escape}' id='arthead{$artnr|escape}' maxlength='50' name='arthead{$artnr|escape}' onInput='addArtBlock({$type|escape},{$artnr|escape});' /><br />
<div id='arteig{$artnr}'> <div id='arteig{$artnr|escape}'>
{$eignr = 0} {$eignr = 0}
{foreach $art.eig as $eigensch} {foreach $art.eig as $eigensch}
{$eignr = $eignr+1} {$eignr = $eignr+1}
@@ -295,12 +295,12 @@
<div class="sweig_spacer"></div> <div class="sweig_spacer"></div>
{else} {else}
<br /> <br />
<button type="button" class='sweig' onclick="sweig({$artnr},{$eignr});"></button> <button type="button" class='sweig' onclick="sweig({$artnr|escape},{$eignr|escape});"></button>
{/if} {/if}
<input class='arteig' value='{$eigensch.bezeichn|escape}' id='arteig{$artnr}_{$eignr}' maxlength='100' name='arteig{$artnr}_{$eignr}' onChange='addEigBlock({$artnr},{$eignr});' /> <input class='arteig' value='{$eigensch.bezeichn|escape}' id='arteig{$artnr|escape}_{$eignr|escape}' maxlength='100' name='arteig{$artnr|escape}_{$eignr|escape}' onChange='addEigBlock({$artnr|escape},{$eignr|escape});' />
<input class='artval' value='{$eigensch.wert|escape}' id='artval{$artnr}_{$eignr}' maxlength='50' name='artval{$artnr}_{$eignr}' /> <input class='artval' value='{$eigensch.wert|escape}' id='artval{$artnr|escape}_{$eignr|escape}' maxlength='50' name='artval{$artnr|escape}_{$eignr|escape}' />
<select name='arteinh{$artnr}_{$eignr}' id='arteinh{$artnr}_{$eignr}' class='arteinh'> <select name='arteinh{$artnr|escape}_{$eignr|escape}' id='arteinh{$artnr|escape}_{$eignr|escape}' class='arteinh'>
{html_options values=$einhids output=$einhs selected="{$eigensch.einheit_id}"} {html_options values=$einhids output=$einhs selected="{$eigensch.einheit_id|escape}"}
</select> </select>
{/foreach} {/foreach}
{$eignr = $eignr+1} {$eignr = $eignr+1}
@@ -308,50 +308,50 @@
<div class="sweig_spacer"></div> <div class="sweig_spacer"></div>
{else} {else}
<br /> <br />
<button type="button" class='sweig' onclick="sweig({$artnr},{$eignr});"></button> <button type="button" class='sweig' onclick="sweig({$artnr|escape},{$eignr|escape});"></button>
{/if} {/if}
<input class='arteig' value='' id='arteig{$artnr}_{$eignr}' maxlength='100' name='arteig{$artnr}_{$eignr}' onChange='addEigBlock({$artnr},{$eignr});' /> <input class='arteig' value='' id='arteig{$artnr|escape}_{$eignr|escape}' maxlength='100' name='arteig{$artnr|escape}_{$eignr|escape}' onChange='addEigBlock({$artnr|escape},{$eignr|escape});' />
<input class='artval' value='' id='artval{$artnr}_{$eignr}' maxlength='50' name='artval{$artnr}_{$eignr}' /> <input class='artval' value='' id='artval{$artnr|escape}_{$eignr|escape}' maxlength='50' name='artval{$artnr|escape}_{$eignr|escape}' />
<select name='arteinh{$artnr}_{$eignr}' id='arteinh{$artnr}_{$eignr}' class='arteinh'> <select name='arteinh{$artnr|escape}_{$eignr|escape}' id='arteinh{$artnr|escape}_{$eignr|escape}' class='arteinh'>
{html_options values=$einhids output=$einhs selected="1"} {html_options values=$einhids output=$einhs selected="1"}
</select> </select>
</div> </div>
<p> <p>
<label class='artlabel'>Bestellnummer (WA-Nr.):</label><br /> <label class='artlabel'>Bestellnummer (WA-Nr.):</label><br />
<input class='artwa' value='{$art.art.wanr}' id='artwa{$artnr}' maxlength='50' name='artwa{$artnr}' /> <input class='artwa' value='{$art.art.wanr|escape}' id='artwa{$artnr|escape}' maxlength='50' name='artwa{$artnr|escape}' />
<label>Mwst:</label> <label>Mwst:</label>
<select name='artmwst{$artnr}' id='artmwst{$artnr}' class='arteinh'> <select name='artmwst{$artnr|escape}' id='artmwst{$artnr|escape}' class='arteinh'>
{html_options values=$artmwstids output=$artmwsts selected="{$art.art.mwst_id|default:1}"} {html_options values=$artmwstids output=$artmwsts selected="{$art.art.mwst_id|default:1|escape}"}
</select> </select>
</p> </p>
</td> </td>
<td class="pricetd"> <td class="pricetd">
<label class='artlabel'>Menge:</label><br /> <label class='artlabel'>Menge:</label><br />
<input class='artmen' value='{$art.art.menge|replace:".":","}' id='artmen{$artnr}' maxlength='7' pattern="\d{ldelim}0,3{rdelim}(,\d{ldelim}0,3{rdelim})?" name='artmen{$artnr}' /> <input class='artmen' value='{$art.art.menge|replace:".":","|escape}' id='artmen{$artnr|escape}' maxlength='7' pattern="\d{ldelim}0,3{rdelim}(,\d{ldelim}0,3{rdelim})?" name='artmen{$artnr|escape}' />
<select name='artmeneinh{$artnr}' id='artmeneinh{$artnr}' class='artmeneinh'> <select name='artmeneinh{$artnr|escape}' id='artmeneinh{$artnr|escape}' class='artmeneinh'>
{html_options values=$einhids output=$einhs selected="{$art.art.einheit_id}"} {html_options values=$einhids output=$einhs selected="{$art.art.einheit_id|escape}"}
</select><br /> </select><br />
<label class='artlabel'>Preis:</label><br /> <label class='artlabel'>Preis:</label><br />
<input class='artpr' value='{$art.art.preis|replace:".":","}' id='artpr{$artnr}' pattern="-?\d+(,\d{ldelim}2{rdelim})?" name='artpr{$artnr}' /><br /> <input class='artpr' value='{$art.art.preis|replace:".":","|escape}' id='artpr{$artnr|escape}' pattern="-?\d+(,\d{ldelim}2{rdelim})?" name='artpr{$artnr|escape}' /><br />
<label class='artlabel'>Rabatt:</label><br /> <label class='artlabel'>Rabatt:</label><br />
<input class='artpr' value='{$art.art.rabatt}' id='artrab{$artnr}' maxlength='3' pattern="[0-9]*" name='artrab{$artnr}' /><b>%</b> <input class='artpr' value='{$art.art.rabatt|escape}' id='artrab{$artnr|escape}' maxlength='3' pattern="[0-9]*" name='artrab{$artnr|escape}' /><b>%</b>
<label class='checktext'><input type="checkbox" name="artrabtyp{$artnr}" id="artrabtyp{$artnr}" value="1" {if $art.art.rabatttyp} checked='checked'{/if} />Winterrabatt</label> <label class='checktext'><input type="checkbox" name="artrabtyp{$artnr|escape}" id="artrabtyp{$artnr|escape}" value="1" {if $art.art.rabatttyp} checked='checked'{/if} />Winterrabatt</label>
<br /> <br />
</td> </td>
</tr> </tr>
<script> <script>
$(function() { $(function() {
$( "#arthead{$artnr}" ).autocomplete({ $( "#arthead{$artnr|escape}" ).autocomplete({
source: "ajax/auto/art.php", source: "ajax/auto/art.php",
minLength: 2, minLength: 2,
select: function( event, ui ) { select: function( event, ui ) {
i=0; i=0;
$("#arthead{$artnr}").val(ui.item.value); $("#arthead{$artnr|escape}").val(ui.item.value);
$("#artpr{$artnr}").val(ui.item.preis); $("#artpr{$artnr|escape}").val(ui.item.preis);
$("#arttyp{$artnr}").val(ui.item.typ); $("#arttyp{$artnr|escape}").val(ui.item.typ);
$("#artmeneinh{$artnr}").val(ui.item.einh); $("#artmeneinh{$artnr|escape}").val(ui.item.einh);
cleareig({$artnr}); cleareig({$artnr|escape});
i=0; i=0;
if(ui.item.eig) if(ui.item.eig)
{ {
@@ -359,9 +359,9 @@
{ {
i++; i++;
addEigBlock(1,i); addEigBlock(1,i);
$("#arteig{$artnr}_"+i).val(value.des); $("#arteig{$artnr|escape}_"+i).val(value.des);
$("#artval{$artnr}_"+i).val(value.val); $("#artval{$artnr|escape}_"+i).val(value.val);
$("#arteinh{$artnr}_"+i).val(value.einh); $("#arteinh{$artnr|escape}_"+i).val(value.einh);
}); });
} }
return false; return false;
@@ -378,71 +378,71 @@
<button type="button" class='swart' onclick="swart({$artnr|escape});"></button> <button type="button" class='swart' onclick="swart({$artnr|escape});"></button>
{/if} {/if}
{if $type == 3 || $type == 5} {if $type == 3 || $type == 5}
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="1angtyp{$artnr}" value="1" />Normal</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="1angtyp{$artnr|escape}" value="1" />Normal</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="2angtyp{$artnr}" value="2" />Optional</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="2angtyp{$artnr|escape}" value="2" />Optional</label><br />
<label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr}" id="3angtyp{$artnr}" value="3" />Alternativ</label><br /> <label class='artlabel'><input type="radio" class="artcheck" name="angtyp{$artnr|escape}" id="3angtyp{$artnr|escape}" value="3" />Alternativ</label><br />
{else} {else}
<input type="hidden" name="angtyp{$artnr}" id="1angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="1angtyp{$artnr|escape}" value="1" />
<input type="hidden" name="angtyp{$artnr}" id="2angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="2angtyp{$artnr|escape}" value="1" />
<input type="hidden" name="angtyp{$artnr}" id="3angtyp{$artnr}" value="1" /> <input type="hidden" name="angtyp{$artnr|escape}" id="3angtyp{$artnr|escape}" value="1" />
{/if} {/if}
</td> </td>
<td> <td>
<button type="button" class='nopagebreak' id='pagebreakimg{$artnr}' onclick="togglePageBreak({$artnr});" title='<b>Automatischer Seitenumbruch</b><br />Durch klick wird eine neue Seite an dieser Stelle Erzwungen'></button> <button type="button" class='nopagebreak' id='pagebreakimg{$artnr|escape}' onclick="togglePageBreak({$artnr|escape});" title='<b>Automatischer Seitenumbruch</b><br />Durch klick wird eine neue Seite an dieser Stelle Erzwungen'></button>
<input type='hidden' id='pagebreak{$artnr}' name='pagebreak{$artnr}' value='' /> <input type='hidden' id='pagebreak{$artnr|escape}' name='pagebreak{$artnr|escape}' value='' />
<label class='checktext'><input type="checkbox" class="artcheck" name="artact{$artnr}" id="artact{$artnr}" value="1" checked="checked" onclick="artactivate({$artnr|escape})" title='Ohne Haken wird dieser Artikel nicht angezeigt und nicht gespeichert' />Aktiv</label><br /> <label class='checktext'><input type="checkbox" class="artcheck" name="artact{$artnr|escape}" id="artact{$artnr|escape}" value="1" checked="checked" onclick="artactivate({$artnr|escape})" title='Ohne Haken wird dieser Artikel nicht angezeigt und nicht gespeichert' />Aktiv</label><br />
<label class='artlabel'>Artikeltyp:</label><select class='artselect' name='arttyp{$artnr}' id='arttyp{$artnr}'> <label class='artlabel'>Artikeltyp:</label><select class='artselect' name='arttyp{$artnr|escape}' id='arttyp{$artnr|escape}'>
{html_options values=$typids output=$typs selected="1"} {html_options values=$typids output=$typs selected="1"}
</select><br /> </select><br />
<label class='artlabel'>Artikelbeschreibung:</label><br /> <label class='artlabel'>Artikelbeschreibung:</label><br />
<input class='art' value='' id='arthead{$artnr}' maxlength='50' name='arthead{$artnr}' onInput='addArtBlock({$type|escape},{$artnr});' /><br /> <input class='art' value='' id='arthead{$artnr|escape}' maxlength='50' name='arthead{$artnr|escape}' onInput='addArtBlock({$type|escape},{$artnr|escape});' /><br />
<div id='arteig{$artnr}'> <div id='arteig{$artnr|escape}'>
{$eignr = 1} {$eignr = 1}
<div class="sweig_spacer"></div> <div class="sweig_spacer"></div>
<input class='arteig' value='' id='arteig{$artnr}_{$eignr}' maxlength='100' name='arteig{$artnr}_{$eignr}' onChange='addEigBlock({$artnr},{$eignr});' /> <input class='arteig' value='' id='arteig{$artnr|escape}_{$eignr|escape}' maxlength='100' name='arteig{$artnr|escape}_{$eignr|escape}' onChange='addEigBlock({$artnr|escape},{$eignr|escape});' />
<input class='artval' value='' id='artval{$artnr}_{$eignr}' maxlength='50' name='artval{$artnr}_{$eignr}' /> <input class='artval' value='' id='artval{$artnr|escape}_{$eignr|escape}' maxlength='50' name='artval{$artnr|escape}_{$eignr|escape}' />
<select name='arteinh{$artnr}_{$eignr}' id='arteinh{$artnr}_{$eignr}' class='arteinh'> <select name='arteinh{$artnr|escape}_{$eignr|escape}' id='arteinh{$artnr|escape}_{$eignr|escape}' class='arteinh'>
{html_options values=$einhids output=$einhs selected="1"} {html_options values=$einhids output=$einhs selected="1"}
</select> </select>
</div> </div>
<p> <p>
<label class='artlabel'>Bestellnummer (WA-Nr.):</label><br /> <label class='artlabel'>Bestellnummer (WA-Nr.):</label><br />
<input class='artwa' value='' id='artwa{$artnr}' maxlength='50' name='artwa{$artnr}' /> <input class='artwa' value='' id='artwa{$artnr|escape}' maxlength='50' name='artwa{$artnr|escape}' />
<label>Mwst:</label> <label>Mwst:</label>
<select name='artmwst{$artnr}' id='artmwst{$artnr}' class='arteinh'> <select name='artmwst{$artnr|escape}' id='artmwst{$artnr|escape}' class='arteinh'>
{html_options values=$artmwstids output=$artmwsts selected="{$art.art.mwst_id|default:1}"} {html_options values=$artmwstids output=$artmwsts selected="{$art.art.mwst_id|default:1|escape}"}
</select> </select>
</p> </p>
</td> </td>
<td class="pricetd"> <td class="pricetd">
<label class='artlabel'>Menge:</label><br /> <label class='artlabel'>Menge:</label><br />
<input class='artmen' value='' id='artmen{$artnr}' maxlength='7' pattern="\d{ldelim}0,3{rdelim}+(,\d{ldelim}0,3{rdelim})?" name='artmen{$artnr}' /> <input class='artmen' value='' id='artmen{$artnr|escape}' maxlength='7' pattern="\d{ldelim}0,3{rdelim}+(,\d{ldelim}0,3{rdelim})?" name='artmen{$artnr|escape}' />
<select name='artmeneinh{$artnr}' id='artmeneinh{$artnr}' class='artmeneinh'> <select name='artmeneinh{$artnr|escape}' id='artmeneinh{$artnr|escape}' class='artmeneinh'>
{html_options values=$einhids output=$einhs selected="5"} {html_options values=$einhids output=$einhs selected="5"}
</select><br /> </select><br />
<label class='artlabel'>Preis:</label><br /> <label class='artlabel'>Preis:</label><br />
<input class='artpr' value='' id='artpr{$artnr}' pattern="-?\d+(,\d{ldelim}2{rdelim})?" name='artpr{$artnr}' /><br /> <input class='artpr' value='' id='artpr{$artnr|escape}' pattern="-?\d+(,\d{ldelim}2{rdelim})?" name='artpr{$artnr|escape}' /><br />
<label class='artlabel'>Rabatt:</label><br /> <label class='artlabel'>Rabatt:</label><br />
<input class='artpr' value='' id='artrab{$artnr}' maxlength='3' pattern="[0-9]*" name='artrab{$artnr}' /><b>%</b> <input class='artpr' value='' id='artrab{$artnr|escape}' maxlength='3' pattern="[0-9]*" name='artrab{$artnr|escape}' /><b>%</b>
<label class='checktext'><input type="checkbox" name="artrabtyp{$artnr}" id="artrabtyp{$artnr}" value="1" />Winterrabatt</label> <label class='checktext'><input type="checkbox" name="artrabtyp{$artnr|escape}" id="artrabtyp{$artnr|escape}" value="1" />Winterrabatt</label>
<br /> <br />
</td> </td>
</tr> </tr>
<script> <script>
$(function() { $(function() {
$( "#arthead{$artnr}" ).autocomplete({ $( "#arthead{$artnr|escape}" ).autocomplete({
source: "ajax/auto/art.php", source: "ajax/auto/art.php",
minLength: 2, minLength: 2,
select: function( event, ui ) { select: function( event, ui ) {
i=0; i=0;
$("#arthead{$artnr}").val(ui.item.value); $("#arthead{$artnr|escape}").val(ui.item.value);
$("#artpr{$artnr}").val(ui.item.preis); $("#artpr{$artnr|escape}").val(ui.item.preis);
$("#arttyp{$artnr}").val(ui.item.typ); $("#arttyp{$artnr|escape}").val(ui.item.typ);
$("#artmeneinh{$artnr}").val(ui.item.einh); $("#artmeneinh{$artnr|escape}").val(ui.item.einh);
cleareig({$artnr}); cleareig({$artnr|escape});
i=0; i=0;
if(ui.item.eig) if(ui.item.eig)
{ {
@@ -450,9 +450,9 @@
{ {
i++; i++;
addEigBlock(1,i); addEigBlock(1,i);
$("#arteig{$artnr}_"+i).val(value.des); $("#arteig{$artnr|escape}_"+i).val(value.des);
$("#artval{$artnr}_"+i).val(value.val); $("#artval{$artnr|escape}_"+i).val(value.val);
$("#arteinh{$artnr}_"+i).val(value.einh); $("#arteinh{$artnr|escape}_"+i).val(value.einh);
}); });
} }
return false; return false;
@@ -470,11 +470,11 @@
<fieldset class='nolim'> <fieldset class='nolim'>
<legend>Rechnungsabschluss:</legend> <legend>Rechnungsabschluss:</legend>
<label class='artlabel'>Abschlusstext:</label><br /> <label class='artlabel'>Abschlusstext:</label><br />
<textarea class='bigtextarea' name='outro' id='outro' >{$rechnung.outro}</textarea> <textarea class='bigtextarea' name='outro' id='outro' >{$rechnung.outro|escape}</textarea>
{if $kommission} {if $kommission}
<p> <p>
<label>Kommission: </label> {$kommission.vname} {$kommission.nname} {$kommission.str} {$kommission.hnr}, {$kommission.plz} {$kommission.ort} <label>Kommission: </label> {$kommission.vname|escape} {$kommission.nname|escape} {$kommission.str|escape} {$kommission.hnr|escape}, {$kommission.plz|escape} {$kommission.ort|escape}
<input type='hidden' name='kommission' id='kommission' value='{$kommission.id}' /> <input type='hidden' name='kommission' id='kommission' value='{$kommission.id|escape}' />
</p> </p>
{/if} {/if}
<br /> <br />
@@ -503,7 +503,7 @@
{if $draft && $loaddraft == 0} {if $draft && $loaddraft == 0}
<script> <script>
askdraft("Sie haben {if $typename == "Angebot"}das{else if $typename == "Brief"}den{else}die{/if} zuletzt bearbeitete {$typename} nicht gespeichert.<br />{$draftname} ({$draftstr})<br />Möchten Sie daran nun weiter Arbeiten? Falls nein werden diese Daten gelöscht.",{$draft},{$type},{$draftadressid}); askdraft("Sie haben {if $typename == "Angebot"}das{else if $typename == "Brief"}den{else}die{/if} zuletzt bearbeitete {$typename|escape} nicht gespeichert.<br />{$draftname|escape} ({$draftstr|escape})<br />Möchten Sie daran nun weiter Arbeiten? Falls nein werden diese Daten gelöscht.",{$draft|escape},{$type|escape},{$draftadressid|escape});
</script> </script>
{else} {else}
<script> <script>
+3 -3
View File
@@ -5,7 +5,7 @@
{/if} {/if}
<h2>Termin für Kunde Nummer:</h2> <h2>Termin für Kunde Nummer:</h2>
<span class='big'>{$kunde.partner_id}</span><br /> <span class='big'>{$kunde.partner_id}</span><br />
{$kunde.vname} {$kunde.nname} {$kunde.firma}<br />{$kunde.str} {$kunde.hnr}<br />{$kunde.plz} {$kunde.ort} {$kunde.vname|escape} {$kunde.nname|escape} {$kunde.firma|escape}<br />{$kunde.str|escape} {$kunde.hnr|escape}<br />{$kunde.plz|escape} {$kunde.ort|escape}
{/if} {/if}
{if $user} {if $user}
{$termin.user = $user} {$termin.user = $user}
@@ -45,10 +45,10 @@
</select><br /> </select><br />
{/if} {/if}
<label>Beschreibung:</label> <label>Beschreibung:</label>
<input name='head' id='head' maxlength='100' value='{$termin.head}' /> <input name='head' id='head' maxlength='100' value='{$termin.head|escape}' />
<br /> <br />
<label kundeclass='artlabel'>Notizen:</label> <label kundeclass='artlabel'>Notizen:</label>
<textarea class='bigtextarea' id='text' name='text'>{$termin.text}</textarea><p> <textarea class='bigtextarea' id='text' name='text'>{$termin.text|escape}</textarea><p>
<label class='checktext'><input type="checkbox" id='done' name="done" value="1" {if $termin.done == 1}checked="checked"{/if} />Termin ist erledigt</label> <label class='checktext'><input type="checkbox" id='done' name="done" value="1" {if $termin.done == 1}checked="checked"{/if} />Termin ist erledigt</label>
</p> </p>
<br /> <br />
+15 -15
View File
@@ -50,9 +50,9 @@
{foreach $weekday.fulldaytermine as $key=>$termin} {foreach $weekday.fulldaytermine as $key=>$termin}
<a href='?action=terminshow&id={$termin.main_id}'> <a href='?action=terminshow&id={$termin.main_id}'>
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}' <div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift + $dayXpos}em;background-color: {$users.{$termin.user}.color};' style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift + $dayXpos}em;background-color: {$users.{$termin.user}.color|escape};'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'> title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
<span class='rotate' style='padding-top: {$shift}em;'>{$termin.typ|substr:0:3}.</span> <span class='rotate' style='padding-top: {$shift}em;'>{$termin.typ|substr:0:3|escape}.</span>
</div> </div>
</a> </a>
{$shift = $shift+1.1} {$shift = $shift+1.1}
@@ -107,19 +107,19 @@
{if {$termin.typ} != 'Arbeitsleistung'} {if {$termin.typ} != 'Arbeitsleistung'}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}' <div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {$users.{$termin.user}.color}' style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {$users.{$termin.user}.color|escape}'
title=' title='
{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br /> {$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br />
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if}
{if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br /> {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br />
<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br /> <b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />
Bei {$termin.vname} {$termin.nname} {$termin.firma}'> Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
{else} {else}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}' <div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color}{/if};' style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color|escape}{/if};'
title='{$termin.typ} - {$termin.firma} {$termin.vname} {$termin.nname}<br /> <b>{$termin.projectname}</b> <br /> {$termin.head}<br /> <b>Dauer: </b>{$termin.termdauer|string_format:"%.1f"}h'> title='{$termin.typ|escape} - {$termin.firma|escape} {$termin.vname|escape} {$termin.nname|escape}<br /> <b>{$termin.projectname|escape}</b> <br /> {$termin.head|escape}<br /> <b>Dauer: </b>{$termin.termdauer|string_format:"%.1f"}h'>
{/if} {/if}
<span class='rotate'>{$termin.typ|substr:0:3}.</span> <span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
</div> </div>
</a> </a>
{/foreach} {/foreach}
@@ -133,9 +133,9 @@
{$width = 9} {$width = 9}
{$start = $ma_nr + 0.5} {$start = $ma_nr + 0.5}
<div class='mabox' <div class='mabox'
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.5}em;background-color: {$mitarb.color};' style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.5}em;background-color: {$mitarb.color|escape};'
title='{$mitarb.vname} {$mitarb.nname} - Anwesend {if {$mitarb.complete} == 0} aber noch nicht ausgestempelt{/if}<br />'> title='{$mitarb.vname|escape} {$mitarb.nname|escape} - Anwesend {if {$mitarb.complete} == 0} aber noch nicht ausgestempelt{/if}<br />'>
{if {$mitarb.complete} == 0}<font color='#aa0000'>{else}<font color='#000000'>{/if}{$mitarb.vname} {$mitarb.nname|substr:0:1}.</font> {if {$mitarb.complete} == 0}<font color='#aa0000'>{else}<font color='#000000'>{/if}{$mitarb.vname|escape} {$mitarb.nname|substr:0:1|escape}.</font>
</div> </div>
</a> </a>
{/foreach} {/foreach}
@@ -169,9 +169,9 @@
</div> </div>
{foreach $users as $user} {foreach $users as $user}
{if $user.openvacation < 0} {if $user.openvacation < 0}
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname} <font color='#cc0000'><b>({$user.openvacation})</b></font></span></a> <a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color|escape}'>{$user.vname|escape} {$user.nname|escape} <font color='#cc0000'><b>({$user.openvacation|escape})</b></font></span></a>
{else} {else}
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname} <b>({$user.openvacation})</b></span></a> <a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color|escape}'>{$user.vname|escape} {$user.nname|escape} <b>({$user.openvacation|escape})</b></span></a>
{/if} {/if}
{/foreach} {/foreach}
<br /> <br />
-276
View File
@@ -1,276 +0,0 @@
<p>
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<br />
<div id='monthview'>
<a href='?action=termin&show=list'><span class='cal-list' title="Terminliste anzeigen" style='position: absolute; left: 50%;top: -11em;'></span></a><br />
<a href='?action=termin&show=month&page={$page-1}'><span class='left' title="6 Monate zurück" style='position: absolute; left: 0;top: -8em;'></span></a>
<a href='?action=termin&show=month&page=0'><span class='now' title="heute" style='position: absolute; left: 50%;top: -8em;'></span></a>
<a href='?action=termin&show=month&page={$page+1}'><span class='right' title="6 Monate Tage vor" style='position: absolute; right: 0;top: -8em;'></span></a>
{if $page == 0}
{*<a href='?action=terminadd&date=0' title='Neuer Termin'>*}<div class='nowweekdaybg'></div>{*</a>*}
{else}
<div class='weekdaybg' style='left: 14em;'>
</div>
{/if}
{foreach $weekdays as $weekday}
{$lastarbtermend = 0}
{if $i == 1 && $page == 0}
<div class='nowweekdayhead' style='left: {10*$i+3.5}em;'>{$weekday.weekday}
<a href='?action=terminshow&id=1&date={$weekday.date}&type=singlepages'><span class='print' title="Alle Termine von heute drucken" style='position:absolute;top: 0em;right:0em;'></span></a>
</div>
{else if {$weekday.weekday|substr:0:7} != "Samstag" && {$weekday.weekday|substr:0:7} != "Sonntag"}
<div class='weekdayhead' style='left: {10*$i+3.5}em;'>{$weekday.weekday}<br />
<a href='?action=terminshow&id=1&date={$weekday.date}&type=singlepages'><span class='print' title="Alle Termine an diesem Tag drucken" style='position:absolute;top: 0em;right:0em;'></span></a>
</div>
{*<a href='?action=terminadd&date={$i-1}' title='Neuer Termin'>*}<div class='weekdaybg' style='left: {10*$i+4}em;'></div>{*</a>*}
{else}
<div class='weekdayhead' style='left: {10*$i+3.5}em;background-color: #FFDDDD;'>{$weekday.weekday}<br />
<a href='?action=terminshow&id=1&date={$weekday.date}&type=singlepages'><span class='print' title="Alle Termine an diesem Tag drucken" style='position:absolute;top: 0em;right:0em;'></span></a>
</div>
{*<a href='?action=terminadd&date={$i-1}' title='Neuer Termin'>*}<div class='weekdaybg' style='left: {10*$i+4}em;background-color: #FFFFFF;'></div>{*</a>*}
{/if}
<div class='weekday_line' style='left: {10*$i+3.5}em;'></div>
{$shift = 0}
{$prevtermin= ""}
{$absmaxshift.{$weekday.weekday} = 1}
{$absmaxshiftone.{$weekday.weekday} = 0}
{$shiftone = 0}
{foreach $weekday.termine as $key=>$termin}
{if {$termin.termdauer} == "24:00:00"}
{$termin.termdauer = "23:59:59"}
{/if}
{if {$prevtermin.termtime|date_format:"%H%M"} <= {$termin.termtime|date_format:"%H%M"} && {{$prevtermin.termtime|date_format:"%H%M"}+{$prevtermin.termdauer|date_format:"%H%M"}} > {$termin.termtime|date_format:"%H%M"}} {*starttime of next term is within the prev term*}
{if {$prevtermin.termdauer} == "23:59:59"}
{$shiftone = $shiftone+1}
{else}
{$shift = $shift+1}
{/if}
{/if}
{if $termin.termdauer == "23:59:59"}
{if $termin.user2 > 0}
{$shiftone = $shiftone+1}
{/if}
{if $termin.user3 > 0}
{$shiftone = $shiftone+1}
{/if}
{if $termin.user4 > 0}
{$shiftone = $shiftone+1}
{/if}
{else}
{if $termin.user2 > 0}
{$shift = $shift+1}
{/if}
{if $termin.user3 > 0}
{$shift = $shift+1}
{/if}
{if $termin.user4 > 0}
{$shift = $shift+1}
{/if}
{/if}
{$weekday.termine.{$key}.shift = $shift}
{$weekday.termine.{$key}.shiftone = $shiftone}
{if $shift+1 > $absmaxshift.{$weekday.weekday}}
{$absmaxshift.{$weekday.weekday} = $shift+1}
{/if}
{if $shiftone > $absmaxshiftone.{$weekday.weekday}}
{$absmaxshiftone.{$weekday.weekday} = $shiftone}
{/if}
{$prevtermin = $termin}
{/foreach}
{$width = ((18 / $absmaxshift.{$weekday.weekday})-$absmaxshiftone.{$weekday.weekday})}
{foreach $weekday.termine as $key=>$termin}
{$shift = 10*$i + 3.9 + ($width/2)*$termin.shift + $termin.shiftone}
{if {$termin.termdauer} == '24:00:00'}
{$terminlength = 960}
{$terminstart = 390}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<a href='?action=terminshow&id={$termin.main_id}'>
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{else}
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
{$terminstart = ({$termin.termtime|date_format:"%H"}*60 + {$termin.termtime|date_format:"%M"})}
{if {$terminstart} == 0}
<a href='?action=projectadd&id={$termin.projectid}'>
{$terminlength = {$termin.termdauer}*60}
{$terminstart = 450+$lastarbtermend}
{$lastarbtermend = $terminstart-450 + $termin.termdauer * 60}
{$termin.typ = 'Arbeitsleistung'}
{else}
<a href='?action=terminshow&id={$termin.main_id}'>
{/if}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
{if {$termin.typ} != 'Arbeitsleistung'}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color}'
title='
{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br />
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if}
{if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br />
<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />
Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
{else}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width/3}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color}{/if}'
title='
{$termin.typ} -
{$termin.firma} {$termin.vname} {$termin.nname}<br />
<b>{$termin.projectname}</b> <br />
{$termin.head}<br />
<b>Dauer: </b>{if {$termin.termdauer} > 1} {$termin.termdauer|string_format:"%.1f"}h{/if}<br />
{/if}
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{/if}
</a>
{if $termin.user2}
{$shift = 10*$i + 3.9 + ($width)*($termin.shift-1) + $termin.shiftone}
<a href='?action=terminshow&id={$termin.main_id}'>
{if {$termin.termdauer} == '24:00:00'}
{$terminlength = 960}
{$terminstart = 390}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname2} {$termin.usernname2}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{else}
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
{$terminstart = ({$termin.termtime|date_format:"%H"}*60 + {$termin.termtime|date_format:"%M"})}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname2} {$termin.usernname2}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{/if}
</a>
{/if}
{if $termin.user3}
{$shift = 10*$i + 3.9 + ($width)*($termin.shift-2) + $termin.shiftone}
<a href='?action=terminshow&id={$termin.main_id}'>
{if {$termin.termdauer} == '24:00:00'}
{$terminlength = 960}
{$terminstart = 390}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname3} {$termin.usernname3}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{else}
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
{$terminstart = ({$termin.termtime|date_format:"%H"}*60 + {$termin.termtime|date_format:"%M"})}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname3} {$termin.usernname3}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{/if}
</a>
{/if}
{if $termin.user4}
{$shift = 10*$i + 3.9 + ($width)*($termin.shift-3) + $termin.shiftone}
<a href='?action=terminshow&id={$termin.main_id}'>
{if {$termin.termdauer} == '24:00:00'}
{$terminlength = 960}
{$terminstart = 390}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname4} {$termin.usernname4}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{else}
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
{$terminstart = ({$termin.termtime|date_format:"%H"}*60 + {$termin.termtime|date_format:"%M"})}
{$height = ($terminlength/15)}
{$start = 4 + ($terminstart - 420)/15}
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color}'
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname4} {$termin.usernname4}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
</div>
{/if}
</a>
{/if}
{/foreach}
{$i=$i+1}
{/foreach}
{$i = 0}
{while $i < 16}
{$i = $i+1}
<div class='hourline_desc' style='top: {$i*4-0.5}em'>{{$i+6}|str_pad:2:'0':0}:00</div>
<div class='hourline' style='top: {$i*4}em'></div>
{/while}
{$time = {$smarty.now|date_format:"%H"}*60 + {$smarty.now|date_format:"%M"}}
<div id='timeline' style='top: {4 + ($time - 420)/15}em'></div>
{if $page == 0}
{for $i = 1 to 7}
<div class='weatherinfo' style="left: {3+10*$i}em;background-image: url('{$weather.{$i}.icon}');">
{$weather.{$i}.low}°C - {$weather.{$i}.high}°C
</div>
{/for}
{/if}
</div>
<br />
{foreach $users as $user}
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname}</span></a>
{/foreach}
<br />
<script type="text/javascript">
$(".terminbox").tooltip({
track: true,
delay: 0,
showURL: false,
showBody: " - ",
});
$(".doneterminbox").tooltip({
track: true,
delay: 0,
showURL: false,
showBody: " - ",
});
</script>
+3 -3
View File
@@ -3,8 +3,8 @@
<fieldset class="big"> <fieldset class="big">
<legend>Neue Adresse:</legend> <legend>Neue Adresse:</legend>
<div class='centersrc'> <div class='centersrc'>
{html_options name=adrsrc_field onChange="ajax_searchadress({$rechid},'changeadr',0)" id=adrsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'} {html_options name=adrsrc_field onChange="ajax_searchadress(0,{$rechid|intval},'changeadr')" id=adrsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'}
<input name='adrsrc_src' id='adrsrc_src' value='' class='searchform' onKeyUp="ajax_searchadress({$rechid},'changeadr',0)" title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' /> <input name='adrsrc_src' id='adrsrc_src' value='' class='searchform' onKeyUp="ajax_searchadress(0,{$rechid|intval},'changeadr')" title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' />
<br /> <br />
</div> </div>
@@ -14,4 +14,4 @@
</fieldset> </fieldset>
</form> </form>
<script language='javascript'>ajax_searchadress({$rechid},'changeadr',0);</script> <script language='javascript'>ajax_searchadress(0,{$rechid|intval},'changeadr');</script>
+3 -3
View File
@@ -3,8 +3,8 @@
<fieldset class="big"> <fieldset class="big">
<legend>Neue Adresse:</legend> <legend>Neue Adresse:</legend>
<div class='centersrc'> <div class='centersrc'>
{html_options name=adrsrc_field onChange='ajax_searchadress({$rechid},\'copy\',0)' id=adrsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'} {html_options name=adrsrc_field onChange="ajax_searchadress(0,{$rechid|intval},'copy')" id=adrsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'}
<input name='adrsrc_src' id='adrsrc_src' value='' class='searchform' onKeyUp='ajax_searchadress({$rechid},'copy',0)' title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' /> <input name='adrsrc_src' id='adrsrc_src' value='' class='searchform' onKeyUp="ajax_searchadress(0,{$rechid|intval},'copy')" title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' />
<br /> <br />
</div> </div>
@@ -14,4 +14,4 @@
</fieldset> </fieldset>
</form> </form>
<script language='javascript'>ajax_searchadress({$rechid},'copy',0);</script> <script language='javascript'>ajax_searchadress(0,{$rechid|intval},'copy');</script>
+2 -2
View File
@@ -5,7 +5,7 @@
<a href='?action=kundenadd'><span class='addcenter' title="Neuer Kunde"></span></a><br /> <a href='?action=kundenadd'><span class='addcenter' title="Neuer Kunde"></span></a><br />
<div class='centersrc'> <div class='centersrc'>
{html_options name=kdnsrc_field onChange='ajax_searchkunden(0)' id=kdnsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'} {html_options name=kdnsrc_field onChange='ajax_searchkunden(0)' id=kdnsrc_field options=$felder selected=$selfeld class='searchform' title='Bitte wählen Sie die Spalte, die durchsucht werden soll.' onchange='#'}
<input name='kdnsrc_src' id='kdnsrc_src' value='{$search}' class='searchform' onKeyUp='ajax_searchkunden(0)' autofocus='autofocus' title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' /> <input name='kdnsrc_src' id='kdnsrc_src' value='{$search|escape}' class='searchform' onKeyUp='ajax_searchkunden(0)' autofocus='autofocus' title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' />
<br /> <br />
</div> </div>
@@ -15,7 +15,7 @@
</fieldset> </fieldset>
</form> </form>
<script language='javascript'>ajax_searchkunden({$page});</script> <script language='javascript'>ajax_searchkunden({$page|intval});</script>
<div id="question"> <div id="question">
</div> </div>
+13 -10
View File
@@ -42,9 +42,9 @@
{/if} {/if}
{if $adresse.gebdat != "01.01.2100" && $adresse.gebdat != "00.00.0000"} {if $adresse.gebdat != "01.01.2100" && $adresse.gebdat != "00.00.0000"}
{if $adresse.gebdat|substr:6:4 != "2099"} {if $adresse.gebdat|substr:6:4 != "2099"}
(Geburtstag: {$adresse.gebdat})<br /> (Geburtstag: {$adresse.gebdat|escape})<br />
{else} {else}
(Geburtstag: {$adresse.gebdat|substr:0:5})<br /> (Geburtstag: {$adresse.gebdat|escape|substr:0:5})<br />
{/if} {/if}
{/if} {/if}
{/if} {/if}
@@ -56,9 +56,9 @@
{/if} {/if}
{if $adresse.gebdat2 != "01.01.2100" && $adresse.gebdat2 != "00.00.0000"} {if $adresse.gebdat2 != "01.01.2100" && $adresse.gebdat2 != "00.00.0000"}
{if $adresse.gebdat2|substr:6:4 != "2099"} {if $adresse.gebdat2|substr:6:4 != "2099"}
(Geburtstag: {$adresse.gebdat2})<br /> (Geburtstag: {$adresse.gebdat2|escape})<br />
{else} {else}
(Geburtstag: {$adresse.gebdat2|substr:0:5})<br /> (Geburtstag: {$adresse.gebdat2|escape|substr:0:5})<br />
{/if} {/if}
{/if} {/if}
{/if} {/if}
@@ -71,6 +71,9 @@
{$adresse.plz|escape|default:""} {$adresse.ort|escape|default:""} {$adresse.ortsteil|escape|default:""}<br /> {$adresse.plz|escape|default:""} {$adresse.ort|escape|default:""} {$adresse.ortsteil|escape|default:""}<br />
<span>{$adresse.land|escape|default:""}</span> <span>{$adresse.land|escape|default:""}</span>
{if $adresse.nr}
Telefon: {if $adresse.vwahl}{$adresse.vwahl|escape} / {/if}{$adresse.nr|escape}<br />
{/if}
</p> </p>
<p> <p>
@@ -78,7 +81,7 @@
{if $adresse.typ_id != 1} {if $adresse.typ_id != 1}
<span class='del' title="Adresse löschen" onClick='askdel("Möchten Sie diese Adresse<br /><b>UND ALLE ZUGEHÖRIGEN RECHNUNGEN</b><br />wirklich unwiederruflich löschen?","?action=kundenchange&do=adress&adressid={$adresse.id}&del=1")'></span> <span class='del' title="Adresse löschen" onClick='askdel("Möchten Sie diese Adresse<br /><b>UND ALLE ZUGEHÖRIGEN RECHNUNGEN</b><br />wirklich unwiederruflich löschen?","?action=kundenchange&do=adress&adressid={$adresse.id}&del=1")'></span>
{/if} {/if}
<a href="http://maps.google.com?q={$adresse.plz}+{$adresse.ort}+{$adresse.str}+{$adresse.hnr}" class="noloading" target="_blank"><span class='map' title="Auf Karte zeigen"></span></a> <a href="http://maps.google.com?q={$adresse.plz|escape:'url'}+{$adresse.ort|escape:'url'}+{$adresse.str|escape:'url'}+{$adresse.hnr|escape:'url'}" rel="noopener" class="noloading" target="_blank"><span class='map' title="Auf Karte zeigen"></span></a>
<a href='?action=terminadd&adressid={$adresse.id}'><span class='termadd' title="Termin anlegen"></span></a><br /> <a href='?action=terminadd&adressid={$adresse.id}'><span class='termadd' title="Termin anlegen"></span></a><br />
<a href='?action=rechnungadd&type=1&adressid={$adresse.id}'><span class='rechnadd' title="Rechnung anlegen"></span></a> <a href='?action=rechnungadd&type=1&adressid={$adresse.id}'><span class='rechnadd' title="Rechnung anlegen"></span></a>
@@ -177,13 +180,13 @@
{/if} {/if}
{$i=$i+1} {$i=$i+1}
{strip} {strip}
<fieldset class='note' style="background-color: {$note.color|default:'#fff'};"> <fieldset class='note' style="background-color: {$note.color|default:'#fff'|escape};">
<legend>{$note.datetime|date_format:"%a, %d.%m.%Y <br /> %R Uhr"}</legend> <legend>{$note.datetime|date_format:"%a, %d.%m.%Y <br /> %R Uhr"}</legend>
{$note.notiz|nl2br|default:""}<br /> {$note.notiz|default:""|escape|nl2br}<br />
<p> <p>
{if $note.id} {if $note.id}
{if $note.file} {if $note.file}
<a href='{$note.file}' target="_Blank" class='noloading'><span class='file' title="Angehängte Datei anzeigen"></span></a> <a href='{$note.file|escape}' target="_Blank" class='noloading'><span class='file' title="Angehängte Datei anzeigen"></span></a>
{/if} {/if}
<a href='?action=kundenchange&do=notiz&notizid={$note.id}'><span class='edit' title="Notiz ändern"></span></a> <a href='?action=kundenchange&do=notiz&notizid={$note.id}'><span class='edit' title="Notiz ändern"></span></a>
<span class='del' id='del' title="Notiz löschen" onClick='askdel("Möchten Sie diese Notiz wirklich unwiederruflich löschen?","?action=kundenchange&do=notiz&notizid={$note.id}&del=1")'></span> <span class='del' id='del' title="Notiz löschen" onClick='askdel("Möchten Sie diese Notiz wirklich unwiederruflich löschen?","?action=kundenchange&do=notiz&notizid={$note.id}&del=1")'></span>
@@ -211,7 +214,7 @@
{$i=$i+1} {$i=$i+1}
{strip} {strip}
<fieldset class='small'> <fieldset class='small'>
<legend>{$kto.bank} <br />{$kto.blz|chunk_split:3:" "}</legend> <legend>{$kto.bank|escape} <br />{$kto.blz|escape|chunk_split:3:" "}</legend>
Konto Nr.: {$kto.ktonr|escape|chunk_split:3:" "}<br /> Konto Nr.: {$kto.ktonr|escape|chunk_split:3:" "}<br />
Inhaber: {$kto.inhaber|escape}<br /> Inhaber: {$kto.inhaber|escape}<br />
{if $kto.iban} {if $kto.iban}
@@ -234,7 +237,7 @@
<div id="tabs"> <div id="tabs">
<ul> <ul>
{foreach $rechtypen as $rechtyp} {foreach $rechtypen as $rechtyp}
<li><a href="#tabs-{$rechtyp.id}" class='noloading' onClick='ajax_searchkdnrech(0,0,{$rechtyp.id},{$kunde.id})'>{$rechtyp.typ}</a></li> <li><a href="#tabs-{$rechtyp.id}" class='noloading' onClick='ajax_searchkdnrech(0,0,{$rechtyp.id},{$kunde.id})'>{$rechtyp.typ|escape}</a></li>
{/foreach} {/foreach}
</ul> </ul>
{foreach $rechtypen as $rechtyp} {foreach $rechtypen as $rechtyp}
+9 -6
View File
@@ -43,13 +43,16 @@
{$adresse.plz|escape|default:""} {$adresse.ort|escape|default:""} {$adresse.ortsteil|escape|default:""}<br /> {$adresse.plz|escape|default:""} {$adresse.ort|escape|default:""} {$adresse.ortsteil|escape|default:""}<br />
<span>{$adresse.land|escape|default:""}</span> <span>{$adresse.land|escape|default:""}</span>
{if $adresse.nr}
Telefon: {if $adresse.vwahl}{$adresse.vwahl|escape} / {/if}{$adresse.nr|escape}<br />
{/if}
</p> </p>
<p> <p>
<a href='?action=lieferchange&do=adress&adressid={$adresse.id}&kunde={$kunde.id}'><span class='edit' title="Adresse ändern"></span></a> <a href='?action=lieferchange&do=adress&adressid={$adresse.id}&kunde={$kunde.id}'><span class='edit' title="Adresse ändern"></span></a>
{if $adresse.typ_id != 1} {if $adresse.typ_id != 1}
<span class='del' id='del' title="Adresse löschen" onClick='askdel("Möchten Sie diese Adresse wirklich unwiederruflich löschen?","?action=lieferchange&do=adress&adressid={$adresse.id}&del=1")'></span> <span class='del' id='del' title="Adresse löschen" onClick='askdel("Möchten Sie diese Adresse wirklich unwiederruflich löschen?","?action=lieferchange&do=adress&adressid={$adresse.id}&del=1")'></span>
{/if} {/if}
<a href="http://maps.google.com?q={$adresse.plz}+{$adresse.ort}+{$adresse.str}+{$adresse.hnr}" class="noloading" target="_blank"><span class='map' title="Auf Karte zeigen"></span></a> <a href="http://maps.google.com?q={$adresse.plz|escape:'url'}+{$adresse.ort|escape:'url'}+{$adresse.str|escape:'url'}+{$adresse.hnr|escape:'url'}" rel="noopener" class="noloading" target="_blank"><span class='map' title="Auf Karte zeigen"></span></a>
</p> </p>
</fieldset> </fieldset>
{/strip} {/strip}
@@ -116,7 +119,7 @@
<a href='?action=lieferchange&kunde={$kunde.id}&do=notiz'><span class='add' title="Neue Notiz"></span></a> <a href='?action=lieferchange&kunde={$kunde.id}&do=notiz'><span class='add' title="Neue Notiz"></span></a>
{foreach $notes as $note} {foreach $notes as $note}
{strip} {strip}
<fieldset class='note' style="background-color: {$note.color|default:'#fff'};"> <fieldset class='note' style="background-color: {$note.color|default:'#fff'|escape};">
<legend>{$note.datetime|date_format:"%a, %d.%m.%Y <br /> %R Uhr"}</legend> <legend>{$note.datetime|date_format:"%a, %d.%m.%Y <br /> %R Uhr"}</legend>
{$note.notiz|escape|default:""}<br /> {$note.notiz|escape|default:""}<br />
<p> <p>
@@ -134,7 +137,7 @@
{foreach $kontos as $kto} {foreach $kontos as $kto}
{strip} {strip}
<fieldset class='small'> <fieldset class='small'>
<legend>{$kto.bank} <br />{$kto.blz|chunk_split:3:" "}</legend> <legend>{$kto.bank|escape} <br />{$kto.blz|escape|chunk_split:3:" "}</legend>
Konto Nr.: {$kto.ktonr|escape|chunk_split:3:" "}<br /> Konto Nr.: {$kto.ktonr|escape|chunk_split:3:" "}<br />
Inhaber: {$kto.inhaber|escape}<br /> Inhaber: {$kto.inhaber|escape}<br />
{if $kto.iban} {if $kto.iban}
@@ -158,14 +161,14 @@
<div id="tabs"> <div id="tabs">
<ul> <ul>
{foreach $rechtypen as $rechtyp} {foreach $rechtypen as $rechtyp}
<li><a href="#tabs-{$rechtyp.id}" class='noloading' onClick='ajax_searchkdnrech(0,{$rechtyp.id},{$kunde.id})'>{$rechtyp.typ}</a></li> <li><a href="#tabs-{$rechtyp.id}" class='noloading' onClick='ajax_searchkdnrech(0,0,{$rechtyp.id},{$kunde.id})'>{$rechtyp.typ|escape}</a></li>
{/foreach} {/foreach}
</ul> </ul>
{foreach $rechtypen as $rechtyp} {foreach $rechtypen as $rechtyp}
<div id="tabs-{$rechtyp.id}"> <div id="tabs-{$rechtyp.id}">
<div class='centersrc'> <div class='centersrc'>
<input name='kdnsrc_src' id='src_rech-{$rechtyp.id}' value='' class='searchform' onKeyUp='ajax_searchkdnrech(0,{$rechtyp.id},{$kunde.id})' title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' /> <input name='kdnsrc_src' id='src_rech-{$rechtyp.id}' value='' class='searchform' onKeyUp='ajax_searchkdnrech(0,0,{$rechtyp.id},{$kunde.id})' title='Geben Sie hier das Suchmuster ein <br />% ist ein Platzhalter für eine beliebige Anzahl Zeichen<br />_ ist der Platzhalter für ein einziges Zeichen.' />
<br /> <br />
</div> </div>
<div id='rechlist-{$rechtyp.id}'> <div id='rechlist-{$rechtyp.id}'>
@@ -181,7 +184,7 @@
$(function() { $(function() {
$( "#tabs" ).tabs(); $( "#tabs" ).tabs();
}); });
ajax_searchkdnrech(0,1,{$kunde.id}); ajax_searchkdnrech(0,0,1,{$kunde.id});
</script> </script>
<div id="question"> <div id="question">
+29 -29
View File
@@ -15,11 +15,11 @@
{elseif $type == 5} {elseif $type == 5}
{$typename="Brief"} {$typename="Brief"}
{/if} {/if}
<h2>{$typename} {$headstr}:</h2> <h2>{$typename|escape} {$headstr|escape}:</h2>
<form action="?action=rechnungadd&mailformsent=1&mail=1&id={$smarty.get.id}" name="mainform" id='rechnform' method='POST'> <form action="?action=rechnungadd&mailformsent=1&mail=1&id={$smarty.get.id|intval}" name="mainform" id='rechnform' method='POST'>
<fieldset class='nolim'> <fieldset class='nolim'>
<legend>{$typename} an <a href="?action=kundenshow&id={$adresse.partner_id}">Kunde {$adresse.partner_id}</a></legend> <legend>{$typename|escape} an <a href="?action=kundenshow&id={$adresse.partner_id|escape}">Kunde {$adresse.partner_id|escape}</a></legend>
<p> <p>
<br /> <br />
@@ -28,9 +28,9 @@
{html_options values=$mails output=$mails} {html_options values=$mails output=$mails}
</select><br /> </select><br />
<label>Betreff:</label> <label>Betreff:</label>
<input value='{$smarty.session.firma}: 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} == "Herrn" || $anrs.{$adresse.anrede_id} == "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}
@@ -38,16 +38,16 @@
{else} {else}
Sehr geehrter Herr{" "} Sehr geehrter Herr{" "}
{if $adresse.titel_id > 1} {if $adresse.titel_id > 1}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
{elseif $anrs.{$adresse.anrede2_id} == "Herrn" || $anrs.{$adresse.anrede_id} == "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}
@@ -55,12 +55,12 @@
{else} {else}
Sehr geehrter Herr{" "} Sehr geehrter Herr{" "}
{if $adresse.titel2_id > 1} {if $adresse.titel2_id > 1}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
@@ -72,12 +72,12 @@
{else} {else}
Sehr geehrte Frau{" "} Sehr geehrte Frau{" "}
{if $adresse.titel_id > 1} {if $adresse.titel_id > 1}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
@@ -89,12 +89,12 @@
{else} {else}
Sehr geehrte Frau{" "} Sehr geehrte Frau{" "}
{if $adresse.titel2_id > 1} {if $adresse.titel2_id > 1}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr1' maxlength='150' name='anr1' /><br /> ' id='anr1' maxlength='150' name='anr1' /><br />
{/strip} {/strip}
@@ -103,7 +103,7 @@
{/if} {/if}
<label>Zweite Anrede:</label> <label>Zweite Anrede:</label>
{if $anrs.{$adresse.anrede_id} == "Frau" && $anrs.{$adresse.anrede2_id} == "Herr" && $anrs.{$adresse.anrede2_id} == "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}
@@ -111,12 +111,12 @@
{else} {else}
Sehr geehrte Frau{" "} Sehr geehrte Frau{" "}
{if $adresse.titel_id > 1} {if $adresse.titel_id > 1}
{$titels.{$adresse.titel_id}}{" "} {$titels.{$adresse.titel_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname} {if $adresse.vname}
{$adresse.vname}{" "} {$adresse.vname|escape}{" "}
{/if} {/if}
{$adresse.nname}, {$adresse.nname|escape},
{/if} {/if}
' id='anr2' maxlength='150' name='anr2' /><br /> ' id='anr2' maxlength='150' name='anr2' /><br />
{/strip} {/strip}
@@ -128,12 +128,12 @@
{else} {else}
Sehr geehrte Frau{" "} Sehr geehrte Frau{" "}
{if $adresse.titel2_id > 1} {if $adresse.titel2_id > 1}
{$titels.{$adresse.titel2_id}}{" "} {$titels.{$adresse.titel2_id}|escape}{" "}
{/if} {/if}
{if $adresse.vname2} {if $adresse.vname2}
{$adresse.vname2}{" "} {$adresse.vname2|escape}{" "}
{/if} {/if}
{$adresse.nname2}, {$adresse.nname2|escape},
{/if} {/if}
' id='anr2' maxlength='150' name='anr2' /><br /> ' id='anr2' maxlength='150' name='anr2' /><br />
{/strip} {/strip}
@@ -142,11 +142,11 @@
{/if} {/if}
<label class='artlabel'>E-Mail Text:</label><br /> <label class='artlabel'>E-Mail Text:</label><br />
<center><textarea name='intro' id='intro' {if $type == 5}class='tinymce'{else}class='bigtextarea'{/if}> <center><textarea name='intro' id='intro' {if $type == 5}class='tinymce'{else}class='bigtextarea'{/if}>
Anbei senden wir Ihnen {if $typename == "Angebot"}das{elseif $typename == "Brief"}den{else}die{/if} geforderte{if $typename == "Brief"}n{/if} {$typename}. Anbei senden wir Ihnen {if $typename == "Angebot"}das{elseif $typename == "Brief"}den{else}die{/if} geforderte{if $typename == "Brief"}n{/if} {$typename|escape}.
Mit freundlichen Grüßen Mit freundlichen Grüßen
{$smarty.session.vname} {$smarty.session.nname} {$smarty.session.vname|escape} {$smarty.session.nname|escape}
{$smarty.session.firma} {$smarty.session.firma|escape}
--- ---
Das Dokument ist als PDF-Datei im Anhang hinterlegt. Das Dokument ist als PDF-Datei im Anhang hinterlegt.
@@ -169,7 +169,7 @@ http://www.adobe.de/products/acrobat/readstep2.html
<br /> <br />
<h2>Anhang:</h2> <h2>Anhang:</h2>
<div id="pdfpreview"> <div id="pdfpreview">
<iframe src='{$pdffile}' width='100%' height='600px'></iframe> <iframe src='{$pdffile|escape}' width='100%' height='600px'></iframe>
</div> </div>
</div> </div>
</div> </div>
+1 -1
View File
@@ -2,7 +2,7 @@
{include file="heading.tpl" heading=$head} {include file="heading.tpl" heading=$head}
<div class="widthlimiter"> <div class="widthlimiter">
<form action="?action={$frmact}&do=adress&kunde={$kunde|escape}&formsent=1&adressid={$adressid}" name="mainform" method='POST'> <form action="?action={$frmact}&do=adress&kunde={$kunde|escape}&formsent=1&adressid={$adressid|intval}" name="mainform" method='POST'>
<fieldset> <fieldset>
<label>Adresstyp:</label><select name="typ" id="typ" > <label>Adresstyp:</label><select name="typ" id="typ" >
+1 -1
View File
@@ -2,7 +2,7 @@
{include file="heading.tpl" heading=$head} {include file="heading.tpl" heading=$head}
<div class="widthlimiter"> <div class="widthlimiter">
<form action="?action={$frmact}&do=kontakt&kunde={$kunde|escape}&formsent=1&kontaktid={$kontaktid}" method='POST'> <form action="?action={$frmact}&do=kontakt&kunde={$kunde|escape}&formsent=1&kontaktid={$kontaktid|intval}" method='POST'>
<fieldset> <fieldset>
<label>Typ:</label><select name="typ" id="typ" > <label>Typ:</label><select name="typ" id="typ" >
{html_options values=$typids output=$typs selected="{$typ}"} {html_options values=$typids output=$typs selected="{$typ}"}
+1 -1
View File
@@ -2,7 +2,7 @@
{include file="heading.tpl" heading=$head} {include file="heading.tpl" heading=$head}
<div class="widthlimiter"> <div class="widthlimiter">
<form action="?action={$frmact}&do=konto&kunde={$kunde|escape}&formsent=1&kontoid={$kontoid}" method='POST'> <form action="?action={$frmact}&do=konto&kunde={$kunde|escape}&formsent=1&kontoid={$kontoid|intval}" method='POST'>
<fieldset> <fieldset>
<label>Bank:</label><input name='bank' id='bank' value="{$bank|escape}" pattern="[^0-9]*" /><br /> <label>Bank:</label><input name='bank' id='bank' value="{$bank|escape}" pattern="[^0-9]*" /><br />
+3 -3
View File
@@ -2,16 +2,16 @@
{include file="heading.tpl" heading=$head} {include file="heading.tpl" heading=$head}
<div class="widthlimiter"> <div class="widthlimiter">
<form action="?action={$frmact}&do=notiz&kunde={$kunde|escape}&formsent=1&notizid={$notizid}" method='POST' enctype="multipart/form-data"> <form action="?action={$frmact}&do=notiz&kunde={$kunde|escape}&formsent=1&notizid={$notizid|intval}" method='POST' enctype="multipart/form-data">
<fieldset class='colorchooser'> <fieldset class='colorchooser'>
<legend>Farbe:</legend> <legend>Farbe:</legend>
{html_radios name='color' options=$colors selected={$color|default:'#fff'} separator='&nbsp;' escape=0 labels=1} {html_radios name='color' options=$colors selected={$color|default:'#fff'|escape} separator='&nbsp;' escape=0 labels=1}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Notiz:</legend> <legend>Notiz:</legend>
<textarea name='notiz' id='notiz' class='bigtextarea'>{$notiz}</textarea><br /> <textarea name='notiz' id='notiz' class='bigtextarea'>{$notiz|escape}</textarea><br />
<label>Dateianhang zu dieser Notiz: </label><input type="file" id='notefile' name='notefile' /><br /> <label>Dateianhang zu dieser Notiz: </label><input type="file" id='notefile' name='notefile' /><br />
<button type="button" class='spell' onclick="$('textarea:not(#personalnotes,#globalnotes),input:not([type=radio])').spellCheckInDialog()">Rechtschreibung prüfen</button><br /> <button type="button" class='spell' onclick="$('textarea:not(#personalnotes,#globalnotes),input:not([type=radio])').spellCheckInDialog()">Rechtschreibung prüfen</button><br />
</fieldset> </fieldset>
+1 -1
View File
@@ -2,7 +2,7 @@
{include file="heading.tpl" heading=$head} {include file="heading.tpl" heading=$head}
<div class="widthlimiter"> <div class="widthlimiter">
<form action="?action={$frmact}&do=tel&kunde={$kunde|escape}&formsent=1&telid={$telid}" method='POST'> <form action="?action={$frmact}&do=tel&kunde={$kunde|escape}&formsent=1&telid={$telid|intval}" method='POST'>
<fieldset> <fieldset>
<label>Typ:</label><select name="typ" id="typ" > <label>Typ:</label><select name="typ" id="typ" >
{html_options values=$typids output=$typs selected="{$typ}"} {html_options values=$typids output=$typs selected="{$typ}"}
+2 -2
View File
@@ -1,6 +1,6 @@
{include file="heading.tpl" heading="Dokumentanzeige"} {include file="heading.tpl" heading="Dokumentanzeige"}
<h2><div class='fifty'>Original:</div><div class='fifty'>Kopie:</div></h2> <h2><div class='fifty'>Original:</div><div class='fifty'>Kopie:</div></h2>
<iframe style='display: block; float: left; margin: 1em;' src='{$pdffile}' width='45%' height='600px'></iframe> <iframe style='display: block; float: left; margin: 1em;' src='{$pdffile|escape}' width='45%' height='600px'></iframe>
{if $pdffile2} {if $pdffile2}
<iframe style='display: block; float: left; margin: 1em;' src='{$pdffile2}' width='45%' height='600px'></iframe> <iframe style='display: block; float: left; margin: 1em;' src='{$pdffile2|escape}' width='45%' height='600px'></iframe>
{/if} {/if}
+2 -2
View File
@@ -1,4 +1,4 @@
{include file="heading.tpl" heading="Terminanzeige"} {include file="heading.tpl" heading="Terminanzeige"}
<h2><div class='fifty'>Ohne Anfahrt:</div><div class='fifty'>Mit Anfahrt:</div></h2> <h2><div class='fifty'>Ohne Anfahrt:</div><div class='fifty'>Mit Anfahrt:</div></h2>
<iframe src='{$pdffile}' width='40%' height='600px'></iframe> <iframe src='{$pdffile|escape}' width='40%' height='600px'></iframe>
<iframe src='{$pdffile2}' width='40%' height='600px'></iframe> <iframe src='{$pdffile2|escape}' width='40%' height='600px'></iframe>
+1 -1
View File
@@ -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'>
+16 -16
View File
@@ -1,55 +1,55 @@
{include file="heading.tpl" heading="Umschlag bedrucken"} {include file="heading.tpl" heading="Umschlag bedrucken"}
<div class="fifty"> <div class="fifty">
<form action="?action=rechnungadd&formsent=1&id={$loadrech}" name="mainform" id='rechnform' method='POST'> <form action="?action=rechnungadd&formsent=1&id={$loadrech|escape}" name="mainform" id='rechnform' method='POST'>
<fieldset class='nolim'> <fieldset class='nolim'>
<legend>{$typename} an <a href="?action=kundenshow&id={$adresse.partner_id}">Kunde {$adresse.partner_id}</a></legend> <legend>{$typename|escape} an <a href="?action=kundenshow&id={$adresse.partner_id|escape}">Kunde {$adresse.partner_id|escape}</a></legend>
{if $adresse.firma} {if $adresse.firma}
<label class='checktext'><input type="checkbox" name="show_firmaanr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMAANR:1 || $rechnung.adressfields==0}checked="checked"{/if} />Firma</label> <label class='checktext'><input type="checkbox" name="show_firmaanr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMAANR:1 || $rechnung.adressfields==0}checked="checked"{/if} />Firma</label>
<label class='checktext'><input type="checkbox" name="show_firma" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMA:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.firma}</label> <label class='checktext'><input type="checkbox" name="show_firma" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_FIRMA:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.firma|escape}</label>
{/if} {/if}
{if $adresse.anrede_id > 1} {if $adresse.anrede_id > 1}
<label class='checktext'><input type="checkbox" name="show_anr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede_id}}</label> <label class='checktext'><input type="checkbox" name="show_anr" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede_id}|escape}</label>
{/if} {/if}
{if $adresse.titel_id > 1} {if $adresse.titel_id > 1}
<label class='checktext'><input type="checkbox" name="show_titel" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel_id}}</label> <label class='checktext'><input type="checkbox" name="show_titel" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel_id}|escape}</label>
{/if} {/if}
{if $adresse.vname || $adresse.nname} {if $adresse.vname || $adresse.nname}
<label class='checktext'><input type="checkbox" name="show_name" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname} {$adresse.nname}</label> <label class='checktext'><input type="checkbox" name="show_name" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME1:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname|escape} {$adresse.nname|escape}</label>
{/if} {/if}
<br /> <br />
{if $adresse.anrede2_id > 1} {if $adresse.anrede2_id > 1}
<label class='checktext'><input type="checkbox" name="show_anr2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede2_id}}</label> <label class='checktext'><input type="checkbox" name="show_anr2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ANR2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$anrs.{$adresse.anrede2_id}|escape}</label>
{/if} {/if}
{if $adresse.titel2_id > 1} {if $adresse.titel2_id > 1}
<label class='checktext'><input type="checkbox" name="show_titel2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel2_id}}</label> <label class='checktext'><input type="checkbox" name="show_titel2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_TITEL2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$titels.{$adresse.titel2_id}|escape}</label>
{/if} {/if}
{if $adresse.vname2 || $adresse.nname2} {if $adresse.vname2 || $adresse.nname2}
<label class='checktext'><input type="checkbox" name="show_name2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname2} {$adresse.nname2}</label> <label class='checktext'><input type="checkbox" name="show_name2" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_NAME2:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.vname2|escape} {$adresse.nname2|escape}</label>
{/if} {/if}
{if $adresse.str} {if $adresse.str}
<label class='checktext'><input type="checkbox" name="show_str" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_STR:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.str} {$adresse.hnr}</label> <label class='checktext'><input type="checkbox" name="show_str" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_STR:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.str|escape} {$adresse.hnr|escape}</label>
{/if} {/if}
{if $adresse.plz || $adresse.ort} {if $adresse.plz || $adresse.ort}
<label class='checktext'><input type="checkbox" name="show_ort" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ORT:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.plz} {$adresse.ort} <label class='checktext'><input type="checkbox" name="show_ort" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ORT:1 || $rechnung.adressfields==0}checked="checked"{/if} />{$adresse.plz|escape} {$adresse.ort|escape}
{/if} {/if}
{if $adresse.ortsteil} {if $adresse.ortsteil}
- {$adresse.ortsteil} - {$adresse.ortsteil|escape}
{/if} {/if}
{if $adresse.plz || $adresse.ort} {if $adresse.plz || $adresse.ort}
</label> </label>
{/if} {/if}
{if $adresse.land} {if $adresse.land}
<label class='checktext'><input type="checkbox" name="show_land" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_LAND:1}checked="checked"{/if} />{$adresse.land}</label> <label class='checktext'><input type="checkbox" name="show_land" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_LAND:1}checked="checked"{/if} />{$adresse.land|escape}</label>
{/if} {/if}
{if $adresse.zusatz} {if $adresse.zusatz}
<label class='checktext'><input type="checkbox" name="show_zusatz" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ZUSATZ:1}checked="checked"{/if} />{$adresse.zusatz|truncate:60:"...":false}</label> <label class='checktext'><input type="checkbox" name="show_zusatz" value="1" {if $rechnung.adressfields|substr:$smarty.const.ADRFIELD_ZUSATZ:1}checked="checked"{/if} />{$adresse.zusatz|truncate:60:"...":false|escape}</label>
{/if} {/if}
<br /> <br />
<label class='artlabel'>Adresserweiterung: </label> <label class='artlabel'>Adresserweiterung: </label>
<input class='art' name="adresserweiterung" value="{$rechnung.adresserweiterung}" /> <input class='art' name="adresserweiterung" value="{$rechnung.adresserweiterung|escape}" />
<br /> <br />
<input name="adressid" type="hidden" value="{$adresse.adressid}" /> <input name="adressid" type="hidden" value="{$adresse.adressid|escape}" />
<button type="button" class='preview' onclick="ajax_loadUmschlagpreview();">Vorschau aktualisieren</button><br /> <button type="button" class='preview' onclick="ajax_loadUmschlagpreview();">Vorschau aktualisieren</button><br />
</fieldset> </fieldset>
</form> </form>
+1 -1
View File
@@ -10,7 +10,7 @@
<table><tr><th>Name</th><th>Aktion</th></tr> <table><tr><th>Name</th><th>Aktion</th></tr>
{foreach $keys as $key} {foreach $keys as $key}
<tr> <tr>
<td>{$key.name}</td> <td>{$key.name|escape}</td>
<td><a href="?action=userkeys&amp;id={$user.id}&amp;del={$key.id}"><span class="del" title="Passkey löschen"></span></a></td> <td><a href="?action=userkeys&amp;id={$user.id}&amp;del={$key.id}"><span class="del" title="Passkey löschen"></span></a></td>
</tr> </tr>
{/foreach} {/foreach}
+420
View File
@@ -0,0 +1,420 @@
<?php
/*
* Migration einer Instanz-Datenbank auf das Schema update/schema.sql
* (utf8mb4) mit Reparatur doppelt kodierter Texte.
*
* Hintergrund: Die Anwendung hat jahrelang UTF-8 aus dem Browser über eine
* Verbindung geschrieben, die der Server als latin1 behandelt hat. Aus "ä"
* wurde dabei "ä". Datensätze, die auf anderem Weg entstanden sind
* (phpMyAdmin, neuere Server-Defaults), können dagegen korrekt sein. Deshalb
* wird jeder Wert einzeln geprüft und nur repariert, wenn er eindeutig
* doppelt kodiert ist.
*
* Aufruf im Installationsverzeichnis der Instanz (die Zugangsdaten kommen
* aus deren Config):
*
* php update/migration-utf8mb4.php pruefen
* Liest nur und gibt einen Bericht aus. Ändert nichts.
*
* php update/migration-utf8mb4.php migrieren <zieldatenbank>
* Legt die Zieldatenbank mit update/schema.sql an und kopiert alle
* Daten hinein. Die Quelldatenbank bleibt unverändert. Die Ziel-
* datenbank darf noch nicht existieren oder muss leer sein.
*
* Für lokale Tests lässt sich die Config übergehen:
* --server=127.0.0.1:3307 --user=root --db=wagner
* Das Passwort kommt dann aus der Umgebungsvariable MIGRATION_PW, damit es
* nicht in der Prozessliste steht.
*/
if(PHP_SAPI != "cli")
exit("Nur per Kommandozeile aufrufbar.\n");
require_once(__DIR__."/../incs/db.php");
function fehler($text)
{
fwrite(STDERR, "FEHLER: ".$text."\n");
exit(1);
}
/* ---------------------------------------------------------------------
* Kodierung
* ------------------------------------------------------------------ */
/*
* Umkehrung dessen, was MariaDB beim Speichern gemacht hat: Unicode-Text
* zurück in die Bytes von MySQL-"latin1" (das ist cp1252; die fünf dort
* undefinierten Bytes bildet MySQL auf U+0081, U+008D, U+008F, U+0090 und
* U+009D ab). Gibt null zurück, wenn ein Zeichen in latin1 nicht vorkommt -
* dann kann der Wert nicht über eine latin1-Verbindung entstanden sein.
*/
function latin1Bytes($text)
{
static $cp1252 = array(
0x20AC => 0x80, 0x201A => 0x82, 0x0192 => 0x83, 0x201E => 0x84,
0x2026 => 0x85, 0x2020 => 0x86, 0x2021 => 0x87, 0x02C6 => 0x88,
0x2030 => 0x89, 0x0160 => 0x8A, 0x2039 => 0x8B, 0x0152 => 0x8C,
0x017D => 0x8E, 0x2018 => 0x91, 0x2019 => 0x92, 0x201C => 0x93,
0x201D => 0x94, 0x2022 => 0x95, 0x2013 => 0x96, 0x2014 => 0x97,
0x02DC => 0x98, 0x2122 => 0x99, 0x0161 => 0x9A, 0x203A => 0x9B,
0x0153 => 0x9C, 0x017E => 0x9E, 0x0178 => 0x9F,
0x0081 => 0x81, 0x008D => 0x8D, 0x008F => 0x8F, 0x0090 => 0x90,
0x009D => 0x9D,
);
$bytes = "";
foreach(preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY) as $zeichen)
{
$cp = codepoint($zeichen);
if($cp < 0x80 || ($cp >= 0xA0 && $cp <= 0xFF))
$bytes .= chr($cp);
elseif(isset($cp1252[$cp]))
$bytes .= chr($cp1252[$cp]);
else
return null;
}
return $bytes;
}
function codepoint($zeichen)
{
$b = array_values(unpack("C*", $zeichen));
switch(count($b))
{
case 1: return $b[0];
case 2: return (($b[0] & 0x1F) << 6) | ($b[1] & 0x3F);
case 3: return (($b[0] & 0x0F) << 12) | (($b[1] & 0x3F) << 6) | ($b[2] & 0x3F);
default: return (($b[0] & 0x07) << 18) | (($b[1] & 0x3F) << 12) | (($b[2] & 0x3F) << 6) | ($b[3] & 0x3F);
}
}
/*
* Ordnet einen Textwert ein und liefert array(kategorie, neuer_wert).
*
* ascii nur ASCII, unverändert
* korrekt enthält Nicht-ASCII, ist aber kein doppelt kodierter Text
* repariert war doppelt kodiert
* mehrfach war mehr als doppelt kodiert
* unklar sieht teilweise doppelt kodiert aus, lässt sich aber nicht
* eindeutig zurückführen; bleibt unverändert
*/
function pruefeText($wert)
{
if(!preg_match('/[^\x00-\x7F]/', $wert))
return array("ascii", $wert);
$runden = 0;
$aktuell = $wert;
while($runden < 5)
{
$bytes = latin1Bytes($aktuell);
// Echte Umlaute in latin1-Bytes ("M\xFCller") sind kein gültiges
// UTF-8. Nur wenn die Bytes gültiges UTF-8 mit Nicht-ASCII ergeben,
// war der Text doppelt kodiert.
if($bytes === null || !preg_match('//u', $bytes) || !preg_match('/[^\x00-\x7F]/', $bytes))
break;
$aktuell = $bytes;
$runden++;
}
if($runden == 1)
return array("repariert", $aktuell);
if($runden > 1)
return array("mehrfach", $aktuell);
// Typische Reste doppelter Kodierung neben Zeichen, die nicht aus
// latin1 stammen können: gemischter Wert, nicht automatisch lösbar.
if(preg_match('/[\x{00C2}\x{00C3}][\x{0080}-\x{00BF}\x{0152}\x{0153}\x{0160}\x{0161}\x{0178}\x{017D}\x{017E}\x{0192}\x{02C6}\x{02DC}\x{2013}\x{2014}\x{2018}-\x{201E}\x{2020}-\x{2022}\x{2026}\x{2030}\x{2039}\x{203A}\x{20AC}\x{2122}]/u', $wert))
return array("unklar", $wert);
return array("korrekt", $wert);
}
/* ---------------------------------------------------------------------
* Aufruf und Verbindung
* ------------------------------------------------------------------ */
$modus = null;
$zielDb = null;
$optionen = array();
foreach(array_slice($argv, 1) as $arg)
{
if(preg_match('/^--(server|user|db)=(.*)$/', $arg, $m))
$optionen[$m[1]] = $m[2];
elseif($modus === null)
$modus = $arg;
elseif($zielDb === null)
$zielDb = $arg;
else
fehler("Unbekanntes Argument: ".$arg);
}
if($modus != "pruefen" && $modus != "migrieren")
fehler("Aufruf: php update/migration-utf8mb4.php pruefen | migrieren <zieldatenbank>");
if($modus == "migrieren" && !preg_match('/^[A-Za-z0-9_]+$/', (string)$zielDb))
fehler("Zieldatenbank fehlt oder enthält unzulässige Zeichen.");
if(isset($optionen["db"]))
{
$server = isset($optionen["server"]) ? $optionen["server"] : "localhost";
$user = isset($optionen["user"]) ? $optionen["user"] : "";
$pw = (string)getenv("MIGRATION_PW");
$quellDb = $optionen["db"];
}
else
{
require_once(__DIR__."/../incs/constants.php");
require_once(__DIR__."/../incs/settings.php");
if(readsettings() != "valid")
fehler("Konfiguration ".CONFIG_PATH.CONFIG_FILE." nicht lesbar. Im Installationsverzeichnis der Instanz aufrufen.");
$server = $mysql_server;
$user = $mysql_user;
$pw = $mysql_pw;
$quellDb = $mysql_db;
}
if($modus == "migrieren" && strcasecmp($zielDb, $quellDb) == 0)
fehler("Quelle und Ziel sind dieselbe Datenbank.");
// Lesen immer als utf8mb4: Der Server wandelt dabei nur um, die Reparatur
// passiert ausschließlich hier im Skript.
$quelle = db_verbinden($server, $user, $pw, $quellDb) or fehler("Keine Verbindung zu ".$quellDb.": ".mysqli_connect_error());
/* Spalten einer Datenbank: tabelle(klein) => array(name, spalten) */
function tabellen($dbconn, $db)
{
$tabellen = array();
$zeilen = db_zeilen($dbconn, "SELECT table_name AS t, column_name AS c, data_type AS typ, is_nullable AS nullbar, column_default AS standard, character_set_name AS zeichensatz, extra
FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position", array($db));
foreach($zeilen as $z)
{
$schluessel = strtolower($z["t"]);
if(!isset($tabellen[$schluessel]))
$tabellen[$schluessel] = array("name" => $z["t"], "spalten" => array());
$tabellen[$schluessel]["spalten"][$z["c"]] = $z;
}
return $tabellen;
}
$quellTabellen = tabellen($quelle, $quellDb);
if(!$quellTabellen)
fehler("Datenbank ".$quellDb." enthält keine Tabellen.");
/* ---------------------------------------------------------------------
* Zielschema anlegen
* ------------------------------------------------------------------ */
$ziel = null;
if($modus == "migrieren")
{
$vorhanden = db_wert($quelle, "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = ?", array($zielDb));
if($vorhanden > 0)
fehler("Zieldatenbank ".$zielDb." existiert und ist nicht leer.");
mysqli_query($quelle, "CREATE DATABASE IF NOT EXISTS `".$zielDb."` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
or fehler("Zieldatenbank nicht anlegbar: ".mysqli_error($quelle));
$ziel = db_verbinden($server, $user, $pw, $zielDb) or fehler("Keine Verbindung zu ".$zielDb.": ".mysqli_connect_error());
$schema = file_get_contents(__DIR__."/schema.sql") or fehler("update/schema.sql nicht lesbar.");
if(!mysqli_multi_query($ziel, $schema))
fehler("Schema: ".mysqli_error($ziel));
do {
if($r = mysqli_store_result($ziel))
mysqli_free_result($r);
} while(mysqli_more_results($ziel) && mysqli_next_result($ziel));
if(mysqli_errno($ziel))
fehler("Schema: ".mysqli_error($ziel));
// Beim Kopieren: ids 0 behalten, Fremdschlüssel erst hinterher prüfen.
mysqli_query($ziel, "SET SESSION sql_mode = 'STRICT_ALL_TABLES,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION'");
mysqli_query($ziel, "SET FOREIGN_KEY_CHECKS = 0");
$zielTabellen = tabellen($ziel, $zielDb);
}
else
{
// Im Prüfmodus zählt das Schema aus der Datei nicht - geprüft wird,
// was in der Quelle steht.
$zielTabellen = $quellTabellen;
}
/* ---------------------------------------------------------------------
* Tabellen durchgehen
* ------------------------------------------------------------------ */
/* Wert für eine Spalte, die es in der Quelle nicht gibt */
function ersatzwert($spalte)
{
if(stripos($spalte["extra"], "auto_increment") !== false)
return null; // Spalte weglassen, die Datenbank vergibt die Werte
if($spalte["standard"] !== null && strtoupper($spalte["standard"]) !== "NULL")
return null; // Spalte weglassen, DEFAULT greift
if($spalte["nullbar"] == "YES")
return array(null);
return array(leerwert($spalte));
}
/* Was der alte, nicht strikte Modus für einen fehlenden Wert eingesetzt hätte */
function leerwert($spalte)
{
switch($spalte["typ"])
{
case "date": return "0000-00-00";
case "datetime": case "timestamp": return "0000-00-00 00:00:00";
case "time": return "00:00:00";
case "char": case "varchar": case "text": case "tinytext": case "mediumtext": case "longtext": case "enum": case "set":
return "";
default: return 0;
}
}
$bericht = array();
$hinweise = array();
foreach($quellTabellen as $schluessel => $q)
if(!isset($zielTabellen[$schluessel]))
$hinweise[] = "Tabelle ".$q["name"]." gibt es im neuen Schema nicht, sie wird nicht übernommen.";
foreach($zielTabellen as $schluessel => $z)
{
if(!isset($quellTabellen[$schluessel]))
{
$hinweise[] = "Tabelle ".$z["name"]." fehlt in der Quelle und bleibt leer.";
continue;
}
$q = $quellTabellen[$schluessel];
$gemeinsam = array();
$ergaenzt = array();
foreach($z["spalten"] as $name => $spalte)
{
if(isset($q["spalten"][$name]))
$gemeinsam[] = $name;
elseif(($ersatz = ersatzwert($spalte)) !== null)
$ergaenzt[$name] = $ersatz[0];
elseif(stripos($spalte["extra"], "auto_increment") === false)
$hinweise[] = "Spalte ".$z["name"].".".$name." fehlt in der Quelle, es gilt der Standardwert ".$spalte["standard"].".";
}
foreach(array_diff(array_keys($q["spalten"]), array_keys($z["spalten"])) as $name)
$hinweise[] = "Spalte ".$q["name"].".".$name." gibt es im neuen Schema nicht, sie wird nicht übernommen.";
foreach($ergaenzt as $name => $wert)
$hinweise[] = "Spalte ".$z["name"].".".$name." fehlt in der Quelle und wird mit ".var_export($wert, true)." gefüllt.";
// Im Ziel Pflicht, in der Quelle darf NULL stehen: dort den Leerwert
// einsetzen, sonst lehnt der strikte Modus die Zeile ab.
$nullErsatz = array();
foreach($gemeinsam as $name)
if($z["spalten"][$name]["nullbar"] == "NO" && $q["spalten"][$name]["nullbar"] == "YES")
$nullErsatz[$name] = 0;
$textSpalten = array();
foreach($gemeinsam as $name)
if($q["spalten"][$name]["zeichensatz"] !== null)
$textSpalten[] = $name;
$liste = implode(", ", array_map(function($n) { return "`".$n."`"; }, $gemeinsam));
$res = mysqli_query($quelle, "SELECT ".$liste." FROM `".$q["name"]."`", MYSQLI_USE_RESULT)
or fehler($q["name"].": ".mysqli_error($quelle));
$stmt = null;
if($ziel)
{
$spaltenZiel = array_merge($gemeinsam, array_keys($ergaenzt));
$sql = "INSERT INTO `".$z["name"]."` (".implode(", ", array_map(function($n) { return "`".$n."`"; }, $spaltenZiel)).") VALUES (".implode(", ", array_fill(0, count($spaltenZiel), "?")).")";
$stmt = mysqli_prepare($ziel, $sql) or fehler($z["name"].": ".mysqli_error($ziel));
mysqli_begin_transaction($ziel);
}
$zeilen = 0;
while($zeile = mysqli_fetch_assoc($res))
{
$zeilen++;
foreach($textSpalten as $name)
{
if($zeile[$name] === null)
continue;
list($kategorie, $neu) = pruefeText($zeile[$name]);
if(!isset($bericht[$q["name"]][$name]))
$bericht[$q["name"]][$name] = array("ascii" => 0, "korrekt" => 0, "repariert" => 0, "mehrfach" => 0, "unklar" => 0, "unklar_ids" => array());
$bericht[$q["name"]][$name][$kategorie]++;
if($kategorie == "unklar" && isset($zeile["id"]) && count($bericht[$q["name"]][$name]["unklar_ids"]) < 20)
$bericht[$q["name"]][$name]["unklar_ids"][] = $zeile["id"];
$zeile[$name] = $neu;
}
foreach($nullErsatz as $name => $anzahl)
{
if($zeile[$name] === null)
{
$zeile[$name] = leerwert($z["spalten"][$name]);
$nullErsatz[$name]++;
}
}
if($stmt)
{
$werte = array_merge(array_values($zeile), array_values($ergaenzt));
mysqli_stmt_execute($stmt, $werte)
or fehler($z["name"].", Zeile ".$zeilen.(isset($zeile["id"]) ? " (id ".$zeile["id"].")" : "").": ".mysqli_stmt_error($stmt));
}
}
mysqli_free_result($res);
foreach($nullErsatz as $name => $anzahl)
if($anzahl > 0)
$hinweise[] = "Spalte ".$z["name"].".".$name.": ".$anzahl." Zeilen mit NULL, im neuen Schema Pflichtfeld, gefüllt mit ".var_export(leerwert($z["spalten"][$name]), true).".";
if($stmt)
{
mysqli_commit($ziel);
mysqli_stmt_close($stmt);
$anzahl = db_wert($ziel, "SELECT COUNT(*) FROM `".$z["name"]."`");
if($anzahl != $zeilen)
fehler($z["name"].": ".$zeilen." Zeilen gelesen, aber ".$anzahl." im Ziel.");
}
$bericht[$q["name"]]["_zeilen"] = $zeilen;
}
/* ---------------------------------------------------------------------
* Fremdschlüssel prüfen (nur Ziel)
* ------------------------------------------------------------------ */
$verwaist = array();
if($ziel)
{
mysqli_query($ziel, "SET FOREIGN_KEY_CHECKS = 1");
$fks = db_zeilen($ziel, "SELECT table_name AS t, column_name AS c, referenced_table_name AS rt, referenced_column_name AS rc
FROM information_schema.key_column_usage WHERE table_schema = ? AND referenced_table_name IS NOT NULL", array($zielDb));
foreach($fks as $fk)
{
$anzahl = db_wert($ziel, "SELECT COUNT(*) FROM `".$fk["t"]."` k LEFT JOIN `".$fk["rt"]."` e ON e.`".$fk["rc"]."` = k.`".$fk["c"]."` WHERE k.`".$fk["c"]."` IS NOT NULL AND e.`".$fk["rc"]."` IS NULL");
if($anzahl > 0)
$verwaist[] = sprintf("%s.%s -> %s.%s: %d Zeilen ohne Gegenstück", $fk["t"], $fk["c"], $fk["rt"], $fk["rc"], $anzahl);
}
}
/* ---------------------------------------------------------------------
* Bericht
* ------------------------------------------------------------------ */
echo "Migration utf8mb4 - ".($modus == "pruefen" ? "Prüfmodus (nichts geändert)" : "Migration nach ".$zielDb)."\n";
echo "Quelle: ".$quellDb."\n\n";
$summe = array("repariert" => 0, "mehrfach" => 0, "unklar" => 0, "korrekt" => 0);
printf("%-40s %8s %8s %9s %8s %7s\n", "Spalte", "Zeilen", "korrekt", "repariert", "mehrfach", "unklar");
foreach($bericht as $tabelle => $spalten)
{
$zeilen = $spalten["_zeilen"];
unset($spalten["_zeilen"]);
foreach($spalten as $spalte => $w)
{
foreach($summe as $k => $v)
$summe[$k] += $w[$k];
if($w["korrekt"] + $w["repariert"] + $w["mehrfach"] + $w["unklar"] == 0)
continue; // reine ASCII-Spalte
printf("%-40s %8d %8d %9d %8d %7d\n", $tabelle.".".$spalte, $zeilen, $w["korrekt"], $w["repariert"], $w["mehrfach"], $w["unklar"]);
if($w["unklar_ids"])
echo " unklar bei id: ".implode(", ", $w["unklar_ids"]).(count($w["unklar_ids"]) == 20 ? ", ..." : "")."\n";
}
}
printf("\nSumme: %d korrekt, %d repariert, %d mehrfach kodiert, %d unklar\n", $summe["korrekt"], $summe["repariert"], $summe["mehrfach"], $summe["unklar"]);
if($hinweise)
echo "\nHinweise:\n - ".implode("\n - ", $hinweise)."\n";
if($ziel)
echo "\nFremdschlüssel: ".($verwaist ? "\n - ".implode("\n - ", $verwaist) : "alle Verweise gültig")."\n";
+5 -4
View File
@@ -38,6 +38,7 @@ if(!file_put_contents (CONFIG_PATH.CONFIG_FILE,
global $openweathermap_appid; global $openweathermap_appid;
global $aeris_client_id; global $aeris_client_id;
global $aeris_client_secret; global $aeris_client_secret;
global $lokale_netze;
$instanz = '.var_export(INSTANZ, true).'; $instanz = '.var_export(INSTANZ, true).';
$dbconn = 0; $dbconn = 0;
@@ -60,6 +61,8 @@ if(!file_put_contents (CONFIG_PATH.CONFIG_FILE,
$openweathermap_appid = ""; $openweathermap_appid = "";
$aeris_client_id = ""; $aeris_client_id = "";
$aeris_client_secret = ""; $aeris_client_secret = "";
// Netze, aus denen Passwort-Login erlaubt ist (CIDR). Nie das Docker-Netz!
$lokale_netze = array();
?>')) ?>'))
{ {
$err= error("Konfiguration konnte nicht geschrieben werden!"); $err= error("Konfiguration konnte nicht geschrieben werden!");
@@ -69,10 +72,8 @@ else
$settings=readsettings(); $settings=readsettings();
if($settings == "valid") if($settings == "valid")
{ {
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw)) if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
$err = error("Verbindung zur Datenbank fehlgeschlagen!!"); $err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
if(!@mysqli_select_db($dbconn,$mysql_db))
$err = error("Datenbank nicht gefunden!!");
if(!$err) if(!$err)
+677
View File
@@ -0,0 +1,677 @@
-- Schema der Kundenverwaltung
--
-- Maßgeblich ist die Datenbank der Instanz kunden; project und work
-- stammen aus ingwa, weil sie dort fehlen, der Code sie aber braucht.
-- Einheitlich utf8mb4. Die Anwendung verbindet sich im strikten sql_mode
-- (siehe db_verbinden() in incs/db.php).
--
-- Pflichtspalten haben als DEFAULT den Wert, den der frühere nicht strikte
-- Modus beim Weglassen eingesetzt hat ('', 0, Nulldatum). Weggelassene
-- Spalten verhalten sich damit wie bisher; ungültige Werte, zu lange Texte
-- und falsche Verweise lehnt der strikte Modus trotzdem ab.
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE `accesstype` (
`id` tinyint(3) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `addKey` (
`accesskey` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `adresse` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`partner_id` int(11) NOT NULL DEFAULT 0,
`anrede_id` int(5) NOT NULL DEFAULT 0,
`anrede2_id` int(5) NOT NULL DEFAULT 0,
`titel_id` int(5) NOT NULL DEFAULT 0,
`titel2_id` int(5) NOT NULL DEFAULT 0,
`vname` varchar(50) NOT NULL DEFAULT '',
`vname2` varchar(50) NOT NULL DEFAULT '',
`nname` varchar(50) NOT NULL DEFAULT '',
`nname2` varchar(50) NOT NULL DEFAULT '',
`firma` varchar(50) NOT NULL DEFAULT '',
`str_id` int(11) NOT NULL DEFAULT 0,
`typ_id` int(2) NOT NULL DEFAULT 0,
`hnr` varchar(10) NOT NULL DEFAULT '',
`zusatz` varchar(100) NOT NULL DEFAULT '',
`gebdat` date NOT NULL DEFAULT '0000-00-00',
`gebdat2` date NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
KEY `fk_partner_titel_id` (`titel_id`),
KEY `fk_partner_anrede_id` (`anrede_id`),
KEY `fk_adr_str_id` (`str_id`),
KEY `fk_adr_typ_id` (`typ_id`),
KEY `onlyoneadresstype` (`partner_id`,`typ_id`),
CONSTRAINT `fk_adr_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_adr_str_id` FOREIGN KEY (`str_id`) REFERENCES `strasse` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_adr_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `adresstyp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_partner_anrede_id` FOREIGN KEY (`anrede_id`) REFERENCES `anrede` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_partner_titel_id` FOREIGN KEY (`titel_id`) REFERENCES `titel` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `adresstyp` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `altlasten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vacationdays` int(11) NOT NULL DEFAULT 0,
`hours` decimal(8,4) NOT NULL DEFAULT 0,
`ma_id` int(11) NOT NULL DEFAULT 0,
`last_generated` date NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
KEY `fk_altlasten_user_id` (`ma_id`),
CONSTRAINT `fk_altlasten_user_id` FOREIGN KEY (`ma_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `anrede` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`anrede` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(150) NOT NULL DEFAULT '',
`typ_id` int(5) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_id` int(11) NOT NULL DEFAULT 0,
`einheit_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_artikel_typ_id` (`typ_id`),
KEY `fk_art_rech_einheit_id` (`einheit_id`),
KEY `fk_artikel_user_id` (`user_id`),
CONSTRAINT `fk_art_rech_einheit_id` FOREIGN KEY (`einheit_id`) REFERENCES `einheit` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_artikel_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `artikeltyp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_artikel_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikel_eigensch` (
`art_id` int(11) NOT NULL DEFAULT 0,
`eig_id` int(11) NOT NULL DEFAULT 0,
`rech_id` int(11) NOT NULL DEFAULT 0,
`posnr` int(5) NOT NULL DEFAULT 0,
`artposnr` int(11) NOT NULL DEFAULT 0,
KEY `fk_art_eig_art_id` (`art_id`),
KEY `fk_art_eig_rech_id` (`rech_id`),
KEY `fk_art_eig_eig_id` (`eig_id`),
CONSTRAINT `fk_art_eig_art_id` FOREIGN KEY (`art_id`) REFERENCES `artikel` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_art_eig_eig_id` FOREIGN KEY (`eig_id`) REFERENCES `eigensch` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_art_eig_rech_id` FOREIGN KEY (`rech_id`) REFERENCES `rechnung` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikel_rechn` (
`art_id` int(11) NOT NULL DEFAULT 0,
`rech_id` int(11) NOT NULL DEFAULT 0,
`posnr` int(5) NOT NULL DEFAULT 0,
`rabatt` int(3) NOT NULL DEFAULT 0,
`rabatttyp` int(2) NOT NULL DEFAULT 0,
`menge` decimal(6,3) NOT NULL DEFAULT 0,
`preis` decimal(10,2) DEFAULT NULL,
`angtyp` int(1) NOT NULL DEFAULT 0,
`artmwst` int(3) NOT NULL DEFAULT 0,
`wanr` varchar(100) NOT NULL DEFAULT '',
`pagebreak` int(1) NOT NULL DEFAULT 0,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `fk_art_rech_art_id` (`art_id`),
KEY `fk_art_rech_rech_id` (`rech_id`),
CONSTRAINT `fk_art_rech_art_id` FOREIGN KEY (`art_id`) REFERENCES `artikel` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_art_rech_rech_id` FOREIGN KEY (`rech_id`) REFERENCES `rechnung` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikel_termin` (
`art_id` int(11) NOT NULL DEFAULT 0,
`termin_id` int(11) NOT NULL DEFAULT 0,
`menge` decimal(6,3) NOT NULL DEFAULT 0,
`rabatt` int(3) NOT NULL DEFAULT 0,
`wanr` varchar(100) NOT NULL DEFAULT '',
KEY `fk_art_term_art_id` (`art_id`),
KEY `fk_art_term_ang_id` (`termin_id`),
CONSTRAINT `fk_art_term_ang_id` FOREIGN KEY (`termin_id`) REFERENCES `termin` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_art_term_art_id` FOREIGN KEY (`art_id`) REFERENCES `artikel` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikelsks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rechnr` int(11) NOT NULL DEFAULT 0,
`bezeichn1` varchar(60) NOT NULL DEFAULT '',
`bezeichn2` varchar(60) NOT NULL DEFAULT '',
`menge` decimal(6,3) NOT NULL DEFAULT 0,
`beschr` text DEFAULT NULL,
`pos` tinyint(3) NOT NULL DEFAULT 0,
`rabatt` tinyint(3) NOT NULL DEFAULT 0,
`preis` decimal(10,2) DEFAULT NULL,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `fk_artikelsks_rech_id` (`rechnr`),
CONSTRAINT `fk_artikelsks_rech_id` FOREIGN KEY (`rechnr`) REFERENCES `rechnung` (`rechnr`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `artikeltyp` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(50) NOT NULL DEFAULT '',
`dropdown` tinyint(1) NOT NULL DEFAULT 0,
`list` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `ausgabe` (
`id` int(11) NOT NULL DEFAULT 0,
`user_id` int(11) NOT NULL DEFAULT 0,
`partner_id` int(11) NOT NULL DEFAULT 0,
`rec_kto_id` int(11) NOT NULL DEFAULT 0,
`send_kto_id` int(11) NOT NULL DEFAULT 0,
`betr` decimal(12,3) NOT NULL DEFAULT 0,
`rabatt` decimal(4,1) NOT NULL DEFAULT 0,
KEY `fk_ausg_user_id` (`user_id`),
KEY `fk_ausg_reckto_id` (`rec_kto_id`),
KEY `fk_ausg_sendkto_id` (`send_kto_id`),
KEY `fk_ausg_partner_id` (`partner_id`),
CONSTRAINT `fk_ausg_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_ausg_reckto_id` FOREIGN KEY (`rec_kto_id`) REFERENCES `konto` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_ausg_sendkto_id` FOREIGN KEY (`send_kto_id`) REFERENCES `konto` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_ausg_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `bank` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`blz` varchar(30) NOT NULL DEFAULT '',
`bank` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `buchungsKontos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kto` int(11) NOT NULL DEFAULT 0,
`name` varchar(100) NOT NULL DEFAULT '',
`descr` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `eigensch` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(100) NOT NULL DEFAULT '',
`wert` varchar(50) NOT NULL DEFAULT '',
`einheit_id` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_eigensch_user_id` (`user_id`),
KEY `fk_eigensch_einheit_id` (`einheit_id`),
CONSTRAINT `fk_eigensch_einheit_id` FOREIGN KEY (`einheit_id`) REFERENCES `einheit` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_eigensch_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `einheit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`einheit` varchar(10) NOT NULL DEFAULT '',
`si` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `kontakt` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`partner_id` int(11) NOT NULL DEFAULT 0,
`typ_id` int(3) NOT NULL DEFAULT 0,
`kontakt` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fk_kontakt_typ_id` (`typ_id`),
KEY `fk_kontakt_partner_id` (`partner_id`),
CONSTRAINT `fk_kontakt_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_kontakt_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `kontakttyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `kontakttyp` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `konto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bank_id` int(5) NOT NULL DEFAULT 0,
`partner_id` int(11) NOT NULL DEFAULT 0,
`inhaber` varchar(50) NOT NULL DEFAULT '',
`iban` varchar(30) NOT NULL DEFAULT '',
`swift` varchar(15) NOT NULL DEFAULT '',
`ktonr` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fk_kto_partner_id` (`partner_id`),
KEY `fk_kto_bank_id` (`bank_id`),
CONSTRAINT `fk_kto_bank_id` FOREIGN KEY (`bank_id`) REFERENCES `bank` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_kto_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `land` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`land_short` varchar(5) NOT NULL DEFAULT '',
`land` varchar(30) NOT NULL DEFAULT '',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`typ_id` tinyint(3) NOT NULL DEFAULT 0,
`user_id` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`qry` text NOT NULL DEFAULT '',
`undo_qry` text DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_log_accesstype_id` (`typ_id`),
KEY `fk_log_user_id` (`user_id`),
CONSTRAINT `fk_log_accesstype_id` FOREIGN KEY (`typ_id`) REFERENCES `accesstype` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_log_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`send_id` int(11) NOT NULL DEFAULT 0,
`rec_id` int(11) NOT NULL DEFAULT 0,
`head` varchar(50) DEFAULT NULL,
`msg` text NOT NULL DEFAULT '',
`rd` tinyint(1) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `fk_msg_senduser_id` (`send_id`),
KEY `fk_msg_recuser_id` (`rec_id`),
CONSTRAINT `fk_msg_recuser_id` FOREIGN KEY (`rec_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_msg_senduser_id` FOREIGN KEY (`send_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `mwst` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`mwst` decimal(4,1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `mykonto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bank_id` int(5) NOT NULL DEFAULT 0,
`inhaber` varchar(50) NOT NULL DEFAULT '',
`iban` varchar(30) NOT NULL DEFAULT '',
`swift` varchar(15) NOT NULL DEFAULT '',
`ktonr` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fk_mykto_bank_id` (`bank_id`),
CONSTRAINT `fk_mykto_bank_id` FOREIGN KEY (`bank_id`) REFERENCES `bank` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `notiz` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`partner_id` int(11) NOT NULL DEFAULT 0,
`notiz` text NOT NULL DEFAULT '',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`color` varchar(6) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fk_notizen_partner_id` (`partner_id`),
CONSTRAINT `fk_notizen_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `ort` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ort` varchar(30) NOT NULL DEFAULT '',
`ortsteil` varchar(30) NOT NULL DEFAULT '',
`plz` varchar(15) NOT NULL DEFAULT '',
`vwahl` varchar(15) NOT NULL DEFAULT '',
`land_id` int(5) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_ort_land_id` (`land_id`),
CONSTRAINT `fk_ort_land_id` FOREIGN KEY (`land_id`) REFERENCES `land` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `partner` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime_new` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`datetime_lastchange` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_id` int(11) NOT NULL DEFAULT 0,
`typ_id` int(2) NOT NULL DEFAULT 0,
`zahlziel_id` int(3) NOT NULL DEFAULT 0,
`rabatt` int(3) NOT NULL DEFAULT 0,
`sks_not_checked` int(1) NOT NULL DEFAULT 0,
`sks_kdnotiz` text NOT NULL DEFAULT '',
`updated_by` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_partner_typ_id` (`typ_id`),
KEY `fk_partner_zahlziel_id` (`zahlziel_id`),
KEY `fk_partner_user_id` (`user_id`),
CONSTRAINT `fk_partner_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `partnertyp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_partner_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_partner_zahlziel_id` FOREIGN KEY (`zahlziel_id`) REFERENCES `zahlziel` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `partnertyp` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`typ` varchar(15) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `passkeys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lastAuth` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`name` varchar(40) NOT NULL DEFAULT '',
`userId` int(11) NOT NULL DEFAULT 0,
`credentialId` varchar(1023) NOT NULL DEFAULT '',
`credentialPublicKey` text NOT NULL DEFAULT '',
`signatureCounter` text NOT NULL DEFAULT '',
`authKey` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `project` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL DEFAULT '',
`name2` varchar(150) NOT NULL DEFAULT '',
`partner_id` int(11) NOT NULL DEFAULT 0,
`changetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changeuser` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`intro` text NOT NULL DEFAULT '',
`outro` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fek_proj_partner_id` (`partner_id`),
CONSTRAINT `fek_proj_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `rechnr` (
`rechnr` int(11) NOT NULL DEFAULT 0,
`typ_id` int(5) NOT NULL DEFAULT 0,
PRIMARY KEY (`rechnr`,`typ_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `rechnung` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`adressfields` varchar(12) NOT NULL DEFAULT '',
`anrede1` varchar(150) NOT NULL DEFAULT '',
`anrede2` varchar(150) NOT NULL DEFAULT '',
`partner_id` int(11) NOT NULL DEFAULT 0,
`mwst_id` int(3) NOT NULL DEFAULT 0,
`user_id` int(11) NOT NULL DEFAULT 0,
`typ_id` int(2) NOT NULL DEFAULT 0,
`zahlziel_id` int(3) NOT NULL DEFAULT 0,
`adresse_id` int(11) NOT NULL DEFAULT 0,
`wahrung_id` tinyint(3) NOT NULL DEFAULT 0,
`changetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changeuser` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`rechnr` int(11) NOT NULL DEFAULT 0,
`rabatt` int(3) NOT NULL DEFAULT 0,
`rabattdesc` varchar(100) NOT NULL DEFAULT '',
`intro` text NOT NULL DEFAULT '',
`outro` text NOT NULL DEFAULT '',
`sks` tinyint(1) NOT NULL DEFAULT 0,
`sub_mwst` int(1) NOT NULL DEFAULT 0,
`kommission` int(11) NOT NULL DEFAULT 0,
`lieferdatum` varchar(100) NOT NULL DEFAULT '',
`adresserweiterung` varchar(100) NOT NULL DEFAULT '',
`storno` int(1) NOT NULL DEFAULT 0,
`stornodate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`buchungsKto_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fek_rech_partner_id` (`partner_id`),
KEY `fek_rech_adresse_id` (`adresse_id`),
KEY `fek_rech_mwst_id` (`mwst_id`),
KEY `fek_rech_user_id` (`user_id`),
KEY `fek_rech_zahlziehl_id` (`zahlziel_id`),
KEY `fek_rech_typ_id` (`typ_id`),
KEY `fek_rech_wahrung_id` (`wahrung_id`),
KEY `rechnr` (`rechnr`),
KEY `fk_rech_buchungsKto_id` (`buchungsKto_id`),
CONSTRAINT `fek_rech_adresse_id` FOREIGN KEY (`adresse_id`) REFERENCES `adresse` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_mwst_id` FOREIGN KEY (`mwst_id`) REFERENCES `mwst` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `rechtyp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_wahrung_id` FOREIGN KEY (`wahrung_id`) REFERENCES `wahrung` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fek_rech_zahlziehl_id` FOREIGN KEY (`zahlziel_id`) REFERENCES `zahlziel` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_rech_buchungsKto_id` FOREIGN KEY (`buchungsKto_id`) REFERENCES `buchungsKontos` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `rechtyp` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `setting` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT 0,
`opt` varchar(10) NOT NULL DEFAULT '',
`val` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `fk_settings_user_id` (`user_id`),
CONSTRAINT `fk_settings_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `strasse` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`str` varchar(50) NOT NULL DEFAULT '',
`ort_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_str_ort_id` (`ort_id`),
CONSTRAINT `fk_str_ort_id` FOREIGN KEY (`ort_id`) REFERENCES `ort` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `tel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ort_id` int(11) NOT NULL DEFAULT 0,
`partner_id` int(11) NOT NULL DEFAULT 0,
`typ_id` int(3) NOT NULL DEFAULT 0,
`nr` varchar(20) NOT NULL DEFAULT '',
`name` varchar(30) NOT NULL DEFAULT '',
`adresse_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_tel_ort_id` (`ort_id`),
KEY `fk_tel_typ_id` (`typ_id`),
KEY `fk_tel_partner_id` (`partner_id`),
CONSTRAINT `fk_tel_ort_id` FOREIGN KEY (`ort_id`) REFERENCES `ort` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tel_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tel_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `teltyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `teltyp` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `termin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`typ` int(2) NOT NULL DEFAULT 0,
`adresse_id` int(11) NOT NULL DEFAULT 0,
`text` text NOT NULL DEFAULT '',
`changetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`done` tinyint(1) NOT NULL DEFAULT 0,
`user` int(11) NOT NULL DEFAULT 0,
`changeuser` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`termtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`termdauer` time NOT NULL DEFAULT '00:00:00',
`followed_by` int(11) NOT NULL DEFAULT 0,
`act_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`head` varchar(100) NOT NULL DEFAULT '',
`main_id` int(11) NOT NULL DEFAULT 0,
`user2` int(11) NOT NULL DEFAULT 0,
`user3` int(11) NOT NULL DEFAULT 0,
`user4` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_termin_typ_termtyp_id` (`typ`),
CONSTRAINT `fk_termin_typ_termtyp_id` FOREIGN KEY (`typ`) REFERENCES `termtyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `termtyp` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`typ` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `titel` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`titel` varchar(50) NOT NULL DEFAULT '',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `tmp_artikel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(150) NOT NULL DEFAULT '',
`typ_id` int(5) NOT NULL DEFAULT 0,
`einheit_id` int(11) NOT NULL DEFAULT 0,
`preis` decimal(10,2) DEFAULT NULL,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`posnr` int(5) NOT NULL DEFAULT 0,
`rabatt` int(3) NOT NULL DEFAULT 0,
`rabatttyp` int(2) NOT NULL DEFAULT 0,
`menge` decimal(6,3) NOT NULL DEFAULT 0,
`angtyp` int(1) NOT NULL DEFAULT 0,
`mwst_id` int(3) NOT NULL DEFAULT 0,
`rech_id` int(11) NOT NULL DEFAULT 0,
`wanr` varchar(100) NOT NULL DEFAULT '',
`pagebreak` int(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_tmp_artikel_typ_id` (`typ_id`),
KEY `fk_tmp_art_mwst_id` (`mwst_id`),
KEY `fk_tmp_art_rech_id` (`rech_id`),
KEY `fk_tmp_artikel_einheit_id` (`einheit_id`),
CONSTRAINT `fk_tmp_art_mwst_id` FOREIGN KEY (`mwst_id`) REFERENCES `mwst` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_art_rech_id` FOREIGN KEY (`rech_id`) REFERENCES `tmp_rechnung` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_artikel_einheit_id` FOREIGN KEY (`einheit_id`) REFERENCES `einheit` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_artikel_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `artikeltyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `tmp_eigensch` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(100) NOT NULL DEFAULT '',
`wert` varchar(50) NOT NULL DEFAULT '',
`einheit_id` int(11) NOT NULL DEFAULT 0,
`art_id` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`posnr` int(5) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_tmp_eigensch_art_id` (`art_id`),
KEY `fk_tmp_eigensch_einheit_id` (`einheit_id`),
CONSTRAINT `fk_tmp_eigensch_art_id` FOREIGN KEY (`art_id`) REFERENCES `tmp_artikel` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_eigensch_einheit_id` FOREIGN KEY (`einheit_id`) REFERENCES `einheit` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `tmp_rechnung` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`adressfields` varchar(12) NOT NULL DEFAULT '',
`partner_id` int(11) NOT NULL DEFAULT 0,
`anrede1` varchar(150) NOT NULL DEFAULT '',
`anrede2` varchar(150) NOT NULL DEFAULT '',
`mwst_id` int(3) NOT NULL DEFAULT 0,
`user_id` int(11) NOT NULL DEFAULT 0,
`rechnr` int(11) NOT NULL DEFAULT 0,
`typ_id` int(2) NOT NULL DEFAULT 0,
`zahlziel_id` int(3) NOT NULL DEFAULT 0,
`adresse_id` int(11) NOT NULL DEFAULT 0,
`wahrung_id` tinyint(3) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`rabatt` int(3) NOT NULL DEFAULT 0,
`rabattdesc` varchar(100) NOT NULL DEFAULT '',
`intro` text NOT NULL DEFAULT '',
`outro` text NOT NULL DEFAULT '',
`sub_mwst` int(1) NOT NULL DEFAULT 0,
`kommission` int(11) NOT NULL DEFAULT 0,
`lieferdatum` varchar(100) NOT NULL DEFAULT '',
`adresserweiterung` varchar(100) NOT NULL DEFAULT '',
`storno` int(1) NOT NULL DEFAULT 0,
`buchungsKto_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_tmp_rech_partner_id` (`partner_id`),
KEY `fk_tmp_rech_adresse_id` (`adresse_id`),
KEY `fk_tmp_rech_mwst_id` (`mwst_id`),
KEY `fk_tmp_rech_user_id` (`user_id`),
KEY `fk_tmp_rech_zahlziehl_id` (`zahlziel_id`),
KEY `fk_tmp_rech_typ_id` (`typ_id`),
KEY `fk_tmp_rech_wahrung_id` (`wahrung_id`),
KEY `fek_rech_buchungsKto_id` (`buchungsKto_id`),
CONSTRAINT `fek_rech_buchungsKto_id` FOREIGN KEY (`buchungsKto_id`) REFERENCES `buchungsKontos` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_adresse_id` FOREIGN KEY (`adresse_id`) REFERENCES `adresse` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_mwst_id` FOREIGN KEY (`mwst_id`) REFERENCES `mwst` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_partner_id` FOREIGN KEY (`partner_id`) REFERENCES `partner` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_typ_id` FOREIGN KEY (`typ_id`) REFERENCES `rechtyp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_wahrung_id` FOREIGN KEY (`wahrung_id`) REFERENCES `wahrung` (`id`) ON UPDATE CASCADE,
CONSTRAINT `fk_tmp_rech_zahlziehl_id` FOREIGN KEY (`zahlziel_id`) REFERENCES `zahlziel` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vname` varchar(50) NOT NULL DEFAULT '',
`nname` varchar(50) NOT NULL DEFAULT '',
`nick` varchar(50) NOT NULL DEFAULT '',
`pass` varchar(150) NOT NULL DEFAULT '',
`mail` varchar(50) NOT NULL DEFAULT '',
`salt` varchar(50) NOT NULL DEFAULT '',
`tel_priv` varchar(30) NOT NULL DEFAULT '',
`tel_gesch` varchar(30) NOT NULL DEFAULT '',
`tel_mobil` varchar(30) NOT NULL DEFAULT '',
`lastlogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`numlogins` int(11) NOT NULL DEFAULT 0,
`logedout` tinyint(2) NOT NULL DEFAULT 0,
`wrongpw` tinyint(3) NOT NULL DEFAULT 0,
`notizen` text NOT NULL DEFAULT '',
`blocked` tinyint(1) NOT NULL DEFAULT 0,
`rights` varchar(6) NOT NULL DEFAULT '',
`weekly_hours` int(11) NOT NULL DEFAULT 0,
`rfid` varchar(10) NOT NULL DEFAULT '',
`color` varchar(8) NOT NULL DEFAULT '',
`weekhours` decimal(6,3) NOT NULL DEFAULT 0,
`vacationdays` int(4) NOT NULL DEFAULT 0,
`sahours` decimal(3,1) NOT NULL DEFAULT 0,
`timelog_start` date NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
UNIQUE KEY `nick` (`nick`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `wahrung` (
`id` tinyint(3) NOT NULL AUTO_INCREMENT,
`wahrung` varchar(20) NOT NULL DEFAULT '',
`kurs` decimal(8,4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `work` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bezeichn` varchar(150) NOT NULL DEFAULT '',
`bezeichn2` varchar(150) NOT NULL DEFAULT '',
`project_id` int(11) NOT NULL DEFAULT 0,
`changetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changeuser` int(11) NOT NULL DEFAULT 0,
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`std` decimal(6,3) NOT NULL DEFAULT 0,
`rechn` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fek_work_partner_id` (`project_id`),
CONSTRAINT `fek_work_partner_id` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `zahlziel` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`ziel` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `zeiten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ma_id` int(11) NOT NULL DEFAULT 0,
`kommen` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`gehen` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pause_mins` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `fk_zeiten_user_id` (`ma_id`),
CONSTRAINT `fk_zeiten_user_id` FOREIGN KEY (`ma_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS = 1;