From e54b3222463cea7a8afdff843431640fa4e48c39 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Mon, 9 Sep 2019 12:47:22 +0800 Subject: [PATCH 01/15] Email Causing excepting due to global variable (Production only impact) --- mooring/emails.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mooring/emails.py b/mooring/emails.py index bb8de6158c..95f5156c44 100644 --- a/mooring/emails.py +++ b/mooring/emails.py @@ -392,6 +392,10 @@ def send_refund_failure_email_admissions(booking, context_processor): to = settings.NON_PROD_EMAIL sendHtmlEmail([to],subject,context,template,cc,bcc,from_email,template_group,attachments=None) else: + pa = Group.objects.get(name='Payments Officers') + ma = Group.objects.get(name="Mooring Admin") + user_list = EmailUser.objects.filter(groups__in=[pa,ma]).distinct() + for u in user_list: to = u.email sendHtmlEmail([to],subject,context,template,cc,bcc,from_email,template_group,attachments=None) @@ -434,6 +438,11 @@ def send_refund_failure_email(booking, context_processor): to = settings.NON_PROD_EMAIL sendHtmlEmail([to],subject,context,template,cc,bcc,from_email,template_group,attachments=None) else: + + pa = Group.objects.get(name='Payments Officers') + ma = Group.objects.get(name="Mooring Admin") + user_list = EmailUser.objects.filter(groups__in=[pa,ma]).distinct() + for u in user_list: to = u.email sendHtmlEmail([to],subject,context,template,cc,bcc,from_email,template_group,attachments=None) From c02d3d6eb03deb60d740ae13d37ddfb65796121a Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Mon, 9 Sep 2019 16:39:42 +0800 Subject: [PATCH 02/15] Production Email Fixes (for refunds) --- mooring/emails.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mooring/emails.py b/mooring/emails.py index 95f5156c44..21481a6d22 100644 --- a/mooring/emails.py +++ b/mooring/emails.py @@ -16,6 +16,9 @@ from confy import env from django.template import Context from ledger.accounts.models import Document +from django.contrib.auth.models import Group +from ledger.accounts.models import EmailUser + import datetime import hashlib From 640b5cf6e89dafd398fbc078512243df55371b51 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Tue, 10 Sep 2019 10:48:04 +0800 Subject: [PATCH 03/15] Removed payment officer from refund emails --- mooring/emails.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mooring/emails.py b/mooring/emails.py index 21481a6d22..05b149e36c 100644 --- a/mooring/emails.py +++ b/mooring/emails.py @@ -397,7 +397,7 @@ def send_refund_failure_email_admissions(booking, context_processor): else: pa = Group.objects.get(name='Payments Officers') ma = Group.objects.get(name="Mooring Admin") - user_list = EmailUser.objects.filter(groups__in=[pa,ma]).distinct() + user_list = EmailUser.objects.filter(groups__in=[ma,]).distinct() for u in user_list: to = u.email @@ -444,7 +444,7 @@ def send_refund_failure_email(booking, context_processor): pa = Group.objects.get(name='Payments Officers') ma = Group.objects.get(name="Mooring Admin") - user_list = EmailUser.objects.filter(groups__in=[pa,ma]).distinct() + user_list = EmailUser.objects.filter(groups__in=[ma,]).distinct() for u in user_list: to = u.email @@ -500,7 +500,7 @@ def send_refund_failure_email_old(booking): pa = Group.objects.get(name='Payments Officers') ma = Group.objects.get(name="Mooring Admin") - user_list = EmailUser.objects.filter(groups__in=[pa,ma]).distinct() + user_list = EmailUser.objects.filter(groups__in=[ma,]).distinct() ### REMOVE ### for u in user_list: From 53704d49fdaacd8359a06b2d89628024f1f3240c Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Mon, 16 Sep 2019 10:31:18 +0800 Subject: [PATCH 04/15] Remove mooring from invoice pdf reservation title --- mooring/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mooring/views.py b/mooring/views.py index b3d8fe5def..3215de912a 100644 --- a/mooring/views.py +++ b/mooring/views.py @@ -1272,11 +1272,11 @@ def post(self, request, *args, **kwargs): to_dt = local_dt.replace(microsecond=booking.departure.microsecond) to_date_converted = to_dt.date() # generate invoice - reservation = u"Reservation for {} from {} to {} at {}".format( + reservation = u"Reservation for {} from {} to {} ".format( u'{} {}'.format(booking.customer.first_name, booking.customer.last_name), from_date_converted, to_date_converted, - booking.mooringarea.name + #booking.mooringarea.name ) logger.info('{} built booking {} and handing over to payment gateway'.format('User {} with id {}'.format(booking.customer.get_full_name(),booking.customer.id) if booking.customer else 'An anonymous user',booking.id)) From 29eca84af27e8524b123cebaeba2158b6c958b77 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Mon, 16 Sep 2019 12:05:20 +0800 Subject: [PATCH 05/15] Permssion fix on change booking --- mooring/api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mooring/api.py b/mooring/api.py index f3849b2da9..51b0ed9c71 100644 --- a/mooring/api.py +++ b/mooring/api.py @@ -1920,6 +1920,8 @@ def retrieve(self, request, pk=None, ratis_id=None, format=None, show_all=False) # compare old and new booking for changes if hashlib.md5(str(current_booking_obj)).hexdigest() == hashlib.md5(str(old_booking_obj)).hexdigest(): booking_changed = False + if utils.check_mooring_admin_access(request) is True: + booking_changed = True availability = utils.get_campsite_availability(sites_qs, start_date, end_date, ongoing_booking, request) From d1d04d531cdf4eaee224d27e1f84afc93c5ab453 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Tue, 17 Sep 2019 10:17:12 +0800 Subject: [PATCH 06/15] Remove mooring name from booking success --- mooring/templates/mooring/booking/booking_view.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mooring/templates/mooring/booking/booking_view.html b/mooring/templates/mooring/booking/booking_view.html index 7619006591..0aeb6f5435 100644 --- a/mooring/templates/mooring/booking/booking_view.html +++ b/mooring/templates/mooring/booking/booking_view.html @@ -1,5 +1,5 @@
-
+
@@ -9,7 +9,7 @@

