Files
php_task_1/application/controllers/Member/Member_user_card_controller.php
2022-06-30 05:46:02 -04:00

416 lines
14 KiB
PHP
Executable File

<?php defined('BASEPATH') || exit('No direct script access allowed');
include_once 'Member_controller.php';
/*Powered By: Manaknightdigital Inc. https://manaknightdigital.com/ Year: 2021*/
/**
* User_card Controller
* @copyright 2019 Manaknightdigital Inc.
* @link https://manaknightdigital.com
* @license Proprietary Software licensing
* @author Ryan Wong
*
*/
class Member_user_card_controller extends Member_controller
{
/**
* @var string
*/
protected $_model_file = 'user_card_model';
/**
* @var string
*/
public $_page_name = 'User Card';
public function __construct()
{
parent::__construct();
$this->load->model('credential_model');
$this->load->model('user_model');
$this->load->library('stripe_helper_service');
}
/**
* @param $page
* @return mixed
*/
public function index($page)
{
$this->load->library('pagination');
include_once __DIR__ . '/../../view_models/User_card_member_list_paginate_view_model.php';
$session = $this->get_session();
$user_id = $this->session->userdata('user_id');
$format = $this->input->get('format', TRUE) ?? 'view';
$order_by = $this->input->get('order_by', TRUE) ?? '';
$direction = $this->input->get('direction', TRUE) ?? 'ASC';
$per_page_sort = $this->input->get('per_page_sort', TRUE) ?? 25;
$this->_data['view_model'] = new User_card_member_list_paginate_view_model(
$this->user_card_model,
$this->pagination,
'/member/user_card/0');
$this->_data['view_model']->set_heading('User Card');
$this->_data['view_model']->set_is_default(($this->input->get('is_default', TRUE) != NULL) ? $this->input->get('is_default', TRUE) : NULL);
// $this->_data['view_model']->set_user_id(($this->input->get('user_id', TRUE) != NULL) ? $this->input->get('user_id', TRUE) : NULL);
$this->_data['view_model']->set_last4(($this->input->get('last4', TRUE) != NULL) ? $this->input->get('last4', TRUE) : NULL);
$where = [
'is_default' => $this->_data['view_model']->get_is_default(),
'user_id' => $user_id,
'last4' => $this->_data['view_model']->get_last4()
];
$this->_data['view_model']->set_total_rows($this->user_card_model->count($where));
$this->_data['view_model']->set_format_layout($this->_data['layout_clean_mode']);
$this->_data['view_model']->set_per_page($per_page_sort);
$this->_data['view_model']->set_order_by($order_by);
$this->_data['view_model']->set_sort($direction);
$this->_data['view_model']->set_sort_base_url('/member/user_card/0');
$this->_data['view_model']->set_page($page);
$this->_data['view_model']->set_list($this->user_card_model->get_paginated(
$this->_data['view_model']->get_page(),
$this->_data['view_model']->get_per_page(),
$where,
$order_by,
$direction));
if ($format == 'csv')
{
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
echo $this->_data['view_model']->to_csv();
exit();
}
if ($format != 'view')
{
return $this->output->set_content_type('application/json')
->set_status_header(200)
->set_output(json_encode($this->_data['view_model']->to_json()));
}
return $this->render('Member/User_card', $this->_data);
}
/**
* @return mixed
*/
public function add()
{
include_once __DIR__ . '/../../view_models/User_card_member_add_view_model.php';
$session = $this->get_session();
$user_id = $this->session->userdata('user_id');
$this->form_validation = $this->user_card_model->set_form_validation(
$this->form_validation, $this->user_card_model->get_all_validation_rule());
$this->_data['view_model'] = new User_card_member_add_view_model($this->user_card_model);
$this->_data['view_model']->set_heading('User Card');
if ($this->form_validation->run() === FALSE)
{
return $this->render('Member/User_cardAdd', $this->_data);
}
$user_all_card_data = $this->user_card_model->get_all(['user_id' => $user_id]);
// $user_card_data = $this->user_card_model->get_by_field('user_id', $user_id);
$is_default = $this->input->post('is_default', TRUE);
$card_name = $this->input->post('card_name', TRUE);
$card_number = $this->input->post('card_number', TRUE);
$exp_month = $this->input->post('exp_month', TRUE);
$exp_year = $this->input->post('exp_year', TRUE);
$cvc = $this->input->post('cvc', TRUE);
$new_card_last4 = substr($card_number, 12);
if (!empty($user_all_card_data))
{
if (!empty($card_number) && !empty($exp_month) && !empty($exp_year) && !empty($cvc))
{
// use for each
foreach ($user_all_card_data as $key1 => $res1)
{
if ($res1->last4 == $new_card_last4)
{
// throw error
$this->error('This card last4->(...' . $new_card_last4 . ') is already added. Try again with a new card.');
return redirect($_SERVER['HTTP_REFERER']);
}
}
// add card
$this->stripe_helper_service->set_config($this->config);
$response = $this->stripe_helper_service->create_stripe_token($card_number, $exp_month, $exp_year, $cvc);
if (isset($response['success']))
{
$stripe_token_id = $response['token']->id;
$this->stripe_helper_service->set_user_model($this->user_model);
// pass token_id to assign card to user
$res_card_data = $this->stripe_helper_service->add_new_card($stripe_token_id, $user_id);
if (isset($res_card_data['success']))
{
$stripe_card_id = $res_card_data['card_data']->id;
$stripe_brand = $res_card_data['card_data']->brand;
$stripe_exp_month = $res_card_data['card_data']->exp_month;
$stripe_exp_year = $res_card_data['card_data']->exp_year;
$stripe_last4 = $res_card_data['card_data']->last4;
// store the card id with the associated user
$check_new_card = $this->user_card_model->create([
'is_default' => 0,
'user_id' => $user_id,
'stripe_card_id' => $stripe_card_id,
'last4' => $stripe_last4,
'brand' => $stripe_brand,
'exp_month' => $stripe_exp_month,
'exp_year' => $stripe_exp_year
]);
if ($check_new_card)
{
$this->success('Card added successfully.');
return $this->redirect('/member/user_card/0', 'refresh');
}
else
{
$this->error('Card add failed. Try Again.');
return redirect($_SERVER['HTTP_REFERER']);
}
}
else
{
// when user do not have the user->stripe_id
$this->error($res_card_data['error_msg']);
return redirect($_SERVER['HTTP_REFERER']);
}
}
else
{
// when new card validation failed
$this->error($response['error_msg']);
return redirect($_SERVER['HTTP_REFERER']);
}
}
else
{
$this->error('Empty Field');
return redirect($_SERVER['HTTP_REFERER']);
}
}
else
{
// create stripe_customer_id and add the new card
$this->stripe_helper_service->set_config($this->config);
$response = $this->stripe_helper_service->create_stripe_token($card_number, $exp_month, $exp_year, $cvc);
if (isset($response['success']))
{
$stripe_token_id = $response['token']->id;
// var_dump($stripe_token_id);
// die();
// get user email from credential model
$customer_email = $this->credential_model->get_by_field('user_id', $user_id);
$this->stripe_helper_service->set_config($this->config);
$res_customer = $this->stripe_helper_service->create_stripe_customer_with_card($customer_email, $stripe_token_id);
if (isset($res_customer['success']))
{
$stripe_customer_id = $res_customer['card']->customer;
$stripe_card_id = $res_customer['card']->id;
$stripe_brand = $res_customer['card']->brand;
$stripe_exp_month = $res_customer['card']->exp_month;
$stripe_exp_year = $res_customer['card']->exp_year;
$stripe_last4 = $res_customer['card']->last4;
// update user->stripe_id
$update_stripe_id = $this->user_model->edit([
'stripe_id' => $stripe_customer_id
], $user_id);
// add card on user_card
if ($update_stripe_id)
{
// store the card id with the associated user
$check_new_card = $this->user_card_model->create([
'is_default' => 1,
'user_id' => $user_id,
'stripe_card_id' => $stripe_card_id,
'last4' => $stripe_last4,
'brand' => $stripe_brand,
'exp_month' => $stripe_exp_month,
'exp_year' => $stripe_exp_year
]);
if ($check_new_card)
{
$this->success('Card added successfully and set to default.');
return $this->redirect('/member/user_card/0', 'refresh');
}
else
{
$this->error('Card add failed. Try Again.');
return redirect($_SERVER['HTTP_REFERER']);
}
}
}
else
{
$this->error($res_customer['error_msg']);
return redirect($_SERVER['HTTP_REFERER']);
}
}
else
{
// when new card validation failed
$this->error($response['error_msg']);
return redirect($_SERVER['HTTP_REFERER']);
}
}
$this->_data['error'] = 'Error';
return $this->render('Member/User_cardAdd', $this->_data);
}
public function set_default()
{
$user_id = $this->session->userdata('user_id');
$user_card_id = $this->input->post('user_card_id');
if (!empty($user_card_id))
{
$user_card_data = $this->user_card_model->get($user_card_id);
if (!empty($user_card_data))
{
if ($user_card_data->is_default == 1)
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = 'This card is already set to default.';
echo json_encode($output);
exit();
}
}
$this->stripe_helper_service->set_config($this->config);
$this->stripe_helper_service->set_user_model($this->user_model);
$response = $this->stripe_helper_service->update_default_card($user_card_data->stripe_card_id, $user_id);
if (isset($response['success']))
{
// make other cards is_default to = 0
$all_card_data = $this->user_card_model->get_all(['user_id' => $user_id]);
if (!empty($all_card_data))
{
foreach ($all_card_data as $key1 => $res1)
{
$this->user_card_model->edit(['is_default' => 0], $res1->id);
}
}
// then only set is_default 1 to the default card
$result = $this->user_card_model->edit([
'is_default' => 1
], $user_card_id);
if ($result)
{
$output['success'] = TRUE;
$output['status'] = 200;
$output['msg'] = 'Card set to default.';
echo json_encode($output);
exit();
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = 'Error! Please try again later.';
echo json_encode($output);
exit();
}
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = $response['error_msg'];
echo json_encode($output);
exit();
}
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = 'Error! User card not found.';
echo json_encode($output);
exit();
}
}
public function delete()
{
$user_id = $this->session->userdata('user_id');
$user_card_id = $this->input->post('user_card_id');
if (!empty($user_card_id))
{
$user_card_data = $this->user_card_model->get($user_card_id);
$this->stripe_helper_service->set_config($this->config);
$this->stripe_helper_service->set_user_model($this->user_model);
$response = $this->stripe_helper_service->delete_card_from_customer($user_id, $user_card_data->stripe_card_id);
if (isset($response['success']))
{
$result = $this->user_card_model->real_delete($user_card_id);
if ($result)
{
$output['success'] = TRUE;
$output['status'] = 200;
$output['msg'] = 'User card deleted successfully.';
echo json_encode($output);
exit();
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = 'Error! Please try again later.';
echo json_encode($output);
exit();
}
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = $response['error_msg'];
echo json_encode($output);
exit();
}
}
else
{
$output['error'] = TRUE;
$output['status'] = 0;
$output['msg'] = 'Error! User card not found.';
echo json_encode($output);
exit();
}
}
}