shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

squareup.php (54445B)


      1 <?php
      2 
      3 class ControllerExtensionPaymentSquareup extends Controller {
      4     private $error = array();
      5 
      6     public function index() {
      7         $this->load->language('extension/payment/squareup');
      8 
      9         $this->load->model('extension/payment/squareup');
     10         $this->load->model('setting/setting');
     11 
     12         $this->load->library('squareup');
     13 
     14         if ($this->request->server['HTTPS']) {
     15             $server = HTTPS_SERVER;
     16         } else {
     17             $server = HTTP_SERVER;
     18         }
     19 
     20         $previous_setting = $this->model_setting_setting->getSetting('payment_squareup');
     21 
     22         try {
     23             if ($this->config->get('payment_squareup_access_token')) {
     24                 if (!$this->squareup->verifyToken($this->config->get('payment_squareup_access_token'))) {
     25                     unset($previous_setting['payment_squareup_merchant_id']);
     26                     unset($previous_setting['payment_squareup_merchant_name']);
     27                     unset($previous_setting['payment_squareup_access_token']);
     28                     unset($previous_setting['payment_squareup_access_token_expires']);
     29                     unset($previous_setting['payment_squareup_locations']);
     30                     unset($previous_setting['payment_squareup_sandbox_locations']);
     31 
     32                     $this->config->set('payment_squareup_merchant_id', null);
     33                 } else {
     34                     if (!$this->config->get('payment_squareup_locations')) {
     35                         $previous_setting['payment_squareup_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_access_token'), $first_location_id);
     36                         $previous_setting['payment_squareup_location_id'] = $first_location_id;
     37                     }
     38                 }
     39             }
     40 
     41             if (!$this->config->get('payment_squareup_sandbox_locations') && $this->config->get('payment_squareup_sandbox_token')) {
     42                 $previous_setting['payment_squareup_sandbox_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_sandbox_token'), $first_location_id);
     43                 $previous_setting['payment_squareup_sandbox_location_id'] = $first_location_id;
     44             }
     45 
     46             $this->model_setting_setting->editSetting('payment_squareup', $previous_setting);
     47         } catch (\Squareup\Exception $e) {
     48             $this->pushAlert(array(
     49                 'type' => 'danger',
     50                 'icon' => 'exclamation-circle',
     51                 'text' => sprintf($this->language->get('text_location_error'), $e->getMessage())
     52             ));
     53         }
     54 
     55         $previous_config = new Config();
     56 
     57         foreach ($previous_setting as $key => $value) {
     58             $previous_config->set($key, $value);
     59         }        
     60 
     61         if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate()) {
     62             $this->model_setting_setting->editSetting('payment_squareup', array_merge($previous_setting, $this->request->post));
     63 
     64             $this->session->data['success'] = $this->language->get('text_success');
     65 
     66             if (isset($this->request->get['save_and_auth'])) {
     67                 $this->response->redirect($this->squareup->authLink($this->request->post['payment_squareup_client_id']));
     68             } else {
     69                 $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
     70             }
     71         }
     72 
     73         $this->document->setTitle($this->language->get('heading_title'));
     74 
     75         $data['error_status']                       = $this->getValidationError('status');
     76         $data['error_display_name']                 = $this->getValidationError('display_name');
     77         $data['error_client_id']                    = $this->getValidationError('client_id');
     78         $data['error_client_secret']                = $this->getValidationError('client_secret');
     79         $data['error_delay_capture']                = $this->getValidationError('delay_capture');
     80         $data['error_sandbox_client_id']            = $this->getValidationError('sandbox_client_id');
     81         $data['error_sandbox_token']                = $this->getValidationError('sandbox_token');
     82         $data['error_location']                     = $this->getValidationError('location');
     83         $data['error_cron_email']                   = $this->getValidationError('cron_email');
     84         $data['error_cron_acknowledge']             = $this->getValidationError('cron_acknowledge');
     85 
     86         $data['payment_squareup_status']                    = $this->getSettingValue('payment_squareup_status');
     87         $data['payment_squareup_status_authorized']         = $this->getSettingValue('payment_squareup_status_authorized');
     88         $data['payment_squareup_status_captured']           = $this->getSettingValue('payment_squareup_status_captured');
     89         $data['payment_squareup_status_voided']             = $this->getSettingValue('payment_squareup_status_voided');
     90         $data['payment_squareup_status_failed']             = $this->getSettingValue('payment_squareup_status_failed');
     91         $data['payment_squareup_display_name']              = $this->getSettingValue('payment_squareup_display_name');
     92         $data['payment_squareup_client_id']                 = $this->getSettingValue('payment_squareup_client_id');
     93         $data['payment_squareup_client_secret']             = $this->getSettingValue('payment_squareup_client_secret');
     94         $data['payment_squareup_enable_sandbox']            = $this->getSettingValue('payment_squareup_enable_sandbox');
     95         $data['payment_squareup_debug']                     = $this->getSettingValue('payment_squareup_debug');
     96         $data['payment_squareup_sort_order']                = $this->getSettingValue('payment_squareup_sort_order');
     97         $data['payment_squareup_total']                     = $this->getSettingValue('payment_squareup_total');
     98         $data['payment_squareup_geo_zone_id']               = $this->getSettingValue('payment_squareup_geo_zone_id');
     99         $data['payment_squareup_sandbox_client_id']         = $this->getSettingValue('payment_squareup_sandbox_client_id');
    100         $data['payment_squareup_sandbox_token']             = $this->getSettingValue('payment_squareup_sandbox_token');
    101         $data['payment_squareup_locations']                 = $this->getSettingValue('payment_squareup_locations', $previous_config->get('payment_squareup_locations'));
    102         $data['payment_squareup_location_id']               = $this->getSettingValue('payment_squareup_location_id');
    103         $data['payment_squareup_sandbox_locations']         = $this->getSettingValue('payment_squareup_sandbox_locations', $previous_config->get('payment_squareup_sandbox_locations'));
    104         $data['payment_squareup_sandbox_location_id']       = $this->getSettingValue('payment_squareup_sandbox_location_id');
    105         $data['payment_squareup_delay_capture']             = $this->getSettingValue('payment_squareup_delay_capture');
    106         $data['payment_squareup_recurring_status']          = $this->getSettingValue('payment_squareup_recurring_status');
    107         $data['payment_squareup_cron_email_status']         = $this->getSettingValue('payment_squareup_cron_email_status');
    108         $data['payment_squareup_cron_email']                = $this->getSettingValue('payment_squareup_cron_email', $this->config->get('config_email'));
    109         $data['payment_squareup_cron_token']                = $this->getSettingValue('payment_squareup_cron_token');
    110         $data['payment_squareup_cron_acknowledge']          = $this->getSettingValue('payment_squareup_cron_acknowledge', null, true);
    111         $data['payment_squareup_notify_recurring_success']  = $this->getSettingValue('payment_squareup_notify_recurring_success');
    112         $data['payment_squareup_notify_recurring_fail']     = $this->getSettingValue('payment_squareup_notify_recurring_fail');
    113         $data['payment_squareup_merchant_id']               = $this->getSettingValue('payment_squareup_merchant_id', $previous_config->get('payment_squareup_merchant_id'));
    114         $data['payment_squareup_merchant_name']             = $this->getSettingValue('payment_squareup_merchant_name', $previous_config->get('payment_squareup_merchant_name'));
    115 
    116         if ($previous_config->get('payment_squareup_access_token') && $previous_config->get('payment_squareup_access_token_expires')) {
    117             $expiration_time = date_create_from_format('Y-m-d\TH:i:s\Z', $previous_config->get('payment_squareup_access_token_expires'));
    118             $now = date_create();
    119 
    120             $delta = $expiration_time->getTimestamp() - $now->getTimestamp();
    121             $expiration_date_formatted = $expiration_time->format('l, F jS, Y h:i:s A, e');
    122 
    123             if ($delta < 0) {
    124                 $this->pushAlert(array(
    125                     'type' => 'danger',
    126                     'icon' => 'exclamation-circle',
    127                     'text' => sprintf($this->language->get('text_token_expired'), $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true))
    128                 ));
    129             } else if ($delta < (5 * 24 * 60 * 60)) { // token is valid, just about to expire
    130                 $this->pushAlert(array(
    131                     'type' => 'warning',
    132                     'icon' => 'exclamation-circle',
    133                     'text' => sprintf($this->language->get('text_token_expiry_warning'), $expiration_date_formatted, $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true))
    134                 ));
    135             }
    136 
    137             $data['access_token_expires_time'] = $expiration_date_formatted;
    138         } else if ($previous_config->get('payment_squareup_client_id')) {
    139             $this->pushAlert(array(
    140                 'type' => 'danger',
    141                 'icon' => 'exclamation-circle',
    142                 'text' => sprintf($this->language->get('text_token_revoked'), $this->squareup->authLink($previous_config->get('payment_squareup_client_id')))
    143             ));
    144 
    145             $data['access_token_expires_time'] = $this->language->get('text_na');
    146         }
    147 
    148         if ($previous_config->get('payment_squareup_client_id')) {
    149             $data['payment_squareup_auth_link'] = $this->squareup->authLink($previous_config->get('payment_squareup_client_id'));
    150         } else {
    151             $data['payment_squareup_auth_link'] = null;
    152         }
    153 
    154         $data['payment_squareup_redirect_uri'] = str_replace('&amp;', '&', $this->url->link('extension/payment/squareup/oauth_callback', '', true));
    155         $data['payment_squareup_refresh_link'] = $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true);
    156 
    157         if ($this->config->get('payment_squareup_enable_sandbox')) {
    158             $this->pushAlert(array(
    159                 'type' => 'warning',
    160                 'icon' => 'exclamation-circle',
    161                 'text' => $this->language->get('text_sandbox_enabled')
    162             ));
    163         }
    164 
    165         if (isset($this->error['warning'])) {
    166             $this->pushAlert(array(
    167                 'type' => 'danger',
    168                 'icon' => 'exclamation-circle',
    169                 'text' => $this->error['warning']
    170             ));
    171         }
    172 
    173         // Insert success message from the session
    174         if (isset($this->session->data['success'])) {
    175             $this->pushAlert(array(
    176                 'type' => 'success',
    177                 'icon' => 'exclamation-circle',
    178                 'text' => $this->session->data['success']
    179             ));
    180 
    181             unset($this->session->data['success']);
    182         }
    183 
    184         if ($this->request->server['HTTPS']) {
    185             // Push the SSL reminder alert
    186             $this->pushAlert(array(
    187                 'type' => 'info',
    188                 'icon' => 'lock',
    189                 'text' => $this->language->get('text_notification_ssl')
    190             ));
    191         } else {
    192             // Push the SSL reminder alert
    193             $this->pushAlert(array(
    194                 'type' => 'danger',
    195                 'icon' => 'exclamation-circle',
    196                 'text' => $this->language->get('error_no_ssl')
    197             ));
    198         }
    199 
    200         $tabs = array(
    201             'tab-transaction',
    202             'tab-setting',
    203             'tab-recurring',
    204             'tab-cron'
    205         );
    206 
    207         if (isset($this->request->get['tab']) && in_array($this->request->get['tab'], $tabs)) {
    208             $data['tab'] = $this->request->get['tab'];
    209         } else if (isset($this->error['cron_email']) || isset($this->error['cron_acknowledge'])) {
    210             $data['tab'] = 'tab-cron';
    211         } else if ($this->error) {
    212             $data['tab'] = 'tab-setting';
    213         } else {
    214             $data['tab'] = $tabs[1];
    215         }
    216 
    217         $data['breadcrumbs'] = array();
    218 
    219         $data['breadcrumbs'][] = array(
    220             'text' => $this->language->get('text_home'),
    221             'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
    222         );
    223 
    224         $data['breadcrumbs'][] = array(
    225             'text' => $this->language->get('text_extension'),
    226             'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)
    227         );
    228 
    229         $data['breadcrumbs'][] = array(
    230             'text' => $this->language->get('heading_title'),
    231             'href' => $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)
    232         );
    233 
    234         $data['action'] = html_entity_decode($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    235         $data['action_save_auth'] = html_entity_decode($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'] . '&save_and_auth=1', true));
    236         $data['cancel'] = html_entity_decode($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
    237         $data['url_list_transactions'] = html_entity_decode($this->url->link('extension/payment/squareup/transactions', 'user_token=' . $this->session->data['user_token'] . '&page={PAGE}', true));
    238 
    239         $this->load->model('localisation/language');
    240         $data['languages'] = array();
    241         foreach ($this->model_localisation_language->getLanguages() as $language) {
    242             $data['languages'][] = array(
    243                 'language_id' => $language['language_id'],
    244                 'name' => $language['name'] . ($language['code'] == $this->config->get('config_language') ? $this->language->get('text_default') : ''),
    245                 'image' => 'language/' . $language['code'] . '/'. $language['code'] . '.png'
    246             );
    247         }
    248 
    249         $this->load->model('localisation/order_status');
    250         $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
    251 
    252         $this->load->model('localisation/geo_zone');
    253         $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
    254 
    255         $data['payment_squareup_cron_command'] = PHP_BINDIR . '/php -d session.save_path=' . session_save_path() . ' ' . DIR_SYSTEM . 'library/squareup/cron.php ' . parse_url($server, PHP_URL_HOST) . ' 443 > /dev/null 2> /dev/null';
    256         
    257         if (!$this->config->get('payment_squareup_cron_token')) {
    258             $data['payment_squareup_cron_token'] = md5(mt_rand());
    259         }
    260 
    261         $data['payment_squareup_cron_url'] = 'https://' . parse_url($server, PHP_URL_HOST) . dirname(parse_url($server, PHP_URL_PATH)) . '/index.php?route=extension/recurring/squareup/recurring&cron_token={CRON_TOKEN}';
    262 
    263         $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG;
    264 
    265         // API login
    266         $this->load->model('user/api');
    267 
    268         $api_info = $this->model_user_api->getApi($this->config->get('config_api_id'));
    269 
    270         if ($api_info && $this->user->hasPermission('modify', 'sale/order')) {
    271             $session = new Session($this->config->get('session_engine'), $this->registry);
    272             
    273             $session->start();
    274                     
    275             $this->model_user_api->deleteApiSessionBySessonId($session->getId());
    276             
    277             $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']);
    278             
    279             $session->data['api_id'] = $api_info['api_id'];
    280 
    281             $data['api_token'] = $session->getId();
    282         } else {
    283             $data['api_token'] = '';
    284         }
    285 
    286         $data['header'] = $this->load->controller('common/header');
    287         $data['column_left'] = $this->load->controller('common/column_left');
    288         $data['footer'] = $this->load->controller('common/footer');
    289 
    290         $data['alerts'] = $this->pullAlerts();
    291 
    292         $this->clearAlerts();
    293 
    294         $this->response->setOutput($this->load->view('extension/payment/squareup', $data));
    295     }
    296 
    297     public function transaction_info() {
    298         $this->load->language('extension/payment/squareup');
    299 
    300         $this->load->model('extension/payment/squareup');
    301 
    302         $this->load->library('squareup');
    303 
    304         if (isset($this->request->get['squareup_transaction_id'])) {
    305             $squareup_transaction_id = $this->request->get['squareup_transaction_id'];
    306         } else {
    307             $squareup_transaction_id = 0;
    308         }
    309 
    310         $transaction_info = $this->model_extension_payment_squareup->getTransaction($squareup_transaction_id);
    311 
    312         if (empty($transaction_info)) {
    313             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    314         }
    315 
    316         $this->document->setTitle(sprintf($this->language->get('heading_title_transaction'), $transaction_info['transaction_id']));
    317 
    318         $data['alerts'] = $this->pullAlerts();
    319 
    320         $this->clearAlerts();
    321 
    322         $data['text_edit'] = sprintf($this->language->get('heading_title_transaction'), $transaction_info['transaction_id']);
    323 
    324         $amount = $this->currency->format($transaction_info['transaction_amount'], $transaction_info['transaction_currency']);
    325 
    326         $data['confirm_capture'] = sprintf($this->language->get('text_confirm_capture'), $amount);
    327         $data['confirm_void'] = sprintf($this->language->get('text_confirm_void'), $amount);
    328         $data['confirm_refund'] = $this->language->get('text_confirm_refund');
    329         $data['insert_amount'] = sprintf($this->language->get('text_insert_amount'), $amount, $transaction_info['transaction_currency']);
    330         $data['text_loading'] = $this->language->get('text_loading_short');
    331         
    332         $data['billing_address_company'] = $transaction_info['billing_address_company'];
    333         $data['billing_address_street'] = $transaction_info['billing_address_street_1'] . ' ' . $transaction_info['billing_address_street_2'];
    334         $data['billing_address_city'] = $transaction_info['billing_address_city'];
    335         $data['billing_address_postcode'] = $transaction_info['billing_address_postcode'];
    336         $data['billing_address_province'] = $transaction_info['billing_address_province'];
    337         $data['billing_address_country'] = $transaction_info['billing_address_country'];
    338 
    339         $data['transaction_id'] = $transaction_info['transaction_id'];
    340         $data['merchant'] = $transaction_info['merchant_id'];
    341         $data['order_id'] = $transaction_info['order_id'];
    342         $data['type'] = $transaction_info['transaction_type'];
    343         $data['amount'] = $amount;
    344         $data['currency'] = $transaction_info['transaction_currency'];
    345         $data['browser'] = $transaction_info['device_browser'];
    346         $data['ip'] = $transaction_info['device_ip'];
    347         $data['date_created'] = date($this->language->get('datetime_format'), strtotime($transaction_info['created_at']));
    348         
    349         $data['cancel'] = $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'] . '&tab=tab-transaction', true);
    350 
    351         $data['url_order'] = $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $transaction_info['order_id'], true);
    352         $data['url_void'] = $this->url->link('extension/payment/squareup' . '/void', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true);
    353         $data['url_capture'] = $this->url->link('extension/payment/squareup' . '/capture', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true);
    354         $data['url_refund'] = $this->url->link('extension/payment/squareup' . '/refund', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true);
    355         $data['url_transaction'] = sprintf(
    356             Squareup::VIEW_TRANSACTION_URL,
    357             $transaction_info['transaction_id'],
    358             $transaction_info['location_id']
    359         );
    360 
    361         $data['is_authorized'] = in_array($transaction_info['transaction_type'], array('AUTHORIZED'));
    362         $data['is_captured'] = in_array($transaction_info['transaction_type'], array('CAPTURED'));
    363 
    364         $data['has_refunds'] = (bool)$transaction_info['is_refunded'];
    365 
    366         if ($data['has_refunds']) {
    367             $refunds = @json_decode($transaction_info['refunds'], true);
    368 
    369             $data['refunds'] = array();
    370 
    371             $data['text_refunds'] = sprintf($this->language->get('text_refunds'), count($refunds));
    372 
    373             foreach ($refunds as $refund) {
    374                 $amount = $this->currency->format(
    375                     $this->squareup->standardDenomination(
    376                         $refund['amount_money']['amount'], 
    377                         $refund['amount_money']['currency']
    378                     ), 
    379                     $refund['amount_money']['currency']
    380                 );
    381 
    382                 $fee = $this->currency->format(
    383                     $this->squareup->standardDenomination(
    384                         $refund['processing_fee_money']['amount'], 
    385                         $refund['processing_fee_money']['currency']
    386                     ), 
    387                     $refund['processing_fee_money']['currency']
    388                 );
    389 
    390                 $data['refunds'][] = array(
    391                     'date_created' => date($this->language->get('datetime_format'), strtotime($refund['created_at'])),
    392                     'reason' => $refund['reason'],
    393                     'status' => $refund['status'],
    394                     'amount' => $amount,
    395                     'fee' => $fee
    396                 );
    397             }
    398         }
    399 
    400         $data['breadcrumbs'] = array();
    401 
    402         $data['breadcrumbs'][] = array(
    403             'text' => $this->language->get('text_home'),
    404             'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
    405         );
    406 
    407         $data['breadcrumbs'][] = array(
    408             'text' => $this->language->get('text_extension'),
    409             'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)
    410         );
    411 
    412         $data['breadcrumbs'][] = array(
    413             'text' => $this->language->get('heading_title'),
    414             'href' => $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)
    415         );
    416 
    417         $data['breadcrumbs'][] = array(
    418             'text' => sprintf($this->language->get('heading_title_transaction'), $transaction_info['squareup_transaction_id']),
    419             'href' => $this->url->link('extension/payment/squareup/transaction_info', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $squareup_transaction_id, true)
    420         );
    421 
    422         $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG;
    423 
    424         // API login
    425         $this->load->model('user/api');
    426 
    427         $api_info = $this->model_user_api->getApi($this->config->get('config_api_id'));
    428 
    429         if ($api_info && $this->user->hasPermission('modify', 'sale/order')) {
    430             $session = new Session($this->config->get('session_engine'), $this->registry);
    431             
    432             $session->start();
    433                     
    434             $this->model_user_api->deleteApiSessionBySessonId($session->getId());
    435             
    436             $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']);
    437             
    438             $session->data['api_id'] = $api_info['api_id'];
    439 
    440             $data['api_token'] = $session->getId();
    441         } else {
    442             $data['api_token'] = '';
    443         }
    444 
    445         $data['header'] = $this->load->controller('common/header');
    446         $data['column_left'] = $this->load->controller('common/column_left');
    447         $data['footer'] = $this->load->controller('common/footer');
    448 
    449         $this->response->setOutput($this->load->view('extension/payment/squareup_transaction_info', $data));
    450     }
    451 
    452     public function transactions() {
    453         $this->load->language('extension/payment/squareup');
    454 
    455         $this->load->model('extension/payment/squareup');
    456 
    457         if (isset($this->request->get['page'])) {
    458             $page = (int)$this->request->get['page'];
    459         } else {
    460             $page = 1;
    461         }
    462 
    463         $result = array(
    464             'transactions' => array(),
    465             'pagination' => ''
    466         );
    467 
    468         $filter_data = array(
    469             'start' => ($page - 1) * (int)$this->config->get('config_limit_admin'),
    470             'limit' => $this->config->get('config_limit_admin')
    471         );
    472 
    473         if (isset($this->request->get['order_id'])) {
    474             $filter_data['order_id'] = $this->request->get['order_id'];
    475         }
    476 
    477         $transactions_total = $this->model_extension_payment_squareup->getTotalTransactions($filter_data);
    478         $transactions = $this->model_extension_payment_squareup->getTransactions($filter_data);
    479 
    480         $this->load->model('sale/order');
    481 
    482         foreach ($transactions as $transaction) {
    483             $amount = $this->currency->format($transaction['transaction_amount'], $transaction['transaction_currency']);
    484 
    485             $order_info = $this->model_sale_order->getOrder($transaction['order_id']);
    486             
    487             $result['transactions'][] = array(
    488                 'squareup_transaction_id' => $transaction['squareup_transaction_id'],
    489                 'transaction_id' => $transaction['transaction_id'],
    490                 'url_order' => $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $transaction['order_id'], true),
    491                 'url_void' => $this->url->link('extension/payment/squareup/void', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true),
    492                 'url_capture' => $this->url->link('extension/payment/squareup/capture', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true),
    493                 'url_refund' => $this->url->link('extension/payment/squareup/refund', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true),
    494                 'confirm_capture' => sprintf($this->language->get('text_confirm_capture'), $amount),
    495                 'confirm_void' => sprintf($this->language->get('text_confirm_void'), $amount),
    496                 'confirm_refund' => $this->language->get('text_confirm_refund'),
    497                 'insert_amount' => sprintf($this->language->get('text_insert_amount'), $amount, $transaction['transaction_currency']),
    498                 'order_id' => $transaction['order_id'],
    499                 'type' => $transaction['transaction_type'],
    500                 'num_refunds' => count(@json_decode($transaction['refunds'], true)),
    501                 'amount' => $amount,
    502                 'customer' => $order_info['firstname'] . ' ' . $order_info['lastname'],
    503                 'ip' => $transaction['device_ip'],
    504                 'date_created' => date($this->language->get('datetime_format'), strtotime($transaction['created_at'])),
    505                 'url_info' => $this->url->link('extension/payment/squareup/transaction_info', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true)
    506             );
    507         }
    508 
    509         $pagination = new Pagination();
    510         $pagination->total = $transactions_total;
    511         $pagination->page = $page;
    512         $pagination->limit = $this->config->get('config_limit_admin');
    513         $pagination->url = '{page}';
    514 
    515         $result['pagination'] = $pagination->render();
    516 
    517         $this->response->addHeader('Content-Type: application/json');
    518         $this->response->setOutput(json_encode($result));
    519     }
    520 
    521     public function refresh_token() {
    522         $this->load->language('extension/payment/squareup');
    523 
    524         if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) {
    525             $this->pushAlert(array(
    526                 'type' => 'danger',
    527                 'icon' => 'exclamation-circle',
    528                 'text' => $this->language->get('error_permission')
    529             ));
    530 
    531             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    532         }
    533 
    534         $this->load->model('setting/setting');
    535 
    536         $this->load->library('squareup');
    537 
    538         try {
    539             $response = $this->squareup->refreshToken();
    540 
    541             if (!isset($response['access_token']) || !isset($response['token_type']) || !isset($response['expires_at']) || !isset($response['merchant_id']) ||
    542                 $response['merchant_id'] != $this->config->get('payment_squareup_merchant_id')) {
    543                 $this->pushAlert(array(
    544                     'type' => 'danger',
    545                     'icon' => 'exclamation-circle',
    546                     'text' => $this->language->get('error_refresh_access_token') 
    547                 ));
    548             } else {
    549                 $settings = $this->model_setting_setting->getSetting('payment_squareup');
    550 
    551                 $settings['payment_squareup_access_token'] = $response['access_token']; 
    552                 $settings['payment_squareup_access_token_expires'] = $response['expires_at'];
    553 
    554                 $this->model_setting_setting->editSetting('payment_squareup', $settings); 
    555 
    556                 $this->pushAlert(array(
    557                     'type' => 'success',
    558                     'icon' => 'exclamation-circle',
    559                     'text' => $this->language->get('text_refresh_access_token_success')
    560                 ));
    561             }
    562         } catch (\Squareup\Exception $e) {
    563             $this->pushAlert(array(
    564                 'type' => 'danger',
    565                 'icon' => 'exclamation-circle',
    566                 'text' => sprintf($this->language->get('error_token'), $e->getMessage())
    567             ));
    568         }
    569 
    570         $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    571     }
    572 
    573     public function oauth_callback() {
    574         $this->load->language('extension/payment/squareup');
    575 
    576         if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) {
    577             $this->pushAlert(array(
    578                 'type' => 'danger',
    579                 'icon' => 'exclamation-circle',
    580                 'text' => $this->language->get('error_permission')
    581             ));
    582 
    583             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    584         }
    585 
    586         $this->load->model('setting/setting');
    587 
    588         $this->load->library('squareup');
    589 
    590         if (isset($this->request->get['error']) || isset($this->request->get['error_description'])) {
    591             // auth error
    592             if ($this->request->get['error'] == 'access_denied' && $this->request->get['error_description'] == 'user_denied') {
    593                 // user rejected giving auth permissions to his store
    594                 $this->pushAlert(array(
    595                     'type' => 'warning',
    596                     'icon' => 'exclamation-circle',
    597                     'text' => $this->language->get('error_user_rejected_connect_attempt')
    598                 ));
    599             }
    600 
    601             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    602         }
    603 
    604         // verify parameters for the redirect from Square (against random url crawling)
    605         if (!isset($this->request->get['state']) || !isset($this->request->get['code']) || !isset($this->request->get['response_type'])) {
    606             // missing or wrong info
    607             $this->pushAlert(array(
    608                 'type' => 'danger',
    609                 'icon' => 'exclamation-circle',
    610                 'text' => $this->language->get('error_possible_xss')
    611             ));
    612 
    613             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    614         }
    615 
    616         // verify the state (against cross site requests)
    617         if (!isset($this->session->data['payment_squareup_oauth_state']) || $this->session->data['payment_squareup_oauth_state'] != $this->request->get['state']) {
    618             // state mismatch
    619             $this->pushAlert(array(
    620                 'type' => 'danger',
    621                 'icon' => 'exclamation-circle',
    622                 'text' => $this->language->get('error_possible_xss')
    623             ));
    624 
    625             $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    626         }
    627 
    628         try {
    629             $token = $this->squareup->exchangeCodeForAccessToken($this->request->get['code']);
    630             
    631             $previous_setting = $this->model_setting_setting->getSetting('payment_squareup');
    632 
    633             $previous_setting['payment_squareup_locations'] = $this->squareup->fetchLocations($token['access_token'], $first_location_id);
    634 
    635             if (
    636                 !isset($previous_setting['payment_squareup_location_id']) || 
    637                 (isset($previous_setting['payment_squareup_location_id']) && !in_array(
    638                     $previous_setting['payment_squareup_location_id'], 
    639                     array_map(
    640                         function($location) {
    641                             return $location['id'];
    642                         },
    643                         $previous_setting['payment_squareup_locations']
    644                     )
    645                 ))
    646             ) {
    647                 $previous_setting['payment_squareup_location_id'] = $first_location_id;
    648             }
    649 
    650             if (!$this->config->get('payment_squareup_sandbox_locations') && $this->config->get('payment_squareup_sandbox_token')) {
    651                 $previous_setting['payment_squareup_sandbox_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_sandbox_token'), $first_location_id);
    652                 $previous_setting['payment_squareup_sandbox_location_id'] = $first_location_id;
    653             }
    654 
    655             $previous_setting['payment_squareup_merchant_id'] = $token['merchant_id'];
    656             $previous_setting['payment_squareup_merchant_name'] = ''; // only available in v1 of the API, not populated for now
    657             $previous_setting['payment_squareup_access_token'] = $token['access_token'];
    658             $previous_setting['payment_squareup_access_token_expires'] = $token['expires_at'];
    659 
    660             $this->model_setting_setting->editSetting('payment_squareup', $previous_setting);
    661 
    662             unset($this->session->data['payment_squareup_oauth_state']);
    663             unset($this->session->data['payment_squareup_oauth_redirect']);
    664 
    665             $this->pushAlert(array(
    666                 'type' => 'success',
    667                 'icon' => 'exclamation-circle',
    668                 'text' => $this->language->get('text_refresh_access_token_success')
    669             ));
    670         } catch (\Squareup\Exception $e) {
    671             $this->pushAlert(array(
    672                 'type' => 'danger',
    673                 'icon' => 'exclamation-circle',
    674                 'text' => sprintf($this->language->get('error_token'), $e->getMessage())
    675             ));
    676         }
    677 
    678         $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true));
    679     }
    680 
    681     public function capture() {
    682         $this->transactionAction(function($transaction_info, &$json) {
    683             $updated_transaction = $this->squareup->captureTransaction($transaction_info['location_id'], $transaction_info['transaction_id']);
    684 
    685             $status = $updated_transaction['tenders'][0]['card_details']['status'];
    686 
    687             $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status);
    688 
    689             $json['order_history_data'] = array(
    690                 'notify' => 1,
    691                 'order_id' => $transaction_info['order_id'],
    692                 'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id'], $status),
    693                 'comment' => $this->language->get('squareup_status_comment_' . strtolower($status)),
    694             );
    695 
    696             $json['success'] = $this->language->get('text_success_capture');
    697         });
    698     }
    699 
    700     public function void() {
    701         $this->transactionAction(function($transaction_info, &$json) {
    702             $updated_transaction = $this->squareup->voidTransaction($transaction_info['location_id'], $transaction_info['transaction_id']);
    703 
    704             $status = $updated_transaction['tenders'][0]['card_details']['status'];
    705 
    706             $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status);
    707 
    708             $json['order_history_data'] = array(
    709                 'notify' => 1,
    710                 'order_id' => $transaction_info['order_id'],
    711                 'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id'], $status),
    712                 'comment' => $this->language->get('squareup_status_comment_' . strtolower($status)),
    713             );
    714 
    715             $json['success'] = $this->language->get('text_success_void');
    716         });
    717     }
    718 
    719     public function refund() {
    720         $this->transactionAction(function($transaction_info, &$json) {
    721             if (!empty($this->request->post['reason'])) {
    722                 $reason = $this->request->post['reason'];
    723             } else {
    724                 $reason = $this->language->get('text_no_reason_provided');
    725             }
    726 
    727             if (!empty($this->request->post['amount'])) {
    728                 $amount = preg_replace('~[^0-9\.\,]~', '', $this->request->post['amount']);
    729 
    730                 if (strpos($amount, ',') !== FALSE && strpos($amount, '.') !== FALSE) {
    731                     $amount = (float)str_replace(',', '', $amount);
    732                 } else if (strpos($amount, ',') !== FALSE && strpos($amount, '.') === FALSE) {
    733                     $amount = (float)str_replace(',', '.', $amount);
    734                 } else {
    735                     $amount = (float)$amount;
    736                 }
    737             } else {
    738                 $amount = 0;
    739             }
    740 
    741             $currency = $transaction_info['transaction_currency'];
    742             $tenders = @json_decode($transaction_info['tenders'], true);
    743 
    744             $updated_transaction = $this->squareup->refundTransaction($transaction_info['location_id'], $transaction_info['transaction_id'], $reason, $amount, $currency, $tenders[0]['id']);
    745 
    746             $status = $updated_transaction['tenders'][0]['card_details']['status'];
    747 
    748             $refunds = array();
    749 
    750             if (!empty($updated_transaction['refunds'])) {
    751                 $refunds = $updated_transaction['refunds'];
    752             }
    753 
    754             $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status, $refunds);
    755 
    756             $last_refund = array_pop($refunds);
    757 
    758             if ($last_refund) {
    759                 $refunded_amount = $this->currency->format(
    760                     $this->squareup->standardDenomination(
    761                         $last_refund['amount_money']['amount'], 
    762                         $last_refund['amount_money']['currency']
    763                     ), 
    764                     $last_refund['amount_money']['currency']
    765                 );
    766 
    767                 $comment = sprintf($this->language->get('text_refunded_amount'), $refunded_amount, $last_refund['status'], $last_refund['reason']);
    768 
    769                 $json['order_history_data'] = array(
    770                     'notify' => 1,
    771                     'order_id' => $transaction_info['order_id'],
    772                     'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id']),
    773                     'comment' => $comment,
    774                 );
    775 
    776                 $json['success'] = $this->language->get('text_success_refund');
    777             } else {
    778                 $json['error'] = $this->language->get('error_no_refund');
    779             }
    780         });
    781     }
    782 
    783     public function order() {
    784         $this->load->language('extension/payment/squareup');
    785 
    786         $data['url_list_transactions'] = html_entity_decode($this->url->link('extension/payment/squareup/transactions', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $this->request->get['order_id'] . '&page={PAGE}', true));
    787         $data['user_token'] = $this->session->data['user_token'];
    788         $data['order_id'] = $this->request->get['order_id'];
    789 
    790         $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG;
    791 
    792         // API login
    793         $this->load->model('user/api');
    794 
    795         $api_info = $this->model_user_api->getApi($this->config->get('config_api_id'));
    796 
    797         if ($api_info && $this->user->hasPermission('modify', 'sale/order')) {
    798             $session = new Session($this->config->get('session_engine'), $this->registry);
    799             
    800             $session->start();
    801                     
    802             $this->model_user_api->deleteApiSessionBySessonId($session->getId());
    803             
    804             $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']);
    805             
    806             $session->data['api_id'] = $api_info['api_id'];
    807 
    808             $data['api_token'] = $session->getId();
    809         } else {
    810             $data['api_token'] = '';
    811         }
    812 
    813         return $this->load->view('extension/payment/squareup_order', $data);
    814     }
    815 
    816     public function install() {
    817         $this->load->model('extension/payment/squareup');
    818         
    819         $this->model_extension_payment_squareup->createTables();
    820     }
    821 
    822     public function uninstall() {
    823         $this->load->model('extension/payment/squareup');
    824 
    825         $this->model_extension_payment_squareup->dropTables();
    826     }
    827 
    828     public function recurringButtons() {
    829         if (!$this->user->hasPermission('modify', 'sale/recurring')) {
    830             return;
    831         }
    832 
    833         $this->load->model('extension/payment/squareup');
    834 
    835         $this->load->language('extension/payment/squareup');
    836 
    837         if (isset($this->request->get['order_recurring_id'])) {
    838             $order_recurring_id = $this->request->get['order_recurring_id'];
    839         } else {
    840             $order_recurring_id = 0;
    841         }
    842 
    843         $recurring_info = $this->model_sale_recurring->getRecurring($order_recurring_id);
    844 
    845         $data['button_text'] = $this->language->get('button_cancel_recurring');
    846 
    847         if ($recurring_info['status'] == ModelExtensionPaymentSquareup::RECURRING_ACTIVE) {
    848             $data['order_recurring_id'] = $order_recurring_id;
    849         } else {
    850             $data['order_recurring_id'] = '';
    851         }
    852 
    853         $this->load->model('sale/order');
    854 
    855         $order_info = $this->model_sale_order->getOrder($recurring_info['order_id']);
    856 
    857         $data['order_id'] = $recurring_info['order_id'];
    858         $data['store_id'] = $order_info['store_id'];
    859         $data['order_status_id'] = $order_info['order_status_id'];
    860         $data['comment'] = $this->language->get('text_order_history_cancel');
    861         $data['notify'] = 1;
    862 
    863         $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG;
    864 
    865         // API login
    866         $this->load->model('user/api');
    867 
    868         $api_info = $this->model_user_api->getApi($this->config->get('config_api_id'));
    869 
    870         if ($api_info && $this->user->hasPermission('modify', 'sale/order')) {
    871             $session = new Session($this->config->get('session_engine'), $this->registry);
    872             
    873             $session->start();
    874                     
    875             $this->model_user_api->deleteApiSessionBySessonId($session->getId());
    876             
    877             $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']);
    878             
    879             $session->data['api_id'] = $api_info['api_id'];
    880 
    881             $data['api_token'] = $session->getId();
    882         } else {
    883             $data['api_token'] = '';
    884         }
    885 
    886         $data['cancel'] = html_entity_decode($this->url->link('extension/payment/squareup/recurringCancel', 'order_recurring_id=' . $order_recurring_id . '&user_token=' . $this->session->data['user_token'], true));
    887 
    888         return $this->load->view('extension/payment/squareup_recurring_buttons', $data);
    889     }
    890 
    891     public function recurringCancel() {
    892         $this->load->language('extension/payment/squareup');
    893 
    894         $json = array();
    895         
    896         if (!$this->user->hasPermission('modify', 'sale/recurring')) {
    897             $json['error'] = $this->language->get('error_permission_recurring');
    898         } else {
    899             $this->load->model('sale/recurring');
    900             
    901             if (isset($this->request->get['order_recurring_id'])) {
    902                 $order_recurring_id = $this->request->get['order_recurring_id'];
    903             } else {
    904                 $order_recurring_id = 0;
    905             }
    906             
    907             $recurring_info = $this->model_sale_recurring->getRecurring($order_recurring_id);
    908 
    909             if ($recurring_info) {
    910                 $this->load->model('extension/payment/squareup');
    911 
    912                 $this->model_extension_payment_squareup->editOrderRecurringStatus($order_recurring_id, ModelExtensionPaymentSquareup::RECURRING_CANCELLED);
    913 
    914                 $json['success'] = $this->language->get('text_canceled_success');
    915                 
    916             } else {
    917                 $json['error'] = $this->language->get('error_not_found');
    918             }
    919         }
    920 
    921         $this->response->addHeader('Content-Type: application/json');
    922         $this->response->setOutput(json_encode($json));
    923     }
    924 
    925     protected function validate() {
    926         if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) {
    927             $this->error['warning'] = $this->language->get('error_permission');
    928         }
    929 
    930         if (empty($this->request->post['payment_squareup_client_id']) || strlen($this->request->post['payment_squareup_client_id']) > 32) {
    931             $this->error['client_id'] = $this->language->get('error_client_id');
    932         }
    933 
    934         if (empty($this->request->post['payment_squareup_client_secret']) || strlen($this->request->post['payment_squareup_client_secret']) > 50) {
    935             $this->error['client_secret'] = $this->language->get('error_client_secret');
    936         }
    937 
    938         if (!empty($this->request->post['payment_squareup_enable_sandbox'])) {
    939             if (empty($this->request->post['payment_squareup_sandbox_client_id']) || strlen($this->request->post['payment_squareup_sandbox_client_id']) > 42) {
    940                 $this->error['sandbox_client_id'] = $this->language->get('error_sandbox_client_id');
    941             }
    942 
    943             if (empty($this->request->post['payment_squareup_sandbox_token']) || strlen($this->request->post['payment_squareup_sandbox_token']) > 42) {
    944                 $this->error['sandbox_token'] = $this->language->get('error_sandbox_token');
    945             }
    946 
    947             if ($this->config->get('payment_squareup_merchant_id') && !$this->config->get('payment_squareup_sandbox_locations')) {
    948                 $this->error['warning'] = $this->language->get('text_no_appropriate_locations_warning');
    949             }
    950 
    951             if ($this->config->get('payment_squareup_sandbox_locations') && isset($this->request->post['payment_squareup_sandbox_location_id']) && !in_array($this->request->post['payment_squareup_sandbox_location_id'], array_map(function($location) {
    952                 return $location['id'];
    953             }, $this->config->get('payment_squareup_sandbox_locations')))) {
    954                 $this->error['location'] = $this->language->get('error_no_location_selected');
    955             }
    956         } else {
    957             if ($this->config->get('payment_squareup_merchant_id') && !$this->config->get('payment_squareup_locations')) {
    958                 $this->error['warning'] = $this->language->get('text_no_appropriate_locations_warning');
    959             }
    960 
    961             if ($this->config->get('payment_squareup_locations') && isset($this->request->post['payment_squareup_location_id']) && !in_array($this->request->post['payment_squareup_location_id'], array_map(function($location) {
    962                 return $location['id'];
    963             }, $this->config->get('payment_squareup_locations')))) {
    964                 $this->error['location'] = $this->language->get('error_no_location_selected');
    965             }
    966         }
    967 
    968         if (!empty($this->request->post['payment_squareup_cron_email_status'])) {
    969             if (!filter_var($this->request->post['payment_squareup_cron_email'], FILTER_VALIDATE_EMAIL)) {
    970                 $this->error['cron_email'] = $this->language->get('error_invalid_email');
    971             }
    972         }
    973 
    974         if (!isset($this->request->get['save_and_auth']) && empty($this->request->post['payment_squareup_cron_acknowledge'])) {
    975             $this->error['cron_acknowledge'] = $this->language->get('error_cron_acknowledge');
    976         }
    977 
    978         if ($this->error && empty($this->error['warning'])) {
    979             $this->error['warning'] = $this->language->get('error_form');
    980         }
    981 
    982         return !$this->error;
    983     }
    984 
    985     protected function transactionAction($callback) {
    986         $this->load->language('extension/payment/squareup');
    987 
    988         $this->load->model('extension/payment/squareup');
    989 
    990         $this->load->library('squareup');
    991 
    992         $json = array();
    993 
    994         if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) {
    995             $json['error'] = $this->language->get('error_permission');
    996         }
    997 
    998         if (isset($this->request->get['squareup_transaction_id'])) {
    999             $squareup_transaction_id = $this->request->get['squareup_transaction_id'];
   1000         } else {
   1001             $squareup_transaction_id = 0;
   1002         }
   1003 
   1004         $transaction_info = $this->model_extension_payment_squareup->getTransaction($squareup_transaction_id);
   1005 
   1006         if (empty($transaction_info)) {
   1007             $json['error'] = $this->language->get('error_transaction_missing');
   1008         } else {
   1009             try {
   1010                 $callback($transaction_info, $json);
   1011             } catch (\Squareup\Exception $e) {
   1012                 $json['error'] = $e->getMessage();
   1013             }
   1014         }
   1015 
   1016         if (isset($this->request->get['preserve_alert'])) {
   1017             if (!empty($json['error'])) {
   1018                 $this->pushAlert(array(
   1019                     'type' => 'danger',
   1020                     'icon' => 'exclamation-circle',
   1021                     'text' => $json['error']
   1022                 ));
   1023             }
   1024 
   1025             if (!empty($json['success'])) {
   1026                 $this->pushAlert(array(
   1027                     'type' => 'success',
   1028                     'icon' => 'exclamation-circle',
   1029                     'text' => $json['success']
   1030                 ));
   1031             }
   1032         }
   1033 
   1034         $this->response->addHeader('Content-Type: application/json');
   1035         $this->response->setOutput(json_encode($json));
   1036     }
   1037 
   1038     protected function pushAlert($alert) {
   1039         $this->session->data['payment_squareup_alerts'][] = $alert;
   1040     }
   1041 
   1042     protected function pullAlerts() {
   1043         if (isset($this->session->data['payment_squareup_alerts'])) {
   1044             return $this->session->data['payment_squareup_alerts'];
   1045         } else {
   1046             return array();
   1047         }
   1048     }
   1049 
   1050     protected function clearAlerts() {
   1051         unset($this->session->data['payment_squareup_alerts']);
   1052     }
   1053 
   1054     protected function getSettingValue($key, $default = null, $checkbox = false) {
   1055         if ($checkbox) {
   1056             if ($this->request->server['REQUEST_METHOD'] == 'POST' && !isset($this->request->post[$key])) {
   1057                 return $default;
   1058             } else {
   1059                 return $this->config->get($key);
   1060             }
   1061         }
   1062 
   1063         if (isset($this->request->post[$key])) {
   1064             return $this->request->post[$key]; 
   1065         } else if ($this->config->has($key)) {
   1066             return $this->config->get($key);
   1067         } else {
   1068             return $default;
   1069         }
   1070     }
   1071 
   1072     protected function getValidationError($key) {
   1073         if (isset($this->error[$key])) {
   1074             return $this->error[$key];
   1075         } else {
   1076             return '';
   1077         }
   1078     }
   1079 }