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