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/gasch/application/plugins/modulo_fiscal/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/lrsys/public_html/lrsys_apps/gasch/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;
    }

    $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'];
    }

    $stateCompany = ORM::for_table('state')->find_one($dadosEmpresa['company_state_id']);
    $cityCompany = ORM::for_table('city')->find_one($dadosEmpresa['company_city_id']);

    //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/>';
    }
    
    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/>";
    }


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



    //   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


    $cUF = $stateCompany->code_state; //'52'; //codigo numerico do estado
    $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.
        $natOp = 'Venda'; //natureza da operação
        if ($dadosEstadoCliente->id == $stateCompany->id) {
            $idDest = '1'; //1=Operação interna; 2=Operação interestadual; 3=Operação com exterior.
        } else {
            $idDest = '2'; //1=Operação interna; 2=Operação interestadual; 3=Operação com exterior.
        }
        $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.
    } else {
        //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; //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


    $cMunFG = $cityCompany->city_ibge; //'5200258';

    $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.


    $finNFe = '1'; //1=NF-e normal; 2=NF-e complementar; 3=NF-e de ajuste; 4=Devolução/Retorno.
    $indFinal = '1'; //0=Normal; 1=Consumidor final;

    $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';
    $resp = $nfe->taginfNFe($chave, $versao);

    $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.
//tag IDE
    $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);


    $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']; //$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);
//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
    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 = $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;
    $somaProduto = 0;
    $i = 1;
    $valorDesconto = $dadosPedido->discount;
    //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, '.', ''):'');
    foreach ($dadosItemsPedidos as $prod) {
        //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'];
        $CFOP = preg_replace('/\D/', '', $prod->cfop); // $prod['CFOP'];
        $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
        $vFrete = $valorFreteproduto; // $prod['vFrete'];
        //atribui valor para os demais itens da nota como ''
           $valorFreteproduto='';
        $vSeg = ''; // $prod['vSeg'];
        $vDesc = $decontoProduto; // $prod['vDesc'];
        $vOutro = ''; // $prod['vOutro']; 

        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'];
        $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);

        //Cálculo dos impostos para cada produto
//    //imposto
//    //ICMSSN - Tributação ICMS pelo Simples Nacional - CSOSN 500
//    $nItem = $prod->nItem;
//    $orig = '0';
//    $csosn = '500'; //ICMS cobrado anteriormente por substituição tributária (substituído) ou por antecipação
//    $modBC = '1';
//    $pRedBC = '';
//    $vBC = ''; //12.00 = $qTrib * $vUnTrib 
//    $pICMS = ''; //19.00 = 17% Alíquota Interna + 2% FECP
//    $vICMS = ''; //2.28 = $vBC * ( $pICMS / 100 )
//    $pCredSN = '';
//    $vCredICMSSN = '';
//    $modBCST = '';
//    $pMVAST = '';
//    $pRedBCST = '';
//    $vBCST = '';
//    $pICMSST = ''; //27.00 = GO para GO
//    $vICMSST = '';
//    $vBCSTRet = $prod->item_total; // Pauta do Chope Claro 1000ml em GO R$ 8,59 x 0.660 Litros
//    $vICMSSTRet = '0.96'; // = (Valor da Pauta * Alíquota ICMS ST) - Valor ICMS Próprio
//    $resp = $nfe->tagICMSSN($nItem, $orig, $csosn, $modBC, $vBC, $pRedBC, $pICMS, $vICMS, $pCredSN, $vCredICMSSN, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $vBCSTRet, $vICMSSTRet);
        //ISSQN
        $nItem = $prod->nItem;
        $vBC = '0.00';
        $vAliq = '0.0000';
        $vISSQN = '0.00';
        $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
        //PIS
        $nItem = $prod->nItem;
        $cst = str_pad($prod->cst_pis_cofins, 2, "0", STR_PAD_LEFT); //'01'; //Operação Tributável (base de cálculo = (valor da operação * alíquota normal) / 100
        $vBC = '0.00';
        $pPIS = '0.0000';
        $vPIS = '0.00';
        $qBCProd = '';
        $vAliqProd = '';
        $resp = $nfe->tagPIS($nItem, $cst, $vBC, $pPIS, $vPIS, $qBCProd, $vAliqProd);

        //COFINS
        $nItem = $prod->nItem;
        $cst = str_pad($prod->cst_pis_cofins, 2, "0", STR_PAD_LEFT); //'01'; //Operação Tributável (base de cálculo = (valor da operação * alíquota normal) / 100
        $vBC = '0.00';
        $pCOFINS = '0.0000';
        $vCOFINS = '0.00';
        $qBCProd = '';
        $vAliqProd = '';
        $resp = $nfe->tagCOFINS($nItem, $cst, $vBC, $pCOFINS, $vCOFINS, $qBCProd, $vAliqProd);

        $nItem = $prod->nItem;
        $resp = $nfe->tagimposto($nItem);


        //  $somaCOFINS    += $vCOFINS;
        //  $somaPIS       += $vPIS;
        //  $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 = '0.00';
    $vICMS = '0.00';
    $vICMSDeson = '0.00';
    $vBCST = '0.00';
    $vST = '0.00';
    $vProd = '0.00';//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';
    $vPIS = '0.00'; // number_format($somaPIS, 2, '.', '');
    $vCOFINS = '0.00'; // number_format($somaCOFINS, 2, '.', '');
    $vOutro = '0.00';
    $vNF = $dadosPedido->total;//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
//$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);


//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} Federal, {$estadual} Estadual e {$municipal} Municipal. ";

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


    $resp = $nfe->montaNFe();

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

        //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, 0777);

        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