<?php
namespace App\Http\Controllers;
use App\Classes\GeneralGenerator;
use App\Models\AccountCardType;
use App\Models\AccountType;
use App\Models\Company;
use App\Models\CustomerAccount;
use App\Models\CustomerCard;
use App\Models\Payment;
use App\Models\Recharge;
use App\Models\Store;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Ramsey\Uuid\Uuid;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class AccountController extends Controller
{
protected $empresa;
public function getOperatorUser(Request $request)
{
$store = Store::query()
->join('operators', 'operators.store_id', '=', 'stores.id')
->join('merchants', 'merchants.id', '=', 'stores.merchant_id')
->where('operators.id', '=', $request->user()->id)
->get();
return response()->json($store);
}
public function checkAccountCards($number) {
}
public function getAccoutTypes()
{
$data = AccountType::query()->orderBy('name', 'asc')->get();
return response()->json(['data' => $data]);
}
public function getAllAccounts()
{
// $data = CustomerAccount::query()
// ->leftJoin('companies', 'companies.id', '=', 'customer_accounts.company_id')
// ->orderBy('companies.name', 'asc')
// ->select('companies.name as company_name',
// 'companies.nuit as company_nuit',
// 'companies.email as company_email',
// 'companies.address as company_address',
// 'companies.contact_phone_fixo as company_contact_phone_fixo',
// 'companies.contact_phone_mobile as company_contact_phone_mobile',
// 'companies.manager_name as company_manager_name',
// 'customer_accounts.*')
// ->get();
$data = CustomerAccount::query()
// ->leftJoin('companies', 'companies.id', '=', 'customer_accounts.company_id')
->orderBy('name', 'asc')
->get();
return response()->json(['data' => $data]);
}
public function getAccount($id)
{
$account = CustomerAccount::find($id);
if ($account) {
$cards = CustomerCard::query()->where('customer_account_id', $account->id)->get();
$cardsTotal = CustomerCard::query()->where('customer_account_id', $account->id)->count();
$payments = Payment::query()
->join('customer_cards', 'customer_cards.id', '=', 'payments.customer_card_id')
->join('users', 'users.id', '=', 'payments.user_id')
->where('payments.customer_account_id', $account->id)
->select('payments.*', 'customer_cards.card_number', 'customer_cards.username as titular_name',
'customer_cards.phone_number as phone_titular', 'users.name as operador_name')
->get();
$recharges = Recharge::query()
->join('customer_accounts', 'customer_accounts.id', '=', 'recharges.customer_account_id')
->join('users', 'users.id', '=', 'recharges.user_id')
->select('recharges.*', 'users.name as operator_name')
->where('customer_account_id', $account->id)
->orderByDesc('recharges.created_at')
->get();
$totalPayments = Payment::query()->where('customer_account_id', $account->id)->count();
$totalAmount = Payment::query()->where('customer_account_id', $account->id)->sum('amount');
$cardsTotalActivo = CustomerCard::query()
->where('customer_account_id', $account->id)
->where('status', '=', 'activo')
->count();
$cardsTotalBloqueado = CustomerCard::query()
->where('customer_account_id', $account->id)
->where('status', '=', 'bloqueado')
->count();
$cardsTotalEcerado = CustomerCard::query()
->where('customer_account_id', $account->id)
->where('status', '=', 'expirado')
->count();
$rechargesTotal = Recharge::query()
->where('customer_account_id', $account->id)
->count();
$rechargesTotalAmount = Recharge::query()
->where('customer_account_id', $account->id)
->sum('amount');
return response()->json([
'totalCards' => $cardsTotal,
'totalCardsActivo' => $cardsTotalActivo,
'totalCardsBloqueado' => $cardsTotalBloqueado,
'totalCardsExpirado' => $cardsTotalEcerado,
'totalPayments' => $totalPayments,
'totalAmount' => $totalAmount,
'totalRecharges' => $rechargesTotal,
'totalRechargesAmount' => $rechargesTotalAmount,
'account' => $account,
'cards' => $cards,
'payments' => $payments,
'recharges' => $recharges
]);
} else {
return response()->json(['message' => 'Conta não encontrado!'], 400);
}
}
public function getCompanies()
{
$data = Company::query()
->orderBy('name', 'asc')
->get();
return response()->json(['data' => $data]);
}
public function addAccount(Request $request)
{
$this->validate($request, [
'name' => 'required',
'email' => 'required',
'mobile_phone1' => 'required',
'payment_enabled' => 'required',
'card_has_limit' => 'required',
'document_type' => 'required',
'document_number' => 'required',
'account_type_id' => 'required',
'address' => 'required',
// 'balance' => 'required'
],
[
'name.required' => 'Nome do Responsavél Obrigatório'
]);
$tipoConta = AccountType::query()->where('id', $request->account_type_id)->first();
if ($tipoConta->name == 'Empresa' || $tipoConta->name == 'empresa') {
// $this->empresa = Company::create([
// 'name' => $request->company_name,
// 'nuit' => $request->company_nuit,
// 'email' => $request->company_email,
// 'address' => $request->company_address,
// 'contact_phone_fixo' => $request->company_contact_phone_fixo,
// 'contact_phone_mobile' => $request->company_contact_phone_mobile,
// 'manager_name' => $request->company_manager_name,
// 'password' => Hash::make('12345678'),
// 'pin' => Hash::make('1234'),
// 'status' => 'activo',
// 'balance' => '1000',
// 'balance_cards' => '100',
// ]);
// } else {
// $this->empresa = null;
}
$g = new GeneralGenerator();
$uuid = Uuid::uuid4();
QrCode::size(250)->format('svg')->mergeString(public_path('/images/geral/logo.png'))->generate($uuid, public_path('images/account/' . $uuid . '.svg'));
$conta = "";
if ($this->empresa != null)
$conta = $this->empresa->id;
else
$conta = null;
$conta = CustomerAccount::create([
'name' => $request->name,
'email' => $request->email,
'mobile_phone1' => $request->mobile_phone1,
'mobile_phone2' => $request->mobile_phone2,
'account_number' => $g->generateAccountNumberAndCardNumber(),
'reference' => $g->generateReferenceAccount(),
'card_has_limit' => $request->card_has_limit,
// 'card_balance_limit' => $request->card_balance_limit,
'card_balance_limit' => 0,
'balance' => 0,
'balance_cards' => 0,
'qrcode' => url('/') . '/images/account/' . $uuid . '.svg',
'public_id' => $uuid,
'document_type' => $request->document_type,
'document_number' => $request->document_number,
'payment_enabled' => $request->payment_enabled,
'address' => $request->address,
// 'company_id' => $conta,
'account_type_id' => $tipoConta->id,
'user_id' => $request->user()->id
]);
return response()->json(['message' => "Conta Criada Com Sucesso! \n Conta: $conta->account_number"]);
}
public function updateAccount(Request $request)
{
$this->validate($request, [
'public_id' => 'required'
]);
$data = CustomerAccount::query()
->where('public_id', $request->public_id)
->first();
if ($data) {
$data->update([
'name' => $request->name,
'email' => $request->email,
'mobile_phone1' => $request->mobile_phone1,
'mobile_phone2' => $request->mobile_phone2,
'card_has_limit' => $request->card_has_limit,
'card_balance_limit' => $request->card_balance_limit,
// 'balance' => $request->balance,
'document_type' => $request->document_type,
'document_number' => $request->document_number,
'payment_enabled' => $request->payment_enabled,
'address' => $request->address,
'account_type_id' => $request->account_type_id
]);
return response()->json(['message' => 'Parámetros da Conta ' . $data->account_number . ' alterados com Sucesso'], 201);
} else {
return response()->json(['message' => 'Conta inválida'], 402);
}
}
public function associateCartToAccount(Request $request)
{
$this->validate($request, [
'account_number' => 'required',
'card_number' => 'required'
]);
$card = CustomerCard::query()
->where('card_number', $request->card_number)
->first();
$account = CustomerAccount::query()
->where('account_number', $request->account_number)
->first();
if ($account) {
if ($card) {
if ($card->customer_account_id != null && $card->session_status == 1) {
return response()->json(['message' => 'Este Cartão já está associado a uma Conta.'], 400);
} else {
$card->update([
'customer_account_id' => $account->id
]);
// Adicionar Tipo de Cartão
$validar = AccountCardType::query()
->where('customer_account_id', $account->id)
->where('card_type_id', $card->card_type_id)
->count();
if (!($validar > 0)) {
AccountCardType::create([
'customer_account_id' => $account->id,
'card_type_id' => $card->card_type_id
]);
}
return response()->json(['message' => 'Cartão associado com Sucesso!'], 200);
}
} else {
return response()->json(['message' => 'Cartão inválido!'], 400);
}
} else {
return response()->json(['message' => 'Conta inválida'], 402);
}
}
}