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

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Services/ErpService.php
<?php

namespace App\Services;

use DB;
use Sentinel;

use App\Modules\Empresa\Models\Empresa;
use App\Modules\Produto\Models\Produto;
use App\Modules\ProdutoErp\Models\ProdutoErp;
use App\Modules\QuantidadeReserva\Models\QuantidadeReserva;
use App\Modules\ContaReceberLog\Models\ContaReceberLog;

use Illuminate\Support\Facades\Log;
use App\Services\GeralService;
use Session;
use Exception;

class ErpService {

    public static function getStatusErro(){

        try {
            
            $status = [
                1  => 'token não informado',
                2  => 'token inválido ou não encontrado',
                3  => 'XML mal formado ou com erros',
                4  => 'Erro de processamento de XML',
                5  => 'API bloqueada ou sem acesso',
                6  => 'API bloqueada, limite excedido',
                7  => 'Espaço da empresa Esgotado',
                8  => 'Empresa bloqueada',
                9  => 'Números de sequencia em duplicidade',
                10 => 'Parametro não informado',
                20 => 'A consulta não retornou registros',
                21 => 'A consulta retornou muitos registros',
                22 => 'O xml tem mais registros que o permitido',
                23 => 'A página que você está tentando obter não existe',
                30 => 'Erro de duplicidade de registro',
                31 => 'Erros de validação',
                32 => 'Registro não localizado',
                33 => 'Registro localizado em duplicidade',
                34 => 'Nota Fiscal não autorizada',
                99 => 'Sistema em manutenção'
            ];

            return $status;

        } catch (Exception $e) {
            return [];
        }
    }

     /**
    * @param idsExpedicao Array()
    * @param Empresa Object Model Empresa
    */
    public static function atualizarDespachoNotaFiscal($notafiscal, $Empresa){

        /*if(env('APP_ENV') != 'production'){
            return false;
        }*/

        try {
            
            $token = Empresa::getApiKeyTinyErp($Empresa);

            $url = 'https://api.tiny.com.br/api2/nota.fiscal.cadastrar.codigo.rastreamento.php';
            $content = "token=$token&notafiscal=".json_encode($notafiscal)."&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            Log::info("ErpService::atualizarDespachoNotaFiscal => notafiscal: ". json_encode($notafiscal) . " " . $e->getMessage());
            throw new Exception($e->getMessage());
        }

    }

     /**
    * @param idsExpedicao Array()
    * @param Empresa Object Model Empresa
    */
    public static function agruparExpedicao($idsExpedicao, $Empresa, $tipoObjetos = 'notafiscal'){

        /*if(env('APP_ENV') != 'production'){
            return false;
        }*/

        try {
            
            $token = Empresa::getApiKeyTinyErp($Empresa);

            $url      = 'https://api.tiny.com.br/api2/expedicao.incluir.agrupamento.php';
            $content  = "token={$token}&idsExpedicao=" . implode(',', $idsExpedicao) . "&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            Log::info("ErpService::agruparExpedicao => idsExpedicao: ". implode(",", $idsExpedicao) . " " . $e->getMessage());
            throw new Exception($e->getMessage());
        }

    }

    /**
    * @param idObjetos Array()
    * @param Empresa Object Model Empresa
    * @param tipoObjetos String 'notafiscal', 'venda'
    */
    public static function liberarExpedicao($idObjetos, $Empresa, $tipoObjetos = 'notafiscal'){

        /*if(env('APP_ENV') != 'production'){
            return false;
        }*/

        try {
            
            $token = Empresa::getApiKeyTinyErp($Empresa);

            $url      = 'https://api.tiny.com.br/api2/expedicao.liberar.objetos.php';
            $content  = "token={$token}&idObjetos=" . implode(',', $idObjetos) . "&tipoObjetos={$tipoObjetos}&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            Log::info("ErpService::liberarExpedicao => idObjetos: ". implode(",", $idObjetos) . " " . $e->getMessage());
            throw new Exception($e->getMessage());
        }

    }

