From 80ebe3f1c4fb38bd2fccc48fba64c18fb1520ca0 Mon Sep 17 00:00:00 2001 From: Sherin KR Date: Thu, 15 Jan 2026 15:31:09 +0530 Subject: [PATCH] fix: compliance date not considering on agreement --- .../compliance_agreement.py | 74 ++-- .../compliance_settings.js | 326 +++++++++--------- .../compliance_settings.py | 1 - 3 files changed, 190 insertions(+), 211 deletions(-) diff --git a/one_compliance/one_compliance/doctype/compliance_agreement/compliance_agreement.py b/one_compliance/one_compliance/doctype/compliance_agreement/compliance_agreement.py index 19b909ce..5c21ca4d 100644 --- a/one_compliance/one_compliance/doctype/compliance_agreement/compliance_agreement.py +++ b/one_compliance/one_compliance/doctype/compliance_agreement/compliance_agreement.py @@ -557,10 +557,12 @@ def create_sales_orders_from_compliance_agreements(posting_date=today()): category_details = frappe.get_all( "Compliance Category Details", filters={"parent": agreement.name}, - fields=["name", "compliance_sub_category", "rate"] + fields=["name", "compliance_sub_category", "rate", "compliance_date", "next_compliance_date"] ) for detail in category_details: + + compliance_date = getdate(detail.compliance_date) if detail.compliance_date else current_date sub_cat = detail.compliance_sub_category if not sub_cat: continue @@ -580,8 +582,6 @@ def create_sales_orders_from_compliance_agreements(posting_date=today()): allow_repeat = sub_category.allow_repeat repeat_on = sub_category.repeat_on - repeat_day = sub_category.day - repeat_month = sub_category.month item_code = sub_category.item_code project_template = sub_category.project_template is_billable = sub_category.is_billable @@ -594,12 +594,8 @@ def create_sales_orders_from_compliance_agreements(posting_date=today()): if current_date == valid_from: should_create = True else: - month_number = MONTH_MAP.get(repeat_month) if repeat_month else None - if repeat_on == "Monthly" and repeat_day and current_date.day == int(repeat_day): + if current_date == compliance_date: should_create = True - elif repeat_on in ["Quarterly", "Half Yearly", "Yearly"] and month_number and repeat_day: - if current_date.month == month_number and current_date.day == int(repeat_day): - should_create = True if not should_create: continue @@ -618,27 +614,28 @@ def create_sales_orders_from_compliance_agreements(posting_date=today()): posting_date ) - # === Calculate compliance dates (common for both cases) === - base_date = getdate(nowdate()) - compliance_date = None - next_compliance_date = None - - if allow_repeat: - if repeat_on == "Monthly": - compliance_date = add_months(base_date, 1) - next_compliance_date = add_months(compliance_date, 1) - elif repeat_on == "Quarterly": - compliance_date = add_months(base_date, 3) - next_compliance_date = add_months(compliance_date, 3) - elif repeat_on == "Half Yearly": - compliance_date = add_months(base_date, 6) - next_compliance_date = add_months(compliance_date, 6) - elif repeat_on == "Yearly": - compliance_date = add_months(base_date, 12) - next_compliance_date = add_months(compliance_date, 12) - else: - compliance_date = base_date - next_compliance_date = None + if project: + # Calculation Next Compliance Dates + next_compliance_date = None + + if allow_repeat: + if repeat_on == "Monthly": + next_compliance_date = add_months(compliance_date, 1) + elif repeat_on == "Quarterly": + next_compliance_date = add_months(compliance_date, 3) + elif repeat_on == "Half Yearly": + next_compliance_date = add_months(compliance_date, 6) + elif repeat_on == "Yearly": + next_compliance_date = add_months(compliance_date, 12) + + frappe.db.set_value( + "Compliance Category Details", + detail.name, + { + "compliance_date": compliance_date, + "next_compliance_date": next_compliance_date + } + ) # === Create Sales Order only if billable === if is_billable: @@ -676,26 +673,9 @@ def create_sales_orders_from_compliance_agreements(posting_date=today()): project.db_set("sales_order", so.name) so.db_set("project", project.name) - frappe.db.set_value( - "Compliance Category Details", - detail.name, - { - "compliance_date": compliance_date, - "next_compliance_date": next_compliance_date - } - ) - except Exception: frappe.log_error(frappe.get_traceback(), f"SO Creation Failed - {agreement.name}") - else: - frappe.db.set_value( - "Compliance Category Details", - detail.name, - { - "compliance_date": compliance_date, - "next_compliance_date": next_compliance_date - } - ) + def create_project_from_template(sales_order, project_template, customer, company, compliance_sub_category, compliance_category_details_id, diff --git a/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.js b/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.js index ce7de2dc..deb6abd3 100644 --- a/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.js +++ b/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.js @@ -2,189 +2,189 @@ // For license information, please see license.txt frappe.ui.form.on('Compliance Settings', { - refresh: function(frm) { - if (frappe.session.user == "Administrator"){ - frm.add_custom_button('Create Projects', () => { - create_projects_manually_perticular_date(frm) - }) - } - if (frappe.session.user == "Administrator"){ - frm.add_custom_button('Change Compliance Date', () => { - change_perticular_compliance_date(frm) - }) - } - //filter for task_before_due_date_notification based on doctype - frm.set_query('task_before_due_date_notification', function(){ - return { - filters: { - doctype_name : 'Task' - } - } - }) + refresh: function (frm) { + if (frappe.session.user == "Administrator") { + frm.add_custom_button('Create Projects', () => { + create_projects_manually_perticular_date(frm) + }) + } + if (frappe.session.user == "Administrator") { + frm.add_custom_button('Change Compliance Date', () => { + change_perticular_compliance_date(frm) + }) + } + //filter for task_before_due_date_notification based on doctype + frm.set_query('task_before_due_date_notification', function () { + return { + filters: { + doctype_name: 'Task' + } + } + }) - //filter for task_overdue_notification_for_employee based on doctype - frm.set_query('task_overdue_notification_for_employee', function(){ - return { - filters: { - doctype_name : 'Task' - } - } - }) + //filter for task_overdue_notification_for_employee based on doctype + frm.set_query('task_overdue_notification_for_employee', function () { + return { + filters: { + doctype_name: 'Task' + } + } + }) - //filter for task_overdue_notification_for_director based on doctype - frm.set_query('task_overdue_notification_for_director', function(){ - return { - filters: { - doctype_name : 'Task' - } - } - }) + //filter for task_overdue_notification_for_director based on doctype + frm.set_query('task_overdue_notification_for_director', function () { + return { + filters: { + doctype_name: 'Task' + } + } + }) - //filter for task_complete_notification_for_director based on doctype - frm.set_query('task_complete_notification_for_director', function(){ - return { - filters: { - doctype_name : 'Task' - } - } - }) + //filter for task_complete_notification_for_director based on doctype + frm.set_query('task_complete_notification_for_director', function () { + return { + filters: { + doctype_name: 'Task' + } + } + }) - //filter for no_action_taken_notification_for_director based on doctype - frm.set_query('no_action_taken_notification_for_director', function(){ - return { - filters: { - doctype_name : 'Task' - } - } - }) + //filter for no_action_taken_notification_for_director based on doctype + frm.set_query('no_action_taken_notification_for_director', function () { + return { + filters: { + doctype_name: 'Task' + } + } + }) - //filter for project_complete_notification_for_customer based on doctype - frm.set_query('project_complete_notification_for_customer', function(){ - return { - filters: { - doctype_name : 'Project' - } - } - }) + //filter for project_complete_notification_for_customer based on doctype + frm.set_query('project_complete_notification_for_customer', function () { + return { + filters: { + doctype_name: 'Project' + } + } + }) - //filter for digital_signature_expiry_notification based on doctype - frm.set_query('digital_signature_expiry_notification', function(){ - return { - filters: { - doctype_name : 'Digital Signature' - } - }; - }); + //filter for digital_signature_expiry_notification based on doctype + frm.set_query('digital_signature_expiry_notification', function () { + return { + filters: { + doctype_name: 'Digital Signature' + } + }; + }); //filter for digital_signature_sub_category based on digital_signature_category - frm.set_query('digital_signature_sub_category', function(){ - return { - filters: { - compliance_category : frm.doc.digital_signature_category - } - } - }) + frm.set_query('digital_signature_sub_category', function () { + return { + filters: { + compliance_category: frm.doc.digital_signature_category + } + } + }) //filter for din_kyc_sub_category based on din_kyc_category - frm.set_query('din_kyc_sub_category', function(){ - return { - filters: { - compliance_category : frm.doc.din_kyc_category - } - } - }) + frm.set_query('din_kyc_sub_category', function () { + return { + filters: { + compliance_category: frm.doc.din_kyc_category + } + } + }) //filter for legal_authority_sub_category based on legal_authority_category - frm.set_query('legal_authority_sub_category', function(){ - return { - filters: { - compliance_category : frm.doc.legal_authority_category - } - } - }) + frm.set_query('legal_authority_sub_category', function () { + return { + filters: { + compliance_category: frm.doc.legal_authority_category + } + } + }) //filter for auditor_sub_category based on auditor_subcategory - frm.set_query('auditor_sub_category', function(){ - return { - filters: { - compliance_category : frm.doc.auditor_category - } - } - }) + frm.set_query('auditor_sub_category', function () { + return { + filters: { + compliance_category: frm.doc.auditor_category + } + } + }) } }); -let create_projects_manually_perticular_date = function(frm){ - //function to set the craete of compliance project manually - let d = new frappe.ui.Dialog({ - title: 'Manual Project Creation', - fields: [ - { - label: 'Starting Date', - fieldname: 'starting_date', - fieldtype: 'Date', - reqd: 1 - }, - ], - primary_action_label: 'Create Project', - primary_action(values) { - if(values.starting_date){ - frappe.call({ - method:'one_compliance.one_compliance.doctype.compliance_settings.compliance_settings.manual_project_creations', - args:{ - 'starting_date': values.starting_date, - }, - callback:function(r){ - if (r.message) { - frm.reload_doc() - } - } - }); - } - d.hide(); - } - }); - d.show(); +let create_projects_manually_perticular_date = function (frm) { + //function to set the craete of compliance project manually + let d = new frappe.ui.Dialog({ + title: 'Manual Project Creation', + fields: [ + { + label: 'Starting Date', + fieldname: 'starting_date', + fieldtype: 'Date', + reqd: 1 + }, + ], + primary_action_label: 'Create Project', + primary_action(values) { + if (values.starting_date) { + frappe.call({ + method: 'one_compliance.one_compliance.doctype.compliance_settings.compliance_settings.manual_project_creations', + args: { + 'starting_date': values.starting_date, + }, + callback: function (r) { + if (r.message) { + frm.reload_doc() + } + } + }); + } + d.hide(); + } + }); + d.show(); } -let change_perticular_compliance_date = function(frm){ - //function to change the compliance date manually - let d = new frappe.ui.Dialog({ - title: 'Compliance Date Updation', - fields: [ - { - label: 'Compliance Date', - fieldname: 'compliance_date', - fieldtype: 'Date', - reqd: 1 - }, - { - label: 'Compliance Agreement', - fieldname: 'compliance_agreement', - fieldtype: 'Link', - options: 'Compliance Agreement' - }, - ], - primary_action_label: 'Change Compliance Date', - primary_action(values) { - if(values.compliance_date){ - frappe.call({ - method:'one_compliance.one_compliance.doctype.compliance_settings.compliance_settings.compliance_date_update', - args:{ - 'compliance_date': values.compliance_date, +let change_perticular_compliance_date = function (frm) { + //function to change the compliance date manually + let d = new frappe.ui.Dialog({ + title: 'Compliance Date Updation', + fields: [ + { + label: 'Compliance Date', + fieldname: 'compliance_date', + fieldtype: 'Date', + reqd: 1 + }, + { + label: 'Compliance Agreement', + fieldname: 'compliance_agreement', + fieldtype: 'Link', + options: 'Compliance Agreement' + }, + ], + primary_action_label: 'Change Compliance Date', + primary_action(values) { + if (values.compliance_date) { + frappe.call({ + method: 'one_compliance.one_compliance.doctype.compliance_settings.compliance_settings.compliance_date_update', + args: { + 'compliance_date': values.compliance_date, 'compliance_agreement': values.compliance_agreement, - }, - callback:function(r){ - if (r.message) { - frm.reload_doc() - } - } - }); - } - d.hide(); - } - }); - d.show(); + }, + callback: function (r) { + if (r.message) { + frm.reload_doc() + } + } + }); + } + d.hide(); + } + }); + d.show(); } diff --git a/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.py b/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.py index d0f7a102..338ed3a7 100644 --- a/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.py +++ b/one_compliance/one_compliance/doctype/compliance_settings/compliance_settings.py @@ -8,7 +8,6 @@ create_sales_orders_from_compliance_agreements, ) - class ComplianceSettings(Document): pass