Пример #1
0
	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)