def on_recurring(self, reference_doc, subscription_doc): self.set("delivery_date", get_next_schedule_date(reference_doc.delivery_date, subscription_doc.frequency, cint(subscription_doc.repeat_on_day))) for d in self.get("items"): reference_delivery_date = frappe.db.get_value("Sales Order Item", {"parent": reference_doc.name, "item_code": d.item_code, "idx": d.idx}, "delivery_date") d.set("delivery_date", get_next_schedule_date(reference_delivery_date, subscription_doc.frequency, cint(subscription_doc.repeat_on_day)))
def execute(): frappe.reload_doctype('Subscription') doctypes = ('Purchase Order', 'Sales Order', 'Purchase Invoice', 'Sales Invoice') for data in frappe.get_all('Subscription', fields=[ "name", "reference_doctype", "reference_document", "start_date", "frequency", "repeat_on_day" ], filters={ 'reference_doctype': ('in', doctypes), 'docstatus': 1 }): recurring_id = frappe.db.get_value(data.reference_doctype, data.reference_document, "recurring_id") if recurring_id: frappe.db.sql( "update `tab{0}` set subscription=%s where recurring_id=%s". format(data.reference_doctype), (data.name, recurring_id)) date_field = 'transaction_date' if data.reference_doctype in ['Sales Invoice', 'Purchase Invoice']: date_field = 'posting_date' start_date = frappe.db.get_value(data.reference_doctype, data.reference_document, date_field) if start_date and getdate(start_date) != getdate(data.start_date): last_ref_date = frappe.db.sql( """ select {0} from `tab{1}` where subscription=%s and docstatus < 2 order by creation desc limit 1 """.format(date_field, data.reference_doctype), data.name)[0][0] next_schedule_date = get_next_schedule_date( last_ref_date, data.frequency, data.repeat_on_day) frappe.db.set_value("Subscription", data.name, { "start_date": start_date, "next_schedule_date": next_schedule_date }, None)