AnonSec Shell
Server IP : 162.214.74.102  /  Your IP : 216.73.216.59
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/www/lrsys_apps/mundotennis/application/plugins/modulo_fiscal/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/lrsys/www/lrsys_apps/mundotennis/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.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 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);

    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) {

        $dadosEstadoCliente = ORM::for_table('state')->where('id', $address[0]->state_id)->find_many()->limit(1);
        $dadosEstadoCliente = $dadosEstadoCliente[0];

        $dadosCidadeCliente = ORM::for_table('city')->where('id', $address[0]->city_id)->find_many()->limit(1);
        $dadosCidadeCliente = $dadosCidadeCliente[0];
    } else {
        $dadosCidadeCliente = null;
        $dadosEstadoCliente = null;
    }
    $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(U . 'invoices/view/'.$dadosPedido->id, '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) ? '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';
        
        
        
        // #######################################
        // 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 = str_pad(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj), 14, "0", STR_PAD_LEFT); //'23401454000170';
                $nfse['DadosTomador']['CpfCnpj'] = '<Cnpj>'.$CNPJ.'</Cnpj>';
            } else {
                $CPF = str_pad(preg_replace('/\D/', '', $dadosCliente->cpf_cnpj), 11, "0", STR_PAD_LEFT);
                $nfse['DadosTomador']['CpfCnpj'] = '<Cpf>'.$CPF.'</Cpf>';
            }
        }
        else
        {
            //TODO: tratar para estrangeiros
            echo "NÃO HABILITADO PARA ESTRANGEIROS";exit;
        }
        
        
        $nfse['DadosTomador']['RazaoSocial'] = $dadosCliente->account;
        $nfse['DadosTomador']['Logradouro'] = $xLgr.', '.$nro;
        $nfse['DadosTomador']['Municipio']['CodigoMunicipioIBGE'] = $cMun;
        $nfse['DadosTomador']['Municipio']['Descricao'] = $xMun;
        $nfse['DadosTomador']['Municipio']['Uf'] = $UF;
        $nfse['DadosTomador']['Municipio']['Cep'] = $CEP;
        $nfse['DadosTomador']['Contato']['Telefone'] = $fone;
        
        // 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';
        
        
        
        /// ######################################################################
        $xml = '<?xml version="1.0" encoding="utf-8" ?>
                    <GerarNfseEnvio xmlns="http://www.agili.com.br/nfse_v_1.00.xsd">
                        <UnidadeGestora>'.$UnidadeGestora.'</UnidadeGestora>
                        <DeclaracaoPrestacaoServico>
                            <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>';
        
//        header("Content-Type: application/xml") ;
        
//        echo($xml);exit;
        
        //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(U . 'invoices/list/', '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(U . 'invoices/list/', '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//producao//". "//assinada//{$xml_retorno->Nfse->CodigoAutenticidade}-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(U . 'invoices/view/'.$dadosPedido->id, 's', 'Nota Emitida' . " Fatura: $dadosPedido->id | Nº Nota : " . $nota->number_note . " | Cod. Status: " . $nota->code_status . " | Status: " . $nota->status . " ");
            }
        }
        /// ######################################################################
        
        
    }
    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(U . 'invoices/list/', '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(U . 'invoices/list/', '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(U . 'invoices/list/', 's', 'Nota Emitida' . " Fatura: $dadosPedido->id | Nº Nota : " . $nota->number_note . " | Cod. Status: " . $aRespostarecibo["aProt"][0]["cStat"] . " | Status: " . $aRespostarecibo["aProt"][0]["xMotivo"] . " ");
                    } else {
                        r2(U . 'invoices/list/', '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(U . 'invoices/list/', '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(U . 'invoices/view/' . $id, 'e', 'Fatura: ' . $id . '<br/>' . $e->getMessage());
}

Anon7 - 2022
AnonSec Team