403Webshell
Server IP : 54.94.228.101  /  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/PedidoVenda/Controllers/Admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Modules/PedidoVenda/Controllers/Admin/AdminPedidoVendaController.php
<?php

namespace App\Modules\PedidoVenda\Controllers\Admin;

ini_set('memory_limit', '256M');

use Illuminate\Http\Request;
use Mail;
use Exception;
use App\Http\Requests;
use App\Http\Controllers\BaseController;
use App\Modules\PedidoVenda\Models\PedidoVenda;
use App\Modules\Produto\Models\Produto;
use App\Modules\Empresa\Models\Empresa;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\OfertaReserva\Models\OfertaReserva;
/*use App\Modules\Servico\Models\Servico;*/
use App\Modules\PedidoVendaStatus\Models\PedidoVendaStatus;
use App\Modules\PedidoVendaCategoria\Models\PedidoVendaCategoria;
use App\Modules\PedidoVendaHasProduto\Models\PedidoVendaHasProduto;
/*use App\Modules\PedidoVendaHasServico\Models\PedidoVendaHasServico;*/
use App\Modules\PedidoVendaTaxa\Models\PedidoVendaTaxa;
use App\Modules\PedidoVendaComissao\Models\PedidoVendaComissao;
use App\Modules\CondicaoComercial\Models\CondicaoComercial;
use App\Modules\Relatorio\Models\Relatorio;
use App\Modules\UnidadeNegocio\Models\UnidadeNegocio;

use App\Modules\PedidoVendaHistorico\Models\PedidoVendaHistorico;

use App\Modules\Adega\Models\Adega;

use App\Modules\Cupom\Models\Cupom;
use App\Modules\CupomPedidoVenda\Models\CupomPedidoVenda;
use App\Modules\Confraria\Models\Confraria;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\CadastroCartao\Models\CadastroCartao;

use App\Services\CartService;
use App\Services\GeralService;
use App\Services\OfertaService;
use App\Services\PaginationService;
use App\Modules\PedidoVenda\Services\PedidoVendaService;

use App\User;
use Illuminate\Support\Facades\Log;
use DB;

use Excel;

class AdminPedidoVendaController extends BaseController
{
	private $modulo;
	private $fields;
	private $fks;
	private $lastInsertId;

    public function __construct(){
		parent::__construct();
		$this->middleware('auth');
		$this->modulo = \App\Gerador::where('nome', 'PedidoVenda')->with('campos', 'fks')->first();
		$this->fields = $this->modulo->campos;
		$this->fks = $this->modulo->fks;
		$this->pedido_venda_m = new PedidoVenda();
	}

	public function index(Request $request){

		$post = $request->input();

		$query = $this->pedido_venda_m->select('pedido_venda.*');

		$data['fields_listagem'] = array();
		foreach ($this->fields as $field) {
			if($field->listagem){
				$data['fields_listagem'][] = $field;
			}
		}
		foreach ($this->fks as $fk) {
			if($fk->listagem){
				if($fk->campoRelacionado->translatable){
					$table = $fk->moduloRelacionado->nome_tabela.'_descricao';
					$on = $fk->moduloRelacionado->nome_tabela.'_descricao.'.$fk->moduloRelacionado->nome_tabela.'_id';
				}else{
					$table = $fk->moduloRelacionado->nome_tabela;
					$on = $fk->moduloRelacionado->nome_tabela.'.id';
				}
				$query->leftJoin($table, 'pedido_venda.'.$fk->nome, '=', $on);
				$query->addSelect($table.'.'.$fk->campoRelacionado->nome.' as fk'.$fk->id);
				$data['fields_listagem'][] = $fk;
			}

		}

		if(isset($post['filtro']) && $post['filtro']){
			$filtro = Relatorio::with('grupos.criterios')->find($post['filtro']);
			foreach ($filtro->grupos as $grupo) {
				if($grupo->condicao == 'AND'){
					$method = 'where';
				}else{
					$method = 'orWhere';
				}
				$query->$method(function ($query) use($grupo) {
					foreach ($grupo->criterios as $criterio) {
						if($criterio->condicao == 'AND'){
							$query->where($criterio->coluna, $criterio->operador, $criterio->valor);
						}else{
							$query->orWhere($criterio->coluna, $criterio->operador, $criterio->valor);
						}
					}
	            });
			}
		}

		$query->join('cadastro', 'pedido_venda.id_cliente', '=', 'cadastro.id');
		$query->join('sis_users', 'cadastro.user_id', '=', 'sis_users.id');

		if ($request->input('term'))
        {
        	$query->where(function($qr) use ($request){
        		$qr->where('pedido_venda.id', '=', $request->input('term'));
            	$qr->orWhere('pedido_venda.nm_referencia', 'like', '%'.$request->input('term').'%');
				$qr->orWhere('sis_users.email', 'like', '%'.$request->input('term').'%');
        	});
        }

        if ($request->input('term_data_inicio') && $request->input('term_data_fim'))
        {
        	$query->whereBetween('pedido_venda.data_fechamento', [$request->input('term_data_inicio') . " 00:00:00", $request->input('term_data_fim') . " 23:59:59"]);
        }
        elseif($request->input('term_data_inicio'))
        {
        	$query->whereBetween('pedido_venda.data_fechamento', [$request->input('term_data_inicio') . " 00:00:00", $request->input('term_data_inicio') . " 23:59:59"]);
        }

        if($request->input('term_empresa_id')){
        	$query->where('pedido_venda.empresa_id', '=', $request->input('term_empresa_id'));
        }

		$query->groupBy('pedido_venda.id')->orderBy('pedido_venda.id', 'DESC');

		$pagination = new PaginationService([
			'query'        => $query, 
			'path' 		   => url('/admin/pedido-venda'),
			'request' 	   => $request
		]);

		$data['pagination'] = $pagination;

        $query->offset($pagination->pagesize * ($pagination->current_page - 1))->limit($pagination->pagesize);

		$data['pedido_vendas'] = $query->get();

		$data['filtros'] = Relatorio::where('tipo', 'F')->where('modulo', 'PedidoVenda')->get();

		$data['empresas'] = Empresa::all();

		$data['filtro_atual'] = $post['filtro'] ?? null;

		$data['termos'] = $request->all();

		usort($data['fields_listagem'], function($a, $b) {
		    return $a->ordem - $b->ordem;
		});

		return view('PedidoVenda::admin/pedido-venda',$data);
	}

