unioil-loyalty-app/app/Http/Controllers/API/PaymentController.php

717 lines
29 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Contracts\LcardActionLogsInterface;
use App\Contracts\PaymentResourceInterface;
use App\Contracts\RatingsResourceInterface;
use App\Contracts\StationResourceInterface;
use App\Contracts\LoyaltyCardResourceInterface;
use App\Contracts\SystemPreferenceResourceInterface;
use App\Helpers\StringHelper;
use App\Helpers\HttpStatusCode;
use App\Libraries\CywareLibrary;
use App\Helpers\CurrentUserHelper;
use App\Libraries\StaticContents;
use App\Libraries\Paypal;
use App\Http\Requests\MobileTopUpFormValidation;
use App\Http\Requests\PaypalExecuteFormValidation;
use App\Http\Requests\PaymayaFormValidation;
use App\TopUp;
use App\Libraries\UuidHelper;
use App\Payment;
class PaymentController extends Controller
{
public $payment;
public $rating;
public $station;
protected $format;
protected $lcard_logs;
protected $loyalty_card;
protected $system_preferences;
public function __construct(PaymentResourceInterface $payment,
RatingsResourceInterface $rating,
StationResourceInterface $station,
HttpStatusCode $httpStatusCode,
LcardActionLogsInterface $lcard_logs,
LoyaltyCardResourceInterface $loyalty_card,
SystemPreferenceResourceInterface $system_preferences)
{
$this->format = $httpStatusCode;
$this->lcard_logs = $lcard_logs;
$this->payment = $payment;
$this->rating = $rating;
$this->station = $station;
$this->loyalty_card = $loyalty_card;
$this->system_preferences = $system_preferences;
}
public function filter_by_value ($array, $index, $value){
if(is_array($array) && count($array)>0)
{
foreach(array_keys($array) as $key){
$temp[$key] = $array[$key][$index];
if ($temp[$key] == $value){
$newarray[$key] = $array[$key];
}
}
}
return $newarray;
}
public function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
$res = [];
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
foreach($temp_array as $v) {
$res[] = $v;
}
return $res;
}
public function transactions(Request $request)
{
$date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd');
$date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd');
$member_details = CurrentUserHelper::get_currentMember();
$cyware = new CywareLibrary();
$cyware->setCardNumber($member_details->card_number);
$cyware->setStartDate($date_start);
$cyware->setEndDate($date_end);
$cyware->setLcardID($member_details->lcard_id);
$cyware->state_trans();
$this->lcard_logs->log($member_details->lcard_id,'TRANSACTIONS','VIEW','Member viewed transaction lists');
if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
if(isset($cyware->response['data']->total_amount))
{
// Note : if the result from cyware has only one transaction. The response data is not indexed
$det = $cyware->response['data'];
$cyware->response['data'] = null;
$cyware->response['data'][0] = $det;
}
if(count((array)$cyware->response['data']))
{
$in_app_stations = StaticContents::in_app_stations();
$data = [];
$ctr = 0;
$total_count = count((array)$cyware->response['data']);
foreach ($cyware->response['data'] as $key => $value)
{
// if(($total_count - 5) <= $ctr)
// {
$is_disabled = true;
$is_feedback_disabled = true;
$rating = 0;
if(!isset($value->receipt_num))
{
$payment = $this->payment->get_by_trans_num($value->trans_num);
if(!isset($in_app_stations[$value->store_id]))
{
$rating = isset($payment->ratings) ? $payment->ratings->rate : 0;
$is_disabled = (isset($payment->ratings) && $payment->ratings->rate > 0 )? true : false;;
$is_feedback_disabled = false;
}
}
$items = [];
if(isset($value->items) && count($value->items) > 0)
{
foreach ($value->items as $k => $i)
{
$items[] = [
'item' => $i->item_desc,
'quantity' => (double)$i->qty,
'price' => (double)$i->price,
];
}
}
// NOTE : removed for multiple items
// 'item' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc,
// 'price' => $value->total_amount,
$data[] = [
'station' => $value->store_name,
'total_amount' => (double)$value->total_amount,
'earned' => isset($value->reward_code) ? 0 : (double)$value->total_points,
'redeemed' => isset($value->reward_code) ? (double)$value->total_points : 0,
'date' => date('d M Y, h:i A',strtotime($value->date.' '.$value->time)),
'rating' => $rating,
'is_disabled' => $is_disabled,
'is_feedback_disabled' => $is_feedback_disabled,
'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num,
'items' => $items,
];
// }
$ctr++;
}
$nResults = [];
foreach ($data as $key => $trans) {
$ftr = $this->filter_by_value($data, 'trans_num', $trans['trans_num']);
if(count($ftr) > 1){
//DUPLICATES FOUND
$trans['total_amount'] = 0;
$trans['redeemed'] = 0;
$trans['earned'] = 0;
$trans['items'] = [];
foreach ($ftr as $duplicates => $tran) {
$trans['redeemed'] += $tran['redeemed'];
$trans['earned'] += $tran['earned'];
$trans['total_amount'] += $tran['total_amount'];
foreach ($tran['items'] as $items => $item) {
$trans['items'][] = $item;
}
}
$nResults[] = $trans;
}else{
$nResults[] = $trans;
}
}
$result = $this->unique_multidim_array($nResults, 'trans_num');
$final = [];
$final['sorted'] = $result;
$final['original'] = $data;
return $this->format->mobile_success('Success', $result);
}
else
return $this->format->mobile_success('Success');
}
else
{
if($cyware->response['message'] == null)
return $this->format->mobile_success("No records found",[]);
else
return $this->format->mobile_error($cyware->response['message'],[]);
}
}
public function single_transaction(Request $request)
{
$date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd');
$date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd');
$member_details = CurrentUserHelper::get_currentMember();
$searched = $this->search_transaction(new CywareLibrary(), $member_details->card_number, $request->trans_num, $date_start, $date_end);
$this->lcard_logs->log($member_details->lcard_id,'TRANSACTIONS','VIEW','Member viewed a transaction');
if ($searched['success'])
{
$value = $searched['data'];
$is_disabled = true;
$is_feedback_disabled = true;
$rating = 0;
if(!isset($value->receipt_num))
{
$payment = isset($value->trans_num) ? $this->payment->get_by_trans_num($value->trans_num) : null;
$in_app_stations = StaticContents::in_app_stations();
if(!isset($in_app_stations[$value->store_id]))
{
$rating = isset($payment->ratings) ? $payment->ratings->rate : 0;
$is_disabled = (isset($payment->ratings) && $payment->ratings->rate > 0 )? true : false;
$is_feedback_disabled = false;
}
}
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
$items = [];
if(isset($value->items) && count($value->items) > 0)
{
foreach ($value->items as $k => $i)
{
$items[] = [
'item' => $i->item_desc,
'quantity' => (double)$i->qty,
'price' => (double)$i->price,
];
}
}
$data = [
'station' => $value->store_name,
// 'item' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc,
'total_amount' => (double)$value->total_amount,
'earned' => isset($value->reward_code) ? 0 : (double)$value->total_points,
'redeemed' => isset($value->reward_code) ? (double)$value->total_points : 0,
'date' => date('d M Y, h:i A',strtotime($value->date.' '.$value->time)),
// 'quantity' => isset($value->qty) ? (double)$value->qty : 1,
'rating' => $rating,
'is_disabled' => $is_disabled,
'is_feedback_disabled' => $is_feedback_disabled,
'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num,
'contact_email' => $customer_service_email[0]['value'],
'contact_number' => $customer_service_number[0]['value'],
'items' => $items
];
return $this->format->mobile_success('Success',$data);
}
else
return $this->format->mobile_error($searched['message']);
}
public function rate_transaction(Request $request)
{
$payment = $this->payment->get_by_trans_num($request->trans_num);
$member_details = CurrentUserHelper::get_currentMember();
if($payment)
{
if(isset($payment->ratings))
{
$data = [
'lcard_id' => $member_details->lcard_id,
'station_id' => $payment->station_id,
'payment_id' => $payment->payment_id,
'rate' => $request->rate,
];
if($this->rating->update($data,$payment->ratings->rating_id))
{
$this->lcard_logs->log($member_details->lcard_id,'RATINGS','UPDATE','Member updated a rate on a transaction');
return $this->format->mobile_success('Success');
}
else
return $this->format->mobile_error('Something went wrong');
}
else
{
$data = [
'lcard_id' => $member_details->lcard_id,
'station_id' => $payment->station_id,
'payment_id' => $payment->payment_id,
'rate' => $request->rate,
];
if($this->rating->store($data))
{
$this->lcard_logs->log($member_details->lcard_id,'RATINGS','STORE','Member rated a transaction');
return $this->format->mobile_success('Success');
}
else
return $this->format->mobile_error('Something went wrong');
}
}
else
{
$date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd');
$date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd');
$searched = $this->search_transaction(new CywareLibrary(), $member_details->card_number, $request->trans_num, $date_start, $date_end);
if($searched['success'])
{
$value = $searched['data'];
if($value)
{
$items = [];
if(isset($value->items) && count($value->items) > 0)
{
foreach ($value->items as $k => $i)
{
$items[] = [
'item' => $i->item_desc,
'quantity' => (double)$i->qty,
'price' => (double)$i->price,
];
}
}
$station = $this->station->getByField('code',$value->store_id);
$store_data = [
'station_id' => $station ? $station[0]['station_id'] : 0,
'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num,
// 'item_name' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc,
// 'item_code' => isset($value->reward_code) ? $value->reward_code : $value->item_code,
'total_amount' => $value->total_amount,
'points' => isset($value->reward_code) ? $value->total_points : 0,
'entry_type_code' => isset($value->reward_code) ? $value->reward_code : $value->entry_type_code,
'entry_type_desc' => isset($value->reward_desc) ? $value->reward_desc : $value->entry_type_desc,
// 'receipt_num' => isset($data->receipt_num) ? $data->receipt_num : null,
// 'quantity' => isset($value->qty) ? $value->qty : 1,
'date' => date('Y-m-d H:i:00',strtotime($value->date.' '.$value->time)),
'items' => $items
];
$payment_id = $this->payment->store_non_app($store_data,$member_details);
if($payment_id)
{
$data = [
'lcard_id' => $member_details->lcard_id,
'station_id' => $store_data['station_id'],
'payment_id' => $payment_id,
'rate' => $request->rate,
];
if($this->rating->store($data))
{
$this->lcard_logs->log($member_details->lcard_id,'PAYMENTS','STORE','Member added a non-APP transaction through ratings');
return $this->format->mobile_success('Success');
}
else
return $this->format->mobile_error('Something went wrong');
}
}
return $this->format->mobile_error('Something went wrong');
}
else
return $this->format->mobile_error($searched['message']);
}
}
// paypal transactions
public function get_paypal_url(MobileTopUpFormValidation $request)
{
// check if already have 5 transactions in 24 hours
// $date_yesterday = date('Y-m-d H:i:s', strtotime('-24 hours'));
// $date_now = date('Y-m-d H:i:s');
// $payments = $this->payment->count_between($member_details->lcard_id, $date_yesterday, $date_now);
$payments = $this->count_transaction(new CywareLibrary, $member_details->card_number, date('Y-m-d'));
if($payments < 5)
{
$trans_count = $this->payment->count_trans_month() + 1;
$trans_num = (env('SI_NUM_RANDOM','false') == true ? StringHelper::random_num(2).date('m') : date('ym')).str_pad($trans_count, 4, "0", STR_PAD_LEFT);
$paypal = new Paypal;
$paypal->set_amount($request->amount);
$paypal->set_invoice_number($trans_num);
if($paypal->generate_paypal_url())
{
$this->payment->store([
'trans_num' => $trans_num,
// 'item_name' => 'PREPAID LOAD',
// 'item_code' => 'PREPAID',
'amount' => $request->amount,
'entry_type_code' => 'APP',
'entry_type_desc' => 'APP',
'paypal_id' => $paypal->get_paypal_id(),
'other' => serialize($paypal->get_response()),
'items' => [
[
'item' => 'PREPAID LOAD',
'quantity' => 1,
'price' => $request->amount
]
]
],$member_details);
$this->lcard_logs->log($member_details->lcard_id,'PAYMENTS','STORE','Member added a pending payment through Paypal. Transaction Number : '.$trans_num);
return $this->format->mobile_success('Success',[
'redirect_url' => $paypal->get_approval_url(),
'paypal_id' => $paypal->get_paypal_id(),
'trans_num' => $trans_num,
]);
}
else
return $this->format->mobile_error('Paypal Error');
}
else
return $this->format->mobile_error('You already reached the maximum allowed Top Up transactions per day. Please Top Up again after 24 hours.');
}
// Count the total number of transactions for the Payments Table
public function count_total_transactions(){
$listCount = Payment::with(['loyaltyCard'])->where('payments.created_at', '>=' ,date('Y-m-d').' 00:00:00')->where('payments.created_at', '<=' ,date('Y-m-d').' 23:59:59')->count();
if($listCount <= 5){
return $this->format->mobile_success("Success",$listCount,false);
}
return $this->format->unprocessableEntity("You have reached today's top up limit",$listCount);
}
public function paymaya_execute(PaymayaFormValidation $request){
// eval(\Psy\sh());
// return $this->format->success('Yep its working',[
// 'sample response' => "this is sample response",
// 'sample token' => $request->header('card_number')
// ]);
$member_details = CurrentUserHelper::get_currentMember();
$reference_number = $request->post('reference_number') ? $request->post('reference_number') : StringHelper::random_num(6);
$cyware = new CywareLibrary();
$cyware->setCardNumber($member_details->card_number);
$cyware->setCashier('APP');
$cyware->setBranch('APP');
$cyware->setRegisterNum('1');
$cyware->setSiNum($reference_number);
$cyware->setTotalAmount($request->post('amount'));
$cyware->setPaymentType('CC');
$cyware->setItemCode('PREPAID');
$cyware->state_points();
if($cyware->response['message'] == "SI Number already exist"){
$cyware->setSiNum(StringHelper::random_num(6));
$cyware->state_points();
}
$trans_count = $this->payment->count_trans_month() + 1;
$trans_num = (env('SI_NUM_RANDOM','false') == true ? StringHelper::random_num(2).date('m') : date('ym')).str_pad($trans_count, 4, "0", STR_PAD_LEFT);
$this->payment->store([
'trans_num' => $trans_num,
// 'item_name' => 'PREPAID LOAD',
// 'item_code' => 'PREPAID',
'amount' => $request->amount,
'entry_type_code' => 'APP',
'entry_type_desc' => 'APP',
'paypal_id' => $reference_number,
// 'other' => serialize($paypal->get_response()),
'other' => '',
'items' => [
[
'item' => 'PREPAID LOAD',
'quantity' => 1,
'price' => $request->amount
]
]
],$member_details);
return $this->format->success('Transaction Successful',[
'cyware' => $cyware->response,
'card_number' => $request->header('card_number')
]);
// if($cyware->response['status_code'] == "200" && $cyware->response['success'] == "Prepaid load is successfully loaded in your account")
// {
// return $this->format->success('Transaction Successful',[
// 'message' => "It works",
// 'cyware' => $cyware->response
// ]);
// }
// else return $this->format->unprocessableEntity('Payment is successful. However, we encountered a problem updating your Loyalty Points. Please contact Customer Service for assistance.');
}
private function generateFeeCode(){
$fee_code = "0001";
$details = TopUp::orderBy('created_at', 'desc')->first();
if($details){
$fee_code = ltrim($details->fee_code, '0') + 1;
}
$data = str_pad($fee_code, 4, '0', STR_PAD_LEFT);
return $data;
}
public function paypal_execute(PaypalExecuteFormValidation $request)
{
$paypal = new Paypal;
$paypal->set_paypal_id($request->paymentId);
$paypal->set_payer_id($request->PayerID);
if($paypal->paypal_execute())
{
/*
Note :
invoice_number = trans_num --custom transaction number to be passed to cyware
trans_num = paypal_trans_num --transaction number generated from paypal
*/
$save_db = $this->payment->success_transaction($paypal->get_invoice_number(),[
'other' => $paypal->get_response(),
'firstname' => $paypal->get_payer_firstname(),
'lastname' => $paypal->get_payer_lastname(),
'payer_email' => $paypal->get_payer_email(),
'receiver_email' => $paypal->get_receiver_email(),
'paypal_trans_num' => $paypal->get_trans_num(),
'paid_at' => date('Y-m-d H:i:s',strtotime($paypal->get_paid_at())),
]);
if($save_db)
{
$db = $this->payment->get_by_trans_num($paypal->get_invoice_number());
$member_details = $this->loyalty_card->getByField(['lcard_id' => $db->lcard_id]);
$cyware = new CywareLibrary();
$cyware->setCardNumber($member_details[0]->card_number);
$cyware->setCashier('APP');
$cyware->setBranch('APP');
$cyware->setRegisterNum('1');
$cyware->setSiNum($paypal->get_invoice_number());
$cyware->setTotalAmount($db->amount);
$cyware->setPaymentType('CC');
$cyware->setItemCode('PREPAID');
$cyware->state_points();
if($cyware->response['status_code'] == "200" && $cyware->response['success'] == "Prepaid load is successfully loaded in your account")
{
$this->payment->cyware_synced($db->payment_id,(isset($searched['data']->total_points) ? $searched['data']->total_points : 0));
$this->lcard_logs->log($member_details[0]->lcard_id,'PAYMENTS','UPDATE','Member successfully paid transaction number '.$paypal->get_invoice_number());
$searched = $this->search_transaction($cyware,$member_details[0]->card_number,$paypal->get_invoice_number(),date('Ymd'),date('Ymd'));
return $this->format->success('Transaction Successful',[
'date' => date('d F y h:i A',strtotime($db->paid_at)),
'card_number' => $member_details[0]->card_number,
'invoice' => $paypal->get_invoice_number(),
'points' => isset($searched['data']->total_points) ? $searched['data']->total_points : $paypal->get_total(),
'payment_val' => $paypal->get_total(),
'paypal_fee' => $paypal->get_paypal_fee(),
]);
}
else return $this->format->unprocessableEntity('Payment is successful. However, we encountered a problem updating your Loyalty Points. Please contact Customer Service for assistance.',['details' => $cyware->response['message']]);
}
else return $this->format->unprocessableEntity('Error on database saving');
}
else
{
$this->payment->failed_transaction($request->paymentId, $paypal->get_response());
return $this->format->unprocessableEntity(($paypal->get_error_message() != null ? $paypal->get_error_message() : 'Your purchase for top-up is not successful. Please try again.'));
}
}
public function get_status($trans_num)
{
$details = $this->payment->get_by_trans_num($trans_num);
if($details)
{
if($details->status == 1 && $details->cyware_synced == 1)
return $this->format->mobile_success('Transaction Successful');
else
return $this->format->mobile_error('Transaction Failed');
}
else
return $this->format->mobile_error('Transaction Doesn\'t Exist');
}
private function search_transaction($cyware, $card_number, $trans_num, $date_start, $date_end)
{
$cyware->setCardNumber($card_number);
$cyware->setStartDate($date_start);
$cyware->setEndDate($date_end);
$cyware->state_trans();
$data = [];
if($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
if(count((array)$cyware->response['data']))
{
if(isset($cyware->response['data']->total_amount))
{
// Note : if the result from cyware has only one transaction. The response data is not indexed
if(
(isset($cyware->response['data']->trans_num) && (strcasecmp($cyware->response['data']->trans_num,$trans_num) || $cyware->response['data']->trans_num == $trans_num)/*($cyware->response['data']->trans_num == $trans_num)*/) ||
(isset($cyware->response['data']->receipt_num) && strcasecmp($cyware->response['data']->receipt_num,$trans_num)/*($cyware->response['data']->receipt_num == $trans_num)*/)
)
{
$data = $cyware->response['data'];
}
}
else
{
foreach ($cyware->response['data'] as $key => $value)
{
if(
(isset($value->trans_num) && strcasecmp($value->trans_num,$trans_num) == 0/*($value->trans_num == $trans_num)*/) ||
(isset($value->receipt_num) && strcasecmp($value->receipt_num,$trans_num) == 0/*($value->receipt_num == $trans_num)*/)
)
{
$data = $value;
}
}
}
}
if($data)
return ['success' => true, 'data' => $data];
else
return ['success' => false, 'message' => 'Transaction Not Found'];
}
return ['success' => false, 'message' => $cyware->response['message']];
}
private function count_transaction($cyware, $card_number, $date)
{
$cyware->setCardNumber($card_number);
$cyware->setStartDate($date);
$cyware->setEndDate($date);
$cyware->state_trans();
$count = 0;
if($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
if(isset($cyware->response['data']) && count((array)$cyware->response['data']))
{
if(isset($cyware->response['data']->total_amount))
{
// Note : if the result from cyware has only one transaction. The response data is not indexed
if($cyware->response['data']->date == $date)
$count++;
}
else
{
foreach ($cyware->response['data'] as $key => $value) {
if($value->date == $date)
$count++;
}
}
}
}
return $count;
}
public function test()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000003');
$cyware->setCashier('APP');
$cyware->setBranch('APP');
$cyware->setRegisterNum('1');
$cyware->setSiNum('2015111500001');
$cyware->setTotalAmount('9999.99');
$cyware->setPaymentType('CC');
$cyware->setItemCode('PREPAID');
$cyware->state_points();
dd($cyware->response);
}
}