    /**
    * @param idObjetos Integer
    * @param Empresa Object Model Empresa
    * @param tipoObjeto String 'notafiscal', 'venda'
    */
    public static function obterExpedicao($idObjeto, $Empresa, $tipoObjeto = 'notafiscal'){

        /*if(env('APP_ENV') != 'production'){
            return false;
        }*/

        try {
            
            $token = Empresa::getApiKeyTinyErp($Empresa);

            $url      = 'https://api.tiny.com.br/api2/expedicao.obter.php';
            $content  = "token={$token}&idObjeto={$idObjeto}&tipoObjeto={$tipoObjeto}&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            Log::info("ErpService::obterExpedicao => idObjeto: {$idObjeto} " . $e->getMessage());
            throw new Exception($e->getMessage());
        }

    }

    /**
    * @param data Date dd/mm/YYYY
    * @param Empresa Object Model Empresa
    * @param formaEnvio String 'T' (Transportadora)
    */
    public static function pesquisarExpedicao($data, $Empresa, $formaEnvio = 'T'){

        /*if(env('APP_ENV') != 'production'){
            return false;
        }*/

        try {
            
            $token = Empresa::getApiKeyTinyErp($Empresa);

            $url      = 'https://api.tiny.com.br/api2/expedicao.pesquisa.php';
            $content  = "token={$token}&dataInicial={$data}&dataFinal={$data}&formaEnvio={$formaEnvio}&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            Log::info("ErpService::pesquisarExpedicao => dataInicial: 14/02/2022 & dataFinal: 14/02/2022 " . $e->getMessage());
            throw new Exception($e->getMessage());
        }

    }

     /**
    * @param Object {empresa, vencimento, valorTitulo}
    */
    public static function alterarEstoque($objEstoque){

        if(env('APP_ENV') != 'production'){
            return false;
        }

        try {
            
            $Empresa = Empresa::where('id', $objEstoque->produto_erp->empresa_id)->first();
            $token   = Empresa::getApiKeyTinyErp($Empresa);

            if(empty($objEstoque->produto_erp->id_tiny)){
                throw new Exception("ID Tiny não informado ou não existe!");
            }

            $body = [
                'estoque' => [
                    'idProduto'   => $objEstoque->produto_erp->id_tiny,
                    'tipo'        => $objEstoque->tipo,
                    'quantidade'  => $objEstoque->quantidade,
                    'observacoes' => $objEstoque->observacoes
                ]
            ];

            $url      = 'https://api.tiny.com.br/api2/produto.atualizar.estoque.php';
            $content  = "token={$token}&estoque=" . json_encode($body) . "&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            return $response;

        } catch (Exception $e) {
            throw new Exception($e->getMessage());
        }

    }

