<?php
namespace App\Http\Controllers;
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',
]);
$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,
'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' => 'Operação não 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' => 'Operação não 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' => 'Operação não autorizada.'], 400);
$order = DebitOrder::findOrFail($id);
if ($order->status !== 'APPROVED') {
return response()->json(['message' => 'A ordem precisa estár 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,
]);
$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_debit(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]);
}
}