Advertisement
ThisYouRick

Untitled

Apr 28th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 28.91 KB | None | 0 0
  1. <?php
  2.  
  3. require_once DOC_ROOT . 'classes/tools/Element/Element/Common.php';
  4.  
  5. if (!class_exists('Element_Ticket')):
  6.  
  7.     class Element_Ticket extends Element_Common {
  8.  
  9.         public $isWYSIWYG = 1;
  10.         public $table_name = 't_ticket';
  11.         public $can_delete = 0;
  12.         public $typePlaceTitle = array(
  13.             1 => 'Row',
  14.             2 => 'Box',
  15.             3 => 'Table'
  16.         );
  17.         public $sTableBarcodeExternal = 't_barcode_external';
  18.  
  19.         public function init() {
  20.             global $smarty;
  21.  
  22.             $this->list = array(
  23.                 'bar_code' => array(
  24.                     'type' => 'text',
  25.                 ),
  26.                 'event_id' => array(
  27.                     'type' => 'text',
  28.                     'item_name' => 'event_title',
  29.                     'multi' => 1,
  30.                 ),
  31.                 'type_id' => array(
  32.                     'type' => 'text',
  33.                     'field_name' => 'title',
  34.                     'item_name' => 'type_id',
  35.                     'table_name' => 't_ticket_type_content',
  36.                     'multi' => 1,
  37.                 ),
  38.                 'price' => array(),
  39.                 'deposit_uah' => array(),
  40.                 'date_printed' => array(
  41.                     'order' => 1,
  42.                     'direction' => 'back',
  43.                 ),
  44.                 'date_confirmed' => array(
  45.                     'order' => 1,
  46.                     'direction' => 'back',
  47.                 ),
  48.                 'date' => array(
  49.                     'order' => 1,
  50.                     'direction' => 'back',
  51.                     'field' => ' IF(date_printed IS NULL, date_confirmed, date_printed) DESC, date_confirmed '
  52.                 ),
  53.                 'payment_type' => array(),
  54.                 'type' => array(),
  55.                 'descr' => array(),
  56.             );
  57.  
  58.             if ($GLOBALS['aPage']['NAME'] == 'list') {
  59.                 $this->sql['where'] = ' t_ticket.is_printed = 1 AND t_ticket.is_test = 0  AND LENGTH(t_ticket.bar_code) = 13 ';
  60.             } elseif ($GLOBALS['aPage']['NAME'] == 'offline') {
  61.                 $this->sql['where'] = ' (is_offline = 1 ) AND LENGTH(t_ticket.bar_code) = 13 AND t_ticket.is_test = 0 ';
  62.             } elseif ($GLOBALS['aPage']['NAME'] == 'deposit') {
  63.                 $this->sql['where'] = ' t_order.is_deposit = 1 AND t_ticket.is_test = 0 AND t_order.paid_status IN (2,9) ';
  64.             } elseif ($GLOBALS['aPage']['NAME'] == 'reserve') {
  65.                 $this->sql['where'] = ' (is_printed = 0 AND reservation_id > 0 AND t_ticket.order_id = 0)  AND LENGTH(t_ticket.bar_code) = 13 AND t_ticket.is_test = 0 ';
  66.             } elseif ($GLOBALS['aPage']['NAME'] == 'sales') {
  67.                 $this->sql['where'] = ' ( t_ticket.is_test = 0 AND (t_order.is_deposit = 1 AND t_order.paid_status IN (2,9) OR t_ticket.is_printed = 1 OR t_order.paid_status IN (2,9) OR t_ticket.is_offline = 1) ) ';
  68.             }
  69.  
  70.             $this->sql['select'] = ' t_order.date_confirmed, t_ticket_type.deposit_uah, t_order.payment_type, t_event_content.title AS event_title, ' .
  71.                     ' CONCAT_WS(" ", t_user.name, t_user.firstname, t_user.lastname) AS user_name, CONCAT_WS(" ", t_user_offline.name, t_user_offline.firstname, t_user_offline.lastname) AS offline_user_name, t_order.city_name, t_order.mobile, t_order.firstname, t_order.lastname, t_order.email, t_reservation.comments, ' .
  72.                     ' IF(t_order.id, CONCAT_WS(" ", t_ticket.price, t_order.price_currency), CONCAT_WS(" ", t_ticket_type.price_uah, "UAH")) AS price';
  73.             $this->sql['left'] = ' LEFT JOIN t_order ON (t_order.id = t_ticket.order_id) ' .
  74.                     ' LEFT JOIN t_reservation ON (t_reservation.id = t_ticket.reservation_id) ' .
  75.                     ' LEFT JOIN t_user ON (t_reservation.user_id = t_user.id) ' .
  76.                     ' LEFT JOIN t_user AS t_user_offline ON (t_ticket.user_id = t_user_offline.id) ' .
  77.                     ' LEFT JOIN t_ticket_type ON (t_ticket.type_id = t_ticket_type.id) ' .
  78.                     ' LEFT JOIN t_event_content ON (t_event_content.id = t_ticket_type.event_id AND t_event_content.language_id = ' . $GLOBALS['lng']['id'] . ' ) ' .
  79.                     '';
  80.  
  81.             $this->fields = array(
  82.                 'bar_code' => array('title' => 'Штрих-код',),
  83.                 'type_id' => array('title' => 'Тип билета',),
  84.                 'price' => array('title' => 'Сумма'),
  85.                 'deposit_uah' => array('title' => 'Сумма депозита'),
  86.                 'type' => array('title' => 'Тип продажи'),
  87.                 'payment_type' => array('title' => 'Способ оплаты'),
  88.                 'descr' => array('title' => 'Описание продажи'),
  89.                 'event_id' => array('title' => 'Событие'),
  90.                 'date' => array('title' => 'Дата'),
  91.                 'date_printed' => array('title' => 'Дата'),
  92.                 'date_confirmed' => array('title' => 'Дата'),
  93.             );
  94.  
  95.             if ($GLOBALS['aPage']['NAME'] == 'deposit') {
  96.                 unset($this->list['bar_code']);
  97.                 unset($this->list['date_printed']);
  98.                 unset($this->list['price']);
  99.             } else {
  100.                 unset($this->list['date_confirmed']);
  101.                 unset($this->list['deposit_uah']);
  102.             }
  103.  
  104.             if ($GLOBALS['aPage']['NAME'] == 'sales') {
  105.                 $this->fields['price']['title'] = 'Сумма';
  106.                 unset($this->list['date_confirmed']);
  107.                 unset($this->list['date_printed']);
  108.             } else {
  109.                 unset($this->list['type']);
  110.                 unset($this->list['payment_type']);
  111.                 unset($this->list['date']);
  112.             }
  113.  
  114.             if ($GLOBALS['oAdmin']->cur_user['type'] == 'user') {
  115.                 unset($this->list['bar_code']);
  116.  
  117.                 if ($GLOBALS['oAdmin']->cur_user['group_id'] == 3) {
  118.                     unset($this->list['type']);
  119.                     $this->sql['where'] = ' ( ' . $this->sql['where'] . ' ) AND t_order.promo_id = ' . $GLOBALS['oAdmin']->cur_user['id'];
  120.                 } else {
  121.                     $this->sql['where'] = ' ( ' . $this->sql['where'] . ' ) AND t_ticket.user_id = ' . $GLOBALS['oAdmin']->cur_user['id'];
  122.                 }
  123.             }
  124.         }
  125.  
  126.         public function __construct($options = array()) {
  127.             $options['type'] = 'Ticket';
  128.  
  129.             parent:: __construct($options);
  130.         }
  131.  
  132.         public function get($ticket_id, $field_name = 'id') {
  133.             $tmp = $GLOBALS['dbh']->getRow('SELECT * FROM ' . $this->table_name . ' WHERE ' . $field_name . ' = ?', array($ticket_id));
  134.  
  135.             return $tmp;
  136.         }
  137.  
  138.         public function getTicketInfo($ticket_id, $field_name = 'id') {
  139.             $tmp = $GLOBALS['dbh']->getAll('
  140.             SELECT t.*,tt.group_id
  141.             FROM t_ticket AS t
  142.             LEFT JOIN   t_ticket_type AS tt ON (tt.id = t.type_id)
  143.             WHERE ' . $field_name . ' = ?', array($ticket_id));
  144.  
  145.             return $tmp;
  146.         }
  147.  
  148.         public function getBarCode($params = array()) {
  149.             $rand = '';
  150.             for ($i = 0; $i < 12; $i++)
  151.                 $rand .= (string) rand(0, 9);
  152.  
  153.             if (!$params['type'])
  154.                 $params['type'] = 'ticket';
  155.             if (!$params['code_type'])
  156.                 $params['code_type'] = 'ean13';
  157.  
  158.             if ($params['type'] == 'reservation') {
  159.                 $digits = '1' . sprintf('%05d', $params['id']) . substr($rand, 0, 6);
  160.             } else {
  161.                 // Check if we have external list of barcodes for this ticket type
  162.                 if ($params['ticket_type_id'] > 0) {
  163.                     if ((int) $params['place_id'] > 0) {
  164.                         $barcodeExternal = $GLOBALS['dbh']->getRow("SELECT * FROM " . $this->sTableBarcodeExternal . " WHERE type_id = '{$params['ticket_type_id']}' AND place_id = '{$params['place_id']}'");
  165.                     }
  166.  
  167.                     if (empty($barcodeExternal['id'])) {
  168.                         $query = "SELECT * FROM " . $this->sTableBarcodeExternal . " WHERE type_id = '{$params['ticket_type_id']}' AND is_used = 0";
  169.                         $barcodeExternal = $GLOBALS['dbh']->getRow("SELECT * FROM " . $this->sTableBarcodeExternal . " WHERE type_id = '{$params['ticket_type_id']}' AND is_used = 0");
  170.                     }
  171.  
  172.                     // We have barcode
  173.                     if ($barcodeExternal['id'] && !$params['is_test']) {
  174.  
  175.                         // 1. Marking as used
  176.                         $GLOBALS['dbh']->autoExecute($this->sTableBarcodeExternal, array(
  177.                             'is_used' => 1,
  178.                             'date_used' => NOW,
  179.                             'ticket_id' => $params['ticket_id'],
  180.                             'is_bp' => (!empty($params['is_bp']) ? 1 : 0)
  181.                                 ), DB_AUTOQUERY_UPDATE, ' id = ' . $barcodeExternal['id']);
  182.  
  183.                         // 2. Returning barcode
  184.                         return array(
  185.                             'code' => $barcodeExternal['bar_code'],
  186.                             'type' => $barcodeExternal['code_type'] ? $barcodeExternal['code_type'] : $params['code_type'],
  187.                         );
  188.                     }
  189.                 }
  190.  
  191.                 if (strlen($params['ticket_id']) == 6) {
  192.                     $digits = '7' . sprintf('%06d', $params['ticket_id']) . substr($rand, 0, 5);
  193.                 } else
  194.                     $digits = '7' . sprintf('%05d', $params['ticket_id']) . substr($rand, 0, 6);
  195.             }
  196.  
  197.             return array(
  198.                 'code' => ginst('Barcode')->makeEAN13($digits),
  199.                 'type' => $params['code_type'],
  200.             );
  201.         }
  202.  
  203.         /**
  204.          * Get barcode for booking place
  205.          *
  206.          * @param array $params - array with offline_user ID and assoc array of places id by ticketType
  207.          * @return array - barCode and code type
  208.          * @access public
  209.          */
  210.         public function getBookingBarCode($params = array()) {
  211.  
  212.             if ((int) $params['place_id'] > 0) {
  213.                 $barcodeExternal = $GLOBALS['dbh']->getRow("SELECT * FROM " . $this->sTableBarcodeExternal . " WHERE type_id = '{$params['type_id']}' AND place_id = '{$params['place_id']}'");
  214.             }
  215.  
  216.             if (empty($barcodeExternal['id'])) {
  217.                 $barcodeExternal = $GLOBALS['dbh']->getRow("SELECT * FROM " . $this->sTableBarcodeExternal . " WHERE type_id = '{$params['type_id']}' AND is_used = 0");
  218.             }
  219.  
  220.             if ($barcodeExternal['id']) {
  221.                 // 1. Marking as used
  222.                 $GLOBALS['dbh']->autoExecute($this->sTableBarcodeExternal, array(
  223.                     'is_used' => 1,
  224.                     'date_used' => NOW,
  225.                     'booking_id' => $params['booking_id'],
  226.                         ), DB_AUTOQUERY_UPDATE, ' id = ' . $barcodeExternal['id']);
  227.  
  228.                 // 2. Returning barcode
  229.                 return array(
  230.                     'code' => $barcodeExternal['bar_code'],
  231.                     'type' => $barcodeExternal['code_type'] ? $barcodeExternal['code_type'] : $params['code_type'],
  232.                 );
  233.             } else {
  234.                 do {
  235.                     $barCode = $this->getBarCode($params);
  236.                     $barCodeExists = $GLOBALS['dbh']->getOne("SELECT id FROM t_ticket WHERE bar_code = '" . $barCode['code'] . "'");
  237.                 } while (!empty($barCodeExists));
  238.                 return $barCode;
  239.             }
  240.         }
  241.  
  242.         public function checkExternalBarcode($type_id, $bar_code) {
  243.  
  244.             $tmp = $GLOBALS['dbh']->getRow('SELECT * FROM ' . $this->sTableBarcodeExternal . ' WHERE type_id = ? AND bar_code = ?', array(
  245.                 $type_id, $bar_code
  246.             ));
  247.  
  248.             return $tmp['id'] ? 1 : 0;
  249.         }
  250.  
  251.         public function addExternalBarcode($params) {
  252.  
  253.             $GLOBALS['dbh']->autoExecute($this->sTableBarcodeExternal, array(
  254.                 'bar_code' => $params['bar_code'],
  255.                 'code_type' => $params['code_type'],
  256.                 'type_id' => $params['type_id'],
  257.                 'date_added' => NOW,
  258.                 'is_used' => 0,
  259.                 'added_by' => $params['user_id'],
  260.             ));
  261.         }
  262.  
  263.         public function getExternalBarcodes($ticket_type_id = false) {
  264.  
  265.             $tmp = $GLOBALS['dbh']->getAll('SELECT * FROM ' . $this->sTableBarcodeExternal . ' WHERE is_used = 0 AND type_id = ?', array(
  266.                 $ticket_type_id
  267.             ));
  268.  
  269.             return $tmp;
  270.         }
  271.  
  272.         public function generatePDF($params, $output_format = 'html') {
  273.  
  274.             set_time_limit(0);
  275.  
  276.             $tmp = (string) $params['ticket']['id'];
  277.  
  278.             $ticketType = ginst('TicketType')->getById($params['ticket']['type_id']);
  279.             $params['event'] = ginst('Event')->getById($ticketType['event_id'], 'id', true);
  280.             //pr($params);die();
  281.  
  282.             if (!$params['ticket']['format_id'])
  283.                 $params['ticket']['format_id'] = 1;
  284.             $ticketFormat = ginst('TicketFormat')->getById($params['ticket']['format_id']);
  285.             if (!empty($ticketFormat['id']) && in_array($ticketFormat['alias'], array('infopoint', 'termonew')) && $params['ticket']['group_id'] != 1) {
  286.                 $params['ticket']['format_id'] = 1;
  287.                 $ticketFormat = ginst('TicketFormat')->getById($params['ticket']['format_id']);
  288.             }
  289.             $params['ticket']['rules'] = $ticketType['ticket_text3'];
  290.  
  291.             $GLOBALS['smarty']->assign(array(
  292.                 'eventInfo' => $params['event'],
  293.                 'ticketType' => $ticketType,
  294.             ));
  295.  
  296.             // getting dimensions of barcodes
  297.             foreach (array('bar_code_image', 'bar_code_image_vertical', 'bar_code_image_large', 'bar_code_image_custom', 'bar_code_image_custom1', 'bar_code_image_vertical1') as $name)
  298.                 if (file_exists(DOC_ROOT . $params['ticket'][$name])) {
  299.                     list($params['ticket'][$name . '_width'], $params['ticket'][$name . '_height']) = getimagesize(DOC_ROOT . $params['ticket'][$name]);
  300.                 }
  301.  
  302.             $filename = 'dynamic/tickets/' . ($params['is_test'] ? 'test/' : '') . (int) $tmp{0} . '/' . (int) $tmp{1} . '/' . ($params['is_test'] ? 'TEST_' : '') . substr($params['event']['alias'], 0, 20) . '_' . $params['ticket']['order_id'] . '_' . $params['ticket']['id'] . ($params['format'] ? '_' . $params['format'] : '') . '.' . $output_format;
  303.             $filenameFull = str_replace('//', '/', DOC_ROOT . '/' . $filename);
  304.  
  305.             if (!file_exists($filenameFull) || $params['force']) {
  306.  
  307.                 $smartyTemplate = $params['ticket']['group_id'] == 1 ? 'ticket' : 'group_' . $params['ticket']['group_id'];
  308.                 $smartyTemplate_css = 'ticket';
  309.                 if ($params['ticket']['group_id'] == 2 && $params['ticket']['cert_id'] != 0) {
  310.                     $params['certificate'] = $GLOBALS['dbh']->getRow("
  311.                             SELECT tc.*
  312.                             FROM t_ticket_certificate AS tc
  313.                             LEFT JOIN t_certificate_code AS cc ON cc.certificate_id = tc.id
  314.                             WHERE cc.id = ? ", array($params['ticket']['cert_id']));
  315.                     if (!empty($params['certificate']['template']) && file_exists(DOC_ROOT . 'templates/pdf/certificates/' . $params['certificate']['template'] . '.tpl')) {
  316.                         $smartyTemplate = 'certificates/' . $params['certificate']['template'];
  317.                         $smartyTemplate_css = 'certificates/' .$params['certificate']['template'];
  318.                     } else {
  319.                         $smartyTemplate = "certificate_temp";
  320.                         $smartyTemplate_css = 'ticket';
  321.                     }
  322.                 }
  323.  
  324.                 $path = pathinfo($filenameFull);
  325.                 if (!is_dir($path['dirname'])) {
  326.                     mkdir($path['dirname'], 0755, true);
  327.                 }
  328.                 if ($ticketFormat['id'] && $ticketFormat['alias'] != 'a4' && file_exists(DOC_ROOT . 'templates/pdf/' . $ticketFormat['alias'] . '/' . $smartyTemplate . '.tpl')) {
  329.                     $smartyTemplate = $ticketFormat['alias'] . '/' . $smartyTemplate;
  330.                     $smartyTemplate_css = $ticketFormat['alias'] . '/' . $smartyTemplate_css;
  331.                 }
  332.  
  333.                 if (!empty($ticketFormat['id']) && in_array($ticketFormat['alias'], array('a4', 'infopoint', 'termonew')) && !empty($params['ticket']['user_id'])) {
  334.                     $userTicketFormat = ginst('UserTicketFormat')->getOne(array('where' => " user_id = '{$params['ticket']['user_id']}' "));
  335.                     if (!empty($userTicketFormat['ticket_sale_logo_ext']) && file_exists(DOC_ROOT . 'dynamic/user/' . sprintf('ticket_sale_logo_%06d_small.', $userTicketFormat['id']) . $userTicketFormat['ticket_sale_logo_ext'])) {
  336.                         $params['ticket']['ticket_sale_logo'] = '/dynamic/user/' . sprintf('ticket_sale_logo_%06d_small.', $userTicketFormat['id']) . $userTicketFormat['ticket_sale_logo_ext'];
  337.                     }
  338.                 }
  339.                 if (!empty($params['ticket']['order_id'])) {
  340.                     $userPromoId = $GLOBALS['dbh']->getOne("SELECT promo_id FROM t_order WHERE id = '{$params['ticket']['order_id']}'");
  341.                     if (!empty($userPromoId)) {
  342.                         $userTicketFormat = ginst('UserTicketFormat')->getOne(array('where' => " user_id = '{$userPromoId}' "));
  343.                         if (!empty($userTicketFormat['ticket_sale_logo_ext']) && file_exists(DOC_ROOT . 'dynamic/user/' . sprintf('ticket_sale_logo_%06d_small.', $userTicketFormat['id']) . $userTicketFormat['ticket_sale_logo_ext'])) {
  344.                             $params['ticket']['ticket_sale_logo'] = '/dynamic/user/' . sprintf('ticket_sale_logo_%06d_small.', $userTicketFormat['id']) . $userTicketFormat['ticket_sale_logo_ext'];
  345.                         }
  346.                     }
  347.                 }
  348.                 if (!empty($params['ticket']['user_id'])) {
  349.                     $offlineUser = ginst('User')->info(array('id' => $params['ticket']['user_id']));
  350.                     $params['ticket']['offline_user'] = $offlineUser['extended_name'];
  351.                 } elseif (empty($params['ticket']['user_id']) && $ticketFormat['alias'] == 'a4' && $params['event']['partner_id'] == 1) {
  352.                    
  353.                 }
  354.  
  355.                 // fixes for some ticket parameters
  356.                 if ($params['ticket']['group_id'] == 2) {
  357.                     // if hotel then removing information about tickets from title
  358.                     $tmp = explode('+', $params['ticket']['title']);
  359.                     $params['ticket']['title'] = trim($tmp[0]);
  360.                 }
  361.                 $GLOBALS['smarty']->assign($params + array(
  362.                     'host' => 'http://' . $_SERVER['HTTP_HOST'],
  363.                     'is_print' => $is_filename ? 0 : 1,
  364.                     'is_pdf' => $output_format == 'pdf' ? 1 : 0,
  365.                 ));
  366.  
  367.                 if ($GLOBALS['bIsAdmin']) {
  368.                     $GLOBALS['smarty']->template_dir = DOC_ROOT . 'templates/';
  369.                     $GLOBALS['smarty']->compile_dir = DOC_ROOT . 'data/templates_c/';
  370.                     $GLOBALS['smarty']->config_dir = DOC_ROOT . 'data/configs/';
  371.                     $GLOBALS['smarty']->cache_dir = DOC_ROOT . 'data/cache/';
  372.                     $GLOBALS['smarty']->caching = false;
  373.                     $GLOBALS['smarty']->config_load($GLOBALS['smarty']->template_dir . 'lang/ru.conf');
  374.  
  375.                     $GLOBALS['smarty']->assign(array(
  376.                         'lng' => 'ru',
  377.                     ));
  378.                 }
  379.                 if ($params['order']['language_id'] != 1) {
  380.                     $GLOBALS['smarty']->config_load($GLOBALS['smarty']->template_dir . 'lang/' . $GLOBALS['lng']['ids'][$params['order']['language_id']] . '.conf');
  381.                 }
  382.  
  383.                 $html = $GLOBALS['smarty']->fetch('pdf/' . $smartyTemplate . '.tpl');
  384.  
  385.                 if ($output_format == 'pdf') {
  386.                     if (in_array($ticketFormat['alias'], array('ibiza'))) {
  387.                         include_once DOC_ROOT . "classes/tools/mPDFv5.7/mpdf.php";
  388.                     } else {
  389.                         include_once DOC_ROOT . "classes/tools/mPDF/mpdf.php";
  390.                     }
  391.                     if ($ticketFormat['alias'] != 'a4') {
  392.                         $mpdf = new mPDF('utf-8', array($ticketFormat['width'], $ticketFormat['height']), '8', '', 0, 0, 0, 0, 0, 0);
  393.                     } else {
  394.                         $mpdf = new mPDF('utf-8', 'A4', '8', '', 10, 10, 7, 7, 10, 10);
  395.                     }
  396.                     $mpdf->WriteHTML($GLOBALS['smarty']->fetch('pdf/' . $smartyTemplate_css . '.css.tpl'), 1);
  397.  
  398.                     $mpdf->list_indent_first_level = 0;
  399.                     $mpdf->WriteHTML($html, 2);
  400.  
  401.                     // Sometimes mPDF generating PDF with two pages, because ticket not fitting in one page
  402.                     // So we have to remove first blank page
  403.                     if (count($mpdf->pages) == 2) {
  404.                         $mpdf->pages[1] = $mpdf->pages[2];
  405.                         unset($mpdf->pages[2]);
  406.                         $mpdf->page = 1;
  407.                     }
  408.                     if ($ticketFormat['alias'] == 'karabas' && !$GLOBALS['isLocal']) {
  409.                         // We have to save PDF to temp file
  410.                         $filenameFull_temp = str_replace('.pdf', '_original.pdf', $filenameFull);
  411.  
  412.                         $mpdf->Output($filenameFull_temp, 'F');
  413.  
  414.                         exec('/usr/local/bin/pdf90 "' . $filenameFull_temp . '" --outfile "' . $filenameFull . '"');
  415.                     } else {
  416.                         $mpdf->Output($filenameFull, 'F');
  417.                     }
  418.                     switch ($ticketFormat['alias']) {
  419.                         case 'kobzov-termo':
  420.                             $this->rotateTicket($filenameFull, 180);
  421.                             break;
  422.                         case 'infopoint':
  423.                             $this->rotateTicket($filenameFull, 90);
  424.                             break;
  425.                     }
  426.                 } else {
  427.                     file_put_contents($filenameFull, $html);
  428.                 }
  429.             } else {
  430.                 $html = file_get_contents($filenameFull);
  431.             }
  432.  
  433.             if ($output_format == 'pdf' && !$params['ticket']['is_pdf'] && !$params['is_test']) {
  434.                 $GLOBALS['dbh']->autoExecute('t_ticket', array(
  435.                     'is_pdf' => 1,
  436.                         ), DB_AUTOQUERY_UPDATE, ' id = ' . $params['ticket']['id']);
  437.             }
  438.  
  439.  
  440.             ginst('Order')->addLog(array(
  441.                 'order_id' => $params['ticket']['order_id'],
  442.                 'action' => $params['download'] ? 'download-pdf' : ($params['force'] ? 're-' : '') . 'generate-pdf',
  443.                 'info' => array(
  444.                     'id' => $params['ticket']['id'],
  445.                     'bar_code' => $params['ticket']['bar_code'],
  446.                     'format' => $output_format,
  447.                     'force' => $params['force'],
  448.                     'download' => $params['download'],
  449.                 ),
  450.             ));
  451.  
  452.             if ($params['is_filename']) {
  453.                 return $filenameFull;
  454.             } else {
  455.  
  456.                 if ($output_format == 'html') {
  457.                     echo $html;
  458.                 } elseif ($output_format == 'pdf') {
  459.                     $pdf = file_get_contents($filenameFull);
  460.  
  461.                     header("Content-Type: application/pdf");
  462.  
  463.                     if ($params['download']) {
  464.                         header('Content-Disposition: attachment; filename="' . basename($filenameFull) . '"');
  465.  
  466.                         echo $pdf;
  467.                     } else {
  468.                         header('Content-disposition: inline; filename="' . basename($filenameFull) . '"');
  469.  
  470.                         echo $pdf;
  471.                     }
  472.                     exit;
  473.                 }
  474.             }
  475.         }
  476.  
  477.         public function generatePDFBooking($params, $outputFormat = 'html') {
  478.             global $smarty;
  479.  
  480.             set_time_limit(0);
  481.  
  482.             $ticketFormat = ginst('TicketFormat')->getById($params['format'], 'alias');
  483.  
  484.             // getting dimensions of barcodes
  485.             foreach (array('bar_code_image', 'bar_code_image_vertical', 'bar_code_image_large', 'bar_code_image_custom', 'bar_code_image_custom1', 'bar_code_image_vertical1') as $name) {
  486.                 if (file_exists(DOC_ROOT . $params['ticket'][$name])) {
  487.                     list($params['ticket'][$name . '_width'], $params['ticket'][$name . '_height']) = getimagesize(DOC_ROOT . $params['ticket'][$name]);
  488.                 }
  489.             }
  490.  
  491.             $typeId = (int) $params['ticket']['type_id'];
  492.             $reserveId = (int) $params['reserve_id'];
  493.             if ($params['ticket']['type_place_id']) {
  494.                 $typePlaceId = $params['ticket']['type_place_id'];
  495.                 $placeInfo = $params['order']['places'][$typePlaceId];
  496.  
  497.                 $sectorTitle = toAscii($placeInfo['sector_title']);
  498.                 $typePlaceTitle = $this->typePlaceTitle[$placeInfo['type_place']];
  499.                 $row = $placeInfo['row'];
  500.                 $number = $placeInfo['number'];
  501.  
  502.                 $filenameTmp = "dynamic/tickets/booking/{$typeId}/Booking_Sector-{$sectorTitle}_{$typePlaceTitle}-{$row}_Place-{$number}_{$reserveId}.{$outputFormat}";
  503.                 $filename = preg_replace('/Sector-sector/i', 'Sector', $filenameTmp);
  504.                 $filenameFull = str_replace('//', '/', DOC_ROOT . '/' . $filename);
  505.             } else {
  506.                 $titlePrint = toAscii($params['ticketType']['title_print']);
  507.                 $filenameTmp = "dynamic/tickets/booking/{$typeId}/Booking_Zone-{$titlePrint}_{$reserveId}.{$outputFormat}";
  508.                 $filename = preg_replace('/Zone-zone/i', 'Zone', $filenameTmp);
  509.                 $filenameFull = str_replace('//', '/', DOC_ROOT . '/' . $filename);
  510.             }
  511.  
  512.             if (!file_exists($filenameFull) || $params['force']) {
  513.  
  514.                 $path = pathinfo($filenameFull);
  515.                 if (!is_dir($path['dirname']))
  516.                     mkdir($path['dirname'], 0777, true);
  517.  
  518.                 if ($ticketFormat['alias'] == 'a4') {
  519.                     $smartyTemplate = "ticket";
  520.                     $smartyTemplate_css = 'ticket';
  521.                 } else {
  522.                     $smartyTemplate = 'termonew/ticket';
  523.                     $smartyTemplate_css = 'termonew/ticket';
  524.                 }
  525.  
  526.                 $smarty->assign($params + array(
  527.                     'host' => 'http://' . $_SERVER['HTTP_HOST'],
  528.                     'is_print' => $params['is_filename'] ? 0 : 1,
  529.                     'is_pdf' => $outputFormat == 'pdf' ? 1 : 0,
  530.                 ));
  531.  
  532.                 if ($GLOBALS['bIsAdmin']) {
  533.                     $smarty->template_dir = DOC_ROOT . 'templates/';
  534.                     $smarty->compile_dir = DOC_ROOT . 'data/templates_c/';
  535.                     $smarty->config_dir = DOC_ROOT . 'data/configs/';
  536.                     $smarty->cache_dir = DOC_ROOT . 'data/cache/';
  537.                     $smarty->caching = false;
  538.                     $smarty->config_load($smarty->template_dir . 'lang/ru.conf');
  539.  
  540.                     $smarty->assign(array(
  541.                         'lng' => 'ru',
  542.                     ));
  543.                 }
  544.  
  545.                 $html = $smarty->fetch(DOC_ROOT . '/templates/pdf/' . $smartyTemplate . '.tpl');
  546.  
  547.                 if ($outputFormat == 'pdf') {
  548.                     include_once DOC_ROOT . "classes/tools/mPDF/mpdf.php";
  549.  
  550.                     if ($ticketFormat['alias'] != 'a4') {
  551.                         $mpdf = new mPDF('utf-8', array($ticketFormat['width'], $ticketFormat['height']), '8', '', 0, 0, 0, 0, 0, 0);
  552.                     } else {
  553.                         $mpdf = new mPDF('utf-8', 'A4', '8', '', 10, 10, 7, 7, 10, 10);
  554.                     }
  555.  
  556.                     $mpdf->WriteHTML($smarty->fetch('pdf/' . $smartyTemplate_css . '.css.tpl'), 1);
  557.  
  558.                     $mpdf->list_indent_first_level = 0;
  559.                     $mpdf->WriteHTML($html, 2);
  560.  
  561.                     // Sometimes mPDF generating PDF with two pages, because ticket not fitting in one page
  562.                     // So we have to remove first blank page
  563.                     if (count($mpdf->pages) == 2) {
  564.                         $mpdf->pages[1] = $mpdf->pages[2];
  565.                         unset($mpdf->pages[2]);
  566.                         $mpdf->page = 1;
  567.                     }
  568.  
  569.                     $mpdf->Output($filenameFull, 'F');
  570.                 } else {
  571.                     file_put_contents($filenameFull, $html);
  572.                 }
  573.             } else {
  574.                 $html = file_get_contents($filenameFull);
  575.             }
  576.  
  577.  
  578.             if ($params['is_filename']) {
  579.                 return $filenameFull;
  580.             } else {
  581.                 if ($outputFormat == 'html') {
  582.                     echo $html;
  583.                 } elseif ($outputFormat == 'pdf') {
  584.                     $pdf = file_get_contents($filenameFull);
  585.                     header("Content-Type: application/pdf");
  586.  
  587.                     if ($params['download']) {
  588.                         header('Content-Disposition: attachment; filename="' . basename($filenameFull) . '"');
  589.  
  590.                         echo $pdf;
  591.                     } else {
  592.                         header('Content-disposition: inline; filename="' . basename($filenameFull) . '"');
  593.                         echo $pdf;
  594.                     }
  595.                     exit;
  596.                 }
  597.             }
  598.         }
  599.  
  600.         /**
  601.          * This method returns barcodes list by event id
  602.          * @param int $eventId
  603.          * @return array
  604.          */
  605.         public function getBarcodeList($eventId = false) {
  606.             if (!$eventId)
  607.                 return;
  608.  
  609.             $listTmp = $GLOBALS['dbh']->getAll('
  610.             SELECT
  611.                 `t`.`type_id`,
  612.                 `t`.`bar_code`,
  613.                 `t`.`bar_code_temp`
  614.             FROM
  615.                 `t_ticket` AS `t`
  616.             INNER JOIN `t_order` AS `o`
  617.                 ON (`o`.`id` = `t`.`order_id`
  618.                 AND `o`.`paid_status` <> 8
  619.                 AND `o`.`is_test` = 0
  620.                 AND (`o`.`payment_type` = "free" AND (`o`.`payment_subtype` <> "test" OR `o`.`payment_subtype` IS NULL) OR `o`.`payment_type` <> "free")
  621.                 AND `o`.`event_id` = ?)
  622.             INNER JOIN `t_ticket_type` AS `tt`
  623.                 ON `tt`.`id` = `t`.`type_id`
  624.             WHERE `t`.`is_printed` = 1
  625.                 AND `t`.`is_test` = 0
  626.                 AND `t`.`is_canceled` = 0
  627.             UNION
  628.             SELECT
  629.                 `pr`.`type_id`,
  630.                 `pr`.`bar_code`,
  631.                 NULL AS `bar_code_temp`
  632.             FROM
  633.                 `t_ticket_type_place_reserved` AS `pr`
  634.             INNER JOIN `t_ticket_type` AS `tt` ON `tt`.`id` = `pr`.`type_id`
  635.             WHERE `tt`.`event_id` = ? AND `pr`.`active` = 1
  636.         ', array($eventId, $eventId));
  637.  
  638.             return $listTmp;
  639.         }
  640.  
  641.         public function getEventsSalesTickets($eventsIds = array()) {
  642.             global $dbh;
  643.             if (empty($eventsIds)) {
  644.                 return array();
  645.             }
  646.  
  647.             if (is_array($eventsIds)) {
  648.                 $ids = implode(',', $eventsIds);
  649.             } else {
  650.                 $ids = $eventsIds;
  651.             }
  652.  
  653.             return $dbh->getAssoc("
  654.             SELECT
  655.                 o.event_id, tt.id AS type_id, tt.group_id,
  656.                 IF(tt.group_id = 2, 0, tt.`price_single`) price_single, IF(tt.group_id = 2, t.price, tt.`price_single`) AS price
  657.             FROM {$this->table_name} AS t
  658.             LEFT JOIN t_order AS o ON o.`id` = t.order_id
  659.             LEFT JOIN t_ticket_type AS tt ON tt.`id` = t.type_id
  660.             WHERE
  661.                 o.paid_status IN (2,9) AND o.payment_type <> 'free' AND o.is_free = 0
  662.                 AND t.`is_printed` = 1 AND t.`is_test` = 0 AND t.`is_hidden` = 0 AND t.`is_canceled` = 0
  663.                 AND o.event_id IN (!)
  664.             ORDER BY t.id
  665.         ", 0, array($ids), DB_FETCHMODE_ASSOC, 1);
  666.         }
  667.  
  668.         /**
  669.          * Rotate PDF ticket file
  670.          * @param string $fileName full name of the file
  671.          * @param int $degree ration degree
  672.          * @return boolean false on failure
  673.          */
  674.         public function rotateTicket($fileName = '', $degree = 180) {
  675.             if (!file_exists($fileName)) {
  676.                 return false;
  677.             }
  678.             $fileCopy = str_replace('.pdf', '_copy.pdf', $fileName);
  679.             if (!file_exists($fileCopy)) {
  680.                 unlink($fileCopy);
  681.             }
  682.             if ($degree == 180) {
  683.                 $command = 'pdftk ' . $fileName . ' cat 1-endsouth output ' . $fileCopy;
  684.             } else {
  685.                 $command = 'pdftk ' . $fileName . ' cat 1-endeast output ' . $fileCopy;
  686.             }
  687.             exec($command);
  688.             if (!file_exists($fileCopy)) {
  689.                 return false;
  690.             }
  691.             unlink($fileName);
  692.             rename($fileCopy, $fileName);
  693.         }
  694.  
  695.         public function margePDF($params = array()) {
  696.             if (empty($params)) {
  697.                 return false;
  698.             }
  699.  
  700.             $ticketFormat = ginst('TicketFormat')->getById($params['order']['tickets_format_id']);
  701.  
  702.             set_include_path(DOC_ROOT . "classes/tools/");
  703.             require_once DOC_ROOT . "classes/tools/mPDF/mpdf.php";
  704.  
  705.             if ($ticketFormat['alias'] == 'infopoint') {
  706.                 $mpdf = new mPDF('utf-8', array($ticketFormat['height'], $ticketFormat['width']), '8', '', 0, 0, 0, 0, 0, 0);
  707.             } elseif ($ticketFormat['alias'] != 'a4') {
  708.                 $mpdf = new mPDF('utf-8', array($ticketFormat['width'], $ticketFormat['height']), '8', '', 0, 0, 0, 0, 0, 0);
  709.             } else {
  710.                 $mpdf = new mPDF('utf-8', 'A4', '8', '', 10, 10, 7, 7, 10, 10);
  711.             }
  712.  
  713.             $mpdf->list_indent_first_level = 0;
  714.             $mpdf->defaultfooterfontstyle = 'blank';
  715.             $mpdf->defaultfooterline = 0;
  716.  
  717.             $mpdf->SetImportUse();
  718.  
  719.             $path = 'http://' . $GLOBALS['baseDomain'] . '/dynamic/tickets/merged/';
  720.             $catalog = DOC_ROOT . 'dynamic/tickets/';
  721.             $catalogPDF = $catalog . 'merged/';
  722.  
  723.             if (!is_dir($catalogPDF)) {
  724.                 mkdir($catalogPDF, 0777, true);
  725.             }
  726.  
  727.             $shortName = $params['order']['hash'] . '.pdf';
  728.             $filenameFull = $catalogPDF . $shortName;
  729.  
  730.  
  731.             foreach ($params['order']['items'] as $ticket) {
  732.                 if ($ticket['group_id'] <> 1) {
  733.                     continue;
  734.                 }
  735.  
  736.                 $shortFilename = substr($params['event']['alias'], 0, 20) . '_' . $ticket['order_id'] . '_' . $ticket['id'] . '.pdf';
  737.                 $filename = $catalog . (int) $ticket['id'][0] . '/' . (int) $ticket['id'][1] . '/' . $shortFilename;
  738.                 $sourceFile = $mpdf->SetSourceFile($filename);
  739.                 $mpdf->AddPage('', '', '1', 'i', 'on');
  740.                 $tplId = $mpdf->ImportPage($sourceFile);
  741.                 $mpdf->UseTemplate($tplId, '', '', '', '');
  742.             }
  743.  
  744.             $mpdf->Output($filenameFull, 'F');
  745.  
  746.             if ($params['is_filename']) {
  747.                 return $path . $shortName;
  748.             } else {
  749.                 $pdf = file_get_contents($filenameFull);
  750.                 header("Content-Type: application/pdf");
  751.                 if ($params['download']) {
  752.                     header('Content-Disposition: attachment; filename="' . basename($filenameFull) . '"');
  753.  
  754.                     echo $pdf;
  755.                 } else {
  756.                     header('Content-disposition: inline; filename="' . basename($filenameFull) . '"');
  757.                     echo $pdf;
  758.                 }
  759.             }
  760.             exit;
  761.         }
  762.  
  763.         public function genTax($params) {
  764.             $catalog = 'http://' . $GLOBALS['baseDomain'] . '/dynamic/tickets/';
  765.  
  766.             foreach ($params['order']['items'] as $ticket) {
  767.                 if (in_array($ticket['group_id'], array(6, 7))) {
  768.                     $shortFilename = substr($params['event']['alias'], 0, 20) . '_' . $ticket['order_id'] . '_' . $ticket['id'] . '.pdf';
  769.                     $filename = $catalog . (int) $ticket['id'][0] . '/' . (int) $ticket['id'][1] . '/' . $shortFilename;
  770.                     break;
  771.                 }
  772.             }
  773.  
  774.             return $filename;
  775.         }
  776.  
  777.     }
  778.  
  779.    
  780.  
  781. endif;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement