Files
bilety.brzezovka.pl/autoload/controls/class.Tickets.php

633 lines
20 KiB
PHP

<?php
namespace controls;
class Tickets
{
static public function main_view()
{
global $settings;
if ( !$settings['tickets']['enable_sell'] )
return \Tpl::view( 'tickets/disabled-sell' );
return \Tpl::view('tickets/main-view', [
'cart' => \S::get_session('basket'),
'settings' => $settings
]);
}
static public function ticket_add()
{
global $settings;
$selected_date = \S::get( 'date' ) ? \S::get( 'date' ) : null;
$diffDays = \S::get('diffdays') ?? 0;
if ( $selected_date )
{
$selected = new \DateTime($selected_date);
$today = new \DateTime(date('Y-m-d') . ' 00:00:00');
$diffDays = $selected->diff($today)->days;
}
$basket = \S::get_session('basket');
$ticket_id = \S::get('ticket_id');
if ( !empty($basket[$ticket_id][$diffDays]) )
{
$basket[$ticket_id][$diffDays]['quantity']++;
}
else
{
if ($diffDays == 0) {
$addon = $settings['tickets'][$ticket_id]['dynamic_prices']['day0'] ?? 0;
} elseif ($diffDays <= 2) {
$addon = $settings['tickets'][$ticket_id]['dynamic_prices']['day1_2'] ?? 0;
} elseif ($diffDays <= 7) {
$addon = $settings['tickets'][$ticket_id]['dynamic_prices']['day3_7'] ?? 0;
} else {
$addon = 0;
}
$basket[$ticket_id][$diffDays]['ticket_id'] = $ticket_id;
$basket[$ticket_id][$diffDays]['ticket_price'] = $settings['tickets'][$ticket_id]['price'] + $addon;
$basket[$ticket_id][$diffDays]['product_id'] = $settings['tickets'][$ticket_id]['product_id'];
$basket[$ticket_id][$diffDays]['quantity'] = 1;
$basket[$ticket_id][$diffDays]['date'] = $selected_date;
}
if ( strpos( $ticket_id, "gift" ) !== false )
{
$basket['gift-price'][0]['quantity'] = 1;
$basket['gift-price'][0]['ticket_price'] = $settings['tickets']['gift-price']['price'];
$basket['gift-price'][0]['product_id'] = $settings['tickets']['gift-price']['product_id'];
$basket['gift-price'][0]['ticket_id'] = 'gift-price';
}
$basket = \factory\Tickets::recalculate_ticket_protection( $basket );
\S::set_session( 'basket', $basket );
if (\S::get('basket_step_1'))
echo json_encode([
'basket_form' => \Tpl::view('tickets/basket-form', [
'cart' => $basket,
'settings' => $settings
]),
'basket_summary' => \Tpl::view('tickets/basket-summary', [
'cart' => $basket,
'settings' => $settings
])
]);
else
echo json_encode(['shopping_cart' => \Tpl::view('tickets/shopping-cart', [
'cart' => $basket,
'settings' => $settings
])]);
exit;
}
static public function ticket_subtract()
{
global $settings;
$basket = \S::get_session('basket');
$ticket_id = \S::get('ticket_id');
$diffdays = \S::get('diffdays');
if (isset($basket[$ticket_id][$diffdays]) && $basket[$ticket_id][$diffdays]['quantity'] > 0)
{
$basket[$ticket_id][$diffdays]['quantity']--;
if ($basket[$ticket_id][$diffdays]['quantity'] == 0)
{
unset($basket[$ticket_id][$diffdays]);
if (empty($basket[$ticket_id])) {
unset($basket[$ticket_id]);
}
$giftKeys = array_filter(array_keys($basket), function ($key) {
return strpos($key, "gift") !== false && $key != "gift-price";
});
if (empty($giftKeys)) {
unset($basket['gift-price']);
}
}
}
$basket = \factory\Tickets::recalculate_ticket_protection( $basket );
\S::set_session( 'basket', $basket );
if (\S::get('basket_step_1'))
echo json_encode([
'basket_form' => \Tpl::view('tickets/basket-form', [
'cart' => $basket,
'settings' => $settings
]),
'basket_summary' => \Tpl::view('tickets/basket-summary', [
'cart' => $basket,
'settings' => $settings
]),
'cart_count' => count($basket)
]);
else
echo json_encode([
'shopping_cart' => \Tpl::view('tickets/shopping-cart', [
'cart' => $basket,
'settings' => $settings
]),
'cart_count' => count($basket)
]);
exit;
}
static public function ticket_remove()
{
global $settings;
$basket = \S::get_session('basket');
$ticket_id = \S::get('ticket_id');
$diffdays = \S::get('diffdays');
unset($basket[$ticket_id]);
$giftKeys = array_filter(array_keys($basket), function ($key) {
return strpos($key, "gift") !== false && $key != "gift-price";
});
if (empty($giftKeys)) {
unset($basket['gift-price']);
}
$basket = \factory\Tickets::recalculate_ticket_protection( $basket );
\S::set_session('basket', $basket);
if (\S::get('basket_step_1'))
echo json_encode([
'basket_form' => \Tpl::view('tickets/basket-form', [
'cart' => $basket,
'settings' => $settings
]),
'basket_summary' => \Tpl::view('tickets/basket-summary', [
'cart' => $basket,
'settings' => $settings
]),
'cart_count' => count($basket)
]);
else
echo json_encode([
'shopping_cart' => \Tpl::view('tickets/shopping-cart', [
'cart' => $basket,
'settings' => $settings
]),
'cart_count' => count($basket)
]);
exit;
}
// Strona koszyka
static public function basket_view()
{
global $settings;
if ( \S::get( 'ticket_protection' ) == 'true' ) {
\S::set_session( 'ticket_protection', true );
\factory\Tickets::add_ticket_protection();
header( 'Location: /tickets/basket_view/' );
exit;
}
if ( \S::get( 'ticket_protection' ) == 'false' ) {
\S::set_session( 'ticket_protection', false );
\factory\Tickets::remove_ticket_protection();
header( 'Location: /tickets/basket_view/' );
exit;
}
return \Tpl::view('tickets/basket-view', [
'cart' => \S::get_session('basket'),
'settings' => $settings
]);
}
// Przetwarzanie formularza
static public function basketFormHandler()
{
global $settings, $mdb;
$basket = \S::get_session('basket');
$date = date('Y-m-d H:i:s');
$finalPrice = 0;
foreach ( ( $basket ) as $data => $value )
{
foreach ( $value as $key => $val )
{
$price = $val['ticket_price'];
$quantity = $val['quantity'];
$finalPrice += $price * $quantity;
}
}
$hash = md5(trim((string)($_POST['email'] ?? '')) . trim((string)($_POST['city'] ?? '')) . trim(date("Y-m-d H:i:s")));
//* Zapisywanie do DB klienta
$mdb->insert('orders', [
'name' => trim((string)($_POST['name'] ?? '')),
'surname' => trim((string)($_POST['surname'] ?? '')),
'email' => trim((string)($_POST['email'] ?? '')),
'zip_code' => trim((string)($_POST['zip_code'] ?? '')),
'city' => trim((string)($_POST['city'] ?? '')),
'street' => trim((string)($_POST['street'] ?? '')),
'order_price' => $finalPrice,
'date_added' => $date,
'hash' => $hash,
'vat' => (($_POST['vat'] ?? '') == 'on' ? '1' : '0'),
'company_name' => trim((string)($_POST['company_name'] ?? '')),
'nip' => trim((string)($_POST['nip'] ?? '')),
'gift_address' => trim((string)($_POST['gift_address'] ?? ''))
] );
//* Id klienta
$last_id = $mdb->id();
if ( $last_id )
{
foreach ( ( $basket ) as $data => $value )
{
foreach ( $value as $key => $val )
{
$price = $val['ticket_price'];
$quantity = $val['quantity'];
$finalPrice += $price * $quantity;
}
}
foreach ( ( $basket ) as $data => $value )
{
foreach ( $value as $key => $val )
{
if ( !empty($val['date']) ) {
$dateFormatted = new \DateTime( $val['date'] );
$dateFormatted = $dateFormatted->format('Y-m-d');
} else
$dateFormatted = null;
// Zapisywanie do DB bilety
$mdb -> insert( 'order_tickets', [
'order_id' => $last_id,
'product_id' => $val['product_id'],
'name' => trim( $settings['tickets'][$val['ticket_id']]['name'] ),
'quantity' => trim( $val["quantity"]),
'price' => trim( $val['ticket_price']),
'date_visit' => $dateFormatted,
'date_added' => $date
] );
}
}
//QR CODE
$dir = 'orders/' . $hash[0] . '/' . $hash[1] . '/';
if (!file_exists($dir . $hash . '.png'))
{
if (!is_dir($dir))
mkdir($dir, 0755, true);
\QRcode::png($hash, $dir . $hash . '.png', QR_ECLEVEL_H, 4);
}
\S::del_session('basket');
header('Location: /tickets/przelewy24/order=' . $hash);
}
else
{
header('Location: /tickets/main_view/');
}
exit;
}
//* Strona końcowego zamówienia
static public function przelewy24()
{
global $settings, $mdb;
$hash = \S::get('order');
$order = \factory\Tickets::get_order_details_by_hash(\S::get('order'));
$subject = "brzezovka.pl - zamówienie biletów";
$message = '<div style="width:100%; max-width: 600px; margin: 0 auto;">';
$message .= '<div style="text-align: center;"><img src="https://bilety.brzezovka.pl/layout/images/logo.png" alt="" style="width: 300px;"></div><hr>';
$message .= '<h2>Potwierdzenie Zamówienia</h2>';
$message .= '<span>Witamy,</span><br/>';
$message .= '<span>potwierdzamy realizację Zamówienia numer: ' . $order['id'] . '</span><br/><br/>';
$message .= '<table style="width:100%;">';
$message .= '<thead style="text-align: left;">';
$message .= '<tr>';
$message .= '<th>Dane zamówienia</th>';
$message .= '<th>Dane zamawiającego</th>';
$message .= '</tr>';
$message .= '</thead>';
$message .= '<tbody>';
$message .= '<tr>';
$message .= '<td>Cena: ' . $order['order_price'] . 'zł</td>';
$message .= '<td>' . $order['name'] . ' ' . $order['surname'] . '</td>';
$message .= '</tr>';
$message .= '<tr>';
$message .= '<td>Data: ' . $order['date_added'] . '</td>';
$message .= '<td>' . $order['city'] . ' ' . $order['zip_code'] . '</td>';
$message .= '</tr>';
$message .= '<tr>';
$message .= '<td></td>';
$message .= '<td>' . $order['email'] . '</td>';
$message .= '</tr>';
$message .= '</tbody>';
$message .= '</table>';
$message .= '<br/><hr>';
$message .= '<h3>Lista biletów</h3>';
$message .= '<table style="width:100%;">';
$message .= '<thead style="text-align: left;">';
$message .= '<tr> <th>Bilet</th> <th>Termin wizyty</th> <th>Cena</th> <th>Ilość</th> <th>Razem</th> </tr>';
$message .= '</thead>';
$message .= '<tbody>';
foreach ($order['tickets'] as $value)
{
$message .= '<tr>';
$message .= '<td>' . $value['name'] . '</td>';
$message .= '<td>' . $value['date_visit'] . '</td>';
$message .= '<td>' . $value['price'] . '</td>';
$message .= '<td>' . $value["quantity"] . '</td>';
$message .= '<td>' . $value['price']*$value["quantity"] . 'zł</td>';
$message .= '</tr>';
}
$message .= '</tbody>';
$message .= '</table>';
$message .= '<br/><hr>';
if (!empty($order['gift_address'])) {
$message .= '<h3>Dane do wysyłki biletu prezentowego</h3>';
$message .= '<p>' . $order['gift_address'] . '</p>';
}
$message .= '<br/><hr>';
//QR CODE
$dir = 'orders/' . $hash[0] . '/' . $hash[1] . '/';
if ( !file_exists($dir . $hash . '.png' ) )
{
if (!is_dir($dir))
mkdir($dir, 0755, true);
\QRcode::png( $hash, $dir . $hash . '.png', QR_ECLEVEL_H, 4 );
}
$qr_path = 'https://bilety.brzezovka.pl/' . $dir . $hash . '.png';
$message .= '<h3>QR kod</h3>';
$message .= '<img src="' . $qr_path . '" alt="QR kod" style="width: 200px; height: 200px;"/>';
$message .= '<br/><hr>';
$message .= '<a style="display: inline-block; color: #000; border: none; text-decoration: none; margin-top:20px; background-color: #a4e653; font-weight: 800; border-radius: 10px; padding: 10px 30px;" href="https://bilety.brzezovka.pl/tickets/order_confirm/order=' . $order['hash'] . '">Link do szczegółów zamówienia</a>';
$message .= '</div>';
\S::send_email( $order['email'], $subject, $message );
$przelewy24_hash = md5(time());
$mdb->update('orders', ['payment_hash' => $przelewy24_hash], ['id' => $order['id']]);
return \Tpl::view('tickets/przelewy24', [
'settings' => $settings,
'hash' => \S::get('order'),
'order' => $order,
'przelewy24_hash' => $przelewy24_hash
]);
}
//* Akceptowanie zmian w DB. Jeżeli płatność jest ok
static public function przelewy24_response()
{
global $settings, $mdb;
$crc_key = '';
if($settings['p24']['sandbox']) {
$crc_key = $settings['p24']['sandbox_crc_key'];
} else {
$crc_key = $settings['p24']['crc_key'];
}
$post = [
'p24_merchant_id' => \S::get('p24_merchant_id'),
'p24_pos_id' => \S::get('p24_pos_id'),
'p24_session_id' => \S::get('p24_session_id'),
'p24_amount' => \S::get('p24_amount'),
'p24_currency' => \S::get('p24_currency'),
'p24_order_id' => \S::get('p24_order_id'),
'p24_sign' => md5(\S::get('p24_session_id') . '|' . \S::get('p24_order_id') . '|' . \S::get('p24_amount') . '|' . \S::get('p24_currency') . '|' . $crc_key)
];
$ch = curl_init();
if ($settings['p24']['sandbox'])
{
curl_setopt($ch, CURLOPT_URL, 'https://sandbox.przelewy24.pl/trnVerify');
}
else
{
curl_setopt($ch, CURLOPT_URL, 'https://secure.przelewy24.pl/trnVerify');
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_exec($ch);
$order = \factory\Tickets::get_order_details_by_przelewy24_hash(\S::get('p24_session_id'));
if ( !$order )
return false;
$mdb->update('orders', ['payment_status' => 1], ['id' => $order['id']]);
$mdb->update('orders', ['payment_date' => date('Y-m-d H:i:s')], ['id' => $order['id']]);
// file_put_contents( 'sandbox_przelewy24_response.txt', print_r( $_POST, true ) );
// file_put_contents( 'sandbox_przelewy24_response.txt', print_r( $order, true ), FILE_APPEND );
//* Wystawienie faktury
if ( $order['invoice_status'] == 0 )
{
if ( $order['vat'] == 0 )
{
$api = array();
$api["api_id"] = "9fa7772af97ab35b6d8a1cd05ac9e1b5";
$api["api_zadanie"] = "1";
$api["dokument_rodzaj"] = "20";
$api["dokument_dostep"] = "1";
$api["dokument_miejsce"] = "Brzezovka sklep internetowy";
$api["produkt_stawka_vat"] = "8";
$api["nabywca_imie"] = $order['name'];
$api["nabywca_nazwisko"] = $order['surname'];
$api["nabywca_email"] = $order['email'];
if($order['city']){
$api["nabywca_miasto"] = $order['city'];
}
if($order['zip_code']){
$api["nabywca_kod"] = $order['zip_code'];
}
if($order['street']){
$api["nabywca_ulica"] = $order['street'];
}
foreach ($order['tickets'] as $key => $value)
{
$key += 1;
$api["produkt_nazwa_$key"] = $value['name'];
$api["produkt_ilosc_$key"] = $value['quantity'];
$api["produkt_jm_$key"] = "2";
$api["produkt_stawka_vat_$key"] = "23";
$api["produkt_wartosc_brutto_$key"] = $value['price'] * $value['quantity'];
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://konto.fakturowo.pl/api");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $api);
$result = curl_exec($curl);
curl_close($curl);
$result = explode("\n", $result);
// file_put_contents( 'sandbox_przelewy24_response.txt', print_r( $result, true ), FILE_APPEND );
if ($result[0] == 1)
{
$subject = "brzezovka.pl - zamówienie biletów 'paragon'";
$message = '<div style="width:100%; max-width: 600px; margin: 0 auto;">';
$message .= '<div style="text-align: center;"><img src="https://bilety.brzezovka.pl/layout/images/logo.png" alt="" style="width:100%; max-width: 100px;"></div><hr>';
$message .= '<h2>Paragon z Potwierdzeniem Zamówienia</h2>';
$message .= '<span>Link do pobrania:</span><br/>';
$message .= '<a href="' . $result[2] . '">' . $result[2] . '</a>';
$message .= '</div>';
\S::send_email( $order['email'], $subject, $message );
$mdb->update('orders', ['invoice_status' => 1], ['id' => $order['id']]);
$mdb->update('orders', ['invoice_url' => $result[2]], ['id' => $order['id']]);
}
else
{
echo "ERROR: " . $result[1];
}
}
elseif ( $order['vat'] == 1 )
{
$api = array();
$api["api_id"] = "9fa7772af97ab35b6d8a1cd05ac9e1b5";
$api["api_zadanie"] = "1";
$api["dokument_rodzaj"] = "0";
$api["dokument_dostep"] = "1";
$api["dokument_miejsce"] = "Brzezovka sklep internetowy";
$api["produkt_stawka_vat"] = "8";
$api["nabywca_imie"] = $order['name'];
$api["nabywca_nazwisko"] = $order['surname'];
$api["nabywca_email"] = $order['email'];
$api["nabywca_miasto"] = $order['city'];
$api["nabywca_kod"] = $order['zip_code'];
$api["nabywca_ulica"] = $order['street'];
$api["nabywca_nazwa"] = $order['company_name'];
$api["nabywca_nip"] = $order['nip'];
foreach ($order['tickets'] as $key => $value)
{
$key += 1;
$api["produkt_nazwa_$key"] = $value['name'];
$api["produkt_ilosc_$key"] = $value['quantity'];
$api["produkt_jm_$key"] = "2";
$api["produkt_stawka_vat_$key"] = "23";
$api["produkt_wartosc_brutto_$key"] = $value['price'] * $value['quantity'];
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://konto.fakturowo.pl/api");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $api);
$result = curl_exec($curl);
curl_close($curl);
$result = explode("\n", $result);
// file_put_contents( 'sandbox_przelewy24_response.txt', print_r( $result, true ), FILE_APPEND );
if ($result[0] == 1)
{
$subject = "brzezovka.pl - zamówienie biletów 'faktura'";
$message = '<div style="width:100%; max-width: 600px; margin: 0 auto;">';
$message .= '<div style="text-align: center;"><img src="https://bilety.brzezovka.pl/layout/images/logo.png" alt="" style="width:100%; max-width: 100px;"></div><hr>';
$message .= '<h2>Faktura z Potwierdzeniem Zamówienia</h2>';
$message .= '<span>Link do pobrania:</span><br/>';
$message .= '<a href="' . $result[2] . '">' . $result[2] . '</a>';
$message .= '</div>';
\S::send_email( $order['email'], $subject, $message );
$mdb->update('orders', ['invoice_status' => 1], ['id' => $order['id']]);
$mdb->update('orders', ['invoice_url' => $result[2]], ['id' => $order['id']]);
}
else
{
echo "ERROR: " . $result[1];
}
}
}
exit;
}
//* Końcowa strona z informacją o zamówieniu
static public function order_confirm()
{
global $mdb;
$order = \factory\Tickets::get_order_details_by_hash(\S::get('order'));
$order_successful = false;
$order_fail = false;
if ( $order && !empty($order['payment_status']) && empty($order['informed_user']) )
{
if ($order['payment_status'])
{
$order_successful = true;
}
else
{
$order_fail = true;
}
$mdb->update('orders', ['informed_user' => 1], ['id' => $order['id']]);
}
return \Tpl::view( 'tickets/order-confirm', [
'order' => $order,
'order_successful' => $order_successful,
'order_fail' => $order_fail
]);
}
//* Regulamin
static public function regulamin()
{
return \Tpl::view('site/regulamin');
}
static public function regulamin_biletow_prezentowych()
{
return \Tpl::view('site/regulamin-for-gifts');
}
}