FEAT_PAYMENT_STATUS_MODULE

This commit is contained in:
Srinivas-Saravanan 2025-02-28 16:15:12 +05:30
parent 01e22f2b93
commit db7cc3d8eb
10 changed files with 586 additions and 228 deletions

View File

@ -201,7 +201,7 @@ $routes->get('/payment_failure', 'Payment::payment_failure');
$routes->get('/payment_process','Payment::payment_process'); $routes->get('/payment_process','Payment::payment_process');
$routes->get('payment_success','Payment::payment_success'); $routes->get('payment_success','Payment::payment_success');
$routes->match(['get','post'],'/subscription_renewal/(:any)','Payment::index/$1'); $routes->match(['get','post'],'/subscription_renewal/(:any)','Payment::index/$1');
$routes->match(['get','post'],'payment_status','Payment::paymentStatus');
// Logs // Logs

View File

@ -9,12 +9,19 @@ use App\Models\BusinessModel;
use App\Models\BooksModel; use App\Models\BooksModel;
use App\Helpers\NotificationHelper; use App\Helpers\NotificationHelper;
use App\Helpers\date_picker; use App\Helpers\date_picker;
use App\Models\PaymentStatusModel;
use App\Models\SubscriptionModel; use App\Models\SubscriptionModel;
use Mpdf\Mpdf; use Mpdf\Mpdf;
use Dompdf\Dompdf; use Dompdf\Dompdf;
class Invoice extends BaseController class Invoice extends BaseController
{ {
protected $paymentModel;
public function __construct()
{
$this->paymentModel = new PaymentStatusModel();
}
## For Invoice Listing.. ## For Invoice Listing..
public function index() public function index()
{ {
@ -410,6 +417,7 @@ class Invoice extends BaseController
if ((int)$invoiceType === 2) { if ((int)$invoiceType === 2) {
$membership = (!empty($this->request->getPost('membership_id'))) ? $this->request->getPost('membership_id') : ""; $membership = (!empty($this->request->getPost('membership_id'))) ? $this->request->getPost('membership_id') : "";
$membership_id = substr($membership,0,6); $membership_id = substr($membership,0,6);
log_message('error','Membership id : '.$membership != null && $membership != ''? $membership : "");
$this->create_or_update_subscription($invoice_id,$invoice_status, $msg_flag_name,$membership_id); $this->create_or_update_subscription($invoice_id,$invoice_status, $msg_flag_name,$membership_id);
} }
@ -546,6 +554,8 @@ public function create_or_update_subscription($invoice_id,$invoice_status, $msg_
$renewal = 0; $renewal = 0;
if (!empty($membership_id)){ if (!empty($membership_id)){
$sub_id = $subModel->select('sub_id')->where('membership_id',$membership_id)->first(); $sub_id = $subModel->select('sub_id')->where('membership_id',$membership_id)->first();
log_message('error','going to call the function');
$this->checkPaymentStatus($membership_id);
} }
foreach ($invoiceItems as $item) { foreach ($invoiceItems as $item) {
$product_id = $item['product']; $product_id = $item['product'];
@ -595,6 +605,24 @@ public function create_or_update_subscription($invoice_id,$invoice_status, $msg_
} }
} }
public function checkPaymentStatus($membership_id){
log_message("error","Function Called");
try {
$id = $this->paymentModel->where('membership_id', $membership_id)->first()['id'];
if ($id) {
$data['status'] = 9999;
$data['updated_by'] = (int)get_logged_user_id();
$this->paymentModel->update($id, $data);
log_message('error', 'Payment Status Found and updated by User' . $data['updated_by']);
} else {
log_message("error", "id not found" . $membership_id);
}
}catch (\Exception $e){
log_message('error','Id not found on the checkpaymentstatus ');
}
}
## For Updating Events Details .. ## For Updating Events Details ..
public function update_number_formatting($update_events) public function update_number_formatting($update_events)

View File

@ -8,6 +8,7 @@ use App\Models\InvoiceModel;
use App\Models\TransactionModel; use App\Models\TransactionModel;
use App\Models\SubscriptionModel; use App\Models\SubscriptionModel;
use App\Models\AuthenticationModel; use App\Models\AuthenticationModel;
use App\Models\PaymentStatusModel;
require_once('vendor/autoload.php'); require_once('vendor/autoload.php');
define('PROJECT', 'vendor/paytm/paytm-pg'); define('PROJECT', 'vendor/paytm/paytm-pg');
@ -15,8 +16,11 @@ define('PROJECT', 'vendor/paytm/paytm-pg');
class Payment extends BaseController class Payment extends BaseController
{ {
protected $paymentModel;
public function __construct() { public function __construct() {
helper('encdec_paytm'); helper('encdec_paytm');
$this->paymentModel = new PaymentStatusModel();
} }
public function index($membership_id = null) public function index($membership_id = null)
@ -84,6 +88,7 @@ class Payment extends BaseController
public function pay() public function pay()
{ {
// $payment_model = new PaymentStatusModel();
$userAgent = $_SERVER['HTTP_USER_AGENT']; $userAgent = $_SERVER['HTTP_USER_AGENT'];
$payment_method = preg_match('/mobile/i', $userAgent) ? "mobile" : 'website'; $payment_method = preg_match('/mobile/i', $userAgent) ? "mobile" : 'website';
$data = $_POST; $data = $_POST;
@ -107,6 +112,18 @@ class Payment extends BaseController
$data['checkSum'] = $checkSum; $data['checkSum'] = $checkSum;
$data['paramList'] = $paramList; $data['paramList'] = $paramList;
$decryptedChecksum = verifychecksum_e($data['paramList'], env('Merchant_Key'),$data['checkSum']); $decryptedChecksum = verifychecksum_e($data['paramList'], env('Merchant_Key'),$data['checkSum']);
$payment_status_data = [
'customer_id' => $CUST_ID,
'membership_id' => $membership_id,
'order_id' => $ORDER_ID,
'scheme_id' => env('RENEWAL_SCHEME_ID'),
'amount' => $TXN_AMOUNT,
'device' => $payment_method == "mobile"? "Mobile":"Web"
];
$result = $this->paymentModel->insert($payment_status_data);
if ($result){
log_message('info','Data Inserted to Payment Status '.json_encode($payment_status_data));
}
log_message('error','Data Sent to Paytm: '.json_encode($data['paramList'])); log_message('error','Data Sent to Paytm: '.json_encode($data['paramList']));
return view('/tresponse', $data); return view('/tresponse', $data);
} }
@ -323,8 +340,18 @@ public function payment_process() {
$model4->save($paramList); $model4->save($paramList);
log_message('error','transaction details added to transaction table'); log_message('error','transaction details added to transaction table');
$insertId = $model4->insertID();
$payment_status_id = $this->paymentModel->select('id')->where('order_id',$this->request->getVar('ORDERID'))->first()['id'];
// echo "payment status id :";
// var_dump($payment_status_id);die();
$payement_status_update['status'] = $insertId;
// $payement_status_update['status'] = $payment_status_id;
log_message('info','sent data' .json_encode($data)); $updated = $this->paymentModel->update($payment_status_id, $payement_status_update);
log_message('error', 'Payment Status Updated: ' . json_encode($updated));
log_message('info', 'saved data' . json_encode($data));
return redirect()->to(base_url('/payment_success')); return redirect()->to(base_url('/payment_success'));
} }
@ -406,6 +433,39 @@ public function viewLog($fileName)
return redirect()->back()->with('error', 'Log file not found.'); return redirect()->back()->with('error', 'Log file not found.');
} }
public function paymentStatus(){
if ($this->request->is('get')){
$data['page_name'] = "Payment Status";
$data['selected_data'] = "";
$data['payment_status'] = $this->paymentModel->where('is_active',1)->findAll();
// dd($data);
return $this->render_page('payment_status_view',$data);
}else{
$received_data = $this->request->getPost();
log_message('error','data received from post '.json_encode($received_data));
$dateParts = explode(' - ', $received_data['dateRange']);
$status = $received_data['status'];
$fromDate = $dateParts[0];
$toDate = $dateParts[1];
// Update date conversion format using the global namespace
$fromDate = \DateTime::createFromFormat('d/m/Y', $dateParts[0])->format('Y-m-d');
$toDate = \DateTime::createFromFormat('d/m/Y', $dateParts[1])->format('Y-m-d');
$payment_data['payment_status_data'] = $this->paymentModel->getPaymentData($fromDate, $toDate,$status);
log_message('debug',json_encode($payment_data));
$html = view('payment_status_table',$payment_data);
$data['selected_data'] = $received_data['dateRange'];
// $data = "";
return $this->response->setJSON(['status'=> true,'data' => $data,"html" => $html]);
}
}
} }

View File

@ -0,0 +1,52 @@
<?php
namespace App\Models;
use CodeIgniter\Model;
class PaymentStatusModel extends Model
{
protected $DBGroup = 'default';
protected $table = 'payment_status';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [
'id',
'customer_id',
'membership_id',
'scheme_id',
'amount',
'device',
'status',
'is_active',
'order_id'
];
public function getPaymentData($fromDate = null, $toDate = null, $status)
{
$builder = $this->db->table('payment_status')->select('payment_status.*,concat(customers.first_name," ",customers.last_name) as customer_name,books.short_code as scheme_name')
->join('customers','customers.customer_id = payment_status.customer_id and customers.isactive = 1')
->join('books','books.book_id = payment_status.scheme_id and books.isactive = 1');
if (!empty($fromDate) && !empty($toDate)) {
$builder->where('payment_status.created_at >=', $fromDate.' 00:00:00')
->where('payment_status.created_at <=', $toDate. ' 23:59:59');
}
if ($status == 1) {
$builder->where('payment_status.status >', 0); // Correct usage of where() for status
}else{
$builder->where('payment_status.status', null);
}
$builder->where('payment_status.is_active',1);
$data = $builder->get()->getResultArray();
log_message('error',json_encode($this->db->getLastQuery()->getQuery()));
return $data; // Fetch and return as an array
}
}

View File

@ -0,0 +1,23 @@
<table id="datatable-buttons" class="table table-striped nowrap w-100">
<thead class="custom-thead">
<tr>
<th><b>Customer Name</b></th>
<th><b>Membership ID</b></th>
<th><b>SCHEME Name</b></th>
<th><b>ORDER ID</b></th>
<th><b>Amount</b></th>
</tr>
</thead>
<tbody class="custom-tbody">
<?php foreach ($payment_status_data as $row) { ?>
<tr>
<td><?= isset($row['customer_name'])?$row['customer_name']:"-"?></td>
<td><?= isset($row['membership_id'])?$row['membership_id']:"-"?></td>
<td><?= isset($row['scheme_name'])?$row['scheme_name']:"-"?></td>
<td><?= isset($row['order_id'])?$row['order_id']:"-"?></td>
<td><?= isset($row['amount'])?$row['amount']:"-"?></td>
</tr>
<?php } ?>
</tbody>
</table>

View File

@ -0,0 +1,175 @@
<style>
.custom-thead th,
.custom-tbody td {
white-space: initial !important;
}
.custom-thead th {
text-align: center;
/* Center-align the main table column headings */
}
td {
text-align: center;
}
</style>
<div class="card">
<div class="card-body">
<!-- start page title -->
<div class="row d-flex align-items-center">
<!-- Title Section -->
<div class="col-md-3">
<div class="page-title-box page-title-box-alt">
<h4 class="page-title"><?= $page_name ?></h4>
</div>
</div>
<div class="col-md-4">
<div class="custom-control custom-switch" style="text-align: left;">
<input type="checkbox" class="custom-control-input" id="statusSwitch" data-parsley-multiple="statusSwitch" checked>
<label class="custom-control-label" for="statusSwitch">Payment receieved</label>
</div>
</div>
<!-- Form Section -->
<div class="col-md-5">
<!-- <form id="payment_status_form"> -->
<div class="form-group">
<div class="row">
<div class="col-md-7">
<input class="form-control input-daterange-datepicker" type="text" id="daterange" name="date" value="<?php echo $selected_data; ?>" />
</div>
<div class="col-md-5">
<button onclick="submitdateRange()" id="dateRangeButton" class="btn btn-primary">Get Details</button>
</div>
</div>
</div>
<!-- </form> -->
</div>
</div>
<div id="payment_status_table"></div>
</div>
</div>
<script>
$(document).ready(function() {
var $select_data = '<?php echo $selected_data; ?>';
var dateRangeFilter = $('input.input-daterange-datepicker')
.daterangepicker({
locale: {
format: 'DD/MM/YYYY',
cancelLabel: 'Clear'
},
startDate: $select_data ? moment($select_data.split(' - ')[0], 'DD/MM/YYYY') : moment(),
endDate: $select_data ? moment($select_data.split(' - ')[1], 'DD/MM/YYYY') : moment(),
ranges: {
'Today': [moment(), moment()],
'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'This Month': [moment().startOf('month'), moment().endOf('month')]
}
})
.on('apply.daterangepicker', function(ev, picker) {
var formattedStartDate = picker.startDate.format('DD/MM/YYYY');
var formattedEndDate = picker.endDate.format('DD/MM/YYYY');
var selectedDateRange = formattedStartDate + ' - ' + formattedEndDate;
$(this).val(selectedDateRange);
})
.on('cancel.daterangepicker', function() {
$(this).val('');
});
$('.today-btn').on('click', function() {
var today = moment();
dateRangeFilter.data('daterangepicker').setStartDate(today);
dateRangeFilter.data('daterangepicker').setEndDate(today);
dateRangeFilter.val(today.format('DD/MM/YYYY') + ' - ' + today.format('DD/MM/YYYY'));
dateRangeFilter.trigger('apply.daterangepicker');
});
// Trigger "Today" button click to set it as default if $select_data is empty
if ($select_data === '') {
$('.today-btn').trigger('click');
}
});
</script>
<script>
$(document).ready(function() {
var status = $('#statusSwitch').is(':checked') ? 1 : 0;
var daterange = getPreviousMonthDateRange();
console.log("date range - ", daterange);
getTableData(daterange, status);
})
function submitdateRange() {
event.stopPropagation();
console.log("button clicked");
var status = $('#statusSwitch').is(':checked') ? 1 : 0;
var daterange = $('#daterange').val();
getTableData(daterange, status);
}
$('#statusSwitch').change(function() {
console.log("status is switched");
var status = $('#statusSwitch').is(':checked') ? 1 : 0;
var daterange = $('#daterange').val();
getTableData(daterange, status);
})
function getTableData(daterange, status) {
console.log('Function called:', daterange, status);
var formData = {
dateRange: daterange,
status: status
};
console.log('Form Data:', formData);
$.ajax({
url: "<?= base_url('payment_status') ?>",
method: "POST",
data: formData,
dataType: "json",
success: function(response) {
if (response.status) {
console.log("Response Data:", response.data);
$('#payment_status_table').html(response.html);
setTable();
} else {
console.log("Error: Unexpected response format.");
}
},
error: function(xhr, status, error) {
console.log("AJAX Error:", status, error);
}
});
}
function setTable() {
var table = $('#datatable-buttons').DataTable({
"order": [
[2, 'asc']
],
dom: 'Bfrtip', // 'B' means Buttons
buttons: [],
});
}
function getPreviousMonthDateRange() {
let today = new Date();
let previousMonth = new Date(today);
previousMonth.setMonth(previousMonth.getMonth() - 1);
let formatDate = (date) => {
let day = date.getDate().toString().padStart(2, '0');
let month = (date.getMonth() + 1).toString().padStart(2, '0'); // Months are 0-indexed
let year = date.getFullYear();
return `${day}/${month}/${year}`;
};
return `${formatDate(previousMonth)} - ${formatDate(today)}`;
}
</script>

View File

@ -156,6 +156,7 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
var table = $('#datatable-buttons').DataTable({ var table = $('#datatable-buttons').DataTable({
"order": [[1, 'desc']],
dom: '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip', dom: '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip',
buttons: [ buttons: [
{ {

View File

@ -149,7 +149,7 @@
var table = $('#datatable-buttons').DataTable({ var table = $('#datatable-buttons').DataTable({
"order": [ "order": [
[0, 'desc'] [1, 'desc']
], ],
"dom": '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip', "dom": '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip',
buttons: [{ buttons: [{

View File

@ -69,6 +69,7 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
var table = $('#datatable-buttons').DataTable({ var table = $('#datatable-buttons').DataTable({
"order": [[0, 'desc']],
// "order": [[0, 'desc']], // "order": [[0, 'desc']],
"dom": '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip', "dom": '<"row mb-3"<"col-md-6 d-flex align-items-center"B><"col-md-6 d-flex justify-content-end"f>>rtip',
buttons: [ buttons: [

View File

@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title><?= $browser_title; ?></title> <title><?= $browser_title; ?></title>
@ -25,6 +26,9 @@
<link href="<?= base_url() . "public/assets/libs/clockpicker/bootstrap-clockpicker.min.css" ?>" rel="stylesheet" type="text/css" /> <link href="<?= base_url() . "public/assets/libs/clockpicker/bootstrap-clockpicker.min.css" ?>" rel="stylesheet" type="text/css" />
<link href="<?= base_url() . "public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker.min.css" ?>" rel="stylesheet" type="text/css" /> <link href="<?= base_url() . "public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker.min.css" ?>" rel="stylesheet" type="text/css" />
<link href="<?= base_url() . "public/assets/libs/bootstrap-daterangepicker/daterangepicker.css" ?>" rel="stylesheet" type="text/css"> <link href="<?= base_url() . "public/assets/libs/bootstrap-daterangepicker/daterangepicker.css" ?>" rel="stylesheet" type="text/css">
<link href="https://cdn.jsdelivr.net/gh/gitbrent/bootstrap4-toggle@3.6.1/css/bootstrap4-toggle.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/gh/gitbrent/bootstrap4-toggle@3.6.1/js/bootstrap4-toggle.min.js"></script>">
<!-- third party css end --> <!-- third party css end -->
@ -36,6 +40,7 @@
<link href="<?= base_url() . "public/assets/css/app-dark.min.css" ?>" rel="stylesheet" type="text/css" id="app-dark-stylesheet" /> <link href="<?= base_url() . "public/assets/css/app-dark.min.css" ?>" rel="stylesheet" type="text/css" id="app-dark-stylesheet" />
<!-- icons --> <!-- icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
<link href="<?= base_url() . "public/assets/css/icons.min.css" ?>" rel="stylesheet" type="text/css" /> <link href="<?= base_url() . "public/assets/css/icons.min.css" ?>" rel="stylesheet" type="text/css" />
<link href="<?= base_url() . "public/assets/libs/summernote/summernote-bs4.min.css" ?>" rel="stylesheet" type="text/css" /> <link href="<?= base_url() . "public/assets/libs/summernote/summernote-bs4.min.css" ?>" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
@ -48,18 +53,25 @@
/* Override toastr font color */ /* Override toastr font color */
.toast-warning { .toast-warning {
color: black !important; color: black !important;
background-color: #edd179 !important; /* Set background color to a solid color */ background-color: #edd179 !important;
opacity: 1 !important; /* Set opacity to 1 to remove transparency */ /* Set background color to a solid color */
opacity: 1 !important;
/* Set opacity to 1 to remove transparency */
} }
.toast-success { .toast-success {
color: black !important; color: black !important;
background-color: #2aa762 !important; /* Set background color to a solid color */ background-color: #2aa762 !important;
opacity: 1 !important; /* Set opacity to 1 to remove transparency */ /* Set background color to a solid color */
opacity: 1 !important;
/* Set opacity to 1 to remove transparency */
} }
.icon-large { .icon-large {
font-size: 1.5em; /* Adjust the font size as needed */ font-size: 1.5em;
/* Adjust the font size as needed */
} }
.debug-bar-ndisplay { .debug-bar-ndisplay {
display: none !important; display: none !important;
} }
@ -301,6 +313,13 @@
<?php endif; ?> <?php endif; ?>
<?php if ($loggedin_person_role !== 'manager' && $loggedin_person_role !== 'sadmin') : ?> <?php if ($loggedin_person_role !== 'manager' && $loggedin_person_role !== 'sadmin') : ?>
<li>
<a href="<?= base_url('payment_status') ?>">
<i class="fas fa-hourglass-half"></i>
<span> Payment Status </span>
</a>
</li>
<li> <li>
<a href="#notificationsLayouts" data-toggle="collapse"> <a href="#notificationsLayouts" data-toggle="collapse">
<i class="ri-notification-3-line"></i> <i class="ri-notification-3-line"></i>
@ -352,4 +371,3 @@
<!-- ========== Header-file content-class Start here ========== --> <!-- ========== Header-file content-class Start here ========== -->
<div class="content"> <!-- close div on footer.php --> <div class="content"> <!-- close div on footer.php -->