| Server IP : 54.233.248.239 / 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/Services/ |
Upload File : |
<?php
namespace App\Services;
use App\Modules\Produto\Models\Produto;
use DB;
use Sentinel;
use Illuminate\Support\Facades\Log;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use Exception;
use Session;
use App\User;
use App\BasicInfo;
use App\CampoOption;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\Tema\Models\Tema;
use App\Modules\Instituicao\Models\Instituicao;
use App\Modules\OfertaHasProduto\Models\OfertaHasProduto;
use App\Modules\Colaborador\Models\Colaborador;
class OfertaService {
public static function getTemas(){
return Tema::select('id', 'nome')->orderBy('nome', 'ASC')->get();
}
public static function getInstituicoes(){
return Instituicao::select('id', 'nome')->orderBy('nome', 'ASC')->get();
}
public static function getResponsaveis(){
return User::select('id','first_name')->whereRaw(DB::raw('EXISTS (SELECT 1 FROM sis_role_users sru WHERE sru.user_id = sis_users.id AND sru.role_id IN (1,12))'))->orderBy('first_name','ASC')->get();
}
public static function getTipos(){
return CampoOption::select('sis_campo_options.chave', 'sis_campo_options.valor')
->join('sis_campo_modulo as c', 'c.id', '=', 'sis_campo_options.id_campo_modulo')
->join('sis_modulos as m', 'm.id', '=', 'c.id_modulo')
->where('c.nome', 'tipo')->where('m.nome', 'Oferta')
->get();
}
public static function getCustoEfetivo($id_oferta){
return OfertaHasProduto::select(DB::raw('SUM(produto.custo_efetivo * oferta_has_produto.quantidade) custo_efetivo'))->join('produto', 'produto.id', '=', 'oferta_has_produto.id_produto')->where('id_oferta', $id_oferta)->value('custo_efetivo');
}
public static function getTeorAlcoolico($id_oferta){
// return OfertaHasProduto::selectRaw(DB::raw('MIN(cast(produto_caracteristica.teor_alcoolico as unsigned INTEGER)) teor_alcoolico'))
$teor_alcoolico = OfertaHasProduto::selectRaw(DB::raw("REPLACE(MIN(produto_caracteristica.teor_alcoolico), '%', '') teor_alcoolico"))
->join('produto', 'produto.id', '=', 'oferta_has_produto.id_produto')
->join('produto_caracteristica', 'produto.id', '=', 'produto_caracteristica.id_produto')
->where('id_oferta', $id_oferta)
->value('teor_alcoolico');
$teor_alcoolico = str_replace(',', '.', $teor_alcoolico);
return $teor_alcoolico;
}
public static function save($request){
$modulo = \App\Gerador::where('nome', 'Oferta')->with('campos', 'fks')->first();
$fields = $modulo->campos;
$fks = $modulo->fks;
$oferta_m = new Oferta();
$post = $request->input();
$post['meta_keywords'] = (isset($post['meta_keywords'])) ? implode(',',$post['meta_keywords']) : null;
foreach ($fields as $field) {
$arrayFields[] = $field->nome;
}
foreach ($fks as $fk) {
$arrayFields[] = $fk->nome;
}
if(isset($post['titulo']) && empty($post['titulo'])){
throw new \Exception('Campo obrigatório não informado: Título');
}
$enabledUpload = TRUE;
if($request->input('oferta_id') && !empty($request->input('oferta_id'))){
$Oferta = Oferta::find($request->input('oferta_id'));
if(isset($post['thumbnail']) && $Oferta && $Oferta->thumbnail_principal == $post['thumbnail']){
$enabledUpload = FALSE;
}
}
//Salva Thumbnail
if(isset($post['thumbnail']) && !empty($post['thumbnail']) && $enabledUpload){
$arquivo = GeralService::uploadFile(FALSE, 'oferta', ['filename' => $post['thumbnail']]);
if(!empty($arquivo->filename)){
$arrayFields[] = 'thumbnail_principal';
$post['thumbnail_principal'] = $arquivo->url;
@unlink('uploads/oferta/' . $post['thumbnail']);
}
}
$arrayFields[] = 'resolucao_imagem';
$arrayFields[] = 'preco_oferta';
$arrayFields[] = 'preco_mercado';
$arrayFields[] = 'preco_custo';
$arrayFields[] = 'custo_efetivo';
$arrayFields[] = 'percentual_desconto';
$arrayFields[] = 'url_video';
$arrayFields[] = 'agrupamento_produtos';
$arrayFields[] = 'instituicao_id';
$arrayFields[] = 'responsavel_id';
$arrayFields[] = 'valor_desconto';
$arrayFields[] = 'ocultar_desconto';
$post['ocultar_desconto'] = $post['ocultar_desconto'] == 'true' ? 1 : 0;
// $post['ocultar_desconto'] = 0;
if($request->input('oferta_id') && !empty($request->input('oferta_id'))){
$dataAtual = date('Y-m-d H:i');
$OfertaCanal = Oferta::select(DB::raw("cho.id, cho.quantidade, cho.qtde_vendida, c.tipo, cho.disponibilidade_canal, cho.ordenacao"))
->join('canal_has_oferta as cho', 'cho.id_oferta', '=', 'oferta.id')
->join('canal as c', 'c.id', '=', 'cho.id_canal')
->whereRaw('cho.deleted_at IS NULL')
->where('c.data_inicio', '<=', $dataAtual)
->where('c.data_fim', '>=', $dataAtual)
->where('oferta.id', $request->input('oferta_id'))
->first();
$id_oferta = $oferta_m->editar($arrayFields, $post, $request->input('oferta_id'));
}else{
$arrayFields[] = 'responsavel_id';
$post['responsavel_id'] = Sentinel::getUser()->id;
$id_oferta = $oferta_m->criar($arrayFields, $post);
}
$produtos = [];
$estoque_oferta = 0;
if (isset($post['produto-checkbox']) && count($post['produto-checkbox'])){
foreach ($post['produto-checkbox'] as $key => $id_produto) {
$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 = !empty($post['produto-ordem'][$key]) ? $post['produto-ordem'][$key] : (count($produtos) + 1);
$ofertaHasProduto->quantidade = $post['produto-quantidade-checkbox'][$key];
$ofertaHasProduto->estoque = $post['produto-estoque'][$key];
$ofertaHasProduto->preco_mercado = $post['produto-preco-mercado'][$key];
$ofertaHasProduto->preco_custo = $post['produto-preco-custo'][$key];
$ofertaHasProduto->valor_unitario = $post['produto-preco-venda'][$key];
$ofertaHasProduto->custo_efetivo = $post['produto-custo-efetivo'][$key];
$ofertaHasProduto->valor_total = $post['produto-preco-venda'][$key] * $post['produto-quantidade-checkbox'][$key];
$ofertaHasProduto->valor_caixa_status = isset($post['valor_caixa_status'][$key]) ? $post['valor_caixa_status'][$key] : 0;
$ofertaHasProduto->qtd_produtos_caixa = isset($post['qtd_produtos_caixa'][$key]) ? $post['qtd_produtos_caixa'][$key] : 0;
$ofertaHasProduto->save();
$produtos[] = $id_produto;
$estoque_oferta += $ofertaHasProduto->estoque;
}
OfertaHasProduto::where('id_oferta', $id_oferta)->whereNotIn('id_produto', $produtos)->delete();
}else{
OfertaHasProduto::where('id_oferta', $id_oferta)->delete();
}
DB::table('oferta_has_tag')->where('oferta_id', $id_oferta)
->delete();
$tagsArray = $request->input('tags');
if(isset($tagsArray) && empty($tagsArray) == false){
foreach($tagsArray as $tag){
DB::table('oferta_has_tag')->insert([
'oferta_id' => $id_oferta,
'tag_id' => $tag,
]);
}
}
$basicInfo = BasicInfo::first();
if($basicInfo->liberar_canais == 1 && $request->input('id')){
$estoque_oferta = $post['agrupamento_produtos'] == 0 ? $post['estoque'] : $estoque_oferta;
if($OfertaCanal){
if($OfertaCanal->tipo == 'BF' || $OfertaCanal->tipo == 'OU'){
if($OfertaCanal->qtde_vendida > $OfertaCanal->quantidade){
$diferenca = $OfertaCanal->quantidade - $OfertaCanal->qtde_vendida;
$estoque_oferta = $estoque_oferta - abs($diferenca);
$sqlChanged = "disponibilidade_canal = {$estoque_oferta}";
$sqlUpdateOferta = "UPDATE oferta SET estoque = {$estoque_oferta} WHERE id = {$id_oferta}";
DB::update(DB::raw($sqlUpdateOferta));
}else{
$sqlChanged = "disponibilidade_canal = {$estoque_oferta}";
}
if($post['estoque'] > 0 && (empty($OfertaCanal->disponibilidade_canal) || $OfertaCanal->disponibilidade_canal == 0)){
$quantidade = $OfertaCanal->quantidade + $post['estoque'];
$sqlChanged .= ", quantidade = {$quantidade}";
if($OfertaCanal->ordenacao == 999){
$sqlChanged .= ", ordenacao = 10"; //calcular ordenação conforme quantidade disponível
}
}
}else{
$quantidade = $estoque_oferta + $OfertaCanal->qtde_vendida;
$sqlChanged = "disponibilidade_canal = {$estoque_oferta}, quantidade = {$quantidade}";
if($OfertaCanal->ordenacao == 999){
$sqlChanged .= ", ordenacao = 10";
}
}
$sqlUpdate = "UPDATE canal_has_oferta SET {$sqlChanged} WHERE id = {$OfertaCanal->id}";
DB::update(DB::raw($sqlUpdate));
Log::info($sqlUpdate);
}
}
return ['status' => true, 'id' => $id_oferta];
}
public static function getColaboradoresOfertaEquipe(){
$colaboradores = Colaborador::where('permitir_oferta_equipe', 1)->get();
return $colaboradores;
}
public static function buscarOfertaEquipe(){
$ofertaEquipe = Oferta::select('colaborador.frase', 'colaborador.citacao', 'colaborador.nome as nome_colaborador', 'colaborador.thumbnail_principal as imagem_colaborador', 'oferta.*')
->where('oferta.tipo', 'EQ')
->whereYear('oferta.data', date('Y'))
->whereMonth('oferta.data', date('m'))
->leftJoin('colaborador', 'colaborador.usuario_id', 'oferta.responsavel_id')
->with('produtos.produto')
->first();
if (!$ofertaEquipe) {
return false;
}
return $ofertaEquipe;
}
public static function buscarMeusProdutosMasterClass(){
$clienteLogado = GeralService::buscarClienteLogado();
$ofertas = Oferta::query()
->select('oferta.*')
->join('pedido_venda_has_oferta', 'pedido_venda_has_oferta.oferta_id', 'oferta.id')
->join('pedido_venda', 'pedido_venda.id', 'pedido_venda_has_oferta.pedido_venda_id')
->where('pedido_venda.id_cliente', $clienteLogado->id)
->whereIn('pedido_venda.id_status_pedido_venda', [2, 3, 7])
->pluck('oferta.id')
->toArray();
if(count($ofertas) == 0){
return [];
}
$produtos = Produto::query()
->select('produto.*', 'oferta.slug as slug_oferta')
->join('oferta_has_produto', 'oferta_has_produto.id_produto', 'produto.id')
->join('tipo_de_produto', 'tipo_de_produto.id', 'produto.id_tipo_produto')
->join('oferta', 'oferta.id', 'oferta_has_produto.id_oferta')
->whereIn('oferta_has_produto.id_oferta', $ofertas)
->where('tipo_de_produto.slug', 'masterclass')
->groupBy('produto.id')
->get();
return $produtos;
}
}