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