AnonSec Shell
Server IP : 162.214.74.102  /  Your IP : 216.73.217.103
Web Server : Apache
System : Linux dedi-4363141.lrsys.com.br 3.10.0-1160.119.1.el7.tuxcare.els25.x86_64 #1 SMP Wed Oct 1 17:37:27 UTC 2025 x86_64
User : lrsys ( 1015)
PHP Version : 5.6.40
Disable Function : exec,passthru,shell_exec,system
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/lrsys/public_html/lrsys_apps/imobles/application/plugins/modulo_fiscal/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/lrsys/public_html/lrsys_apps/imobles/application/plugins/modulo_fiscal/controllers/emit.php
<?php

try {
    _auth();
    $ui->assign('_application_menu', 'modulo_fiscal');
    $ui->assign('_title', $_L['Fiscal Module'] . ' - ' . $config['CompanyName']);
    $ui->assign('_st', $_L['List NFC-e']);
    $action = $routes['2'];
    $user = User::_info();
    switch ($action) {
        case 'nfe':
            $tipo = 'NFe';
            break;
        case 'nfce':
            $tipo = 'NFCe';
            break;
        case 'nfse':
            $tipo = 'NFSe';
            break;
    }
    

    $id = $routes['3'];
    $dadosPedido = ORM::for_table('sys_invoices')->find_one($id);
    $dadosItemsPedidos = ORM::for_table('sys_invoiceitems')
                    ->table_alias('s')
                    ->select('s.id', 'item_id')
                    ->select('s.invoiceid', 'item_invoiceid')
                    ->select('s.userid', 'item_userid')
                    ->select('s.type', 'item_type')
                    ->select('s.relid', 'item_relid')
                    ->select('s.description', 'item_description')
                    ->select('s.qty', 'item_qty')
                    ->select('s.amount', 'item_amount')
                    ->select('s.discount', 'item_discount')
                    ->select('s.taxed', 'item_taxed')
                    ->select('s.taxamount', 'item_taxamount')
                    ->select('s.total', 'item_total')
                    ->select('s.duedate', 'item_duedate')
                    ->select('s.paymentmethod', 'item_paymentmethod')
                    ->select('s.notes', 'item_notes')
                    ->select('u.initials', 'metric')
                    ->select('i.*')
                    ->left_outer_join('sys_items', array('i.id', '=', 's.sys_item_id'), 'i')
                    ->left_outer_join('sys_items_unit', array('u.id', '=', 'i.unit_id'), 'u')
                    ->where('invoiceid', $id)->order_by_asc('id')->find_many();

    $listaConfigApp = ORM::for_table('app_fiscal_config')->find_many();
    foreach ($listaConfigApp as $da) {
        $dadosEmpresa[$da['key']] = $da['value'];
    }
    
    
    
    // Pego a URL de retorno
    // TODO: TRATAR O REDIRECIONAMENTO APÓS A EMISSÃO DA NOTA
    $url_retorno = U .'invoices/list/';
    if(isset($routes['4']))
    {
        switch ($routes['4'])
        {
            case 'invoices':
                $url_retorno = U .'invoices/list/';
                break;
            case 'scheduling':
                $url_retorno = U .'invoices/list/';
                break;
        }
    }
    

    // Pego o estado do prestador
    $stateCompany = ORM::for_table('state')->find_one($dadosEmpresa['company_state_id']);
    $cUF = $stateCompany->code_state; //'52'; //codigo numerico do estado
    
    $cityCompany = ORM::for_table('city')->find_one($dadosEmpresa['company_city_id']);
    
    
    // pego os dados do PEDIDI original
    $sysOrder = ORM::for_table('sys_orders')->find_one($dadosPedido->sys_orders_id);
    
    // Pego os dados da Natureza da Operação
    $naturaOperation = ORM::for_table('nature_operation')->find_one($sysOrder->nature_operation_id);
    $dadosEmpresa['company_crt'] = $naturaOperation->crt;
    
    // Pego os dados do tributo
    $arr_tributos = json_decode($naturaOperation->params);
    

    //dados cliente
    $dadosCliente = ORM::for_table('crm_accounts')->find_one($dadosPedido->userid);
    $dadosCidadeCliente = null;
    $dadosEstadoCliente = null;
    if ($dadosCliente->billing_address == 'Y') {

        $address = ORM::for_table('crm_accounts_address')->where('crm_account_id', $dadosPedido->userid)->where('type_address', 'billing_address')->find_many();
    } else {
        $address = ORM::for_table('crm_accounts_address')->where('crm_account_id', $dadosPedido->userid)->where('type_address', 'tax_address')->find_many();
    }
    if (count($address) > 0) {

        if($address[0]->state_id > 0)
        {
            $dadosEstadoCliente = ORM::for_table('state')->where('id', $address[0]->state_id)->find_many()->limit(1);
            $dadosEstadoCliente = $dadosEstadoCliente[0];
        }
        
        if($address[0]->city_id > 0)
        {
            $dadosCidadeCliente = ORM::for_table('city')->where('id', $address[0]->city_id)->find_many()->limit(1);
            $dadosCidadeCliente = $dadosCidadeCliente[0];
        }
    }
    
    $msg = '';
    if ($dadosCidadeCliente == null) {
        $msg.=$_L['No Client City data found'].'<br/>';
    }
    if ($dadosEstadoCliente == null) {
        $msg .= $_L['Not found Client State data'].'<br/>';
    }
    if ($dadosCliente == null) {
        $msg .= $_L['Client data not found'].'<br/>';
    }
    if ($dadosEmpresa == null) {
        $msg .= $_L['Company data not found'].'<br/>';
    }
    
    //TODO: verificar se realmente precisamos do método de pagamento
    if ($dadosPedido->paymentmethod==0) {
//        $msg .= str_replace('{id}',$dadosPedido->id,$_L['The payment method is not recorded on the invoice, <a href="'.U.'invoices/edit/{id}"> click here to report </a>'])."<br/>";
    }


        // TODO: verificar se precisa do bloco comentado abaixo
//    if ($dadosEstadoCliente != null) {
//        for ($i = 0; $i < count($dadosItemsPedidos); $i++) {
//
//            if ($tipo == 'NFe') {
//
//                //VERIFICA SE EXISTE REGRA PARA o ESTADO DO CLIENTE
//                $busca = ORM::for_table('sys_items_taxation')
//                        ->table_alias('t')
//                        ->select("t.*")
//                        ->select('c.code_cfop')
//                        ->where('t.id_sys_items', $dadosItemsPedidos[$i]['id'])
//                        ->where('t.id_uf_state_destiny', $dadosEstadoCliente['id'])
//                        ->where('t.operation', 'Sale')
//                        ->where('t.comparation_condition_state', '=')
//                        ->left_outer_join('cfop', array('c.id', '=', 't.id_cfop'), 'c')
//                        ->find_one();
//
//                if (!$busca) {
//                    //VERIFICA SE NÃO EXISTIR, PROCURA A REGRA GERAL PARA VENDA FORA DO ESTADO
//                    $busca = ORM::for_table('sys_items_taxation')
//                            ->table_alias('t')
//                            ->select("t.*")
//                            ->select('c.code_cfop')
//                            ->where('t.id_sys_items', $dadosItemsPedidos[$i]['id'])
//                            ->where('t.id_uf_state_destiny', $stateCompany->id)
//                            ->where('t.operation', 'Sale')
//                            ->where('t.comparation_condition_state', '!=')
//                            ->left_outer_join('cfop', array('c.id', '=', 't.id_cfop'), 'c')
//                            ->find_one();
//                }
//                //NFC-E Venda para mesmo estado, compra na loja com retirada na loja  
//            } else if ($tipo == 'NFCe') {
//                $busca = ORM::for_table('sys_items_taxation')
//                        ->table_alias('t')
//                        ->select("t.*")
//                        ->select('c.code_cfop')
//                        ->where('t.id_sys_items', $dadosItemsPedidos[$i]['id'])
//                        ->where('t.id_uf_state_destiny', $stateCompany->id)
//                        ->where('t.operation', 'Sale')
//                        ->where('t.comparation_condition_state', '=')
//                        ->left_outer_join('cfop', array('c.id', '=', 't.id_cfop'), 'c')
//                        ->find_one();
//            }
//
//
//            if ($busca) {
//                $dadosItemsPedidos[$i]['cfop'] = $busca['code_cfop'];
//                $dadosItemsPedidos[$i]['cst_pis_cofins'] = $busca['cst_pis_cofins'];
//            } else {
//                $msg.=      str_replace('{id}',$dadosItemsPedidos[$i]['id'], $_L['Item: {id} without taxation registered, <a href="'.U.'ps/taxation/{id}"> click here to report </a>'])."<br/>";
//        
//                
//             }
//        }
//    }
    
    
    if ($msg !== '') {
//        r2(U . 'invoices/view/' . $id, 'e', $_L['Invoice'].": ". $id . '<br/>' . $msg);
    }
    
    
    
    
    
    /*
     * VERIFICO SE É UM NFS-e
     */
    if($tipo == 'NFSe')
    {
        
        $nota = ORM::for_table('app_fiscal_note')->where('invoice_id', $id)->find_many();
        if(count($nota) > 0)
        {
            r2($url_retorno, 'n','Uma outra NFS para essa mesma fautra já foi emitida. <a href="'.U .'modulo_fiscal/nfse/list/">Clique aqui</a> para acessar as notas emitidas.');
        }
//        echo 'deu ruim';exit;
        
        // Dados de configuração da NFS
        $nNFS = $dadosEmpresa['note_number_nfse'];
        $serie = $dadosEmpresa['note_series_nfse'];
        
        
        // TAG Emitente
        $xCNPJ = preg_replace('/\D/', '', $dadosEmpresa['company_cnpj']); //$nfeTools->aConfig['cnpj'];
        $xNome = $dadosEmpresa['company_name']; // $nfeTools->aConfig['razaosocial'];
        $xFant = $dadosEmpresa['company_fantasy_name']; //$nfeTools->aConfig['nomefantasia'];
        
        $xIM = $dadosEmpresa['company_im']; //$nfeTools->aConfig['im'];
        $CNAE = str_pad(preg_replace('/\D/', '', $dadosEmpresa['company_cnae']), 7, "0", STR_PAD_LEFT); // $nfeTools->aConfig['cnae'];
        $CRT = $dadosEmpresa['company_crt']; //$nfeTools->aConfig['regime'];
        
        
        // Dados do Tomador
        $idEstrangeiro = '';
        $xNome = $dadosCliente->account; //'Chinnon Santos - Tecnologia e Assessoria em Softwares';
        $IE = empty($dadosCliente->ie) ? '' : $dadosCliente->ie; //opcional Inscrição Estadual do Destinatário;
        $ISUF = ''; //opcional Obrigatório, nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA.;
        $IM = $dadosCliente->im; //opcional Campo opcional, pode ser informado na NF-e conjugada, com itens de produtos sujeitos ao ICMS e itens de serviços sujeitos ao ISSQN//'4128095';
        $email = $dadosCliente->email_nfe; //'nfe@chinnonsantos.com';
        
        
        
        //Endereço do destinatário
        $xLgr = empty($address[0]->address) ? '' : $address[0]->address; //'Av. Rio de Janeiro';
        $nro = empty($address[0]->number) ? '' : $address[0]->number; //'s/n';
        $xCpl = empty($address[0]->complement) ? '' : $address[0]->complement; //'Qd. 38 Lt. 4,5 e 34';
        $xBairro = empty($address[0]->neighborhood) ? '' : $address[0]->neighborhood; //'Jardim Pinheiros I';
        $cMun = isset($dadosCidadeCliente->city_ibge)?str_pad(preg_replace('/\D/', '', $dadosCidadeCliente->city_ibge), 7, "0", STR_PAD_LEFT):''; //'5208707';
        $xMun = isset($dadosCidadeCliente->city_name)?$dadosCidadeCliente->city_name:''; //'Goiânia';
        $UF = isset($dadosEstadoCliente->uf_state)?$dadosEstadoCliente->uf_state:''; //'GO';
        $cPais = 1058; //$dadosCliente->cd_country; // '1058';
        $xPais = 'Brasil'; //$dadosCliente->country; //'Brasil';
        $fone = (isset($dadosCliente->phone) && !empty($dadosCliente->phone))?preg_replace('/\D/', '', $dadosCliente->phone):''; //'6292779404';
        $celular = (isset($dadosCliente->cell_phone) && !empty($dadosCliente->cell_phone))?preg_replace('/\D/', '', $dadosCliente->cell_phone):''; //'6292779404';
        
        // Pego um CEP da cidade caso o CEP não esteja preenchido
        $CEP_cliente = (isset($address[0]->zip) && !empty($address[0]->zip))?:''; //'74310010';
//        var_dump($dadosCidadeCliente);exit;
        if(isset($address[0]->zip) && !empty($address[0]->zip))
        {
            $CEP_cliente = preg_replace('/\D/', '', $address[0]->zip);
        }
        else
        {
            if($dadosCidadeCliente->id > 0)
            {
                $cep_aux = ORM::for_table('crm_accounts_address')->where('city_id', $dadosCidadeCliente->id)->where_raw('zip IS NOT NULL AND zip > 0')->find_one();
                if(isset($cep_aux->zip) && $cep_aux->zip > 0)
                {
                    $CEP_cliente = preg_replace('/\D/', '', $cep_aux->zip );
                }
                else
                {
                    r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>CEP do cliente não informado.</b>');
                }
            }
            else
            {
                r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>CEP do cliente não informado.</b>');
            }
            
        }
        
        
        
        
        
        // #######################################
        // TODO: PEGAR OS DADOS CHUMBADOS DO BANCO 
        // #######################################
        $UnidadeGestora = $dadosEmpresa['unidadegestora_nfse'];
        $ChaveDigital = $dadosEmpresa['note_chave_nfse'];
        $PrestatorCpfCnpj = '<Cnpj>'.$xCNPJ.'</Cnpj>';
        $InscricaoMunicipal = $xIM;
        
//        var_dump($dadosCliente);exit;
        // Pego os dados do Tomador (Cliente)
        if ($dadosCliente->kind_of_person != 'E') {
            if ($dadosCliente->kind_of_person == 'PJ') {
                $CNPJ = preg_replace('/\D/', '', $dadosCliente->cpf_cnpj); //'23401454000170';
                $nfse['DadosTomador']['CpfCnpj'] = $CNPJ?'<Cnpj>'.$CNPJ.'</Cnpj>':'';
            } else {
                $CPF = preg_replace('/\D/', '', $dadosCliente->cpf_cnpj);
                $nfse['DadosTomador']['CpfCnpj'] = $CPF?'<Cpf>'.$CPF.'</Cpf>':'';
            }
            
            if(!$nfse['DadosTomador']['CpfCnpj'])
            {
                r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>CPF/CNPJ do cliente não informado.</b>');
            }
        }
        else
        {
            //TODO: tratar para estrangeiros
            echo "NÃO HABILITADO PARA ESTRANGEIROS";exit;
        }
        
        
        $nfse['DadosTomador']['RazaoSocial'] = $dadosCliente->account;
        $nfse['DadosTomador']['Logradouro'] = $xLgr.', '.$nro;
        $nfse['DadosTomador']['Endereco'] = $xLgr;
        $nfse['DadosTomador']['Numero'] = $nro;
        $nfse['DadosTomador']['Complemento'] = $xCpl;
        $nfse['DadosTomador']['Bairro'] = $xBairro;
        $nfse['DadosTomador']['Municipio']['CodigoMunicipioIBGE'] = $cMun;
        $nfse['DadosTomador']['Municipio']['Descricao'] = $xMun;
        $nfse['DadosTomador']['Municipio']['Uf'] = $UF;
        $nfse['DadosTomador']['Municipio']['Cep'] = $CEP_cliente;
        $nfse['DadosTomador']['Contato']['Telefone'] = $fone;
        $nfse['DadosTomador']['Contato']['Email'] = $email?'<Email>'.trim($email).'</Email>':'';
        
        // Se o prestador do serviço é optante do simples 
        $CRT = $dadosEmpresa['company_crt']; // código do regime tributário
        $optante_simples = 1;
        if($CRT == 3)
        {
            $optante_simples = 1;
        }
        $nfse['OptanteSimplesNacional'] = 0;
        
        // TODO: VERIFICAR OPÇÃO PARA MEI
        // É optante do SIMEI? (Somente pode ser verdadeiro para contribuintes que sejam MEI – Microempreendedor individual).
        $nfse['OptanteMEISimei'] = 0;
        
        // Se imposto foi retido.
        $nfse['ISSQNRetido'] = 0;
        
        // Responsável pelo recolhimento do ISSQN junto à administração pública municipal. -1) Tomador do serviço. -2) Intermediário do serviço. -3) Prestador do serviço.
        $nfse['ResponsavelISSQN']['Codigo'] = -3;
        $nfse['ResponsavelISSQN']['Descricao'] = 'Prestador do serviço';
        
        // TODO: CRIAR CAMPO NA CONFIGURAÇÃO PARA REGISTRO DA ATIVIDADE ECONOMICA
        // Atividade econômica do serviço
        $nfse['CodigoAtividadeEconomica'] = '86.3.0-5.02';
        
        /*/* Código da exigibilidade do ISSQN
        -1) Exigível.
        -2) Não incidência.
        -3) Isento.
        -4) Exportação.
        -5) Imune.
        -6) Exigibilidade suspensa por decisão judicial.
        -7) Exigibilidade suspensa por processo
        administrativo.
        -8) Fixo.
        -9) Isento por lei específica
         * 
         */
        $nfse['ExigibilidadeISSQN']['Codigo']= -1;
        $nfse['ExigibilidadeISSQN']['Descricao']= 'Exigível';
        
        // Município de incidência do ISSQN.
        $cMun = $cityCompany->city_ibge; //'5200258';
        $xMun = $cityCompany->city_name; //'Águas Lindas de Goiás';
        $UF = str_pad($stateCompany->uf_state, 2, "0", STR_PAD_LEFT); //'GO';
        $nfse['MunicipioIncidencia']['CodigoMunicipioIBGE'] = $cMun;
        $nfse['MunicipioIncidencia']['Descricao'] = $xMun;
        $nfse['MunicipioIncidencia']['Uf'] = $UF;
        
        
        // ListaServico
        $DadosServico = '';
        $totalServico = 0.00;
        foreach ($dadosItemsPedidos as $prod) 
        {
//            var_dump($prod);exit;
            
            // TODO: Calcular o desconto por item
            $desconto = 0.00;
            
            // Pego os dados do serviço
            $DadosServico = '<DadosServico>
                                <Discriminacao>'.$prod->item_description.'</Discriminacao>
                                <CodigoCnae>86.3.0-5.02</CodigoCnae>
                                <ItemLei116>4.03</ItemLei116>
                                <Quantidade>'.$prod->item_qty.'</Quantidade>
                                <ValorServico>'.$prod->item_total.'</ValorServico>
                                <ValorDesconto>'.$desconto.'</ValorDesconto>
                              </DadosServico>';
            $totalServico += $prod->item_total;
        }
//        $nfse['ListaServico']['DadosServico']['Discriminacao'] = 'FFF';
//        $nfse['ListaServico']['DadosServico']['CodigoCnae'] = 'FFF';
//        $nfse['ListaServico']['DadosServico']['ItemLei116'] = 'FF';
//        $nfse['ListaServico']['DadosServico']['Quantidade'] = 'FF';
//        $nfse['ListaServico']['DadosServico']['ValorServico'] = 'FF';
//        $nfse['ListaServico']['DadosServico']['ValorDesconto'] = 'FF';
        
        
        // ValorServicos
        $nfse['ValorServicos'] = number_format($totalServico, 2, '.', '');
        
        // ValorDescontos
        $nfse['ValorDescontos'] = '0.00';
        
        // ValorPis
        $nfse['ValorPis'] = '0.00';
        
        // ValorCofins
        $nfse['ValorCofins'] = '0.00';
        
        // ValorInss
        $nfse['ValorInss'] = '0.00';
        
        // ValorIrrf
        $nfse['ValorIrrf'] = '0.00';
        
        // ValorCsll
        $nfse['ValorCsll'] = '0.00';
        
        // ValorOutrasRetencoes
        $nfse['ValorOutrasRetencoes'] = '0.00';
        
        // ValorBaseCalculoISSQN
        $nfse['ValorBaseCalculoISSQN'] = number_format($totalServico, 2, '.', '');
        
        // AliquotaISSQN
        $nfse['AliquotaISSQN'] = number_format($dadosEmpresa['aliq_issqn'],2,'.','');
        
        // ValorISSQNCalculado
        $nfse['ValorISSQNCalculado'] = number_format($totalServico*($nfse['AliquotaISSQN'])/100, 2, '.', '');
        
        // PercAbatimento
        $nfse['PercAbatimento'] = '0.00';
        
        // ValorISSQNRecolher
        $nfse['ValorISSQNRecolher'] = number_format($totalServico*($nfse['AliquotaISSQN'])/100, 2, '.', '');
        
        // ValorDeducaoConstCivil
        $nfse['ValorDeducaoConstCivil'] = '0.00';
        
        // ValorLiquido
        $nfse['ValorLiquido'] = number_format($totalServico, 2, '.', '');
        
        // Versão
        $nfse['Versao'] = '1.00';
        
        
        
        
        
        
        // TODO: DEFINIR O PADRÃO DA NFSE NAS CONFIGURAÇÕES DO MÓDULO FISCAL
        $padrao_nfse = 'ABRASF';
        
        switch ($padrao_nfse)
        {
            case 'AGILI':
                /// ######################################################################
                // PADRÃO NFSE AGILI        
                /// ######################################################################
                $xml = '<?xml version="1.0" encoding="utf-8" ?>
                            <GerarNfseEnvio xmlns="http://www.agili.com.br/nfse_v_1.00.xsd">
                                <UnidadeGestora>'.$UnidadeGestora.'</UnidadeGestora>
                                <DeclaracaoPrestacaoServico Id="rps000000000000001999">
                                    <IdentificacaoPrestador>
                                      <ChaveDigital>'.$ChaveDigital.'</ChaveDigital>
                                      <CpfCnpj>
                                        '.$PrestatorCpfCnpj.'
                                      </CpfCnpj>
                                      <InscricaoMunicipal>'.$InscricaoMunicipal.'</InscricaoMunicipal>
                                    </IdentificacaoPrestador>
                                    <DadosTomador>
                                      <IdentificacaoTomador>
                                        <CpfCnpj>
                                          '.$nfse['DadosTomador']['CpfCnpj'].'
                                        </CpfCnpj>
                                      </IdentificacaoTomador>
                                      <RazaoSocial>'.$nfse['DadosTomador']['RazaoSocial'].'</RazaoSocial>
                                      <LocalEndereco>1</LocalEndereco>
                                      <Endereco>
                                        <TipoLogradouro>INFORMADO</TipoLogradouro>
                                        <Logradouro>'.$nfse['DadosTomador']['Logradouro'].'</Logradouro>
                                        <Municipio>
                                          <CodigoMunicipioIBGE>'.$nfse['DadosTomador']['Municipio']['CodigoMunicipioIBGE'].'</CodigoMunicipioIBGE>
                                          <Descricao>'.$nfse['DadosTomador']['Municipio']['Descricao'].'</Descricao>
                                          <Uf>'.$nfse['DadosTomador']['Municipio']['Uf'].'</Uf>
                                        </Municipio>
                                        <Pais>
                                          <CodigoPaisBacen>1058</CodigoPaisBacen>
                                          <Descricao>BRASIL</Descricao>
                                        </Pais>
                                        <Cep>'.$nfse['DadosTomador']['Municipio']['Cep'].'</Cep>
                                      </Endereco>
                                      <Contato>
                                        <Telefone>'.$nfse['DadosTomador']['Contato']['Telefone'].'</Telefone>
                                      </Contato>
                                    </DadosTomador>
                                    <OptanteSimplesNacional>'.$nfse['OptanteSimplesNacional'].'</OptanteSimplesNacional>
                                    <OptanteMEISimei>'.$nfse['OptanteMEISimei'].'</OptanteMEISimei>
                                    <ISSQNRetido>'.$nfse['ISSQNRetido'].'</ISSQNRetido>
                                    <ResponsavelISSQN>
                                      <Codigo>'.$nfse['ResponsavelISSQN']['Codigo'].'</Codigo>
                                      <Descricao>'.$nfse['ResponsavelISSQN']['Descricao'].'</Descricao>
                                    </ResponsavelISSQN>
                                    <CodigoAtividadeEconomica>'.$nfse['CodigoAtividadeEconomica'].'</CodigoAtividadeEconomica>
                                    <ExigibilidadeISSQN>
                                      <Codigo>'.$nfse['ExigibilidadeISSQN']['Codigo'].'</Codigo>
                                      <Descricao>'.$nfse['ExigibilidadeISSQN']['Descricao'].'</Descricao>
                                    </ExigibilidadeISSQN>
                                    <MunicipioIncidencia>
                                      <CodigoMunicipioIBGE>'.$nfse['MunicipioIncidencia']['CodigoMunicipioIBGE'].'</CodigoMunicipioIBGE>
                                      <Descricao>'.$nfse['MunicipioIncidencia']['Descricao'].'</Descricao>
                                      <Uf>'.$nfse['MunicipioIncidencia']['Uf'].'  </Uf>
                                    </MunicipioIncidencia>
                                    <ValorServicos>'.$nfse['ValorServicos'].'</ValorServicos>
                                    <ValorDescontos>'.$nfse['ValorDescontos'].'</ValorDescontos>
                                    <ValorPis>'.$nfse['ValorPis'].'</ValorPis>
                                    <ValorCofins>'.$nfse['ValorCofins'].'</ValorCofins>
                                    <ValorInss>'.$nfse['ValorInss'].'</ValorInss>
                                    <ValorIrrf>'.$nfse['ValorIrrf'].'</ValorIrrf>
                                    <ValorCsll>'.$nfse['ValorCsll'].'</ValorCsll>
                                    <ValorOutrasRetencoes>'.$nfse['ValorOutrasRetencoes'].'</ValorOutrasRetencoes>
                                    <ValorBaseCalculoISSQN>'.$nfse['ValorBaseCalculoISSQN'].'</ValorBaseCalculoISSQN>
                                    <AliquotaISSQN>'.$nfse['AliquotaISSQN'].'</AliquotaISSQN>
                                    <ValorISSQNCalculado>'.$nfse['ValorISSQNCalculado'].'</ValorISSQNCalculado>
                                    <PercAbatimento>'.$nfse['PercAbatimento'].'</PercAbatimento>
                                    <ValorISSQNRecolher>'.$nfse['ValorISSQNRecolher'].'</ValorISSQNRecolher>
                                    <ValorDeducaoConstCivil>'.$nfse['ValorDeducaoConstCivil'].'</ValorDeducaoConstCivil>
                                    <ValorLiquido>'.$nfse['ValorLiquido'].'</ValorLiquido>
                                    <ListaServico>
                                      '.$DadosServico.'
                                    </ListaServico>
                                    <Versao>1.00</Versao>
                                  </DeclaracaoPrestacaoServico>
                            </GerarNfseEnvio>';
                
                //setting the curl parameters.
                $ch = curl_init('http://fazenda.ariquemes.ro.gov.br/API/GerarNfse');
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
                curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

                if (curl_errno($ch)) 
                {
                    // moving to display page to display curl errors
                      echo curl_errno($ch) ;
                      echo curl_error($ch);
                      return false;
                } 
                else 
                {
                    //getting response from server
                    $response = curl_exec($ch);
                    curl_close($ch);
        //            $response = file_get_contents(getcwd() . "//application//plugins//modulo_fiscal//AGILI/retornoNFS.xml");
                    $xml_retorno = new SimpleXMLElement($response);


                    if (!isset($xml_retorno->Nfse->Numero)) {
                        r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>' . $xml_retorno->ListaMensagemRetorno->MensagemRetorno->Mensagem.'<br><br><b>Envie o print dessa tela para o Webmaster.</b>');

                        echo "Dados Inválidos <br/> " . $xml_retorno->ListaMensagemRetorno->MensagemRetorno->Mensagem;
                        echo '<br><br><pre>';
                        echo '</pre><br><br><pre>';
                        echo "</pre><br>";
                    } elseif($xml_retorno->Nfse->SituacaoNfse->Codigo != -8) {
                        r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>' . $xml_retorno->ListaMensagemRetorno->MensagemRetorno->Mensagem.'<br><br><b>Envie o print dessa tela para o Webmaster.</b>');

                        echo "Ocorreu um erro na emissão do NFS.<br/>Código da situação da NFS: " . $xml_retorno->Nfse->SituacaoNfse->Codigo;
                        echo '<br><br><pre>';
                        echo '</pre><br><br><pre>';
                        echo "</pre><br>";
                    } else {

                        //  $aResposta = array();
                        $indSinc = '0'; //0=asíncrono, 1=síncrono
                        $pasta = date('Ym');

                        // TODO: verificar se precisa mesmo salvar o XML
                        $pathNFefile = getcwd() . "//application//plugins//modulo_fiscal//empresa//NFS-e//".$dadosEmpresa['note_environment']."//". "//enviadas//aprovadas//".$key."-nfse.xml";

                        // Salvo o XML
                        $xml_retorno->saveXML($pathNFefile);


                        //GRAVAR EMISSÃO DA NFE
                        $nota = ORM::for_table('app_fiscal_note')->create();
                        $nota->number_note = $xml_retorno->Nfse->Numero;
                        $nota->series = $dadosEmpresa['note_series_nfse'];
                        $nota->type = 'NFSe';
                        $nota->issuance_date = date('Y-m-d H:i:s',strtotime($xml_retorno->Nfse->DataEmissao));
                        $nota->amount = $dadosPedido->total;
                        $nota->account = $dadosCliente->account;
                        $nota->id_account = $dadosCliente->id;
                        $nota->key = $xml_retorno->Nfse->CodigoAutenticidade;
                        $nota->status = 'Emitido';
        //                $nota->receipt_number = $xml_retorno->Nfse->CodigoAutenticidade;
        //                $nota->protocol_number = $aRespostarecibo["aProt"][0]["nProt"];
                        $nota->pasta = $pasta;
                        $nota->code_status = $xml_retorno->Nfse->SituacaoNfse->Codigo;
                        $nota->invoice_id = $dadosPedido->id;
                        $nota->environment = $dadosEmpresa['note_environment'];
                        $nota->save();

                        //atualiza o numero da nota em ap_fiscal_config
                        $d = ORM::for_table('app_fiscal_config')->where('key', 'note_number_nfse')->find_one();
                        $d->value = intval($xml_retorno->Nfse->Numero) + 1;
                        $d->save();

                        _log('Nota Emitida' . " " . 'Nota Autorizada' . ' [ID: ' . $nota->id, $user['fullname'], $user['id']);
                        //  $abre = $danfe->printDANFE("{$id}-danfe.pdf", 'D'); //I Abre o PDF no Navegador D- Download
                        r2($url_retorno, 's', 'Nota Emitida' . " Fatura: $dadosPedido->id | Nº Nota : " . $nota->number_note . " | Cod. Status: " . $nota->code_status . " | Status: " . $nota->status . " ");
                    }
                }
                break;
            case 'ABRASF':
                /// ######################################################################
                //  PADRÃO NFSE ABRASF        
                /// ######################################################################
                // ListaServico
                $DadosServico = '';
                $totalServico = 0.00;
                $desc_servico = null;
        //        var_dump($dadosEmpresa);exit;
        //        var_dump($dadosItemsPedidos[0]);exit;
        //        var_dump($dadosPedido['date']);exit;
                foreach ($dadosItemsPedidos as $prod) 
                {
                    $desconto = $prod->item_discount?' | Desconto (un): '.$prod->item_discount:'';
                    $desc_servico .= mb_strtoupper($prod->item_description.' | Valor (un): R$ '.$prod->item_amount. $desconto . ' | qtd: '.$prod->item_qty. ' | total: R$ '.$prod->item_total);
                    $desc_servico .= '\s\n';
                    $totalServico += $prod->item_total;
                }
                $desc_servico = substr($desc_servico, 0, -4);
                
                // Coloco o nome do Paciente na descrição do serviço
//                $desc_servico = mb_strtoupper($desc_servico);
                $desc_servico .= '\s\n\s\nATENDIMENTO REALIZADO PARA:\s\n'.mb_strtoupper($dadosCliente->account);
                $desc_servico = substr($desc_servico, 0, 2000);

                // ISS
                $desconto = 0.00;
                $iss_retido = number_format(($totalServico * $dadosEmpresa['aliq_iss'] / 100), 2,'.','');

                //TODO: CEDDI
                //Tipo serviço chumbado
                $ItemListaServico = '04.03';
                
                // Dados do Tomador
                $nfse['DadosTomador']['RazaoSocial'] = mb_strtoupper($dadosCliente->account);
                $nfse['DadosTomador']['Logradouro'] = $xLgr.', '.$nro;
                $nfse['DadosTomador']['Endereco'] = $xLgr?'<Endereco>'.$xLgr.'</Endereco>':'';
                $nfse['DadosTomador']['Numero'] = $nro?'<Numero>'.$nro.'</Numero>':'';
                $nfse['DadosTomador']['Complemento'] = $xCpl?'<Complemento>'.$xCpl.'</Complemento>':'';
                $nfse['DadosTomador']['Bairro'] = $xBairro?'<Bairro>'.$xBairro.'</Bairro>':'';
                $nfse['DadosTomador']['Municipio']['CodigoMunicipioIBGE'] = $cMun?'<CodigoMunicipio>'.$cMun.'</CodigoMunicipio>':'';
//                $nfse['DadosTomador']['Municipio']['Descricao'] = $xMun;
                $nfse['DadosTomador']['Municipio']['Uf'] = $UF?'<Uf>'.$UF.'</Uf>':'';
                $nfse['DadosTomador']['Municipio']['Cep'] = $CEP_cliente?'<Cep>'.$CEP_cliente.'</Cep>':'';
                $nfse['DadosTomador']['Contato']['Telefone'] = $fone?'<Telefone>'.$fone.'</Telefone>':($celular?'<Telefone>'.$celular.'</Telefone>':'');
                $nfse['DadosTomador']['Contato']['Email'] = $email?'<Email>'.trim($email).'</Email>':'';
                
                // Monto XML
                $xml = '<?xml version="1.0" encoding="utf-8"?>
                            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                                              xmlns:ws="http://ws.issweb.fiorilli.com.br/" 
                                              xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
                                <soapenv:Header></soapenv:Header>
                                <soapenv:Body>
                                    <ws:gerarNfse>
                                        <GerarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
                                            <Rps xmlns="http://www.abrasf.org.br/nfse.xsd">
                                                <InfDeclaracaoPrestacaoServico Id="'.$dadosPedido['id'].'">
                                                    <Rps>
                                                        <IdentificacaoRps>
                                                            <Numero>'.$dadosPedido['id'].'</Numero>
                                                            <Serie>'.$dadosEmpresa['note_series_nfse'].'</Serie>
                                                            <Tipo>1</Tipo>
                                                        </IdentificacaoRps>
                                                        <DataEmissao>'.date('Y-m-d').'</DataEmissao>
                                                        <Status>1</Status>
                                                    </Rps>
                                                    <Competencia>'.date('Y-m-d').'</Competencia>
                                                    <Servico>
                                                        <Valores>
                                                            <ValorServicos>'.$totalServico.'</ValorServicos>
                                                            <Aliquota>'.$dadosEmpresa['aliq_iss'].'</Aliquota>
                                                        </Valores>
                                                        <IssRetido>2</IssRetido>
                                                        <ResponsavelRetencao>1</ResponsavelRetencao>
                                                        <ItemListaServico>'.$ItemListaServico.'</ItemListaServico>
                                                        <Discriminacao>'.$desc_servico.'</Discriminacao>
                                                        <CodigoMunicipio>'.$cMun.'</CodigoMunicipio>
                                                        <CodigoPais>1058</CodigoPais>
                                                        <ExigibilidadeISS>1</ExigibilidadeISS>
                                                        <MunicipioIncidencia>'.$cMun.'</MunicipioIncidencia>
                                                    </Servico>
                                                    <Prestador>
                                                        <CpfCnpj>
                                                            '.$PrestatorCpfCnpj.'
                                                        </CpfCnpj>
                                                        <InscricaoMunicipal>'.$InscricaoMunicipal.'</InscricaoMunicipal>
                                                    </Prestador>
                                                    <Tomador>
                                                        <IdentificacaoTomador>
                                                            <CpfCnpj>
                                                                '.$nfse['DadosTomador']['CpfCnpj'].'
                                                            </CpfCnpj>
                                                        </IdentificacaoTomador>
                                                        <RazaoSocial>'.$nfse['DadosTomador']['RazaoSocial'].'</RazaoSocial>
                                                        <Endereco>
                                                            '.$nfse['DadosTomador']['Endereco'].'
                                                            '.$nfse['DadosTomador']['Numero'].'
                                                            '.$nfse['DadosTomador']['Complemento'].'
                                                            '.$nfse['DadosTomador']['Bairro'].'
                                                            '.$nfse['DadosTomador']['Municipio']['CodigoMunicipioIBGE'].'
                                                            '.$nfse['DadosTomador']['Municipio']['Uf'].'
                                                            '.$nfse['DadosTomador']['Municipio']['Cep'].'
                                                        </Endereco>
                                                        <Contato>
                                                            '.$nfse['DadosTomador']['Contato']['Telefone'].'
                                                            '.$nfse['DadosTomador']['Contato']['Email'].'
                                                        </Contato>
                                                    </Tomador>
                                                    <OptanteSimplesNacional>2</OptanteSimplesNacional>
                                                    <IncentivoFiscal>2</IncentivoFiscal>
                                                </InfDeclaracaoPrestacaoServico>
                                            </Rps>
                                        </GerarNfseEnvio>
                                        <username>'.$xCNPJ.'</username>
                                        <password>'.$ChaveDigital.'</password>
                                    </ws:gerarNfse>
                                </soapenv:Body>
                            </soapenv:Envelope>';

                // RETIRO OS ACENTOS
                // TODO: VERIFICAR COMO ENVIAR COM ACENTOS, LIGAR NA FIORILLI
                $xml = trim($xml);
                $aFind = array('&','á','à','ã','â','é','ê','í','ó','ô','õ','ú','ü',
                    'ç','Á','À','Ã','Â','É','Ê','Í','Ó','Ô','Õ','Ú','Ü','Ç');
                $aSubs = array('e','a','a','a','a','e','e','i','o','o','o','u','u',
                    'c','A','A','A','A','E','E','I','O','O','O','U','U','C');
                $xml = str_replace($aFind, $aSubs, $xml);

//                header("Content-Type: application/xml") ;

                // PEGO AS FERRAMENTAS DO NFEPHP PARA ASSINAR O XML
                // ABRASF
                require_once 'application/plugins/modulo_fiscal/nfephp/bootstrap.php';
                require_once 'config_nota.php';
                $nfeTools = new NFePHP\NFe\ToolsNFe(geraConfig($dadosEmpresa, $tipo));
                $xml_assinada = $nfeTools->assinaDoc($xml, 'NFSe', 'InfDeclaracaoPrestacaoServico');
                
//                echo $xml_assinada;exit;
                

                // TODO: CEDDI | CURL NÃO ESTÁ HABILITADO NO SERVIDOR
                // UTLIZAMOS UM MÉTODO ALTERNATIVO PARA HTTP REQUEST
                $opts = array (
                'http' => array (
                    'method' => 'POST',
                    'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                        . "Content-Length: " . strlen($xml_assinada) . "\r\n",
                    'content' => $xml_assinada
                    )
                );
                
                $fn = 'http://nfse.ariquemes.ro.gov.br:5660/IssWeb-ejb/IssWebWS/IssWebWS?wsdl';
                $context = stream_context_create($opts); 
                $result = file_get_contents($fn,false,$context); 
                
                
                $xml_retorno_ws = utf8_encode($result);
                $xml_retorno = preg_replace("/(<\/?)(\w+):([^>]*>)/", '$1$2$3', $xml_retorno_ws);
                $xml_retorno = simplexml_load_string($xml_retorno);

                if (!isset($xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta))
                {
                      // moving to display page to display curl errors
                    r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>' . 
                                'Mensagem: '.$xml_retorno.'<br>'
                            . '<br><b>Envie o print dessa tela para o Webmaster.</b>');
                } 
                else 
                {
                    
                    if(isset($xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta->ns2ListaMensagemRetorno)) 
                    {
                        $correcao = $xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta->ns2ListaMensagemRetorno->ns2MensagemRetorno->ns2Correcao->__toString();
                        $codigo = $xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta->ns2ListaMensagemRetorno->ns2MensagemRetorno->ns2Codigo->__toString();
                        $mensagem = $xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta->ns2ListaMensagemRetorno->ns2MensagemRetorno->ns2Mensagem->__toString();
                        
                        
                        r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>' . 
                                'Código: '.$codigo.'<br>'.
                                'Mensagem: '.$mensagem.'<br>'.
                                'Correção: '.$correcao.'<br><br><b>Envie o print dessa tela para o Webmaster.</b>');
                    } 
                    else 
                    {
                        $xml_retorno = $xml_retorno->soapBody->ns3gerarNfseResponse->ns2GerarNfseResposta->ns2ListaNfse->ns2CompNfse->ns2Nfse->ns2InfNfse;
                        $attrs = $xml_retorno->attributes();
                        $key = $attrs->__toString();
                        
                        //  $aResposta = array();
                        $indSinc = '0'; //0=asíncrono, 1=síncrono
                        $pasta = date('Ym');

                        // TODO: verificar se precisa mesmo salvar o XML
                        $pathNFefile = getcwd() . "//application//plugins//modulo_fiscal//empresa//NFS-e//".$dadosEmpresa['note_environment']."//". "//enviadas//aprovadas//".$key."-nfse.xml";
                        $xml_retorno_ws = new SimpleXMLElement($xml_retorno_ws);
                        // Salvo o XML
                        $xml_retorno_ws->saveXML($pathNFefile);


                        //GRAVAR EMISSÃO DA NFE
                        $nota = ORM::for_table('app_fiscal_note')->create();
                        $nota->number_note = $xml_retorno->ns2Numero->__toString();
                        $nota->series = $dadosEmpresa['note_series_nfse'];
                        $nota->type = 'NFSe';
                        $nota->issuance_date = date('Y-m-d H:i:s',strtotime($xml_retorno->ns2DataEmissao->__toString()));
                        $nota->amount = $dadosPedido->total;
                        $nota->account = $dadosCliente->account;
                        $nota->id_account = $dadosCliente->id;
                        $nota->key = $key;
                        $nota->status = 'Emitido';
        //                $nota->receipt_number = $xml_retorno->Nfse->CodigoAutenticidade;
        //                $nota->protocol_number = $aRespostarecibo["aProt"][0]["nProt"];
                        $nota->pasta = $pasta;
                        $nota->code_status = 1;
                        $nota->invoice_id = $dadosPedido->id;
                        $nota->environment = $dadosEmpresa['note_environment'];
                        $nota->save();

                        //atualiza o numero da nota em ap_fiscal_config
                        $d = ORM::for_table('app_fiscal_config')->where('key', 'note_number_nfse')->find_one();
                        $d->value = intval($xml_retorno->ns2Numero->__toString()) + 1;
                        $d->save();

                        _log('Nota Emitida' . " " . 'Nota Autorizada' . ' [ID: ' . $nota->id, $user['fullname'], $user['id']);
                        //  $abre = $danfe->printDANFE("{$id}-danfe.pdf", 'D'); //I Abre o PDF no Navegador D- Download
                        r2($url_retorno, 's', 'Nota Emitida' . " Fatura: $dadosPedido->id | Nº Nota : " . $nota->number_note . " | Cod. Status: " . $nota->code_status . " | Status: " . $nota->status . " ");
                    }



                }
                break;
        }
        
        /// ######################################################################
        
        
    }
    else
    {

        //   error_reporting(E_ALL);
        //    ini_set('display_errors', 'On');
        require_once 'application/plugins/modulo_fiscal/nfephp/bootstrap.php';
        require_once 'config_nota.php';
        //
        //use NFePHP\NFe\MakeNFe;
        //use NFePHP\NFe\ToolsNFe;
        //use NFePHP\Common\Files\FilesFolders;
        //use NFePHP\Extras\Danfe;
        //use NFePHP\Extras\Danfce;

        $nfe = new NFePHP\NFe\MakeNFe();
        //$nfeTools = new ToolsNFe('../../config/config.json');
        $nfeTools = new NFePHP\NFe\ToolsNFe(geraConfig($dadosEmpresa, $tipo));

        //CARREGA O AMBIENTE
        $tpAmb = $nfeTools->aConfig['tpAmb'];   //1=Produção; 2=Homologação   vem do config.php
        //Dados da NFe - infNFe

        $cNF = str_pad(rand(0, 99999999), 8, "0", STR_PAD_LEFT); //Código numérico que compõe a Chave de Acesso. Número aleatório gerado pelo emitente para cada NF-e para evitar acessos indevidos da NF-e. (v2.0)
        if ($tipo == 'NFe') {
            //NF-e
            $nNF = $dadosEmpresa['note_number_nfe'];
            $serie = $dadosEmpresa['note_series_nfe'];
            $mod = 55; //modelo da NFe 55 ou 65 essa última NFCe
            $dhSaiEnt = date("Y-m-d\TH:i:sP"); //Não informar este campo para a NFC-e.

            if ($dadosEstadoCliente->id == $stateCompany->id) {
                $idDest = '1'; //1=Operação interna; 2=Operação interestadual; 3=Operação com exterior.
                $natOp = 'VENDA DENTRO DO ESTADO'; //natureza da operação
            } else {
                $idDest = '2'; //1=Operação interna; 2=Operação interestadual; 3=Operação com exterior.
                $natOp = 'VENDA INTERESTADUAL'; //natureza da operação
            }
            $tpImp = '1'; //0=Sem geração de DANFE; 1=DANFE normal, Retrato; 2=DANFE normal, Paisagem;
            //3=DANFE Simplificado; 4=DANFE NFC-e; 5=DANFE NFC-e em mensagem eletrônica
            //(o envio de mensagem eletrônica pode ser feita de forma simultânea com a impressão do DANFE;
            //usar o tpImp=5 quando esta for a única forma de disponibilização do DANFE).
            $indPres = '9'; //0=Não se aplica (por exemplo, Nota Fiscal complementar ou de ajuste);
            //1=Operação presencial;
            //2=Operação não presencial, pela Internet;
            //3=Operação não presencial, Teleatendimento;
            //4=NFC-e em operação com entrega a domicílio;
            //9=Operação não presencial, outros.
        } elseif ($tipo == 'NFCe') {
            //NFC-e
            $nNF = $dadosEmpresa['note_number_nfce'];
            $serie = $dadosEmpresa['note_series_nfce'];
            $mod = 65; //modelo da NFe 55 ou 65 essa última NFCe
            $dhSaiEnt = ''; //Não informar este campo para a NFC-e.
            $natOp = 'Venda ao consumidor';
            $idDest = '1';
            $tpImp = '4'; //0=Sem geração de DANFE; 1=DANFE normal, Retrato; 2=DANFE normal, Paisagem;
            //3=DANFE Simplificado; 4=DANFE NFC-e; 5=DANFE NFC-e em mensagem eletrônica
            //(o envio de mensagem eletrônica pode ser feita de forma simultânea com a impressão do DANFE;
            //usar o tpImp=5 quando esta for a única forma de disponibilização do DANFE).
            $indPres = '1'; //0=Não se aplica (por exemplo, Nota Fiscal complementar ou de ajuste);
            //1=Operação presencial;
            //2=Operação não presencial, pela Internet;
            //3=Operação não presencial, Teleatendimento;
            //4=NFC-e em operação com entrega a domicílio;
            //9=Operação não presencial, outros.
        }


        //TRATAR FORMA DE PAGAMENTO
        $indPag = $dadosPedido->paymentcondition -1; //0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros
        $dhEmi = date("Y-m-d\TH:i:sP"); //Formato: “AAAA-MM-DDThh:mm:ssTZD” (UTC - Universal Coordinated Time).
        $tpNF = '1'; ///0=Entrada;   1=Saída


        // Município do Remetente
        $cMunFG = $cityCompany->city_ibge; //'5200258';

        // Tipo de NF
        $tpEmis = '1'; //1=Emissão normal (não em contingência);
        //2=Contingência FS-IA, com impressão do DANFE em formulário de segurança;
        //3=Contingência SCAN (Sistema de Contingência do Ambiente Nacional);
        //4=Contingência DPEC (Declaração Prévia da Emissão em Contingência);
        //5=Contingência FS-DA, com impressão do DANFE em formulário de segurança;
        //6=Contingência SVC-AN (SEFAZ Virtual de Contingência do AN);
        //7=Contingência SVC-RS (SEFAZ Virtual de Contingência do RS);
        //9=Contingência off-line da NFC-e (as demais opções de contingência são válidas também para a NFC-e);
        //Nota: Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9.

        // Finalidade
        //1=NF-e normal; 2=NF-e complementar; 3=NF-e de ajuste; 4=Devolução/Retorno.
        if($arr_tributos->CONFIG->devolucao == 'N')
        {
            $finNFe = '1'; 
        }
        else
        {
            $finNFe = '4'; 
        }

        // Consumidor Final
        //0=Normal; 1=Consumidor final;
        if($arr_tributos->CONFIG->consumidor == 'N')
        {
            $indFinal = '0'; 
        }
        else
        {
           $indFinal = '1';  
        }


        $procEmi = '0'; //0=Emissão de NF-e com aplicativo do contribuinte;
        //1=Emissão de NF-e avulsa pelo Fisco;
        //2=Emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco;
        //3=Emissão NF-e pelo contribuinte com aplicativo fornecido pelo Fisco.

        $verProc = '4.0.43'; //versão do aplicativo emissor
        $dhCont = ''; //entrada em contingência AAAA-MM-DDThh:mm:ssTZD
        $xJust = ''; //Justificativa da entrada em contingência

        //Numero e versão da NFe (infNFe)
        $ano = date('y', strtotime($dhEmi));
        $mes = date('m', strtotime($dhEmi));
        $cnpj = preg_replace('/\D/', '', $dadosEmpresa['company_cnpj']);
        $chave = $nfe->montaChave($cUF, $ano, $mes, $cnpj, $mod, $serie, $nNF, $tpEmis, $cNF);
        $versao = '3.10';

        //Tag Inf NFE
        $resp = $nfe->taginfNFe($chave, $versao);

        //tag IDE
        $cDV = substr($chave, -1); //Digito Verificador da Chave de Acesso da NF-e, o DV é calculado com a aplicação do algoritmo módulo 11 (base 2,9) da Chave de Acesso.
        $resp = $nfe->tagide($cUF, $cNF, $natOp, $indPag, $mod, $serie, $nNF, $dhEmi, $dhSaiEnt, $tpNF, $idDest, $cMunFG, $tpImp, $tpEmis, $cDV, $tpAmb, $finNFe, $indFinal, $indPres, $procEmi, $verProc, $dhCont, $xJust);

        // TAG Emitente
        $CNPJ = preg_replace('/\D/', '', $dadosEmpresa['company_cnpj']); //$nfeTools->aConfig['cnpj'];
        $CPF = ''; // Utilizado para CPF na nota
        $xNome = $dadosEmpresa['company_name']; // $nfeTools->aConfig['razaosocial'];
        $xFant = $dadosEmpresa['company_fantasy_name']; //$nfeTools->aConfig['nomefantasia'];
        $IE = $dadosEmpresa['company_ie']; //$nfeTools->aConfig['ie'];
        if ($tipo == 'NFe') {
            $IEST = $dadosEmpresa['company_iest']; //$dadosEmpresa['company_iest']; //$nfeTools->aConfig['iest'];
        } else {
            $IEST = '';
        }
        $IM = $dadosEmpresa['company_im']; //$nfeTools->aConfig['im'];
        $CNAE = str_pad(preg_replace('/\D/', '', $dadosEmpresa['company_cnae']), 7, "0", STR_PAD_LEFT); // $nfeTools->aConfig['cnae'];
        $CRT = $dadosEmpresa['company_crt']; //$nfeTools->aConfig['regime'];
        $resp = $nfe->tagemit($CNPJ, $CPF, $xNome, $xFant, $IE, $IEST, $IM, $CNAE, $CRT);


        //Tag endereço do emitente
        $xLgr = empty($dadosEmpresa['company_address']) ? 's/ endereco' : $dadosEmpresa['company_address']; //'Av. Rio de Janeiro';
        $nro = empty($dadosEmpresa['company_number']) ? 's/n' : $dadosEmpresa['company_number']; //'s/n';
        $xCpl = empty($dadosEmpresa['company_complement']) ? 's/c' : $dadosEmpresa['company_complement']; //'Qd. 38 Lt. 4,5 e 34';
        $xBairro = empty($dadosEmpresa['company_neighborhood']) ? 's/ bairro' : $dadosEmpresa['company_neighborhood']; //'Jardim Pinheiros I';
        $cMun = $cityCompany->city_ibge; //'5200258';
        $xMun = $cityCompany->city_name; //'Águas Lindas de Goiás';
        $UF = str_pad($stateCompany->uf_state, 2, "0", STR_PAD_LEFT); //'GO';
        $CEP = str_pad(preg_replace('/\D/', '', $dadosEmpresa['company_zip']), 8, "0", STR_PAD_LEFT); //'72910000';
        $cPais = $dadosEmpresa['company_code_country']; //'1058';
        $xPais = $dadosEmpresa['company_country_name']; //'Brasil';
        $fone = preg_replace('/\D/', '', $dadosEmpresa['company_phone']); //'6239324097';
        $resp = $nfe->tagenderEmit($xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF, $CEP, $cPais, $xPais, $fone);


        //destinatário
        $CNPJ = null;
        $CPF = null;
        if ($tipo == 'NFe') {
            if ($dadosCliente->kind_of_person != 'E') {
                if ($dadosCliente->kind_of_person == 'PJ') {
                    $CNPJ = str_pad(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj), 14, "0", STR_PAD_LEFT); //'23401454000170';
                    $indIEDest = $dadosCliente->taxpayer; //1=Contribuinte ICMS (informar a IE do destinatário); 2=Contribuinte isento de Inscrição no cadastro de Contribuintes  9=Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS.
                } else {
                    $CPF = str_pad(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj), 11, "0", STR_PAD_LEFT);
                    $indIEDest = 9;
                }
            }

            $idEstrangeiro = '';
            $xNome = $dadosCliente->account; //'Chinnon Santos - Tecnologia e Assessoria em Softwares';
            $IE = empty($dadosCliente->ie) ? '' : $dadosCliente->ie; //opcional Inscrição Estadual do Destinatário;
            $ISUF = ''; //opcional Obrigatório, nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA.;
            $IM = $dadosCliente->im; //opcional Campo opcional, pode ser informado na NF-e conjugada, com itens de produtos sujeitos ao ICMS e itens de serviços sujeitos ao ISSQN//'4128095';
            $email = $dadosCliente->email_nfe; //'nfe@chinnonsantos.com';
            $resp = $nfe->tagdest($CNPJ, $CPF, $idEstrangeiro, $xNome, $indIEDest, $IE, $ISUF, $IM, $email);
            //Endereço do destinatário
            $xLgr = empty($address[0]->address) ? 's/ endereco' : $address[0]->address; //'Av. Rio de Janeiro';
            $nro = empty($address[0]->number) ? 's/n' : $address[0]->number; //'s/n';
            $xCpl = empty($address[0]->complement) ? 's/c' : $address[0]->complement; //'Qd. 38 Lt. 4,5 e 34';
            $xBairro = empty($address[0]->neighborhood) ? 's/ bairro' : $address[0]->neighborhood; //'Jardim Pinheiros I';
            $cMun = str_pad(preg_replace('/\D/', '', $dadosCidadeCliente->city_ibge), 7, "0", STR_PAD_LEFT); //'5208707';
            $xMun = $dadosCidadeCliente->city_name; //'Goiânia';
            $UF = $dadosEstadoCliente->uf_state; //'GO';
            $CEP = str_pad(preg_replace('/\D/', '', $address[0]->zip), 8, "0", STR_PAD_LEFT); //'74310010';
            $cPais = 1058; //$dadosCliente->cd_country; // '1058';
            $xPais = 'Brasil'; //$dadosCliente->country; //'Brasil';
            $fone = preg_replace('/\D/', '', $dadosCliente->phone); //'6292779404';
            $resp = $nfe->tagenderDest($xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF, $CEP, $cPais, $xPais, $fone);
        } else {
            if (count(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj)) <= 11 && !empty($dadosCliente->cpf_cnpj)) {
                $resp = $nfe->tagdest('', str_pad(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj), 11, "0", STR_PAD_LEFT), '', '', '', '', '', '', '');
            }
        }

        //Identificação do local de retirada (se diferente do emitente)
        //$CNPJ = '12345678901234';
        //$CPF = '';
        //$xLgr = 'Rua Vanish';
        //$nro = '000';
        //$xCpl = 'Ghost';
        //$xBairro = 'Assombrado';
        //$cMun = '3509502';
        //$xMun = 'Campinas';
        //$UF = 'SP';
        //$resp = $nfe->tagretirada($CNPJ, $CPF, $xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF);
        //Identificação do local de Entrega (se diferente do destinatário)
        //$CNPJ = '12345678901234';
        //$CPF = '';
        //$xLgr = 'Viela Mixuruca';
        //$nro = '2';
        //$xCpl = 'Quabrada do malandro';
        //$xBairro = 'Favela Mau Olhado';
        //$cMun = '3509502';
        //$xMun = 'Campinas';
        //$UF = 'SP';
        //$resp = $nfe->tagentrega($CNPJ, $CPF, $xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF);

        $somaCOFINS = 0;
        $somaPIS    = 0;
        $somaICMS   = 0;
        $somaBCST   = 0;
        $somaISSQN  = 0;
        $somaProduto= 0;
        $i = 1;
        $valorDesconto = $dadosPedido->discount;
        $pesoBruto = 0;
        $pesoLiquido = 0;
        $quantidadeTotal = 0;

        //necessário para atribuir o valor do frete a um produto, para emitir a nota
        $valorFreteproduto=(($dadosPedido->freight_by=='Sender' || $dadosPedido->freight_by=='Addressee' || $dadosPedido->freight_by=='The 3rd') && $dadosPedido->freight>0?number_format($dadosPedido->freight, 2, '.', ''):'');


        // Valor dos impostos para cada Item do pedido
        foreach ($dadosItemsPedidos as $prod) 
        {
            // pego o peso do pedido e as quantidades
            $pesoBruto += $prod->gross_weight;
            $pesoLiquido += $prod->net_weight;
            $quantidadeTotal += $prod->item_qty;

            //calcula os descontos e aplica para cada ítem inicial 
            if ($valorDesconto > $prod->item_amount) {
                $decontoProduto = $prod->item_amount;
                $valorDesconto-=$prod->item_amount;
            } else {
                $decontoProduto = $valorDesconto;
                $valorDesconto = 0;
                if ($decontoProduto == 0) {
                    $decontoProduto = '';
                }
            }

            $prod->nItem = $i++;
            $nItem = $prod->nItem; //$prod['nItem'];
            $cProd = $prod->id; //$prod['cProd'];
            $cEAN = ''; // $prod->codigo_barras;//$prod['cEAN'];
            $xProd = ($tpAmb == 1) ? $prod->description : "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";  //$prod['xProd'];  VERIFICA AMBIENTE PARA NOME DO PRODUTO
            $NCM = str_pad($prod->mercosur_nomenclature, 8, "0", STR_PAD_LEFT); //$prod['NCM'];
            $uCom = $prod->metric; //$prod['uCom'];
            $qCom = $prod->item_qty; //$prod['qCom'];Informar a quantidade de comercialização do produto (v2.0).
            $vUnCom = $prod->item_amount; // $prod['vUnCom']; Valor Unitário de Comercialização
            $vProd = $prod->item_total; //$prod['vProd'];  Valor total dos produtos (vem do pedido)
            $cEANTrib = ''; // $prod->codigo_barras;//$prod['cEANTrib'];
            $uTrib = $prod->metric; //$prod['uTrib']; ]; 
            $qTrib = $prod->item_qty; //$prod['qTrib' mesma informação segundo  para venda de fardos que muda
            $vUnTrib = $prod->item_amount; //$prod['vUnTrib']; mesma informação  venda de fardos que muda


            //
            //// TRIBUTAÇÃO
            //





            //Atribui valor para os demais itens da nota como ''. 
            //TODO: Verificar se isto está certo. 
            $vFrete = $valorFreteproduto; // $prod['vFrete'];
            $valorFreteproduto='';


            $vSeg = ''; // $prod['vSeg'];
            $vDesc = $decontoProduto; // $prod['vDesc'];
            $vOutro = ''; // $prod['vOutro']; 


            // TODO: verificar se o indTot será sempre 1 (indica se o valor do produto deve entrar no valor total da NF)
            // TODO: colocar o campo EXTIPI no cadastro do Produto
            if ($prod->type == 'Product') {
                $indTot = 1; // $prod['indTot'];
                $EXTIPI = ''; //$prod['EXTIPI'];  //Não Obrigatório Preencher de acordo com o código EX da TIPI. Em caso de serviço, não incluir a TAG.
            } else {
                $indTot = 0; //0;
                $EXTIPI = ''; //$prod['EXTIPI'];  //Não Obrigatório Preencher de acordo com o código EX da TIPI. Em caso de serviço, não incluir a TAG.
            }

            if ($tipo == 'NFCe') {
                $indTot = 1; //NFC-e o valor é 1
            }
            //inicialmente serviço valor 0 e produto valor 1
            //Quanto ao indTot, serve somente para indicar se o valor do item compõe o valor total da NFe. Na maioria dos casos compõe, mas existem casos como nota complementar ou de serviço que não compõe.
            //0 o valor do item (vProd) não compõe o valor total da NF-e (vProd) 
            //1 o valor do item (vProd) compõe o valor total da NF-e (vProd)

            $xPed = $dadosPedido->id; //$prod['xPed'];
            $nItemPed = $prod->nItem; // $prod['nItemPed'];
            $nFCI = ''; // $prod['nFCI'];


    //        var_dump(json_decode($arr_tributos->SIMPLES->exception[0]));exit;





            ###################################
            // ICMS / SIMPLES / CFOP
            ###################################
            $nItem = $prod->nItem;
            $orig = '0';

            // Verifico as exceções de tributação para ICMS/SIMPLES
            $exception_aux = false;
            if($CRT == 3)
            {
                $arr_expection  = is_array($arr_tributos->ICMS->exception) ? $arr_tributos->ICMS->exception : array();
                $CFOP           = $arr_tributos->ICMS->cfop;
                $cst            = $arr_tributos->ICMS->st;
                $pICMS          = $arr_tributos->ICMS->aliquota ? number_format(str_replace(',', '.', $arr_tributos->ICMS->aliquota), 2, '.', '') : '0.00';
                $modBCST        = $arr_tributos->ICMS->icms_modBCST;
                $pBCST          = $arr_tributos->ICMS->icms_icms_st_base ? number_format(str_replace(',', '.', $arr_tributos->ICMS->icms_icms_st_base), 2, '.', '') : '0.00';
                $pBC            = $arr_tributos->ICMS->base ? number_format(str_replace(',', '.', $arr_tributos->ICMS->base), 2, '.', '') : '0.00';
                $pICMSST        = $arr_tributos->ICMS->icms_icms_st_alq ? number_format(str_replace(',', '.', $arr_tributos->ICMS->icms_icms_st_alq), 2, '.', '') : '0.00';
                $pMVAST         = $arr_tributos->ICMS->icms_icms_st_valor_adicionado ? number_format(str_replace(',', '.', $arr_tributos->ICMS->icms_icms_st_valor_adicionado), 2, '.', '') : '0.00';
            }
            else
            {
                $arr_expection  = is_array($arr_tributos->SIMPLES->exception) ? $arr_tributos->SIMPLES->exception : array();
                $CFOP           = $arr_tributos->SIMPLES->cfop;
                $csosn          = $arr_tributos->SIMPLES->st;
                $pICMS          = number_format(str_replace(',', '.', $arr_tributos->SIMPLES->aliquota), 2, '.', '');
                $modBCST        = $arr_tributos->SIMPLES->icms_st_modBCST;
                $pBCST          = $arr_tributos->SIMPLES->icms_st_base ? number_format(str_replace(',', '.', $arr_tributos->SIMPLES->icms_st_base), 2, '.', '') : '0.00';
                $pBC            = $arr_tributos->SIMPLES->base ? number_format(str_replace(',', '.', $arr_tributos->SIMPLES->base), 2, '.', '') : '0.00';
                $pICMSST        = $arr_tributos->SIMPLES->icms_st_alq ? number_format(str_replace(',', '.', $arr_tributos->SIMPLES->icms_st_alq), 2, '.', '') : '0.00';
                $pMVAST         = $arr_tributos->SIMPLES->icms_st_valor_adicionado ? number_format(str_replace(',', '.', $arr_tributos->SIMPLES->icms_st_valor_adicionado), 2, '.', '') : '0.00';
                $pCredSN        = $arr_tributos->SIMPLES->alq_credito ? number_format(str_replace(',', '.', $arr_tributos->SIMPLES->alq_credito), 2, '.', '') : '0.00';
            }

            foreach ($arr_expection as $exception)
            {
                $exception_json = json_decode($exception);


                // Pego as exceções para os DESTINOS
                $ex_destino = array();
                if(isset($exception_json->destino))
                {
                    if(is_array($exception_json->destino))
                    {
                        $ex_destino = $exception_json->destino;
                    }
                    else 
                    {
                        $ex_destino[] = $exception_json->destino;
                    }
                }

                if(in_array($dadosEstadoCliente->id, $ex_destino))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os NCM
                $ex_ncm = array();
                if(isset($exception_json->ncm))
                {
                    if(is_array($exception_json->ncm))
                    {
                        $ex_ncm = $exception_json->ncm;
                    }
                    else 
                    {
                        $ex_ncm[] = $exception_json->ncm;
                    }
                }

                foreach ($ex_ncm as $ncm_aux)
                {
                    if($NCM == preg_replace("/[^0-9]/", "", $ncm_aux))
                    {
                        $exception_aux = true;
                        break;
                    }
                }



                // Pego as exceções para os PRODUTOS
                $ex_product = array();
                if(isset($exception_json->products))
                {
                    if(is_array($exception_json->products))
                    {
                        $ex_product = $exception_json->products;
                    }
                    else 
                    {
                        $ex_product[] = $exception_json->products;
                    }
                }

                if(in_array($prod->id, $ex_product))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os ORIGENS
                $ex_origin = array();
                if(isset($exception_json->origin))
                {
                    if(is_array($exception_json->origin))
                    {
                        $ex_origin = $exception_json->origin;
                    }
                    else 
                    {
                        $ex_origin[] = $exception_json->origin;
                    }
                }
                // TODO: verificar como tratar as origins, pois não temos esse dado no produto nem no pedido
            }


            // Verifico se foi encontrada alguma exceção compatível
            if($exception_aux == true)
            {
                if($CRT == 3)
                {
                    $CFOP           = $exception_json->icms_cfop;
                    $cst            = $exception_json->icms_st;
                    $pICMS          = number_format(str_replace(',', '.', $exception_json->icms_aliquota), 2, '.', '');
                    $pICMSST        = $exception_json->icms_icms_st_alq ? number_format(str_replace(',', '.', $exception_json->icms_icms_st_alq), 2, '.', '') : '0.00';
                    $pBC            = number_format(str_replace(',', '.', $exception_json->icms_base), 2, '.', '');
                    $pBCST          = number_format(str_replace(',', '.', $exception_json->icms_icms_st_base), 2, '.', '');
                    $modBCST        = $exception_json->icms_icms_modBCST;
                    $pMVAST         = $arr_tributos->ICMS->icms_icms_st_valor_adicionado ? number_format(str_replace(',', '.', $arr_tributos->ICMS->icms_icms_st_valor_adicionado), 2, '.', '') : '0.00';

                }
                else
                {
                    $CFOP           = $exception_json->simples_cfop;
                    $csosn          = $exception_json->simples_st;
                    $pICMS          = number_format(str_replace(',', '.', $exception_json->simples_aliquota), 2, '.', '');
                    $modBCST        = $exception_json->simples_icms_st_modBCST;
                    $pBCST          = number_format(str_replace(',', '.', $exception_json->simples_icms_st_base), 2, '.', '');
                    $pICMSST        = number_format(str_replace(',', '.', $exception_json->simples_icms_st_alq), 2, '.', '');
                    $pBC            = number_format(str_replace(',', '.', $exception_json->simples_base), 2, '.', '');
                    $pMVAST         = $exception_json->SIMPLES->simples_icms_st_valor_adicionado ? number_format(str_replace(',', '.', $exception_json->SIMPLES->simples_icms_st_valor_adicionado), 2, '.', '') : '0.00';
                    $pCredSN        = $exception_json->simples_alq_credito ? number_format(str_replace(',', '.', $exception_json->simples_alq_credito), 2, '.', '') : '0.00';
                }
            }

            // Verifico se tem Substituição Tributária
            $substituicao_tributaria = false;
            if($CRT == 3)
            {
                switch ($cst)
                {
                    case 10:
                    case 30:
                    case 60:
                    case 70:
                    case 90:
                        $substituicao_tributaria = true;
                        break;
                }
            }
            else
            {
                switch ($csosn)
                {
                    case 201:
                    case 202:
                    case 203:
                    case 500:
                    case 900:
                        $substituicao_tributaria = true;
                        break;
                }
            }



            // TODO: aqui estamos considerando apenas os CFOPs de Venda de mercadorias
            if($idDest == 1)
            {
                $CFOP = str_replace('?.', '5', $CFOP);
            }
            else
            {
                $CFOP = str_replace('?.', '6', $CFOP);
            }

            //TAG do Produto
            $resp = $nfe->tagprod($nItem, $cProd, $cEAN, $xProd, $NCM, $EXTIPI, $CFOP, $uCom, $qCom, $vUnCom, $vProd, $cEANTrib, $uTrib, $qTrib, $vUnTrib, $vFrete, $vSeg, $vDesc, $vOutro, $indTot, $xPed, $nItemPed, $nFCI);



            // Modalidade de determinação da BC do ICMS
            //        0 - Margem Valor Agregado (%); 
            //        1 - Pauta (Valor); 
            //        2 - Preço Tabelado Máx. (valor); 
            //        3 - valor da operação
            $modBC = '1';

            // Percentual da Redução de Base de Cálculo (para CST 90 do ICMS)
            $pRedBC = '';

            //Base de cálculo do ICMS => $qTrib * $vUnTrib
            $vBCICMS    = number_format($qTrib * $vUnTrib * ($pBC/100),2, '.', '');  
            $vBCST      = number_format($qTrib * $vUnTrib * ($pBCST/100),2, '.', '');  

            // Valor do ICMS
            $vICMS = number_format($vBCICMS * ($pICMS/100), 2, '.', ''); 

            // Valor do ICMSST
            $vICMSST = number_format($vBCST * ($pICMSST/100), 2, '.', ''); 

            // Partilha para venda interestadual
            ## TODO: verificar se é calculado também para SIMPLES
            if($idDest == 2)
            {
                //
                // TODO: fazer o cálculo da partilha do ICMS para operações Intre Estados. 
                // Levar em consideração o valor do ICMS para o destino de acordo com o ANO
                // 2017 -> 60%, 2018 -> 80%, 2019 -> 100%
                $vBCUFDest = $vBCICMS;
                $pFCPUFDest = '0.00';
                $pICMSUFDest = '17.00';
                $pICMSInter = '12.00';
                $pICMSInterPart = '60.00';
                $vFCPUFDest = '0.00';
                $vICMSUFDest = $vICMS*0.6;
                $vICMSUFRemet = $vICMS*0.4; 
                $resp = $nfe->tagICMSUFDest($nItem, $vBCUFDest, $pFCPUFDest, $pICMSUFDest, $pICMSInter, $pICMSInterPart, $vFCPUFDest, $vICMSUFDest, $vICMSUFRemet);

            }


            ### TODO: PEGAR OS VALORES ABAIXO DO ARR_TRIBUTOS
            $vCredICMSSN    = '';

            $pRedBCST = '';
            $vBCSTRet = $prod->item_total; // Pauta do Chope Claro 1000ml em GO R$ 8,59 x 0.660 Litros
            $vICMSSTRet = ''; // = (Valor da Pauta * Alíquota ICMS ST) - Valor ICMS Próprio
            $vICMSDeson = '';
            $motDesICMS = '';
            $pDif = '';
            $vICMSDif = '';
            $vICMSOp = '';

            if($dadosEmpresa['company_crt'] == 3)
            {
                $resp = $nfe->tagICMS($nItem, $orig, $cst, $modBC, $pRedBC, $vBCICMS, $pICMS, $vICMS, $vICMSDeson, $motDesICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pDif, $vICMSDif, $vICMSOp, $vBCSTRet, $vICMSSTRet);
            }
            else 
            {
                //ICMSSN - Tributação ICMS pelo Simples Nacional - CSOSN 500
                $resp = $nfe->tagICMSSN($nItem, $orig, $csosn, $modBC, $vBCICMS, $pRedBC, $pICMS, $vICMS, $pCredSN, $vCredICMSSN, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $vBCSTRet, $vICMSSTRet);
            }




            ###################################
            # ISSQN
            ###################################
            // Verifico as exceções de tributação para ISSQN
            $exception_aux = false;
            $arr_expection  = is_array($arr_tributos->ISSQN->exception) ? $arr_tributos->ISSQN->exception : array();
            $cst            = $arr_tributos->ISSQN->st;
            $vAliq          = number_format(str_replace(',', '.', $arr_tributos->ISSQN->aliquota), 2, '.', '');

            foreach ($arr_expection as $exception)
            {
                $exception_json = json_decode($exception);

                // Pego as exceções para os DESTINOS
                $ex_destino = array();
                if(isset($exception_json->destino))
                {
                    if(is_array($exception_json->destino))
                    {
                        $ex_destino = $exception_json->destino;
                    }
                    else 
                    {
                        $ex_destino[] = $exception_json->destino;
                    }
                }

                if(in_array($dadosEstadoCliente->id, $ex_destino))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os NCM
                $ex_ncm = array();
                if(isset($exception_json->ncm))
                {
                    if(is_array($exception_json->ncm))
                    {
                        $ex_ncm = $exception_json->ncm;
                    }
                    else 
                    {
                        $ex_ncm[] = $exception_json->ncm;
                    }
                }

                foreach ($ex_ncm as $ncm_aux)
                {
                    if($NCM == preg_replace("/[^0-9]/", "", $ncm_aux))
                    {
                        $exception_aux = true;
                        break;
                    }
                }



                // Pego as exceções para os PRODUTOS
                $ex_product = array();
                if(isset($exception_json->products))
                {
                    if(is_array($exception_json->products))
                    {
                        $ex_product = $exception_json->products;
                    }
                    else 
                    {
                        $ex_product[] = $exception_json->products;
                    }
                }

                if(in_array($prod->id, $ex_product))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os ORIGENS
                $ex_origin = array();
                if(isset($exception_json->origin))
                {
                    if(is_array($exception_json->origin))
                    {
                        $ex_origin = $exception_json->origin;
                    }
                    else 
                    {
                        $ex_origin[] = $exception_json->origin;
                    }
                }
                // TODO: verificar como tratar as origins, pois não temos esse dado no produto nem no pedido
            }


            // Verifico se foi encontrada alguma exceção compatível para o ISSQN
            if($exception_aux == true)
            {
                $cst            = $exception_json->issqn_st;
                $vAliq          = number_format(str_replace(',', '.', $exception_json->aliquota), 2, '.', '');
            }


            // TAG de for produto
            $vISSQN = 0;
            $ISSQN_Total = false;
            if ($prod->type != 'Product') 
            {
                $nItem = $prod->nItem;
                $vBC = $qTrib * $vUnTrib;
                $vISSQN = $vBC * ($vAliq/100);
                $cMunFG = $cityCompany->city_ibge;
                $cListServ = '16.01';
                $vDeducao = '';
                $vOutro = '';
                $vDescIncond = '';
                $vDescCond = '';
                $vISSRet = '';
                $indISS = '1';
                $cServico = '';
                $cMun = '';
                $cPais = '';
                $nProcesso = '';
                $indIncentivo = '1';
                $nfe->tagISSQN($nItem, $vBC, $vAliq, $vISSQN, $cMunFG, $cListServ, $vDeducao, $vOutro, $vDescIncond, $vDescCond, $vISSRet, $indISS, $cServico, $cMun, $cPais, $nProcesso, $indIncentivo);
                // $nfe->tagISSQN($nProcesso, $vBC, $vAliq, $vISSQN, $cServico, $cListServ, $vDeducao, $vOutro, $vDescIncond, $vDescCond)
                //de acordo com o identiificado cst 2 casas decimais 1 ou 2

                $ISSQN_Total = true;
            }






            // TODO: É NECESSÁRIO SE CRIAR UM CST PARA O PIS E OUTRO PARA O COFINS
    //        $cst = '03'; 


            ###################################
            # PIS
            ###################################

            // Verifico as exceções de tributação para PIS
            $exception_aux  = false;
            $arr_expection  = is_array($arr_tributos->PIS->exception) ? $arr_tributos->PIS->exception : array();
            $cst            = $arr_tributos->PIS->st;
            $pPIS           = number_format(str_replace(',', '.', $arr_tributos->PIS->aliquota), 2, '.', '');

            foreach ($arr_expection as $exception)
            {
                $exception_json = json_decode($exception);

                // Pego as exceções para os DESTINOS
                $ex_destino = array();
                if(isset($exception_json->destino))
                {
                    if(is_array($exception_json->destino))
                    {
                        $ex_destino = $exception_json->destino;
                    }
                    else 
                    {
                        $ex_destino[] = $exception_json->destino;
                    }
                }

                if(in_array($dadosEstadoCliente->id, $ex_destino))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os NCM
                $ex_ncm = array();
                if(isset($exception_json->ncm))
                {
                    if(is_array($exception_json->ncm))
                    {
                        $ex_ncm = $exception_json->ncm;
                    }
                    else 
                    {
                        $ex_ncm[] = $exception_json->ncm;
                    }
                }

                foreach ($ex_ncm as $ncm_aux)
                {
                    if($NCM == preg_replace("/[^0-9]/", "", $ncm_aux))
                    {
                        $exception_aux = true;
                        break;
                    }
                }



                // Pego as exceções para os PRODUTOS
                $ex_product = array();
                if(isset($exception_json->products))
                {
                    if(is_array($exception_json->products))
                    {
                        $ex_product = $exception_json->products;
                    }
                    else 
                    {
                        $ex_product[] = $exception_json->products;
                    }
                }

                if(in_array($prod->id, $ex_product))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os ORIGENS
                $ex_origin = array();
                if(isset($exception_json->origin))
                {
                    if(is_array($exception_json->origin))
                    {
                        $ex_origin = $exception_json->origin;
                    }
                    else 
                    {
                        $ex_origin[] = $exception_json->origin;
                    }
                }
                // TODO: verificar como tratar as origins, pois não temos esse dado no produto nem no pedido
            }


            // Verifico se foi encontrada alguma exceção compatível para o PIS
            if($exception_aux == true)
            {
                $cst            = $exception_json->pis_st;
                $pPIS           = number_format(str_replace(',', '.', $exception_json->pis_aliquota), 2, '.', '');
            }

            $nItem = $prod->nItem;
            $vBC = number_format($qTrib * $vUnTrib, 2, '.', '');
            $vPIS = number_format($vBC * ($pPIS/100), 2, '.', '');
            $qBCProd = $qTrib;
            $vAliqProd = $vPIS;
            $resp = $nfe->tagPIS($nItem, $cst, $vBC, $pPIS, $vPIS, $qBCProd, $vAliqProd);




            ###################################
            # COFINS
            ###################################

            // Verifico as exceções de tributação para COFINS
            $exception_aux  = false;
            $arr_expection  = is_array($arr_tributos->COFINS->exception) ? $arr_tributos->COFINS->exception : array();
            $cst            = $arr_tributos->COFINS->st;
            $pCOFINS           = number_format(str_replace(',', '.', $arr_tributos->COFINS->aliquota), 2, '.', '');

            foreach ($arr_expection as $exception)
            {
                $exception_json = json_decode($exception);

                // Pego as exceções para os DESTINOS
                $ex_destino = array();
                if(isset($exception_json->destino))
                {
                    if(is_array($exception_json->destino))
                    {
                        $ex_destino = $exception_json->destino;
                    }
                    else 
                    {
                        $ex_destino[] = $exception_json->destino;
                    }
                }

                if(in_array($dadosEstadoCliente->id, $ex_destino))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os NCM
                $ex_ncm = array();
                if(isset($exception_json->ncm))
                {
                    if(is_array($exception_json->ncm))
                    {
                        $ex_ncm = $exception_json->ncm;
                    }
                    else 
                    {
                        $ex_ncm[] = $exception_json->ncm;
                    }
                }

                foreach ($ex_ncm as $ncm_aux)
                {
                    if($NCM == preg_replace("/[^0-9]/", "", $ncm_aux))
                    {
                        $exception_aux = true;
                        break;
                    }
                }



                // Pego as exceções para os PRODUTOS
                $ex_product = array();
                if(isset($exception_json->products))
                {
                    if(is_array($exception_json->products))
                    {
                        $ex_product = $exception_json->products;
                    }
                    else 
                    {
                        $ex_product[] = $exception_json->products;
                    }
                }

                if(in_array($prod->id, $ex_product))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os ORIGENS
                $ex_origin = array();
                if(isset($exception_json->origin))
                {
                    if(is_array($exception_json->origin))
                    {
                        $ex_origin = $exception_json->origin;
                    }
                    else 
                    {
                        $ex_origin[] = $exception_json->origin;
                    }
                }
                // TODO: verificar como tratar as origins, pois não temos esse dado no produto nem no pedido
            }

            // Verifico se foi encontrada alguma exceção compatível para o COFINS
            if($exception_aux == true)
            {
                $cst            = $exception_json->cofins_st;
                $pCOFINS        = number_format(str_replace(',', '.', $exception_json->aliquota), 2, '.', '');
            }
            $nItem = $prod->nItem;
            $vBC = number_format($qTrib * $vUnTrib, 2, '.', '');
            $vCOFINS = number_format($vBC * ($pCOFINS/100), 2, '.', '');
            $qBCProd = $qTrib;
            $vAliqProd = $vCOFINS;
            $resp = $nfe->tagCOFINS($nItem, $cst, $vBC, $pCOFINS, $vCOFINS, $qBCProd, $vAliqProd);




            ###################################
            # IPI
            ###################################

            // Verifico as exceções de tributação para IPI
            $exception_aux  = false;
            $arr_expection  = is_array($arr_tributos->IPI->exception) ? $arr_tributos->IPI->exception : array();
            $cst            = $arr_tributos->IPI->st;
            $pIPI           = number_format(str_replace(',', '.', $arr_tributos->IPI->aliquota), 2, '.', '');
            $cEnq           = $arr_tributos->IPI->c_enq;

            foreach ($arr_expection as $exception)
            {
                $exception_json = json_decode($exception);

                // Pego as exceções para os DESTINOS
                $ex_destino = array();
                if(isset($exception_json->destino))
                {
                    if(is_array($exception_json->destino))
                    {
                        $ex_destino = $exception_json->destino;
                    }
                    else 
                    {
                        $ex_destino[] = $exception_json->destino;
                    }
                }

                if(in_array($dadosEstadoCliente->id, $ex_destino))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os NCM
                $ex_ncm = array();
                if(isset($exception_json->ncm))
                {
                    if(is_array($exception_json->ncm))
                    {
                        $ex_ncm = $exception_json->ncm;
                    }
                    else 
                    {
                        $ex_ncm[] = $exception_json->ncm;
                    }
                }

                foreach ($ex_ncm as $ncm_aux)
                {
                    if($NCM == preg_replace("/[^0-9]/", "", $ncm_aux))
                    {
                        $exception_aux = true;
                        break;
                    }
                }



                // Pego as exceções para os PRODUTOS
                $ex_product = array();
                if(isset($exception_json->products))
                {
                    if(is_array($exception_json->products))
                    {
                        $ex_product = $exception_json->products;
                    }
                    else 
                    {
                        $ex_product[] = $exception_json->products;
                    }
                }

                if(in_array($prod->id, $ex_product))
                {
                    $exception_aux = true;
                    break;
                }


                // Pego as exceções para os ORIGENS
                $ex_origin = array();
                if(isset($exception_json->origin))
                {
                    if(is_array($exception_json->origin))
                    {
                        $ex_origin = $exception_json->origin;
                    }
                    else 
                    {
                        $ex_origin[] = $exception_json->origin;
                    }
                }
                // TODO: verificar como tratar as origins, pois não temos esse dado no produto nem no pedido
            }

            // Verifico se foi encontrada alguma exceção compatível para o COFINS
            if($exception_aux == true)
            {
                $cst            = $exception_json->ipi_st;
                $pIPI           = number_format(str_replace(',', '.', $exception_json->ipi_aliquota), 2, '.', '');
                $cEnq           = $exception_json->ipi_c_enq;
            }

            // verifico se a classe de enquadramento é nula
            if($cEnq == null)
            {
                $cEnq = 0;
            }
            $nItem  = $prod->nItem;
            $clEnq  = '';
            $cnpjProd = '';
            $cSelo = '';
            $qSelo = '';
            $vBC = number_format($qTrib * $vUnTrib, 2, '.', '');
            $qUnid = '';
            $vUnid = '';
            $vIPI = number_format($vBC * ($pIPI/100), 2, '.', '');
            $resp = $nfe->tagIPI($nItem, $cst, $clEnq, $cnpjProd, $cSelo, $qSelo, $cEnq, $vBC, $pIPI, $qUnid, $vUnid, $vIPI);


            $nItem = $prod->nItem;
            $vTotTrib_prod = number_format($vCOFINS + $vPIS + $vICMS + $vICMSST + $vISSQN,2 , '.', ''); 
            $resp = $nfe->tagimposto($nItem, $vTotTrib_prod);


            // Insiro a TAG de CEST cado tenha Substituição Tributária
            if($substituicao_tributaria == true)
            {
                $resp = $nfe->tagCEST($nItem, preg_replace('/\D/', '', $prod->cest_code));
            }

            // SOMATÓRIOS DOS IMPOSTOS
            $somaCOFINS    += $vCOFINS;
            $somaPIS       += $vPIS;
            $somaICMS      += $vICMS;
            $somaBCICMS    += $vBCICMS;
            $somaBCST      += $vBCST;
            $somaISSQN     += $vISSQN;
            $somaProduto   += $prod->item_total;
        }

        //Inicialização de váriaveis não declaradas...
        //    $vII = isset($vII) ? $vII : 0;
        //    $vIPI = isset($vIPI) ? $vIPI : 0;
        //    $vIOF = isset($vIOF) ? $vIOF : 0;
        //    $vPIS = isset($vPIS) ? $vPIS : 0;
        //    $vCOFINS = isset($vCOFINS) ? $vCOFINS : 0;
        //    $vICMS = isset($vICMS) ? $vICMS : 0;
        //    $vBCST = isset($vBCST) ? $vBCST : 0;
        //    $vST = isset($vST) ? $vST : 0;
        //    $vISS = isset($vISS) ? $vISS : 0;

        //total
        $vBC    = number_format($somaBCICMS, 2, '.', '');
        $vICMS = number_format($somaICMS, 2, '.', '');
        $vISS  = number_format($somaISSQN, 2, '.', '');
        $vICMSDeson = '0.00';
        $vBCST = number_format($somaBCST, 2, '.', '');
        $vST = '0.00';
        $vProd = number_format($somaProduto, 2, '.', '');;//number_format($dadosPedido->subtotal, 2, '.', '');//0.00 //number_format($somaProduto, 2, '.', '');
        $vFrete = (($dadosPedido->freight_by=='Sender' || $dadosPedido->freight_by=='Addressee' || $dadosPedido->freight_by=='The 3rd') && $dadosPedido->freight>0?number_format($dadosPedido->freight, 2, '.', ''):'0.00');
        $vSeg = '0.00';
        $vDesc = number_format($dadosPedido->discount, 2, '.', ''); //'0.00';
        $vII = '0.00';
        $vIPI = '0.00';
        $vIOF = '0.00';
        $vPIS = number_format($somaPIS, 2, '.', ''); // number_format($somaPIS, 2, '.', '');
        $vCOFINS = number_format($somaCOFINS, 2, '.', ''); // number_format($somaCOFINS, 2, '.', '');
        $vOutro = '0.00';
        $vNF = number_format($vProd-$vDesc-$vICMSDeson+$vST+$vFrete+$vSeg+$vOutro+$vII+$vIPI, 2, '.', '');//number_format($vProd-$vDesc-$vICMSDeson+$vST+$vFrete+$vSeg+$vOutro+$vII+$vIPI, 2, '.', '');//$dadosPedido->total; //

        $vTotTrib = number_format($vICMS + $vST + $vII + $vIPI + $vPIS + $vCOFINS + $vIOF + $vISS, 2, '.', '');
        $resp = $nfe->tagICMSTot($vBC, $vICMS, $vICMSDeson, $vBCST, $vST, $vProd, $vFrete, $vSeg, $vDesc, $vII, $vIPI, $vPIS, $vCOFINS, $vOutro, $vNF, $vTotTrib);
        $dCompet = date("Y-m-d");
        $cRegTrib = $dadosEmpresa['company_crt'];
        $vServ = $dadosPedido->subtotal;

        //ISSQNTot
        if($ISSQN_Total == true)
        {
            //$resp = $nfe->tagISSQNTot($vServ, $vBC, $vISS, $vPIS, $vCOFINS, $dCompet, $vDeducao, $vOutro, $vDescIncond, $vDescCond, $vISSRet, $cRegTrib);
            $resp = $nfe->tagISSQNTot($vServ, '', '', '', '', $dCompet, '', '', '', '', '', $cRegTrib);
        }

        //frete
        if($dadosPedido->freight_by!='Free shipping' && $dadosPedido->freight_by!=null && !empty($dadosPedido->freight_by)){
          if($dadosPedido->freight_by!='Sender' ){
               $modFrete = '0'; 
          }else  if($dadosPedido->freight_by!='Addressee' ){
               $modFrete = '1'; 
          }else  if($dadosPedido->freight_by!='The 3rd' ){
               $modFrete = '2'; 
          }else{
              $modFrete = '9';
          }
        }else{
            $modFrete = '9'; //0=Por conta do emitente; 1=Por conta do destinatário/remetente; 2=Por conta de terceiros; 9=Sem Frete;
        }
        $resp = $nfe->tagtransp($modFrete);

        // Defino o peso do pedido
        $resp = $nfe->tagvol($quantidadeTotal,'N/A','N/A','N/A', number_format($pesoLiquido, 3, '.', ''),number_format($pesoBruto, 3, '.', ''));



        //forma de pagamento, comentado, por nao estar emitindo nfc-e ainda
        if ($tipo == 'NFCe') {
            //NFC-e
            //pagamento
            $tPag = str_pad(empty($dadosPedido->paymentmethod) ? '01' : $dadosPedido->paymentmethod, 2, "0", STR_PAD_LEFT); //'01'; //Dinheiro
            $vPag = $dadosPedido->total;
            $rest = $nfe->tagpag($tPag, $vPag);
        //    $tPag = '02'; //Cheque
        //    $vPag = '10.00';
        //    $rest = $nfe->tagpag($tPag, $vPag);
        }


        //*************************************************************
        //Grupo obrigatório para a NFC-e. Não informar para a NF-e.
        //$tPag = '03'; //01=Dinheiro 02=Cheque 03=Cartão de Crédito 04=Cartão de Débito 05=Crédito Loja 10=Vale Alimentação 11=Vale Refeição 12=Vale Presente 13=Vale Combustível 99=Outros
        //$vPag = '1452,33';
        //$resp = $nfe->tagpag($tPag, $vPag);
        //se a operação for com cartão de crédito essa informação é obrigatória
        //$CNPJ = '31551765000143'; //CNPJ da operadora de cartão
        //$tBand = '01'; //01=Visa 02=Mastercard 03=American Express 04=Sorocred 99=Outros
        //$cAut = 'AB254FC79001'; //número da autorização da tranzação
        //$resp = $nfe->tagcard($CNPJ, $tBand, $cAut);
        //**************************************************************
        // Calculo de carga tributária similar ao IBPT - Lei 12.741/12
        $federal = number_format($vII + $vIPI + $vIOF + $vPIS + $vCOFINS, 2, '.', '');
        $estadual = number_format($vICMS + $vST, 2, '.', '');
        $municipal = number_format($vISS, 2, '.', '');
        $totalT = number_format($federal + $estadual + $municipal, 2, '.', '');
        $textoIBPT = "Valor Aprox. Tributos R$ {$totalT} (Federal: R$ {$federal}, Estadual: R$ {$estadual} e Municipal: R$ {$municipal}). ";


        //Informações Adicionais
        //$infAdFisco = "SAIDA COM SUSPENSAO DO IPI CONFORME ART 29 DA LEI 10.637";
        $infAdFisco = $dadosEmpresa['note_obs_nf'];
        $infCpl = " <br/> Fatura $dadosPedido->id " . ($totalT > 0 ? "| {$textoIBPT} " : '');
        $resp = $nfe->taginfAdic($infAdFisco, $infCpl);


        $resp = $nfe->montaNFe();

        if ($resp) {
            $xml = $nfe->getXML();
    //        header('Content-type: text/xml; charset=UTF-8');
    //        echo $xml;exit;
            $filename = getcwd() . "//application//plugins//modulo_fiscal//empresa//NF-e//" . $dadosEmpresa['note_environment'] . "//entradas/{$chave}-nfe.xml";
            file_put_contents($filename, $xml);
            chmod($filename, 0755);

            //assinar a nota
            $xmlAssinada = $nfeTools->assina($xml);
            $filenameAssinada = getcwd() . "//application//plugins//modulo_fiscal//empresa//NF-e//" . $dadosEmpresa['note_environment'] . "//assinada//{$chave}-nfe.xml";
            file_put_contents($filenameAssinada, $xmlAssinada);
            chmod($filenameAssinada, 0755);

            if (!$nfeTools->validarXml($xmlAssinada) || sizeof($nfeTools->errors)) {
                $msg.= "<h3>Erro ao validar XML</h3><br/>";
                foreach ($nfeTools->errors as $erro) {
                    if (is_array($erro)) {
                        foreach ($erro as $err) {
                            $msg.= "$err <br>";
                        }
                    } else {
                        $msg.= "$erro <br>";
                    }
                }
                r2($url_retorno, 'e', 'Pedido: ' . $dadosPedido['id'] . '<br/> ' . $msg);
            } else {
                //  Enviar Sefaz

                if ($tipo == 'NFe') {
                    //NF-e
                    $nfeTools->setModelo('55');
                } else {
                    //NFC-e
                    $nfeTools->setModelo('65');
                }


                $aResposta = array();
                $idLote = '';
                $indSinc = '0';  //indica sincronização 0 retorna nRec e codigo como 103 sucesso
                $flagZip = false;

                $retorno = $nfeTools->sefazEnviaLote($xmlAssinada, $tpAmb, $idLote, $aResposta, $indSinc, $flagZip);

                // echo '<br><br><pre>';
                //echo htmlspecialchars($nfesefaz->soapDebug);
                // echo '</pre><br><br><pre>';
                //lote recebido
                if ($aResposta["cStat"] == 103) {
                    $aRespostarecibo = array();
                    $recibo = $aResposta["nRec"];
                    $retorno = $nfeTools->sefazConsultaRecibo($recibo, $tpAmb, $aRespostarecibo);
                    if ($aRespostarecibo["cStat"] == 104) {
                        sleep(3);//aguarda 3 segundos e tenta novamente recuperar os dados
                        //validação para caso esteja lento 
                        $retorno = $nfeTools->sefazConsultaRecibo($recibo, $tpAmb, $aRespostarecibo);
                    }

                    if ($aRespostarecibo["cStat"] == 104) {
                        if ($aRespostarecibo["aProt"][0]["cStat"] == 539) {
                            r2($url_retorno, 'e', 'Pedido: ' . $dadosPedido['id'] . '<br/> Número de Nota já enviado, verificar numero da nota em configurações do módulo Fiscal <br/>' . $aRespostarecibo["aProt"][0]["xMotivo"]);
                            echo "Id de Nota já enviado, verificar numero da nota em configurações do módulo Fiscal <br/> " . $aRespostarecibo["aProt"][0]["xMotivo"];
                            echo "<br/>" . $aResposta["xMotivo"];
                            echo '<br><br><pre>';
                            echo htmlspecialchars($nfeTools->soapDebug);
                            echo '</pre><br><br><pre>';
                            print_r($aRespostarecibo);
                            echo "</pre><br>";
                        } else if ($aRespostarecibo["aProt"][0]["cStat"] == 100) {
    //                     echo "nota Ok <br/>" .$aRespostarecibo["aProt"][0]["xMotivo"];
    //                     echo "<br/>".$aResposta["xMotivo"];   
    //                     echo '<br><br><pre>';
    //                     echo htmlspecialchars($nfeTools->soapDebug);
    //                     echo '</pre><br><br><pre>';
    //                     print_r($aRespostarecibo);
    //                     echo "</pre><br>";

                          //  $aResposta = array();
                            $indSinc = '0'; //0=asíncrono, 1=síncrono
                            $pasta = date('Ym');

                            $pathNFefile = $nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//assinada//{$chave}-nfe.xml";
                            if (!$indSinc) {
                                $pathProtfile = $nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//temporarias//" . $pasta . "//{$recibo}-retConsReciNFe.xml";
                            } else {
                                $pathProtfile = $nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//temporarias//" . $pasta . "//{$recibo}-retEnviNFe.xml";
                            }

                            $saveFile = true;
                            $retorno = $nfeTools->addProtocolo($pathNFefile, $pathProtfile, $saveFile);


    //                    echo '<br><br><pre>';
    //                    echo htmlspecialchars($retorno);
    //                    echo "</pre><br>";

    //                        $saida = isset($_REQUEST['o']) ? $_REQUEST['o'] : 'pdf'; //pdf ou html
    //
    //                        $ecoNFCe = false; //false = Não (NFC-e Completa); true = Sim (NFC-e Simplificada)
    //                        $xmlProt = $nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//enviadas//aprovadas//" . $pasta . "//{$chave}-protNFe.xml";
    //                        // Uso da nomeclatura '-danfce.pdf' para facilitar a diferenciação entre PDFs DANFE e DANFCE salvos na mesma pasta...
    //                        $pdfDanfe = $nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//pdf//" . $pasta . "//{$chave}-danfe.pdf";

                            //cria a pasta para guardar a nfe
    //                        if (!is_dir($nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//pdf//" . $pasta)) {
    //                            if (!mkdir($nfeTools->aConfig['pathNFeFiles'] . "//" . $dadosEmpresa['note_environment'] . "//pdf//" . $pasta, 0777)) {
    //                                throw new Exception\RuntimeException(
    //                                "Não foi possivel criar o diretorio $folder. Verifique as permissões"
    //                                );
    //                            }
    //                        }
                            //   $docxml = NFePHP\Common\Files\FilesFolders::readFile($xmlProt);
                            //gera o danfe e salva 
    //                        if ($tipo == 'NFe') {
    //                            $danfe = new NFePHP\Extras\Danfe($docxml, 'P', 'A4', $nfeTools->aConfig['aDocFormat']->pathLogoFile, 'I', '');
    //                            $id = $danfe->montaDANFE();
    //                            $salva = $danfe->printDANFE($pdfDanfe, 'F'); //Salva o PDF na pasta
    //                        } else {
    //                            $ecoNFCe = false; //false = Não (NFC-e Completa); true = Sim (NFC-e Simplificada)
    //                            $docxml = NFePHP\Common\Files\FilesFolders::readFile($xmlProt);
    //                            $danfce = new NFePHP\Extras\Danfce($docxml, '', 2);
    //                            //ajuste para passar o danfce
    //                            $id = $danfce->montaDANFCE($ecoNFCe, $nfeTools);
    //                            $salva = $danfce->printDANFCE('pdf', $pdfDanfe, 'F'); //Salva na pasta pdf
    //                        }
                            //GRAVAR EMISSÃO DA NFE
                            $nota = ORM::for_table('app_fiscal_note')->create();
                            $nota->number_note = ($tipo == 'NFe' ? $dadosEmpresa['note_number_nfe'] : $dadosEmpresa['note_number_nfce']);
                            $nota->series = ($tipo == 'NFe' ? $dadosEmpresa['note_series_nfe'] : $dadosEmpresa['note_series_nfce']);
                            $nota->type = ($tipo == 'NFe' ? 'NFe' : 'NFCe');
                            $nota->issuance_date = date('Y-m-d H:i:s',strtotime($dhEmi));
                            $nota->amount = $dadosPedido->total;
                            $nota->account = $dadosCliente->account;
                            $nota->id_account = $dadosCliente->id;
                            $nota->key = $chave;
                            $nota->status = 'Autorizada';
                            $nota->receipt_number = $recibo;
                            $nota->protocol_number = $aRespostarecibo["aProt"][0]["nProt"];
                            $nota->pasta = $pasta;
                            $nota->code_status = $aRespostarecibo["aProt"][0]["cStat"];
                            $nota->invoice_id = $dadosPedido->id;
                            $nota->environment = $dadosEmpresa['note_environment'];
                            $nota->save();

                            //atualiza o numero da nota em ap_fiscal_config
                            if ($tipo == 'NFe') {
                                $d = ORM::for_table('app_fiscal_config')->where('key', 'note_number_nfe')->find_one();
                                $d->value = $dadosEmpresa['note_number_nfe'] + 1;
                                $d->save();

                                $tpAmb =  $nfeTools->aConfig['tpAmb'];;
                                $xJust = '';
                                $tpEvento = '210210'; //ciencia da operação
                                $aResposta = array();
                                $xml = $nfeTools->sefazManifesta($chave, $tpAmb, $xJust = '', $tpEvento , $aResposta);
                            } else {
                                $d = ORM::for_table('app_fiscal_config')->where('key', 'note_number_nfce')->find_one();
                                $d->value = $dadosEmpresa['note_number_nfce'] + 1;
                                $d->save();
                            }

                            _log($aResposta["xMotivo"].'<br/>Nota Emitida' . " " . 'Nota Autorizada' . ' [ID: ' . $nota->id, $user['fullname'], $user['id']);
                            //  $abre = $danfe->printDANFE("{$id}-danfe.pdf", 'D'); //I Abre o PDF no Navegador D- Download
                            r2($url_retorno, 's', 'Nota Emitida' . " Fatura: $dadosPedido->id | Nº Nota : " . $nota->number_note . " | Cod. Status: " . $aRespostarecibo["aProt"][0]["cStat"] . " | Status: " . $aRespostarecibo["aProt"][0]["xMotivo"] . " ");
                        } else {
                            r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Dados Inválidos<br/>' . $aRespostarecibo["aProt"][0]["xMotivo"]);

                            echo "Dados Inválidos <br/> " . $aRespostarecibo["aProt"][0]["xMotivo"];
                            echo "<br/>" . $aResposta["xMotivo"];
                            echo '<br><br><pre>';
                            echo htmlspecialchars($nfeTools->soapDebug);
                            echo '</pre><br><br><pre>';
                            print_r($aRespostarecibo);
                            echo "</pre><br>";
                        }
                    } else {
                       // r2(U . 'invoices/list/', 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Erro ao consultar Recibo<br/>' . $aResposta["xMotivo"]);
                        echo "Erro ao consultar Recibo<br/><br/><br/>";
                        echo "" . $aResposta["xMotivo"];
                        echo '<br><br><pre>';
                        echo htmlspecialchars($nfeTools->soapDebug);
                        echo '</pre><br><br><pre>';
                        print_r($aRespostarecibo);
                        echo "</pre><br>";
                    }
                } else {
                    r2($url_retorno, 'e', 'Fatura: ' . $dadosPedido->id . '<br/> Erro ao enviar a SEFAZ<br/>' . $aResposta["xMotivo"]);

                    echo "Erro ao enviar a SEFAZ<br/><br/><br/>";
                    echo "<br/>" . $aResposta["xMotivo"];
                    echo '<br><br><pre>';
                    echo htmlspecialchars($nfeTools->soapDebug);
                    echo '</pre><br><br><pre>';
                    print_r($aResposta);
                    echo "</pre><br>";
                }
            }
        } else {
            header('Content-type: text/html; charset=UTF-8');
            foreach ($nfe->erros as $err) {
                echo 'tag: &lt;' . $err['tag'] . '&gt; ---- ' . $err['desc'] . '<br>';
            }
        }
    }
} catch (Exception $e) {
    r2($url_retorno, 'e', 'Fatura: ' . $id . '<br/>' . $e->getMessage());
}

Anon7 - 2022
AnonSec Team