<?php
$loader = $this->registry->get('load');
$loader->controller('payment/clearsale');
$loader->controller('payment/payment_info');

class ControllerPaymentCieloApiCredito extends ControllerPaymentPaymentInfo
{
    private $dadosTransacao;

    public function credit_card()
    {
        $this->app();

        $language = $this->language->load('payment/cielo_api');
        $this->data = array_merge($this->data, $language);

        $this->load->type('tipocieloapi');
        $this->load->type('tipocomum');

        if (isset($this->session->data['order_id'])) {
            $this->data['idorder'] = $this->session->data['order_id'];
        }

        if (isset($this->session->data['payment_method']['code_type']) && isset($this->session->data['payment_method']['code'])) {
            $code_type = $this->session->data['payment_method']['code_type'];
            $code = $this->session->data['payment_method']['code'];

            $this->data['paymentRoute'] = "$code/pay_$code_type";
            $this->data['paymentName'] = $code;
        }

        $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
        $this->data['credit_cards'] = ftr_geral::getPaymentMethods($this->config->get('cielo_api_credit_card'), $order_info['total']);

        $this->data['back'] = $this->url->link('checkout/checkout', '', 'SSL');
        $json['redirect'] = $this->url->link('checkout/success');
        $this->id = 'payment';

        $this->data['cielo_api_payment_address'] = in_array($this->config->get('cielo_api_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal));
        $this->data['ambiente_teste'] = $this->config->get('cielo_api_ambiente_teste');
        $this->data['captcha_tpl'] = $this->getChild('payment/captcha');

        if ($this->config->get('clearsale_status') && in_array($this->config->get('clearsale_tipo_integracao'), array(Type_ClearSaleIntegracao::Tp_Total, Type_ClearSaleIntegracao::Tp_TotalGarantido))
            && in_array($this->config->get('cielo_api_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal))) {

            $setting = [
                'display_cpf' => true,
                'payment_name' => 'clearsale',
                'load_customer_info' => true
            ];
          
            $this->data['payment_address'] = $this->getChild('payment/clearsale_payment_address', $setting);
        } else {
            $setting = [
                'payment_name' => 'cieloapi',
                'load_customer_info' => true
            ];
            $this->data['payment_address'] = $this->getChild('payment/cielo_api_credito_payment_address', $setting);
        }

        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/cieloapi/cielo_api_credito.twig')) {
            $this->template = $this->config->get('config_template') . '/template/payment/cieloapi/cielo_api_credito.twig';
        } else {
            $this->template = 'default/template/payment/cieloapi/cielo_api_credito.twig';
        }

        if ($this->config->get('cielo_api_tipo_finalizacao') == Type_CieloApiTipoFinalizacao::Tp_CieloApiFinalCheckout) {
            $this->data['tipo_checkout']  = true;
            $this->data['tipo_posterior'] = false;
        } else {
            $this->data['tipo_checkout']  = false;
            $this->data['tipo_posterior'] = true;
        }

        $this->data['cielo_api_parcela_qtdmax'] = $this->config->get('cielo_api_parcela_qtdmax');

        $this->session->data['cielo_retentativa'] = 0; //controla a quantidade de tentativas

        $this->response->setOutput($this->render('payment/cieloapi/cielo_api_credito'));
    }

    public function pagarPosteriormente()
    {
        $json = array();
        $language = $this->language->load('payment/cielo_api');
        $this->data = array_merge($this->data, $language);
        $this->load->type('tipocieloapi');
        $this->load->dmodel('checkout/order');
        $this->load->helper('ftr_geral');

        $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $this->config->get('cielo_api_order_status_posterior_id'), $this->data['text_coment_pagamentoposterior']);

        $json['redirect'] = $this->url->link('checkout/success');
        $this->session->data['cieloAPI_confirmacao'] = Type_CieloApiStatus::Tp_Aguardando;

        $this->response->setOutput(json_encode($json));
    }

    public function pay_credit_card()
    {
        $json = array();

        $this->load->language('payment/cielo_api');
        $this->load->type('tipocieloapi');
        $this->load->type('tipocomum');
        $json['error'] = $this->validate();
        if (!$json['error']) {
            ini_set("allow_url_fopen", 1);
            if ($this->config->get('cielo_api_tipo_finalizacao') == Type_CieloApiTipoFinalizacao::Tp_CieloApiFinalPosterior) {
                $this->session->data['order_id'] = $this->request->get['order_id'];
            }

            $this->load->dmodel('checkout/order');
            $this->load->dmodel('payment/payment_info');

            $cieloorderID = $this->dmodel_payment_payment_info->getPaymentInfo($this->session->data['order_id'], Type_PagamentoTabela::Tp_Cartao, true);
            if (!$cieloorderID) {//validação para não deixar duplicar o pagamento
                function cartaocreditoADS($string)
                {
                    $string = str_replace('+', '', $string);
                    $string = str_replace(' ', '', $string);
                    return $string;
                }

                function TidADS($string)
                {
                    $string = str_replace('<br/>', '', $string);
                    return $string;
                }

                $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);

                $validade = $this->request->post['expire'];
                $cartaocredito = cartaocreditoADS($this->request->post['creditcard_ccno']);

                $parcelas = $this->request->post['qtd_parcela'];
                $valor = $this->request->post['formaPagamento'];

                $cartao_recalculo = $this->parcelamento(Type_CreditCardModule::getNickFromConstValue(Type_CreditCardModule::Cielo),false);//calcula novamente as parcelas para evitar que venha valor modificado do javascript

                $valor = $cartao_recalculo[$parcelas]['valor_parcela'];

                $juros_parcela = 0;
                $desconto_parcela = 0;

                if (isset($cartao_recalculo[$parcelas]['valor_parcela'])) {
                  $total_parcelas = $cartao_recalculo[$parcelas]['valor_parcela'] * $parcelas;
                  if ($total_parcelas > $order_info['total']) {
                    $juros_parcela = number_format($total_parcelas - $order_info['total'], 2, '.', '');
                  }else if ($total_parcelas < $order_info['total']) {
                    $desconto_parcela = ($order_info['total']-$total_parcelas)*-1;
                  }
                }

                $vvalorPedido = number_format($valor * $parcelas, 2, '.', '');//Cielo requisita o valor em centavos
                $compratotal = number_format($vvalorPedido, 2, '', '');

                $this->dadosTransacao = array(
                    'id_pedido' => $this->session->data['order_id'],
                    'nome_cliente' => $order_info['payment_firstname'] . " " . $order_info['payment_lastname'],
                    'total_pedido' => $compratotal,
                    'cartao_csv' => $this->request->post['creditcard_cccvd'],
                    'cartao_bandeira' => $this->request->post['creditcard_cctype'],
                    'cartao_dataexp' => $validade,
                    'cartao_numero' => $cartaocredito,
                    'cartao_nomeimpresso' => $this->request->post['creditcard_name'],
                    'cartao_parcelas' => $parcelas
                );

                if (in_array($this->config->get('cielo_api_anti_fraude'),[ Type_AntiFraudeCheckout::Tp_CleaSaleTotal])) {
                    $this->setInfosAntifraude($order_info);
                } else {
                    $this->dadosTransacao['custommer'] = array('nome_cliente' => $order_info['payment_firstname'] . " " . $order_info['payment_lastname']);
                }

                if (($cartaocredito <> '')) {
                    $retornoTransacao = $this->cieloapi->cieloPagamentoCartaoCredito($this->dadosTransacao);
                    $this->log->write('json', json_encode($retornoTransacao));
                    if (!isset($retornoTransacao['error']) && !is_null($retornoTransacao['tid'])) {
                        $mensagemTraduzida = $retornoTransacao['msgRetorno'];// Type_CieloApiRetorno::getNickFromConstValue($retornoTransacao['codRetorno']);
                        $this->log->write('msg', $mensagemTraduzida);
                        if (($retornoTransacao['status'] == Type_CieloApiStatus::Tp_AptoAFinalizar) || ($retornoTransacao['status'] == Type_CieloApiStatus::Tp_Finalizado)) {
                            $autoricao = Type_StatusAutorizacao::Tp_Autorizada;
                        } else {
                            $autoricao = Type_StatusAutorizacao::Tp_Negada;

                        }

                        $this->session->data['cieloAPI_TID'] = $retornoTransacao['tid'];
                        $this->session->data['cieloAPI_Retorno'] = Type_CieloApiStatus::getNickFromConstValue($retornoTransacao['status']);
                        $json['SUCCESS']['TID'] = $retornoTransacao['tid'];
                        $json['SUCCESS']['MENSAGEM'] = Type_CieloApiStatus::getNickFromConstValue($retornoTransacao['status']);

                        switch ($retornoTransacao['status']) {
                            case Type_CieloApiStatus::Tp_AptoAFinalizar:
                                $status_pagamento = $this->config->get('cielo_api_order_status_id');
                                break;
                            case Type_CieloApiStatus::Tp_Finalizado:
                                $status_pagamento = $this->config->get('cielo_api_order_pg_id');
                                break;
                            case Type_CieloApiStatus::Tp_Negado:
                                $status_pagamento = $this->config->get('cielo_api_order_ne_id');
                                break;
                            case Type_CieloApiStatus::Tp_Cancelado:
                            case Type_CieloApiStatus::Tp_CanceladoAposHorario:
                            case Type_CieloApiStatus::Tp_CanceladoFalha:
                                $status_pagamento = $this->config->get('cielo_api_order_status_cancelado_id');
                                break;
                            case Type_CieloApiStatus::Tp_Aguardando:
                            case Type_CieloApiStatus::Tp_AguardandoStatusIF:
                                $status_pagamento = $this->config->get('cielo_api_order_pe_id');
                                break;
                        }

                        if ($autoricao <> Type_StatusAutorizacao::Tp_Retentativa) {
                            $paymentinfo = array();
                            $this->session->data['cieloAPI_confirmacao'] = $retornoTransacao['status'];

                            $paymentinfo['tid'] = $retornoTransacao['tid'];
                            $paymentinfo['numero_autorizacao'] = $retornoTransacao['numAutorizacao'];
                            $paymentinfo['cod_autorizacao'] = $retornoTransacao['codAutorizacao'];
                            $paymentinfo['mensagem_retorno'] = $mensagemTraduzida;
                            $paymentinfo['cod_retorno'] = $retornoTransacao['codRetorno'];
                            $paymentinfo['order_id'] = $this->dadosTransacao['id_pedido'];
                            $paymentinfo['valor_pagamento'] = $vvalorPedido;
                            $paymentinfo['data_pagamento'] = $retornoTransacao['dataPagamento'];
                            $paymentinfo['status_pagamento'] = $status_pagamento;
                            $paymentinfo['status_retorno'] = $retornoTransacao['status'];
                            $paymentinfo['payment_id'] = $retornoTransacao['paymentId'];
                            $paymentinfo['tipo_cartao'] = Type_Card::Tp_Credito;
                            $paymentinfo['cartao_mascara'] = $retornoTransacao['cartaoMask'];
                            $paymentinfo['cartao_bandeira'] = Type_CieloApiBandeira::getConstFromNickValue(strtolower($this->dadosTransacao['cartao_bandeira']));
                            $paymentinfo['cartao_bandeira_text'] = ucfirst($this->dadosTransacao['cartao_bandeira']);
                            $paymentinfo['qtd_parcela'] = $parcelas;

                            $this->dmodel_payment_payment_info->addPaymentCreditCard($paymentinfo);

                            if ($this->config->get('cielo_api_tipo_finalizacao') == Type_CieloApiTipoFinalizacao::Tp_CieloApiFinalCheckout) {
                                $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $status_pagamento);

                                $json['redirect'] = $this->url->link('checkout/success');
                            } else {
                                $datahistory = array(
                                    'order_status_id' => $status_pagamento
                                );
                                $this->dmodel_checkout_order->addOrderHistory($this->session->data['order_id'], $datahistory);
                            }
                        }

                        if ($this->config->get('clearsale_status') && in_array($this->config->get('clearsale_tipo_integracao'), array(Type_ClearSaleIntegracao::Tp_Total, Type_ClearSaleIntegracao::Tp_TotalGarantido))
                            && in_array($this->config->get('cielo_api_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal))) {
                            /* A verificaçãod e fraude é feita apenas quando o pagamento é autorizado */
                            $controllerClearsale = new ControllerPaymentClearsale($this->registry);
                            $this->load->dmodel('account/order');
                            $this->request->post['qtd_parcela'] = $parcelas;
                            $this->request->post['shipping_address_id'] = $this->session->data['shipping_address_id'];
                            $dataInfos = array();
                            $dataInfos['order_info'] = $order_info;
                            $dataInfos['payment_info'] = $this->request->post;
                            $dataInfos['transaction_return'] = $retornoTransacao;
                            $dataInfos['products'] = $this->dmodel_account_order->getOrderProducts($this->session->data['order_id']);
                            $controllerClearsale->setNewOrder($dataInfos);
                        } elseif ($retornoTransacao['anti_fraude']) {
                            $retornoTransacao['anti_fraude']['order_id'] = $this->session->data['order_id'];
                            $retornoTransacao['anti_fraude']['factor_code'] = $this->getListTypesAntiFraude('Type_FactorCode', $retornoTransacao['anti_fraude']['factor_code']);
                            $retornoTransacao['anti_fraude']['internet_info_code'] = $this->getListTypesAntiFraude('Type_InternetInfoCode', $retornoTransacao['anti_fraude']['internet_info_code']);
                            $retornoTransacao['anti_fraude']['address_info_code'] = $this->getListTypesAntiFraude('Type_AddressInfoCode', $retornoTransacao['anti_fraude']['address_info_code']);
                            $retornoTransacao['anti_fraude']['hot_list_info_code'] = $this->getListTypesAntiFraude('Type_HotListInfoCode', $retornoTransacao['anti_fraude']['hot_list_info_code']);
                            $retornoTransacao['anti_fraude']['identity_info_code'] = $this->getListTypesAntiFraude('Type_IdentityInfoCode', $retornoTransacao['anti_fraude']['identity_info_code']);
                            $retornoTransacao['anti_fraude']['velocity_infocode'] = $this->getListTypesAntiFraude('Type_VelocityInfoCode', $retornoTransacao['anti_fraude']['velocity_infocode']);

                            $this->dmodel_payment_payment_info->addPaymentAntiFraude($retornoTransacao['anti_fraude']);
                        }

                        switch($cartao_recalculo[$parcelas]['tipo_calculo']){
                            case Type_CalculoParcelamento::Desconto :
                                $this->dmodel_checkout_order->InsertOrderTotal($this->session->data['order_id'], array(
                                    'module_code' => 'cielo_api_desconto',
                                    'module_title' => 'Desconto Cielo (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '%)',
                                    'value' => $desconto_parcela,
                                    'order' => '2'
                                ));
                                $this->dmodel_checkout_order->updateTotalOrder($this->session->data['order_id'], $vvalorPedido);
                                $this->dmodel_checkout_order->updateApportionment($this->session->data['order_id'],($desconto_parcela*-1),Type_Apportionment::Discount);
                            break;
                            case Type_CalculoParcelamento::Juros :
                                $this->dmodel_checkout_order->InsertOrderTotal($this->session->data['order_id'], array(
                                    'module_code' => 'cielo_api_acrescimo',
                                    'module_title' => 'Acréscimo Cielo (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '% de juros ao mês no parcelamento)',
                                    'value' => $juros_parcela,
                                    'order' => '2'
                                ));
                                $this->dmodel_checkout_order->updateTotalOrder($this->session->data['order_id'], $vvalorPedido);
                                $this->dmodel_checkout_order->updateApportionment($this->session->data['order_id'],$juros_parcela,Type_Apportionment::Increase);
                            break;
                        }
                    } else {
                        $json['error']['retorno_api'] = array(
                            "descricao" => $retornoTransacao['error'] ?? $retornoTransacao['msgRetorno'],
                            "mensagem"  => $this->language->get('text_erro_retorno')
                        );
                        $autoricao = Type_StatusAutorizacao::Tp_Retentativa;
                    }
                }
            } else {
                $json['redirect'] = $this->url->link('checkout/success');
                $autoricao = Type_StatusAutorizacao::Tp_Autorizada;
            }

            $json['autorizacao'] = $autoricao;
        }

        $this->response->setOutput(json_encode($json));
    }