	public function gerador(Request $request){

		$data = [];
		$data['categorias'] = PedidoVendaCategoria::orderBy('nome', 'ASC')->get();
		$data['clientes']   = Cadastro::where('id', 15610)->orderBy('nome', 'ASC')->get();

		return view('PedidoVenda::admin/gerador',$data);
	}

	public function geradorAdicionarProduto(Request $request){

		$data               = [];
		$produto            = PedidoVendaService::geradorItemProduto($request);
		$data['produto']    = $produto;
		$data['quantidade'] = $request->input('quantidade');

		$html = view('PedidoVenda::admin/_gerador-produto-item', $data)->render();

		$json = [
			'status'     => true,
			'html'       => $html
		];

        return response()->json($json);

	}

	public function gerarPedidoInterno(Request $request){

		$resultado = PedidoVendaService::gerarPedidoInterno($request);

        return response()->json($resultado);

	}

	public function verificarCupom(Request $request){

		$post = $request->input();

		$cliente = Cadastro::find($post['id_cliente']);
		$cupom   = CartService::buscarCupomAtivo('', $cliente);

		return response()->json(array(
            'status'  => ($cupom ? true : false)
        ));

	}

	public function calcularCupom(Request $request){
		$response = $this->calculaCupom($request);
        return response()->json($response);
	}

	private function calculaCupom($request){

		$post = $request->input();

		if(empty($post['codigo'])){
            return [
                'status'  => false,
                'message' => 'Cupom Inválido'
            ];
        }

		$cliente = Cadastro::find($post['id_cliente']);
		$cupom   = CartService::buscarCupomAtivo($post['codigo'], $cliente);

		if ($cupom) {

			if($cliente){ // Se existe o cupom e o cliente existe

				$countCupomCliente = Cadastro::select('cadastro.id')
				->join('pedido_venda', 'cadastro.id', '=', 'pedido_venda.id_cliente')
				->join('cupom_pedido_venda', 'pedido_venda.id', 'cupom_pedido_venda.id_pedido_venda')
				->where('cadastro.id', $cliente->id)
				->where('cupom_pedido_venda.id_cupom', $cupom->id)->count(); // Confere se o cliente já utilizou o cupom

				if($countCupomCliente > 0 && $cupom->codigo != env('CUPOM_SOCIOS', 'VINUMOFF')){ // Cliente já usou o cupom se não for cupom especial
					return [
                        'status'  => false,
                        'message' => 'Esse cupom já foi utilizado.'
					];
				}
			}

			$ofertas = $post['ofertas'];
			
			$soma           = 0;
			$custo_efetivo  = 0;
			$valor_desconto = 0;

	        foreach ($ofertas as $oferta) {
				$item          = Oferta::find($oferta['id']);
				$soma          += $item->preco_oferta * $oferta['quantidade'];
				$custo_efetivo += OfertaService::getCustoEfetivo($item->id) * $oferta['quantidade'];
	        }

	        if($cupom->codigo == env('CUPOM_SOCIOS', 'VINUMOFF')){
				$novo_total     = $custo_efetivo;
				$desconto       = $soma - $custo_efetivo;
				$valor_desconto = $desconto;
				$desconto       = "R$ " . number_format($desconto, 2, ',', '.');
	        }elseif($cupom){
				$novo_total     = $soma * (1 - (($cupom->percentual_desconto ? $cupom->percentual_desconto : 100) / 100)) - $cupom->valor_desconto;
				$novo_total     = $novo_total > 0 ? $novo_total : 0;
				$desconto       = ($cupom->percentual_desconto > 0 ? number_format($cupom->percentual_desconto, 2, ',', '.')."%" : "R$ " . number_format($cupom->valor_desconto, 2, ',', '.'));
				$valor_desconto = ($cupom->percentual_desconto > 0 ? ($cupom->percentual_desconto * $soma) / 100 : $cupom->valor_desconto);
	        }else{
	            $novo_total = $soma;
	            $desconto   = '-';
	        }

	        if($valor_desconto > 0){
	        	$valor_desconto = -abs($valor_desconto);
	        }

			$html =  view('PedidoVenda::admin/_cupom-desconto', ['cupom' => $cupom, 'desconto' => $desconto, 'valor_desconto' => $valor_desconto])->render();

			return [
				'status'         => true,
				'message'        => 'Cupom adicionado com sucesso!',
				'cupom'          => $cupom,
				'html'           => $html
	        ];

		}else{

			$cupomExclusivoClientes = Cupom::where('codigo', $post['codigo'])->where('status', 'A')->first();
			if(!$cliente && $cupomExclusivoClientes){
				$message = 'Cupom exclusivo. Talvez este cliente não tenha este cupom disponível.';
			}else{
				$message = 'Cupom inválido.';
			}

			return [
				'status'  => false,
				'message' => $message
			];
		}

	}

