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

class ControllerPaymentRedeCredito extends ControllerPaymentPaymentInfo
{
    private $error = array();

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

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

        $this->load->type('tiporede');
        $this->load->type('tipoclearsale');

        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;
        }

        $this->data['back'] = $this->url->link('checkout/checkout', '', 'SSL');
        $this->data['continue'] = $this->url->link('checkout/success');
        $this->id = 'payment';
        $this->data['payment_address'] = false;
        $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('rede_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal))
        ) {
            $setting = [
                'payment_name' => 'clearsale'
            ];
            $this->data['payment_address'] = $this->getChild('payment/clearsale_payment_address', $setting);
        }

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

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

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

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

        $this->response->setOutput($this->render('payment/rede/rede_credito'));
    }

    public function tokenization($data)
    {
        $crypto = new Crypto();

        $url = Type_RedeTokenServiceEnviroment::getNickFromValue($this->config->get('rede_ambiente_teste')) . "/tokenization";

        $username = $crypto->descriptografarAES256($this->config->get('rede_pv'), $crypto::CAES256);
        $password = $crypto->descriptografarAES256($this->config->get('rede_token'), $crypto::CAES256);

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode("$username:$password")
        ]);

        $response = json_decode(curl_exec($ch), true);
        curl_close($ch);

        if (isset($response['returnCode']) && $response['returnCode'] == 00) {
            return $response['tokenizationId'];
        }

        return null;
    }

    public function getCryptogram($tokenId)
    {
        $crypto = new Crypto();

        $url = Type_RedeTokenServiceEnviroment::getNickFromValue($this->config->get('rede_ambiente_teste')) . "/cryptogram/" . $tokenId;

        $username = $crypto->descriptografarAES256($this->config->get('rede_pv'), $crypto::CAES256);
        $password = $crypto->descriptografarAES256($this->config->get('rede_token'), $crypto::CAES256);

        $data['tokenizationId'] = $tokenId;

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode("$username:$password")
        ]);

        $response = json_decode(curl_exec($ch), true);
        curl_close($ch);

        if (isset($response['cryptogramInfo']) && isset($response['cryptogramInfo']['tokenCryptogram'])) {
            $tokenCryptogram = $response['cryptogramInfo']['tokenCryptogram'];
            return $tokenCryptogram;
        }

        return null;
    }

    function MaskCard($tamanho, $inicio = '', $fim = '')
    {
        $numMask = $tamanho - (strlen($inicio) + strlen($fim));
        $string = $inicio;
        for ($cont = 0; $cont < $numMask; $cont++) {
            $string .= '*';
        }
        $string .= $fim;
        return $string;
    }

    function cartaocreditoADS($string)
    {
        $string = str_replace('+', '', $string);
        $string = str_replace(' ', '', $string);
        return $string;
    }

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


    public function pay_credit_card()
    {
        $json = array();
        $this->load->language('payment/rede');
        $this->load->type('tiporede');
        $json['error'] = parent::validate();

        if (!$json['error']) {

            ini_set("allow_url_fopen", 1);
            $this->load->dmodel('payment/payment_info');
            $this->load->dmodel('checkout/order');

            $redeOrderID = $this->dmodel_payment_payment_info->getPaymentInfo($this->session->data['order_id'], Type_PagamentoTabela::Tp_Cartao, true);

            if (!$redeOrderID) { //validação para não deixar duplicar o pagamento
                $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
                $validade = explode("/", $this->request->post['expire']);
                $cartaocredito = $this->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::Rede), 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, '.', '');

                $dadosTransacao = array(
                    'order_id' => $this->session->data['order_id'],
                    'cliente_ip' => $this->request->server['REMOTE_ADDR'],
                    'total_pedido' => $vvalorPedido,
                    'cartao_cod' => $this->request->post['creditcard_cccvd'],
                    'cartao_mes' => $validade[0],
                    'cartao_ano' => $validade[1],
                    'cartao_numero' => $cartaocredito,
                    'cartao_nome' => $this->request->post['creditcard_name'],
                    'cartao_parcelas' => $parcelas,
                    'cartao_bandeira' => $this->request->post['creditcard_cctype']
                );

                if (($cartaocredito <> '')) {
                    if ($this->config->get('rede_token_service') == Type_Status::Tp_Habilitado) {
                        $tokenizationRequest = array(
                            'email' => $order_info['email'],
                            'cardNumber' => $dadosTransacao['cartao_numero'],
                            'expirationMonth' => $dadosTransacao['cartao_mes'],
                            'expirationYear' => $dadosTransacao['cartao_ano'],
                            'cardholderName' => $dadosTransacao['cartao_nome'],
                            'securityCode' => $dadosTransacao['cartao_cod'],
                            'storageCard' => 2
                        );

                        $tokenizationId = $this->tokenization($tokenizationRequest);
                        $oneHour = 3600;

                        if (isset($tokenizationId)) {
                            $transaction = array(
                                'cartaocredito' => $cartaocredito,
                                'vvalorPedido' => $vvalorPedido,
                                'parcelas' => $parcelas,
                                'cartao_recalculo' => $cartao_recalculo,
                                'desconto_parcela' => $desconto_parcela,
                                'juros_parcela' => $juros_parcela,
                                'order_info' => $order_info,
                                'dadosTransacao' => $dadosTransacao,
                                'creditcard_cctype' => $this->request->post['creditcard_cctype'],
                                'payment_info' => $this->request->post,
                                'shipping_address_id' => $this->session->data['shipping_address_id']
                            );

                            $this->cache->set($tokenizationId, $transaction, $oneHour);
                            $statusOrder = $this->config->get('rede_order_pe_id');
                            $autoricao = Type_RedeAutorizacao::Tp_Processando;
                        } else {
                            $statusOrder = $this->config->get('rede_order_ne_id');
                            $autoricao = Type_RedeAutorizacao::Tp_RedeNegada;
                        }

                        $this->session->data['rede_confirmacao'] = $autoricao;
                        
                        $this->dmodel_checkout_order->confirm($order_info['order_id'], $statusOrder, '');

                        $json['redirect'] = $this->url->link('checkout/success');
                    } else {
                        $retornoTransacao = $this->rede->redePagamentoCartaoCredito($dadosTransacao);

                        if (!isset($retornoTransacao['error'])) {
                            $cartaoMascarado = $this->MaskCard(strlen($cartaocredito), $retornoTransacao['inicioNumCartao'], $retornoTransacao['ultimosNumCartao']);
                            $mensagemTraduzida = (Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) !== null) ? Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) : 'Cod.:' . $retornoTransacao['codRetorno'] . ' - Não foi possivel concluir a transação';
                            if ($retornoTransacao['codRetorno'] == Type_RedeRetorno::Tp_RedeRetorno00 || $retornoTransacao['codRetorno'] == '220' /*Aguardando autenticação*/) {
                                $autoricao = Type_RedeAutorizacao::Tp_RedeAutorizada;
                                if ($retornoTransacao['status_captura'] == Type_PagamentoStatusCaptura::Tp_Capturado) {
                                    $statusPagamento = Type_RedeStatusPgto::Tp_RedePago;
                                    $statusOrder = $this->config->get('rede_order_status_id');
                                } else {
                                    $statusPagamento = Type_RedeStatusPgto::Tp_RedeAutorizado;
                                    $statusOrder = $this->config->get('rede_order_au_id');
                                }
                            } else {
                                $autoricao = Type_RedeAutorizacao::Tp_RedeNegada;
                                $statusPagamento = Type_RedeStatusPgto::Tp_RedeNegado;
                                $statusOrder = $this->config->get('rede_order_ne_id');
                            }

                            $this->session->data['rede_TID'] = $retornoTransacao['tid'];
                            $this->session->data['rede_Retorno'] = $mensagemTraduzida;
                            $json['SUCCESS']['TID'] = $retornoTransacao['tid'];
                            $json['SUCCESS']['MENSAGEM'] = $mensagemTraduzida;

                            $paymentinfo = array();
                            $paymentinfo['order_id'] = $this->session->data['order_id'];
                            $paymentinfo['valor_pagamento'] = $vvalorPedido;
                            $paymentinfo['qtd_parcela'] = $parcelas;
                            $paymentinfo['cartao_mascara'] = $cartaoMascarado;
                            $paymentinfo['status_pagamento'] = $statusPagamento;
                            $paymentinfo['tipo_cartao'] = Type_Card::Tp_Credito;
                            $paymentinfo['cod_retorno'] = $retornoTransacao['codRetorno'];
                            $paymentinfo['mensagem_retorno'] = $mensagemTraduzida;
                            $paymentinfo['payment_id'] = $retornoTransacao['referencia'];
                            $paymentinfo['cod_autorizacao'] = $retornoTransacao['codAutorizacao'];
                            $paymentinfo['tid'] = $retornoTransacao['tid'];
                            $paymentinfo['nsu'] = $retornoTransacao['nsu'];
                            $paymentinfo['data_pagamento'] = !is_null($retornoTransacao['dataTransacao']) ? $retornoTransacao['dataTransacao']->format('Y-m-d H:i:s') : date('Y-m-d H:i:s');
                            $paymentinfo['status_captura'] = $retornoTransacao['status_captura'];
                            $paymentinfo['idioma'] = 'BR';
                            $paymentinfo['moeda'] = 'BRL';
                            $paymentinfo['cartao_bandeira'] = Type_RedeBandeira::getConstFromNickValue(strtolower($this->request->post['creditcard_cctype']));
                            $paymentinfo['cartao_bandeira_text'] = ucfirst($this->request->post['creditcard_cctype']);

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

                            $json['redirect'] = $this->url->link('checkout/success');

                            $this->session->data['rede_confirmacao'] = $autoricao;
                            $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $statusOrder);

                            switch ($cartao_recalculo[$parcelas]['tipo_calculo']) {
                                case Type_CalculoParcelamento::Desconto:
                                    $this->dmodel_checkout_order->InsertOrderTotal(
                                        $this->session->data['order_id'],
                                        array(
                                            'module_code' => 'rede_api_desconto',
                                            'module_title' => 'Desconto Rede (' . $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' => 'rede_api_acrescimo',
                                            'module_title' => 'Acréscimo Rede (' . $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;
                            }

                            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('rede_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);
                            }
                        } else {
                            $autoricao = Type_RedeAutorizacao::Tp_RedeRetentativa;
                            $json['error']['retorno_api'] = array(
                                "descricao" => $retornoTransacao['error'],
                                "mensagem" => $this->language->get('text_erro_retorno')
                            );
                        }
                    }
                } else {
                    $autoricao = Type_RedeAutorizacao::Tp_RedeNegada;
                    $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $this->config->get('rede_order_ne_id'), '');
                    $json['redirect'] = $this->url->link('checkout/success');
                }
            } else {
                $autoricao = Type_RedeAutorizacao::Tp_RedeAutorizada;
            }
            $json['autorizacao'] = $autoricao;
            http_response_code(200);
        } else {
            if (isset($this->error['error_bandeira'])) {
                $json['error']['bandeira'] = $this->error['error_bandeira'];
            }
            if (isset($this->error['error_nomecartao'])) {
                $json['error']['nomecartao'] = $this->error['error_nomecartao'];
            }
            if (isset($this->error['error_numerocartao'])) {
                $json['error']['numerocartao'] = $this->error['error_numerocartao'];
            }
            if (isset($this->error['error_csv'])) {
                $json['error']['csv'] = $this->error['error_csv'];
            }
            if (isset($this->error['error_validade'])) {
                $json['error']['validade'] = $this->error['error_validade'];
            }
            http_response_code(404);
        }

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


    public function validate()
    {
        $this->load->controller('payment/rede_credito_payment_address');
        $error = array();

        if (!isset($this->request->post['creditcard_cctype'])) {
            $error['error_bandeira'] = $this->language->get('error_bandeira');
        }
        if (!isset($this->request->post['creditcard_name']) || strlen($this->request->post['creditcard_name']) == 0) {
            $error['error_nomecartao'] = $this->language->get('error_nomecartao');
        }
        if (!isset($this->request->post['creditcard_ccno']) || strlen($this->request->post['creditcard_ccno']) == 0) {
            $error['error_numerocartao'] = $this->language->get('error_numerocartao');
        }
        if (!isset($this->request->post['creditcard_cccvd']) || strlen($this->request->post['creditcard_cccvd']) == 0) {
            $error['error_csv'] = $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['error_validade'] = $this->language->get('error_validade');
        }

        $controllerPaymentPaymentAddress = new ControllerPaymentPaymentAddress($this->registry);
        $validate = $controllerPaymentPaymentAddress->validate();

        $error = ($validate) ? array_merge($validate, $error) : $error;

        if ($error) {
            return $error;
        } else {
            return false;
        }
    }

    public function success()
    {
        if (isset($this->session->data['payment_session']['payment_method']['code']) && ($this->session->data['payment_session']['payment_method']['code'] == Type_YapayConfigs::Tp_NameModule)) {
            $this->load->dmodel('payment/payment_info');
            $this->load->language('payment/' . $this->session->data['payment_session']['payment_method']['code']);

            switch ($this->session->data['payment_session']['payment_method']['code_type']) {
                case Type_PaymentOption::Tp_CreditCard:
                    $query = $this->db->query('SELECT * FROM oc_rede_order WHERE order_id = ' . $this->session->data['payment_session']['order_id'])->row;
                    if (!$query) {
                        return false;
                    }
                    $this->data['tid'] = $query['tid'];
                    $this->data['text_message_credit_card'] = $this->language->get('text_message_credit_card');

                    $this->load->dmodel('checkout/order');
                    $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['payment_session']['order_id']);
                    $status_info = $this->dmodel_checkout_order->getOrderStatus($order_info['order_status_id']);
                    $this->data['status_descricao'] = $status_info['descricao'];
                    break;
            }

            $this->template = $this->config->get('config_template') . '/template/success/' . $this->session->data['payment_session']['payment_method']['code_type'] . '.twig';
            $this->response->setOutput($this->render());
        } else {
            return false;
        }
    }

    public function parcelamento($module = 'rede', $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.rede-credito.js'
            )
        );
        $this->data['scriptsApp'] = json_encode($this->document->getScriptsApp());
    }
    
    public function tokenizationCallback()
    {
        $body = file_get_contents("php://input");
        
        $token = json_decode($body, true);

        $token = $token['data'];
        
        if (isset($token) && count($token) > 0) {
            $this->load->dmodel('payment/payment_info');
            $this->load->dmodel('checkout/order');
            $this->load->dmodel('proccess/order_to_situation');

            $transaction = $this->cache->get($token['tokenizationId']);
            $this->cache->delete($token['tokenizationId']);

            $cartaocredito = $transaction['cartaocredito'];
            $vvalorPedido = $transaction['vvalorPedido'];
            $parcelas = $transaction['parcelas'];
            $cartao_recalculo = $transaction['cartao_recalculo'];
            $desconto_parcela = $transaction['desconto_parcela'];
            $juros_parcela = $transaction['juros_parcela'];
            $order_info = $transaction['order_info'];
            $dadosTransacao = $transaction['dadosTransacao'];
            $creditcard_cctype = $transaction['creditcard_cctype'];
            $payment_info = $transaction['payment_info'];
            $shipping_address_id = $transaction['shipping_address_id'];
            $dadosTransacao['tokenCryptogram'] = $this->getCryptogram($token['tokenizationId']);

            $retornoTransacao = $this->rede->redePagamentoCartaoCredito($dadosTransacao);

            if (!isset($retornoTransacao['error'])) {
                $cartaoMascarado = $this->MaskCard(strlen($cartaocredito), $retornoTransacao['inicioNumCartao'], $retornoTransacao['ultimosNumCartao']);
                $mensagemTraduzida = (Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) !== null) ? Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) : 'Cod.:' . $retornoTransacao['codRetorno'] . ' - Não foi possivel concluir a transação';
                if ($retornoTransacao['codRetorno'] == Type_RedeRetorno::Tp_RedeRetorno00 || $retornoTransacao['codRetorno'] == '220' /*Aguardando autenticação*/) {
                    if ($retornoTransacao['status_captura'] == Type_PagamentoStatusCaptura::Tp_Capturado) {
                        $statusPagamento = Type_RedeStatusPgto::Tp_RedePago;
                        $statusOrder = $this->config->get('rede_order_status_id');
                    } else {
                        $statusPagamento = Type_RedeStatusPgto::Tp_RedeAutorizado;
                        $statusOrder = $this->config->get('rede_order_au_id');
                    }
                } else {
                    $statusPagamento = Type_RedeStatusPgto::Tp_RedeNegado;
                    $statusOrder = $this->config->get('rede_order_ne_id');
                }

                $paymentinfo = array();
                $paymentinfo['order_id'] = $order_info['order_id'];
                $paymentinfo['valor_pagamento'] = $vvalorPedido;
                $paymentinfo['qtd_parcela'] = $parcelas;
                $paymentinfo['cartao_mascara'] = $cartaoMascarado;
                $paymentinfo['status_pagamento'] = $statusPagamento;
                $paymentinfo['tipo_cartao'] = Type_Card::Tp_Credito;
                $paymentinfo['cod_retorno'] = $retornoTransacao['codRetorno'];
                $paymentinfo['mensagem_retorno'] = $mensagemTraduzida;
                $paymentinfo['payment_id'] = $retornoTransacao['referencia'];
                $paymentinfo['cod_autorizacao'] = $retornoTransacao['codAutorizacao'];
                $paymentinfo['tid'] = $retornoTransacao['tid'];
                $paymentinfo['nsu'] = $retornoTransacao['nsu'];
                $paymentinfo['data_pagamento'] = !is_null($retornoTransacao['dataTransacao']) ? $retornoTransacao['dataTransacao']->format('Y-m-d H:i:s') : date('Y-m-d H:i:s');
                $paymentinfo['status_captura'] = $retornoTransacao['status_captura'];
                $paymentinfo['idioma'] = 'BR';
                $paymentinfo['moeda'] = 'BRL';
                $paymentinfo['cartao_bandeira'] = Type_RedeBandeira::getConstFromNickValue(strtolower($creditcard_cctype));
                $paymentinfo['cartao_bandeira_text'] = ucfirst($creditcard_cctype);

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

                $this->dmodel_checkout_order->update($order_info['order_id'], $statusOrder, '', true);

                $this->dmodel_checkout_order->confirm($order_info['order_id'], $statusOrder);
                
                switch ($cartao_recalculo[$parcelas]['tipo_calculo']) {
                    case Type_CalculoParcelamento::Desconto:
                        $this->dmodel_checkout_order->InsertOrderTotal(
                            $order_info['order_id'],
                            array(
                                'module_code' => 'rede_api_desconto',
                                'module_title' => 'Desconto Rede (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '%)',
                                'value' => $desconto_parcela,
                                'order' => '2'
                            )
                        );
                        $this->dmodel_checkout_order->updateTotalOrder($order_info['order_id'], $vvalorPedido);
                        $this->dmodel_checkout_order->updateApportionment($order_info['order_id'], ($desconto_parcela * -1), Type_Apportionment::Discount);
                        break;
                    case Type_CalculoParcelamento::Juros:
                        $this->dmodel_checkout_order->InsertOrderTotal(
                            $order_info['order_id'],
                            array(
                                'module_code' => 'rede_api_acrescimo',
                                'module_title' => 'Acréscimo Rede (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '% de juros ao mês no parcelamento)',
                                'value' => $juros_parcela,
                                'order' => '2'
                            )
                        );
                        $this->dmodel_checkout_order->updateTotalOrder($order_info['order_id'], $vvalorPedido);
                        $this->dmodel_checkout_order->updateApportionment($order_info['order_id'], $juros_parcela, Type_Apportionment::Increase);
                        break;
                }

                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('rede_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'] = $shipping_address_id;
                    $dataInfos = array();
                    $dataInfos['order_info'] = $order_info;
                    $dataInfos['payment_info'] = $payment_info;
                    $dataInfos['transaction_return'] = $retornoTransacao;
                    $dataInfos['products'] = $this->dmodel_account_order->getOrderProducts($order_info['order_id']);
                    $controllerClearsale->setNewOrder($dataInfos);
                }
            } else {
                $statusOrder = $this->config->get('rede_order_ne_id');
                $this->dmodel_checkout_order->update($order_info['order_id'], $statusOrder, '', true);
            }
        }

        ob_start();
        ob_end_flush();
        echo "Header Sent to eRede";
    }
}