/**
     * Table des logs
     */
    public function renderFormLogs()
    {
        $context = $context = Context::getContext();
        $language_code = HipayClass::getLanguageCode($context->language->iso_code);
        Tools::addCSS(_MODULE_DIR_ . $this->name . '/css/14logstable.css', 'all');
        Tools::addJS(_MODULE_DIR_ . $this->name . '/js/logs_' . $language_code . '.js');
        Tools::addJS(_MODULE_DIR_ . $this->name . '/js/jquery.dataTables.min.js');
        $logs = Db::getInstance()->executeS('
			SELECT id, name, date, level, message
			FROM `' . _DB_PREFIX_ . 'hipay_logs` ORDER BY id DESC LIMIT 0, 6000
		');
        $html = '';
        if (is_array($logs)) {
            $html = '
            <div class="panel">
            <fieldset id="fieldset_1">
                            <legend>' . $this->l('Logs') . '</legend>
                    <table id="hipay_logs" cellpadding="0" cellspacing="0" border="0">
                            <thead>
                                    <tr>
											<th>' . $this->l('Id') . '</th>
                                            <th>' . $this->l('Name') . '</th>
                                            <th>' . $this->l('Date') . '</th>
                                            <th>' . $this->l('Level') . '</th>
                                            <th>' . $this->l('Message') . '</th>
                                    </tr>
                            </thead>
                                    <tbody>';
            $i = 0;
            foreach ($logs as $log) {
                $date = date("d/m/y H:i:s", strtotime($log['date']));
                if ($log['level'] == 1) {
                    $level = $this->l('NOTICE');
                } elseif ($log['level'] == 2) {
                    $level = $this->l('WARNING');
                } elseif ($log['level'] == 3) {
                    $level = $this->l('ERROR');
                } elseif ($log['level'] == 4) {
                    $level = $this->l('APICALL');
                }
                $html .= '
                                    <tr>
                                            <td>' . $log['id'] . '</td>
											<td>' . $log['name'] . '</td>
                                            <td>' . $date . '</td>
                                            <td>' . $level . '</td>
                                            <td><span id="shortdetails' . $i . '" class="shortDetails">' . Tools::substr($log['message'], 0, 150);
                if (Tools::strlen($log['message']) > 150) {
                    $html .= '<a href="#" class="more" onclick="document.getElementById(\'details' . $i . '\').style.display = \'inline\';document.getElementById(\'shortdetails' . $i . '\').style.display = \'none\';return false;"> ...</a></span>
                                            <span id="details' . $i . '" class="moreDetails" style="display:none">' . $log['message'] . '</span></td>';
                }
                $html .= '</tr>';
                $i++;
            }
            $html .= '</tbody>
                            </table>
                    </fieldset></div>';
        }
        return $html;
    }
 /**
  * Generates API data Note : This data structure is different from HipayToken::getApiData.
  *
  * @param $cart :
  *        	Contains cart information @param $data_type : Can be either 'null' or 'iframe'. 'null' = default dedicated page behaviour 'iframe' = Updates some values to match iframe behaviour @param $context : Optional parameter through which current context is passed. If not present, the context will get instantiated none the less. returns API response array()
  */
 public static function getApiData($cart = null, $data_type = null, $context = null, $local_card = null)
 {
     $hipay = new HiPay_Tpp();
     if (!$context) {
         $context = Context::getContext();
     }
     // Basic check for security
     // If no currency for the cart, redirect to first order step
     if (!$hipay->checkCurrency($cart)) {
         Tools::redirect('index.php?controller=order&xer=3');
     }
     $language = HipayClass::getLanguageCode($context->language->iso_code);
     // Retrieving Currency
     $currency_array = $hipay->getCurrency((int) $cart->id_currency);
     $currency = $currency_array[0]['iso_code'];
     foreach ($currency_array as $key => $value) {
         if ($value['id_currency'] == $cart->id_currency) {
             $actual_currency = $value['iso_code'];
         }
     }
     if ($currency != $actual_currency) {
         $currency = $actual_currency;
     }
     // Retrieve Total
     $amount = $cart->getOrderTotal(true, Cart::BOTH);
     // Order ID
     $orderid = $cart->id . "(" . time() . ")";
     // Cart other details
     $cart_summary = $cart->getSummaryDetails(null, true);
     $shipping = $cart_summary['total_shipping'];
     $tax = $cart_summary['total_tax'];
     $description = '';
     // Initialize to blank
     foreach ($cart_summary['products'] as $key => $value) {
         if ($value['reference']) {
             // Add reference of each product
             $description .= 'ref_' . $value['reference'] . ', ';
         }
     }
     // Trim trailing seperator
     $description = Tools::substr($description, 0, -2);
     if (Tools::strlen($description) == 0) {
         $description = 'cart_id_' . $orderid;
     }
     // If description exceeds 255 char, trim back to 255
     $max_length = 255;
     if (Tools::strlen($description) > $max_length) {
         $offset = $max_length - 3 - Tools::strlen($description);
         $description = Tools::substr($description, 0, strrpos($description, ' ', $offset)) . '...';
     }
     // Load customer and populate data array
     $customer = new Customer((int) $cart->id_customer);
     // Verify if customer is indeed a customer object
     if (!Validate::isLoadedObject($customer)) {
         Tools::redirect('index.php?controller=order&xer=5');
     }
     // Retrive Customer ID
     $cid = (int) $customer->id;
     // Retrieve first name and last name
     $firstname = $customer->firstname;
     $lastname = $customer->lastname;
     // Retrieve Gender
     $gender = HipayClass::getAPIGender($customer->id_gender);
     // Retrieve Email
     $email = $customer->email;
     // Retrieve Birthdate
     $birthdate = $customer->birthday;
     $birthdate = str_replace('-', '', $birthdate);
     // Load Addresses - Invoice addr and Delivery addr
     $invoice = new Address((int) $cart->id_address_invoice);
     $delivery = new Address((int) $cart->id_address_delivery);
     if (isset($invoice->phone) && $invoice->phone != '') {
         $phone = $invoice->phone;
     } elseif (isset($invoice->phone_mobile) && $invoice->phone_mobile != '') {
         $phone = $invoice->phone_mobile;
     } else {
         $phone = '';
     }
     $streetaddress = $invoice->address1;
     $streetaddress2 = $invoice->address2;
     $city = $invoice->city;
     $zipcode = $invoice->postcode;
     // Data 'state' = The USA state or the Canada state of the
     // customer making the purchase. Send this
     // information only if the address country of the
     // customer is US (USA) or CA (Canada
     $state = '';
     // Data 'country' = The country code of the customer.
     // This two-letter country code complies with ISO
     // 3166-1 (alpha 2).
     $country = HipayClass::getCountryCode($invoice->country);
     // Delivery info
     $shipto_firstname = $delivery->firstname;
     $shipto_lastname = $delivery->lastname;
     $shipto_streetaddress = $delivery->address1;
     $shipto_streetaddress2 = $delivery->address2;
     $shipto_city = $delivery->city;
     $shipto_zipcode = $delivery->postcode;
     // Data 'shipto_state' = The USA state or the Canada state of the
     // customer making the purchase. Send this
     // information only if the address country of the
     // customer is US (USA) or CA (Canada
     $shipto_state = '';
     // Data 'shipto_country' = The country code of the customer.
     // This two-letter country code complies with ISO
     // 3166-1 (alpha 2).
     $shipto_country = HipayClass::getCountryCode($delivery->country);
     // Data set => cdata1, cdata2, cdata3, cdata4
     // Custom data. You may use these parameters
     // to submit values you wish to receive back in
     // the API response messages or in the
     // notifications, e.g. you can use these
     // parameters to get back session data, order
     // content or user info.
     $cdata1 = 'c' . $orderid;
     // Cart ID
     $cdata2 = 'u' . $cid;
     // User ID
     $cdata3 = 'My+data+3';
     $cdata4 = 'My+data+4';
     // Set of return URLs
     if ($data_type == 'iframe') {
         // Template = iframe
         $accept_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14iframe.php' . '?return_status=accept&content_only=1');
         $decline_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14iframe.php' . '?return_status=decline&content_only=1');
         $cancel_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14iframe.php' . '?return_status=cancel&content_only=1');
         $pending_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14iframe.php' . '?return_status=pending&content_only=1');
         $exception_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14iframe.php' . '?return_status=exception&content_only=1');
         // Template = iframe
         $template = 'iframe';
         if (Configuration::get('HIPAY_TEMPLATE_MODE') == 'basic-js') {
             $template .= '-js';
         }
     } else {
         $accept_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14accept.php');
         $decline_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14decline.php');
         $cancel_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14cancel.php');
         $exception_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14exception.php');
         $pending_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $hipay->name . '/14pending.php');
         // Template = basic
         $template = Configuration::get('HIPAY_TEMPLATE_MODE');
     }
     // Implementing challenge url
     // Redirecting to challenge url if url present
     if (Configuration::get('HIPAY_CHALLENGE_URL')) {
         $pending_url = Configuration::get('HIPAY_CHALLENGE_URL');
     }
     // Data 'eci'
     // Electronic Commerce Indicator (ECI).
     // The ECI indicates the security level at
     // which the payment information is
     // processed between the cardholder and
     // merchant.
     // Possible values:
     // 1 = MO/TO (Card Not Present)
     // 2 = MO/TO - Recurring
     // 3 = Installment Payment
     // 4 = Manually Keyed (Card Present)
     // 7 = Secure E-commerce with SSL/TLS
     // Encryption
     // 9 = Recurring E-commerce
     $eci = '7';
     // 3D Secure authentication
     // Data authentication_indicator
     // Indicates if the authentication should be
     // performed. Can be used to overrule the
     // merchant level configuration.
     // 0 = Bypass authentication
     // 1 = Continue if possible (Default)
     $authentication_indicator = (int) '0';
     if ((int) Configuration::get('HIPAY_THREEDSECURE')) {
         if ($amount >= (int) Configuration::get('HIPAY_THREEDSECURE_AMOUNT')) {
             $authentication_indicator = (int) Configuration::get('HIPAY_THREEDSECURE');
         } else {
             $authentication_indicator = (int) '0';
         }
     }
     // Get last payment methods list
     $payment_product_list_upd = Tools::getValue('payment_product_list_upd');
     if (Configuration::get('HIPAY_MANUALCAPTURE')) {
         $operation = 'Authorization';
     } else {
         $operation = 'Sale';
     }
     // Intergrating Local cards logic into the data construction
     $payment_product_list = Configuration::get('HIPAY_ALLOWED_CARDS');
     if ($local_card != null) {
         // Override payment_product_list with local card
         $payment_product_list_upd = $local_card;
         $operation = 'Sale';
         // Default value
         // Override operation - Force sale, not manual capture.
         if (file_exists(_PS_ROOT_DIR_ . '/modules/' . $hipay->name . '/special_cards.xml')) {
             $local_cards = simplexml_load_file(_PS_ROOT_DIR_ . '/modules/' . $hipay->name . '/special_cards.xml');
             if (count($local_cards)) {
                 foreach ($local_cards as $key => $value) {
                     if ($local_card == (string) $value->code) {
                         if ((string) $value->manualcapture == '1') {
                             $operation = 'Authorization';
                         } else {
                             $operation = 'Sale';
                         }
                     }
                 }
             }
         }
     }
     // On module administration we change the values of display selector to get always by default the selector showed
     if (Configuration::get('HIPAY_SELECTOR_MODE') == '1') {
         $display_selector = 0;
     } else {
         $display_selector = 1;
     }
     $data = array('operation' => $operation, 'payment_product_list' => $payment_product_list_upd, 'description' => $description, 'long_description' => '', 'currency' => $currency, 'orderid' => $orderid, 'amount' => $amount, 'shipping' => $shipping, 'tax' => $tax, 'accept_url' => $accept_url, 'decline_url' => $decline_url, 'pending_url' => $pending_url, 'cancel_url' => $cancel_url, 'exception_url' => $exception_url, 'language' => $language, 'cdata1' => $cdata1, 'cdata2' => $cdata2, 'cdata3' => $cdata3, 'cdata4' => $cdata4, 'cid' => $cid, 'phone' => $phone, 'birthdate' => $birthdate, 'gender' => $gender, 'firstname' => $firstname, 'lastname' => $lastname, 'recipientinfo' => 'Client', 'streetaddress' => $streetaddress, 'streetaddress2' => $streetaddress2, 'city' => $city, 'state' => $state, 'zipcode' => $zipcode, 'country' => $country, 'shipto_firstname' => $shipto_firstname, 'shipto_lastname' => $shipto_lastname, 'shipto_recipientinfo' => 'Client', 'shipto_streetaddress' => $shipto_streetaddress, 'shipto_streetaddress2' => $shipto_streetaddress2, 'shipto_city' => $shipto_city, 'shipto_state' => $shipto_state, 'shipto_zipcode' => $shipto_zipcode, 'shipto_country' => $shipto_country, 'ipaddr' => $_SERVER['REMOTE_ADDR'], 'email' => $email, 'authentication_indicator' => strval($authentication_indicator), 'eci' => $eci, 'template' => $template, 'css' => Configuration::get('HIPAY_CSS_URL'), 'display_selector' => $display_selector);
     // TPPPRS-21
     if ($birthdate == 0) {
         unset($data['birthdate']);
     }
     // Merchant display name limited to 32 characters only
     if ($data_type == 'iframe') {
         // No merchant_display_name for mode iframe
     } else {
         $merchant_display_name = Tools::substr(Configuration::get('PS_SHOP_NAME'), 0, 32);
         $data['merchant_display_name'] = $merchant_display_name;
     }
     return $data;
 }
 public static function getApiData($cart = null, $cardtoken = null, $context = null, $cartUseExistingToken = 0)
 {
     $hipay = new HiPay_Tpp();
     if (!$context) {
         $context = Context::getContext();
     }
     // Basic check for security
     // If no currency for the cart, redirect to first order step
     if (!$hipay->checkCurrency($cart)) {
         Tools::redirect('index.php?controller=order&xer=3');
     }
     $language = HipayClass::getLanguageCode($context->language->iso_code);
     // Retrieving Currency
     $currency_array = $hipay->getCurrency((int) $cart->id_currency);
     $currency = $currency_array[0]['iso_code'];
     foreach ($currency_array as $value) {
         if ($value['id_currency'] == $cart->id_currency) {
             $actual_currency = $value['iso_code'];
         }
     }
     if ($currency != $actual_currency) {
         $currency = $actual_currency;
     }
     // Retrieve Total
     $amount = $cart->getOrderTotal(true, Cart::BOTH);
     // Cart other details
     $cart_summary = $cart->getSummaryDetails(null, true);
     $shipping = $cart_summary['total_shipping'];
     $tax = $cart_summary['total_tax'];
     $description = '';
     // Initialize to blank
     foreach ($cart_summary['products'] as $value) {
         if ($value['reference']) {
             // Add reference of each product
             $description .= 'ref_' . $value['reference'] . ', ';
         }
     }
     // Order ID
     $orderid = $cart->id . "(" . time() . ")";
     // Trim trailing seperator
     $description = Tools::substr($description, 0, -2);
     if (Tools::strlen($description) == 0) {
         $description = 'cart_id_' . $orderid;
     }
     // If description exceeds 255 char, trim back to 255
     $max_length = 255;
     if (Tools::strlen($description) > $max_length) {
         $offset = $max_length - 3 - Tools::strlen($description);
         $description = Tools::substr($description, 0, strrpos($description, ' ', $offset)) . '...';
     }
     // Load customer and populate data array
     $customer = new Customer((int) $cart->id_customer);
     // Verify if customer is indeed a customer object
     if (!Validate::isLoadedObject($customer)) {
         Tools::redirect('index.php?controller=order&xer=5');
     }
     // Retrive Customer ID
     $cid = (int) $customer->id;
     // Retrieve first name and last name
     $firstname = $customer->firstname;
     $lastname = $customer->lastname;
     // Retrieve Gender
     $gender = HipayClass::getAPIGender($customer->id_gender);
     // Retrieve Email
     $email = $customer->email;
     // Retrieve Birthdate
     $birthdate = $customer->birthday;
     $birthdate = str_replace('-', '', $birthdate);
     // Load Addresses - Invoice addr and Delivery addr
     $invoice = new Address((int) $cart->id_address_invoice);
     $delivery = new Address((int) $cart->id_address_delivery);
     if (isset($invoice->phone) && $invoice->phone != '') {
         $phone = $invoice->phone;
     } elseif (isset($invoice->phone_mobile) && $invoice->phone_mobile != '') {
         $phone = $invoice->phone_mobile;
     } else {
         $phone = '';
     }
     $streetaddress = $invoice->address1;
     $streetaddress2 = $invoice->address2;
     $city = $invoice->city;
     $zipcode = $invoice->postcode;
     // Data 'state' = The USA state or the Canada state of the
     // customer making the purchase. Send this
     // information only if the address country of the
     // customer is US (USA) or CA (Canada
     $state = '';
     // Data 'country' = The country code of the customer.
     // This two-letter country code complies with ISO
     // 3166-1 (alpha 2).
     $country = HipayClass::getCountryCode($invoice->country);
     // Delivery info
     $shipto_firstname = $delivery->firstname;
     $shipto_lastname = $delivery->lastname;
     $shipto_streetaddress = $delivery->address1;
     $shipto_streetaddress2 = $delivery->address2;
     $shipto_city = $delivery->city;
     $shipto_zipcode = $delivery->postcode;
     // Data 'shipto_state' = The USA state or the Canada state of the
     // customer making the purchase. Send this
     // information only if the address country of the
     // customer is US (USA) or CA (Canada
     $shipto_state = '';
     // Data 'shipto_country' = The country code of the customer.
     // This two-letter country code complies with ISO
     // 3166-1 (alpha 2).
     $shipto_country = HipayClass::getCountryCode($delivery->country);
     // Data set => cdata1, cdata2, cdata3, cdata4
     // Custom data. You may use these parameters
     // to submit values you wish to receive back in
     // the API response messages or in the
     // notifications, e.g. you can use these
     // parameters to get back session data, order
     // content or user info.
     $cdata1 = 'c' . $orderid;
     // Cart ID
     $cdata2 = 'u' . $cid;
     // User ID
     $cdata3 = 'nnone';
     $cdata4 = 'cdata4';
     $accept_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'index.php?fc=module&module=' . $hipay->name . '&controller=accept');
     $decline_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'index.php?fc=module&module=' . $hipay->name . '&controller=decline');
     $cancel_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'index.php?fc=module&module=' . $hipay->name . '&controller=cancel');
     $exception_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'index.php?fc=module&module=' . $hipay->name . '&controller=exception');
     $pending_url = HipayClass::getRedirectionUrl(Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'index.php?fc=module&module=' . $hipay->name . '&controller=pending');
     // Implementing challenge url
     // Redirecting to challenge url if url present
     if (Configuration::get('HIPAY_CHALLENGE_URL')) {
         $pending_url = Configuration::get('HIPAY_CHALLENGE_URL');
     }
     // Data 'eci'
     // Electronic Commerce Indicator (ECI).
     // The ECI indicates the security level at
     // which the payment information is
     // processed between the cardholder and
     // merchant.
     // Possible values:
     // 1 = MO/TO (Card Not Present)
     // 2 = MO/TO - Recurring
     // 3 = Installment Payment
     // 4 = Manually Keyed (Card Present)
     // 7 = Secure E-commerce with SSL/TLS
     // Encryption
     // 9 = Recurring E-commerce
     $eci = '7';
     // 3D Secure authentication
     // Data authentication_indicator
     // Indicates if the authentication should be
     // performed. Can be used to overrule the
     // merchant level configuration.
     // 0 = Bypass authentication
     // 1 = Continue if possible (Default)
     $authentication_indicator = '0';
     // Instantiate to default zero
     if ((int) Configuration::get('HIPAY_THREEDSECURE')) {
         if ($amount >= (int) Configuration::get('HIPAY_THREEDSECURE_AMOUNT')) {
             $authentication_indicator = Configuration::get('HIPAY_THREEDSECURE');
         } else {
             $authentication_indicator = '0';
         }
     }
     // If customer is using a memorized card, force the following params
     if ($cartUseExistingToken) {
         $authentication_indicator = '0';
         // Override ThreeDSecure
         $eci = '9';
         // 9 = Recurring E-commerce
     }
     $payment_product = Tools::getValue('paymentproductswitcher');
     if ($payment_product == '') {
         $payment_product = 'visa';
     }
     if (Configuration::get('HIPAY_MANUALCAPTURE')) {
         $operation = 'Authorization';
     } else {
         $operation = 'Sale';
     }
     if ($cardtoken) {
         // Important : Proceed only if cardtoken is not false!
         $data = array('operation' => $operation, 'payment_product' => $payment_product, 'description' => $description, 'long_description' => '', 'currency' => $currency, 'orderid' => $orderid, 'amount' => $amount, 'shipping' => $shipping, 'tax' => $tax, 'accept_url' => $accept_url, 'decline_url' => $decline_url, 'pending_url' => $pending_url, 'cancel_url' => $cancel_url, 'exception_url' => $exception_url, 'language' => $language, 'cdata1' => $cdata1, 'cdata2' => $cdata2, 'cdata3' => $cdata3, 'cdata4' => $cdata4, 'cid' => $cid, 'phone' => $phone, 'birthdate' => $birthdate, 'gender' => $gender, 'firstname' => $firstname, 'lastname' => $lastname, 'recipientinfo' => 'Client', 'streetaddress' => $streetaddress, 'streetaddress2' => $streetaddress2, 'city' => $city, 'state' => $state, 'zipcode' => $zipcode, 'country' => $country, 'shipto_firstname' => $shipto_firstname, 'shipto_lastname' => $shipto_lastname, 'shipto_recipientinfo' => 'Client', 'shipto_streetaddress' => $shipto_streetaddress, 'shipto_streetaddress2' => $shipto_streetaddress2, 'shipto_city' => $shipto_city, 'shipto_state' => $shipto_state, 'shipto_zipcode' => $shipto_zipcode, 'shipto_country' => $shipto_country, 'ipaddr' => $_SERVER['REMOTE_ADDR'], 'email' => $email, 'cardtoken' => $cardtoken, 'authentication_indicator' => (string) $authentication_indicator, 'eci' => $eci);
         // TPPPRS-21
         if ($birthdate == 0) {
             unset($data['birthdate']);
         }
         return $data;
     }
     return false;
 }