403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Services/ConsumoService.php
<?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;

    }

}

Youez - 2016 - github.com/yon3zu
LinuXploit