    /**
    * @param Object {empresa, vencimento, valorTitulo}
    */
    public static function contaReceberGerarTitulo($objConta){

        try {
            
            $Empresa = Empresa::where('id', $objConta->empresa)->first();
            $token   = Empresa::getApiKeyTinyErp($Empresa);
            
            $data        = explode("/", $objConta->data);
            $dataHistory = "{$data[0]}{$data[1]}" . substr($data[2], 2, 2);

            if($objConta->tipo == 'card'){

                $body = [
                    'conta' => [
                        'cliente' => [
                            'codigo'            => 100,
                            'nome'              => "Pagar.me Pagamentos S.a.",
                            'atualizar_cliente' => 'N'
                        ],
                        'data'            => $objConta->data,
                        'vencimento'      => $objConta->vencimento,
                        'categoria'       => '1.01 Receita de Vendas',
                        'forma_pagamento' => 'Cartão de Crédito',
                        'historico'       => "Valor receita em {$data[0]}/{$data[1]}/{$data[2]}",
                        'nro_documento'   => $dataHistory,
                        'valor'           => $objConta->valor
                    ]
                ];

            }else{

                $body = [
                    'conta' => [
                        'cliente' => [
                            'nome'              => $objConta->nome,
                            'atualizar_cliente' => 'N'
                        ],
                        'data'            => $objConta->data,
                        'vencimento'      => $objConta->vencimento,
                        'categoria'       => '1.01 Receita de Vendas',
                        'forma_pagamento' => 'Dinheiro',
                        'historico'       => "Venda via depósito ref. pedido venda {$objConta->id_pedido_venda}",
                        'nro_documento'   => (isset($objConta->id_pedido_venda) ? $objConta->id_pedido_venda : $dataHistory),
                        'valor'           => $objConta->valor
                    ]
                ];

            }

            $url      = 'https://api.tiny.com.br/api2/conta.receber.incluir.php';
            $content  = "token=$token&conta=" . json_encode($body) . "&formato=json";
            $response = json_decode(GeralService::enviarREST($url, $content));

            $log = ContaReceberLog::saveLog($objConta, $response, $body);

            return $response;

        } catch (Exception $e) {
            return ['status' => false, 'message' => $e->getMessage()];
        }

    }

    public static function alterarProduto($produto){

        if(env('APP_ENV') != 'production'){
            return false;
        }

        $resultAtualizacao = true;

        if(count($produto->produtoserp) > 0){

            foreach ($produto->produtoserp as $item){

                $token             = $item->empresa->api_key_tiny_erp;
                $produtosAtualizar = [];

                $produto_nome = str_replace(["&"], '', $item->produto->nome);

                if($item->produto->sincronizar_tiny != 1){
                    continue;
                }

                $obj                        = new \stdClass();
                $obj->produto               = new \stdClass();
                $obj->produto->sequencia    = $item->produto->id;
                $obj->produto->nome         = $produto_nome;
                $obj->produto->codigo       = $item->produto->sku;
                $obj->produto->unidade      = (!empty($item->produto->unidade_de_medida) ? $item->produto->unidade_de_medida : 'gr');
                $obj->produto->preco        = floatval(number_format($item->produto->preco_de_venda,2,'.',''));
                $obj->produto->preco_custo  = floatval(number_format($item->produto->preco_custo,2,'.',''));
                $obj->produto->localizacao  = $item->produto->localizador;
                $obj->produto->situacao     = $item->produto->situacao;
                $obj->produto->peso_liquido = $item->produto->peso_liquido;
                $obj->produto->peso_bruto   = $item->produto->peso_bruto;
                $obj->produto->tipo         = 'P';
                $obj->produto->origem       = $item->produto->origem;
                $obj->produto->ncm          = $item->produto->ncm;

                if($item->id_tiny > 0){ // Se o produto já possui id_tiny na nossa plataforma

                    $produtosAtualizar[] = $obj;

                    // Atualizar produtos que já estão no tiny e possuem id_tiny na nossa plataforma
                    $data['produtos'] = $produtosAtualizar;
                    $produto          = json_encode($data);

                    $url = 'https://api.tiny.com.br/api2/produto.alterar.php';
                    $content = "token=$token&produto=$produto&formato=json";
                    $resultAtualizacao = json_decode(GeralService::enviarREST($url, $content));
                    Log::info(json_encode($resultAtualizacao));
                    if((isset($resultAtualizacao->retorno) && $resultAtualizacao->retorno->status_processamento != 3) || !isset($resultAtualizacao->retorno)){
                        $item->data_sincronizacao_tiny = date('Y-m-d H:i:s');
                        $item->log_tiny = json_encode($resultAtualizacao);
                        $item->save();
                    }else{
                        $item->data_sincronizacao_tiny = date('Y-m-d H:i:s');
                        $item->log_tiny = '';
                        $item->save();
                    }
                }else{
                    $item->data_sincronizacao_tiny = date('Y-m-d H:i:s');
                    $item->log_tiny = "ID Tiny não informado";
                    $item->save();
                }

            }
        }

        return $resultAtualizacao;

    }

