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