	public function add(Request $request){
		$data = array();
		$data['modulo'] = $this->modulo;
		$data['fields'] = [];
		foreach ($this->fields as $field) {
			$data['fields'][] = $field;
		}
		foreach ($this->fks as $fk) {
			$data['fields'][] = $fk;
		}
		usort($data['fields'], function($a, $b) {
		    return $a->ordem - $b->ordem;
		});
		foreach ($this->fks as $fk) {
			$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
			$data['array_'.$fk->nome] = $classPath::get();
		}


		$data['listaOfertas'] = GeralService::listaOfertasPedidoVenda();
		// $data['listaUsuarios'] = User::orderBy('first_name', 'ASC')->orderBy('last_name', 'ASC')->get();
		$data['listaStatusPDV'] = PedidoVendaStatus::orderBy('id', 'ASC')->get();
		$data['unidades']       = UnidadeNegocio::orderBy('id','ASC')->get();
		// $data['listaCondicaoComercial'] = CondicaoComercial::orderBy('nome', 'ASC')->get();

		$data['nextId'] = $this->pedido_venda_m->getNextAutoIncrement();

		$id_cliente = $request->input('id_cliente');
		if(!empty($id_cliente) && is_numeric($id_cliente)){
			$data['cadastros'] = Cadastro::where('id', $id_cliente)->get();
		}else{
			$data['cadastros'] = Cadastro::orderBy('nome', 'ASC')->orderBy('sobrenome', 'ASC')->get();
		}

		$data['id_cliente'] = $id_cliente;
		$data['categorias'] = PedidoVendaCategoria::orderBy('nome', 'ASC')->get();

		if($request->input('confraria_id')){
			$data['confrarias']   = Confraria::where('id', $request->input('confraria_id'))->orderBy('nome', 'ASC')->get();
			$data['confraria_id'] = $request->input('confraria_id');
		}

		return view('PedidoVenda::admin/form-pedido-venda', $data);
	}

	public function edit($id){

		$id = PedidoVenda::where('id', $id)->value('id');
		$data['modulo'] = $this->modulo;
		$data['fields'] = [];
		foreach ($this->fields as $field) {
			$data['fields'][] = $field;
		}
		foreach ($this->fks as $fk) {
			$data['fields'][] = $fk;
		}
		usort($data['fields'], function($a, $b) {
		    return $a->ordem - $b->ordem;
		});
		foreach ($this->fks as $fk) {
			$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
			$data['array_'.$fk->nome] = $classPath::get();
		}
		$data['pedido_venda'] = $this->pedido_venda_m->find($id);

		$data['ofertasPdv'] = GeralService::buscarOfertasPagamento(['id_pedido_venda' => $id]);


		if($this->modulo->galeria){
			$data['pedido_venda']->imagens = $this->pedido_venda_m->getImagens($id);
		}

		//$data['listaProdutos'] = Produto::orderBy('nome', 'ASC')->get();
		$data['listaOfertas'] = GeralService::listaOfertasPedidoVenda();
		$data['unidades']     = UnidadeNegocio::orderBy('id','ASC')->get();

		/*$data['listaServicos'] = Servico::orderBy('nome', 'ASC')->get();*/
		// $data['listaUsuarios'] = User::orderBy('first_name', 'ASC')->orderBy('last_name', 'ASC')->get();
		$data['listaStatusPDV'] = PedidoVendaStatus::orderBy('nome', 'ASC')->get();
		// $data['listaCondicaoComercial'] = CondicaoComercial::orderBy('nome', 'ASC')->get();

		$data['listaHistorico'] = PedidoVendaHistorico::where('id_pedido_venda', $id)->orderBy('data', 'DESC')->with(/*'colaborador',*/ 'status')->get();

		// $data['cadastros'] = Cadastro::orderBy('nome', 'ASC')->orderBy('sobrenome', 'ASC')->get();
		$data['cadastros'] = Cadastro::where('id', $data['pedido_venda']->id_cliente)->get();

		//Confrarias
		if($data['pedido_venda']->confraria_id){
			$data['confrarias']   = Confraria::where('id', $data['pedido_venda']->confraria_id)->orderBy('nome', 'ASC')->get();
			$data['confraria_id'] = $data['pedido_venda']->confraria_id;
		}

		$empresas           = Empresa::all();
        $pagarMe            = [];
        foreach ($empresas as $empresa) {
            $apiKey = $empresa->api_key_pagar_me;
            $pagarMe[$empresa->id] =  new \PagarMe\Sdk\PagarMe($apiKey);
        }

		if($data['pedido_venda']->transacao_id){
			try {
				$data['pedido_venda']->transaction = $pagarMe[$data['pedido_venda']->empresa_id]->transaction()->get($data['pedido_venda']->transacao_id);
			} catch (\Exception $e) {
				$data['pedido_venda']->transaction = null;
			}
		}

		$data['categorias'] = PedidoVendaCategoria::orderBy('nome', 'ASC')->get();

		return view('PedidoVenda::admin/form-pedido-venda',$data);
	}

	public function detalhe($slug){
		$data['pedido_venda'] = PedidoVenda::where('slug', $slug)->with('produtos')->first();
		return view('PedidoVenda::admin/detalhe-pedido-venda',$data);
	}