    public static function getEstoqueProduto($produto){

        $data               = [];
        $saldos             = [];
        $empresas           = [];
        $estoque            = 0;
        $ultima_atualizacao = '';
        $errors             = [];

        if(count($produto->produtoserp) > 0){

            foreach ($produto->produtoserp as $produtoerp){

                $token = $produtoerp->empresa->api_key_tiny_erp;

                //Pesquisa
                $id_tiny        = $produtoerp->id_tiny;
                if(!empty($id_tiny)){
                    $url            = 'https://api.tiny.com.br/api2/produto.obter.estoque.php';
                    $content        = "token=$token&id=$id_tiny&formato=json";
                    $resultPesquisa = json_decode(GeralService::enviarREST($url, $content));
                    if($resultPesquisa->retorno->status_processamento == 3){
                        $saldos[$produtoerp->empresa->sigla] = $resultPesquisa->retorno->produto->saldo;
                        $empresas[$produtoerp->empresa->sigla] = ['status' => true, 'response' => json_encode($resultPesquisa)];
                    }else{
                        Log::info("Produto: {$produto->id} / Empresa: {$produtoerp->empresa_id} - " . json_encode($resultPesquisa));
                        $empresas[$produtoerp->empresa->sigla] = ['status' => false, 'response' => json_encode($resultPesquisa)];
                        $errors[] =  ['status' => false, 'message' => json_encode($resultPesquisa), 'produto_id' => $produtoerp->produto_id, 'empresa_id' => $produtoerp->empresa_id];
                    }
                }else{
                    Log::info("Produto: {$produto->id} / Empresa: {$produtoerp->empresa_id} - ID Tiny Não Encontrado");
                    $empresas[$produtoerp->empresa->sigla] = ['status' => false, 'response' => 'ID Tiny Não Encontrado'];
                    $errors[] =  ['status' => false, 'message' => 'ID Tiny Não Encontrado', 'produto_id' => $produtoerp->produto_id, 'empresa_id' => $produtoerp->empresa_id];
                }

                $estoque += (isset($saldos[$produtoerp->empresa->sigla]) ? $saldos[$produtoerp->empresa->sigla] : 0);

            }
        }

        //útlima atualização
        if(count($produto->estoque) > 0 && !empty($produto->estoque[0]->data_ultima_atualizacao)){
            $ultima_atualizacao = $produto->estoque[0]->data_ultima_atualizacao;
        }

        $adega = GeralService::buscarAdegaProduto($produto);

        $em_processamento = GeralService::buscarProdutoEmProcessamento($produto);

        $adega             = (!empty($adega) ? $adega : 0);
        $QuantidadeReserva = QuantidadeReserva::select('qtde_sugerida')->where('qtde_inicial_saldo', '<=', $adega)->where('qtde_final_saldo', '>=', $adega)->first();
        $reserva           = ($QuantidadeReserva ? $QuantidadeReserva->qtde_sugerida : 0);

        $disponibilidade = $estoque - $adega - $em_processamento - $reserva;

        $data['saldos']             = $saldos;
        $data['log_empresas']       = $empresas;
        $data['errors']             = $errors;
        $data['estoque']            = $estoque;
        $data['adega']              = number_format($adega, 2, '.', '');
        $data['em_processamento']   = number_format($em_processamento, 2, '.', '');
        $data['disponibilidade']    = $disponibilidade;
        $data['reserva']            = $reserva;
        $data['ultima_atualizacao'] = $ultima_atualizacao;

        return $data;

    }

