• File: TransactionCommitionController.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/TransactionCommitionController.php
  • Date Modified: 11/26/2025 7:17 PM
  • File size: 8.44 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Classes\SendResponse;
use App\Direction;
use App\Fee;
use App\TransactionDirection;
use App\TransactionType;
use App\User;
use Illuminate\Http\Request;

class TransactionCommitionController extends Controller
{
    //
    public function create_transaction(Request $request)
    {
        $request->validate([
            'description' => 'required|string',
            'abbrev' => 'required|string',
            'directions' => 'required|array',
        ]);

        $transactionType = TransactionType::create([
            'description' => $request->description,
            'abbrev' => $request->abbrev,
        ]);

        $transactionType->directions()->sync($request->directions);

        if ($transactionType) {
            return response()->json(['message' => 'Adicionado com sucesso'], 200);
        }

        return response()->json(['message' => 'Erro ao adicionar'], 500);
    }

    public function get_transaction()
    {
        $transac = TransactionType::query()->get();

        return response()->json(['data' => $transac]);
    }


    public function create_transaction_direction(Request $request)
    {
        $request->validate(
            [
                'transaction_direction' => 'required|in:C2B,B2C,B2B,C2C',
                'transaction_types_id' => 'required|integer|exists:transaction_types,id',
            ],
            [
                'transaction_types_id.required' => 'O campo transaction_types_id é obrigatório.',
                'transaction_types_id.exists' => 'O transaction_types_id informado não existe.',
                'transaction_direction.required' => 'O campo direção da transação é obrigatório.',
                'transaction_direction.in' => 'A direção da transação deve ser C2B, B2C, B2B ou C2C.',
            ]
        );

        // Buscar o TransactionType correspondente
        $transactionType = TransactionType::find($request->transaction_types_id);

        // Gerar as iniciais da descrição do TransactionType
        $words = explode(' ', $transactionType->description);
        $initials = '';
        foreach ($words as $word) {
            $initials .= strtoupper(substr($word, 0, 1));
        }

        // Concatenar iniciais + transaction_direction
        $code = $initials . '' . strtoupper($request->transaction_direction);

        $transactionType = TransactionDirection::create([
            'code' => $code,
            'transaction_direction' => $request->transaction_direction,
            'transaction_types_id' => $request->transaction_types_id
        ]);

        if ($transactionType) {
            return response()->json(['message' => 'Adicionado com sucesso' . $transactionType], 200);
        }

        return response()->json(['message' => 'Erro ao adicionar'], 500);
    }

    public function get_transaction_direction()
    {
        $transac = TransactionDirection::query()->get();

        return response()->json(['data' => $transac]);
    }

    public function create_transaction_fees(Request $request)
    {
        $request->validate(
            [
                'commission_form' => 'required|in:PERCENTAGE,FIXED',
                'payer' => 'required|in:SENDER,RECEIVER',

                'value' => 'required|numeric',

                'min_value' => 'required_if:commission_form,PERCENTAGE|prohibited_if:commission_form,FIXED|numeric|nullable',
                'max_value' => 'required_if:commission_form,PERCENTAGE|prohibited_if:commission_form,FIXED|numeric|nullable',
                'account_number' => 'required_if:commission_type,SPECIFIC|prohibited_if:commission_type,GENERIC|numeric|nullable',

                'commission_type' => 'required|in:GENERIC,SPECIFIC',
                'account_type' => 'required|in:CLIENT,BUSINESS,SUBACCOUNT',
                'plus_form' => 'nullable|in:PERCENTAGE,FIXED',
                'directions_id' => 'required|integer',
                'plus_value' => 'nullable|integer',
                'transaction_types_id' => 'required|integer',
            ],
            [
                'commission_form.required' => 'O campo commission_form é obrigatório.',
                'commission_form.in' => 'O campo commission_form deve ser PERCENTAGE ou FIXED.',

                'value.required' => 'O campo value é obrigatório.',
                'value.numeric' => 'O campo value deve ser numérico.',

                'min_value.required_if' => 'O campo min_value é obrigatório quando commission_form for PERCENTAGE.',
                'max_value.required_if' => 'O campo max_value é obrigatório quando commission_form for PERCENTAGE.',
                'account_number.required_if' => 'O campo account_number é obrigatório quando commission_type for SPECIFIC.',

                'min_value.prohibited_if' => 'O campo min_value não deve ser enviado quando commission_form for FIXED.',
                'max_value.prohibited_if' => 'O campo max_value não deve ser enviado quando commission_form for FIXED.',
                'account_number.prohibited_if' => 'O campo account_number não deve ser enviado quando commission_type for GENERIC.',

                'payer.required' => 'O campo payer é obrigatório.',
                'payer.in' => 'O campo payer deve ser SENDER ou RECEIVER.',

                'directions_id.required' => 'O campo directions_id é obrigatório.',
                'transaction_types_id.required' => 'O campo transaction_types_id é obrigatório.',

                'plus_form.in' => 'O campo plus_form deve ser PERCENTAGE ou FIXED.',

                'commission_type.required' => 'O campo commission_type é obrigatório.',
                'commission_type.in' => 'O campo commission_type deve ser GENERIC ou SPECIFIC.',

                'account_type.required' => 'O campo account_type é obrigatório.',
                'account_type.in' => 'O campo account_type deve ser CLIENT, BUSINESS ou SUBACCOUNT.',
            ]
        );

        if ($request->filled(['directions_id', 'transaction_types_id'])) {
            $TransactionDirection = TransactionDirection::where('directions_id', $request->directions_id)
                ->where('transaction_types_id', $request->transaction_types_id)
                ->first();

            if (!$TransactionDirection) {
                return response()->json([
                    'message' => 'Não existe TransactionDirection com essa combinação de directions_id e transaction_types_id.'
                ], 422);
            }
        } else {

            $TransactionDirection = TransactionDirection::find($request->transaction_directions_id);
        }

        $transactionType = TransactionType::find($request->transaction_types_id);
        $direction = Direction::find($request->directions_id);

        if (!$transactionType || !$direction) {
            return response()->json([
                'message' => 'Não foi possível gerar o code, verifique transaction_types_id ou directions_id.'
            ], 422);
        }

        $code = strtoupper($transactionType->abbrev . '_' . $request->account_type . '_' . $direction->description);

        $account_number = User::getAccount($request->account_number);
        $user = User::getUserDetails($account_number->user_id);

        if ($request->commission_type == 'SPECIFIC' && !$account_number) return SendResponse::errorResp404notfound('Conta não encontrada', 'Account not found');

        if ($request->commission_type == 'SPECIFIC' && $user && (strtoupper($user->profile) != strtoupper($request->account_type))) return SendResponse::errorResp404notfound('Tipo de conta incompativel', 'Incompative Account Type');


        $fee = Fee::create([
            'code' => $code,
            'transaction_directions_id' => $TransactionDirection->id,
            'commission_form' => $request->commission_form,
            'payer' => $request->payer,
            'min_value' => $request->min_value * 1000,
            'max_value' => $request->max_value * 1000,
            'value' => $request->value * 1000,
            'commission_type' => $request->commission_type,
            'account_type' => $request->account_type,
            'account_number' => $request->account_number,
            'obs' => $request->obs
        ]);

        if ($fee) {
            return response()->json(['message' => 'Adicionado com sucesso' . $fee], 200);
        }

        return response()->json(['message' => 'Erro ao adicionar'], 500);
    }

    public function get_transaction_fees()
    {
        $transac = Fee::query()->get();

        return response()->json(['data' => $transac]);
    }
}