	public function save(Request $request){

		$post = $request->input();

		if($request->input('id')){
			$pedidoVenda = PedidoVenda::find($request->input('id'));
			$pedidoVenda->unidade_negocio_id = $post['unidade_negocio_id'];
			PedidoVendaHasProduto::where('id_pedido_venda', $pedidoVenda->id)->delete();
		}else{
			$pedidoVenda = new PedidoVenda();
			if(isset($post['confraria_id'])){
				$pedidoVenda->confraria_id = $post['confraria_id'];
			}
			$pedidoVenda->unidade_negocio_id = $post['unidade_negocio_id'];
			$textParcela = (isset($post['tipo_deposito']) && $post['tipo_deposito']) ? '1':$post['parcelas'];
			$condicaoComercial = CondicaoComercial::where('nome', $textParcela.'x')->first();

			$post['id_condicao_comercial'] = $condicaoComercial->id;

			if($post['total'] <= 0){
	            \Session::flash('type', 'danger');
		      	\Session::flash('message', "O seu pedido deve ter valor maior que 0.");
				return redirect()->back()->withInput();
	        }

	        if(isset($post['tipo_deposito']) && $post['tipo_deposito']){

	            if(!isset($post['nome_depositante']) || !$post['nome_depositante']){
	                return response()->json(array(
	                    'status' => false,
	                    'message' => 'Você deve preencher o nome do depositante.'
	                ));
	            }

	            if($request->hasFile('fileUpload')) {
	               $file = $request->file('fileUpload');

						$size = $file->getClientSize();
						if($size > 5000000){
	 		            return response()->json(array(
	                      'status' => false,
	                      'message' => 'Tamanho excedido. O tamanho máximo do arquivo deve ser de 5 MB.'
	                  ));
	 		         }

	                $comprovante = GeralService::uploadFile($file, 'pedido-venda/comprovante');
	                $pedidoVenda->comprovante = $comprovante->filename;
	            }


	            $pedidoVenda->data_fechamento = date('Y-m-d H:i:s');

				$pedidoVenda->tipo_deposito    = $post['tipo_deposito'];
				$pedidoVenda->nome_depositante = $post['nome_depositante'];
				$pedidoVenda->frete            = 0; // Pendente

	            //CONFIRMAR
	            if(!empty($post['id_pedido_venda_categoria'])){
	            	$pedidoVenda->tipo_deposito = 'INT'; //INTERNO
	            }

	        }else{

				$cadastro = Cadastro::find($post['id_cliente']);
				$user     = User::find($cadastro->user_id);

				$apiKey  = GeralService::getApiKeyPagarMe($cadastro);
				$pagarMe = new \PagarMe\Sdk\PagarMe($apiKey);



		        if($cadastro->customer_id){ // Se o usuário já possui customer cadastrado no PagarMe
		            $customer = $pagarMe->customer()->get($cadastro->customer_id);
		        }else{

		            $address = new \PagarMe\Sdk\Customer\Address([
		                'street' => 'R. Olavo Bilac',
		                'streetNumber' => '93',
		                'neighborhood' => 'Rio Branco',
		                'zipcode' => '95010080',
		                'complementary' => '',
		                'city' => 'Caxias do Sul',
		                'state' => 'RS',
		                'country' => 'Brasil',
		            ]);

		            $telefone = (int) $res = preg_replace("/[^0-9]/", "", $cadastro->telefone);
		            $phone = new \PagarMe\Sdk\Customer\Phone(['ddd' => substr($telefone,0,2), 'number' => str_replace('-', '',substr($telefone,2)), 'ddi' => '55']);


		            $errors = [
		                'address[street_number]' => 'Número <strong>inválido</strong>.',
		                'address[street]' => 'Logradouro <strong>inválido</strong>.',
		                'address[neighborhood]' => 'Bairro <strong>inválido</strong>.',
		                'address[zipcode]' => 'CEP <strong>inválido</strong>.',
		                'phone[number]' => 'Telefone <strong>inválido</strong>.',
		            ];

		            try {
		                $customer = $pagarMe->customer()->create(
		                    $cadastro->nome,
		                    $user->email,
		                    $cadastro->cpf,
		                    /** @var $address \PagarMe\Sdk\Customer\Address */
		                    $address,
		                    /** @var $phone \PagarMe\Sdk\Customer\Phone */
		                    $phone
		                );

		            } catch (\Exception $e) {
		                $exceptionErrors = json_decode(json_decode($e->getMessage()));

		                if ($exceptionErrors != null){
		                    $message = (isset($errors[$exceptionErrors->errors[0]->parameter_name])) ? $errors[$exceptionErrors->errors[0]->parameter_name] : $exceptionErrors->errors[0]->message;
		                } else {
		                    $message = $e->getMessage();
		                }

		                \Session::flash('type', 'danger');
				      	\Session::flash('message', $message);
						return redirect()->back()->withInput();

		            }

		            $cadastro->customer_id = $customer->getId();

		            $cadastro->save();
		        }

		        if(isset($post['cartao_id']) && $post['cartao_id']){ // Se está usando um cartão já cadastrado

	                $cartao = CadastroCartao::where('cadastro_id', $cadastro->id)->where('id', $post['cartao_id'])->where('ativo', 1)->first();

	                if(!$cartao){
	                	\Session::flash('type', 'danger');
				      	\Session::flash('message', 'Cartão selecionado é inválido.');
						return redirect()->back()->withInput();
	                }

	                try {
	                    $card = $pagarMe->card()->get($cartao->cartao_id);
	                } catch (\Exception $e) {
	                	\Session::flash('type', 'danger');
				      	\Session::flash('message', 'Não foi possível encontrar o seu cartão na plataforma de pagamento. Por favor, tente outro método de pagamento.');
						return redirect()->back()->withInput();
	                }


	            }else{

	                try {

	                    $card = $pagarMe->card()->create(
	                        $post['number'],
	                        $post['name'],
	                        substr($post['expiry'],0,2).substr($post['expiry'],5,2)
	                    );

	                } catch (\Exception $e) {
	                    $errors = json_decode(json_decode($e->getMessage()));

	                    \Session::flash('type', 'danger');
				      	\Session::flash('message', $errors->errors[0]->message);
						return redirect()->back()->withInput();
	                }


	                if($card->getValid()){

	                    if(isset($post['salvar_cartao']) && $post['salvar_cartao']){
	                        $cadastroCartao = new CadastroCartao();
	                        $cadastroCartao->cartao_id = $card->getId();
	                        $cadastroCartao->cadastro_id = $cadastro->id;
	                        $cadastroCartao->principal = 1;
	                        $cadastroCartao->save();
	                    }

	                }else{

	                    \Session::flash('type', 'danger');
				      	\Session::flash('message', 'Dados do cartão são <strong>inválidos</strong>. Tente novamente.');
						return redirect()->back()->withInput();
	                }

	            }


	            try {

	            	$condicaoComercial = CondicaoComercial::find($post['id_condicao_comercial']);
	            	$parcelas = intval($condicaoComercial->numero_dias / $condicaoComercial->frequencia);

	            	$totalTransaction = $post['total'] * 100;
                    $totalTransaction = number_format($totalTransaction, 0, '','');

                    $creditCardTransaction = [
                        'total'    => $totalTransaction,
                        'card'     => $card,
                        'customer' => $customer,
                        'parcelas' => $post['parcelas']
                    ];

	                $transaction = $pagarMe->transaction()->creditCardTransaction(
	                    $totalTransaction,
	                    $card,
	                    $customer,
	                    $parcelas, // parcelas
	                    true // captura
	                    //'http://requestb.in/pkt7pgpk', // postbackURL
	                    //['idProduto' => 13933139] //metadata
	                );

                    if($transaction->getStatus() != 'paid'){
                    	Log::info('confirmarCompra Pedido Status : ' . $transaction->getStatus() . '(' . json_encode($creditCardTransaction) . ')');
                        \Session::flash('type', 'danger');
				      	\Session::flash('message', 'Não foi possível realizar a transação na plataforma de pagamento. Por favor, tente novamente mais tarde.');
						return redirect()->back()->withInput();
                    }else{
                        Log::info('confirmarCompra OK : ' . json_encode($creditCardTransaction));
                    }
	            } catch (\Exception $e) {
					Log::info('confirmarCompra Exception : ' . json_encode($creditCardTransaction));
                    Log::info('confirmarCompra Exception : ' . json_encode($e->getMessage()));
	                \Session::flash('type', 'danger');
			      	\Session::flash('message', 'Não foi possível realizar a transação na plataforma de pagamento. Por favor, tente novamente mais tarde.');
					return redirect()->back()->withInput();
    	        }

		        $pedidoVenda->transacao_id = $transaction->getId();
		    }


		}

		$pedidoVenda->fill($post);
		$pedidoVenda->save();

		$id_pedido_venda = $pedidoVenda->id;

		if(!empty($post['id_pedido_venda_categoria'])){
			$id_pedido_venda_categoria = $post['id_pedido_venda_categoria'];
        	$sql = "UPDATE pedido_venda SET id_pedido_venda_categoria = {$id_pedido_venda_categoria} WHERE id = {$id_pedido_venda}";
        	DB::statement($sql);
        }else{
        	$sql = "UPDATE pedido_venda SET id_pedido_venda_categoria = NULL WHERE id = {$id_pedido_venda}";
        	DB::statement($sql);
        }

		//Cupom x Pedido Venda
		if(isset($post['cupom_id'])){
			$cupomPedidoVenda = new CupomPedidoVenda();
			$cupomPedidoVenda->id_cupom = $post['cupom_id'];
			$cupomPedidoVenda->id_pedido_venda = $pedidoVenda->id;
			$cupomPedidoVenda->save();
		}

		$nr_ofertas = 0;
		if(isset($post['oferta-id']) && count($post['oferta-id'])){
			foreach ($post['oferta-id'] as $key => $id_oferta) {
				$nr_ofertas += $post['oferta-quantidade'][$key];
                $oferta = Oferta::with('produtos.produto')->find($id_oferta);
                foreach ($oferta->produtos as $ofertaHasProduto) {
					$pedidoVendaProduto                  = new PedidoVendaHasProduto();
					$pedidoVendaProduto->id_oferta       = $oferta->id;
					$pedidoVendaProduto->id_produto      = $ofertaHasProduto->id_produto;
					$pedidoVendaProduto->id_pedido_venda = $pedidoVenda->id;
					$pedidoVendaProduto->quantidade      = $ofertaHasProduto->quantidade * $post['oferta-quantidade'][$key];
					$pedidoVendaProduto->valor_total     = $ofertaHasProduto->valor_total * $post['oferta-quantidade'][$key];
                    $pedidoVendaProduto->save();
                }

                DB::table('pedido_venda_has_oferta')->insert([
		            [
		                'pedido_venda_id'   => $pedidoVenda->id,
		                'oferta_id'         => $oferta->id,
		                'quantidade'        => $post['oferta-quantidade'][$key],
		                'valor_unitario'    => $oferta->preco_oferta,
		                'valor_total'       => $oferta->preco_oferta * $post['oferta-quantidade'][$key],
		                'desconto_ocultado' => $oferta->ocultar_desconto,
		                'created_at'        => date('Y-m-d H:i:s')
		            ]
		        ]);

                OfertaReserva::atualizaEstoque($oferta, $pedidoVenda, $post['oferta-quantidade'][$key]);
			}
		}
		
		$pedidoVenda->nr_ofertas = $nr_ofertas;
		$pedidoVenda->save();

		OfertaReserva::limpaSession();
		GeralService::recalcularAdega($pedidoVenda->id_cliente, $pedidoVenda->id, FALSE, $pedidoVenda->confraria_id);
		
		if(isset($post['usuario-id']) && count($post['usuario-id'])){
			foreach ($post['usuario-id'] as $key => $id_usuario) {
				$pedidoVendaComissao = new PedidoVendaComissao();
				$pedidoVendaComissao->id_pedido_venda = $id_pedido_venda;
				$pedidoVendaComissao->id_usuario = $id_usuario;
				$pedidoVendaComissao->valor = $post['comissao-valor'][$key];
				$pedidoVendaComissao->tipo = $post['comissao-tipo'][$key];
				$pedidoVendaComissao->valor_total = $post['comissao-total'][$key];
				$pedidoVendaComissao->save();
			}
		}

		if(isset($post['comissao-edit-id']) && count($post['comissao-edit-id'])){
			foreach ($post['comissao-edit-id'] as $key => $id_comissao) {
				$pedidoVendaComissao = PedidoVendaComissao::find($id_comissao);
				$pedidoVendaComissao->valor = $post['comissao-edit-valor'][$key];
				$pedidoVendaComissao->tipo = $post['comissao-edit-tipo'][$key];
				$pedidoVendaComissao->valor_total = $post['comissao-edit-total'][$key];
				$pedidoVendaComissao->save();
			}
		}


		if(isset($post['taxa-nome']) && count($post['taxa-nome'])){
			foreach ($post['taxa-nome'] as $key => $nome) {
				$pedidoVendaTaxa = new PedidoVendaTaxa();
				$pedidoVendaTaxa->id_pedido_venda = $id_pedido_venda;
				$pedidoVendaTaxa->nome = $nome;
				$pedidoVendaTaxa->valor = $post['taxa-valor'][$key];
				$pedidoVendaTaxa->save();
			}
		}

		if(isset($post['edit-taxa-id']) && count($post['edit-taxa-id'])){
			foreach ($post['edit-taxa-id'] as $key => $id_taxa) {
				$pedidoVendaTaxa = PedidoVendaTaxa::find($id_taxa);
				$pedidoVendaTaxa->nome = $post['edit-taxa-nome'][$key];
				$pedidoVendaTaxa->valor = $post['edit-taxa-valor'][$key];
				$pedidoVendaTaxa->save();
			}
		}

		\Session::flash('type', 'success');
      	\Session::flash('message', "Alteracoes salvas com sucesso!");
		return redirect('admin/pedido-venda');

	}

