<?php namespace App\Http\Controllers; use App\BeginSolicitation; use App\BusinessCreditRequest; use App\DebitOrder; use App\Imali\BusinessAccount; use App\Classes\TransactionGeneration; use App\PaymentMethod; use App\User; use Illuminate\Http\Request; class DebitOrderController extends Controller { // // Supervisores criam ordens public function create_debit(Request $request) { $request->validate([ 'credit_account_number' => 'required', 'amount' => 'required|numeric|min:0.01', 'description' => 'nullable|string|max:255', 'payment_methods_id' => 'required', 'credit_request' => 'nullable|string|max:255', ]); $business = BusinessAccount::find(auth()->user()->business_accounts_id); $order = DebitOrder::create([ 'created_by' => auth()->user()->id, 'created_by_name' => auth()->user()->name . ' ' . auth()->user()->last_name, 'amount' => $request->amount, 'credit_account_number' => (string)$request->credit_account_number, 'debit_account_number' => $business->account_number, 'description' => $request->description, 'credit_request' => $request->credit_request, // novo 'payment_methods_id' => $request->payment_methods_id, 'status' => 'PENDING', ]); return response()->json([ 'message' => 'Ordem de débito criada e aguarda aprovação do administrador.', 'order' => $order, ]); } // Admin aprova ou rejeita public function approve($id) { if (auth()->user()->type !== 'ADMIN') return response()->json(['message' => 'Operacao nao autorizada.'], 400); $order = DebitOrder::findOrFail($id); if ($order->status !== 'PENDING') { return response()->json(['message' => 'Esta ordem já foi processada.'], 400); } $order->update([ 'approved_by' => auth()->user()->id, 'approved_by_name' => auth()->user()->name . ' ' . auth()->user()->last_name, 'status' => 'APPROVED', ]); return response()->json([ 'message' => 'Ordem aprovada com sucesso.', 'order' => $order, ]); } public function reject($id) { if (auth()->user()->type !== 'ADMIN') return response()->json(['message' => 'Operacao nao autorizada.'], 400); $order = DebitOrder::findOrFail($id); if ($order->status !== 'PENDING') { return response()->json(['message' => 'Esta ordem já foi processada.'], 400); } $order->update([ 'approved_by' => auth()->user()->id, 'approved_by_name' => auth()->user()->name . ' ' . auth()->user()->last_name, 'status' => 'REJECTED', ]); return response()->json([ 'message' => 'Ordem rejeitada.', 'order' => $order, ]); } // Apenas Admin conclui após aprovação (efectuar movimento real) public function complete(Request $request, $id) { if (auth()->user()->type !== 'ADMIN') return response()->json(['message' => 'Operacao nao autorizada.'], 400); $order = DebitOrder::findOrFail($id); if ($order->status !== 'APPROVED') { return response()->json(['message' => 'A ordem precisa estar aprovada antes de ser concluída.'], 400); } // chamar o Metodo que faz o b2c $third = new ThirdPartController; $payment_method = PaymentMethod::find($order->payment_methods_id); $trasactionGeneration = new TransactionGeneration(); $transaction = $trasactionGeneration->generateTransaction(); $request->request->add([ 'transaction_type' => $order->type, 'amount' => $order->amount . '.00', 'store_account_number' => $order->debit_account_number, 'payment_method' => strtolower($payment_method->name), 'client_account_number' => (string)$order->credit_account_number, 'partner_transaction_id' => $transaction, ]); // verificar se o metodo a pagar e imali? if (strtolower($payment_method->name) === 'imali') { $payment_controller = new PaymentController; $request->request->add(['account_number' => $request->client_account_number, 'complete_debit' => 'COMPLETE_DEBIT']); $resp2 = $payment_controller->transferMoneyNew2024($request); if ($resp2->getStatusCode() == 200 || $resp2->getStatusCode() == 201) { $order->update(['status' => 'COMPLETED']); // $transaction_id = $resp2->getData()->transactionReference; // $request->credit_request $business = User::getAccount((string)$order->credit_account_number); // conta a debitar $emprestimo = BusinessCreditRequest::query() ->where('transaction_id', $order->credit_request)->first(); if ($emprestimo) { $begin_solicitation = BeginSolicitation::find($emprestimo->dados_begin_solicitation); if ($begin_solicitation) { $begin_solicitation->remaing_amount = $begin_solicitation->total_cost_credit; $begin_solicitation->update(); } // saldo a creditar na conta "credit_balance" $business->credit_balance += $begin_solicitation->total_cost_credit; $business->update(); $emprestimo->update(['status' => 'IN_PROGRESS']); } return response()->json([ 'message' => 'Ordem de débito concluída com sucesso.', 'order' => $order, ]); } else { $order->update(['status' => 'FAILED']); return response()->json([ 'message' => 'A ordem de débito falhou.', 'order' => $order, ]); } } $resp = $third->imaliway_guard_new25($request); if ($resp->getStatusCode() == 200 || $resp->getStatusCode() == 201) { $order->update(['status' => 'COMPLETED']); return response()->json([ 'message' => 'Ordem de débito concluída com sucesso.', 'order' => $order, ]); } else { $order->update(['status' => 'FAILED']); return response()->json([ 'message' => 'A ordem de débito falhou.', 'order' => $order, ]); } } public function get_debitCORRECT(Request $request) { $user = User::getUserDetails(auth()->user()->user_id); // if ($user->profile === 'business' && $user->accept_loans === 1) { // Inicia a query base $query = DebitOrder::query(); // Lista de status válidos $validStatuses = ['PENDING', 'APPROVED', 'REJECTED', 'COMPLETED', 'FAILED']; // Verifica se foi informado um status if ($request->has('status')) { $status = strtoupper($request->status); // Se o status informado não for válido, retorna erro if (!in_array($status, $validStatuses)) { return response()->json([], 400); // return response()->json([ // 'message' => 'Status inválido. Os status permitidos são: ' . implode(', ', $validStatuses) . '.' // ], 400); } // Aplica o filtro de status válido $query->where('status', $status); } // Número de itens por página (padrão = 10) $perPage = $request->get('per_page', 10); // Ordena por data de criação (mais recente primeiro) $orders = $query->orderBy('created_at', 'desc')->get(); $orders = $query->orderBy('created_at', 'desc')->paginate($perPage); // Se não houver registros if ($orders->isEmpty()) { return response()->json(['message' => 'Nenhuma informação encontrada.'], 404); } // Retorna os resultados return response()->json(['orders' => $orders]); // } // Caso o usuário não cumpra as condições return response()->json([ 'data' => [], 'message' => 'Conta Business não autorizada a visualizar ordens de débito.' ], 403); } public function get_debit(Request $request) { $user = User::getUserDetails(auth()->user()->user_id); // Inicia a query base $query = DebitOrder::query(); // Lista de status válidos $validStatuses = ['PENDING', 'APPROVED', 'REJECTED', 'COMPLETED', 'FAILED', 'ALL']; // Verifica se foi informado um status if ($request->has('status')) { $status = strtoupper($request->status); // Se o status informado não for válido, retorna erro if (!in_array($status, $validStatuses)) { return response()->json([ 'message' => 'Status inválido. Os status permitidos são: ' . implode(', ', $validStatuses) . '.' ], 400); } // Se o status for diferente de "ALL", aplica o filtro if ($status !== 'ALL') { $query->where('status', $status); } } // Número de itens por página (padrão = 10) $perPage = $request->get('per_page', 10); // Ordena por data de criação (mais recente primeiro) $orders = $query->orderBy('created_at', 'desc')->paginate($perPage); // Se não houver registros if ($orders->isEmpty()) { return response()->json(['message' => 'Nenhuma informação encontrada.'], 404); } // Retorna os resultados return response()->json(['orders' => $orders]); } }