    public static function sincronizarProdutos($listaProdutos, $idEmpresa = FALSE){

        $produtosPorVez = 20; // Quantidade de produtos por lote
        $result         = new \stdClass();
        $errorMsg       = [];
        $status         = true;
        $message        = 'Registros sincronizados com sucesso!';

        if(count($listaProdutos) > $produtosPorVez){
            $errorMsg[]       = 'Você não pode sincronizar mais que '.$produtosPorVez.' produtos por vez.';
            $result->status   = false;
            $result->errorMsg = $errorMsg;
            return $result;
        }

        if($idEmpresa){
            $empresas = Empresa::where('id', $idEmpresa)->get();
        }else{
            $empresas = Empresa::all();
        }

        foreach ($empresas as $empresa) {

            if(empty($empresa->api_key_tiny_erp)){
                continue;
            }
            
            $token = $empresa->api_key_tiny_erp; // Token API Tiny

            $produtosIncluir      = [];
            $produtosAtualizar    = [];
            $produtosBuscarIdTiny = []; // Prepara o array para os produtos que já estão no tiny, mas não tem ID na nossa plataforma

            foreach ($listaProdutos as $item) {

                $produto_nome = str_replace(["&"], '', $item->produto->nome);

                if($item->produto->sincronizar_tiny != 1){
                    continue;
                }

                $obj                        = new \stdClass();
                $obj->produto               = new \stdClass();
                $obj->produto->sequencia    = $item->produto->id;
                $obj->produto->nome         = $produto_nome;
                $obj->produto->codigo       = $item->produto->sku;
                $obj->produto->unidade      = (!empty($item->produto->unidade_de_medida) ? $item->produto->unidade_de_medida : 'Gr');
                $obj->produto->preco        = floatval(number_format($item->produto->preco_de_venda,2,'.',''));
                $obj->produto->preco_custo  = floatval(number_format($item->produto->preco_custo,2,'.',''));
                $obj->produto->localizacao  = $item->produto->localizador;
                $obj->produto->situacao     = $item->produto->situacao;
                $obj->produto->peso_liquido = $item->produto->peso_liquido;
                $obj->produto->peso_bruto   = $item->produto->peso_bruto;
                $obj->produto->tipo         = 'P';
                $obj->produto->origem       = $item->produto->origem;
                $obj->produto->ncm          = $item->produto->ncm;

                if($item->id_tiny > 0){ // Se o produto já possui id_tiny na nossa plataforma
                    $produtosAtualizar[] = $obj;
                }else{
                    $produtosIncluir[] = $obj;
                }
            }

            // Incluir produtos
            $data['produtos'] = $produtosIncluir;
            $produto          = json_encode($data);
            $url              = 'https://api.tiny.com.br/api2/produto.incluir.php'; //https://api.tiny.com.br/api2/produto.alterar.php
            $content          = "token=$token&produto=$produto&formato=json";
            $resultInclusao   = json_decode(GeralService::enviarREST($url, $content));

            // Atualizar os ids_tiny na nossa plataforma
            $values = [];
            if(isset($resultInclusao->retorno->registros)){
                foreach ($resultInclusao->retorno->registros as $registro) {
                    if(isset($registro->registro->codigo_erro)){ // O produto já estava cadastrado no tiny, mas sem ID do tiny no banco.
                        if($registro->registro->codigo_erro == 30){
                            $produtosBuscarIdTiny[] = $registro->registro->sequencia;
                        }else{
                            $status   = false;
                            $errorMsg[] = "ERRO Inclusão Registro: " . json_encode($registro);
                        }

                    }else{
                        $values[$registro->registro->sequencia] = $registro->registro->id;
                    }
                }

                if(!empty($values)){
                    self::updateIdsTiny($values, $empresa->id);
                }

            }else{
                $status     = false;
                $errorMsg[] = "ERRO Inclusão Registro: " . json_encode($resultInclusao);
            }

            // Ajusta os produtos que estão no tiny mas não tem ID na plataforma.
            foreach ($produtosBuscarIdTiny as $id_produto) {

                $produto = Produto::find($id_produto);

                //Pesquisa por SKU
                $skuProduto        = $produto->sku;
                $url               = 'https://api.tiny.com.br/api2/produtos.pesquisa.php';
                $content           = "token=$token&pesquisa=$skuProduto&formato=json";
                $resultPesquisaSku = json_decode(GeralService::enviarREST($url, $content));

                //Pesquisa por Nome
                $nomeProduto        = $produto->nome;
                $url                = 'https://api.tiny.com.br/api2/produtos.pesquisa.php';
                $content            = "token=$token&pesquisa=$nomeProduto&formato=json";
                $resultPesquisaNome = json_decode(GeralService::enviarREST($url, $content));

                if($resultPesquisaSku->retorno->status_processamento == 3){ // Conseguiu buscar o ID do produto
                    
                    $idTiny = $resultPesquisaSku->retorno->produtos[0]->produto->id;
                    //Atualiza Produto
                    $obj    = new \stdClass();
                    $obj->empresa_id = $empresa->id;
                    $obj->produto_id = $produto->id;
                    $obj->log_tiny = NULL;
                    $obj->id_tiny  = $idTiny;
                    ProdutoErp::saveErp($obj);

                    $status   = true;
                    $errorMsg = [];

                    $produto_nome = str_replace(["&"], '', $produto->nome);

                    // Adiciona o produto para ser atualizado
                    $obj = new \stdClass();
                    $obj->produto = new \stdClass();
                    $obj->produto->sequencia = $produto->id;
                    $obj->produto->nome = $produto_nome;
                    $obj->produto->codigo = $produto->sku;
                    $obj->produto->unidade = (!empty($produto->unidade_de_medida) ? $produto->unidade_de_medida : 'gr');
                    $obj->produto->preco = floatval(number_format($produto->preco_de_venda,2,'.',''));
                    $obj->produto->preco_custo = floatval(number_format($produto->preco_custo,2,'.',''));
                    $obj->produto->localizacao = $produto->localizador;
                    $obj->produto->situacao = $produto->situacao;
                    $obj->produto->peso_liquido = $produto->peso_liquido;
                    $obj->produto->peso_bruto = $produto->peso_bruto;
                    $obj->produto->tipo = 'P';
                    $obj->produto->origem = $produto->origem;
                    $obj->produto->ncm = $produto->ncm;

                    $produtosAtualizar[] = $obj;

                }elseif($resultPesquisaNome->retorno->status_processamento == 3){

                    $status     = false;
                    $errorMsg[] = 'Conflito: Produto ID: ' . $produto->id . ' já existe! (' . $produto->nome . ')';

                    $obj             = new \stdClass();
                    $obj->empresa_id = $empresa->id;
                    $obj->produto_id = $produto->id;
                    $obj->log_tiny   = json_encode($resultPesquisaNome);
                    ProdutoErp::saveErp($obj);
                }
            }

            // Atualizar produtos que já estão no tiny e possuem id_tiny na nossa plataforma
            $data['produtos'] = $produtosAtualizar;
            $produto = json_encode($data);

            $url = 'https://api.tiny.com.br/api2/produto.alterar.php';
            $content = "token=$token&produto=$produto&formato=json";
            $resultAtualizacao = json_decode(GeralService::enviarREST($url, $content));

            foreach ($resultAtualizacao->retorno->registros as $item) {
                if(!isset($item->registro->codigo_erro)){
                    $obj = new \stdClass();
                    $obj->empresa_id = $empresa->id;
                    $obj->produto_id = $item->registro->sequencia;
                    $obj->log_tiny = NULL;
                    $obj->id_tiny  = $item->registro->id;
                    ProdutoErp::saveErp($obj);
                    $status     = true;
                    $errorMsg   = [];
                }else{
                    $status = false;
                    $errorMsg[] = 'Produto ID: '.$item->registro->sequencia.', Código Erro: '.$item->registro->codigo_erro.', Erro: '.$item->registro->erros[0]->erro;
                }
            }
        }

        $result           = new \stdClass();
        $result->status   = $status;
        $result->message  = $message;
        if(count($errorMsg) > 0)
            $result->message = implode("<br><br>", $errorMsg);

        return $result;

    }

