350 lines
12 KiB
PHP
350 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Utils;
|
|
|
|
use Illuminate\Support\Str;
|
|
use App\Models\Estoque;
|
|
use App\Models\Produto;
|
|
use App\Models\Localizacao;
|
|
use App\Models\VendiZapConfig;
|
|
use App\Models\ProdutoVariacao;
|
|
use App\Models\EstoqueAtualProduto;
|
|
use App\Models\MovimentacaoProduto;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class EstoqueUtil
|
|
{
|
|
protected $urlVendiZap = "https://app.vendizap.com/api";
|
|
|
|
public function incrementaEstoque($produto_id, $quantidade, $produto_variacao_id, $local_id = null)
|
|
{
|
|
if(!$local_id){
|
|
$usuario_id = Auth::user()->id;
|
|
$local = Localizacao::where('usuario_localizacaos.usuario_id', $usuario_id)
|
|
->select('localizacaos.*')
|
|
->join('usuario_localizacaos', 'usuario_localizacaos.localizacao_id', '=', 'localizacaos.id')
|
|
->first();
|
|
if($local){
|
|
$local_id = $local->id;
|
|
}
|
|
}
|
|
$item = Estoque::where('produto_id', $produto_id)
|
|
->when($produto_variacao_id != null, function ($q) use ($produto_variacao_id) {
|
|
return $q->where('produto_variacao_id', $produto_variacao_id);
|
|
})
|
|
->where('local_id', $local_id)
|
|
->first();
|
|
|
|
$produto = Produto::findOrFail($produto_id);
|
|
if($produto->combo){
|
|
|
|
foreach($produto->itensDoCombo as $c){
|
|
$this->incrementaEstoque($c->item_id, $c->quantidade * $quantidade, $produto_variacao_id, $local_id);
|
|
}
|
|
}else{
|
|
|
|
if ($item != null) {
|
|
$item->quantidade += (float)$quantidade;
|
|
$item->save();
|
|
} else {
|
|
$item = Estoque::create([
|
|
'produto_id' => $produto_id,
|
|
'quantidade' => $quantidade,
|
|
'produto_variacao_id' => $produto_variacao_id,
|
|
'local_id' => $local_id
|
|
]);
|
|
}
|
|
}
|
|
|
|
if($item){
|
|
$atual = EstoqueAtualProduto::where('produto_id', $produto_id)->first();
|
|
if($atual == null){
|
|
EstoqueAtualProduto::create([
|
|
'quantidade' => $item->quantidade,
|
|
'produto_id' => $produto_id,
|
|
]);
|
|
}else{
|
|
$atual->quantidade = $item->quantidade;
|
|
$atual->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
public function reduzEstoque($produto_id, $quantidade, $produto_variacao_id, $local_id = null)
|
|
{
|
|
if(!$local_id){
|
|
$usuario_id = Auth::user()->id;
|
|
$local = Localizacao::where('usuario_localizacaos.usuario_id', $usuario_id)
|
|
->select('localizacaos.*')
|
|
->join('usuario_localizacaos', 'usuario_localizacaos.localizacao_id', '=', 'localizacaos.id')
|
|
->first();
|
|
if($local){
|
|
$local_id = $local->id;
|
|
}
|
|
}
|
|
$item = Estoque::where('produto_id', $produto_id)
|
|
->when($produto_variacao_id != null, function ($q) use ($produto_variacao_id) {
|
|
return $q->where('produto_variacao_id', $produto_variacao_id);
|
|
})
|
|
->where('local_id', $local_id)
|
|
->first();
|
|
|
|
if ($item != null) {
|
|
$produto = $item->produto;
|
|
if($produto->combo){
|
|
foreach($produto->itensDoCombo as $c){
|
|
$this->reduzEstoque($c->item_id, $c->quantidade * $quantidade, $produto_variacao_id, $local_id);
|
|
}
|
|
}else{
|
|
$item->quantidade -= $quantidade;
|
|
$item->save();
|
|
}
|
|
}else{
|
|
$produto = Produto::findOrFail($produto_id);
|
|
if($produto->combo){
|
|
foreach($produto->itensDoCombo as $c){
|
|
$this->reduzEstoque($c->item_id, $c->quantidade * $quantidade, $produto_variacao_id, $local_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
if($produto->vendizap_id){
|
|
$this->SetaEstoqueVendiZap($produto, $quantidade, $produto_variacao_id);
|
|
}
|
|
|
|
if($item){
|
|
$atual = EstoqueAtualProduto::where('produto_id', $produto_id)->first();
|
|
if($atual == null){
|
|
EstoqueAtualProduto::create([
|
|
'quantidade' => $item->quantidade,
|
|
'produto_id' => $produto_id,
|
|
]);
|
|
}else{
|
|
$atual->quantidade = $item->quantidade;
|
|
$atual->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
private function SetaEstoqueVendiZap($produto, $quantidade, $produto_variacao_id){
|
|
try{
|
|
$estoque = Estoque::where('produto_id', $produto->id)
|
|
->when($produto_variacao_id != null, function ($q) use ($produto_variacao_id) {
|
|
return $q->where('produto_variacao_id', $produto_variacao_id);
|
|
})->first();
|
|
// dd($estoque);
|
|
$qtdAtual = 0;
|
|
|
|
if($estoque){
|
|
$qtdAtual = $estoque->quantidade;
|
|
}
|
|
|
|
if($produto_variacao_id == null){
|
|
$this->ajustaEstoqueSimples($produto, $qtdAtual);
|
|
}else{
|
|
$this->ajustaEstoqueVariacao($produto, $qtdAtual, $produto_variacao_id);
|
|
}
|
|
}catch(\Exception $e){
|
|
echo $e->getMessage();
|
|
die;
|
|
}
|
|
|
|
}
|
|
|
|
private function ajustaEstoqueVariacao($item, $quantidade, $produto_variacao_id){
|
|
$produtoVariacao = ProdutoVariacao::find($produto_variacao_id);
|
|
|
|
if($produtoVariacao){
|
|
$config = VendiZapConfig::where('empresa_id', $item->empresa_id)->first();
|
|
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
];
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $this->urlVendiZap . '/produtos/'.$item->vendizap_id);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_ENCODING, '');
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
|
|
if(!isset($data->estoque)){
|
|
return;
|
|
}
|
|
|
|
// dd($data);
|
|
if(sizeof($data->variacoes) == 1){
|
|
foreach($data->variacoes[0]->variaveis as $variavel){
|
|
if($variavel->nome == $produtoVariacao->descricao){
|
|
$data = [
|
|
'quantidade' => $quantidade,
|
|
'combinacao' => [
|
|
$data->variacoes[0]->id => $variavel->id
|
|
]
|
|
];
|
|
}
|
|
}
|
|
}else{
|
|
$combinacao = $this->getCombinacao($data, $produtoVariacao);
|
|
|
|
$data = [
|
|
'quantidade' => $quantidade,
|
|
'combinacao' => $combinacao
|
|
];
|
|
}
|
|
// dd($data);
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
'Content-Type: application/json'
|
|
];
|
|
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $this->urlVendiZap . '/estoque/'.$item->vendizap_id);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
|
|
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
// dd($data);
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
private function getCombinacao($data, $produtoVariacao){
|
|
$descricao = $produtoVariacao->descricao;
|
|
$temp = explode(" ", $descricao);
|
|
$ret1 = [];
|
|
$ret2 = [];
|
|
$retorno = [];
|
|
|
|
foreach($data->variacoes[0]->variaveis as $va){
|
|
if($va->nome == $temp[0]){
|
|
$ret1 = [
|
|
'variacao_id' => $data->variacoes[0]->id,
|
|
'variavel_id' => $va->id
|
|
];
|
|
}
|
|
}
|
|
|
|
foreach($data->variacoes[1]->variaveis as $va){
|
|
if($va->nome == $temp[1]){
|
|
$ret2 = [
|
|
'variacao_id' => $data->variacoes[1]->id,
|
|
'variavel_id' => $va->id
|
|
];
|
|
}
|
|
}
|
|
return [
|
|
$ret1['variacao_id'] => $ret1['variavel_id'],
|
|
$ret2['variacao_id'] => $ret2['variavel_id'],
|
|
];
|
|
|
|
}
|
|
|
|
private function ajustaEstoqueSimples($item, $quantidade){
|
|
$config = VendiZapConfig::where('empresa_id', $item->empresa_id)->first();
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
'Content-Type: application/json'
|
|
];
|
|
|
|
$data = [
|
|
'quantidade' => $quantidade
|
|
];
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $this->urlVendiZap . '/estoque/'.$item->vendizap_id);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
|
|
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
// dd($data);
|
|
return $data;
|
|
}
|
|
|
|
public function reduzComposicao($produto_id, $quantidade, $produto_variacao_id = null)
|
|
{
|
|
$produto = Produto::findOrFail($produto_id);
|
|
foreach ($produto->composicao as $item) {
|
|
$this->reduzEstoque($item->ingrediente_id, ($item->quantidade * $quantidade), $produto_variacao_id);
|
|
}
|
|
$this->incrementaEstoque($produto_id, $quantidade, $produto_variacao_id);
|
|
}
|
|
|
|
public function verificaEstoqueComposicao($produto_id, $quantidade, $produto_variacao_id = null)
|
|
{
|
|
$produto = Produto::findOrFail($produto_id);
|
|
$mensagem = "";
|
|
foreach ($produto->composicao as $item) {
|
|
$qtd = $item->quantidade * $quantidade;
|
|
|
|
if($item->ingrediente->estoque){
|
|
if($qtd > $item->ingrediente->estoque->quantidade){
|
|
$mensagem .= $item->ingrediente->nome . " com estoque insuficiente | ";
|
|
}
|
|
}else{
|
|
$mensagem .= $item->ingrediente->nome . " sem nenhum estoque cadastrado | ";
|
|
}
|
|
}
|
|
$mensagem = substr($mensagem, 0, strlen($mensagem)-2);
|
|
return $mensagem;
|
|
|
|
}
|
|
|
|
public function verificaEstoqueCombo($produto, $quantidade)
|
|
{
|
|
|
|
$mensagem = "";
|
|
foreach ($produto->itensDoCombo as $item) {
|
|
$qtd = $item->quantidade * $quantidade;
|
|
if($item->produtoDoCombo->gerenciar_estoque){
|
|
if($item->produtoDoCombo->estoque){
|
|
if($qtd > $item->produtoDoCombo->estoque->quantidade){
|
|
$mensagem .= $item->produtoDoCombo->nome . " com estoque insuficiente | ";
|
|
}
|
|
}else{
|
|
$mensagem .= $item->produtoDoCombo->nome . " sem nenhum estoque cadastrado | ";
|
|
}
|
|
}
|
|
}
|
|
$mensagem = substr($mensagem, 0, strlen($mensagem)-2);
|
|
return $mensagem;
|
|
|
|
}
|
|
|
|
public function movimentacaoProduto($produto_id, $quantidade, $tipo, $codigo_transacao, $tipo_transacao, $user_id,
|
|
$produto_variacao_id = null){
|
|
|
|
$estoque = Estoque::where('produto_id', $produto_id)->first();
|
|
MovimentacaoProduto::create([
|
|
'produto_id' => $produto_id,
|
|
'quantidade' => $quantidade,
|
|
'tipo' => $tipo,
|
|
'codigo_transacao' => $codigo_transacao,
|
|
'tipo_transacao' => $tipo_transacao,
|
|
'produto_variacao_id' => $produto_variacao_id,
|
|
'user_id' => $user_id,
|
|
'estoque_atual' => $estoque ? $estoque->quantidade : 0
|
|
]);
|
|
}
|
|
|
|
}
|