	/**
	* Links que usei como referência para fazer o clone de relationship com hasMany
	* @url http://anytch.com/duplicate-row-relationship-laravel-5/
	* @url https://www.reddit.com/r/laravel/comments/2avgbd/what_is_the_best_way_to_replicate_an_objectrow/?st=jk1hju58&sh=512b45bd
	*/
	public function clone($id) {

		$pedidoVenda = PedidoVenda::where('id', $id)->first();
		$pedidoVenda->data_fechamento = date('Y-m-d H:i:s');
		$pedidoVenda->load('produtos');

		$pedidoVendaClone = $pedidoVenda->replicate();
		$pedidoVendaClone->save();

		if(isset($pedidoVenda->produtos)){
			foreach($pedidoVenda->produtos as $produto){
				$produtoClone = $produto->replicate();
			    $produtoClone->id_pedido_venda = $pedidoVendaClone->id;
			    $produtoClone->save();
			}
		}

		\Session::flash('type', 'success');
    	\Session::flash('message', "Pedido {$id} duplicado com sucesso!");
		return redirect('admin/pedido-venda');

	}

	public function saveHistorico(Request $request) {

		$post        = $request->input();
		$pedidoVenda = PedidoVenda::find($post['id_pedido_venda']);

		if($post['id_status'] == 2){

			$pre_venda = FALSE;
	        foreach ($pedidoVenda->produtos as $item) {
                $oferta = $item->oferta;
                if($oferta->pre_venda){
                    $pre_venda = TRUE;
                    break;
                }
	        }

	        $id_pedido_venda_status = $pre_venda ? 9 : 2;

		}else{
			$id_pedido_venda_status = $post['id_status'];
		}

		$pedidoVenda->id_status_pedido_venda = $id_pedido_venda_status;
		$pedidoVenda->save();

		$pedidoVendaHistorico = new PedidoVendaHistorico();
		$pedidoVendaHistorico->id_pedido_venda        = $post['id_pedido_venda'];
		$pedidoVendaHistorico->data                   = date('Y-m-d H:i');
		$pedidoVendaHistorico->comentario             = $post['comentario'];
		$pedidoVendaHistorico->notificar_cliente      = ($post['notificar_cliente']=='true' ? 1 : 0);
		$pedidoVendaHistorico->id_pedido_venda_status = $id_pedido_venda_status;
		$pedidoVendaHistorico->id_colaborador         = 1;

		$pedidoVendaHistorico->save();

		$pedidoVendaHistorico = $pedidoVendaHistorico->with('status'/*,'colaborador'*/)->find($pedidoVendaHistorico->id);
		$pedidoVendaHistorico->data = date('d/m/Y H:i', strtotime($pedidoVendaHistorico->data));

		return response()->json(array(
			'status'    => true,
			'message'   => 'Histórico adicionado com sucesso!',
			'historico' => $pedidoVendaHistorico
		));
	}



