feat(01-purchase-data-layer): add post-payment purchase data layer

Phase 1 complete:

- move purchase event to order confirmation after successful payment

- add backend purchase payload builder for transaction and ticket lines

- remove premature purchase push from przelewy24 redirect view
This commit is contained in:
2026-04-19 20:32:38 +02:00
parent 752b6c653e
commit 9de042946a
17 changed files with 528 additions and 23 deletions

View File

@@ -4,6 +4,54 @@ namespace controls;
class Tickets
{
private static function buildPurchaseDataLayer(array $order)
{
$items = [];
$tickets = $order['tickets'] ?? [];
foreach ($tickets as $ticket) {
$itemPrice = (float) str_replace(',', '.', (string) ($ticket['price'] ?? 0));
$itemQuantity = (int) ($ticket['quantity'] ?? 0);
$productId = (int) ($ticket['product_id'] ?? 0);
$itemId = $productId > 0 ? (string) $productId : (string) ($ticket['id'] ?? '');
$items[] = [
'item_id' => $itemId,
'item_name' => trim((string) ($ticket['name'] ?? '')),
'product_id' => $productId,
'quantity' => $itemQuantity,
'price' => $itemPrice,
'date_visit' => trim((string) ($ticket['date_visit'] ?? '')),
];
}
$orderValue = (float) str_replace(',', '.', (string) ($order['order_price'] ?? 0));
return [
'event' => 'purchase',
'ecommerce' => [
'transaction_id' => (string) ($order['id'] ?? ''),
'value' => $orderValue,
'currency' => 'PLN',
'shipping' => 0.0,
'tax' => 0.0,
'payment_type' => 'przelewy24',
'items' => $items,
],
'order' => [
'id' => (int) ($order['id'] ?? 0),
'hash' => trim((string) ($order['hash'] ?? '')),
'payment_date' => trim((string) ($order['payment_date'] ?? '')),
'date_added' => trim((string) ($order['date_added'] ?? '')),
'payment_status' => (int) ($order['payment_status'] ?? 0),
'vat' => (int) ($order['vat'] ?? 0),
'city' => trim((string) ($order['city'] ?? '')),
'zip_code' => trim((string) ($order['zip_code'] ?? '')),
'country' => 'PL',
],
];
}
private static function sendPaidOrderSummaryEmail(array $order)
{
$hash = trim((string) ($order['hash'] ?? ''));
@@ -799,12 +847,14 @@ class Tickets
$order = \factory\Tickets::get_order_details_by_hash(\S::get('order'));
$order_successful = false;
$order_fail = false;
$purchaseDataLayer = null;
if ( $order && !empty($order['payment_status']) && empty($order['informed_user']) )
{
if ($order['payment_status'])
{
$order_successful = true;
$purchaseDataLayer = self::buildPurchaseDataLayer($order);
$mailSent = self::sendPaidOrderSummaryEmail($order);
if ($mailSent) {
$mdb->update('orders', ['informed_user' => 1], ['id' => $order['id']]);
@@ -820,7 +870,8 @@ class Tickets
return \Tpl::view( 'tickets/order-confirm', [
'order' => $order,
'order_successful' => $order_successful,
'order_fail' => $order_fail
'order_fail' => $order_fail,
'purchase_data_layer' => $purchaseDataLayer
]);
}