| Server IP : 54.94.228.101 / Your IP : 172.28.20.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 DB;
use Sentinel;
use Illuminate\Support\Facades\Log;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use Exception;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\CadastroEndereco\Models\CadastroEndereco;
use App\Modules\CadastroConsumo\Models\CadastroConsumo;
use App\Modules\CadastroConsumoPais\Models\CadastroConsumoPais;
use App\Modules\CadastroConsumoTipo\Models\CadastroConsumoTipo;
use App\Modules\PedidoVendaHasProduto\Models\PedidoVendaHasProduto;
use App\Modules\PaisDistanciaCidade\Models\PaisDistanciaCidade;
use App\Modules\CidadeDistancia\Models\CidadeDistancia;
use Session;
class ConsumoService {
private static $qtde_graos_por_garrafa = 400;
private static $api_key_gmaps = 'AIzaSyC4c9JQn0y_riIRA3DYGtBqjQr6S30SkzM';
public static function buscarCidadesEnderecos($cidade_id = FALSE){
$query = CadastroEndereco::select(DB::raw('COUNT(cidade_id) cidades, cidade_id, cidade.nome, cidade.estado_sigla'))
->join('cidade', 'cidade.id', '=', 'cadastro_endereco.cidade_id')
->where('cidade_id', '<>', 0)
->whereRaw('NOT EXISTS (SELECT 1 FROM cidade_distancia cd WHERE cd.cidade_id_destino = cidade.id)');
if($cidade_id){
if(is_array($cidade_id)){
$query->whereIn('cidade_id', $cidade_id);
}else{
$query->where('cidade_id', $cidade_id);
}
}
//Group By
$query->groupBy('cidade_id');
$cidades = $query->orderBy('cidades', 'DESC')->get();
return $cidades;
}
public static function calcularDistanciaCidades($CidadeOrigem, $destino_nome, $destino_estado_sigla){
$distancia = 0;
$origem = "{$CidadeOrigem->nome},{$CidadeOrigem->estado_sigla}";
$destino = "{$destino_nome},{$destino_estado_sigla}";
$resultado = ConsumoService::callDistanceMatrixAPI(['origins' => $origem, 'destinations' => $destino]);
$distancia = ($resultado->row->element->distance->value / 1000);
$distancia = number_format($distancia, 0, '', '');
$distancia = (int) ($distancia);
return $distancia;
}
public static function requestXml($url_api, $body = ''){
try {
$method = 'GET';
$options = [
'decode_content' => false
];
if((is_array($body) && count($body) > 0) || !empty($body)){
if(is_array($body)){
$body = json_encode($body);
}
$headers = ['Content-Type' => 'application/xml'];
$options = array_merge($options, [
'headers' => $headers,
'body' => $body
]);
}
$client = new Client();
$resHttp = $client->request(
$method,
$url_api,
$options
);
$data = $resHttp->getBody()->getContents();
$resultado = simplexml_load_string($data);
return $resultado;
} catch (ClientException $e) {
$retornoAPI = new \stdClass;
$retornoAPI->erro = new \stdClass;
$this->info('Error Code => ' . $e->getCode());
if($e->getCode() == 403){
$retornoAPI->erro->mensagem = 'Acesso não autorizado!';
Log::info($retornoAPI->erro->mensagem);
// throw new Exception(json_encode($retornoAPI));
}
echo "<pre style='text-align:left'>";
print_r($e->getMessage());
die;
$json = $e->getResponse()->getBody()->getContents();
Log::info($e->getResponse()->getBody()->getContents());
// throw new Exception($json);
}
}
public static function callDistanceMatrixAPI($data){
$api_key_gmaps = 'AIzaSyC4c9JQn0y_riIRA3DYGtBqjQr6S30SkzM';
$curl = curl_init();
$url = "https://maps.googleapis.com/maps/api/distancematrix/xml";
$url = sprintf("%s?%s", $url, http_build_query($data));
$url .= "&mode=driving&language=pt-BR&sensor=false&key={$api_key_gmaps}";
$resultado = ConsumoService::requestXml($url);
return $resultado;
}
public static function buscarConsumoCliente($cadastro_id = FALSE){
$query = PedidoVendaHasProduto::select(DB::raw("SUM(pedido_venda_has_produto.quantidade) qtde_vinhos, pedido_venda_has_produto.id_produto, pedido_venda_has_produto.id_oferta, pv.id_cliente, (SELECT qtde_vinhos FROM cadastro_consumo c WHERE c.cadastro_id = pv.id_cliente) 'consumo_vinhos', (SUM(oferta.preco_mercado) - SUM(oferta.preco_oferta)) as 'valor_economizado'"))
->join('pedido_venda as pv', 'pv.id', '=', 'pedido_venda_has_produto.id_pedido_venda')
->join('produto as p', 'p.id', '=', 'pedido_venda_has_produto.id_produto')
->join('tipo_de_produto as t', 't.id', '=', 'p.id_tipo_produto')
->leftJoin('oferta', 'oferta.id', '=', 'pedido_venda_has_produto.id_oferta')
->where('t.grupo', 'vinhos')
->where('pv.id_cliente', '<>', 0);
if($cadastro_id){
if(is_array($cadastro_id)){
$query->whereIn('pv.id_cliente', $cadastro_id);
}else{
$query->where('pv.id_cliente', $cadastro_id);
}
}
//Group By
$query->groupBy('pv.id_cliente');
$query->havingRaw('qtde_vinhos > 0 AND (qtde_vinhos > consumo_vinhos OR consumo_vinhos IS NULL)');
$consumos = $query->orderBy('pv.id_cliente', 'ASC')->limit(1000)->get();
return $consumos;
}
public static function calcularPercentualPais($cadastro_id){
$consumoTotal = CadastroConsumoPais::select(DB::raw('SUM(qtde_vinhos) total_vinhos'))->where('cadastro_id', $cadastro_id)->first();
$consumoPreferencia = CadastroConsumoPais::select('qtde_vinhos', 'pais_id')->where('cadastro_id', $cadastro_id)->orderBy('qtde_vinhos', 'DESC')->first();
$percentual = 0;
if($consumoTotal && $consumoPreferencia){
$percentual = 0;
if($consumoTotal->total_vinhos > 0){
$percentual = ($consumoPreferencia->qtde_vinhos * 100) / $consumoTotal->total_vinhos;
$percentual = number_format($percentual, 2, '.', '');
}
$graos_de_uva = $consumoTotal->total_vinhos * self::$qtde_graos_por_garrafa;
$sql = "UPDATE cadastro_consumo SET percentual_pais = {$percentual}, graos_de_uva = {$graos_de_uva} WHERE cadastro_id = {$cadastro_id}";
DB::update($sql);
}
return $percentual;
}
public static function buscarDistanciasPaises(){
$paises = PaisDistanciaCidade::select('pais_id', 'km_percorrido')->get();
$distanciasPaises = [];
foreach ($paises as $item) {
$distanciasPaises[$item->pais_id] = $item->km_percorrido;
}
return $distanciasPaises;
}
public static function calcularKmPercorrido($CadastroConsumo, $distanciasPaises){
$kms_percorrido = 0;
$ConsumoPaises = $CadastroConsumo->paises();
$DistanciaEndereco = $CadastroConsumo->enderecoPrincipal() ? $CadastroConsumo->enderecoPrincipal() : 1;
foreach ($ConsumoPaises as $ConsumoPais){
$DistanciaPais = (isset($distanciasPaises[$ConsumoPais->pais_id]) ? $distanciasPaises[$ConsumoPais->pais_id] : 0);
$km_percorrido = $DistanciaPais * $ConsumoPais->qtde_vinhos;
$kms_percorrido += $km_percorrido;
$sql = "UPDATE cadastro_consumo_pais SET km_percorrido = {$km_percorrido} WHERE id = {$ConsumoPais->id}";
DB::update($sql);
}
//Fórmula KM Percorrido: País > RS (VinumDay) > Distância Endereço Cliente;
$sql = "UPDATE cadastro_consumo SET km_percorrido = {$kms_percorrido} WHERE cadastro_id = {$CadastroConsumo->cadastro_id}";
DB::update($sql);
return $kms_percorrido;
}
public static function buscarConsumoTipo($cadastro_id = FALSE, $last_cadastro_id = FALSE){
$query = PedidoVendaHasProduto::select(DB::raw("SUM(pedido_venda_has_produto.quantidade) qtde_vinhos, pv.id_cliente, p.id_tipo_produto, (SELECT qtde_vinhos FROM cadastro_consumo c WHERE c.cadastro_id = pv.id_cliente) 'consumo_vinhos'"))
->join('pedido_venda as pv', 'pv.id', '=', 'pedido_venda_has_produto.id_pedido_venda')
->join('produto as p', 'p.id', '=', 'pedido_venda_has_produto.id_produto')
->join('tipo_de_produto as t', 't.id', '=', 'p.id_tipo_produto')
->where('t.grupo', 'vinhos')
->where('pv.id_cliente', '<>', 0);
if($cadastro_id){
if(is_array($cadastro_id)){
$query->whereIn('pv.id_cliente', $cadastro_id);
}else{
$query->where('pv.id_cliente', $cadastro_id);
}
}
if($last_cadastro_id){
$query->where('pv.id_cliente', '<=' ,$last_cadastro_id);
}
//Group By
$query->groupBy('pv.id_cliente')->groupBy('p.id_tipo_produto');
$query->havingRaw('qtde_vinhos > 0 AND (qtde_vinhos > consumo_vinhos OR consumo_vinhos IS NULL)');
$consumos = $query->orderBy('pv.id_cliente', 'ASC')->orderBy('qtde_vinhos', 'DESC')->get();
$consumosCliente = [];
foreach ($consumos as $consumo) {
$consumosCliente[$consumo->id_cliente][] = $consumo;
}
return $consumosCliente;
}
public static function calcularConsumoTipo($cadastro_id, $consumos){
$id_cliente = 0;
$cont = 0;
$consumoTipo = [];
$consumosCliente = [];
foreach ($consumos as $consumo) {
if($id_cliente != $consumo->id_cliente){
if(count($consumosCliente) > 0){
CadastroConsumoTipo::insert($consumosCliente);
}
$id_cliente = $consumo->id_cliente;
$consumosCliente = [];
$sql = "UPDATE cadastro_consumo SET produto_id_tipo = {$consumo->id_tipo_produto} WHERE cadastro_id = {$consumo->id_cliente}";
DB::update($sql);
$consumosTipo = CadastroConsumoTipo::where('cadastro_id', $consumo->id_cliente)->get();
if(count($consumosTipo) > 0){
foreach ($consumosTipo as $tipo) {
$consumoTipo[$consumo->id_cliente][$tipo->produto_id_tipo] = $tipo;
}
}
}
if(!isset($consumoTipo[$consumo->id_cliente][$consumo->id_tipo_produto])){
$consumosCliente[] = [
'qtde_vinhos' => $consumo->qtde_vinhos,
'cadastro_id' => $consumo->id_cliente,
'produto_id_tipo' => $consumo->id_tipo_produto,
'created_at' => date('Y-m-d H:i:s')
];
}elseif($consumoTipo[$consumo->id_cliente][$consumo->id_tipo_produto]->qtde_vinhos != $consumo->qtde_vinhos){
DB::table('cadastro_consumo_tipo')->where('cadastro_id', $consumo->id_cliente)->where('produto_id_tipo', $consumo->id_tipo_produto)->update(['qtde_vinhos' => $consumo->qtde_vinhos, 'updated_at' => date('Y-m-d H:i:s')]);
}
$cont++;
if($cadastro_id && count($consumos) == $cont){
CadastroConsumoTipo::insert($consumosCliente);
$consumosCliente = [];
}
}
return true;
}
public static function buscarConsumoPais($cadastro_id = FALSE, $last_cadastro_id = FALSE){
$query = PedidoVendaHasProduto::select(DB::raw("SUM(pedido_venda_has_produto.quantidade) qtde_vinhos, pv.id_cliente, p.id_pais_origem, (SELECT qtde_vinhos FROM cadastro_consumo c WHERE c.cadastro_id = pv.id_cliente) 'consumo_vinhos'"))
->join('pedido_venda as pv', 'pv.id', '=', 'pedido_venda_has_produto.id_pedido_venda')
->join('produto as p', 'p.id', '=', 'pedido_venda_has_produto.id_produto')
->join('tipo_de_produto as t', 't.id', '=', 'p.id_tipo_produto')
->where('t.grupo', 'vinhos')
->where('pv.id_cliente', '<>', 0);
if($cadastro_id){
if(is_array($cadastro_id)){
$query->whereIn('pv.id_cliente', $cadastro_id);
}else{
$query->where('pv.id_cliente', $cadastro_id);
}
}
if($last_cadastro_id){
$query->where('pv.id_cliente', '<=' ,$last_cadastro_id);
}
//Group By
$query->groupBy('pv.id_cliente')->groupBy('p.id_pais_origem');
$query->havingRaw('qtde_vinhos > 0 AND (qtde_vinhos > consumo_vinhos OR consumo_vinhos IS NULL)');
$consumos = $query->orderBy('pv.id_cliente', 'ASC')->orderBy('qtde_vinhos', 'DESC')->get();
$id_cliente = 0;
$cont = 0;
$consumoPais = [];
$consumosCliente = [];
foreach ($consumos as $consumo){
$consumosCliente[$consumo->id_cliente][] = $consumo;
}
return $consumosCliente;
}
public static function calcularConsumoPais($cadastro_id, $consumos){
$id_cliente = 0;
$cont = 0;
$consumoPais = [];
$consumosCliente = [];
foreach ($consumos as $consumo) {
$CadastroConsumo = CadastroConsumo::select('qtde_vinhos')->where('cadastro_id', $consumo->id_cliente)->first();
if($id_cliente != $consumo->id_cliente){
if(count($consumosCliente) > 0){
CadastroConsumoPais::insert($consumosCliente);
}
$id_cliente = $consumo->id_cliente;
$consumosCliente = [];
$sql = "UPDATE cadastro_consumo SET pais_id_preferencia = {$consumo->id_pais_origem} WHERE cadastro_id = {$consumo->id_cliente}";
DB::update($sql);
$consumosTipo = CadastroConsumoPais::where('cadastro_id', $consumo->id_cliente)->get();
if(count($consumosTipo) > 0){
foreach ($consumosTipo as $tipo) {
$consumoPais[$consumo->id_cliente][$tipo->pais_id] = $tipo;
}
}
}
$percentual = 0;
if($CadastroConsumo->qtde_vinhos > 0){
$percentual = ($consumo->qtde_vinhos * 100) / $CadastroConsumo->qtde_vinhos;
$percentual = number_format($percentual, 2, '.', '');
}
if(!isset($consumoPais[$consumo->id_cliente][$consumo->id_pais_origem])){
$consumosCliente[] = [
'qtde_vinhos' => $consumo->qtde_vinhos,
'percentual' => $percentual,
'cadastro_id' => $consumo->id_cliente,
'pais_id' => $consumo->id_pais_origem,
'created_at' => date('Y-m-d H:i:s')
];
}elseif($consumoPais[$consumo->id_cliente][$consumo->id_pais_origem]->qtde_vinhos != $consumo->qtde_vinhos){
$dataAtual = date('Y-m-d H:i:s');
$sql = "UPDATE cadastro_consumo_pais SET qtde_vinhos = {$consumo->qtde_vinhos}, percentual = {$percentual}, updated_at = '{$dataAtual}' WHERE cadastro_id = {$consumo->id_cliente} AND pais_id = {$consumo->id_pais_origem}";
DB::update($sql);
}
$cont++;
if(!is_array($cadastro_id) && count($consumos) == $cont && count($consumosCliente) > 0){
CadastroConsumoPais::insert($consumosCliente);
$consumosCliente = [];
}
}
return true;
}
}