def on_recurring(self, reference_doc, auto_repeat_doc): self.set("delivery_date", get_next_schedule_date(reference_doc.delivery_date, auto_repeat_doc.frequency, cint(auto_repeat_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, auto_repeat_doc.frequency, cint(auto_repeat_doc.repeat_on_day)))
def _get_delivery_date(ref_doc_delivery_date, red_doc_transaction_date, transaction_date): delivery_date = get_next_schedule_date(ref_doc_delivery_date, auto_repeat_doc.frequency, cint(auto_repeat_doc.repeat_on_day)) if delivery_date <= transaction_date: delivery_date_diff = frappe.utils.date_diff(ref_doc_delivery_date, red_doc_transaction_date) delivery_date = frappe.utils.add_days(transaction_date, delivery_date_diff) return delivery_date
def _get_delivery_date(ref_doc_delivery_date, red_doc_transaction_date, transaction_date): delivery_date = get_next_schedule_date(ref_doc_delivery_date, auto_repeat_doc.frequency, cint(auto_repeat_doc.repeat_on_day)) if delivery_date <= transaction_date: delivery_date_diff = frappe.utils.date_diff(ref_doc_delivery_date, red_doc_transaction_date) delivery_date = frappe.utils.add_days(transaction_date, delivery_date_diff) return delivery_date
def execute(): frappe.reload_doc('accounts', 'doctype', 'subscription') fields = [ "name", "reference_doctype", "reference_document", "start_date", "frequency", "repeat_on_day" ] for d in fields: if not frappe.db.has_column('Subscription', d): return doctypes = ('Purchase Order', 'Sales Order', 'Purchase Invoice', 'Sales Invoice') for data in frappe.get_all('Subscription', fields=fields, 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)
def execute(): frappe.reload_doc('accounts', 'doctype', 'subscription') fields = ["name", "reference_doctype", "reference_document", "start_date", "frequency", "repeat_on_day"] for d in fields: if not frappe.db.has_column('Subscription', d): return doctypes = ('Purchase Order', 'Sales Order', 'Purchase Invoice', 'Sales Invoice') for data in frappe.get_all('Subscription', fields = fields, 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)