<?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]);
}
}