| 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 : |
<?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: <' . $err['tag'] . '> ---- ' . $err['desc'] . '<br>';
}
}
} catch (Exception $e) {
r2(U . 'invoices/view/' . $id, 'e', 'Fatura: ' . $id . '<br/>' . $e->getMessage());
}