| 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/Modules/OfertaReserva/Models/ |
Upload File : |
<?php
namespace App\Modules\OfertaReserva\Models;
use DB;
use App\MyModel;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use \Dimsav\Translatable\Translatable;
use App\CampoModulo;
use Session;
use Cart;
use Illuminate\Support\Facades\Log;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\OfertaHasProduto\Models\OfertaHasProduto;
use App\BasicInfo;
use App\Services\GeralService;
class OfertaReserva extends MyModel
{
// use LogsActivity;
// use HasSlug;
use Translatable;
protected $table = 'oferta_reserva';
protected $guarded = [];
private $rules = array();
private $messages = array();
public $translatedAttributes = [];
public $translationModel = 'App\Modules\OfertaReserva\Models\OfertaReservaDescricao';
public function __construct(){
parent::__construct();
$this->setMessages($this->messages);
$this->setRules($this->rules);
$this->translatedAttributes = CampoModulo::join('sis_modulos', 'sis_campo_modulo.id_modulo', '=', 'sis_modulos.id')->where('sis_campo_modulo.translatable', 1)->where('sis_modulos.nome', 'OfertaReserva')->pluck('sis_campo_modulo.nome')->toArray();
}
public static function getLocalTz(){
return config('app.local_tz');
}
public function getLogNameToUse(string $eventName = ''): string
{
return 'log_oferta_reserva';
}
/**
* Get the options for generating the slug.
*/
public function getSlugOptions() : SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom(['nome', 'titulo'])
->saveSlugsTo('slug');
}
public function getBySlug($slug){
return DB::table($this->table)->where('slug',$slug)->firstOrFail();
}
public function criar($fields, $input){
$insert = [];
foreach ($fields as $field) {
$insert[$field] = $input[$field];
}
$oferta_reserva = new OfertaReserva();
$oferta_reserva->fill($insert);
$oferta_reserva->save();
return $oferta_reserva->id;
}
public function editar($fields, $input, $id){
$insert = [];
foreach ($fields as $field) {
$insert[$field] = $input[$field];
}
$oferta_reserva = OfertaReserva::find($id);
$oferta_reserva->fill($insert);
$oferta_reserva->save();
return $id;
}
public function deletar($id){
$oferta_reserva = OfertaReserva::find($id);
$oferta_reserva->delete();
return true;
}
public function getImagem($id){
return DB::table($this->table.'_imagens')->find($id);
}
public function getImagens($id){
return DB::table($this->table.'_imagens')->where('id_oferta_reserva', $id)->get();
}
public function criar_imagem($input){
return DB::table($this->table.'_imagens')->insert([
[
'id_oferta_reserva' => $input['id_oferta_reserva'],
'thumbnail_principal' => $input['thumbnail_principal'],
]
]);
}
public function deletar_imagem($id){
return DB::table($this->table.'_imagens')
->where('id', $id)
->delete();
}
public function getNextAutoIncrement(){
$lastId = DB::select("SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = '$this->table' ORDER BY table_name;")[0]->AUTO_INCREMENT;
return $lastId;
}
public function cliente(){
return $this->belongsTo('App\Modules\Cadastro\Models\Cadastro', 'cliente_id');
}
public function oferta(){
return $this->belongsTo('App\Modules\Oferta\Models\Oferta', 'oferta_id');
}
public static function atualizaEstoque($oferta, $pedidoVenda, $quantidade, $id_produto = FALSE){
$data_atual = OfertaReserva::dataAtual();
$reserva = OfertaReserva::where('oferta_id', $oferta->id)->where('hash', session('hash_oferta'))->first();
$BasicInfo = BasicInfo::first();
$estoque = $oferta->estoque - $quantidade;
$qtde_vendida = $oferta->qtde_vendida + $quantidade;
if($reserva && $data_atual < $reserva->data_expiracao && $BasicInfo->reserva_estoque == 1){
OfertaReserva::where('oferta_id', $oferta->id)->where('hash', session('hash_oferta'))->delete();
$sql = "UPDATE oferta SET qtde_vendida = {$qtde_vendida} WHERE id = {$oferta->id}";
}else{
$oferta->estoque = $estoque;
$sql = "UPDATE oferta SET qtde_vendida = {$qtde_vendida}, estoque = {$estoque} WHERE id = {$oferta->id}";
}
//Verifica ProdutoxEstoque
if($id_produto){
$OfertaProduto = OfertaHasProduto::where('id_oferta', $oferta->id)->where('id_produto', $id_produto)->first();
$estoque = $OfertaProduto->estoque - $quantidade;
$sqlUpdate = "UPDATE oferta_has_produto SET estoque = {$estoque} WHERE id_oferta = {$oferta->id} AND id_produto = {$id_produto}";
DB::update(DB::raw($sqlUpdate));
}
DB::update(DB::raw($sql));
GeralService::atualizaQtdeVendidaCanal($oferta, $quantidade);
}
public static function limpaSession(){
session()->forget('data_controle');
session()->forget('data_expiracao');
session()->forget('hash_oferta');
}
public static function check($oferta, $quantidade, $estoque = FALSE){
$BasicInfo = BasicInfo::first();
$estoque = $estoque ? $estoque : $oferta->estoque;
if($BasicInfo->reserva_estoque == 1){
$reserva = OfertaReserva::where('oferta_id', $oferta->id)->where('hash', session('hash_oferta'))->first();
if($reserva && ($quantidade > ($oferta->estoque + $reserva->quantidade))){
return false;
}elseif(!$reserva && $quantidade > $oferta->estoque){
return false;
}
return true;
}elseif($quantidade > $estoque){
return false;
}
return true;
}
public static function dataExpiracao($tempo_expiracao){
$date = date('Y-m-d H:i:s', strtotime("+{$tempo_expiracao} minutes"));
if(!empty(OfertaReserva::getLocalTz())){
$date = date('Y-m-d H:i:s', strtotime(OfertaReserva::getLocalTz() . " hour",strtotime($date)));
}
return $date;
}
public static function dataControle(){
if(!empty(OfertaReserva::getLocalTz())){
return date('Y-m-d H:i:s', strtotime(OfertaReserva::getLocalTz() . " hour",strtotime(date('Y-m-d H:i:s'))));
}
return date('Y-m-d H:i:s');
}
public static function dataAtual(){
if(!empty(OfertaReserva::getLocalTz())){
return date('Y-m-d H:i:s', strtotime(OfertaReserva::getLocalTz() . " hour",strtotime(date('Y-m-d H:i:s'))));
}
return date('Y-m-d H:i:s');
}
public static function reserva($oferta, $quantidade, $action = 'add'){
$BasicInfo = BasicInfo::first();
$keyReserva = str_replace("=", "", base64_encode('reservaTimeout'));
if($BasicInfo->reserva_estoque != 1){ // || isset($_COOKIE[$keyReserva])
return false;
}
$tempo_reserva_estoque = (!empty($BasicInfo->tempo_reserva_estoque) ? $BasicInfo->tempo_reserva_estoque : "00:15");
$tempo_reserva = explode(":", $tempo_reserva_estoque);
$tempo_expiracao = (int) $tempo_reserva[1]; //em minutos
$clienteLogado = GeralService::buscarClienteLogado();
$cliente = ($clienteLogado ? $clienteLogado->id : NULL);
$data_atual = OfertaReserva::dataAtual();
$data_controle = (session('data_controle') ? session('data_controle') : OfertaReserva::dataControle());
$data_expiracao = (session('data_expiracao') ? session('data_expiracao') : OfertaReserva::dataExpiracao($tempo_expiracao));
$hash_oferta = (session('hash_oferta') ? session('hash_oferta') : md5($data_expiracao.microtime(true)));
$reservas = OfertaReserva::where('hash', $hash_oferta)
->where('data_controle', $data_controle)
->where('data_expiracao', $data_expiracao)->get();
if(!session('data_expiracao') || (count($reservas) == 0) || (session('data_expiracao') && $data_atual > session('data_expiracao'))){
if(session('data_expiracao') && $data_atual > session('data_expiracao')){
$data_controle = OfertaReserva::dataControle();
$data_expiracao = OfertaReserva::dataExpiracao($tempo_expiracao);
$hash_oferta = md5($data_expiracao.microtime(true));
if(count($reservas) > 0){
foreach ($reservas as $objOfertaReserva) {
$objOfertaReserva->data_controle = $data_controle;
$objOfertaReserva->data_expiracao = $data_expiracao;
$objOfertaReserva->hash = $hash_oferta;
$objOfertaReserva->save();
}
}else{
foreach (Cart::content() as $item) {
if($item->options->id == $oferta->id){
continue;
}
$OfertaReserva = new OfertaReserva;
$OfertaReserva->oferta_id = $item->options->id;
$OfertaReserva->cliente_id = $cliente;
$OfertaReserva->data_controle = $data_controle;
$OfertaReserva->data_expiracao = $data_expiracao;
$OfertaReserva->hash = $hash_oferta;
$OfertaReserva->quantidade = $item->qty;
$OfertaReserva->save();
$objOferta = Oferta::find($item->options->id);
if($objOferta->estoque > 0){
$objOferta->estoque = $objOferta->estoque - $item->qty;
$objOferta->save();
}
}
}
session(['data_controle' => $data_controle, 'data_expiracao' => $data_expiracao, 'hash_oferta' => $hash_oferta]);
}elseif(count($reservas) == 0){
$data_controle = OfertaReserva::dataControle();
$data_expiracao = OfertaReserva::dataExpiracao($tempo_expiracao);
$hash_oferta = md5($data_expiracao.microtime(true));
session(['data_controle' => $data_controle, 'data_expiracao' => $data_expiracao, 'hash_oferta' => $hash_oferta]);
}else{
session(['data_controle' => $data_controle, 'data_expiracao' => $data_expiracao, 'hash_oferta' => md5($data_expiracao.microtime(true))]);
}
}
$query = OfertaReserva::where('oferta_id', $oferta->id)
->where('hash', session('hash_oferta'))
->where('data_controle', session('data_controle'))
->where('data_expiracao', session('data_expiracao'));
$OfertaReserva = $query->first();
if($action == 'remove'){
if($OfertaReserva){
$oferta->estoque = $oferta->estoque + $quantidade;
$oferta->save();
$OfertaReserva->delete();
}
if(count($reservas) <= 1){
session()->forget('data_controle');
session()->forget('data_expiracao');
session()->forget('hash_oferta');
}
}else{
if(!$OfertaReserva){
$OfertaReserva = new OfertaReserva;
$OfertaReserva->oferta_id = $oferta->id;
$OfertaReserva->cliente_id = $cliente;
$OfertaReserva->data_controle = session('data_controle');
$OfertaReserva->data_expiracao = session('data_expiracao');
$OfertaReserva->hash = session('hash_oferta');
$qtdeReserva = $quantidade;
$action = 'add';
}else{
$qtdeReserva = $OfertaReserva->quantidade;
}
$OfertaReserva->quantidade = $quantidade;
$OfertaReserva->save();
if($action == 'add'){
$oferta->estoque = $oferta->estoque - $quantidade;
}else{
//update
if($qtdeReserva > $quantidade){
$oferta->estoque = $oferta->estoque + ($qtdeReserva - $quantidade);
}else{
$oferta->estoque = $oferta->estoque - ($quantidade - $qtdeReserva);
}
}
$oferta->save();
}
$data_atual = OfertaReserva::dataAtual();
$reserva = [
'data_controle' => (session('data_controle') ? date('Y/m/d H:i:s', strtotime(session('data_controle'))) : ''),
'data_expiracao' => (session('data_expiracao') ? date('Y/m/d H:i:s', strtotime(session('data_expiracao'))) : ''),
'data_expire' => (session('data_expiracao') ? date('d/m/Y H:i:s', strtotime(session('data_expiracao'))) : ''),
'data_atual' => date('d/m/Y H:i:s', strtotime($data_atual))
];
return $reserva;
}
}