• File: AccountController.php
  • Full Path: /var/www/amparoapi/app/Http/Controllers/AccountController.php
  • Date Modified: 10/28/2021 9:10 PM
  • File size: 11.28 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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);
        }

    }

}