util = $util; } private function getLastNumero($empresa_id){ $last = Troca::where('empresa_id', $empresa_id) ->orderBy('numero_sequencial', 'desc') ->where('numero_sequencial', '>', 0)->first(); $numero = $last != null ? $last->numero_sequencial : 0; $numero++; return $numero; } private function calcularComissaoVenda($venda, $comissao, $empresa_id, $troca) { $valorRetorno = 0; $config = ConfigGeral::where('empresa_id', $empresa_id)->first(); $tipoComissao = 'percentual_vendedor'; if($config != null && $config->tipo_comissao == 'percentual_margem'){ $tipoComissao = 'percentual_margem'; } if($tipoComissao == 'percentual_vendedor'){ $valorRetorno = ((float)$venda->total * (float)$comissao) / 100; }else{ foreach ($troca->itens as $i) { $percentualLucro = ((($i->produto->valor_compra-$i->valor_unitario)/$i->produto->valor_compra)*100)*-1; $margens = MargemComissao::where('empresa_id', $empresa_id)->get(); $margemComissao = null; $dif = 0; $difAnterior = 100; foreach($margens as $m){ $margem = $m->margem; if($percentualLucro >= $margem){ $dif = $percentualLucro - $margem; if($dif < $difAnterior){ $margemComissao = $m; $difAnterior = $dif; } } } if($margemComissao){ $valorRetorno += ($i->sub_total * $margemComissao->percentual) / 100; } } } return $valorRetorno; } public function store(Request $request){ $comissao = null; if($request->tipo == 'nfce'){ $item = Nfce::findOrFail($request->venda_id); $cashBackCliente = CashBackCliente::where('empresa_id', $request->empresa_id) ->where('tipo', 'pdv')->where('venda_id', $item->id)->first(); if($cashBackCliente){ $cashBackCliente->delete(); } $comissao = ComissaoVenda::where('nfce_id', $item->id)->first(); }else{ $item = Nfe::findOrFail($request->venda_id); $cashBackCliente = CashBackCliente::where('empresa_id', $request->empresa_id) ->where('tipo', 'venda')->where('venda_id', $item->id)->first(); if($cashBackCliente){ $cashBackCliente->delete(); } $comissao = ComissaoVenda::where('nfe_id', $item->id)->first(); } try{ if($request->cliente_id){ $item->cliente_id = $request->cliente_id; } $caixa = Caixa::where('usuario_id', $request->usuario_id) ->where('status', 1) ->first(); $troca = Troca::create([ 'empresa_id' => $request->empresa_id, 'nfce_id' => $request->tipo == 'nfce' ? $item->id : null, 'nfe_id' => $request->tipo == 'nfe' ? $item->id : null, 'caixa_id' => $caixa->id, 'observacao' => '', 'numero_sequencial' => $this->getLastNumero($request->empresa_id), 'codigo' => Str::random(8), 'valor_troca' => __convert_value_bd($request->valor_total), 'valor_original' => $item->total, 'tipo_pagamento' => $request->tipo_pagamento ? $request->tipo_pagamento : $item->tipo_pagamento ]); $item->total = __convert_value_bd($request->valor_total); $item->save(); // foreach($item->itens as $i){ // if ($i->produto->gerenciar_estoque) { // $this->util->incrementaEstoque($i->produto_id, $i->quantidade, null, $item->local_id); // } // } if($request->produto_id){ for ($i = 0; $i < sizeof($request->produto_id); $i++) { $produto_id = $request->produto_id[$i]; $quantidade = __convert_value_bd($request->quantidade[$i]); $add = 1; $qtd = 0; $product = Produto::findOrFail($produto_id); foreach($item->itens as $itemNfce){ if($itemNfce->produto_id == $produto_id && $itemNfce->quantidade == $quantidade){ $add = 0; }else{ if($itemNfce->produto_id == $produto_id && $itemNfce->quantidade != $quantidade){ $quantidade = $itemNfce->quantidade - $quantidade; } } } if($add == 1){ ItemTroca::create([ 'produto_id' => $produto_id, 'quantidade' => $quantidade, 'troca_id' => $troca->id, 'valor_unitario' => __convert_value_bd($request->valor_unitario[$i]), 'sub_total' => __convert_value_bd($request->subtotal_item[$i]), ]); } if ($product->gerenciar_estoque) { $this->util->reduzEstoque($product->id, $quantidade, null, $item->local_id); } } } if($item->funcionario_id){ //criar comissao if($comissao && $comissao->status == 0){ $comissao->delete(); $troca = Troca::findOrFail($troca->id); $funcionario = Funcionario::findOrFail($item->funcionario_id); $comissao = $funcionario->comissao; $valorRetorno = $this->calcularComissaoVenda($item, $comissao, $item->empresa_id, $troca); if($valorRetorno > 0){ ComissaoVenda::create([ 'funcionario_id' => $item->funcionario_id, 'nfce_id' => get_class($item) == 'App\Models\Nfce' ? $item->id : null, 'nfe_id' => get_class($item) == 'App\Models\Nfe' ? $item->id : null, 'tabela' => get_class($item) == 'App\Models\Nfce' ? 'nfce' : 'nfe', 'valor' => $valorRetorno, 'valor_venda' => $item->total, 'status' => 0, 'empresa_id' => $item->empresa_id ]); } } } $itensRemovidos = $request->itensRemovidos ? json_decode($request->itensRemovidos) : []; foreach ($itensRemovidos as $r) { ItemTrocaRemovido::create([ 'produto_id' => $r->produto_id, 'quantidade' => $r->quantidade, 'troca_id' => $troca->id ]); $product = Produto::findOrFail($r->produto_id); if ($product->gerenciar_estoque) { $this->util->incrementaEstoque($product->id, (float)$r->quantidade, null, $item->local_id); } } $tp = $request->tipo_pagamento ? $request->tipo_pagamento : $item->tipo_pagamento; __createLog($request->empresa_id, 'Troca', 'cadastrar', "#$troca->numero_sequencial - R$ " . __moeda($troca->valor_troca)); if($item->contaReceber()->exists()){ return response()->json([ 'status' => 'conta_receber', 'message' => 'Venda possui contas a receber. Ajuste as parcelas.', 'troca_id' => $troca->id, 'venda_id' => $item->id, 'tipo' => $request->tipo ], 200); }else{ if($request->valor_credito > 0 && $request->cliente_id && $tp == '00'){ $cliente = Cliente::findOrFail($request->cliente_id); CreditoCliente::create([ 'valor' => $request->valor_credito, 'cliente_id' => $cliente->id, 'troca_id' => $troca->id, 'status' => 1 ]); $cliente->valor_credito += __convert_value_bd($request->valor_credito); $cliente->save(); } } return response()->json($troca, 200); } catch (\Exception $e) { __createLog($request->empresa_id, 'Troca', 'erro', $e->getMessage()); return response()->json($e->getMessage() . ", line: " . $e->getLine() . ", file: " . $e->getFile(), 401); } } }