    public function parcelamento($module = 'cielo_api',$html = true,$flag_params=array())
    {
        return parent::parcelamento($module,$html,$flag_params);
    }

    public function app()
    {
        $this->document->addScriptApp(array(
            'catalog/view/javascript/jquery.payment/jquery.payment.js',
            'catalog/view/theme/appmobile/js/payment.cielo-credito.js'
        ));
        $this->data['scriptsApp'] = json_encode($this->document->getScriptsApp());
    }

    public function getListTypesAntiFraude($type, $values)
    {
        /* Ajusta os tipos que retornam do anti fraude separados po "^"
        para um tipo enumerado separado por "," */
        $this->load->type('tipocieloapi');
        $valueList = explode("^", $values);
        foreach ($valueList as $tipo) {
            $retorno[] = $type::getConstFromNickValue($tipo);
        }
        return implode(',', $retorno);
    }

    public function setInfosAntifraude($order_info){
        $this->load->model('account/address');
        $this->load->dmodel('account/customer');
        $this->load->dmodel('localisation/zone');
        $this->load->dmodel('localisation/ibge');
        $this->load->dmodel('payment/payment_info');
        $this->load->dmodel('account/order');
        $this->load->helper('ftr_geral');
        $customer_info = array();
        $browser_info = array();

        $this->dadosTransacao['products'] = $this->dmodel_account_order->getOrderProducts($this->session->data['order_id']);

        //pega as informações do navegador a cada compra.
        $browser = new BrowserInfo();
        $browser_info = $browser->getDadosBrowser();

        //informações do cliente ---->
        $shipping_address = $this->model_account_address->getAddress($this->session->data['shipping_address_id']);
        $shipping_address_uf = $this->dmodel_localisation_zone->getZone($shipping_address['zone_id'])['code'];

        if ( isset($this->request->post['isHolder']) && $this->request->post['isHolder']) {
            $customer_info = array(
                'nome_cliente' => $order_info['payment_firstname'] . " " . $order_info['payment_lastname'],
                'tipo_documento' => trim($order_info['cnpj']) <> '' ? 'CNPJ' : 'CPF',
                'cpf_cnpj' => trim($order_info['cnpj']) <> '' ? $order_info['cnpj'] : $order_info['cpf'],
                'email' => $order_info['email'],
                'telephone' => preg_replace('/([^0-9])/i', '', $order_info['telephone'])
            );

            if (isset($this->request->post['isHolder']) && $this->request->post['isHolder'] == false) {
                if (isset($this->request->post['data_nascimento']) && substr_count($this->request->post['data_nascimento'], '0') <= 5) {
                    $customer_info['data_nascimento'] = ftr_geral::formatDate($this->request->post['data_nascimento'], 'en');
                } else {
                    $customer_info['data_nascimento'] = false;
                }
            } else {
                if(isset($order_info['data_nascimento']) && substr_count($order_info['data_nascimento'], '0') <= 5){
                    $customer_info['data_nascimento'] = ftr_geral::formatDate($order_info['data_nascimento'], 'en');
                } elseif (isset($this->request->post['customer_data_nascimento']) && substr_count($this->request->post['customer_data_nascimento'], '0') <= 5) {
                    $customer_info['data_nascimento'] = ftr_geral::formatDate($this->request->post['customer_data_nascimento'], 'en');
                } else {
                    $customer_info['data_nascimento'] = false;
                }
            }

            $customer_info['payment_address'] = array(
                'postcode' => str_replace('-', '', $shipping_address['postcode']),
                'rua' => $shipping_address['address_1'],
                'numero' => $shipping_address['numero'],
                'cidade' => $shipping_address['city'],
                'estado' => $shipping_address_uf,
                'bairro' => $shipping_address['address_2']
            );
        } else {
            $customer_info = array(
                'nome_cliente' => $this->request->post['creditcard_name'],
                'tipo_documento' => $this->request->post['pessoa'] == 'J' ? 'CNPJ' : 'CPF',
                'cpf_cnpj' => $this->request->post['pessoa'] == 'J' ? preg_replace('/([^0-9])/i', '', $this->request->post['cnpj']) : preg_replace('/([^0-9])/i', '', $this->request->post['cpf']),
                'email' => $this->request->post['email'],
                'telephone' => preg_replace('/([^0-9])/i', '', $this->request->post['numero_telefone'])
            );
            if (isset($this->request->post['data_nascimento']) && substr_count($this->request->post['data_nascimento'], '0') <= 5) {
                $customer_info['data_nascimento'] = ftr_geral::formatDate($this->request->post['data_nascimento'], 'en');
            } else {
                $customer_info['data_nascimento'] = false;
            }
            $customer_info['payment_address'] = array(
                'postcode' => str_replace('-', '', $this->request->post['postcode']),
                'rua' => $this->request->post['address_1'],
                'numero' => $this->request->post['numero'],
                'cidade' => $this->dmodel_localisation_ibge->getCidadePorCodigo($this->request->post['codigo_municipio']),
                'estado' => $this->dmodel_localisation_zone->getZone($this->request->post['zone_id'])['code'],
                'bairro' => $this->request->post['address_2']
            );
        }
        $customer_info['shipping_address'] = array(
            'postcode' => str_replace('-', '', $shipping_address['postcode']),
            'rua' => $shipping_address['address_1'],
            'numero' => $shipping_address['numero'],
            'cidade' => $shipping_address['city'],
            'estado' => $shipping_address_uf,
            'bairro' => $shipping_address['address_2']
        );

        $this->dadosTransacao['browser_info'] = array(
            'finger_print' => $this->session->data['order_id'],
            'cookies' => (count($_COOKIE) > 0) ? true : false,
            'hostname' => $this->request->server['HTTP_USER_AGENT'],
            'ip' => $this->request->server['REMOTE_ADDR'],
            'type' => $browser_info['navegador']
        );

        $order_totals = $this->dmodel_checkout_order->getOrderTotals($this->session->data['order_id']);

        foreach ($order_totals as $order_total) {
            if (in_array($order_total['code'], array('shipping'))) {
                $frete_total = $order_total['value'];
            } elseif (in_array($order_total['code'], array('total'))) {
                $total = $order_total['value'];
            }
        }

        $infos_cliente = $this->dmodel_account_customer->getMetrics($this->customer->getId());

        $customer_info['dias_primeiro_pedido'] = $infos_cliente['dias_primeiro_pedido'];
        $customer_info['dias_ultimo_pedido'] = $infos_cliente['dias_ultimo_pedido'];
        $customer_info['qtd_pedidos'] = $infos_cliente['qtd_pedidos'];
        $customer_info['media_compras'] = $infos_cliente['media_compras'];

        $this->dadosTransacao['cupom_desconto'] = isset($this->session->data['coupon']) ? $this->session->data['coupon'] : false;

        $dataAddCliente = new DateTime($this->customer->getDate_added());
        $dataAtual = new DateTime(date("Y-m-d"));
        $diferenca = $dataAddCliente->diff($dataAtual);
        $customer_info['dias_cadastrado'] = $diferenca->days;

        $this->dadosTransacao['frete'] = $order_info['shipping_method']; ///$this->session->data['shipping_method']['title'];
        $this->dadosTransacao['frete_total'] = $frete_total;
        $this->dadosTransacao['custommer'] = $customer_info;

    }

