From 8e0314e7f684f0ae52963d4daf5a692ccd0308fa Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 31 Jul 2020 14:31:39 +0530 Subject: [PATCH] feat: separate invoice generation and email --- .../doctype/membership/membership.py | 69 ++++++++++++++----- 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/erpnext/non_profit/doctype/membership/membership.py b/erpnext/non_profit/doctype/membership/membership.py index 82b3145a07..c960daa1d3 100644 --- a/erpnext/non_profit/doctype/membership/membership.py +++ b/erpnext/non_profit/doctype/membership/membership.py @@ -57,34 +57,65 @@ class Membership(Document): self.load_from_db() self.db_set('paid', 1) - def generate_and_send_invoice(self): - if not self.paid: - frappe.throw(_("The payment for this membership is not paid. To generate invoice mark the paid check")) + def generate_invoice(self, save=True): + if not (self.paid or self.currency or self.amount): + frappe.throw(_("The payment for this membership is not paid. To generate invoice fill the payment details")) + + if self.invoice: + frappe.throw(_("An invoice is already linked to this document")) member = frappe.get_doc("Member", self.member) plan = frappe.get_doc("Membership Type", self.membership_type) settings = frappe.get_doc("Membership Settings") + attachments = [] + + if not member.customer: + frappe.throw(_("No customer linked to member {}", [member.name])) + + if not settings.debit_account: + frappe.throw(_("You need to set Debit Account in Membership Settings")) + + if not settings.company: + frappe.throw(_("You need to set Default Company for invoicing in Membership Settings")) invoice = make_invoice(self, member, plan, settings) + self.invoice = invoice.name - if invoice and settings.send_invoice and self.membership_status in ["New", "Current"]: - print("Sending") - message = settings.new_message if self.membership_status == "New" else settings.renewal - email = member.email_id if member.email_id else member.email + if save: + self.save() - email_args = { - "recipients": [email], - "message": message, - "subject": _('Here is your invoice'), - "attachments": [frappe.attach_print("Sales Invoice", invoice.name, print_format=settings.print_format)], - "reference_doctype": self.doctype, - "reference_name": self.name - } - if not frappe.flags.in_test: - frappe.enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args) - else: - frappe.sendmail(**email_args) + return invoice + def send_acknowlement(self): + settings = frappe.get_doc("Membership Settings") + if not settings.send_email: + frappe.throw(_("You need to enable Send Acknowledge Email in Membership Settings")) + + member = frappe.get_doc("Member", self.member) + plan = frappe.get_doc("Membership Type", self.membership_type) + email = member.email_id if member.email_id else member.email + attachments = [frappe.attach_print("Membership", self.name, print_format=settings.membership_print_format)] + + if self.invoice and settings.send_invoice: + attachments.append(frappe.attach_print("Sales Invoice", self.invoice, print_format=settings.inv_print_format)) + + email_args = { + "recipients": [email], + "message": settings.message, + "subject": _('Here is your invoice'), + "attachments": [frappe.attach_print("Sales Invoice", invoice.name, print_format=settings.inv_print_format)], + "reference_doctype": self.doctype, + "reference_name": self.name + } + + if not frappe.flags.in_test: + frappe.enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args) + else: + frappe.sendmail(**email_args) + + def generate_and_send_invoice(self): + invoice = self.generate_invoice(False) + self.send_acknowlement() def make_invoice(membership, member, plan, settings): invoice = frappe.get_doc({