| Server IP : 54.94.228.101 / Your IP : 172.28.1.13 Web Server : Apache System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/vinumday2_0/app/Modules/PedidoVenda/Services/ |
Upload File : |
<?php
namespace App\Modules\PedidoVenda\Services;
use DB;
use Sentinel;
use App\BasicInfo;
use App\Services\GeralService;
use Illuminate\Support\Facades\Log;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\Produto\Models\Produto;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\PedidoVenda\Models\PedidoVenda;
use App\Modules\CanalHasOferta\Models\CanalHasOferta;
use App\Modules\OfertaHasProduto\Models\OfertaHasProduto;
use App\Modules\QuantidadeReserva\Models\QuantidadeReserva;
use App\Modules\PedidoVendaHistorico\Models\PedidoVendaHistorico;
use App\Modules\PedidoVendaHasProduto\Models\PedidoVendaHasProduto;
class PedidoVendaService{
public static function gerarPedidoInterno($request){
$resultado = new \stdClass;
$resultado->status = true;
$resultado->message = 'Pedido Interno criado com sucesso!';
$cadastro = Cadastro::where('id', $request->input('id_cliente'))->first();
// CRIAR PEDIDO VENDA
$custo_efetivo = 0;
$quantidade = 0;
$produtos = $request->input('produtos');
$ofertas = [];
$preco_oferta = 0;
$preco_mercado = 0;
foreach ($produtos as $produto) {
$Produto = Produto::where('id', $produto['produto_id'])->first();
$produto_preco_oferta = $produto['preco_venda'] * $produto['quantidade'];
$produto_preco_mercado = $produto['preco_mercado'] * $produto['quantidade'];
$produto_preco_custo = $produto['preco_custo'] * $produto['quantidade'];
//CRIAÇÃO DA OFERTA
$oferta = new Oferta;
$oferta->titulo = $Produto->nome; // CONFIRMAR
$oferta->data = date('Y-m-d', strtotime($request->input('data_fechamento')));
$oferta->created_at = date('Y-m-d H:i:s');
$oferta->estoque = 1;
$oferta->qtde_vendida = 0;
$percentual_desconto = (!empty($produto_preco_mercado) && $produto_preco_mercado != '0' ? (1 - ($produto_preco_oferta / $produto_preco_mercado)) * 100 : 0);
$oferta->percentual_desconto = number_format($percentual_desconto, 2, '.', '');
$oferta->preco_mercado = $produto_preco_mercado;
$oferta->preco_custo = $produto_preco_custo;
$oferta->preco_oferta = $produto_preco_oferta;
$oferta->valor_desconto = 0;
$oferta->quantidade_maxima_por_cliente = 1;
$oferta->resolucao_imagem = 'resolucao-1';
$oferta->tema_id = 1; // CONFIRMAR
$oferta->responsavel_id = Sentinel::getUser()->id; //Usuário Logado
$oferta->tipo = 'INT'; //INTERNA
$oferta->save();
if($oferta){
$preco_oferta += $oferta->preco_oferta;
$preco_mercado += $oferta->preco_mercado;
$quantidade += 1;
$id_oferta = $oferta->id;
$id_produto = $produto['produto_id'];
$ofertaHasProduto = OfertaHasProduto::where('id_produto', $id_produto)->where('id_oferta', $id_oferta)->first();
if(!$ofertaHasProduto){
$ofertaHasProduto = new OfertaHasProduto();
$ofertaHasProduto->id_produto = $id_produto;
$ofertaHasProduto->id_oferta = $id_oferta;
}
$ofertaHasProduto->ordem = 1;
$ofertaHasProduto->quantidade = $produto['quantidade'];
$ofertaHasProduto->estoque = $produto['quantidade'];
$ofertaHasProduto->preco_mercado = $produto['preco_mercado'];
$ofertaHasProduto->preco_custo = $produto['preco_custo'];
$ofertaHasProduto->valor_unitario = $produto['preco_venda'];
$ofertaHasProduto->valor_total = $produto['preco_venda'] * $produto['quantidade'];
$ofertaHasProduto->valor_caixa_status = $produto['valor_caixa_status'];
$ofertaHasProduto->qtd_produtos_caixa = $produto['qtd_produtos_caixa'];
$ofertaHasProduto->save();
$ofertas[] = $oferta;
}
}
$pedidoVenda = new PedidoVenda();
$pedidoVenda->saldo_usado = 0;
$pedidoVendaHistorico = new PedidoVendaHistorico();
$pedidoVenda->id_cliente = $cadastro->id;
$pedidoVenda->empresa_id = $cadastro->empresa_id;
$pedidoVenda->unidade_negocio_id = GeralService::checkUnidadeNegocio($pedidoVenda, 'pedido-venda');
$pedidoVenda->id_usuario_responsavel = Sentinel::getUser()->id; //Usuário Logado
$subtotal = $preco_oferta;
$ajuste = 0;
$total = $preco_oferta;
$pedidoVenda->subtotal = $subtotal;
$pedidoVenda->total = $total;
$pedidoVenda->ajuste = $ajuste;
$pedidoVenda->data_fechamento = $request->input('data_fechamento');
$pedidoVenda->nm_referencia = 'Pedido Interno Plataforma';
$pedidoVenda->assunto = $request->input('assunto');
$pedidoVenda->id_condicao_comercial = 1;
$pedidoVenda->id_pedido_venda_categoria = $request->input('id_pedido_venda_categoria');
$pedidoVenda->tipo_deposito = 'INT'; // INTERNO
$pedidoVenda->nome_depositante = $cadastro->nome . ' ' . $cadastro->sobrenome;
$pedidoVenda->id_status_pedido_venda = 2; // Aprovado
$pedidoVenda->save();
$pedidoVendaHistorico->id_pedido_venda_status = $pedidoVenda->id_status_pedido_venda;
$pedidoVendaHistorico->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaHistorico->data = date('Y-m-d H:i');
$pedidoVendaHistorico->notificar_cliente = 0;
$pedidoVendaHistorico->id_colaborador = 1;
$nr_ofertas = $quantidade;
$valor_economizado = $preco_mercado - $preco_oferta;
$qtd_garrafas = 0;
foreach ($ofertas as $oferta) {
foreach ($oferta->produtos as $ofertaHasProduto) {
$pedidoVendaProduto = new PedidoVendaHasProduto();
$pedidoVendaProduto->id_oferta = $oferta->id;
$pedidoVendaProduto->id_produto = $ofertaHasProduto->id_produto;
$pedidoVendaProduto->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaProduto->quantidade = $ofertaHasProduto->quantidade;
$pedidoVendaProduto->valor_total = $ofertaHasProduto->valor_total;
$pedidoVendaProduto->save();
$qtd_garrafas += $ofertaHasProduto->quantidade;
}
}
DB::table('pedido_venda_has_oferta')->insert([
[
'pedido_venda_id' => $pedidoVenda->id,
'oferta_id' => $oferta->id,
'quantidade' => 1,
'valor_unitario' => $oferta->preco_oferta,
'valor_total' => $oferta->preco_oferta,
'desconto_ocultado' => 0,
'created_at' => date('Y-m-d H:i:s')
]
]);
$pedidoVenda->qtd_garrafas = $qtd_garrafas;
$pedidoVenda->valor_economizado = $valor_economizado;
$pedidoVenda->nr_ofertas = $nr_ofertas;
$pedidoVenda->save();
$pedidoVendaHistorico->save();
GeralService::recalcularAdega($pedidoVenda->id_cliente, $pedidoVenda->id, FALSE, FALSE);
$resultado->url = url('/admin/pedido-venda/edit/' . $pedidoVenda->id);
return $resultado;
}
public static function geradorItemProduto($request){
//Verifica Filtro Última Compra
$filtro_ultimas_compras = "";
if($request->input('periodo_compra')){
$data_inicio_compra = date('Y-m-d', strtotime("-".$request->input('periodo_compra')." day",strtotime(date('Y-m-d'))));
$data_fim_compra = date('Y-m-d');
$filtro_ultimas_compras = " AND oc.data_inclusao BETWEEN '{$data_inicio_compra}' AND '{$data_fim_compra} 23:59:59'";
}
$query = Produto::select(
'produto.*',
DB::raw("(SELECT SUM(rc.quantidade) FROM requisicao_compra rc WHERE rc.produto_id = produto.id AND rc.`status` = 'P' AND rc.tipo = 'P') AS 'pedidos_extras'"),
DB::raw("(SELECT SUM(rc.quantidade) FROM requisicao_compra rc WHERE rc.produto_id = produto.id AND rc.`status` = 'P' AND rc.tipo = 'R') AS 'requisicoes'"),
DB::raw("(SELECT SUM(oci.quantidade) FROM ordem_compra_item oci WHERE oci.produto_id = produto.id AND EXISTS(
SELECT 1 FROM ordem_compra oc WHERE oc.id = oci.ordem_compra_id AND oc.status IN ('P','AR','EN') {$filtro_ultimas_compras}
)) AS 'ultimas_compras'"),
DB::raw("(SELECT SUM(oci.quantidade) FROM ordem_compra_item oci WHERE oci.produto_id = produto.id AND EXISTS(
SELECT 1 FROM ordem_compra oc WHERE oc.id = oci.ordem_compra_id AND oc.status IN ('AP') {$filtro_ultimas_compras}
)) AS 'ultimas_compras_parcial'")
);
//FILTROS
//fornecedor
if($request->input('fornecedor_id')){
$query->where('produto.id_fornecedor', $request->input('fornecedor_id'));
}
//canal
if($request->input('canal_id')){
$query->whereRaw(DB::raw('EXISTS (SELECT 1 FROM oferta_has_produto ohp, canal_has_oferta cho WHERE cho.deleted_at IS NULL AND ohp.id_produto = produto.id AND cho.id_oferta = ohp.id_oferta AND cho.id_canal = ' . $request->input('canal_id') . ')'));
}
//tipo oferta
if($request->input('tipo_oferta')){
$query->whereRaw(DB::raw("EXISTS (SELECT 1 FROM oferta_has_produto ohp, oferta o WHERE ohp.id_produto = produto.id AND o.id = ohp.id_oferta AND o.tipo = '" . $request->input('tipo_oferta') . "')"));
}
//período oferta
if($request->input('periodo_oferta')){
$data_inicio_oferta = date('Y-m-d', strtotime("-".$request->input('periodo_oferta')." day",strtotime(date('Y-m-d'))));
$data_fim_oferta = date('Y-m-d');
$query->whereRaw(DB::raw("EXISTS (SELECT 1 FROM oferta_has_produto ohp, oferta o WHERE ohp.id_produto = produto.id AND o.id = ohp.id_oferta AND o.data BETWEEN '{$data_inicio_oferta}' AND '{$data_fim_oferta}')"));
}
//período compra
if($request->input('periodo_compra')){
$data_inicio_compra = date('Y-m-d', strtotime("-".$request->input('periodo_compra')." day",strtotime(date('Y-m-d'))));
$data_fim_compra = date('Y-m-d');
$query->whereRaw(DB::raw("EXISTS (SELECT 1 FROM ordem_compra_item oci, ordem_compra o WHERE oci.produto_id = produto.id AND o.id = oci.ordem_compra_id AND o.data_inclusao BETWEEN '{$data_inicio_compra}' AND '{$data_fim_compra} 23:59:59')"));
}
//produto
if($request->input('produto_id')){
$query->where('produto.id', $request->input('produto_id'));
}
//produto
if($request->input('item_id')){
$query->where('produto.id', $request->input('item_id'));
}
//Novos Produtos
if($request->input('produtos_novos') && $request->input('produtos_novos') == 'S'){
$query->whereRaw(DB::raw('NOT EXISTS (SELECT 1 FROM oferta_has_produto ofp_new WHERE ofp_new.id_produto = produto.id)'));
$query->whereRaw(DB::raw('NOT EXISTS (SELECT 1 FROM pedido_venda_has_produto pvhp WHERE pvhp.id_produto = produto.id)'));
}
$produto = $query->first();
$produto->percentual_desconto = (!empty($produto->preco_mercado) && $produto->preco_mercado != '0' ? (1 - ($produto->preco_de_venda / $produto->preco_mercado)) * 100 : 0);
$produto->percentual_markup = (!empty($produto->preco_custo) && $produto->preco_custo != '0' ? (($produto->preco_de_venda / $produto->preco_custo) - 1) * 100 : 0);
//Ofertas x Canal
foreach ($produto->ofertas as $oferta){
if(isset($oferta->oferta) && $oferta->oferta->tipo == 'C'){
$CanalHasOferta = CanalHasOferta::where('id_oferta', $oferta->id_oferta)->orderBy('id', 'desc')->first();
if($CanalHasOferta){
$oferta->oferta->canal = $CanalHasOferta->canal;
}
}
$PedidoVendaHasProduto = PedidoVendaHasProduto::select(DB::raw("SUM(quantidade) AS 'quantidade'"))
->where('id_oferta', $oferta->id_oferta)
->where('id_produto', $produto->id)
->whereRaw(DB::raw("EXISTS (SELECT 1 FROM pedido_venda pv WHERE pv.id = pedido_venda_has_produto.id_pedido_venda AND pv.id_status_pedido_venda IN (1,2,7,9))"))
->groupBy('id_oferta')
->first();
$oferta->quantidade = ($PedidoVendaHasProduto ? $PedidoVendaHasProduto->quantidade : 0);
}
//Estoque
$produto->estoque = GeralService::getEstoqueProduto($produto);
$adega = str_replace(['.', ','], "", $produto->estoque['adega']);
$em_processamento = str_replace(['.', ','], "", $produto->estoque['em_processamento']);
$disponibilidade = str_replace(['.', ','], "", $produto->estoque['disponibilidade']);
//VALIDAÇÃO VALORES ACIMA DE 1 MIL
$estoque = ['adega' => $adega, 'em_processamento' => $em_processamento, 'disponibilidade' => $disponibilidade];
$produto->estoque = array_merge($produto->estoque, $estoque);
$produto->saldo = ($produto->estoque['estoque'] - $produto->estoque['adega'] - $produto->estoque['em_processamento'] - $produto->pedidos_extras - $produto->requisicoes) + $produto->ultimas_compras + $produto->ultimas_compras_parcial;
$saldo = $produto->saldo;
$QuantidadeReserva = QuantidadeReserva::select('qtde_sugerida')->where('qtde_inicial_saldo', '<=', abs($produto->saldo))->where('qtde_final_saldo', '>=', abs($produto->saldo))->first();
$produto->reserva = $produto->estoque['reserva'];
$produto->qtde_sugerida = $produto->saldo > 0 ? 0 : abs($produto->saldo) + $produto->reserva;
$produto->saldo_final = ($saldo > 0 ? (abs($produto->saldo) - $produto->reserva) : abs($produto->saldo) + $produto->reserva);
if($saldo < 0){
$produto->saldo_final = -abs($produto->saldo_final);
}
$produto->saldo = abs($produto->saldo);
$produto->saldo = ($saldo >= 0 ? $produto->saldo : -abs($produto->saldo));
$produto->disponibilidade = ($produto->estoque['disponibilidade'] > 0 ? $produto->estoque['disponibilidade'] : $produto->estoque['disponibilidade'] + $produto->reserva);
return $produto;
}
}