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