    public static function sincronizarProduto($idProduto, $action, $idEmpresa, $idTiny = 0){

        $Empresa  = Empresa::where('id', $idEmpresa)->first();
        $token    = $Empresa->api_key_tiny_erp;
        $status   = true;
        $message  = 'Registro sincronizado com sucesso';
        $errorMsg = [];

        $Produto = Produto::where('id', $idProduto)->first();

        if($Produto->sincronizar_tiny == 1){

            //Sincroniza Produto
            $data          = [];
            $produtoObject = [];

            $obj                        = new \stdClass();
            $obj->produto               = new \stdClass();
            if($action == 'alterar' && (!empty($idTiny) && $idTiny != 0))
                $obj->produto->id       = $idTiny;
            $obj->produto->sequencia    = $Produto->id;
            $obj->produto->nome         = $Produto->nome . ' ' . date('Ymd');
            $obj->produto->codigo       = $Produto->sku;
            $obj->produto->unidade      = $Produto->unidade_de_medida ?? 'gr';
            $obj->produto->preco        = floatval(number_format($Produto->preco_de_venda,2,'.',''));
            $obj->produto->preco_custo  = floatval(number_format($Produto->preco_custo,2,'.',''));
            $obj->produto->localizacao  = $Produto->localizador;
            $obj->produto->situacao     = $Produto->situacao;
            $obj->produto->peso_liquido = $Produto->peso_liquido;
            $obj->produto->peso_bruto   = $Produto->peso_bruto;
            $obj->produto->tipo         = 'P';
            $obj->produto->origem       = $Produto->origem;
            $obj->produto->ncm          = $Produto->ncm;

            $produtoObject[]  = $obj;
            $data['produtos'] = $produtoObject;
            $produto          = json_encode($data);

            $url            = 'https://api.tiny.com.br/api2/produto.' . $action . '.php';
            $content        = "token=$token&produto=$produto&formato=json";
            $resultOperacao = json_decode(GeralService::enviarREST($url, $content));

            foreach ($resultOperacao->retorno->registros as $item) {
                if(isset($item->registro->codigo_erro)){
                    $status     = false;
                    $errorMsg[] = 'Produto ID: '.$item->registro->sequencia.', Código Erro: '.$item->registro->codigo_erro.', Erro: '.$item->registro->erros[0]->erro;
                }elseif($action == 'incluir'){
                    $idTiny = $item->registro->id;
                }
            }

            $obj = new \stdClass();
            $obj->empresa_id = $idEmpresa;
            $obj->produto_id = $Produto->id;
            if($status && (!empty($idTiny) && $idTiny != 0)){
                $obj->log_tiny = NULL;
                $obj->id_tiny  = $idTiny;
            }else{
                $obj->log_tiny = "Erro: " . implode("<br><br>", $errorMsg);
            }
            ProdutoErp::saveErp($obj);

        }else{
            $status  = false;
            $message = "Não foi possível sincronizar o Produto: {$Produto->nome}!";
        }

        $result           = new \stdClass();
        $result->status   = $status;
        $result->message  = $message;
        if(count($errorMsg) > 0)
            $result->message = implode("<br><br>", $errorMsg);

        return $result;
    }

    public static function updateIdsTiny(array $values, $empresa_id)
    {
        foreach ($values as $produto_id => $id_tiny) {
            $obj             = new \stdClass();
            $obj->empresa_id = $empresa_id;
            $obj->produto_id = $produto_id;
            $obj->id_tiny    = $id_tiny;
            $obj->log_tiny   = NULL;
            ProdutoErp::saveErp($obj);
        }
    }

}

Youez - 2016 - github.com/yon3zu
LinuXploit