    public function validate()
    {
      $this->load->dmodel('checkout/order');

      $error = array();

      $data_atual = new DateTime($this->db->dataAtual(), new DateTimeZone('America/Sao_Paulo'));
      $data_atual = $data_atual->format("Y-m-d");

      if (!isset($this->request->post['creditcard_cctype'])) {
        $error['creditcard_cctype'] = $this->language->get('error_bandeira');
      }

      if (!isset($this->request->post['creditcard_name']) || strlen($this->request->post['creditcard_name']) == '') {
        $error['creditcard_name'] = $this->language->get('error_nomecartao');
      }

      if (!isset($this->request->post['creditcard_ccno']) || strlen($this->request->post['creditcard_ccno']) == '') {
        $error['creditcard_ccno'] = $this->language->get('error_numerocartao');
      }

      if (!isset($this->request->post['creditcard_cccvd']) || strlen($this->request->post['creditcard_cccvd']) == '') {
        $error['creditcard_cccvd'] = $this->language->get('error_csv');
      }

      if (!isset($this->request->post['expire']) || (strlen($this->request->post['expire']) == '') || (strlen($this->request->post['expire']) != 7/*99/9999*/)) {
        $error['expire'] = $this->language->get('error_validade');
      }

      if (!$this->debug) {
        $this->language->load('payment/captcha');

        $google_captcha = $this->config->get('google_recaptcha_site_key') && $this->config->get('google_recaptcha_secret_key') && $this->config->get('wg24_google_recaptcha_status');
        $valid_captcha = $this->ftrgeralregistry->validateCaptcha($google_captcha ? $this->request->post['g-recaptcha-response'] : $this->request->post['captcha']);

        if (!$valid_captcha){
          $google_captcha ? $error['g-recaptcha'] = $this->language->get('t_e_google_captcha') : $error['captcha'] = $this->language->get('t_e_captcha');
        }
      }

        $lock = new limiterlock($this->registry);
        $customer_lock = $lock->checklimit( $this->customer);

        if($customer_lock){
            $error['t_e_limiter_ip'] = $lock->getInformation();
        }

        // Recaptcha Google, apos validação em varios locais matar sessao para que na proxima faça a validação.
        if(isset($this->session->data['gcapcha'])){
            unset($this->session->data['gcapcha']);
        }

      if (count($error)>0) {
        return $error;
      } else {
        return false;
      }

    }

}
