From 9fa206109914d5969d6af85d500854ad0d44ce17 Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 13 Sep 2024 11:17:13 +0000 Subject: [PATCH 1/8] feat: first pass --- .../auto_email_report_party/__init__.py | 0 .../auto_email_report_party.json | 41 ++ .../auto_email_report_party.py | 8 + .../auto_email_report/auto_email_report.js | 42 ++ .../auto_email_report/auto_email_report.json | 495 +++++++++--------- .../auto_email_report/auto_email_report.py | 5 + 6 files changed, 354 insertions(+), 237 deletions(-) create mode 100644 frappe/core/doctype/auto_email_report_party/__init__.py create mode 100644 frappe/core/doctype/auto_email_report_party/auto_email_report_party.json create mode 100644 frappe/core/doctype/auto_email_report_party/auto_email_report_party.py diff --git a/frappe/core/doctype/auto_email_report_party/__init__.py b/frappe/core/doctype/auto_email_report_party/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/frappe/core/doctype/auto_email_report_party/auto_email_report_party.json b/frappe/core/doctype/auto_email_report_party/auto_email_report_party.json new file mode 100644 index 000000000000..ed6134e2b9f8 --- /dev/null +++ b/frappe/core/doctype/auto_email_report_party/auto_email_report_party.json @@ -0,0 +1,41 @@ +{ + "actions": [], + "creation": "2024-09-13 07:54:03.379269", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "link_doctype", + "link_name" + ], + "fields": [ + { + "fieldname": "link_doctype", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Link Document Type", + "options": "DocType", + "reqd": 1 + }, + { + "fieldname": "link_name", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Link Name", + "options": "link_doctype", + "reqd": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2024-09-13 08:03:56.175310", + "modified_by": "Administrator", + "module": "Core", + "name": "Auto Email Report Party", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/core/doctype/auto_email_report_party/auto_email_report_party.py b/frappe/core/doctype/auto_email_report_party/auto_email_report_party.py new file mode 100644 index 000000000000..dfbbf3a68678 --- /dev/null +++ b/frappe/core/doctype/auto_email_report_party/auto_email_report_party.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024, Frappe Technologies and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class AutoEmailReportParty(Document): + pass diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index 3423c3ccba44..1bcaab0bdc51 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -31,6 +31,13 @@ frappe.ui.form.on('Auto Email Report', { frm.set_value('email_to', frappe.session.user); } } + frm.trigger('setup_queries'); + }, + onload: function(frm) { + frm.trigger('setup_queries'); + }, + party: function(frm) { + frm.trigger('clear_recipients_table'); }, report: function(frm) { frm.set_value('filters', ''); @@ -135,5 +142,40 @@ frappe.ui.form.on('Auto Email Report', { frm.set_df_property('to_date_field', 'options', date_fields); frm.toggle_display('dynamic_report_filters_section', date_fields.length > 0); } + }, + setup_queries: function(frm) { + frm.set_query("party", function() { + return { + query: "frappe.contacts.address_and_contact.filter_dynamic_link_doctypes", + filters: { + fieldtype: ["in", ["HTML", "Text Editor"]], + fieldname: ["in", ["contact_html", "company_description"]], + } + }; + }); + frm.fields_dict['recipients'].grid.get_field('link_doctype').get_query = function() { + return { + filters: { + name: frm.doc.party + } + }; + }; + }, + clear_recipients_table: function(frm) { + let party_value = frm.doc.party; + if (party_value) { + frm.clear_table('recipients'); + frm.refresh_field('recipients'); + } } }); + + +frappe.ui.form.on('Auto Email Report Party', { + recipients_add: function(frm, cdt, cdn) { + let party_value = frm.doc.party; + if (party_value) { + frappe.model.set_value(cdt, cdn, 'link_doctype', party_value); + } + } +}); diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json index 211e2e9662ef..a795be3d7f6b 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.json +++ b/frappe/email/doctype/auto_email_report/auto_email_report.json @@ -1,238 +1,259 @@ { - "allow_rename": 1, - "creation": "2016-09-01 01:34:34.985457", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "report", - "user", - "enabled", - "column_break_4", - "report_type", - "reference_report", - "filter_data", - "send_if_data", - "data_modified_till", - "no_of_rows", - "report_filters", - "filters_display", - "filters", - "filter_meta", - "dynamic_report_filters_section", - "from_date_field", - "to_date_field", - "column_break_17", - "dynamic_date_period", - "email_settings", - "email_to", - "day_of_week", - "column_break_13", - "frequency", - "format", - "section_break_15", - "description" - ], - "fields": [ - { - "fieldname": "report", - "fieldtype": "Link", - "label": "Report", - "options": "Report", - "reqd": 1 - }, - { - "default": "User", - "fieldname": "user", - "fieldtype": "Link", - "label": "Based on Permissions For User", - "options": "User", - "reqd": 1 - }, - { - "default": "1", - "fieldname": "enabled", - "fieldtype": "Check", - "label": "Enabled" - }, - { - "fieldname": "column_break_4", - "fieldtype": "Column Break" - }, - { - "fetch_from": "report.report_type", - "fieldname": "report_type", - "fieldtype": "Read Only", - "label": "Report Type" - }, - { - "fieldname": "filter_data", - "fieldtype": "Section Break", - "label": "Filter Data" - }, - { - "default": "1", - "fieldname": "send_if_data", - "fieldtype": "Check", - "label": "Send only if there is any data" - }, - { - "depends_on": "eval:doc.report_type=='Report Builder'", - "description": "Zero means send records updated at anytime", - "fieldname": "data_modified_till", - "fieldtype": "Int", - "label": "Only Send Records Updated in Last X Hours" - }, - { - "default": "100", - "fieldname": "no_of_rows", - "fieldtype": "Int", - "label": "No of Rows (Max 500)" - }, - { - "collapsible": 1, - "depends_on": "eval:doc.report_type !== 'Report Builder'", - "fieldname": "report_filters", - "fieldtype": "Section Break", - "label": "Report Filters" - }, - { - "fieldname": "filters_display", - "fieldtype": "HTML", - "label": "Filters Display" - }, - { - "fieldname": "filters", - "fieldtype": "Text", - "hidden": 1, - "label": "Filters" - }, - { - "fieldname": "filter_meta", - "fieldtype": "Text", - "hidden": 1, - "label": "Filter Meta", - "read_only": 1 - }, - { - "collapsible": 1, - "depends_on": "eval:doc.report_type !== 'Report Builder'", - "fieldname": "dynamic_report_filters_section", - "fieldtype": "Section Break", - "label": "Dynamic Report Filters" - }, - { - "fieldname": "from_date_field", - "fieldtype": "Select", - "label": "From Date Field" - }, - { - "fieldname": "to_date_field", - "fieldtype": "Select", - "label": "To Date Field" - }, - { - "fieldname": "column_break_17", - "fieldtype": "Column Break" - }, - { - "fieldname": "dynamic_date_period", - "fieldtype": "Select", - "label": "Period", - "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf Yearly\nYearly" - }, - { - "fieldname": "email_settings", - "fieldtype": "Section Break", - "label": "Email Settings" - }, - { - "description": "For multiple addresses, enter the address on different line. e.g. test@test.com \u23ce test1@test.com", - "fieldname": "email_to", - "fieldtype": "Small Text", - "label": "Email To", - "reqd": 1 - }, - { - "default": "Monday", - "depends_on": "eval:doc.frequency=='Weekly'", - "fieldname": "day_of_week", - "fieldtype": "Select", - "label": "Day of Week", - "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday" - }, - { - "fieldname": "column_break_13", - "fieldtype": "Column Break" - }, - { - "fieldname": "frequency", - "fieldtype": "Select", - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Frequency", - "options": "Daily\nWeekdays\nWeekly\nMonthly", - "reqd": 1 - }, - { - "fieldname": "format", - "fieldtype": "Select", - "label": "Format", - "options": "HTML\nXLSX\nCSV", - "reqd": 1 - }, - { - "collapsible": 1, - "fieldname": "section_break_15", - "fieldtype": "Section Break", - "label": "Message" - }, - { - "fieldname": "description", - "fieldtype": "Text Editor", - "label": "Message" - }, - { - "fetch_from": "report.reference_report", - "fieldname": "reference_report", - "fieldtype": "Data", - "hidden": 1, - "label": "Reference Report", - "read_only": 1 - } - ], - "modified": "2021-01-28 15:59:43.151995", - "modified_by": "Administrator", - "module": "Email", - "name": "Auto Email Report", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "write": 1 - }, - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "Report Manager", - "share": 1, - "write": 1 - } - ], - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1 - } \ No newline at end of file + "actions": [], + "allow_rename": 1, + "creation": "2016-09-01 01:34:34.985457", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "report", + "user", + "enabled", + "column_break_4", + "report_type", + "reference_report", + "filter_data", + "send_if_data", + "data_modified_till", + "no_of_rows", + "report_filters", + "filters_display", + "filters", + "filter_meta", + "dynamic_report_filters_section", + "from_date_field", + "to_date_field", + "column_break_17", + "dynamic_date_period", + "email_settings", + "email_to", + "day_of_week", + "column_break_13", + "frequency", + "format", + "recipients_section", + "party", + "recipients", + "section_break_15", + "description" + ], + "fields": [ + { + "fieldname": "report", + "fieldtype": "Link", + "label": "Report", + "options": "Report", + "reqd": 1 + }, + { + "default": "User", + "fieldname": "user", + "fieldtype": "Link", + "label": "Based on Permissions For User", + "options": "User", + "reqd": 1 + }, + { + "default": "1", + "fieldname": "enabled", + "fieldtype": "Check", + "label": "Enabled" + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" + }, + { + "fetch_from": "report.report_type", + "fieldname": "report_type", + "fieldtype": "Read Only", + "label": "Report Type" + }, + { + "fieldname": "filter_data", + "fieldtype": "Section Break", + "label": "Filter Data" + }, + { + "default": "1", + "fieldname": "send_if_data", + "fieldtype": "Check", + "label": "Send only if there is any data" + }, + { + "depends_on": "eval:doc.report_type=='Report Builder'", + "description": "Zero means send records updated at anytime", + "fieldname": "data_modified_till", + "fieldtype": "Int", + "label": "Only Send Records Updated in Last X Hours" + }, + { + "default": "100", + "fieldname": "no_of_rows", + "fieldtype": "Int", + "label": "No of Rows (Max 500)" + }, + { + "collapsible": 1, + "depends_on": "eval:doc.report_type !== 'Report Builder'", + "fieldname": "report_filters", + "fieldtype": "Section Break", + "label": "Report Filters" + }, + { + "fieldname": "filters_display", + "fieldtype": "HTML", + "label": "Filters Display" + }, + { + "fieldname": "filters", + "fieldtype": "Text", + "hidden": 1, + "label": "Filters" + }, + { + "fieldname": "filter_meta", + "fieldtype": "Text", + "hidden": 1, + "label": "Filter Meta", + "read_only": 1 + }, + { + "collapsible": 1, + "depends_on": "eval:doc.report_type !== 'Report Builder'", + "fieldname": "dynamic_report_filters_section", + "fieldtype": "Section Break", + "label": "Dynamic Report Filters" + }, + { + "fieldname": "from_date_field", + "fieldtype": "Select", + "label": "From Date Field" + }, + { + "fieldname": "to_date_field", + "fieldtype": "Select", + "label": "To Date Field" + }, + { + "fieldname": "column_break_17", + "fieldtype": "Column Break" + }, + { + "fieldname": "dynamic_date_period", + "fieldtype": "Select", + "label": "Period", + "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf Yearly\nYearly" + }, + { + "fieldname": "email_settings", + "fieldtype": "Section Break", + "label": "Email Settings" + }, + { + "description": "For multiple addresses, enter the address on different line. e.g. test@test.com \u23ce test1@test.com", + "fieldname": "email_to", + "fieldtype": "Small Text", + "label": "Email To" + }, + { + "default": "Monday", + "depends_on": "eval:doc.frequency=='Weekly'", + "fieldname": "day_of_week", + "fieldtype": "Select", + "label": "Day of Week", + "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday" + }, + { + "fieldname": "column_break_13", + "fieldtype": "Column Break" + }, + { + "fieldname": "frequency", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Frequency", + "options": "Daily\nWeekdays\nWeekly\nMonthly", + "reqd": 1 + }, + { + "fieldname": "format", + "fieldtype": "Select", + "label": "Format", + "options": "HTML\nXLSX\nCSV", + "reqd": 1 + }, + { + "collapsible": 1, + "fieldname": "section_break_15", + "fieldtype": "Section Break", + "label": "Message" + }, + { + "fieldname": "description", + "fieldtype": "Text Editor", + "label": "Message" + }, + { + "fetch_from": "report.reference_report", + "fieldname": "reference_report", + "fieldtype": "Data", + "hidden": 1, + "label": "Reference Report", + "read_only": 1 + }, + { + "fieldname": "recipients_section", + "fieldtype": "Section Break", + "label": "Recipients" + }, + { + "fieldname": "party", + "fieldtype": "Link", + "label": "Party", + "options": "DocType" + }, + { + "fieldname": "recipients", + "fieldtype": "Table", + "options": "Auto Email Report Party" + } + ], + "links": [], + "modified": "2024-09-13 08:16:29.570029", + "modified_by": "Administrator", + "module": "Email", + "name": "Auto Email Report", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Report Manager", + "share": 1, + "write": 1 + } + ], + "route": "app/doctype/Auto%20Email%20Report", + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index 5d1da23ff6ea..b79a44da2da6 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -73,6 +73,11 @@ def validate_mandatory_fields(self): '