{{ booking.mooringarea.name }}, {{ booking.mooringarea. {% endif %}

-
+
From 7d827b821fd2f58f4eacd48f362db5f9f0d0113f Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Tue, 17 Sep 2019 13:03:07 +0800 Subject: [PATCH 09/15] Fix grammer --- mooring/templates/mooring/booking/success.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mooring/templates/mooring/booking/success.html b/mooring/templates/mooring/booking/success.html index 5e3febb321..21ca8b8642 100644 --- a/mooring/templates/mooring/booking/success.html +++ b/mooring/templates/mooring/booking/success.html @@ -7,7 +7,7 @@

Success!

A confirmation email has been sent to {{ booking.customer.email }}.

-

For any refund details please refer to the email send to {{ booking.customer.email }}.

+

For any refund details please refer to the email sent to {{ booking.customer.email }}.

 

Please click here if you want to make another booking.

From c8e6b72f637723e1e8a829bb6b31028a2e542d80 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 13:53:46 +0800 Subject: [PATCH 10/15] Add system, amount, created to invoice ledger admin.py --- ledger/payments/admin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ledger/payments/admin.py b/ledger/payments/admin.py index f668fbba8d..f8f8c61835 100755 --- a/ledger/payments/admin.py +++ b/ledger/payments/admin.py @@ -24,9 +24,10 @@ class CashAdmin(admin.ModelAdmin): @admin.register(models.Invoice) class InvoiceAdmin(admin.ModelAdmin): - list_display = ('reference','order','payment_status','settlement_date') + list_display = ('reference','order','payment_status','settlement_date','amount', 'system','created' ) search_fields = ('reference',) - + list_filter = ('system'), + @admin.register(models.InvoiceBPAY) class InvoiceBpayAdmin(admin.ModelAdmin): pass From 9d6c962d100a26087728f3a4abc5339a221bf87c Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 14:02:36 +0800 Subject: [PATCH 11/15] Oracle Refund & Booking Refund change fix for Price Override --- mooring/api.py | 60 ++++++++++++++++++++++++++++++++++++++++-------- mooring/utils.py | 2 +- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/mooring/api.py b/mooring/api.py index fd275f1418..83decf0945 100644 --- a/mooring/api.py +++ b/mooring/api.py @@ -37,7 +37,8 @@ from mooring import utils from mooring.helpers import can_view_campground, is_inventory, is_admin, is_payment_officer from datetime import datetime,timedelta, date -from decimal import Decimal +from decimal import Decimal +from ledger.payments.utils import systemid_check, update_payments from mooring.context_processors import mooring_url, template_context from mooring.models import (MooringArea, District, @@ -4409,36 +4410,75 @@ def post(self, request, *args, **kwargs): money_from_json = json.loads(money_from) money_to_json = json.loads(money_to) bpoint_trans_split_json = json.loads(bpoint_trans_split) - lines = [] failed_refund = False json_obj = {'found': False, 'code': money_from, 'money_to': money_to, 'failed_refund': failed_refund} - - for mf in money_from_json: - if Decimal(mf['line-amount']) > 0: - money_from_total = (Decimal(mf['line-amount']) - Decimal(mf['line-amount']) - Decimal(mf['line-amount'])) - lines.append({'ledger_description':str(mf['line-text']),"quantity":1,"price_incl_tax":money_from_total,"oracle_code":str(mf['oracle-code']), 'line_status': 3}) - + + lines = [] if int(refund_method) == 1: + lines = [] + for mf in money_from_json: + if Decimal(mf['line-amount']) > 0: + money_from_total = (Decimal(mf['line-amount']) - Decimal(mf['line-amount']) - Decimal(mf['line-amount'])) + lines.append({'ledger_description':str(mf['line-text']),"quantity":1,"price_incl_tax":money_from_total,"oracle_code":str(mf['oracle-code']), 'line_status': 3}) + + for bp_txn in bpoint_trans_split_json: + bpoint_id = BpointTransaction.objects.get(txn_number=bp_txn['txn_number']) + info = {'amount': Decimal('{:.2f}'.format(float(bp_txn['line-amount']))), 'details' : 'Refund via system'} + if info['amount'] > 0: + lines.append({'ledger_description':str("Temp fund transfer "+bp_txn['txn_number']),"quantity":1,"price_incl_tax":Decimal('{:.2f}'.format(float(bp_txn['line-amount']))),"oracle_code":str(settings.UNALLOCATED_ORACLE_CODE), 'line_status': 1}) + + + order = utils.allocate_refund_to_invoice(request, booking, lines, invoice_text=None, internal=False, order_total='0.00',user=booking.customer) + new_invoice = Invoice.objects.get(order_number=order.number) + update_payments(new_invoice.reference) + #order = utils.allocate_refund_to_invoice(request, booking, lines, invoice_text=None, internal=False, order_total='0.00',user=booking.customer) + #new_order = Order.objects.get(basket=basket) + #new_invoice = Invoice.objects.get(order_number=order.number) + for bp_txn in bpoint_trans_split_json: bpoint_id = BpointTransaction.objects.get(txn_number=bp_txn['txn_number']) info = {'amount': Decimal('{:.2f}'.format(float(bp_txn['line-amount']))), 'details' : 'Refund via system'} refund = None + lines = [] if info['amount'] > 0: + lines = [] + #lines.append({'ledger_description':str("Temp fund transfer "+bp_txn['txn_number']),"quantity":1,"price_incl_tax":Decimal('{:.2f}'.format(float(bp_txn['line-amount']))),"oracle_code":str(settings.UNALLOCATED_ORACLE_CODE), 'line_status': 1}) + + try: + + bpoint_money_to = (Decimal('{:.2f}'.format(float(bp_txn['line-amount']))) - Decimal('{:.2f}'.format(float(bp_txn['line-amount']))) - Decimal('{:.2f}'.format(float(bp_txn['line-amount'])))) + lines.append({'ledger_description':str("Payment Gateway Refund to "+bp_txn['txn_number']),"quantity":1,"price_incl_tax": bpoint_money_to,"oracle_code":str(settings.UNALLOCATED_ORACLE_CODE), 'line_status': 3}) bpoint = BpointTransaction.objects.get(txn_number=bp_txn['txn_number']) refund = bpoint.refund(info,request.user) except: failed_refund = True bpoint_failed_amount = Decimal(bp_txn['line-amount']) + lines = [] lines.append({'ledger_description':str("Refund failed for txn "+bp_txn['txn_number']),"quantity":1,"price_incl_tax":bpoint_failed_amount,"oracle_code":str(settings.UNALLOCATED_ORACLE_CODE), 'line_status': 1}) + order = utils.allocate_refund_to_invoice(request, booking, lines, invoice_text=None, internal=False, order_total='0.00',user=booking.customer) + new_invoice = Invoice.objects.get(order_number=order.number) + bpoint_refund = BpointTransaction.objects.get(txn_number=refund) + bpoint_refund.crn1 = new_invoice.reference + bpoint_refund.save() + update_payments(new_invoice.reference) else: + lines = [] + for mf in money_from_json: + if Decimal(mf['line-amount']) > 0: + money_from_total = (Decimal(mf['line-amount']) - Decimal(mf['line-amount']) - Decimal(mf['line-amount'])) + lines.append({'ledger_description':str(mf['line-text']),"quantity":1,"price_incl_tax":money_from_total,"oracle_code":str(mf['oracle-code']), 'line_status': 3}) + + for mt in money_to_json: lines.append({'ledger_description':mt['line-text'],"quantity":1,"price_incl_tax":mt['line-amount'],"oracle_code":mt['oracle-code'], 'line_status': 1}) - - utils.allocate_refund_to_invoice(request, booking, lines, invoice_text=None, internal=False, order_total='0.00',user=booking.customer) + order = utils.allocate_refund_to_invoice(request, booking, lines, invoice_text=None, internal=False, order_total='0.00',user=booking.customer) + new_invoice = Invoice.objects.get(order_number=order.number) + update_payments(new_invoice.reference) + json_obj['failed_refund'] = failed_refund return Response(json_obj) diff --git a/mooring/utils.py b/mooring/utils.py index 96b9f49a8a..e85ecaad8d 100644 --- a/mooring/utils.py +++ b/mooring/utils.py @@ -1005,7 +1005,7 @@ def calculate_price_booking_change(old_booking, new_booking,overide_change_fees= adjustment_fee = float(ob.amount) + adjustment_fee description = 'Mooring {} ({} - {})'.format(ob.campsite.mooringarea.name,ob.from_dt.astimezone(pytimezone('Australia/Perth')).strftime('%d/%m/%Y %H:%M %p'),ob.to_dt.astimezone(pytimezone('Australia/Perth')).strftime('%d/%m/%Y %H:%M %p')) # change_fees.append({'additional_fees': 'true', 'description': 'Adjustment - '+description ,'amount': str(adjustment_fee - adjustment_fee - adjustment_fee), 'oracle_code': str(ob.campsite.mooringarea.oracle_code), 'mooring_group': mooring_group}) - change_fees.append({'additional_fees': 'true', 'description': 'Adjustment - '+description ,'amount': str(format(adjustment_fee - adjustment_fee - adjustment_fee, '.2f')), 'oracle_code': str(ob.campsite.mooringarea.oracle_code), 'mooring_group': mooring_group, 'line_status': 2}) + change_fees.append({'additional_fees': 'true', 'description': 'Adjustment - '+description ,'amount': str(format(adjustment_fee - adjustment_fee - adjustment_fee, '.2f')), 'oracle_code': str(ob.campsite.mooringarea.oracle_code), 'mooring_group': mooring_group, 'line_status': 3}) return change_fees From 8bbaddb5863d24eb1188c599e237bd5950e29a36 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 14:37:03 +0800 Subject: [PATCH 12/15] fix settlement report from created to settlement_date column --- mooring/reports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mooring/reports.py b/mooring/reports.py index ab3e745227..f50bea4211 100644 --- a/mooring/reports.py +++ b/mooring/reports.py @@ -137,7 +137,7 @@ def booking_refunds(start,end): def booking_bpoint_settlement_report(_date): try: bpoint, cash = [], [] - bpoint.extend([x for x in BpointTransaction.objects.filter(created__date=_date,response_code=0,crn1__startswith='0516').exclude(crn1__endswith='_test')]) + bpoint.extend([x for x in BpointTransaction.objects.filter(settlement_date=_date,response_code=0,crn1__startswith='0516').exclude(crn1__endswith='_test')]) cash = CashTransaction.objects.filter(created__date=_date,invoice__reference__startswith='0516').exclude(type__in=['move_out','move_in']) strIO = StringIO() From 31ff18f6f8f3676ff63e7d1c3c71591a4b025a4d Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 14:45:28 +0800 Subject: [PATCH 13/15] Allow ability to search order number and email under adminui on order --- ledger/order/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/order/admin.py b/ledger/order/admin.py index 7a99e5f7ca..6a3b757b48 100755 --- a/ledger/order/admin.py +++ b/ledger/order/admin.py @@ -12,5 +12,5 @@ class OrderAdmin(OrderAdmin): readonly_fields = ('number', 'total_incl_tax', 'total_excl_tax', 'shipping_incl_tax', 'shipping_excl_tax',) inlines = [LineInline] - + search_fields = ('number','user__email',) admin.site.register(Order, OrderAdmin) From 8eb7ef273b0f20dbdc85e51a2085b3832512a731 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 15:02:38 +0800 Subject: [PATCH 14/15] Increase fields data limit --- mooring/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mooring/settings.py b/mooring/settings.py index 1422bbde55..913a701e74 100755 --- a/mooring/settings.py +++ b/mooring/settings.py @@ -124,5 +124,5 @@ os.environ['UPDATE_PAYMENT_ALLOCATION'] = 'True' UNALLOCATED_ORACLE_CODE = 'NNP449 GST' - +DATA_UPLOAD_MAX_NUMBER_FIELDS = 10240 #os.environ.setdefault("UPDATE_PAYMENT_ALLOCATION", True) From a4bafbc24eb59acc1e7c34022699864ed5cb5e96 Mon Sep 17 00:00:00 2001 From: "jason.moore@dbca.wa.gov.au" Date: Wed, 18 Sep 2019 15:10:09 +0800 Subject: [PATCH 15/15] Allow search on Oracle interface --- ledger/payments/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/payments/admin.py b/ledger/payments/admin.py index f8f8c61835..412f5b594d 100755 --- a/ledger/payments/admin.py +++ b/ledger/payments/admin.py @@ -114,7 +114,7 @@ class OracleParserAdmin(admin.ModelAdmin): @admin.register(models.OracleInterface) class OracleInterfaceAdmin(admin.ModelAdmin): list_display = ['activity_name','amount','status','receipt_number','receipt_date','source','method'] - + search_fields = ('source','receipt_number') class OracleInterfaceRecipientInline(admin.TabularInline): model = models.OracleInterfaceRecipient extra = 1