• File: DebitOrderController-bkp-27112025.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/DebitOrderController-bkp-27112025.php
  • Date Modified: 11/27/2025 4:44 PM
  • File size: 7.81 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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]);
    }
}