• File: PaymentController.php
  • Full Path: /var/www/amparoapi/app/Http/Controllers/PaymentController.php
  • Date Modified: 11/16/2021 8:49 PM
  • File size: 10.59 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Classes\GeneralCheck;
use App\Classes\GeneralGenerator;
use App\Classes\GeneralNotification;
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\DB;

class PaymentController extends Controller
{
    protected $request;
    protected $token;
    protected $account;
    protected $payment;
    protected $accounBalance;
    protected $accounPhone;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function getStoreOperatorPayments(Request $request)
    {

        $data = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('customer_cards', 'customer_cards.id', '=', 'payments.customer_card_id')
            ->join('customer_accounts', 'customer_accounts.id', '=', 'payments.customer_account_id')
            ->leftJoin('operators', 'operators.id', '=', 'payments.user_id')
            ->where('payments.user_id', $request->user()->id)
            ->orderByDesc('payments.created_at')
            ->select('stores.store_name',
                'customer_cards.card_number',
                'customer_cards.username as card_username',
                'customer_cards.phone_number as card_username_phone',
                'customer_accounts.name as account_name',
                'operators.name as operator_name',
                'payments.*')
            ->get();

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

    public function getStoreOperatorPaymentsResume(Request $request)
    {

        $data = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('customer_cards', 'customer_cards.id', '=', 'payments.customer_card_id')
            ->join('customer_accounts', 'customer_accounts.id', '=', 'payments.customer_account_id')
            ->leftJoin('operators', 'operators.id', '=', 'payments.user_id')
            ->where('payments.user_id', $request->user()->id)
            ->orderByDesc('payments.created_at')
            ->select('stores.store_name',
                'customer_cards.card_number',
                'customer_cards.username as card_username',
                'customer_cards.phone_number as card_username_phone',
                'customer_accounts.name as account_name',
                'operators.name as operator_name',
                'payments.*')
            ->get()->take(2);

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

    public function getPayments()
    {

        $data = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('customer_cards', 'customer_cards.id', '=', 'payments.customer_card_id')
            ->join('customer_accounts', 'customer_accounts.id', '=', 'payments.customer_account_id')
            ->leftJoin('operators', 'operators.id', '=', 'payments.user_id')
            ->orderByDesc('payments.created_at')
            ->select('stores.store_name',
                'customer_cards.card_number',
                'customer_cards.username as card_username',
                'customer_cards.phone_number as card_username_phone',
                'customer_accounts.name as account_name',
                'operators.name as operator_name',
                'payments.*')
            ->get();

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

    public function getCardHistory($number)
    {
        $payments = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('customer_cards', 'customer_cards.id', '=', 'payments.customer_card_id')
            ->join('customer_accounts', 'customer_accounts.id', '=', 'payments.customer_account_id')
            ->leftJoin('operators', 'operators.id', '=', 'payments.user_id')
            ->where('customer_cards.card_number', $number)
            ->orderByDesc('payments.created_at')
            ->select('stores.store_name',
                'customer_cards.card_number',
                'customer_cards.username as card_username',
                'customer_cards.phone_number as card_username_phone',
                'customer_accounts.name as account_name',
                'operators.name as operator_name',
                'payments.*')
            ->get();

        $data = CustomerAccount::query()
//            ->leftJoin('companies', 'companies.id', '=', 'customer_accounts.company_id')
            ->join('customer_cards', 'customer_cards.customer_account_id', '=', 'customer_accounts.id')
            ->select('customer_cards.*', 'customer_accounts.name as manager_name', 'customer_accounts.name as company_name'
                , 'customer_accounts.nuit as company_nuit')
//            ->select('customer_cards.*', 'customer_accounts.name as manager_name')
            ->where('customer_cards.card_number', $number)
            ->first();

        $dataRecharges = Recharge::query()
            ->join('customer_cards', 'customer_cards.id', '=', 'recharges.customer_card_id')
            ->join('users', 'users.id', '=', 'recharges.user_id')
            ->select('recharges.*', 'users.name as operator_name', 'customer_cards.card_number', 'customer_cards.username as titular_card_name',
                'customer_cards.phone_number as titular_card_phone_number')
            ->orderByDesc('recharges.created_at')
            ->where('customer_cards.card_number', $number)
            ->get();

        return response()->json(['payments' => $payments, 'data' => $data, 'recharges' => $dataRecharges], 200);

    }

    public function makePayment(Request $request)
    {

        $this->validate($request, [
            'token_sms' => 'required|min:6',
            'amount' => 'required'
        ]);

        $account = CustomerAccount::query()
            ->leftJoin('customer_cards', 'customer_cards.customer_account_id', '=', 'customer_accounts.id')
            ->where('customer_cards.card_number', $request->card_number)
            ->select('customer_cards.*', 'customer_accounts.balance as account_balance',
                'customer_accounts.id as account_id', 'customer_accounts.mobile_phone1 as account_phone')
            ->first();

        $this->account = $account;

        $checker = new GeneralCheck();
        $checkResult = $checker->checkPayment($request, $account);
        $generate = new GeneralGenerator();


        if ($checkResult) {
            return $checkResult;
        } else {
            $this->token = $generate->generateTransaction();

            DB::transaction(function () {

                DB::table('customer_accounts')->where('id', $this->account->account_id)->decrement('balance', $this->request->amount);
                DB::table('customer_cards')->where('id', $this->account->id)->decrement('card_balance', $this->request->amount);
                DB::table('stores')->where('store_public_id', $this->request->store_id)->increment('store_balance', $this->request->amount);

                DB::table('customer_cards')->where('card_number', $this->request->card_number)->update(['session_status' => 1]);

                $payment = Payment::create([
                    'transaction' => $this->token,
                    'amount' => $this->request->amount,
                    'amount_debited' => $this->request->amount,
                    'amount_account' => $this->request->amount,
                    'amount_credited' => 0,
                    'amount_card' => 0,
                    'fee' => 0,
                    'description' => 'Pagamento de factura na clinica amparo',
//                    'store_id' => $this->request->store_id,
                    'store_id' => 1,
                    'customer_card_id' => $this->account->id,
                    'customer_account_id' => $this->account->account_id,
                    'user_id' => $this->request->user()->id

                ]);

                $this->payment = $payment;
            });


            $store = Store::query()
                ->join('operators', 'operators.store_id', '=', 'stores.id')
                ->where('operators.id', $request->user()->id)
                ->select('stores.*')
                ->first();

//            $account2 = CustomerAccount::query()
//                ->leftJoin('customer_cards', 'customer_cards.customer_account_id', '=', 'customer_accounts.id')
//                ->where('customer_cards.card_number', $request->card_number)
//                ->select('customer_cards.*', 'customer_accounts.balance as account_balance',
//                    'customer_accounts.id as account_id', 'customer_accounts.mobile_phone1 as account_phone',
//                    'customer_accounts.balance as account_balance')
//                ->first();

            $account2 = CustomerCard::query()
                ->leftJoin('customer_accounts', 'customer_cards.customer_account_id', '=', 'customer_accounts.id')
                ->where('customer_cards.card_number', $request->card_number)
                ->select('customer_cards.*', 'customer_accounts.balance as account_balance',
                    'customer_accounts.id as account_id', 'customer_accounts.mobile_phone1 as account_phone',
                    'customer_accounts.balance as account_balance')
                ->first();

            // COMENTAR

            $this->accounBalance = 0;
            if ($account2->account_balance != null) {
                $this->accounBalance = $account2->account_balance;
            }

            if ($account2->account_phone != null) {
                $data = [
                    'phone' => $account->phone_number,
                    'phoneAccount' => $account->account_phone,
                    'transaction' => $this->payment->transaction,
                    'amount' => $this->payment->amount,
                    'createdAt' => $this->payment->created_at,
                    'cardNumber' => $account->card_number,
                    'username' => $account->username,
                    'loja' => $store->store_name,
                    'balance' => $account2->account_balance
                ];
                $sms = new GeneralNotification();

//                if ($this->account->can_receive_notification == 1) {
//                    $sms->paymentConfirmationClient($data);
//                    $sms->paymentConfirmationAccount($data);
//                } else {
//                    $sms->paymentConfirmationAccount($data);
//                }

                
            }

            // FIM COMENTAR


            if ($this->payment) {
                return response()->json(['message' => 'Pagamento Efectuado Com Suceso'], 200);
            }

        }


    }
}