arcadiasuite/plus/app/Http/Controllers/API/Token/ProdutoController.php

396 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\API\Token;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Produto;
use App\Models\ProdutoLocalizacao;
use App\Models\Localizacao;
use App\Models\Estoque;
use App\Models\PadraoTributacaoProduto;
use App\Utils\EstoqueUtil;
class ProdutoController extends Controller
{
protected $prefix = 'produtos';
protected $utilEstoque;
public function __construct(EstoqueUtil $utilEstoque){
$this->utilEstoque = $utilEstoque;
}
public function index(Request $request){
if(!__validaPermissaoToken($request->token, $this->prefix.".read")){
return response()->json("Permissão negada!", 403);
}
$data = Produto::where('empresa_id', $request->empresa_id)
->select('id', 'nome', 'codigo_barras', 'ncm', 'cest', 'unidade', 'perc_icms', 'perc_pis',
'perc_cofins', 'perc_ipi', 'cst_csosn', 'cst_pis', 'cst_cofins', 'cst_ipi', 'valor_unitario',
'origem', 'perc_red_bc', 'cfop_estadual', 'cfop_outro_estado', 'cEnq', 'pST',
'categoria_id', 'gerenciar_estoque', 'valor_compra', 'status', 'marca_id', 'cfop_entrada_estadual',
'cfop_entrada_outro_estado', 'modBCST', 'pMVAST', 'pICMSST', 'redBCST', 'balanca_pdv', 'exportar_balanca',
'referencia_balanca', 'numero_sequencial', 'valor_atacado', 'quantidade_atacado')
->with(['marca', 'categoria', 'estoque'])
->get();
__createApiLog($request->empresa_id, $request->token, 'sucesso', '', 'read', $this->prefix);
return response()->json($data, 200);
}
public function find(Request $request, $id){
if(!__validaPermissaoToken($request->token, $this->prefix.".read")){
return response()->json("Permissão negada!", 403);
}
$empresa_id = $request->empresa_id;
$item = Produto::where('empresa_id', $empresa_id)
->select('id', 'nome', 'codigo_barras', 'ncm', 'cest', 'unidade', 'perc_icms', 'perc_pis',
'perc_cofins', 'perc_ipi', 'cst_csosn', 'cst_pis', 'cst_cofins', 'cst_ipi', 'valor_unitario',
'origem', 'perc_red_bc', 'cfop_estadual', 'cfop_outro_estado', 'cEnq', 'pST',
'categoria_id', 'gerenciar_estoque', 'valor_compra', 'status', 'marca_id', 'cfop_entrada_estadual',
'cfop_entrada_outro_estado', 'modBCST', 'pMVAST', 'pICMSST', 'redBCST', 'balanca_pdv', 'exportar_balanca',
'referencia_balanca', 'numero_sequencial', 'valor_atacado', 'quantidade_atacado')
->with(['marca', 'categoria', 'estoque'])
->findOrFail($id);
__createApiLog($request->empresa_id, $request->token, 'sucesso', '', 'read', $this->prefix);
return response()->json($item, 200);
}
public function store(Request $request){
if(!__validaPermissaoToken($request->token, $this->prefix.".create")){
return response()->json("Permissão negada!", 403);
}
try{
$empresa_id = $request->empresa_id;
$padraoTributacao = PadraoTributacaoProduto::where('empresa_id', $empresa_id)->where('padrao', 1)
->first();
$validaRequest = $this->validaRequest($request);
if(sizeof($validaRequest) > 0){
return response()->json($validaRequest, 403);
}
if($padraoTributacao != null){
if(!isset($request->perc_icms)){
$request->merge(['perc_icms' => $padraoTributacao->perc_icms]);
}
if(!isset($request->perc_pis)){
$request->merge(['perc_pis' => $padraoTributacao->perc_pis]);
}
if(!isset($request->perc_cofins)){
$request->merge(['perc_cofins' => $padraoTributacao->perc_cofins]);
}
if(!isset($request->perc_ipi)){
$request->merge(['perc_ipi' => $padraoTributacao->perc_ipi]);
}
if(!isset($request->cst_csosn)){
$request->merge(['cst_csosn' => $padraoTributacao->cst_csosn]);
}
if(!isset($request->cst_pis)){
$request->merge(['cst_pis' => $padraoTributacao->cst_pis]);
}
if(!isset($request->cst_cofins)){
$request->merge(['cst_cofins' => $padraoTributacao->cst_cofins]);
}
if(!isset($request->cst_ipi)){
$request->merge(['cst_ipi' => $padraoTributacao->cst_ipi]);
}
if(!isset($request->perc_red_bc)){
$request->merge(['perc_red_bc' => $padraoTributacao->perc_red_bc]);
}
if(!isset($request->cEnq)){
$request->merge(['cEnq' => $padraoTributacao->cEnq]);
}
if(!isset($request->pST)){
$request->merge(['pST' => $padraoTributacao->pST]);
}
if(!isset($request->cfop_estadual)){
$request->merge(['cfop_estadual' => $padraoTributacao->cfop_estadual]);
}
if(!isset($request->cfop_outro_estado)){
$request->merge(['cfop_outro_estado' => $padraoTributacao->cfop_outro_estado]);
}
if(!isset($request->cest)){
$request->merge(['cest' => $padraoTributacao->cest]);
}
if(!isset($request->ncm)){
$request->merge(['ncm' => $padraoTributacao->ncm]);
}
if(!isset($request->codigo_beneficio_fiscal)){
$request->merge(['codigo_beneficio_fiscal' => $padraoTributacao->codigo_beneficio_fiscal]);
}
if(!isset($request->cfop_entrada_estadual)){
$request->merge(['cfop_entrada_estadual' => $padraoTributacao->cfop_entrada_estadualc]);
}
if(!isset($request->cfop_entrada_outro_estado)){
$request->merge(['cfop_entrada_outro_estado' => $padraoTributacao->cfop_entrada_outro_estado]);
}
if(!isset($request->modBCST)){
$request->merge(['modBCST' => $padraoTributacao->modBCST]);
}
if(!isset($request->pMVAST)){
$request->merge(['pMVAST' => $padraoTributacao->pMVAST]);
}
if(!isset($request->pICMSST)){
$request->merge(['pICMSST' => $padraoTributacao->pICMSST]);
}
if(!isset($request->redBCST)){
$request->merge(['redBCST' => $padraoTributacao->redBCST]);
}
}
// return response()->json($request->all(), 403);
// $last = Produto::where('empresa_id', $empresa_id)
// ->orderBy('numero_sequencial', 'desc')
// ->where('numero_sequencial', '>', 0)->first();
// $numeroSequencial = $last != null ? $last->numero_sequencial : 0;
// $numeroSequencial++;
$numeroSequencial = __getUltimoNumeroSequencial($empresa_id, 'produtos');
$numeroSequencial++;
$request->merge([
'numero_sequencial' => $numeroSequencial,
'perc_icms' => __convert_value_bd($request->perc_icms),
'perc_pis' => __convert_value_bd($request->perc_pis),
'perc_cofins' => __convert_value_bd($request->perc_cofins),
'perc_ipi' => __convert_value_bd($request->perc_ipi),
'valor_unitario' => __convert_value_bd($request->valor_unitario),
'perc_red_bc' => __convert_value_bd($request->perc_red_bc),
'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : null,
'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
'unidade' => isset($request->unidade) ? $request->unidade : 'UN',
'cEnq' => isset($request->cEnq) ? $request->cEnq : '999',
'percentual_lucro' => 100,
'valor_prazo' => 0
]);
$percentual_lucro = 100;
if($request->valor_compra > 0){
$percentual_lucro = 100-($request->valor_compra*100)/$request->valor_unitario;
$request->merge([
'percentual_lucro' => $percentual_lucro
]);
}
$item = Produto::create($request->all());
$localizacao = Localizacao::where('empresa_id', $empresa_id)->first();
ProdutoLocalizacao::updateOrCreate([
'produto_id' => $item->id,
'localizacao_id' => $localizacao->id
]);
if(isset($request->estoque)){
$qtd = __convert_value_bd($request->estoque);
$this->utilEstoque->incrementaEstoque($item->id, $qtd, null, $localizacao->id);
$transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
$tipo = 'incremento';
$codigo_transacao = $transacao->id;
$tipo_transacao = 'alteracao_estoque';
$this->utilEstoque->movimentacaoProduto($item->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, null, null);
}
$item = Produto::where('empresa_id', $empresa_id)
->select('id', 'nome', 'codigo_barras', 'ncm', 'cest', 'unidade', 'perc_icms', 'perc_pis',
'perc_cofins', 'perc_ipi', 'cst_csosn', 'cst_pis', 'cst_cofins', 'cst_ipi', 'valor_unitario',
'origem', 'perc_red_bc', 'cfop_estadual', 'cfop_outro_estado', 'cEnq', 'pST',
'categoria_id', 'gerenciar_estoque', 'valor_compra', 'status', 'marca_id', 'cfop_entrada_estadual',
'cfop_entrada_outro_estado', 'modBCST', 'pMVAST', 'pICMSST', 'redBCST', 'balanca_pdv', 'exportar_balanca',
'referencia_balanca', 'numero_sequencial', 'valor_atacado', 'quantidade_atacado')
->with(['marca', 'categoria'])
->findOrFail($item->id);
__createApiLog($request->empresa_id, $request->token, 'sucesso', '', 'create', $this->prefix);
return response()->json($item, 200);
}catch(\Exception $e){
__createApiLog($request->empresa_id, $request->token, 'erro', $e->getMessage(), 'create', $this->prefix);
return response()->json("Algo deu errado: " . $e->getMessage(), 403);
}
}
private function validaRequest($request){
$dataMessage = [];
$padraoTributacao = PadraoTributacaoProduto::where('empresa_id', $request->empresa_id)->where('padrao', 1)
->first();
if(!isset($request->nome) || $request->nome == ""){
array_push($dataMessage, "Informe a nome");
}
if(!isset($request->valor_unitario) || $request->valor_unitario <= 0){
array_push($dataMessage, "Informe a valor unitário");
}
if($padraoTributacao == null){
if(!isset($request->perc_icms)){
array_push($dataMessage, "Informe o % icms");
}
if(!isset($request->perc_pis)){
array_push($dataMessage, "Informe o % pis");
}
if(!isset($request->perc_cofins)){
array_push($dataMessage, "Informe o % cofins");
}
if(!isset($request->perc_ipi)){
array_push($dataMessage, "Informe o % ipi");
}
if(!isset($request->cst_csosn)){
array_push($dataMessage, "Informe o cst_csosn");
}
if(!isset($request->cst_pis)){
array_push($dataMessage, "Informe o cst_pis");
}
if(!isset($request->cst_cofins)){
array_push($dataMessage, "Informe o cst_cofins");
}
if(!isset($request->cst_ipi)){
array_push($dataMessage, "Informe o cst_ipi");
}
if(!isset($request->cfop_estadual)){
array_push($dataMessage, "Informe o cfop estadual");
}
if(!isset($request->cfop_outro_estado)){
array_push($dataMessage, "Informe o cfop outro estado");
}
}
return $dataMessage;
}
public function update(Request $request){
if(!__validaPermissaoToken($request->token, $this->prefix.".update")){
return response()->json("Permissão negada!", 403);
}
try{
$empresa_id = $request->empresa_id;
$request->merge([
'perc_icms' => __convert_value_bd($request->perc_icms),
'perc_pis' => __convert_value_bd($request->perc_pis),
'perc_cofins' => __convert_value_bd($request->perc_cofins),
'perc_ipi' => __convert_value_bd($request->perc_ipi),
'valor_unitario' => __convert_value_bd($request->valor_unitario),
'perc_red_bc' => __convert_value_bd($request->perc_red_bc),
'valor_compra' => __convert_value_bd($request->valor_compra),
'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : null,
]);
$item = Produto::where('empresa_id', $empresa_id)
->findOrFail($request->id);
if($item == null){
return response()->json("Produto não encontrado!", 403);
}
if($item->empresa_id != $empresa_id){
return response()->json("Não permitido!", 403);
}
if(isset($request->estoque)){
$estoque = Estoque::where('produto_id', $item->id)->first();
$qtd = __convert_value_bd($request->estoque);
if($estoque == null){
$this->utilEstoque->incrementaEstoque($item->id, $qtd, null, $localizacao->id);
$transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
$tipo = 'incremento';
$codigo_transacao = $transacao->id;
$tipo_transacao = 'alteracao_estoque';
$this->utilEstoque->movimentacaoProduto($item->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, null, null);
}else{
$diferenca = 0;
$tipo = 'incremento';
if($estoque->quantidade > $qtd){
$diferenca = $estoque->quantidade - $qtd;
$tipo = 'reducao';
}else{
$diferenca = $qtd - $estoque->quantidade;
}
$estoque->quantidade = $qtd;
$estoque->save();
$codigo_transacao = $estoque->id;
$tipo_transacao = 'alteracao_estoque';
$this->utilEstoque->movimentacaoProduto($estoque->produto_id, $diferenca, $tipo, $codigo_transacao, $tipo_transacao, null);
}
}
$item->fill($request->all())->save();
__createApiLog($request->empresa_id, $request->token, 'sucesso', '', 'update', $this->prefix);
$item = Produto::where('empresa_id', $empresa_id)
->select('id', 'nome', 'codigo_barras', 'ncm', 'cest', 'unidade', 'perc_icms', 'perc_pis',
'perc_cofins', 'perc_ipi', 'cst_csosn', 'cst_pis', 'cst_cofins', 'cst_ipi', 'valor_unitario',
'origem', 'perc_red_bc', 'cfop_estadual', 'cfop_outro_estado', 'cEnq', 'pST',
'categoria_id', 'gerenciar_estoque', 'valor_compra', 'status', 'marca_id', 'cfop_entrada_estadual',
'cfop_entrada_outro_estado', 'modBCST', 'pMVAST', 'pICMSST', 'redBCST', 'balanca_pdv', 'exportar_balanca',
'referencia_balanca', 'numero_sequencial', 'valor_atacado', 'quantidade_atacado')
->with(['marca', 'categoria'])
->findOrFail($item->id);
return response()->json($item, 200);
}catch(\Exception $e){
__createApiLog($request->empresa_id, $request->token, 'erro', $e->getMessage(), 'update', $this->prefix);
return response()->json("Algo deu errado: " . $e->getMessage(), 403);
}
}
public function delete(Request $request){
if(!__validaPermissaoToken($request->token, $this->prefix.".delete")){
return response()->json("Permissão negada!", 403);
}
try{
$empresa_id = $request->empresa_id;
$item = Produto::where('empresa_id', $empresa_id)
->select('id', 'nome', 'codigo_barras', 'ncm', 'cest', 'unidade', 'perc_icms', 'perc_pis',
'perc_cofins', 'perc_ipi', 'cst_csosn', 'cst_pis', 'cst_cofins', 'cst_ipi', 'valor_unitario',
'origem', 'perc_red_bc', 'cfop_estadual', 'cfop_outro_estado', 'cEnq', 'pST',
'categoria_id', 'gerenciar_estoque', 'valor_compra', 'status', 'marca_id', 'cfop_entrada_estadual',
'cfop_entrada_outro_estado', 'modBCST', 'pMVAST', 'pICMSST', 'redBCST', 'balanca_pdv', 'exportar_balanca',
'referencia_balanca', 'numero_sequencial', 'valor_atacado', 'quantidade_atacado')
->with(['marca', 'categoria'])
->find($request->id);
if($item == null){
return response()->json("Produto não encontrado!", 403);
}
if($item->empresa_id != $empresa_id){
return response()->json("Não permitido!", 403);
}
$item->variacoes()->delete();
$item->variacoesMercadoLivre()->delete();
$item->itemLista()->delete();
$item->itemNfe()->delete();
if($item->estoque){
$item->estoque->delete();
}
$item->itemNfce()->delete();
$item->itemCarrinhos()->delete();
$item->movimentacoes()->delete();
$item->composicao()->delete();
$item->itemPreVenda()->delete();
$item->locais()->delete();
$item->delete();
__createApiLog($request->empresa_id, $request->token, 'sucesso', '', 'delete', $this->prefix);
return response()->json($item, 200);
}catch(\Exception $e){
__createApiLog($request->empresa_id, $request->token, 'erro', $e->getMessage(), 'delete', $this->prefix);
return response()->json("Algo deu errado: " . $e->getMessage(), 403);
}
}
}