arcadiasuite/plus/app/Http/Controllers/API/NotaServicoController.php

286 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use CloudDfe\SdkPHP\Nfse;
use App\Models\Empresa;
use App\Models\NotaServico;
use App\Models\ConfigGeral;
class NotaServicoController extends Controller
{
public function transmitir(Request $request){
$item = NotaServico::findOrFail($request->id);
$empresa = $item->empresa;
$params = [
'token' => $empresa->token_nfse,
'ambiente' => Nfse::AMBIENTE_PRODUCAO,
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE,
'options' => [
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE
]
];
$nfse = new Nfse($params);
$servico = $item->servico;
try {
$doc = preg_replace('/[^0-9]/', '', $item->documento);
$im = preg_replace('/[^0-9]/', '', $item->im);
$ie = preg_replace('/[^0-9]/', '', $item->ie);
$config = ConfigGeral::where('empresa_id', $item->empresa_id)
->first();
$regimeTributacao = null;
if($config != null){
$regimeTributacao = $config->regime_nfse;
}
$empresa->numero_ultima_nfse = $item->numero_nfse;
$empresa->save();
$valorLiquido = $servico->valor_servico - $servico->desconto_incondicional - $servico->desconto_condicional;
$payload = [
"numero" => $item->numero_nfse,
"serie" => $empresa->numero_serie_nfse,
"tipo" => "1",
"status" => "1",
"data_emissao" => date("Y-m-d\TH:i:sP"),
"data_competencia" => date("Y-m-d\TH:i:sP"),
"regime_tributacao" => $regimeTributacao,
"tomador" => [
"cnpj" => strlen($doc) == 14 ? $doc : null,
"cpf" => strlen($doc) == 11 ? $doc : null,
"im" => $im ? $im : null,
"ie" => $ie ? $ie : null,
"razao_social" => $item->razao_social,
"endereco" => [
"logradouro" => $this->retiraAcentos($item->rua),
"numero" => $this->retiraAcentos($item->numero),
"complemento" => $this->retiraAcentos($item->complemento),
"bairro" => $this->retiraAcentos($item->bairro),
"codigo_municipio" => $item->cidade->codigo,
"uf" => $item->cidade->uf,
"cep" => preg_replace('/[^0-9]/', '', $item->cep)
]
],
"servico" => [
"codigo" => $servico->codigo_servico,
"codigo_tributacao_municipio" => $servico->codigo_tributacao_municipio,
"discriminacao" => $this->retiraAcentos($servico->discriminacao),
"codigo_municipio" => $empresa->cidade->codigo,
"valor_servicos" => $servico->valor_servico,
"valor_pis" => $servico->aliquota_pis,
"valor_aliquota" => $servico->aliquota_iss,
"valor_iss" => $servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : null,
"valor_iss_retido" => $servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : null,
"valor_liquido" => $valorLiquido - ($servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : 0),
"codigo_cnae" => $servico->codigo_cnae,
"itens" => [
[
"codigo" => $servico->codigo_servico,
"codigo_tributacao_municipio" => $servico->codigo_tributacao_municipio,
"discriminacao" => $this->retiraAcentos($servico->discriminacao),
"codigo_municipio" => $empresa->cidade->codigo,
"valor_servicos" => $servico->valor_servico,
"valor_pis" => $servico->aliquota_pis,
"valor_aliquota" => $servico->aliquota_iss,
"valor_liquido" => $valorLiquido - ($servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : 0),
"codigo_cnae" => $servico->codigo_cnae,
"valor_iss" => $servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : null,
"valor_iss_retido" => $servico->iss_retido == 1 ? $servico->valor_servico * ($servico->aliquota_iss/100) : null,
]
]
]
];
if($servico->desconto_incondicional > 0){
$payload['servico']['valor_desconto_incondicionado'] = $servico->desconto_incondicional;
$payload['servico']['itens'][0]['valor_desconto_incondicionado'] = $servico->desconto_incondicional;
}
if($servico->desconto_condicional > 0){
$payload['servico']['valor_desconto_condicionado'] = $servico->desconto_condicional;
$payload['servico']['itens'][0]['valor_desconto_condicionado'] = $servico->desconto_condicional;
}
if($servico->iss_retido == 1){
$payload['servico']['iss_retido'] = true;
$payload['servico']['responsavel_retencao'] = $servico->responsavel_retencao_iss;
}
$resp = $nfse->cria($payload);
$resp = json_decode($resp);
if(isset($resp->sucesso) && $resp->sucesso == true){
if(isset($resp->chave)){
$item->chave = $resp->chave;
$item->save();
}
// return response()->json($resp, 200);
$chave = $resp->chave;
sleep(15);
$tentativa = 1;
while ($tentativa <= 2) {
$payload = [
'chave' => $item->chave
];
$resp = $nfse->consulta($payload);
$resp = json_decode($resp);
if($resp->codigo != 5023) {
if ($resp->sucesso) {
// autorizado
$item->estado = 'aprovado';
$item->url_pdf_nfse = $resp->link_pdf;
// $item->numero_nfse = $resp->numero;
$item->codigo_verificacao = $resp->codigo_verificacao;
$item->save();
// $empresa->numero_ultima_nfse = (int)$resp->numero;
// $empresa->save();
$xml = $resp->xml;
file_put_contents(public_path('xml_nota_servico/')."$item->chave.xml", $xml);
return response()->json($resp, 200);
} else {
return response()->json($resp, 200);
}
}
sleep(3);
$tentativa++;
}
}else{
if($resp->codigo == 5008){
$item->chave = $resp->chave;
$item->save();
}
return response()->json($resp, 404);
}
}catch (\Exception $e) {
return response()->json($e->getMessage(), 403);
}
}
public function consultar(Request $request){
$item = NotaServico::findOrFail($request->id);
$empresa = $item->empresa;
// $params = [
// 'token' => $empresa->token_nfse,
// 'ambiente' => Nfse::AMBIENTE_PRODUCAO,
// // 'ambiente' => $empresa->ambiente == 2 ? Nfse::AMBIENTE_HOMOLOGACAO : Nfse::AMBIENTE_PRODUCAO,
// 'options' => [
// 'debug' => false,
// 'timeout' => 60,
// 'port' => 443,
// 'http_version' => CURL_HTTP_VERSION_NONE
// ]
// ];
$params = [
'token' => $empresa->token_nfse,
'ambiente' => Nfse::AMBIENTE_PRODUCAO,
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE,
'options' => [
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE
]
];
try{
$nfse = new Nfse($params);
$payload = [
'chave' => $item->chave
];
$resp = $nfse->consulta($payload);
$resp = json_decode($resp);
if(isset($resp->sucesso) && $resp->sucesso == true){
if($resp->codigo == 100){
$item->estado = 'aprovado';
if($resp->status == 'Cancelado'){
$item->estado = 'cancelado';
}
$item->url_pdf_nfse = $resp->link_pdf;
// $item->numero_nfse = $resp->numero;
$item->codigo_verificacao = $resp->codigo_verificacao;
$item->save();
// $empresa->numero_ultima_nfse = (int)$resp->numero;
// $empresa->save();
$xml = $resp->xml;
file_put_contents(public_path('xml_nota_servico/')."$item->chave.xml", $xml);
}else if($resp->codigo == 101){
if($resp->status == 'Cancelado'){
$item->estado = 'cancelado';
}
$item->save();
}
return response()->json($resp, 200);
}
return response()->json($resp, 404);
}catch (\Exception $e) {
return response()->json($e->getMessage(), 403);
}
}
public function cancelar(Request $request){
$item = NotaServico::findOrFail($request->id);
$empresa = $item->empresa;
$params = [
'token' => $empresa->token_nfse,
'ambiente' => Nfse::AMBIENTE_PRODUCAO,
// 'ambiente' => $empresa->ambiente == 2 ? Nfse::AMBIENTE_HOMOLOGACAO : Nfse::AMBIENTE_PRODUCAO,
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE,
'options' => [
'debug' => false,
'timeout' => 60,
'port' => 443,
'http_version' => CURL_HTTP_VERSION_NONE
]
];
try{
$nfse = new Nfse($params);
$payload = [
'chave' => $item->chave,
'justificativa' => $request->motivo
];
$resp = $nfse->cancela($payload);
if(isset($resp->sucesso) && $resp->sucesso == true){
return response()->json($resp, 200);
}
return response()->json($resp, 404);
}catch (\Exception $e) {
return response()->json($e->getMessage(), 403);
}
}
private function retiraAcentos($texto){
return preg_replace(array("/(á|à|ã|â|ä)/","/(Á|À|Ã|Â|Ä)/","/(é|è|ê|ë)/","/(É|È|Ê|Ë)/","/(í|ì|î|ï)/","/(Í|Ì|Î|Ï)/","/(ó|ò|õ|ô|ö)/","/(Ó|Ò|Õ|Ô|Ö)/","/(ú|ù|û|ü)/","/(Ú|Ù|Û|Ü)/","/(ñ)/","/(Ñ)/", "/(ç)/", "/(&)/"),explode(" ","a A e E i I o O u U n N c e"),$texto);
}
}