', ) + if not self.email_to and not self.recipients: + frappe.throw( + title= _('Datos Requeridos'), + msg= _('Debe especificar Email Para o Tercero.') + ) def get_report_content(self): '''Returns file in for the report in given format''' report = frappe.get_doc('Report', self.report) From 93b4454a1bafef7d65380505d30d0039fe1d1a1c Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 13 Sep 2024 13:39:21 +0000 Subject: [PATCH 2/8] feat: recipients --- .../auto_email_report/auto_email_report.js | 78 +++++++++++ .../auto_email_report/auto_email_report.json | 14 +- .../auto_email_report/auto_email_report.py | 125 ++++++++++++++---- 3 files changed, 191 insertions(+), 26 deletions(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index 1bcaab0bdc51..b0e71a346fce 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -32,12 +32,15 @@ frappe.ui.form.on('Auto Email Report', { } } frm.trigger('setup_queries'); + manage_filters(frm); + }, onload: function(frm) { frm.trigger('setup_queries'); }, party: function(frm) { frm.trigger('clear_recipients_table'); + manage_filters(frm); }, report: function(frm) { frm.set_value('filters', ''); @@ -57,10 +60,12 @@ frappe.ui.form.on('Auto Email Report', { frappe.dom.eval(r.message.script || ""); frm.script_setup_for = frm.doc.report; frm.trigger('show_filters'); + frm.trigger('populate_filter_to_override_options'); } }); } else { frm.trigger('show_filters'); + frm.trigger('populate_filter_to_override_options'); } }, show_filters: function(frm) { @@ -167,6 +172,25 @@ frappe.ui.form.on('Auto Email Report', { frm.clear_table('recipients'); frm.refresh_field('recipients'); } + }, + populate_filter_to_override_options: function(frm) { + if (!frm.doc.filters) { + frm.fields_dict['filter_to_override'].df.options = ''; + frm.fields_dict['filter_to_override'].refresh(); + } else { + let report_filters; + if (frm.doc.report_type === 'Custom Report' + && frappe.query_reports[frm.doc.reference_report] + && frappe.query_reports[frm.doc.reference_report].filters) { + report_filters = frappe.query_reports[frm.doc.reference_report].filters; + } else { + report_filters = frappe.query_reports[frm.doc.report].filters; + } + const keys = report_filters.map(item => item.fieldname); + keys.unshift(''); + frm.fields_dict['filter_to_override'].df.options = keys.join('\n'); + frm.fields_dict['filter_to_override'].refresh(); + } } }); @@ -179,3 +203,57 @@ frappe.ui.form.on('Auto Email Report Party', { } } }); + +const manage_filters = (frm) => { + if (frm.doc.party) { + frappe.model.with_doctype(frm.doc.party, () => set_field_options(frm)); + } else { + reset_filter_and_field(frm); + } +} + +const reset_filter_and_field = (frm) => { + const filter_wrapper = frm.fields_dict.filter_list.$wrapper; + filter_wrapper.empty(); + frm.filter_list = []; +}; + +const set_field_options = (frm) => { + const filter_wrapper = frm.fields_dict.filter_list.$wrapper; + filter_wrapper.empty(); + frm.filter_list = new frappe.ui.FilterGroup({ + parent: filter_wrapper, + doctype: frm.doc.party, + on_change: () => { + frm.call({ + method: 'frappe.email.doctype.auto_email_report.auto_email_report.get_recipients_by_filter', + args: { + doctype: frm.doc.party, + filters: get_filters(frm), + }, + callback: function(response) { + if (response.message) { + frm.clear_table('recipients'); + let names = response.message; + names.forEach(name => { + frm.add_child('recipients', { + link_doctype: frm.doc.party, + link_name: name, + }); + }); + frm.refresh_field('recipients'); + } else { + frm.clear_table('recipients'); + frm.refresh_field('recipients'); + } + } + }); + }, + }); +}; + +const get_filters = (frm) => { + return frm.filter_list.get_filters().map(filter => { + return filter.slice(0, 4); + }); +} \ No newline at end of file diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json index a795be3d7f6b..033e4908d8ea 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.json +++ b/frappe/email/doctype/auto_email_report/auto_email_report.json @@ -33,6 +33,8 @@ "format", "recipients_section", "party", + "filter_to_override", + "filter_list", "recipients", "section_break_15", "description" @@ -218,10 +220,20 @@ "fieldname": "recipients", "fieldtype": "Table", "options": "Auto Email Report Party" + }, + { + "fieldname": "filter_to_override", + "fieldtype": "Select", + "label": "Envio Individual" + }, + { + "fieldname": "filter_list", + "fieldtype": "HTML", + "label": "Filter List" } ], "links": [], - "modified": "2024-09-13 08:16:29.570029", + "modified": "2024-09-13 09:31:59.679531", "modified_by": "Administrator", "module": "Email", "name": "Auto Email Report", diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index b79a44da2da6..35423c673af6 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -78,7 +78,8 @@ def validate_mandatory_fields(self): title= _('Datos Requeridos'), msg= _('Debe especificar Email Para o Tercero.') ) - def get_report_content(self): + + def get_report_content(self, filter_to_override_data=None): '''Returns file in for the report in given format''' report = frappe.get_doc('Report', self.report) @@ -86,6 +87,9 @@ def get_report_content(self): if self.report_type=='Report Builder' and self.data_modified_till: self.filters['modified'] = ('>', now_datetime() - timedelta(hours=self.data_modified_till)) + + if self.filter_to_override and filter_to_override_data: + self.filters[self.filter_to_override] = filter_to_override_data if self.report_type != 'Report Builder' and self.dynamic_date_filters_set(): self.prepare_dynamic_filters() @@ -167,33 +171,94 @@ def send(self): if self.filter_meta and not self.filters: frappe.throw(_("Please set filters value in Report Filter table.")) - data = self.get_report_content() - if not data: - return - - attachments = None - if self.format == "HTML": - message = data - else: - message = self.get_html_table() - - if not self.format=='HTML': - attachments = [{ - 'fname': self.get_file_name(), - 'fcontent': data - }] - - frappe.sendmail( - recipients = self.email_to.split(), - subject = self.name, - message = message, - attachments = attachments, - reference_doctype = self.doctype, - reference_name = self.name - ) + if self.email_to: + data = self.get_report_content() + if not data: + return + + attachments = None + if self.format == "HTML": + message = data + else: + message = self.get_html_table() + + if not self.format=='HTML': + attachments = [{ + 'fname': self.get_file_name(), + 'fcontent': data + }] + + frappe.sendmail( + recipients = self.email_to.split(), + subject = self.name, + message = message, + attachments = attachments, + reference_doctype = self.doctype, + reference_name = self.name + ) + + elif self.party and self.recipients: + for recipient in self.recipients: + + email_to = self.get_primary_contact(recipient.link_name) + if not email_to: + continue + + filter_to_override_data = None + if self.filter_to_override: + filter_to_override_data = recipient.link_name + + data = self.get_report_content(filter_to_override_data=filter_to_override_data) + if not data: + return + + attachments = None + if self.format == "HTML": + message = data + else: + message = self.get_html_table() + + if not self.format=='HTML': + attachments = [{ + 'fname': self.get_file_name(), + 'fcontent': data + }] + + frappe.sendmail( + recipients = [email_to], + subject = self.name, + message = message, + attachments = attachments, + reference_doctype = self.doctype, + reference_name = self.name + ) def dynamic_date_filters_set(self): return self.dynamic_date_period and self.from_date_field and self.to_date_field + + def get_primary_contact(self, party_name): + primary_contact = frappe.db.sql( + """ + SELECT + con.email_id + FROM + `tabContact` con + JOIN + `tabDynamic Link` link ON link.parent = con.name + WHERE + link.link_doctype = %s + AND link.link_name = %s + AND con.is_primary_contact = 1 + LIMIT 1 + """, + (self.party, party_name), + as_dict=True + ) + + if not primary_contact or not primary_contact[0].get("email_id"): + return None + return primary_contact[0].get("email_id") + @frappe.whitelist() def download(name): @@ -270,3 +335,13 @@ def update_field_types(columns): col.fieldtype = "Data" col.options = "" return columns + + +@frappe.whitelist() +def get_recipients_by_filter(doctype, filters): + import ast + filters = ast.literal_eval(filters) + if not filters: + return [] + recipients = frappe.get_list(doctype, filters=filters, limit_page_length=None, order_by="name", pluck="name") + return recipients \ No newline at end of file From 7b8201436fb2247d7ef67d4f65a959370677f7ca Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 13 Sep 2024 14:29:37 +0000 Subject: [PATCH 3/8] feat: improve populate_filter_to_override_options --- .../auto_email_report/auto_email_report.js | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index b0e71a346fce..ab3a95f51a87 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -174,23 +174,24 @@ frappe.ui.form.on('Auto Email Report', { } }, populate_filter_to_override_options: function(frm) { - if (!frm.doc.filters) { - frm.fields_dict['filter_to_override'].df.options = ''; - frm.fields_dict['filter_to_override'].refresh(); + if (!frm.doc.report_type) { + return + } + let report_filters; + if (frm.doc.report_type === 'Custom Report' + && frappe.query_reports[frm.doc.reference_report] + && frappe.query_reports[frm.doc.reference_report].filters) { + report_filters = frappe.query_reports[frm.doc.reference_report].filters; } else { - let report_filters; - if (frm.doc.report_type === 'Custom Report' - && frappe.query_reports[frm.doc.reference_report] - && frappe.query_reports[frm.doc.reference_report].filters) { - report_filters = frappe.query_reports[frm.doc.reference_report].filters; - } else { - report_filters = frappe.query_reports[frm.doc.report].filters; - } - const keys = report_filters.map(item => item.fieldname); - keys.unshift(''); - frm.fields_dict['filter_to_override'].df.options = keys.join('\n'); - frm.fields_dict['filter_to_override'].refresh(); + report_filters = frappe.query_reports[frm.doc.report].filters; + } + if (!report_filters) { + return } + const keys = report_filters.filter(item => item.fieldname).map(item => item.fieldname); + keys.unshift(''); + frm.fields_dict['filter_to_override'].df.options = keys.join('\n'); + frm.fields_dict['filter_to_override'].refresh(); } }); From f54fd11a15ee0476a9ce4a8cd793b17955fe8490 Mon Sep 17 00:00:00 2001 From: fproldan Date: Mon, 16 Sep 2024 15:39:46 +0000 Subject: [PATCH 4/8] feat: nombres y warning --- .../auto_email_report/auto_email_report.js | 21 +++++++++++++++++++ .../auto_email_report/auto_email_report.json | 4 ++-- .../auto_email_report/auto_email_report.py | 14 ++++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index ab3a95f51a87..88165c1ba9a7 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -38,6 +38,27 @@ frappe.ui.form.on('Auto Email Report', { onload: function(frm) { frm.trigger('setup_queries'); }, + before_save: function(frm) { + if ((frm.doc.party || (frm.doc.recipients && frm.doc.recipients.length > 0)) && !frm.doc.filter_to_override ) { + if (!frm.confirmation_shown) { + frappe.validated = false; + frappe.confirm( + 'Especificó Tercero sin completar Envio Personalizado, por lo que se enviará el mismo corro a todos los destinatarios. ¿Está seguro de guardar?', + function() { + frm.confirmation_shown = true; + frappe.validated = true; + frm.save(); + }, + function() { + frappe.validated = false; + } + ); + } + } + }, + after_save: function(frm) { + frm.confirmation_shown = false; + }, party: function(frm) { frm.trigger('clear_recipients_table'); manage_filters(frm); diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json index 033e4908d8ea..f4c37a2b62f5 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.json +++ b/frappe/email/doctype/auto_email_report/auto_email_report.json @@ -224,7 +224,7 @@ { "fieldname": "filter_to_override", "fieldtype": "Select", - "label": "Envio Individual" + "label": "Env\u00edo Personalizado" }, { "fieldname": "filter_list", @@ -233,7 +233,7 @@ } ], "links": [], - "modified": "2024-09-13 09:31:59.679531", + "modified": "2024-09-16 09:59:33.415769", "modified_by": "Administrator", "module": "Email", "name": "Auto Email Report", diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index 35423c673af6..b4a9cfb31490 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -6,6 +6,7 @@ import calendar from datetime import timedelta +from json import JSONDecodeError import frappe from frappe import _ @@ -94,8 +95,15 @@ def get_report_content(self, filter_to_override_data=None): if self.report_type != 'Report Builder' and self.dynamic_date_filters_set(): self.prepare_dynamic_filters() - columns, data = report.get_data(limit=self.no_of_rows or 100, user = self.user, + try: + columns, data = report.get_data(limit=self.no_of_rows or 100, user = self.user, + filters = self.filters, as_dict=True, ignore_prepared_report=True) + except JSONDecodeError: + if self.filter_to_override and filter_to_override_data: + self.filters[self.filter_to_override] = f'["{filter_to_override_data}"]' + columns, data = report.get_data(limit=self.no_of_rows or 100, user = self.user, filters = self.filters, as_dict=True, ignore_prepared_report=True) + # add serial numbers columns.insert(0, frappe._dict(fieldname='idx', label='', width='30px')) @@ -340,8 +348,8 @@ def update_field_types(columns): @frappe.whitelist() def get_recipients_by_filter(doctype, filters): import ast - filters = ast.literal_eval(filters) - if not filters: + filters_list = ast.literal_eval(filters) + if not filters_list: return [] recipients = frappe.get_list(doctype, filters=filters, limit_page_length=None, order_by="name", pluck="name") return recipients \ No newline at end of file From 37fd459b04e6841c9f041e0376503ea54f9c52f3 Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 20 Sep 2024 13:06:36 +0000 Subject: [PATCH 5/8] feat: filter_to_override reqd --- .../auto_email_report/auto_email_report.js | 21 ------------------- .../auto_email_report/auto_email_report.json | 2 +- .../auto_email_report/auto_email_report.py | 6 +++--- 3 files changed, 4 insertions(+), 25 deletions(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index 88165c1ba9a7..ab3a95f51a87 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -38,27 +38,6 @@ frappe.ui.form.on('Auto Email Report', { onload: function(frm) { frm.trigger('setup_queries'); }, - before_save: function(frm) { - if ((frm.doc.party || (frm.doc.recipients && frm.doc.recipients.length > 0)) && !frm.doc.filter_to_override ) { - if (!frm.confirmation_shown) { - frappe.validated = false; - frappe.confirm( - 'Especificó Tercero sin completar Envio Personalizado, por lo que se enviará el mismo corro a todos los destinatarios. ¿Está seguro de guardar?', - function() { - frm.confirmation_shown = true; - frappe.validated = true; - frm.save(); - }, - function() { - frappe.validated = false; - } - ); - } - } - }, - after_save: function(frm) { - frm.confirmation_shown = false; - }, party: function(frm) { frm.trigger('clear_recipients_table'); manage_filters(frm); diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json index f4c37a2b62f5..5c311a04285a 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.json +++ b/frappe/email/doctype/auto_email_report/auto_email_report.json @@ -233,7 +233,7 @@ } ], "links": [], - "modified": "2024-09-16 09:59:33.415769", + "modified": "2024-09-20 10:02:13.286565", "modified_by": "Administrator", "module": "Email", "name": "Auto Email Report", diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index b4a9cfb31490..da97fdfb59fe 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -73,11 +73,11 @@ def validate_mandatory_fields(self): msg= _('Following Report Filters have missing values:') + '

  • ' + '
  • '.join(throw_list) + '
', ) - - if not self.email_to and not self.recipients: + print(self.recipients) + if not self.email_to and (not self.recipients or not self.filter_to_override or not self.recipients): frappe.throw( title= _('Datos Requeridos'), - msg= _('Debe especificar Email Para o Tercero.') + msg= _('Debe especificar Email Para o Destinatarios.') ) def get_report_content(self, filter_to_override_data=None): From 087d5e2c191b29ebc310aeed1d91fa67963c30ac Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 20 Sep 2024 14:07:16 +0000 Subject: [PATCH 6/8] fix: get_recipients_by_filter --- frappe/email/doctype/auto_email_report/auto_email_report.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index da97fdfb59fe..ab5fdeb8889f 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -348,7 +348,10 @@ def update_field_types(columns): @frappe.whitelist() def get_recipients_by_filter(doctype, filters): import ast - filters_list = ast.literal_eval(filters) + try: + filters_list = ast.literal_eval(filters) + except: + return [] if not filters_list: return [] recipients = frappe.get_list(doctype, filters=filters, limit_page_length=None, order_by="name", pluck="name") From 77945d009cccd776e5f649141d8d779d78cc5c5b Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 20 Sep 2024 15:52:31 +0000 Subject: [PATCH 7/8] feat: multiple contacts --- .../doctype/auto_email_report/auto_email_report.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index ab5fdeb8889f..4e0b7b13bef5 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -208,7 +208,7 @@ def send(self): elif self.party and self.recipients: for recipient in self.recipients: - email_to = self.get_primary_contact(recipient.link_name) + email_to = self.get_primary_contacts(recipient.link_name) if not email_to: continue @@ -233,7 +233,7 @@ def send(self): }] frappe.sendmail( - recipients = [email_to], + recipients = email_to, subject = self.name, message = message, attachments = attachments, @@ -244,8 +244,8 @@ def send(self): def dynamic_date_filters_set(self): return self.dynamic_date_period and self.from_date_field and self.to_date_field - def get_primary_contact(self, party_name): - primary_contact = frappe.db.sql( + def get_primary_contacts(self, party_name): + primary_contacts = frappe.db.sql( """ SELECT con.email_id @@ -257,15 +257,13 @@ def get_primary_contact(self, party_name): link.link_doctype = %s AND link.link_name = %s AND con.is_primary_contact = 1 - LIMIT 1 """, (self.party, party_name), as_dict=True ) - - if not primary_contact or not primary_contact[0].get("email_id"): + if not primary_contacts: return None - return primary_contact[0].get("email_id") + return [contact.get("email_id") for contact in primary_contacts if contact.get("email_id")] @frappe.whitelist() From bebf77f0d1c9d7332c77a556d1b9fb6944322a68 Mon Sep 17 00:00:00 2001 From: fproldan Date: Fri, 20 Sep 2024 15:57:22 +0000 Subject: [PATCH 8/8] feat: multiple contacts --- frappe/email/doctype/auto_email_report/auto_email_report.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index ab3a95f51a87..7108a735f7e4 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -103,7 +103,7 @@ frappe.ui.form.on('Auto Email Report', { var report_filters_list = [] $.each(report_filters, function(key, val){ // Remove break fieldtype from the filters - if(val.fieldtype != 'Break') { + if(val.fieldtype != 'Break' && val.hidden != 1) { report_filters_list.push(val) } })