	public function upload_image(Request $request) {
		if($request->hasFile('file')) {
			//upload an image to the /img/tmp directory and return the filepath.
			$file = $request->file('file');
			$tmpFilePath = '/uploads/pedido-venda/';
			$tmpFileName = time() . '-' . $file->getClientOriginalName();
			$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
			$path = $tmpFilePath . $tmpFileName;
			return response()->json(array('path'=> $path, 'file_name'=>$tmpFileName), 200);
		} else {
			return response()->json(false, 200);
		}
	}

	public function upload_galeria($id, Request $request) {
		if($request->hasFile('file')) {
			//upload an image to the /img/tmp directory and return the filepath.
			$file = $request->file('file');
			$tmpFilePath = '/uploads/pedido-venda/';
			$tmpFileName = time() . '-' . $file->getClientOriginalName();
			$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
			$path = $tmpFilePath . $tmpFileName;

			$this->pedido_venda_m->criar_imagem(array('id_pedido_venda' => $id, 'thumbnail_principal' => $tmpFileName));

			return response()->json(array('path'=> $path, 'file_name'=>$tmpFileName), 200);
		} else {
			return response()->json(false, 200);
		}
	}

	public function crop_image(Request $request) {
		$img = \Image::make('uploads/pedido-venda/'.$request->input('file_name'));
		$dataCrop = json_decode($request->input('data_crop'));
		if($img->crop(intval($dataCrop->width), intval($dataCrop->height), intval($dataCrop->x), intval($dataCrop->y))->save('uploads/pedido-venda/thumb_'.$request->input('file_name'))){
			@unlink('uploads/pedido-venda/'.$request->input('file_name'));
			echo json_encode(array(
				'status' => true,
				'path' => '/uploads/pedido-venda/thumb_'.$request->input('file_name'),
				'file_name' => 'thumb_'.$request->input('file_name'),
			));
		}else{
			echo json_encode(array(
				'status' => false,
				'message' => 'Não foi possível alterar a imagem.'
			));
		}

	}

