From 1db205f5a737266b4d5caf8da3516e8a8fe562be Mon Sep 17 00:00:00 2001 From: Jason Moore Date: Wed, 28 Feb 2024 18:55:24 +0800 Subject: [PATCH 1/2] Add Payment Totals UI in frontend (moved from django UI) --- ledger/payments/api.py | 50 ++++++- ledger/payments/models.py | 1 + .../static/payments/js/ledger_payments.js | 134 +++++++++++++++++- ledger/payments/urls.py | 7 +- ledger/payments/utils.py | 4 +- ledger/payments/views.py | 25 ++++ 6 files changed, 211 insertions(+), 10 deletions(-) diff --git a/ledger/payments/api.py b/ledger/payments/api.py index c10367fb2..73c9515a3 100755 --- a/ledger/payments/api.py +++ b/ledger/payments/api.py @@ -17,7 +17,7 @@ from ledger.payments.invoice.models import Invoice, InvoiceBPAY from ledger.payments.bpoint.models import BpointTransaction, BpointToken from ledger.payments.cash.models import CashTransaction, Region, District, DISTRICT_CHOICES, REGION_CHOICES -from ledger.payments.models import TrackRefund, LinkedInvoice, OracleAccountCode, RefundFailed, OracleInterfaceSystem +from ledger.payments.models import TrackRefund, LinkedInvoice, OracleAccountCode, RefundFailed, OracleInterfaceSystem, PaymentTotal from ledger.payments.utils import systemid_check, update_payments, ledger_payment_invoice_calulations from ledger.payments.invoice import utils as invoice_utils from ledger.payments.facade import bpoint_facade @@ -1102,6 +1102,52 @@ def FailedTransactionCompleted(request, *args, **kwargs): return HttpResponse(json.dumps({'status': 500, 'message': 'error'}), content_type='application/json', status=500) raise +def PaymentTotals(request, *args, **kwargs): + if helpers.is_payment_admin(request.user) is True: + try: + query = Q() + pagestart = int(request.GET.get('pagestart',0)) + pageend = int(request.GET.get('pageend',10)) + status = request.GET.get('status','') + system = request.GET.get('system','') + settlement_date = request.GET.get('settlement_date','') + + # if len(status) > 0: + # query &= Q(status=status) + # if len(system) > 0: + # query &= Q(system_identifier__system_id=system) + if len(settlement_date) > 0: + + settlement_date_django = datetime.strptime(settlement_date, "%d/%m/%Y") + query &= Q(settlement_date=settlement_date_django) + + rf_array = {'status': 404, 'data': {'rows': [], 'totalrows': 0}} + rf = PaymentTotal.objects.filter(query)[pagestart:pageend] + rf_array['data']['totalrows'] = PaymentTotal.objects.filter(query).count() + + for r in rf: + row = {} + row['id'] = r.id + row['oracle_system_id'] = r.oracle_system_id + row['oracle_system_id_code'] = r.oracle_system.system_id + row['settlement_date'] = r.settlement_date.strftime('%d %b %Y') + row['bpoint_gateway_total'] = str(r.bpoint_gateway_total) + row['ledger_bpoint_total'] = str(r.ledger_bpoint_total) + row['oracle_parser_total'] = str(r.oracle_parser_total) + row['oracle_receipt_total'] = str(r.oracle_receipt_total) + row['cash_total'] = str(r.cash_total) + row['bpay_total'] = str(r.bpay_total) + discrepancy_status = False + if r.bpoint_gateway_total != r.oracle_receipt_total: + discrepancy_status = True + row['discrepancy'] = discrepancy_status + row['updated'] = r.updated.strftime('%d/%m/%Y %H:%M:%S') + rf_array['data']['rows'].append(row) + return HttpResponse(json.dumps(rf_array), content_type='application/json') + except Exception as e: + print(traceback.print_exc()) + raise + def FailedTransactions(request, *args, **kwargs): if helpers.is_payment_admin(request.user) is True: try: @@ -1118,7 +1164,7 @@ def FailedTransactions(request, *args, **kwargs): query &= Q(system_identifier__system_id=system) if len(keyword) > 0: query &= Q(Q(booking_reference=keyword) | Q(invoice_reference=keyword)) - print (query) + rf_array = {'status': 404, 'data': {'rows': [], 'totalrows': 0}} rf = RefundFailed.objects.filter(query)[pagestart:pageend] rf_array['data']['totalrows'] = RefundFailed.objects.filter(query).count() diff --git a/ledger/payments/models.py b/ledger/payments/models.py index 4ac604d42..d518c65ea 100755 --- a/ledger/payments/models.py +++ b/ledger/payments/models.py @@ -116,6 +116,7 @@ class OracleInterfacePermission(models.Model): ('all_access', 'Full access to all Financial Tools'), ('view_ledger_tools', 'View Ledger Payment Tools'), ('manage_ledger_tool', 'Manage Ledger Payment Tools'), + ('view_payment_totals', 'View Payment Totals'), ) system = models.ForeignKey(OracleInterfaceSystem,related_name='oracle_interface_permission_recipients') diff --git a/ledger/payments/static/payments/js/ledger_payments.js b/ledger/payments/static/payments/js/ledger_payments.js index b29a14aab..1191a941c 100644 --- a/ledger/payments/static/payments/js/ledger_payments.js +++ b/ledger/payments/static/payments/js/ledger_payments.js @@ -7,12 +7,18 @@ var ledger_payments = { 'csrf_token': '', 'payment_info_url' : '/ledger/payments/api/ledger/payments-info', 'failed_transaction_url' : '/ledger/payments/api/ledger/failed-transactions', + 'payment_total_url' : '/ledger/payments/api/ledger/payment-totals', 'payment_info': [], 'pagestart': 0, 'pageend': 10, - 'formoptions': {'frstatus': '', 'frsystem':'','frkeyword': '' }, + 'formoptions': {'frstatus': '', 'frsystem':'','frkeyword': '' , 'ptsystem':'','ptkeyword': '','ptsettlement_date': ''}, 'selected_id': null, - 'system_interface_permssions' : {} + 'system_interface_permssions' : {}, + 'ptdatepickerOptions':{ + format: 'DD/MM/YYYY', + showClear:true, + useCurrent:false + }, }, load_payment_info: function() { @@ -119,6 +125,11 @@ var ledger_payments = { ledger_payments.var.pageend = pageend; ledger_payments.load_failed_transactions(); }, + update_page_payment_totals: function(pagestart,pageend) { + ledger_payments.var.pagestart = pagestart; + ledger_payments.var.pageend = pageend; + ledger_payments.load_payment_totals(); + }, update_failed_transaction_status: function(selected_id) { ledger_payments.var.selected_id = selected_id; $('#ConfirmAction').modal('show'); @@ -142,9 +153,9 @@ var ledger_payments = { ledger_payments.var.formoptions.frsystem = $("#fr-system").val(); - $("#fr-keyword").change(function() { - ledger_payments.var.formoptions.frkeyword =this.value; - console.log(ledger_payments.var.formoptions.frkeyword); + $("#settlement_report").change(function() { + alert(this.value); + ledger_payments.var.formoptions.ptsettlement_date =this.value; }); ledger_payments.var.formoptions.frkeyword = $("#fr-keyword").val(); @@ -163,6 +174,119 @@ var ledger_payments = { // system_interface_permssions ledger_payments.load_failed_transactions(); }, + init_payment_totals: function() { + + $('#settlementDatePicker').datetimepicker(ledger_payments.var.ptdatepickerOptions); + $("#pt-status").change(function() { + ledger_payments.var.formoptions.frstatus =this.value; + console.log(ledger_payments.var.formoptions.frstatus); + }); + + // ledger_payments.var.formoptions.frstatus = $("#pt-status").val(); + + $("#pt-system").change(function() { + ledger_payments.var.formoptions.frsystem =this.value; + console.log(ledger_payments.var.formoptions.frsystem); + }); + + ledger_payments.var.formoptions.frsystem = $("#pt-system").val(); + + $("#pt-keyword").change(function() { + ledger_payments.var.formoptions.ptkeyword =this.value; + console.log(ledger_payments.var.formoptions.ptkeyword); + }); + + ledger_payments.var.formoptions.frkeyword = $("#pt-keyword").val(); + + $("#pt-filter").click(function() { + ledger_payments.load_payment_totals(); + }); + + var system_interface_permssions = $('#system_interface_permssions').val(); + system_interface_permssions_obj = JSON.parse(system_interface_permssions); + + ledger_payments.system_interface_permssions = system_interface_permssions_obj + // system_interface_permssions + ledger_payments.load_payment_totals(); + }, + load_payment_totals: function() { + var settlement_report = $("#settlement_report").val(); + data = {} + $.ajax({ + url: ledger_payments.var.payment_total_url+"?pagestart="+ledger_payments.var.pagestart+"&pageend="+ledger_payments.var.pageend+"&system="+ledger_payments.var.formoptions.frsystem+"&settlement_date="+settlement_report, + method: "GET", + //headers: {'X-CSRFToken' : ledger_payments.var.csrf_token}, + //data: JSON.stringify({'payload': data,}), + contentType: "application/json", + success: function(data) { + var html = ""; + if (data.data.rows.length > 0) { + for (let i = 0; i < data.data.rows.length; i++) { + html+= ""; + html+= ""+data.data.rows[i]['oracle_system_id_code']+""; + html+= ""+data.data.rows[i]['settlement_date']+""; + html+= ""+data.data.rows[i]['bpoint_gateway_total']+""; + html+= ""+data.data.rows[i]['ledger_bpoint_total']+""; + html+= ""+data.data.rows[i]['oracle_parser_total']+""; + html+= ""+data.data.rows[i]['oracle_receipt_total']+""; + html+= ""+data.data.rows[i]['cash_total']+""; + html+= ""+data.data.rows[i]['bpay_total']+""; + html+= ""; + if (data.data.rows[i]['discrepancy'] == false) { + html+= ''; + } else { + html+= ''; + } + ""; + html+= ""+data.data.rows[i]['updated']+""; + html+= ""; + } + } + + $('#payment-totals-table tbody').html(html); + + var pageiterate = data.data.totalrows / 10; + var totalpages = parseInt(pageiterate); + + if (pageiterate > parseInt(pageiterate)) { + totalpages = parseInt(pageiterate) + 1; + } + + var pages = ""; + pages+=''; + + $('#pages').html(pages); + }, + error: function(errMsg) { + $('#LoadingPopup').modal('hide'); + } + }); + }, + + save_failed_transaction: function(rfid) { $("#LoadingPopup").modal('show'); $('#ConfirmAction').modal('hide'); diff --git a/ledger/payments/urls.py b/ledger/payments/urls.py index ecd70dae4..23bd2e8e9 100755 --- a/ledger/payments/urls.py +++ b/ledger/payments/urls.py @@ -15,7 +15,8 @@ CheckOracleCodeView, RefundOracleView, FailedTransactions, - FailedTransactionCompleted + FailedTransactionCompleted, + PaymentTotals ) from ledger.payments.bpay.dashboard.app import application as bpay @@ -39,6 +40,7 @@ url(r'api/ledger/oracle-codes-lookup$', CheckOracleCodeView, name='ledger-oracle-codes'), url(r'api/ledger/oracle-payment-transfer$', RefundOracleView, name='ledger-oracle-refunds'), url(r'api/ledger/failed-transactions$', FailedTransactions, name='failed-transactions'), + url(r'api/ledger/payment-totals$', PaymentTotals, name='payment-totals'), url(r'api/ledger/failed-transaction-complete/(?P\d+)/$', FailedTransactionCompleted, name='failed-transaction-completed'), url(r'api/report-allocated$', ReportCreateAllocatedView.as_view(),name='ledger-report-allocated'), url(r'api/report$', ReportCreateView.as_view(),name='ledger-report'), @@ -63,5 +65,6 @@ url(r'payments/oracle/payments$', views.OraclePayments.as_view(), name='oracle-payments'), url(r'payments/error$',views.PaymentErrorView.as_view(), name='payments-error'), - url(r'payments/oracle/failed-transactions$', views.FailedTransaction.as_view(), name='failed-transactions') + url(r'payments/oracle/failed-transactions$', views.FailedTransaction.as_view(), name='failed-transactions'), + url(r'payments/oracle/payment-totals$', views.PaymentTotals.as_view(), name='failed-transactions') ] diff --git a/ledger/payments/utils.py b/ledger/payments/utils.py index 261494947..bcbc57e4c 100755 --- a/ledger/payments/utils.py +++ b/ledger/payments/utils.py @@ -1159,6 +1159,7 @@ def get_oracle_interface_system_permissions(system_id, email): 'all_access': False, 'view_ledger_tools' : False, 'manage_ledger_tool' : False, + 'view_payment_totals' : False, } ois = OracleInterfaceSystem.objects.filter(system_id=system_id) @@ -1171,7 +1172,8 @@ def get_oracle_interface_system_permissions(system_id, email): system_interface_permssions['view_ledger_tools'] = True if oisp.access_type == 'manage_ledger_tool': system_interface_permssions['manage_ledger_tool'] = True - + if oisp.access_type == 'view_payment_totals': + system_interface_permssions['view_payment_totals'] = True return system_interface_permssions diff --git a/ledger/payments/views.py b/ledger/payments/views.py index a4cb1f523..321ab9746 100755 --- a/ledger/payments/views.py +++ b/ledger/payments/views.py @@ -421,6 +421,31 @@ def get(self, request, *args, **kwargs): basket = basket_models.Basket.objects.get(id=basket_hash_split[0]) return render(request, self.template_name, {'basket': basket}) +class PaymentTotals(generic.TemplateView): + template_name = 'dpaw_payments/payment_totals.html' + + def get_context_data(self, **kwargs): + ctx = super(PaymentTotals,self).get_context_data(**kwargs) + if helpers.is_payment_admin(self.request.user) is True: + system_id = self.request.GET.get('system_id','') + ois = payments_models.OracleInterfaceSystem.objects.filter(system_id=system_id) + ois_found = False + ois_permissions = [] + if ois.count() > 0: + ois_found = True + isp = payments_utils.get_oracle_interface_system_permissions(system_id,self.request.user.email) + + ctx['oracle_systems'] = payments_models.OracleInterfaceSystem.objects.all() + ctx['system_id'] = system_id + + ctx['system_interface_permssions'] = isp + ctx['system_interface_permssions_json'] = json.dumps(isp) + ctx['ois_found'] = ois_found + + else: + self.template_name = 'dpaw_payments/forbidden.html' + return ctx + class FailedTransaction(generic.TemplateView): template_name = 'dpaw_payments/failed_transaction.html' From 25a3321eaba0c3fc3ac4be46f8662c1c349cd519 Mon Sep 17 00:00:00 2001 From: Jason Moore Date: Wed, 28 Feb 2024 18:56:45 +0800 Subject: [PATCH 2/2] Add missing migration --- .../migrations/0033_auto_20240228_1852.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ledger/payments/migrations/0033_auto_20240228_1852.py diff --git a/ledger/payments/migrations/0033_auto_20240228_1852.py b/ledger/payments/migrations/0033_auto_20240228_1852.py new file mode 100644 index 000000000..a7dee34d6 --- /dev/null +++ b/ledger/payments/migrations/0033_auto_20240228_1852.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2024-02-28 10:52 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payments', '0032_auto_20240228_1235'), + ] + + operations = [ + migrations.AlterField( + model_name='oracleinterfacepermission', + name='access_type', + field=models.CharField(blank=True, choices=[('all_access', 'Full access to all Financial Tools'), ('view_ledger_tools', 'View Ledger Payment Tools'), ('manage_ledger_tool', 'Manage Ledger Payment Tools'), ('view_payment_totals', 'View Payment Totals')], default=None, max_length=100, null=True), + ), + ]