diff --git a/erpnext/venue/doctype/booking_credit/booking_credit.py b/erpnext/venue/doctype/booking_credit/booking_credit.py index a628e5c64e3e219732b895020dc88aaa4cfed428..44439277d09c9e4ad62d6668d0a66a855530a822 100644 --- a/erpnext/venue/doctype/booking_credit/booking_credit.py +++ b/erpnext/venue/doctype/booking_credit/booking_credit.py @@ -4,7 +4,7 @@ from collections import defaultdict import frappe -from frappe.utils import add_to_date, cint, flt, get_datetime, getdate, now_datetime, nowdate +from frappe.utils import add_to_date, cint, flt, get_datetime, getdate, now_datetime, nowdate, add_days from erpnext.controllers.status_updater import StatusUpdater from erpnext.venue.doctype.booking_credit_ledger.booking_credit_ledger import create_ledger_entry @@ -148,11 +148,16 @@ def _add_booking_credits(doc): def automatic_booking_credit_allocation(subscription): for rule in subscription.booking_credits_allocation: - if last_generated_credit := get_last_credit_for_customer( + last_generated_credit = get_last_credit_for_customer( subscription.customer, rule.booking_credit_type, subscription=subscription.name - ): - if not are_subscription_credits_due(last_generated_credit[0].date, rule, subscription): - continue + ) + + if last_generated_credit and last_generated_credit[0].date == getdate(nowdate()): + return + + previous_date = last_generated_credit[0].date if last_generated_credit else None + if not are_subscription_credits_due(rule, subscription, previous_date=previous_date): + continue booking_credit = frappe.get_doc( { @@ -161,7 +166,7 @@ def automatic_booking_credit_allocation(subscription): "customer": subscription.customer, "quantity": cint(rule.quantity), "subscription": subscription.name, - "expiration": rule.expiration, + "expiration_date": add_days(nowdate(), rule.expiration), "booking_credit_type": rule.booking_credit_type, } ) @@ -170,14 +175,17 @@ def automatic_booking_credit_allocation(subscription): booking_credit.submit() -def are_subscription_credits_due(date, rule, subscription): +def are_subscription_credits_due(rule, subscription, previous_date=None): from dateutil import rrule + if not previous_date: + return True + if rule.recurrence == "Once": return False if rule.recurrence == "Every Billing Period": - if getdate(date) != getdate() and getdate() == getdate(subscription.current_invoice_start): + if getdate(previous_date) != getdate() and getdate() == getdate(subscription.current_invoice_start): return True return False @@ -205,12 +213,14 @@ def are_subscription_credits_due(date, rule, subscription): ) ] - if getdate(date) != getdate() and getdate() in possible_dates: + if getdate(previous_date) != getdate() and getdate() in possible_dates: return True + return False + def get_last_credit_for_customer(customer, booking_credit_type, subscription): - filters = {"customer": customer, "booking_credit_type": booking_credit_type, "docstatus": 1} + filters = {"customer": customer, "booking_credit_type": booking_credit_type, "docstatus": 1, "subscription": subscription} return frappe.get_all( "Booking Credit", filters=filters, fields=["name", "date"], order_by="date DESC", limit=1