	public function delete($id){
		$id = PedidoVenda::where('id', $id)->value('id');
		$this->pedido_venda_m->deletar($id);

		\Session::flash('type', 'success');
      \Session::flash('message', "Registro removido com sucesso!");
		return redirect('admin/pedido-venda');
	}

	public function delete_imagem($id){
		try{
			$imagem = $this->pedido_venda_m->getImagem($id);
			$this->pedido_venda_m->deletar_imagem($id);

			unlink('uploads/pedido-venda/'.$imagem->thumbnail_principal);

			return response()->json(array('status' => true, 'message' => 'Registro removido com sucesso!'));
		}catch(Exception $e){
			return response()->json(array('status' => false, 'message' => $e->getMessage()));
		}
	}

	public function deleteComprovante($id_pedido_venda){
		try {

			$PedidoVenda     = PedidoVenda::where('id', $id_pedido_venda)->first();
			GeralService::deleteFileImages($PedidoVenda->comprovante, 'pedido-venda/comprovante');

			$PedidoVenda->comprovante = '';
			$PedidoVenda->save();

			return response()->json(array('status' => true, 'message' => 'Comprovante removido com sucesso!'));
			
		} catch (Exception $e) {
			return response()->json(array('status' => false, 'message' => $e->getMessage()));	
		}
	}

	public function deleteProduto(Request $request){
		PedidoVendaHasProduto::where('id_pedido_venda', $request->input('id_pedido_venda'))->where('id_produto', $request->input('id_produto'))->delete();

		return response()->json(array(
			'status' => true,
			'message' => 'Produto removido com sucesso!'
		));

	}
/*
	public function deleteServico(Request $request){
		PedidoVendaHasServico::where('id_pedido_venda', $request->input('id_pedido_venda'))->where('id_servico', $request->input('id_servico'))->delete();

		return response()->json(array(
			'status' => true,
			'message' => 'Serviço removido com sucesso!'
		));

	}
*/
	public function deleteTaxa(Request $request){
		PedidoVendaTaxa::where('id', $request->input('id_taxa'))->delete();
		return response()->json(array(
			'status' => true,
			'message' => 'Taxa removida com sucesso!'
		));

	}

	public function deleteComissao(Request $request){
		PedidoVendaComissao::where('id', $request->input('id_comissao'))->delete();
		return response()->json(array(
			'status' => true,
			'message' => 'Comissão removida com sucesso!'
		));

	}

	public function buscarCartoesCliente(Request $request){

		$post = $request->input();

		$data['user']     = $this->current_user;
		$data['cadastro'] = Cadastro::find($post['id_cliente']);
		$pagarMe          = new \PagarMe\Sdk\PagarMe(GeralService::getApiKeyPagarMe($data['cadastro']));

        foreach ($data['cadastro']->cartoes as $key => $cartao) {
        	try {
        		$cartao->info = $pagarMe->card()->get($cartao->cartao_id);
        	} catch (\Exception $e) {
        		unset($data['cadastro']->cartoes[$key]);
        	}
        }

        $data['parcelasOptions'] = CartService::buscarParcelas($post['valor_total']);

        $view = view('PedidoVenda::admin/meios-pagamento', $data);

        return response()->json(array(
			'status'  => true,
			'message' => 'HTML renderizado com sucesso!',
			'html'    => $view->render(),
			'empresa' => $data['cadastro']->empresa_id
		));
	}

	public function exportarExcel(Request $request){
		$post = $request->input();
		
		$query = PedidoVenda::orderBy('data_fechamento', 'DESC');

		if (isset($post['data_inicial']) && $post['data_inicial']) {
			$query->where('data_fechamento', '>=', $post['data_inicial']);
		}
		if (isset($post['data_final']) && $post['data_final']) {
			$query->where('data_fechamento', '<=', $post['data_final']);
		}

		$data['pedidos'] = $query->get();

		Excel::create('Pedidos de venda '.date('d-m-Y'), function($excel) use ($data) {
		    $excel->sheet('PEDIDOS', function($sheet) use ($data){
		        $sheet->loadView('PedidoVenda::admin/excel', $data);
		    });
		})->download('xls');
	}

