util = $util; } public function index(){ $firstDate = date('Y-m')."-01"; $lastDate = date("Y-m-t"); return view('sped.index', compact('firstDate', 'lastDate')); } public function store(Request $request){ $sped = ''; $dataInicial = $request->data_inicial; $dataFinal = $request->data_final; $inventario = $request->inventario; $dataInventario = $request->data_inventario; $motivoInventario = $request->motivo_inventario; $config = Empresa::findOrFail($request->empresa_id); $cnpj = preg_replace('/[^0-9]/', '', $config->cpf_cnpj); $dInicial = \Carbon\Carbon::parse($dataInicial)->format('dmY'); $dFinal = \Carbon\Carbon::parse($dataFinal)->format('dmY'); $mesRef = \Carbon\Carbon::parse($dataFinal)->format('mY'); $spedConfig = SpedConfig::where('empresa_id', $request->empresa_id) ->first(); $std = new \stdClass(); $std->COD_VER = '019'; $std->COD_FIN = '0'; $std->DT_INI = $dInicial; $std->DT_FIN = $dFinal; $std->NOME = $config->nome; $std->CNPJ = $cnpj; $std->CPF = ''; $std->UF = $config->cidade->uf; $std->IE = $config->ie; $std->COD_MUN = $config->cidade->codigo; $std->IM = ''; $std->SUFRAMA = ''; $std->IND_PERFIL = 'B'; $std->IND_ATIV = '1'; try { $z0000 = new Z0000($std); $sped .= $z0000; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $std = new \stdClass(); $std->IND_MOV = '0'; try { $z0001 = new Z0001($std); $sped .= $z0001; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $std = new \stdClass(); $std->FANTASIA = $config->nome_fantasia; $std->CEP = preg_replace('/[^0-9]/', '', $config->cep); $std->END = $config->rua; $std->NUM = $config->numero; $std->COMPL = $config->complemento; $std->BAIRRO = $config->bairro; $std->FONE = preg_replace('/[^0-9]/', '', $config->fone); // $std->FAX = $config->fone; $std->EMAIL = $config->email; try { $z0005 = new Z0005($std); $sped .= $z0005; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $contador = EscritorioContabil::where('empresa_id', $request->empresa_id)->first(); if($contador == null){ session()->flash("flash_error", "Configure o contador primeiro!"); return redirect()->route('escritorio-contabil.index'); } $std = new \stdClass(); $std->NOME = $contador->razao_social; $doc = preg_replace('/[^0-9]/', '', $contador->cnpj); $std->CNPJ = $doc; if($contador->cpf != ""){ $std->CPF = preg_replace('/[^0-9]/', '', $contador->cpf); } $std->CRC = $contador->crc; $std->CEP = preg_replace('/[^0-9]/', '', $contador->cep); $std->END = $contador->logradouro; $std->NUM = $contador->numero; // $std->COMPL = $contador->contabilidade_xCpl; $std->BAIRRO = $contador->bairro; $fone = preg_replace('/[^0-9]/', '', $contador->fone); $std->FONE = $fone; // $std->FAX = $fone; $std->EMAIL = $contador->email; $std->COD_MUN = $contador->cidade->codigo; try { $z0100 = new Z0100($std); $sped .= $z0100; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $vendas = Nfe::whereDate('data_emissao', '>=', $dataInicial) ->whereDate('data_emissao', '<=', $dataFinal) ->where('estado', 'aprovado') ->where('empresa_id', $request->empresa_id) ->where('tpNF', 1) ->get(); $vendasPdv = Nfce::whereDate('data_emissao', '>=', $dataInicial) ->whereDate('data_emissao', '<=', $dataFinal) ->where('estado', 'aprovado') ->where('empresa_id', $request->empresa_id) ->get(); $compras = Nfe::whereDate('data_emissao', '>=', $dataInicial) ->whereDate('data_emissao', '<=', $dataFinal) ->where('estado', 'aprovado') ->where('empresa_id', $request->empresa_id) ->where('tpNF', 0) ->where('chave_importada', '') ->get(); $comprasImportadas = Nfe::whereDate('data_emissao', '>=', $dataInicial) ->whereDate('data_emissao', '<=', $dataFinal) // ->where('estado', 'aprovado') ->where('empresa_id', $request->empresa_id) ->where('tpNF', 0) ->where('chave_importada', '!=' ,'') ->get(); // dd($comprasImportadas); $comprasManifesto = []; $produtosAdicionados = []; $unidadesAdicionadas = []; $speedService = new SpeedService($config); $dataXml = []; foreach($vendas as $v){ $xml = $speedService->getXml($v, 'xml_nfe/'); $temp = [ 'xml_importado' => 0, 'tipo' => 'venda', 'xml' => $xml ]; if($xml != null){ array_push($dataXml, $temp); } } foreach($vendasPdv as $v){ $xml = $speedService->getXml($v, 'xml_nfce/'); if($xml != null){ $temp = [ 'xml_importado' => 0, 'tipo' => 'pdv', 'xml' => $xml ]; array_push($dataXml, $temp); } } foreach($compras as $v){ $xml = $speedService->getXml($v, 'xml_entrada_emitida/'); if($xml != null){ $temp = [ 'xml_importado' => 0, 'tipo' => 'compra', 'xml' => $xml ]; array_push($dataXml, $temp); } } foreach($comprasImportadas as $v){ $xml = $speedService->getXml($v, 'xml_entrada/', 'chave_importada'); if($xml != null){ $temp = [ 'xml_importado' => 1, 'tipo' => 'compra', 'xml' => $xml, 'compra' => $v ]; array_push($dataXml, $temp); } } foreach($comprasManifesto as $v){ $xml = $speedService->getXml($v, 'xml_dfe/', 'chave_importada'); if($xml != null){ $temp = [ 'xml_importado' => 1, 'tipo' => 'compra', 'xml' => $xml, 'compra' => $v ]; array_push($dataXml, $temp); } } $destAdicionados = []; $codPart = 1; $dataDestinatarios = []; foreach($dataXml as $l){ $mod = null; try{ $mod = $l['xml']->NFe->infNFe->ide->mod; }catch(\Exception $e){ } if($mod == 55){ if($l['tipo'] == 'compra'){ $destinatario = $speedService->getEmitente($l['xml']); }else{ $destinatario = $speedService->getDestinatario($l['xml']); } $docDestinatario = isset($destinatario->CNPJ) ? $destinatario->CNPJ : $destinatario->CPF; // dd($destinatario); $docDestinatario = (string)$docDestinatario; if (!in_array($docDestinatario, $destAdicionados)){ array_push($destAdicionados, $docDestinatario); if($l['tipo'] == 'compra'){ $clienteDatabase = $this->util->getFornecedor($docDestinatario, $this->empresa_id); }else{ $clienteDatabase = $this->util->getCliente($docDestinatario, $this->empresa_id); } // $codPart = rand(0, 100000); // if($clienteDatabase != null){ // $codPart = $clienteDatabase->id; // } $temp = [ 'COD_PART' => (string)$codPart, 'DOC' => (string)$docDestinatario ]; array_push($dataDestinatarios, $temp); // echo "sim"; $std = new \stdClass(); $std->COD_PART = (string)$codPart; $std->COD_PAIS = '1058'; $std->NOME = (string)$destinatario->xNome; if (strlen($docDestinatario) == 11){ $std->CPF = $docDestinatario; }else{ $std->CNPJ = $docDestinatario; } if($l['tipo'] == 'compra'){ $endereco = $destinatario->enderEmit; }else{ $endereco = $destinatario->enderDest; } $std->IE = (string)$destinatario->IE; $std->COD_MUN = (string)$endereco->cMun; $std->SUFRAMA = ''; $std->END = (string)$endereco->xLgr; $std->NUM = (string)$endereco->nro; $std->COMPL = ''; $std->BAIRRO = (string)$endereco->xBairro; try { $z0150 = new Z0150($std); $sped .= $z0150; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $codPart++; } } } // dd($dataDestinatarios); $sz0200 = ''; $sz0190 = ''; $uncom = []; $estoque = []; foreach($dataXml as $l){ $itens = $speedService->getItemNfe($l['xml']); foreach($itens as $item){ $prod = $item->prod; $imposto = $item->imposto; $cProd = (string)$prod->cProd; $cProd = str_replace(".", "_", $cProd); $cProd = str_replace("/", "_", $cProd); $cProd = str_replace("'", "_", $cProd); $cProd = str_replace("-", "_", $cProd); $cProd = str_replace("(", "", $cProd); $cProd = str_replace(")", "", $cProd); $cProd = str_replace(" ", "", $cProd); $cProd = str_replace(":", "", $cProd); $cProd = str_replace("[", "", $cProd); $cProd = str_replace("]", "", $cProd); $cProd = str_replace("'", "", $cProd); // $estoqueProduto = Estoque::where('produto_id', $cProd)->first(); $p = Produto::where('referencia_xml', $cProd)->where('empresa_id', $request->empresa_id) ->first(); $estoqueProduto = null; if($p){ $estoqueProduto = $p->estoque; }else{ $xProd = (string)$prod->xProd; $p = Produto::where('nome', $xProd)->where('empresa_id', $request->empresa_id) ->first(); if($p){ $estoqueProduto = $p->estoque; } } // $spedConfig && $spedConfig->gerar_bloco_k ver depois if($l['xml_importado'] == 1 || (($estoqueProduto != null && $estoqueProduto->quantidade > 0) && $inventario == 1)){ $arr = (array_values((array)$imposto->ICMS)); $cst_csosn = $arr[0]->CST ? $arr[0]->CST : $arr[0]->CSOSN; $pICMS = $arr[0]->pICMS ?? 0; $unid = strtoupper((string)$prod->uCom); if (!in_array($unid, $unidadesAdicionadas)){ array_push($unidadesAdicionadas, $unid); $std = new \stdClass(); $std->UNID = $unid; // if($prod->uCom == 'UNID'){ // $prod->uCom = 'UN'; // } $std->DESCR = 'UNIDADE DE MEDIDA ' . $unid; try { $z0190 = new Z0190($std); $sz0190 .= $z0190; $sz0190 .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } if (!in_array((string)$prod->cProd, $produtosAdicionados)){ array_push($produtosAdicionados, (string)$prod->cProd); $qtdEstoque = 0; $cProd = (string)$prod->cProd; $cProd = str_replace(".", "_", $cProd); $cProd = str_replace("/", "_", $cProd); $cProd = str_replace("'", "_", $cProd); $cProd = str_replace("-", "_", $cProd); $cProd = str_replace("(", "", $cProd); $cProd = str_replace(")", "", $cProd); $cProd = str_replace(" ", "", $cProd); $cProd = str_replace(":", "", $cProd); $cProd = str_replace("[", "", $cProd); $cProd = str_replace("]", "", $cProd); $cProd = str_replace("'", "", $cProd); $p = Produto::where('referencia_xml', $cProd)->where('empresa_id', $request->empresa_id) ->first(); $pId = null; if($p == null){ $xProd = (string)$prod->xProd; $p = Produto::where('nome', $xProd)->where('empresa_id', $request->empresa_id) ->first(); if($p){ $estoqueProduto = $p->estoque; } } if($p != null){ $pId = $p->id; } if($p && $p->estoque){ $qtdEstoque = $p->estoque->quantidade; } $estoque[] = ["produto" => (string)$prod->cProd, "quantidade" => $qtdEstoque, "id" => $pId]; $std = new \stdClass(); $codBarras = (string)$prod->cEAN; $std->COD_ITEM = strtoupper((string)$prod->cProd); // dd((string)$prod->cProd); $std->DESCR_ITEM = (string)$prod->xProd; $std->COD_BARRA = $codBarras; $std->COD_ANT_ITEM = ''; if ($prod->uCom == ''){ $std->UNID_INV = 'UN'; }else{ $std->UNID_INV = strtoupper((string)$prod->uCom); } $std->TIPO_ITEM = '00'; if($p == null){ $p = Produto::where('nome', $std->DESCR_ITEM)->where('empresa_id', $request->empresa_id)->first(); } if($p != null){ if($p->tipo_item_sped){ $std->TIPO_ITEM = $p->tipo_item_sped; } } $std->COD_NCM = (string)$prod->NCM; $std->EX_IPI = ''; $std->COD_GEN = substr($prod->NCM, 0, 2); $std->COD_LST = ''; $std->ALIQ_ICMS = (float)$pICMS; $std->CEST = trim((string)$prod->CEST); try { $z0200 = new Z0200($std); $sz0200 .= $z0200; $sz0200 .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } } } } $sped .= $sz0190; $sped .= $sz0200; $total000 = $this->totalizeBloco($sped, '0'); $sped .= '|0990|' . $total000 . '|'; $sped .= "\r\n"; $sped .= '|B001|1|'; $sped .= "\r\n"; $sped .= '|B990|2|'; $sped .= "\r\n"; $std = new \stdClass(); $std->IND_MOV = '0'; try { $c001 = new C001($std); $sped .= $c001; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } //FIM C001 $somaICMSSaida = 0; $somaICMSEntrada = 0; foreach($dataXml as $key => $l){ $dataC190 = []; $ide = $speedService->getIde($l['xml']); $chave = $speedService->getChave($l['xml']); $total = $speedService->getTotal($l['xml']); $destinatario = $speedService->getDestinatario($l['xml']); if($l['tipo'] == 'compra'){ $destinatario = $speedService->getEmitente($l['xml']); } $emit = $speedService->getEmitente($l['xml']); $docEmit = isset($emit->CNPJ) ? (string)$emit->CNPJ : (string)$emit->CPF; $std = new \stdClass(); // echo $ide->tpNF . "
"; $std->IND_OPER = $l['tipo'] == 'compra' ? 0 : 1; $std->IND_EMIT = $cnpj == $docEmit ? 0 : 1; $std->COD_PART = null; $std->VL_BC_ICMS_ST = null; $std->VL_ICMS_ST = null; $std->VL_IPI = null; $std->VL_PIS = null; $std->VL_COFINS = null; $std->VL_PIS_ST = null; $std->VL_COFINS_ST = null; if ($ide->mod == '65'){ $std->IND_OPER = 1; $std->COD_PART = null; $std->VL_BC_ICMS_ST = null; $std->VL_ICMS_ST = null; $std->VL_IPI = null; $std->VL_PIS = null; $std->VL_COFINS = null; $std->VL_PIS_ST = null; $std->VL_COFINS_ST = null; $dhEmi = substr((string)$ide->dhEmi, 0, 10); $dhSaiEnt = substr((string)$ide->dhEmi, 0, 10); }else{ $codPart = null; $docDestinatario = isset($destinatario->CNPJ) ? $destinatario->CNPJ : $destinatario->CPF; foreach($dataDestinatarios as $d){ if($docDestinatario == $d['DOC']){ $codPart = $d['COD_PART']; } } $std->COD_PART = $codPart; $std->VL_BC_ICMS_ST = (float)$total->vBCST; $std->VL_ICMS_ST = (float)$total->vST; $std->VL_IPI = (float)$total->vIPI; $std->VL_PIS = (float)$total->vPIS; $std->VL_COFINS = (float)$total->vCOFINS; $std->VL_PIS_ST = '0.00'; $std->VL_COFINS_ST = '0.00'; $dhEmi = substr((string)$ide->dhEmi, 0, 10); $dhSaiEnt = substr((string)$ide->dhSaiEnt, 0, 10); if($l['tipo'] == 'compra'){ $compra = $this->getCompra($chave, $l['xml_importado']); if($compra){ $dhSaiEnt = substr((string)$compra->created_at, 0, 10); } } } if ($ide->finNFe == '2'){ $std->COD_SIT = '06'; }else{ $std->COD_SIT = '00'; } $std->COD_MOD = (string)$ide->mod; $std->COD_SIT = '00'; $std->SER = (string)$ide->serie; $std->NUM_DOC = (string)$ide->nNF; $std->CHV_NFE = $chave; if(isset($l['compra'])){ $dhEmi = \Carbon\Carbon::parse($l['compra']->data_emissao)->format('dmY'); $dhSaiEnt = \Carbon\Carbon::parse($l['compra']->data_emissao)->format('dmY'); }else{ $dhEmi = \Carbon\Carbon::parse($dhEmi)->format('dmY'); $dhSaiEnt = \Carbon\Carbon::parse($dhSaiEnt)->format('dmY'); } $std->DT_DOC = $dhEmi; $std->DT_E_S = $dhSaiEnt; $std->VL_DOC = (float)$total->vNF; $std->IND_PGTO = '2'; $std->VL_DESC = (float)$total->vDesc; $std->VL_ABAT_NT = '0.00'; $std->VL_MERC = (float)$total->vProd; $std->IND_FRT = '3'; $std->VL_FRT = (float)$total->vFrete; $std->VL_SEG = (float)$total->vSeg; $std->VL_OUT_DA = (float)$total->vOutro; $std->VL_BC_ICMS = (float)$total->vBC; $std->VL_ICMS = (float)$total->vICMS; if($std->VL_ICMS > 0 && $l['tipo'] != 'compra'){ $somaICMSSaida += $std->VL_ICMS; } if($std->VL_ICMS > 0 && $l['tipo'] == 'compra'){ $somaICMSEntrada += $std->VL_ICMS; } try { $c100 = new C100($std); $sped .= $c100; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $itens = $speedService->getItemNfe($l['xml']); $cont = 0; //c170 if ($l['xml_importado'] == 1){ foreach($itens as $item){ $cont++; $prod = $item->prod; $imposto = $item->imposto; $std = new \stdClass(); $std->NUM_ITEM = $cont; $std->COD_ITEM = strtoupper((string)$prod->cProd); $std->DESCR_COMPL = strtoupper((string)$prod->xProd); $std->QTD = (float)$prod->qCom; $std->UNID = strtoupper((string)$prod->uCom); $std->VL_ITEM = (float)$prod->vProd; $std->VL_DESC = (float)$prod->vDesc; $std->IND_MOV = '0'; $arr = (array_values((array)$imposto->ICMS)); $vBC = isset($arr[0]->vBC) ? (float)$arr[0]->vBC : 0; $vBCST = isset($arr[0]->vBCST) ? (float)$arr[0]->vBCST : 0; $vICMSST = isset($arr[0]->vICMSST) ? (float)$arr[0]->vICMSST : 0; $pICMSST = isset($arr[0]->pICMSST) ? (float)$arr[0]->pICMSST : 0; $vICMS = isset($arr[0]->vICMS) ? (float)$arr[0]->vICMS : 0; $pRedBC = isset($arr[0]->pRedBC) ? (float)$arr[0]->pRedBC : 0; $cst_csosn = $arr[0]->CST ? $arr[0]->CST : $arr[0]->CSOSN; $cst_csosn = (string)$cst_csosn; if(strlen($cst_csosn) == 2){ $cst_csosn = "0".$cst_csosn; } $std->CST_ICMS = $cst_csosn; $cfop = $this->util->trataCfop((string)$prod->CFOP, $l['tipo'], $l['xml_importado']); $std->CFOP = $cfop; $cfopIsentoTributacao = $this->util->cfopIsentoTributacao($cfop); $std->COD_NAT = ''; $std->VL_BC_ICMS = $cfopIsentoTributacao ? 0 : $vBC; $pICMS = $arr[0]->pICMS ?? 0; $std->ALIQ_ICMS = $cfopIsentoTributacao ? 0 : number_format((float)$pICMS, 2, '.', ''); $std->VL_ICMS = $cfopIsentoTributacao ? 0 : $vICMS; $std->VL_BC_ICMS_ST = $vBCST; $std->ALIQ_ST = $pICMSST; $std->VL_ICMS_ST = $vICMSST; $std->IND_APUR = '0'; $std->COD_ENQ = null; $arr = (array_values((array)$imposto->IPI)); if(isset($arr[1])){ $cst_ipi = (string)$arr[1]->CST ?? '99'; $cst_ipi = $this->converterCstIpi($cst_ipi); $std->CST_IPI = $cfopIsentoTributacao ? '49' : $cst_ipi; $pIPI = $arr[0]->IPI ?? 0; if(isset($arr[1]->pIPI)){ $pIPI = $arr[1]->pIPI ?? 0; }else{ if(isset($arr[4]->pIPI)){ $ipi = $arr[4]->CST; $pIPI = $arr[4]->pIPI; }else{ $pIPI = 0; } } $std->ALIQ_IPI = $cfopIsentoTributacao ? 0 : (float)$pIPI; $std->VL_BC_IPI = $cfopIsentoTributacao ? 0 : (string)$arr[1]->vBC; $std->VL_IPI = $cfopIsentoTributacao ? 0 : (float)$arr[1]->vIPI; } $arr = (array_values((array)$imposto->PIS)); $std->CST_PIS = $cfopIsentoTributacao ? '98' : (string)$arr[0]->CST; $std->VL_BC_PIS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->vBC; $std->ALIQ_PIS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->pPIS; $std->QUANT_BC_PIS = '0.00'; $std->ALIQ_PIS_QUANT = '0.00'; $std->VL_PIS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->vPIS; $arr = (array_values((array)$imposto->COFINS)); $std->CST_COFINS = $cfopIsentoTributacao ? '98' : (string)$arr[0]->CST; $std->VL_BC_COFINS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->vBCCOFINS; $std->ALIQ_COFINS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->pCOFINS; $std->QUANT_BC_COFINS = '0.00'; $std->ALIQ_COFINS_QUANT = '0.00'; $std->VL_COFINS = $cfopIsentoTributacao ? 0 : (float)$arr[0]->vCOFINS; $std->COD_CTA = ''; $std->VL_ABAT_NT = '0.00'; // dd($cfopIsentoTributacao); try { $c170 = new C170($std); $sped .= $c170; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } }else{ } //fim c170 // if ($ide->tpNF == 1){ foreach($itens as $item){ $prod = $item->prod; $imposto = $item->imposto; $std = new \stdClass(); $arr = (array_values((array)$imposto->ICMS)); $vBC = isset($arr[0]->vBC) ? (float)$arr[0]->vBC : 0; $vBCST = isset($arr[0]->vBCST) ? (float)$arr[0]->vBCST : 0; $vICMSST = isset($arr[0]->vICMSST) ? (float)$arr[0]->vICMSST : 0; $vICMS = isset($arr[0]->vICMS) ? (float)$arr[0]->vICMS : 0; $pRedBC = isset($arr[0]->pRedBC) ? (float)$arr[0]->pRedBC : 0; $cst_csosn = $arr[0]->CST ? $arr[0]->CST : $arr[0]->CSOSN; $cst_csosn = (string)$cst_csosn; if(strlen($cst_csosn) == 2){ $cst_csosn = "0".$cst_csosn; } $std->CST_ICMS = $cst_csosn; $cfop = $this->util->trataCfop((string)$prod->CFOP, $l['tipo'], $l['xml_importado']); $std->CFOP = $cfop; $cfopIsentoTributacao = $this->util->cfopIsentoTributacao($cfop); // $std->CFOP = (string)$prod->CFOP; $pICMS = $arr[0]->pICMS ?? 0; $std->ALIQ_ICMS = number_format((float)$pICMS, 2, '.', ''); $arr = (array_values((array)$imposto->IPI)); $vIPI = 0; if(isset($arr[1])){ $vIPI = (float)$arr[1]->vIPI ?? 0; } $std->VL_OPR = (float)$prod->vProd; $std->VL_BC_ICMS = $vBC; $std->VL_ICMS = $cfopIsentoTributacao ? 0 : $vICMS; $std->VL_BC_ICMS_ST = $vBCST; $std->VL_ICMS_ST = $vICMSST; $std->VL_RED_BC = $pRedBC; $std->VL_IPI = $vIPI; $std->COD_OBS = ''; // echo $std->CFOP . "
"; $dataC190 = $this->util->updateOrCreateC190($dataC190, $std); // $dataC190[] = $std; } foreach($dataC190 as $std){ try { $c190 = new C190($std); $sped .= $c190; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } // } // $total000 = $this->totalizeBloco($sped, 'C'); // $sped .= '|C990|' . $total000 . '|'; // $sped .= "\r\n"; // dd($total); } // dd($dataC190); $total000 = $this->totalizeBloco($sped, 'C'); $sped .= '|C990|' . $total000 . '|'; $sped .= "\r\n"; $std = new \stdClass(); $std->IND_MOV = 1; try { $D001 = new D001($std); $sped .= $D001; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $total000 = $this->totalizeBloco($sped, 'D'); $sped .= '|D990|' . $total000 . '|'; $sped .= "\r\n"; $std = new \stdClass(); $std->IND_MOV = '0'; try { $E001 = new E001($std); $sped .= $E001; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } $std = new \stdClass(); $std->DT_INI = $dInicial; $std->DT_FIN = $dFinal; try { $E100 = new E100($std); $sped .= $E100; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } // inicio e110 $saldoCredor = 0; $mes = (int)substr($mesRef, 0, 2); $ano = (int)substr($mesRef, 2, 4); if($mes == 1){ $ano--; $mes = 12; }else if($mes == 2){ $ano++; $mes = 1; }else{ $mes--; } if($mes < 10){ $mes = "0".$mes; } $mes = (string)$mes; $ref = ($mes.$ano); $saldoAnterior = Sped::where('empresa_id', $request->empresa_id)->where('data_refrencia', $ref) ->first(); $std = new \stdClass(); $std->VL_TOT_DEBITOS = $somaICMSSaida; $std->VL_AJ_DEBITOS = 0; $std->VL_TOT_AJ_DEBITOS = 0; $std->VL_ESTORNOS_CRED = 0; $std->VL_TOT_CREDITOS = $somaICMSEntrada; $std->VL_AJ_CREDITOS = 0; $std->VL_TOT_AJ_CREDITOS = 0; $std->VL_ESTORNOS_DEB = 0; $std->VL_SLD_CREDOR_ANT = 0; if($saldoAnterior != null && $saldoAnterior->saldo_credor > 0){ $std->VL_SLD_CREDOR_ANT = $saldoAnterior->saldo_credor; } $VLOP = ($std->VL_TOT_DEBITOS - $std->VL_TOT_CREDITOS) + $std->VL_SLD_CREDOR_ANT; if($VLOP < 0){ $VLOP = $VLOP *-1; } $VL_OR = $std->VL_SLD_APURADO = $VLOP; $std->VL_TOT_DED = 0; $std->VL_ICMS_RECOLHER = $std->VL_SLD_APURADO; $std->VL_SLD_CREDOR_TRANSPORTAR = 0; $std->DEB_ESP = 0; // dd($std); try { $E110 = new E110($std); $sped .= $E110; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } if($std->VL_TOT_CREDITOS > $std->VL_TOT_DEBITOS){ $saldoCredor = $std->VL_TOT_CREDITOS - $std->VL_TOT_DEBITOS; } // inicio e116 $mes = (int)substr($mesRef, 0, 2); $ano = date('Y'); if($mes == 12){ $mes = 1; $ano++; }else{ $mes++; } $mes = $mes < 10 ? "0".$mes : (string)$mes; if($std->VL_TOT_DEBITOS > $std->VL_TOT_CREDITOS){ $std = new \stdClass(); $std->COD_OR = $spedConfig->codigo_obrigacao; $std->VL_OR = $VL_OR; $std->DT_VCTO = $spedConfig->data_vencimento.$mes.$ano; $std->COD_REC = $spedConfig ? $spedConfig->codigo_receita : ''; $std->MES_REF = $mesRef; // dd($std); try { $E116 = new E116($std); $sped .= $E116; $sped .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } $total000 = $this->totalizeBloco($sped, 'E'); $sped .= '|E990|' . $total000 . '|'; $sped .= "\r\n"; $sped .= '|G001|1|'; $sped .= "\r\n"; $sped .= '|G990|2|'; $sped .= "\r\n"; if($inventario == 0){ $sped .= '|H001|1|'; $sped .= "\r\n"; $sped .= '|H990|2|'; $sped .= "\r\n"; }else{ $somaEstoque = $this->somaEstoque(); // $sped .= '|H001|0|'; // $sped .= "\r\n"; $std = new \stdClass(); $std->IND_MOV = 0; $H001 = new H001($std); $sped .= $H001; $sped .= "\r\n"; $std = new \stdClass(); $std->DT_INV = \Carbon\Carbon::parse($dataInventario)->format('dmY'); $std->VL_INV = number_format($somaEstoque, 2, '.', ''); $std->MOT_INV = $motivoInventario; $H005 = new H005($std); $sped .= $H005; $sped .= "\r\n"; $itensDoEstoque = $this->getItensEstoque(); // dd($itensDoEstoque->pluck('produto_id')); foreach($itensDoEstoque as $i){ $std = new \stdClass(); $std->COD_ITEM = $i->produto->id; $std->UNID = $i->produto->unidade_venda; $std->QTD = number_format($i->quantidade, 2, '.', ''); $std->VL_UNIT = number_format($i->valor_compra, 2, '.', ''); $std->VL_ITEM = number_format($i->quantidade*$i->valor_compra, 2, '.', ''); $std->IND_PROP = 1; $std->COD_PART = $cnpj; $std->TXT_COMPL = $i->produto->nome; $std->COD_CTA = $spedConfig->codigo_conta_analitica; $H010 = new H010($std); $sped .= $H010; $sped .= "\r\n"; } // $std = new \stdClass(); // $std->COD_ITEM = $i->produto->id; // $H020 = new H020($std); // $sped .= $H020; // $sped .= "\r\n"; } if($spedConfig && $spedConfig->gerar_bloco_k){ $std = new \stdClass(); $std->ind_mov = 0; try { $K001 = new K001($std); } catch (\Exception $e) { echo $e->getMessage(); } //FIM K001 //GERA K100 $std = new \stdClass(); $std->DT_INI = $dInicial; $std->DT_FIN = $dFinal; try { $K100 = new K100($std); } catch (\Exception $e) { echo $e->getMessage(); } $k200a = ''; $gk = 'N'; foreach ($estoque as $item){ if($item['quantidade'] > 0){ $qtd = $item['quantidade']; $estoqueAtualProduto = EstoqueAtualProduto::where('produto_id', $item['id']) ->whereDate('created_at', '>=', $request->data_inicial) ->whereDate('created_at', '<=', $request->data_final) ->orderBy('id', 'desc') ->first(); if($estoqueAtualProduto){ $qtd = $estoqueAtualProduto->quantidade; } $gk = 'S'; $std = new \stdClass(); $std->DT_EST = $dFinal; $std->COD_ITEM = $item['produto']; $std->QTD = $qtd; $std->IND_EST = 0; $std->COD_PART = null; try { $K200 = new K200($std); $k200a .= $K200; $k200a .= "\r\n"; } catch (\Exception $e) { echo $e->getMessage(); } } } if ($gk === 'S'){ try { $std = new \stdClass(); $std->ind_tp_leiaute = $spedConfig->layout_bloco_k; $K010 = new K010($std); } catch (\Exception $e) { echo $e->getMessage(); } $sped .= $K001; $sped .= "\r\n"; $sped .= $K010; $sped .= "\r\n"; $sped .= $K100; $sped .= "\r\n"; $sped .= $k200a; $total000 = $this->totalizeBloco($sped, 'K'); $sped .= '|K990|' . $total000 . '|'; $sped .= "\r\n"; }else{ $sped .= '|K001|1|'; $sped .= "\r\n"; $sped .= '|K990|2|'; $sped .= "\r\n"; } }else{ $sped .= '|K001|1|'; // ver aqui $sped .= "\r\n"; $sped .= '|K990|2|'; $sped .= "\r\n"; } //BLOCO 1001 VAZIO $sped .= '|1001|0|'; $sped .= "\r\n"; $sped .= '|1010|N|N|N|N|N|N|N|N|N|N|N|N|N|'; $sped .= "\r\n"; $sped .= "|1990|3|"; $sped .= "\r\n"; $total = $this->totalize($sped); $sped .= $total; $arquivo = fopen(public_path("sped_files/")."SPED-EFD-" . $cnpj . ".txt", "w"); fwrite($arquivo, $sped); fclose($arquivo); // echo $sped; // dd($sped); $spedRegistro = Sped::where('empresa_id', $request->empresa_id)->where('data_refrencia', $mesRef) ->first(); if($spedRegistro != null){ $spedRegistro->delete(); } Sped::create([ 'data_refrencia' => $mesRef, 'empresa_id' => $request->empresa_id, 'saldo_credor' => $saldoCredor ]); return response()->download(public_path("sped_files/")."SPED-EFD-" . $cnpj . ".txt"); } private function totalizeBloco($efd, $bloco) { $tot = ''; $keys = []; $aefd = explode("\n", $efd); foreach ($aefd as $element) { $param = explode("|", $element); if (!empty($param[1])) { $key = $param[1]; if (!empty($keys[$key])) { $keys[$key] += 1; } else { $keys[$key] = 1; } } } $tot = 0; foreach ($keys as $key => $value) { if (!empty($key)) { if (substr($key, 0, 1) == $bloco) { $tot = $tot + $value; } } } return $tot + 1; } function totalize($efd) { $tot = ''; $keys = []; $aefd = explode("\n", $efd); foreach ($aefd as $element) { $param = explode("|", $element); if (!empty($param[1])) { $key = $param[1]; if (!empty($keys[$key])) { $keys[$key] += 1; } else { $keys[$key] = 1; } } } $tot .= "|9001|0|\n"; $n = 0; // dd($keys); foreach ($keys as $key => $value) { if (!empty($key)) { $tot .= "|9900|$key|$value|\n"; $n++; } } $n++; $tot .= "|9900|9001|1|\n"; $tot .= "|9900|9900|" . ($n + 3) . "|\n"; $tot .= "|9900|9990|1|\n"; $tot .= "|9900|9999|1|\n"; $tot .= "|9990|" . ($n + 6) . "|\n"; $efd .= $tot; $n = count(explode("\n", $efd)); $tot .= "|9999|$n|\n"; return $tot; } private function somaEstoque(){ $produtos = Estoque::select('quantidade', 'valor_compra') ->where('empresa_id', $request->empresa_id)->get(); $soma = 0; foreach($produtos as $p){ $soma += $p->quantidade * $p->valor_compra; } return $soma; } private function getItensEstoque(){ return Estoque::where('empresa_id', $request->empresa_id) ->distinct('produto_id') ->get(); } private function getCompra($chave, $importado){ $item = Nfe::where($importado ? 'chave' : 'chave_importada', $chave)->where('empresa_id', request()->empresa_id) ->first(); return $item; } private function converterCstIpi($cst_ipi){ if($cst_ipi == '50') return '00'; else if($cst_ipi == '51') return '01'; else if($cst_ipi == '52') return '02'; else if($cst_ipi == '53') return '03'; else if($cst_ipi == '54') return '04'; else if($cst_ipi == '55') return '05'; else if($cst_ipi == '99') return '49'; else return $cst_ipi; } }