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