	public function estornar(Request $request){
		$post = $request->input();
		$pedidoVenda = PedidoVenda::find($post['id']);

		if($pedidoVenda && $pedidoVenda->transacao_id){

			$empresas           = Empresa::all();
	        $pagarMe            = [];
	        foreach ($empresas as $empresa) {
	            $apiKey = $empresa->api_key_pagar_me;
	            $pagarMe[$empresa->id] =  new \PagarMe\Sdk\PagarMe($apiKey);
	        }

			$transaction = $pagarMe[$pedidoVenda->empresa_id]->transaction()->get($pedidoVenda->transacao_id);

			/** @var $transaction \PagarMe\Sdk\Transaction\CreditCardTransaction */
			$refund = $pagarMe[$pedidoVenda->empresa_id]->transaction()->creditCardRefund(
			    /** @var $otherTransaction \PagarMe\Sdk\Transaction\CreditCardTransaction */
			    $transaction,
			    number_format($pedidoVenda->total,2,'','')
			);

			$pedidoVenda->transacao_id = $refund->getId();
			$pedidoVenda->id_status_pedido_venda = 4;
			$pedidoVenda->save();

			$pedidoVendaHistorico = new PedidoVendaHistorico();
			$pedidoVendaHistorico->id_pedido_venda = $post['id'];
			$pedidoVendaHistorico->data = date('Y-m-d H:i');
			$pedidoVendaHistorico->notificar_cliente = 0;
			$pedidoVendaHistorico->id_pedido_venda_status = 4;
			$pedidoVendaHistorico->id_colaborador = 1;

			$pedidoVendaHistorico->save();

		}else{
			return response()->json(array(
				'status' => false,
				'message' => 'Não é possível estornar esse pedido'
			));
		}

		return response()->json(array(
			'status' => true,
			'message' => 'Pedido estornado com sucesso!'
		));
	}

	public function alterarStatus(Request $request){
		$post = $request->input();
		$pedidoVenda = PedidoVenda::find($post['id_pedido_venda']);

		if($pedidoVenda){

			$pedidoVenda->id_status_pedido_venda = $post['id_status_pedido_venda'];
			$pedidoVenda->save();

			$pedidoVendaHistorico = new PedidoVendaHistorico();
			$pedidoVendaHistorico->id_pedido_venda = $post['id_pedido_venda'];
			$pedidoVendaHistorico->data = date('Y-m-d H:i');
			$pedidoVendaHistorico->notificar_cliente = 0;
			$pedidoVendaHistorico->id_pedido_venda_status = $post['id_status_pedido_venda'];
			$pedidoVendaHistorico->id_colaborador = 1;

			$pedidoVendaHistorico->save();



		}else{
			return response()->json(array(
				'status' => false,
				'message' => 'Não foi encontrado esse pedido de venda'
			));
		}

		return response()->json(array(
			'status' => true,
			'message' => 'Pedido alterado com sucesso!',
			'pedido' => $pedidoVenda
		));
	}

	public function registrarPagamento(Request $request){

		$post        = $request->input();
		$pedidoVenda = PedidoVenda::find($post['id_pedido_venda']);

		$pre_venda = FALSE;
        foreach ($pedidoVenda->produtos as $item) {
        	$oferta = $item->oferta;
            if($oferta->pre_venda){
                $pre_venda = TRUE;
                break;
            }
        }

		$id_pedido_venda_status = $pre_venda ? 9 : 2;

		if($request->hasFile('comprovante')) {
			//upload an image to the /img/tmp directory and return the filepath.
			$file = $request->file('comprovante');
			$size = $file->getClientSize();
			if($size > 5000000){
			  return response()->json(array(
					'status' => false,
					'message' => 'Tamanho excedido. O tamanho máximo do arquivo deve ser de 5 MB.'
				));
		  	}

			$comprovante = GeralService::uploadFile($file, 'pedido-venda/comprovante');
			$pedidoVenda->comprovante = $comprovante->filename;
		}

		$pedidoVenda->id_status_pedido_venda = $id_pedido_venda_status;
		$pedidoVenda->assunto = $post['observacoes'];

		$pedidoVenda->save();

		$pedidoVendaHistorico = new PedidoVendaHistorico();
		$pedidoVendaHistorico->id_pedido_venda = $post['id_pedido_venda'];
		$pedidoVendaHistorico->data = date('Y-m-d H:i');
		$pedidoVendaHistorico->comentario = $post['observacoes'];
		$pedidoVendaHistorico->notificar_cliente = 0;
		$pedidoVendaHistorico->id_pedido_venda_status = $id_pedido_venda_status;
		$pedidoVendaHistorico->id_colaborador = 1;

		$pedidoVendaHistorico->save();

		if($pedidoVenda->frete){

			$token = GeralService::getApiKeyTinyErp($pedidoVenda->cliente);

			$url = 'https://api.tiny.com.br/api2/pedidos.pesquisa.php';
	        $content = "token=$token&numeroEcommerce=".$pedidoVenda->pedidoEntrega->id."&formato=json";

	        $resultBusca = json_decode(GeralService::enviarREST($url, $content));

	        $id_tiny = $resultBusca->retorno->pedidos[0]->pedido->id;

	        $url = 'https://api.tiny.com.br/api2/pedido.alterar.situacao';
	        $content = "token=$token&situacao=aprovado&id=".$id_tiny."&formato=json";

	        $resultAlteracao = json_decode(GeralService::enviarREST($url, $content));

	        $url = 'https://api.tiny.com.br/api2/gerar.nota.fiscal.pedido.php';
            $content = "token=$token&id=$id_tiny&formato=json&modelo=NFe";

            $resultNota = json_decode(GeralService::enviarREST($url, $content));

		}

		return response()->json(array(
			'status'  => true,
			'message' => 'Pedido alterado com sucesso!',
			'pedido'  => $pedidoVenda
		));
	}

	private function slugify($string)
    {
        return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
    }

    public function buscarCliente(Request $request)
    {
        $search = $request->input('term');
        $q = $search['term'];

        $users = Cadastro::query()
            ->join('sis_users', 'sis_users.id', '=', 'cadastro.user_id')
            ->where(function ($query) use ($q) {
                $query->whereRaw("CONCAT(cadastro.nome, ' ', cadastro.sobrenome) LIKE ?", ["%{$q}%"])
                    ->orWhere('sis_users.email', 'LIKE', "%{$q}%");
            })
            ->select(
                'cadastro.id',
                DB::raw("CONCAT(cadastro.nome, ' ', cadastro.sobrenome) AS nome_completo"),
                'sis_users.email'
            )
            ->limit(10)
            ->get();

        return response()->json($users);
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit