Thomas Bartelt
4ea1daec9a
fix(cms/zahlarten): Platzhalter [#customer_freetextfield3] im Bestelltext ersetzen wie in der Kasse
2026-09-27 22:48:11 +02:00
Thomas Bartelt
91d90b6714
feat(cms): Platzhalter [#zahlarten] in Textboxen -- Liste der aktiven Zahlarten der Kundengruppe aus der Kassen-Logik (Seite Bezahlarten nicht mehr von Hand); Mollie-Aktivschalter in shipping_area auf gruppenspezifisch (2), sonst saehen Haendler Mollie
2026-09-27 22:43:55 +02:00
Thomas Bartelt
21977b8f41
feat(payments/mollie): Zahlart 'Online-Banking' (Pay by Bank, paybybank); Google Pay inaktiv (nur Direkt-Integration)
2026-09-27 22:19:56 +02:00
Thomas Bartelt
5f3bbc2c45
feat(payments/mollie): Next-Gen-Webhooks (JSON, HMAC-SHA256 X-Mollie-Signature) neben klassischem id=tr_; fix: Bestellbestaetigung aus Webhook-/CLI-Kontext (Layout-Objekt im Bootstrap); markCancelled idempotent
2026-09-27 21:51:11 +02:00
Thomas Bartelt
b8111a1e7f
feat(payments): Mollie-Provider -- getrennte Zahlarten je Methode (Klarna, Kreditkarte, Apple Pay, Google Pay)
...
- core/payments/providers/mollie: Client (Bearer API-Key, Idempotency-Key), Provider nach dem
PayPal-v2-Vertrag: start (POST /v2/payments mit method aus payment_methods.argument),
onReturn/onCancel (Status per GET, Rueckkehr-URL traegt o=<orders.id>), onWebhook
(id=tr_..., Wahrheit per GET), reconcile (paid/canceled/expired/failed, >24h abbrechen)
- Klarna: lines aus order_item (brutto je Stueck), Versand, Zahlartgebuehr, Gutschein, Rabatt,
Rundungsausgleich; billing/shippingAddress mit E-Mail und Telefon (E.164)
- core/paymentmethods/molliepaymentmethod.class.php: Kassen-Adapter ohne Express
- install_mollie.sql: 16 Spalten in shipping_area (4 helperjoinkeys), Einstellungen Gruppe
mollie, 4 Zahlarten (module mollie, argument = Methode), Freischaltung/Leichen als Kommentar
- Kasse neu: Mollie-Logos je Methode, Apple Pay nur auf faehigen Geraeten
- cli.php status: mehrere Zahlarten je Anbieter, Modus generisch
2026-09-27 10:39:23 +02:00
Thomas Bartelt
d5a3727884
fix(artikel): attribute_7 nur als Ziffernfolge in die SQL (Leerzeichen => HTTP 500); zieht Live-Haertung vom 25.08. (Grundpreis-Teiler) nach
2026-09-27 10:16:49 +02:00
Thomas Bartelt
5844b24db4
style(warenkorb-neu): Leer-Ansicht rechtsbuendig, Knopf raus aus der Klick-Falle des fixierten Kopfes
2026-09-27 10:08:31 +02:00
Thomas Bartelt
d0b79a2820
fix(warenkorb-neu, kasse-neu): Scroll nicht wiederherstellen, wenn der Korb leer wurde (Knopf lag unter dem fixierten Kopf); sticky Kaesten unter den 152px-Kopf (top 168px)
2026-09-27 10:02:47 +02:00
Thomas Bartelt
4ef81ceec3
fix(warenkorb-neu): 'Weiter einkaufen' ueber das Formular (cart_goto=weiter), Auto-Speichern mit Wartezeit statt Wettlauf gegen den Klick, Doppel-Submit-Riegel; Anfuehrungszeichen
2026-09-27 09:55:16 +02:00
Thomas Bartelt
4c1ecb82a7
fix(kasse): Gast-/Express-Bestellung ohne Anrede verlor die Adresse -- CustomerAddress::validate() verlangt honorific; leer => Firma/Herr, Fehlschlag jetzt im Log
2026-09-27 00:36:03 +02:00
Thomas Bartelt
30c81cae9c
fix(kasse-neu): schliessende Klammer stand hinter dem Kommentar -- Syntaxfehler, Bestellen-Knopf ohne Handler
2026-09-26 23:51:42 +02:00
Thomas Bartelt
def156e1c2
feat(kasse, warenkorb): neue Ansicht ist Standard, Rueckfall ?ansicht=alt per Session
...
- Weiche in website_shoppingcart.php / website_cashdesk.php gedreht: content_*_neu.tpl
ist Standard, ?ansicht=alt schaltet die Sitzung auf die alten Templates, ?ansicht=neu zurueck
- Parameter ansicht=neu aus Form-Actions und Links der neuen Templates entfernt
- Erfolgsseite completed.tpl und payment_result.tpl (theme2) im Stil der neuen Kasse
(Schrittleiste 3 Fertig, Karte, Bestellnummer, Text aus cash_desk_order_completed)
- Erfolgsseite ohne Navigation (site_type full_width) wie Warenkorb/Kasse
- sticky Bestellkasten unter dem klebenden Theme-Kopf (top 105px statt 16px)
- fix: Korbsumme 0 teilte in manage_gift_certificate() durch null (HTTP 500)
2026-09-26 23:43:41 +02:00
Thomas Bartelt
fe868641d2
style(warenkorb-neu, kasse-neu): offizielle Web-Fassung des Gewaehrleistungs-Labels, 'Gross anzeigen' oeffnet das PDF
2026-09-18 21:07:26 +02:00
Thomas Bartelt
0c04dc9acd
style(kasse-neu): Label-Zeile mit 'Gross anzeigen' und EU-Link wie im Warenkorb
2026-09-18 21:03:30 +02:00
Thomas Bartelt
f642ba7f06
style(warenkorb-neu): unter dem Label rechts Link zu europa.eu/youreurope/garantien
2026-09-18 21:03:15 +02:00
Thomas Bartelt
8f2b69827e
style(warenkorb-neu): Knopf 'Mengen aktualisieren' raus, getippte Menge speichert bei Feldwechsel
2026-09-18 21:02:02 +02:00
Thomas Bartelt
985e7b2e57
style(warenkorb-neu): ab 900px Spaltenbreite Stepper und Summe inline in der Zeile
2026-09-18 21:01:10 +02:00
Thomas Bartelt
4c9c2c6a29
style(warenkorb-neu): Positionen und Anmerkung als weisse Karten mit Rand und runden Ecken
2026-09-18 20:59:54 +02:00
Thomas Bartelt
65ced5261f
fix(kasse-neu): Fehlerbox ohne .prop('hidden') (jQuery 1.6)
2026-09-18 20:23:09 +02:00
Thomas Bartelt
57a101baa8
fix(kasse-neu): jQuery-1.6-kompatibel (.submit statt .on, kein .addBack) -- .on() brach die Init ab, Lieferadresse klappte nicht mehr auf
2026-09-18 20:22:54 +02:00
Thomas Bartelt
b396c674c9
style(kasse-neu): Zurueck-Link nach oben in die Schrittleiste
2026-09-18 20:20:20 +02:00
Thomas Bartelt
215252f9ef
style(kasse-neu, warenkorb-neu): 150px Luft am Ende vor dem Footer-Balken
2026-09-18 20:18:57 +02:00
Thomas Bartelt
6361249fd0
feat(warenkorb-neu, kasse-neu): ohne Navigation (site_type full_width), breiterer Kasten ab 900px Spalte
2026-09-18 20:17:19 +02:00
Thomas Bartelt
fa836e7a10
feat(kasse-neu): Rechtliches mit Link zur jeweiligen Seite in neuem Fenster (B2B-Fassungen fuer Haendler)
2026-09-18 20:15:47 +02:00
Thomas Bartelt
15270289f5
style(kasse-neu): Gewaehrleistungs-Label ueber den Bestellkasten
2026-09-18 20:14:15 +02:00
Thomas Bartelt
33d859f454
fix(kasse-neu): Scrollposition ueber Reloads (Zahlart/Versand/Land/Gutschein) retten
2026-09-18 20:11:29 +02:00
Thomas Bartelt
49ac0f7e35
feat(kasse): Entwurf neue Kassenansicht content_cash_desk_neu.tpl (Schritte links, Bestellkasten rechts, Feldmarkierung statt Alert), Weiche ?ansicht=neu
...
Feldnamen, IDs und content_cash_desk.js unveraendert; nur Markup, CSS und Absende-Pruefung neu.
2026-09-18 20:09:05 +02:00
Thomas Bartelt
5c80931569
style(warenkorb-neu): Schnell hinzufuegen ueber den Warenkorb
2026-09-18 20:02:09 +02:00
Thomas Bartelt
94b924fa46
fix(warenkorb-neu): Scrollposition ueber den Submit retten, Post-Redirect-Get nach Mengenaenderung
2026-09-18 19:59:04 +02:00
Thomas Bartelt
7430556460
style(warenkorb-neu): Gewaehrleistungs-Label in voller Hoehe (width 100%, height auto)
2026-09-18 19:57:16 +02:00
Thomas Bartelt
0521b4399f
feat(warenkorb-neu): Zeile zweistufig (Bild+Name / Stepper+Summe) fuer die 722px-Spalte, Gewaehrleistungs-Label ueber dem Summenkasten, Stapeln per Container-Query
...
Bild label-gewaehrleistung.webp liegt in media/images (gitignored), auf Dev und Live kopiert.
2026-09-18 19:55:37 +02:00
Thomas Bartelt
ae7e400645
feat(warenkorb): Entwurf neue Ansicht content_shoppingcart_neu.tpl (Zeilen statt Tabelle, Stepper, Summenkasten), Weiche ?ansicht=neu; Alt-Text am Thumbnail entfernt
2026-09-18 19:44:08 +02:00
Thomas Bartelt
dc57c725f6
feat(warenkorb): ein Formular fuer Mengen, Anmerkung und Weiterleitung; Anmerkung in der Kasse editierbar
...
Vorher: Anmerkung in eigenem Formular mit 'Text speichern', 'Zur Kasse' als reiner Link
(ungespeicherte Mengen/Anmerkung gingen verloren), in der Kasse readonly mit dem Hinweis
'kann nur im Warenkorb bearbeitet werden' -- ohne technischen Grund, die Kasse postete das
Feld ohnehin mit. Jetzt: cart_goto ('kasse' | 'express:<modul>') im Warenkorb-Modul,
Kasse uebernimmt POST customer_info in die Session, Texte auf Deutsch geglaettet.
2026-09-18 19:38:02 +02:00
Thomas Bartelt
dec101f0cb
fix(kasse): Express-Hinweis nennt den Anzeigenamen des Anbieters statt 'Paypal v2'
2026-09-18 07:53:29 +02:00
Thomas Bartelt
f1aef6e575
fix(paypal_v2): Anzeigename 'PayPal' statt 'PayPal (v2)' -- stand in Kundenmeldungen
2026-09-18 07:53:18 +02:00
Thomas Bartelt
56f9a425c9
fix(registrierung): Anrede mit Leerfeld statt stiller Vorbelegung 'Firma', USt-ID bei Firma keine Pflicht mehr
2026-09-18 07:48:38 +02:00
Thomas Bartelt
6f0036b819
fix(kasse): Anrede beim Express-Kauf wirklich keine Pflicht -- Inline-JS-Pruefung und Label
...
Die Aenderung vom 14.09. nahm nur die CSS-Klasse, die Absende-Pruefung in
content_cash_desk.tpl verlangte die Anrede weiter (Alert 'vollstaendige Rechnungsadresse').
Im Express-Weg sind stattdessen Vor- und Nachname Pflicht.
2026-09-18 07:45:26 +02:00
Thomas Bartelt
f65901060f
feat(payments): Express-Start mit Versand und Zahlartaufschlag, PATCH nur bei Abweichung
...
PayPal Live verlangt nach jeder Betragsaenderung eine zweite Freigabe (422
PAYER_ACTION_REQUIRED). Die Kasse rechnet den Endbetrag jetzt beim Express-Start vor
(erste aktive Versandart des Gebiets, Gast = Gebiet 1, eingeloggt = Land/Gruppe), der
Provider vergleicht vor dem PATCH mit dem Stand bei PayPal und laesst ihn bei Gleichstand
aus. Webhooks ordnen ohne custom_id ueber die PayPal-Order-ID zu.
2026-09-18 07:40:27 +02:00
Thomas Bartelt
c8fc7fba2f
fix(payments): Express-Rueckkehr nach zweiter PayPal-Freigabe nimmt den normalen Rueckweg mit Capture
...
PayPal Live antwortet auf den Capture nach dem Betrags-PATCH mit 422 PAYER_ACTION_REQUIRED
(Sandbox nicht). Der Kunde gibt erneut frei und kehrt ueber ?payment_express= zurueck; dort
scheiterte onExpressReturn an custom_id != 'express' und zeigte eine Fehlerseite, waehrend
die Bestellung offen blieb (Live-Bestellung 312143).
2026-09-18 07:30:17 +02:00
Thomas Bartelt
b8bc8aa8bf
feat(backend): Zahlarten-Liste zeigt ID und Modul
2026-09-18 07:02:48 +02:00
Thomas Bartelt
7e28a5275c
style(warenkorb): Express-Button mit eigener Klasse .ppbutton (PayPal-Optik, nicht .button)
2026-09-13 21:53:58 +02:00
Thomas Bartelt
5e6fcb0c3d
feat(payments): Express-Adressen nur aus erlaubten Laendern (Setting express_countries, Standard DE)
2026-09-13 21:49:09 +02:00
Thomas Bartelt
da54028a6e
feat(payments): Anrede beim Express-Kauf keine Pflicht (Anbieter liefert keine)
2026-09-13 21:48:09 +02:00
Thomas Bartelt
f33533b411
feat(payments): Express-Kauf aus dem Warenkorb (PayPal v2): Start ohne Bestellung, Adresse von PayPal, Kasse vorbelegt, Capture ohne zweiten Besuch
2026-09-13 21:44:46 +02:00
Thomas Bartelt
e4b3f5a1ea
chore(payments): Webhook-Rohmitschnitt nur bei logs/webhook_debug
2026-09-13 21:35:26 +02:00
Thomas Bartelt
67af646f2e
fix(backend): Secret-Felder ohne type=password -- Browser-Autofill ueberschrieb die Webhook-ID
2026-09-13 21:34:07 +02:00
Thomas Bartelt
4ce09ac1b6
fix(paypal_v2): Webhook-Signatur lokal pruefen (Zertifikat, CRC32, SHA256withRSA); API-Verify nur als Rueckfall
2026-09-13 21:32:17 +02:00
Thomas Bartelt
4248f8c148
fix(paypal_v2): Webhook-Signatur mit rohem Body pruefen, Ablehnungsgrund protokollieren
2026-09-13 21:19:36 +02:00
Thomas Bartelt
83cf8b9808
chore(dev): display_errors aus -- Warnungen im Formular-HTML loesten WAF-403 in der Kasse aus
2026-09-13 21:00:58 +02:00
Thomas Bartelt
2698d518dc
fix(payments): Registry laedt Kernklassen sofort (Fatal im Zahlart-Editor beim Speichern)
2026-09-13 20:33:44 +02:00
Thomas Bartelt
37017b25dd
sync(dev): fehlende Admin-Theme-Assets vom Live-Stand ergaenzt (nichts ueberschrieben)
2026-09-13 19:58:55 +02:00
Thomas Bartelt
726f897c3d
chore(dev): payment_webhook.php ohne Basic-Auth erreichbar
2026-09-13 19:52:45 +02:00
Thomas Bartelt
397fb5944a
feat(payments): Anbieter-Gerüst core/payments mit PayPal Orders v2
...
- ProviderInterface/AbstractProvider: Vorgang mit Uhrzeit+Session (payment_transactions),
Mail und Warenkorb erst nach Zahlung, idempotentes markPaid, Betragsabgleich,
shop_event + PG payment_log
- Secrets verschluesselt (libsodium) in MySQL, Schluessel ausserhalb Docroot
- Cashdesk: ?payment_return/?payment_cancel, Pending-Riegel, zahlung_erst_spaeter()
- Backend Zahlart-Editor: Einstellungen speichern (war ohne Empfaenger), Secret-Felder
- payment_webhook.php (Standalone), cli.php (init-key, secret, reconcile, status)
- PayPal-v2-Blaupause vom Juli entfernt
2026-09-13 19:51:52 +02:00
Thomas Bartelt
af81e8f63a
sync: Zahlungsstrecke, PG-Events, Fatal-Log und PayPal-v2-Blaupause vom Live-Stand 2026-09-13
Deploy to Dev / deploy (push) Successful in 1s
2026-09-13 19:20:24 +02:00
Thomas Bartelt
20d55f77b8
wip: Mobile-Theme-Testphase und PHP-8.2-Guards (Stand Juni 2026)
2026-09-13 19:10:56 +02:00
Thomas Bartelt
08beac8d67
feat(widerruf): Form schlanker (Grund/Anmerkung raus) + Footer-Link 'Vertrag widerrufen'
...
Deploy to Dev / deploy (push) Successful in 1s
- widerruf.php: nur noch 3 Pflichtfelder (Name, Bestellnr, E-Mail) + Confirm-Checkbox
- main_widget_footer_menu.tpl: dauerhafter Link im Footer (gesetzliche Pflicht § 356a ab 19.06.2026)
- Live ist deployed, Dev parallel auf gleichem Stand
2026-06-14 23:14:36 +02:00
Thomas Bartelt
68a03080d1
feat(widerruf): Anonymous-Pfad + Token-Prefill für § 356a-Konformität
...
Deploy to Dev / deploy (push) Successful in 0s
- widerruf.php zeigt jetzt Formular (Name + Bestellnr + E-Mail) ohne Token-Zwang
- Token-Link aus Bestätigungs-Mail bleibt als Convenience, füllt Felder vor
- submit_anonymous() in Revocation-Klasse: Lookup via order_number + customer_email
- Anonymous-Eintrag wird inline angelegt, falls noch kein Token-basierter Record existiert
- Button-Beschriftung 'Vertrag widerrufen' (Gesetzes-Empfehlung)
- prefill_from_token() für Vorausfüllung bei Token-Link
2026-06-14 23:02:54 +02:00
Thomas Bartelt
afd2cedf92
feat: neue PostgreSQL-Suche (tba-search) aus newmail-vhost übernommen
Deploy to Dev / deploy (push) Successful in 0s
2026-04-20 02:11:11 +02:00
Thomas Bartelt
48b14a5bf7
ci: deploy-dev workflow (Gitea Actions, self-hosted host runner)
Deploy to Dev / deploy (push) Successful in 1s
2026-04-20 01:54:27 +02:00
Thomas Bartelt
22bcc04b3d
Template-Warnings: isset-Guards für $customer und $menu_item->activated
2026-04-20 01:20:32 +02:00
Thomas Bartelt
0a669704ea
Dev-Umgebung: Kompatibilität für PHP 8.3 + Smarty 4.5.6
...
- Smarty 4.1.1 → 4.5.6 (behebt dynamic property deprecations)
- Core-Klassen: #[\AllowDynamicProperties] für Admin_role, base, Config,
Customer, Customer_group, CustomerGroups, Item, Structure, website
- website.class.php: counts[parent_id] initialisieren vor ++ (PHP 8.1)
- layout.class.php: HTTP_ACCEPT_LANGUAGE mit isset-Guard
- website_init.php: session_status()-Check vor session_start
- .htaccess: HTTPS-Redirect via X-Forwarded-Proto (statt SERVER_PORT)
- themes/easyshop_advanced/media/: Parent-Theme-Assets nachgezogen
- .gitignore: smarty.4.1.1.bak ausschließen
2026-04-20 01:19:01 +02:00
Thomas Bartelt
d504f8a05d
Initial import: Carteasy Shop (Dev-Stand)
2026-04-20 01:03:43 +02:00