diff --git a/.eslintrc b/.eslintrc index f901372..03aca2c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -35,6 +35,9 @@ "no-control-regex": [ "off" ], + "no-prototype-builtins": "off", + "no-unsafe-optional-chaining": "off", + "no-empty": "warn" }, "root": true, "globals": { @@ -132,6 +135,22 @@ "after": true, "qz": true, "localforage": true, - "extend_cscript": true + "extend_cscript": true, + "callAPI": true, + "apply_filter": true, + "extend_options_length": true, + "hide_advance_search": true, + "addTableFilter": true, + "scheme_list": true, + "generateDOBFromAge": true, + "get_occupation_category": true, + "render_scheme_datatable": true, + "truncate_multiple_fields_value": true, + "get_document": true, + "apply_filter_on_id_document": true, + "get_ordered_list": true, + "support_items": true, + "SchemeEligibleBen": true, + "_doc": true } } \ No newline at end of file diff --git a/myojana/__init__.py b/myojana/__init__.py index 7a0660b..f102a9c 100644 --- a/myojana/__init__.py +++ b/myojana/__init__.py @@ -1,3 +1 @@ - -__version__ = '0.0.1' - +__version__ = "0.0.1" diff --git a/myojana/api.py b/myojana/api.py index 7a80fb2..735789c 100644 --- a/myojana/api.py +++ b/myojana/api.py @@ -1,41 +1,50 @@ +import json + import frappe + from myojana.services.beneficiary_scheme import BeneficaryScheme +from myojana.utils.htmltoimg import create_image from myojana.utils.misc import Misc + # from myojana.utils.filter import Filter from myojana.utils.report_filter import ReportFilter -import json -from myojana.utils.htmltoimg import create_image @frappe.whitelist(allow_guest=True) def get_image(ben_id): - return create_image(ben_id) + return create_image(ben_id) + @frappe.whitelist(allow_guest=True) def get_mYojana_settings(): - return frappe.get_doc('mYojana Settings') + return frappe.get_doc("mYojana Settings") + @frappe.whitelist(allow_guest=True) def get_installed_apps(): - installed_apps = frappe.get_installed_apps() - return installed_apps + installed_apps = frappe.get_installed_apps() + return installed_apps + def create_condition(scheme, _tbl_pre=""): - if isinstance(scheme, str): - raise "No rules" - user_role_filter = ReportFilter.set_report_filters() - cond_str = Misc.create_condition(scheme.rules) - filters = [] - if cond_str: - filters.append(cond_str) - if user_role_filter: - filters.append(user_role_filter) - return " WHERE 1=1 "+ (f"AND {' AND '.join(filters)}" if len(filters) else "") + if isinstance(scheme, str): + raise ValueError("No rules") + user_role_filter = ReportFilter.set_report_filters() + cond_str = Misc.create_condition(scheme.rules) + filters = [] + if cond_str: + filters.append(cond_str) + if user_role_filter: + filters.append(user_role_filter) + return " WHERE 1=1 " + (f"AND {' AND '.join(filters)}" if len(filters) else "") + -def get_beneficiary_scheme_query(scheme_doc,start=0,page_limit=10,is_limit=False,filters=[]): - availed_sql = f"" - if scheme_doc.get('how_many_times_can_this_scheme_be_availed') == 'Once': - availed_sql = f""" +def get_beneficiary_scheme_query(scheme_doc, start=0, page_limit=10, is_limit=False, filters=None): + if filters is None: + filters = [] + availed_sql = "" + if scheme_doc.get("how_many_times_can_this_scheme_be_availed") == "Once": + availed_sql = f""" AND name not in ( select distinct parent @@ -49,32 +58,32 @@ def get_beneficiary_scheme_query(scheme_doc,start=0,page_limit=10,is_limit=False status IN ('Completed','Availed') ) """ - condition = create_condition(scheme_doc) - filter_condition = "" - ward_filter = "" - primary_member_filter= "" - pm_join_type = "LEFT JOIN" - ward_join_type = "LEFT JOIN" - if len(filters): - for filter_item in json.loads(filters): # Convert filters from string to list - for filter_key, filter_value in filter_item.items(): - if filter_key == 'name_of_the_beneficiary': - filter_condition += f" AND LOWER({filter_key}) LIKE LOWER('{filter_value}%')" - elif filter_key == 'contact_number': - filter_condition += f" AND {filter_key} LIKE '%{filter_value}%'" - elif filter_key == 'block_name': - ward_filter += f" AND LOWER(block_name) LIKE LOWER('{filter_value}%')" - ward_join_type = "INNER JOIN" - elif filter_key == 'name_of_parents': - primary_member_filter += f" AND LOWER(name_of_parents) LIKE LOWER('{filter_value}%')" - pm_join_type = "INNER JOIN" - else: - pm_join_type = "LEFT JOIN" - ward_join_type = "LEFT JOIN" - pagination = "" - if is_limit: - pagination = f"LIMIT {page_limit} OFFSET {start}" - sql = f""" + condition = create_condition(scheme_doc) + filter_condition = "" + ward_filter = "" + primary_member_filter = "" + pm_join_type = "LEFT JOIN" + ward_join_type = "LEFT JOIN" + if len(filters): + for filter_item in json.loads(filters): # Convert filters from string to list + for filter_key, filter_value in filter_item.items(): + if filter_key == "name_of_the_beneficiary": + filter_condition += f" AND LOWER({filter_key}) LIKE LOWER('{filter_value}%')" + elif filter_key == "contact_number": + filter_condition += f" AND {filter_key} LIKE '%{filter_value}%'" + elif filter_key == "block_name": + ward_filter += f" AND LOWER(block_name) LIKE LOWER('{filter_value}%')" + ward_join_type = "INNER JOIN" + elif filter_key == "name_of_parents": + primary_member_filter += f" AND LOWER(name_of_parents) LIKE LOWER('{filter_value}%')" + pm_join_type = "INNER JOIN" + else: + pm_join_type = "LEFT JOIN" + ward_join_type = "LEFT JOIN" + pagination = "" + if is_limit: + pagination = f"LIMIT {page_limit} OFFSET {start}" + sql = f""" SELECT _ben.*, _pm.name_of_parents AS name_of_parents, @@ -88,12 +97,15 @@ def get_beneficiary_scheme_query(scheme_doc,start=0,page_limit=10,is_limit=False ORDER BY select_primary_member DESC {pagination} """ - return sql + return sql + -def get_total_beneficiary_count_query(scheme_doc , start=0,page_limit=10,filters=[]): - availed_sql = f"" - if scheme_doc.get('how_many_times_can_this_scheme_be_availed') == 'Once': - availed_sql = f""" +def get_total_beneficiary_count_query(scheme_doc, start=0, page_limit=10, filters=None): + if filters is None: + filters = [] + availed_sql = "" + if scheme_doc.get("how_many_times_can_this_scheme_be_availed") == "Once": + availed_sql = f""" AND name not in ( select distinct parent @@ -107,30 +119,30 @@ def get_total_beneficiary_count_query(scheme_doc , start=0,page_limit=10,filters status IN ('Completed','Availed') ) """ - condition = create_condition(scheme_doc) - filter_condition = "" - ward_filter = "" - primary_member_filter= "" - pm_join_type = "LEFT JOIN" - ward_join_type = "LEFT JOIN" - if len(filters): - for filter_item in json.loads(filters): # Convert filters from string to list - for filter_key, filter_value in filter_item.items(): - if filter_key == 'name_of_the_beneficiary': - filter_condition += f" AND {filter_key} LIKE '{filter_value}%'" - elif filter_key == 'contact_number': - filter_condition += f" AND {filter_key} LIKE '%{filter_value}%'" - elif filter_key == 'block_name': - ward_filter += f" AND block_name LIKE '{filter_value}%'" - ward_join_type = "INNER JOIN" - elif filter_key == 'name_of_parents': - primary_member_filter += f" AND name_of_parents LIKE '{filter_value}%'" - pm_join_type = "INNER JOIN" - else: - pm_join_type = "LEFT JOIN" - ward_join_type = "LEFT JOIN" + condition = create_condition(scheme_doc) + filter_condition = "" + ward_filter = "" + primary_member_filter = "" + pm_join_type = "LEFT JOIN" + ward_join_type = "LEFT JOIN" + if len(filters): + for filter_item in json.loads(filters): # Convert filters from string to list + for filter_key, filter_value in filter_item.items(): + if filter_key == "name_of_the_beneficiary": + filter_condition += f" AND {filter_key} LIKE '{filter_value}%'" + elif filter_key == "contact_number": + filter_condition += f" AND {filter_key} LIKE '%{filter_value}%'" + elif filter_key == "block_name": + ward_filter += f" AND block_name LIKE '{filter_value}%'" + ward_join_type = "INNER JOIN" + elif filter_key == "name_of_parents": + primary_member_filter += f" AND name_of_parents LIKE '{filter_value}%'" + pm_join_type = "INNER JOIN" + else: + pm_join_type = "LEFT JOIN" + ward_join_type = "LEFT JOIN" - sql = f""" + sql = f""" SELECT _ben.*, _ben.select_primary_member AS name_of_parents, @@ -143,37 +155,36 @@ def get_total_beneficiary_count_query(scheme_doc , start=0,page_limit=10,filters LEFT JOIN `tabVillage` _vl ON _vl.name = _ben.name_of_the_settlement ORDER BY select_primary_member DESC """ - # LIMIT {page_limit} OFFSET {start} - return sql + # LIMIT {page_limit} OFFSET {start} + return sql + + @frappe.whitelist(allow_guest=True) def execute(name=None): - return BeneficaryScheme.get_schemes(name) + return BeneficaryScheme.get_schemes(name) + @frappe.whitelist(allow_guest=True) -def eligible_beneficiaries(scheme=None, columns=[], filters=[], start=0, page_imit=10,is_limit=False): - # filter value is getting hear - # print("filter", filters) - columns = json.loads(columns) - if scheme is None: - return frappe.throw('Scheme not found.') - scheme_doc = frappe.get_doc('Scheme',scheme) - res = { - 'data':[], - 'count':{ - 'total':0, - 'total_family':0, - 'block_count':0, - 'settlement_count':0 - } - } - if not scheme_doc: - return res +def eligible_beneficiaries(scheme=None, columns=None, filters=None, start=0, page_imit=10, is_limit=False): + # filter value is getting hear + # print("filter", filters) + if filters is None: + filters = [] + if columns is None: + columns = [] + columns = json.loads(columns) + if scheme is None: + return frappe.throw("Scheme not found.") + scheme_doc = frappe.get_doc("Scheme", scheme) + res = {"data": [], "count": {"total": 0, "total_family": 0, "block_count": 0, "settlement_count": 0}} + if not scheme_doc: + return res - ben_sql = get_beneficiary_scheme_query(scheme_doc,start,page_imit,is_limit,filters) - # print(ben_sql) - total_count_sql = get_total_beneficiary_count_query(scheme_doc , start,page_imit,filters) - res['data'] = frappe.db.sql(ben_sql, as_dict=True) - count_sql = f""" + ben_sql = get_beneficiary_scheme_query(scheme_doc, start, page_imit, is_limit, filters) + # print(ben_sql) + total_count_sql = get_total_beneficiary_count_query(scheme_doc, start, page_imit, filters) + res["data"] = frappe.db.sql(ben_sql, as_dict=True) + count_sql = f""" select count(distinct _tbl.name) as total, count(distinct _tbl.select_primary_member) as family_count, @@ -182,76 +193,85 @@ def eligible_beneficiaries(scheme=None, columns=[], filters=[], start=0, page_im from ({total_count_sql}) _tbl """ - count_data = frappe.db.sql(count_sql, as_dict=True) - if len(count_data): - res['count'].update(count_data[0]) - return res + count_data = frappe.db.sql(count_sql, as_dict=True) + if len(count_data): + res["count"].update(count_data[0]) + return res + @frappe.whitelist(allow_guest=True) def most_eligible_ben(): - scheam_ben_count =[] - scheame_query = f"""select name from `tabScheme` """ - get_all_scheame = frappe.db.sql(scheame_query, as_dict=True) - for scheme in get_all_scheame: - get_rules = f"""select rule_field, operator, data from `tabScheme` as _ts JOIN `tabRule Engine Child` as _tsc on _tsc.parent = _ts.name where _ts.name_of_the_scheme ='{scheme.name.replace("'", "''")}';""" + scheam_ben_count = [] + scheame_query = """select name from `tabScheme` """ + get_all_scheame = frappe.db.sql(scheame_query, as_dict=True) + for scheme in get_all_scheame: + get_rules = f"""select rule_field, operator, data from `tabScheme` as _ts JOIN `tabRule Engine Child` as _tsc on _tsc.parent = _ts.name where _ts.name_of_the_scheme ='{scheme.name.replace("'", "''")}';""" + + # get_rules = f"""select rule_field, operator, data from `tabScheme` as _ts JOIN `tabRule Engine Child` as _tsc on _tsc.parent = _ts.name where _ts.name_of_the_scheme ='{scheme.name}';""" + rules = frappe.db.sql(get_rules, as_dict=True) + condition_str = "" + if rules: + for rule in rules: + condition_str = f"""{condition_str} {rule.rule_field} {rule.operator} '{rule.data}' AND""" + # condition_str = f"{condition_str} " + else: + condition_str = "" + get_elegible_ben = f""" SELECT count(name) as abc FROM `tabBeneficiary Profiling` WHERE{condition_str} 1=1 order by abc DESC""" + all_ben = frappe.db.sql(get_elegible_ben, as_dict=True) + sch_ben = {"scheam": scheme.name, "bencount": all_ben[0].abc} + scheam_ben_count.append(sch_ben) + sorted_schemes = sorted(scheam_ben_count, key=lambda x: x["bencount"], reverse=True) + # Get the top 5 schemes + top_5_schemes = sorted_schemes[:5] + return top_5_schemes - # get_rules = f"""select rule_field, operator, data from `tabScheme` as _ts JOIN `tabRule Engine Child` as _tsc on _tsc.parent = _ts.name where _ts.name_of_the_scheme ='{scheme.name}';""" - rules = frappe.db.sql(get_rules, as_dict=True) - condition_str ="" - if rules: - for rule in rules: - condition_str = f"""{condition_str} {rule.rule_field} {rule.operator} '{rule.data}' AND""" - # condition_str = f"{condition_str} " - else: - condition_str = "" - get_elegible_ben = f""" SELECT count(name) as abc FROM `tabBeneficiary Profiling` WHERE{condition_str} 1=1 order by abc DESC""" - all_ben = frappe.db.sql(get_elegible_ben, as_dict=True) - sch_ben = {"scheam": scheme.name , "bencount": all_ben[0].abc} - scheam_ben_count.append(sch_ben) - sorted_schemes = sorted(scheam_ben_count, key=lambda x: x["bencount"], reverse=True) - # Get the top 5 schemes - top_5_schemes = sorted_schemes[:5] - return top_5_schemes @frappe.whitelist(allow_guest=True) def top_schemes(): - milestones = frappe.get_list("Milestone category", fields=['name']) - # user_role_filter = Filter.set_query_filters() - # user_grole_filter will apply on condtional string - scheme_with_rule_sql = f""" + milestones = frappe.get_list("Milestone category", fields=["name"]) + # user_role_filter = Filter.set_query_filters() + # user_grole_filter will apply on condtional string + scheme_with_rule_sql = """ select distinct parent from `tabRule Engine Child` """ - scheme_with_rules = frappe.db.sql(scheme_with_rule_sql, as_dict=True) - scheme_list = [sc.get('parent') for sc in scheme_with_rules] - for milestone in milestones: - schemes = frappe.get_list("Scheme", filters={'milestone':milestone.name, 'name':["IN",scheme_list], 'enabled': '1'}, fields=['name']) - for scheme in schemes: - scheme['ben_count'] = 0 - scheme_doc = frappe.get_doc('Scheme',scheme.name) - ben_sql = get_beneficiary_scheme_query(scheme_doc) - count_sql = f""" + scheme_with_rules = frappe.db.sql(scheme_with_rule_sql, as_dict=True) + scheme_list = [sc.get("parent") for sc in scheme_with_rules] + for milestone in milestones: + schemes = frappe.get_list( + "Scheme", + filters={"milestone": milestone.name, "name": ["IN", scheme_list], "enabled": "1"}, + fields=["name"], + ) + for scheme in schemes: + scheme["ben_count"] = 0 + scheme_doc = frappe.get_doc("Scheme", scheme.name) + ben_sql = get_beneficiary_scheme_query(scheme_doc) + count_sql = f""" select count(distinct _tbl.name) as total from ({ben_sql}) as _tbl """ - # print(count_sql) - count_data = frappe.db.sql(count_sql, as_dict=True) - if len(count_data): - scheme['ben_count'] = count_data[0].total - sorted_schemes = sorted(schemes, key=lambda x: x.get('ben_count', 0), reverse=True) - milestone['schemes'] = sorted_schemes[:5] - return milestones + # print(count_sql) + count_data = frappe.db.sql(count_sql, as_dict=True) + if len(count_data): + scheme["ben_count"] = count_data[0].total + sorted_schemes = sorted(schemes, key=lambda x: x.get("ben_count", 0), reverse=True) + milestone["schemes"] = sorted_schemes[:5] + return milestones + -#Code is not reflecting +# Code is not reflecting @frappe.whitelist() -def get_user_permission(user, join_con=[]): - sql_query = f""" +def get_user_permission(user, join_con=None): + if join_con is None: + join_con = [] + sql_query = f""" SELECT CASE WHEN LOWER(UP.allow) = 'state' THEN TS.state_name @@ -274,4 +294,4 @@ def get_user_permission(user, join_con=[]): LEFT JOIN `tabSub Centre` AS TCS ON UP.for_value = TCS.name AND LOWER(UP.allow) = 'sub centre' WHERE UP.user = '{user}' """ - return frappe.db.sql(sql_query, as_dict=True) + return frappe.db.sql(sql_query, as_dict=True) diff --git a/myojana/apis/get_doctype_meta.py b/myojana/apis/get_doctype_meta.py index ede83a5..274544f 100644 --- a/myojana/apis/get_doctype_meta.py +++ b/myojana/apis/get_doctype_meta.py @@ -1,22 +1,31 @@ import frappe + @frappe.whitelist() -def get_allowed_doctype(doctype_name="Beneficiary Profiling", field_types='Link', options=None): - meta = frappe.get_meta(doctype_name) - - if options is not None: - filtered_fields = [{ - "label": field.label, - "value": field.fieldname, - "type": field.fieldtype, - "options": field.options - } for field in meta.fields if field.fieldtype in field_types and field.options == options] - else: - filtered_fields = [{ - "label": field.label, - "value": field.fieldname, - "type": field.fieldtype, - "options": field.options - } for field in meta.fields if field.fieldtype in field_types] +def get_allowed_doctype(doctype_name="Beneficiary Profiling", field_types="Link", options=None): + meta = frappe.get_meta(doctype_name) + + if options is not None: + filtered_fields = [ + { + "label": field.label, + "value": field.fieldname, + "type": field.fieldtype, + "options": field.options, + } + for field in meta.fields + if field.fieldtype in field_types and field.options == options + ] + else: + filtered_fields = [ + { + "label": field.label, + "value": field.fieldname, + "type": field.fieldtype, + "options": field.options, + } + for field in meta.fields + if field.fieldtype in field_types + ] - return filtered_fields + return filtered_fields diff --git a/myojana/apis/html_to_image.py b/myojana/apis/html_to_image.py index 16d6a06..6a790c7 100644 --- a/myojana/apis/html_to_image.py +++ b/myojana/apis/html_to_image.py @@ -1,99 +1,118 @@ +import base64 +import json +import os + import frappe import imgkit -import base64 -from frappe.utils.jinja import render_template -from frappe.utils.file_manager import save_file,get_file from frappe import _ -import os -import json from frappe.utils import get_site_path +from frappe.utils.file_manager import get_file, save_file +from frappe.utils.jinja import render_template + def get_attachment_fields(doctype_name, doc): - meta = frappe.get_meta(doctype_name) - attachment_fields = [] - for field in meta.fields: - field_value = doc.get(field.fieldname) - if field_value: - if field.fieldtype in ['Attach', 'Attach Image']: - attachment_fields.append(field.fieldname) - - return attachment_fields + meta = frappe.get_meta(doctype_name) + attachment_fields = [] + for field in meta.fields: + field_value = doc.get(field.fieldname) + if field_value: + if field.fieldtype in ["Attach", "Attach Image"]: + attachment_fields.append(field.fieldname) + + return attachment_fields + def file_to_base64(file_path): - with open(file_path, "rb") as file: - return base64.b64encode(file.read()).decode('utf-8') + with open(file_path, "rb") as file: + return base64.b64encode(file.read()).decode("utf-8") + @frappe.whitelist(allow_guest=True) def create_image(ref_doc, tepmlate_name): - template = frappe.get_doc("App Template", tepmlate_name) - context,doc = set_context_data(template.ref_doctype,ref_doc) - try: - options = json.loads(options) - except: - options = None - if not options: - options = { - 'width': 547, - 'height': 373, - } - - try: - processed_html = render_template(template.html, context) - image_binary = imgkit.from_string(processed_html, False, options=options) - file = save_file(f"{doc.name}.png", image_binary, template.ref_doctype, doc.name, folder=None, decode=False, is_private=0, df=None) - return file,doc - except Exception as e: - print("Exception::",e) - frappe.log_error(f"Error in rendering template: {e}", "Check Syntax") - return None,None - + template = frappe.get_doc("App Template", tepmlate_name) + context, doc = set_context_data(template.ref_doctype, ref_doc) + try: + options = json.loads(options) + except Exception: + options = None + if not options: + options = { + "width": 547, + "height": 373, + } + + try: + processed_html = render_template(template.html, context) + image_binary = imgkit.from_string(processed_html, False, options=options) + file = save_file( + f"{doc.name}.png", + image_binary, + template.ref_doctype, + doc.name, + folder=None, + decode=False, + is_private=0, + df=None, + ) + return file, doc + except Exception as e: + print("Exception::", e) + frappe.log_error(f"Error in rendering template: {e}", "Check Syntax") + return None, None + + def sanitize_file_path(original_file_path): - # if we are in a private file system, we need to remove the private files path - if original_file_path.startswith('/files/'): - return original_file_path.replace('/files/', '/public/files/') - return original_file_path + # if we are in a private file system, we need to remove the private files path + if original_file_path.startswith("/files/"): + return original_file_path.replace("/files/", "/public/files/") + return original_file_path + + def set_context_data(doctype, name): - doc = frappe.get_doc(doctype, name) - attachment_fields = get_attachment_fields(doctype , doc) - for field in attachment_fields: - file_url = doc.get(field) - if file_url: - file_path = frappe.get_site_path(sanitize_file_path(file_url).lstrip('/')) - if os.path.isfile(file_path): - base64_data = f"data:image/png;base64,{file_to_base64(file_path)}" - doc.set(field, base64_data) - return doc.as_dict(),doc + doc = frappe.get_doc(doctype, name) + attachment_fields = get_attachment_fields(doctype, doc) + for field in attachment_fields: + file_url = doc.get(field) + if file_url: + file_path = frappe.get_site_path(sanitize_file_path(file_url).lstrip("/")) + if os.path.isfile(file_path): + base64_data = f"data:image/png;base64,{file_to_base64(file_path)}" + doc.set(field, base64_data) + return doc.as_dict(), doc + + @frappe.whitelist(allow_guest=True) def preview_image(doctype, doc, template, options=None): - context, doc = set_context_data(doctype,doc) - # return template, context - try: - processed_html = render_template(template, context) - except Exception as e: - print("Exception::",e) - frappe.log_error(f"Error in rendering template: {e}", "Check Syntax") - return None - - try: - options = json.loads(options) - except: - options = None - if not options: - options = { - 'width': 547, - 'height': 373, - } - image_binary = imgkit.from_string(processed_html, False, options=options) - return base64.b64encode(image_binary).decode('utf-8') + context, doc = set_context_data(doctype, doc) + # return template, context + try: + processed_html = render_template(template, context) + except Exception as e: + print("Exception::", e) + frappe.log_error(f"Error in rendering template: {e}", "Check Syntax") + return None + + try: + options = json.loads(options) + except Exception: + options = None + if not options: + options = { + "width": 547, + "height": 373, + } + image_binary = imgkit.from_string(processed_html, False, options=options) + return base64.b64encode(image_binary).decode("utf-8") + @frappe.whitelist(allow_guest=True) def preview_doc_template(doc): - template_name = frappe.db.get_single_value('mYojana Settings', 'id_card_template') - if not template_name: - frappe.throw(_("Please set ID Card Template in mYojana Settings")) - print("template_name",template_name) - template = frappe.get_doc('App Template', template_name) - if not template: - frappe.throw(_("Please set ID Card Template in Whats App Template")) - - return preview_image(template.ref_doctype, doc, template.html) \ No newline at end of file + template_name = frappe.db.get_single_value("mYojana Settings", "id_card_template") + if not template_name: + frappe.throw(_("Please set ID Card Template in mYojana Settings")) + print("template_name", template_name) + template = frappe.get_doc("App Template", template_name) + if not template: + frappe.throw(_("Please set ID Card Template in Whats App Template")) + + return preview_image(template.ref_doctype, doc, template.html) diff --git a/myojana/apis/load_test.py b/myojana/apis/load_test.py index 73f3a53..c8c21a5 100644 --- a/myojana/apis/load_test.py +++ b/myojana/apis/load_test.py @@ -1,217 +1,480 @@ -import frappe import datetime import random import string import uuid +import frappe + + def generate_random_indian_phone_number(): - first_digit = random.choice([6,7, 8, 9]) - rest_digits = ''.join(random.choices('0123456789', k=9)) - phone_number = str(first_digit) + rest_digits - return phone_number + first_digit = random.choice([6, 7, 8, 9]) + rest_digits = "".join(random.choices("0123456789", k=9)) + phone_number = str(first_digit) + rest_digits + return phone_number + def generate_indian_name(gender): - male_names = ["Aarav", "Vikram", "Arjun", "Rahul", "Aryan", "Rohan", "Kabir", "Aditya", "Shivam", "Krishna", - "Amit", "Ankit", "Ashish", "Alok", "Avinash", "Akshay", "Ayush", "Bhaskar", "Chandan", "Dheeraj", - "Deepak", "Gaurav", "Ganesh", "Hitesh", "Harsh", "Himanshu", "Jatin", "Jagdish", "Karan", "Kunal", - "Lalit", "Manish", "Mukesh", "Nitin", "Nikhil", "Pawan", "Prateek", "Rajesh", "Ravi", "Sachin", - "Sanjay", "Saurabh", "Sumit", "Tarun", "Utkarsh", "Vivek", "Yogesh", "Abhinav", "Arun", "Avinash", - "Alok", "Bhuvan", "Chirag", "Devendra", "Dinesh", "Dilip", "Girish", "Govind", "Hari", "Jagat", - "Jitendra", "Kamal", "Kishan", "Laxman", "Mahesh", "Mohan", "Naveen", "Pankaj", "Pradeep", "Rajiv", - "Rakesh", "Ramesh", "Sandeep", "Satish", "Shyam", "Sunil", "Surendra", "Vikas", "Vinod", "Yash"] - female_names = ["Aaradhya", "Isha", "Sakshi", "Priya", "Ananya", "Diya", "Kavya", "Trisha", "Mira", "Neha", - "Anjali", "Bhavna", "Chitra", "Deepika", "Divya", "Ekta", "Jyoti", "Komal", "Pooja", "Rashmi", - "Sunita", "Vandana", "Varsha", "Vidya", "Ambika", "Asha", "Aarti", "Anuradha", "Geeta", "Ganga", - "Hema", "Indira", "Kiran", "Lakshmi", "Mamta", "Meena", "Neeta", "Poonam", "Radha", "Rani", - "Renuka", "Rekha", "Seema", "Sharda", "Shanti", "Sita", "Sarita", "Sarla", "Savita", "Tanuja", - "Uma", "Vijaya", "Veena", "Yamini", "Zara", "Aradhana", "Aparna", "Bhavani", "Chanchal", "Darshana", - "Deepti", "Gauri", "Harsha", "Ila", "Jayanti", "Kamala", "Leela", "Madhuri", "Malini", "Nalini", - "Padmini", "Rajani", "Shashi", "Sonal", "Suchitra", "Vidhi", "Yogita", "Jaya", "Meera", "Nisha"] - surnames = ["Patel", "Shah", "Desai", "Mehta", "Joshi", "Sharma", "Gupta", "Shah", "Singh", "Verma", - "Trivedi", "Pandey", "Yadav", "Patil", "Soni", "Mishra", "Das", "Kumar", "Chauhan", "Gandhi", - "Saxena", "Agarwal", "Choudhury", "Bose", "Banerjee", "Dutta", "Chatterjee", "Mukherjee", "Sen", - "Nair", "Menon", "Iyer", "Reddy", "Rao", "Rajan", "Naidu", "Kulkarni", "Gowda", "Shetty", - "Rajput", "Rawat", "Singh", "Chauhan", "Thakur", "Sinha", "Pathak", "Goswami", "Jha", - "Bhattacharya", "Dutta", "Mitra", "Ghosh", "Ray", "Roy", "Malhotra", "Acharya", "Shrestha", - "Rana", "Subedi", "Bhandari", "Shakya", "Gurung", "Tamang", "Thapa", "Bhattarai", "Lama", - "Dhakal", "Rai", "Adhikari", "Maharjan", "Koirala", "Poudel", "Basnet", "Pandit", "Sharma", - "Pokharel", "Magar", "Khanal", "Shahi", "Giri", "Dahal", "Khatri", "Panta", "Joshi", - "Shrestha", "Bista", "Pariyar", "Sherpa", "Neupane", "Bhatta", "Shah", "Thakali", "Panta"] - - if gender == "Male": - return f"{random.choice(male_names)} {random.choice(surnames)}" - elif gender == "Female": - return f"{random.choice(female_names)} {random.choice(surnames)}" - elif gender == "Transgender": - return f"{random.choice(male_names)} {random.choice(surnames)}" - elif gender == "Others": - return f"{random.choice(male_names)} {random.choice(surnames)}" - else: - return "Invalid gender specified. Please choose from 'male', 'female', or 'others'." - + male_names = [ + "Aarav", + "Vikram", + "Arjun", + "Rahul", + "Aryan", + "Rohan", + "Kabir", + "Aditya", + "Shivam", + "Krishna", + "Amit", + "Ankit", + "Ashish", + "Alok", + "Avinash", + "Akshay", + "Ayush", + "Bhaskar", + "Chandan", + "Dheeraj", + "Deepak", + "Gaurav", + "Ganesh", + "Hitesh", + "Harsh", + "Himanshu", + "Jatin", + "Jagdish", + "Karan", + "Kunal", + "Lalit", + "Manish", + "Mukesh", + "Nitin", + "Nikhil", + "Pawan", + "Prateek", + "Rajesh", + "Ravi", + "Sachin", + "Sanjay", + "Saurabh", + "Sumit", + "Tarun", + "Utkarsh", + "Vivek", + "Yogesh", + "Abhinav", + "Arun", + "Avinash", + "Alok", + "Bhuvan", + "Chirag", + "Devendra", + "Dinesh", + "Dilip", + "Girish", + "Govind", + "Hari", + "Jagat", + "Jitendra", + "Kamal", + "Kishan", + "Laxman", + "Mahesh", + "Mohan", + "Naveen", + "Pankaj", + "Pradeep", + "Rajiv", + "Rakesh", + "Ramesh", + "Sandeep", + "Satish", + "Shyam", + "Sunil", + "Surendra", + "Vikas", + "Vinod", + "Yash", + ] + female_names = [ + "Aaradhya", + "Isha", + "Sakshi", + "Priya", + "Ananya", + "Diya", + "Kavya", + "Trisha", + "Mira", + "Neha", + "Anjali", + "Bhavna", + "Chitra", + "Deepika", + "Divya", + "Ekta", + "Jyoti", + "Komal", + "Pooja", + "Rashmi", + "Sunita", + "Vandana", + "Varsha", + "Vidya", + "Ambika", + "Asha", + "Aarti", + "Anuradha", + "Geeta", + "Ganga", + "Hema", + "Indira", + "Kiran", + "Lakshmi", + "Mamta", + "Meena", + "Neeta", + "Poonam", + "Radha", + "Rani", + "Renuka", + "Rekha", + "Seema", + "Sharda", + "Shanti", + "Sita", + "Sarita", + "Sarla", + "Savita", + "Tanuja", + "Uma", + "Vijaya", + "Veena", + "Yamini", + "Zara", + "Aradhana", + "Aparna", + "Bhavani", + "Chanchal", + "Darshana", + "Deepti", + "Gauri", + "Harsha", + "Ila", + "Jayanti", + "Kamala", + "Leela", + "Madhuri", + "Malini", + "Nalini", + "Padmini", + "Rajani", + "Shashi", + "Sonal", + "Suchitra", + "Vidhi", + "Yogita", + "Jaya", + "Meera", + "Nisha", + ] + surnames = [ + "Patel", + "Shah", + "Desai", + "Mehta", + "Joshi", + "Sharma", + "Gupta", + "Shah", + "Singh", + "Verma", + "Trivedi", + "Pandey", + "Yadav", + "Patil", + "Soni", + "Mishra", + "Das", + "Kumar", + "Chauhan", + "Gandhi", + "Saxena", + "Agarwal", + "Choudhury", + "Bose", + "Banerjee", + "Dutta", + "Chatterjee", + "Mukherjee", + "Sen", + "Nair", + "Menon", + "Iyer", + "Reddy", + "Rao", + "Rajan", + "Naidu", + "Kulkarni", + "Gowda", + "Shetty", + "Rajput", + "Rawat", + "Singh", + "Chauhan", + "Thakur", + "Sinha", + "Pathak", + "Goswami", + "Jha", + "Bhattacharya", + "Dutta", + "Mitra", + "Ghosh", + "Ray", + "Roy", + "Malhotra", + "Acharya", + "Shrestha", + "Rana", + "Subedi", + "Bhandari", + "Shakya", + "Gurung", + "Tamang", + "Thapa", + "Bhattarai", + "Lama", + "Dhakal", + "Rai", + "Adhikari", + "Maharjan", + "Koirala", + "Poudel", + "Basnet", + "Pandit", + "Sharma", + "Pokharel", + "Magar", + "Khanal", + "Shahi", + "Giri", + "Dahal", + "Khatri", + "Panta", + "Joshi", + "Shrestha", + "Bista", + "Pariyar", + "Sherpa", + "Neupane", + "Bhatta", + "Shah", + "Thakali", + "Panta", + ] + + if gender == "Male": + return f"{random.choice(male_names)} {random.choice(surnames)}" + elif gender == "Female": + return f"{random.choice(female_names)} {random.choice(surnames)}" + elif gender == "Transgender": + return f"{random.choice(male_names)} {random.choice(surnames)}" + elif gender == "Others": + return f"{random.choice(male_names)} {random.choice(surnames)}" + else: + return "Invalid gender specified. Please choose from 'male', 'female', or 'others'." + + def random_string(length): - letters = string.ascii_lowercase - return ''.join(random.choice(letters) for i in range(length)) + letters = string.ascii_lowercase + return "".join(random.choice(letters) for i in range(length)) def random_date(start, end): - return start + datetime.timedelta( - seconds=random.randint(0, int((end - start).total_seconds())) - ) + return start + datetime.timedelta(seconds=random.randint(0, int((end - start).total_seconds()))) + def calculate_age(date_of_birth): - dob = datetime.datetime.strptime(date_of_birth, "%Y-%m-%d") - current_date = datetime.datetime.now() - age = current_date.year - dob.year - month_diff = current_date.month - dob.month - if month_diff < 0 or (month_diff == 0 and current_date.day < dob.day): - age -= 1 - month_diff += 12 - return age, month_diff + dob = datetime.datetime.strptime(date_of_birth, "%Y-%m-%d") + current_date = datetime.datetime.now() + age = current_date.year - dob.year + month_diff = current_date.month - dob.month + if month_diff < 0 or (month_diff == 0 and current_date.day < dob.day): + age -= 1 + month_diff += 12 + return age, month_diff + disabilities = [ - "Blindness", - "Low vision", - "Leprosy cured persons", - "Locomotor disability", - "Dwarfism", - "Intellectual disability", - "Mental illness", - "Cerebral Palsy", - "Specific learning disability", - "Speech and Language disability", - "Hearing impairment", - "Muscular dystrophy", - "Acid attack victim", - "Parkinson's disease", - "Multiple Sclerosis", - "Thalassemia", - "Hemophilia", - "Sickle cell disease", - "Autism spectrum disorder", - "Chronic neurological conditions", - "Multiple disabilities including deaf and blindness." + "Blindness", + "Low vision", + "Leprosy cured persons", + "Locomotor disability", + "Dwarfism", + "Intellectual disability", + "Mental illness", + "Cerebral Palsy", + "Specific learning disability", + "Speech and Language disability", + "Hearing impairment", + "Muscular dystrophy", + "Acid attack victim", + "Parkinson's disease", + "Multiple Sclerosis", + "Thalassemia", + "Hemophilia", + "Sickle cell disease", + "Autism spectrum disorder", + "Chronic neurological conditions", + "Multiple disabilities including deaf and blindness.", ] + def generate_random_bulk_data(): - Caste_category = frappe.get_list('Caste category',filters={'name': ['!=', 'Others']}, pluck='name') - Schemes = frappe.get_list('Scheme', pluck='name') - Religion = frappe.get_list('Religion',filters={'name': ['!=', 'Others']}, pluck='name') - Education = frappe.get_list('Education',filters={'name': ['!=', 'Others']}, pluck='name') - Occupation = frappe.get_list('Occupation',filters={'name': ['!=', 'Others']}, pluck='name') - Marital_status = frappe.get_list('Marital status',filters={'name': ['!=', 'Others']}, pluck='name') - Sub_Centre = frappe.get_list('Sub Centre', pluck='name') - Source_Of_Information = frappe.get_list( - 'Source Of Information',filters={'name': ['!=', 'Others']}, pluck='name') - Social_vulnerable_category = frappe.get_list( - 'Social vulnerable category',filters={'name': ['!=', 'Others']}, pluck='name') - House_Types = frappe.get_list('House Types',filters={'name': ['!=', 'Others']} ,pluck='name') - ID_Document = frappe.get_list('ID Document', pluck='name') - Village = frappe.get_list( - 'Village', filters={'state': 'S07'}, pluck='name') - date_of_birth = random_date(datetime.datetime( - 1950, 1, 1), datetime.datetime(2010, 1, 1)).strftime("%Y-%m-%d") - completed_age, completed_age_month = calculate_age(date_of_birth) - random_oc = random.choice(Occupation) - random_occ = frappe.get_value( - 'Occupation', random_oc, 'occupational_category') - random_sub_center = random.choice(Sub_Centre) - random_center = frappe.get_value( - 'Sub Centre', random_sub_center, 'centre') - soi = random.choice(Source_Of_Information) - ms = random.choice(Marital_status) - sv = random.choice(["Yes", "No"]) - pwd = random.choice(["Yes", "No"]) - vil = random.choice(Village) - wards = frappe.get_value('Village', vil, 'block') - dis = frappe.get_value('Village', vil, 'district') - any_doc = random.choice(["Yes", "No"]) - weyd = random.choice(["Below 40%","Do not know"]) - scheme = random.choice(Schemes) - Milestone_category = frappe.get_value('Scheme', scheme, 'milestone') - name_of_department = frappe.get_value( - 'Scheme', scheme, 'name_of_department') - random_gender = random.choice(["Male", "Female", "Transgender", "Others"]) - data = { - "date_of_visit": random_date(datetime.datetime(2020, 1, 1), datetime.datetime(2024, 1, 1)).strftime("%Y-%m-%d"), - "name_of_the_beneficiary": generate_indian_name(random_gender), - "gender": random_gender, - "date_of_birth": date_of_birth, - "completed_age": completed_age, - "completed_age_month": completed_age_month, - "contact_number": generate_random_indian_phone_number(), - "centre": random_center, - "sub_centre": random_sub_center, - "source_of_information": soi, - **({"name_of_the_camp": random.choice(frappe.get_list('Camp', pluck='name'))} if soi == 'Camp' else {}), - "has_anyone_from_your_family_visisted_before": 'No', - "caste_category": random.choice(Caste_category), - "religion": random.choice(Religion), - "education": random.choice(Education), - "current_occupation": random_oc, - "occupational_category": random_occ, - "marital_status": ms, - **({"spouses_name": random_string(10)} if ms == 'Married' else {}), - "social_vulnerable": sv, - **({"social_vulnerable_category": random.choice(Social_vulnerable_category)} if sv == 'Yes' else {}), - "are_you_a_person_with_disability_pwd": pwd, - **({"type_of_disability": random.choice(disabilities)} if pwd == 'Yes' else {}), - **({"what_is_the_extent_of_your_disability": weyd} if pwd == 'Yes' else {}), - "annual_income": random.randint(10000, 1000000), - "do_you_have_any_bank_account": random.choice(["Yes", "No"]), - "fathers_name": generate_indian_name("Male"), - "mothers_name": generate_indian_name("Female"), - "added_by": 'Administrator', - "current_house_type": random.choice(House_Types), - "state": 'S07', - "state_of_origin": 'S07', - "district": dis, - "ward": wards, - "name_of_the_settlement": vil, - "do_you_have_any_id_documents": any_doc, - "overall_status":"Partially completed" - } - if any_doc == 'Yes': - for i in range(3): - data.setdefault("id_table_list", []).append({ - "doctype": "ID Document Child", - "enter_id_number": ''.join(random.choice(string.digits) for _ in range(12)), - "which_of_the_following_id_documents_do_you_have": random.choice(ID_Document) - }) - for i in range(5): - application_submitted = random.choice(["Yes", "Completed"]) - data.setdefault("scheme_table", []).append({ - "amount_paid": random.randint(500, 1000), - "application_number": f"APP-{uuid.uuid4().hex[:6]}", - "application_submitted": application_submitted, - "date_of_application": datetime.datetime.now().strftime("%Y-%m-%d"), - "milestone_category": Milestone_category, - "mode_of_application": random.choice(["Online", "Offline"]), - "name_of_the_department": name_of_department, - **({"date_of_completion": datetime.datetime.now().strftime("%Y-%m-%d") if application_submitted == "Completed" else ""}), - "name_of_the_scheme": scheme, - "paid_by": random.choice(["Self", "CSC"]), - "reason_of_application": "any", - "remarks": "any", - "status":"Under process" if application_submitted == "Yes" else "Completed" - }) - data.setdefault("follow_up_table", []).append({ - "follow": random_sub_center, - "follow_up_date": datetime.datetime.now().strftime("%Y-%m-%d"), - "follow_up_mode": random.choice(["Home visit", "Phone call", "Centre visit", "In-person visit"]), - "follow_up_status": "Completed" if application_submitted == "Completed" else "Document submitted", - "follow_up_with": random.choice(["Beneficiary", "Government department", "Government website", "Others"]), - "name_of_the_scheme": scheme, - "remarks": "any" - }) - return data + Caste_category = frappe.get_list("Caste category", filters={"name": ["!=", "Others"]}, pluck="name") + Schemes = frappe.get_list("Scheme", pluck="name") + Religion = frappe.get_list("Religion", filters={"name": ["!=", "Others"]}, pluck="name") + Education = frappe.get_list("Education", filters={"name": ["!=", "Others"]}, pluck="name") + Occupation = frappe.get_list("Occupation", filters={"name": ["!=", "Others"]}, pluck="name") + Marital_status = frappe.get_list("Marital status", filters={"name": ["!=", "Others"]}, pluck="name") + Sub_Centre = frappe.get_list("Sub Centre", pluck="name") + Source_Of_Information = frappe.get_list( + "Source Of Information", filters={"name": ["!=", "Others"]}, pluck="name" + ) + Social_vulnerable_category = frappe.get_list( + "Social vulnerable category", filters={"name": ["!=", "Others"]}, pluck="name" + ) + House_Types = frappe.get_list("House Types", filters={"name": ["!=", "Others"]}, pluck="name") + ID_Document = frappe.get_list("ID Document", pluck="name") + Village = frappe.get_list("Village", filters={"state": "S07"}, pluck="name") + date_of_birth = random_date(datetime.datetime(1950, 1, 1), datetime.datetime(2010, 1, 1)).strftime( + "%Y-%m-%d" + ) + completed_age, completed_age_month = calculate_age(date_of_birth) + random_oc = random.choice(Occupation) + random_occ = frappe.get_value("Occupation", random_oc, "occupational_category") + random_sub_center = random.choice(Sub_Centre) + random_center = frappe.get_value("Sub Centre", random_sub_center, "centre") + soi = random.choice(Source_Of_Information) + ms = random.choice(Marital_status) + sv = random.choice(["Yes", "No"]) + pwd = random.choice(["Yes", "No"]) + vil = random.choice(Village) + wards = frappe.get_value("Village", vil, "block") + dis = frappe.get_value("Village", vil, "district") + any_doc = random.choice(["Yes", "No"]) + weyd = random.choice(["Below 40%", "Do not know"]) + scheme = random.choice(Schemes) + Milestone_category = frappe.get_value("Scheme", scheme, "milestone") + name_of_department = frappe.get_value("Scheme", scheme, "name_of_department") + random_gender = random.choice(["Male", "Female", "Transgender", "Others"]) + data = { + "date_of_visit": random_date(datetime.datetime(2020, 1, 1), datetime.datetime(2024, 1, 1)).strftime( + "%Y-%m-%d" + ), + "name_of_the_beneficiary": generate_indian_name(random_gender), + "gender": random_gender, + "date_of_birth": date_of_birth, + "completed_age": completed_age, + "completed_age_month": completed_age_month, + "contact_number": generate_random_indian_phone_number(), + "centre": random_center, + "sub_centre": random_sub_center, + "source_of_information": soi, + **( + {"name_of_the_camp": random.choice(frappe.get_list("Camp", pluck="name"))} + if soi == "Camp" + else {} + ), + "has_anyone_from_your_family_visisted_before": "No", + "caste_category": random.choice(Caste_category), + "religion": random.choice(Religion), + "education": random.choice(Education), + "current_occupation": random_oc, + "occupational_category": random_occ, + "marital_status": ms, + **({"spouses_name": random_string(10)} if ms == "Married" else {}), + "social_vulnerable": sv, + **({"social_vulnerable_category": random.choice(Social_vulnerable_category)} if sv == "Yes" else {}), + "are_you_a_person_with_disability_pwd": pwd, + **({"type_of_disability": random.choice(disabilities)} if pwd == "Yes" else {}), + **({"what_is_the_extent_of_your_disability": weyd} if pwd == "Yes" else {}), + "annual_income": random.randint(10000, 1000000), + "do_you_have_any_bank_account": random.choice(["Yes", "No"]), + "fathers_name": generate_indian_name("Male"), + "mothers_name": generate_indian_name("Female"), + "added_by": "Administrator", + "current_house_type": random.choice(House_Types), + "state": "S07", + "state_of_origin": "S07", + "district": dis, + "ward": wards, + "name_of_the_settlement": vil, + "do_you_have_any_id_documents": any_doc, + "overall_status": "Partially completed", + } + if any_doc == "Yes": + for _i in range(3): + data.setdefault("id_table_list", []).append( + { + "doctype": "ID Document Child", + "enter_id_number": "".join(random.choice(string.digits) for _ in range(12)), + "which_of_the_following_id_documents_do_you_have": random.choice(ID_Document), + } + ) + for _i in range(5): + application_submitted = random.choice(["Yes", "Completed"]) + data.setdefault("scheme_table", []).append( + { + "amount_paid": random.randint(500, 1000), + "application_number": f"APP-{uuid.uuid4().hex[:6]}", + "application_submitted": application_submitted, + "date_of_application": datetime.datetime.now().strftime("%Y-%m-%d"), + "milestone_category": Milestone_category, + "mode_of_application": random.choice(["Online", "Offline"]), + "name_of_the_department": name_of_department, + **( + { + "date_of_completion": datetime.datetime.now().strftime("%Y-%m-%d") + if application_submitted == "Completed" + else "" + } + ), + "name_of_the_scheme": scheme, + "paid_by": random.choice(["Self", "CSC"]), + "reason_of_application": "any", + "remarks": "any", + "status": "Under process" if application_submitted == "Yes" else "Completed", + } + ) + data.setdefault("follow_up_table", []).append( + { + "follow": random_sub_center, + "follow_up_date": datetime.datetime.now().strftime("%Y-%m-%d"), + "follow_up_mode": random.choice( + ["Home visit", "Phone call", "Centre visit", "In-person visit"] + ), + "follow_up_status": "Completed" + if application_submitted == "Completed" + else "Document submitted", + "follow_up_with": random.choice( + ["Beneficiary", "Government department", "Government website", "Others"] + ), + "name_of_the_scheme": scheme, + "remarks": "any", + } + ) + return data + + @frappe.whitelist() def create_beneficiary_profiling(count=10): - if frappe.session.user == "Administrator": - for _ in range(count): - beneficiary = frappe.new_doc("Beneficiary Profiling") - beneficiary.update(generate_random_bulk_data()) - beneficiary.insert() - return count - else: - return "Invalid access to the api!" \ No newline at end of file + if frappe.session.user == "Administrator": + for _ in range(count): + beneficiary = frappe.new_doc("Beneficiary Profiling") + beneficiary.update(generate_random_bulk_data()) + beneficiary.insert() + return count + else: + return "Invalid access to the api!" diff --git a/myojana/apis/myojana_setting.py b/myojana/apis/myojana_setting.py index 4357321..ec0ef02 100644 --- a/myojana/apis/myojana_setting.py +++ b/myojana/apis/myojana_setting.py @@ -1,18 +1,21 @@ -import frappe import json -@frappe.whitelist() -def get_myojana_setting(fields=['*']): - try: - myojana_setting = frappe.get_doc('mYojana Settings') - if fields == '*': - return myojana_setting.as_dict() - result = {field: myojana_setting.get(field) for field in json.loads(fields)} - return result - except frappe.DoesNotExistError: - frappe.log_error('mYojana Settings document does not exist', 'get_myojana_setting') - return None - except Exception as e: - frappe.log_error(frappe.get_traceback(), 'get_myojana_setting') - return None +import frappe + +@frappe.whitelist() +def get_myojana_setting(fields=None): + if fields is None: + fields = ["*"] + try: + myojana_setting = frappe.get_doc("mYojana Settings") + if fields == "*": + return myojana_setting.as_dict() + result = {field: myojana_setting.get(field) for field in json.loads(fields)} + return result + except frappe.DoesNotExistError: + frappe.log_error("mYojana Settings document does not exist", "get_myojana_setting") + return None + except Exception: + frappe.log_error(frappe.get_traceback(), "get_myojana_setting") + return None diff --git a/myojana/apis/myojana_user.py b/myojana/apis/myojana_user.py index b67de01..9f055c6 100644 --- a/myojana/apis/myojana_user.py +++ b/myojana/apis/myojana_user.py @@ -1,7 +1,8 @@ import frappe + @frappe.whitelist() def get_allowed_doctype(): - doctype = frappe.db.get_single_value('mYojana Settings', 'doctype_which_is_shown_in_user_permission') - doctypes = [doctype.strip() for doctype in doctype.split(',')] - return doctypes \ No newline at end of file + doctype = frappe.db.get_single_value("mYojana Settings", "doctype_which_is_shown_in_user_permission") + doctypes = [doctype.strip() for doctype in doctype.split(",")] + return doctypes diff --git a/myojana/apis/track_seen.py b/myojana/apis/track_seen.py index 1002d09..fda8ac1 100644 --- a/myojana/apis/track_seen.py +++ b/myojana/apis/track_seen.py @@ -1,10 +1,12 @@ -import frappe import json +import frappe + + @frappe.whitelist() -def toggle_track_changes(list,value): - list = json.loads(list) - for item in list: - frappe.db.set_value('DocType', item, 'track_changes', value, update_modified=False) - frappe.db.commit() - return len(list) \ No newline at end of file +def toggle_track_changes(list, value): + list = json.loads(list) + for item in list: + frappe.db.set_value("DocType", item, "track_changes", value, update_modified=False) + frappe.db.commit() + return len(list) diff --git a/myojana/apis/update_scheme.py b/myojana/apis/update_scheme.py index abd7e48..ec1e19f 100644 --- a/myojana/apis/update_scheme.py +++ b/myojana/apis/update_scheme.py @@ -1,10 +1,12 @@ -import frappe import json +import frappe + + @frappe.whitelist() -def toggle_enable_disable(list,value): - list = json.loads(list) - for item in list: - frappe.db.set_value('Scheme', item, 'enabled', value, update_modified=False) - frappe.db.commit() - return len(list) +def toggle_enable_disable(list, value): + list = json.loads(list) + for item in list: + frappe.db.set_value("Scheme", item, "enabled", value, update_modified=False) + frappe.db.commit() + return len(list) diff --git a/myojana/apis/user_permissions.py b/myojana/apis/user_permissions.py index 76bfa34..68abded 100644 --- a/myojana/apis/user_permissions.py +++ b/myojana/apis/user_permissions.py @@ -1,138 +1,97 @@ -import frappe import json +import frappe + + @frappe.whitelist() def create_user_permissions(doc=None): - document = json.loads(doc) - allow = document.get('allow') - for_value = document.get('for_value') - doctype = document.get('doctype') - user = document.get('user') - if allow == "State": - exist = frappe.db.exists(document) - if not exist: - state_perm = frappe.get_doc(document) - state_perm.insert(ignore_permissions=True) - elif allow == "District": - state_value = frappe.db.get_value("District", for_value, ['state']) - new_state_doc = { - 'doctype': doctype, - 'allow': 'State', - 'for_value':state_value, - 'user':user - } - state_exist = frappe.db.exists(new_state_doc) - dist_exist = frappe.db.exists(document) - if not state_exist: - state_perm = frappe.get_doc(new_state_doc) - state_perm.insert(ignore_permissions=True) - if not dist_exist: - dist_perm = frappe.get_doc(document) - dist_perm.insert(ignore_permissions=True) - elif allow == "Block": - state_value,dist_value = frappe.db.get_value("Block", for_value, ['state','district']) - new_state_doc = { - 'doctype': doctype, - 'allow': 'State', - 'for_value':state_value, - 'user':user - } - new_dist_doc = { - 'doctype': doctype, - 'allow': 'District', - 'for_value':dist_value, - 'user':user - } - state_exist = frappe.db.exists(new_state_doc) - dist_exist = frappe.db.exists(new_dist_doc) - block_exist = frappe.db.exists(document) - if not state_exist: - state_perm = frappe.get_doc(new_state_doc) - state_perm.insert(ignore_permissions=True) - if not dist_exist: - dist_perm = frappe.get_doc(new_dist_doc) - dist_perm.insert(ignore_permissions=True) - if not block_exist: - block_perm = frappe.get_doc(document) - block_perm.insert(ignore_permissions=True) - elif allow == "Village": - state_value,dist_value , block_val= frappe.db.get_value("Village", for_value, ['state','district', 'block']) - new_state_doc = { - 'doctype': doctype, - 'allow': 'State', - 'for_value':state_value, - 'user':user - } - new_dist_doc = { - 'doctype': doctype, - 'allow': 'District', - 'for_value':dist_value, - 'user':user - } - new_block_doc = { - 'doctype': doctype, - 'allow': 'Block', - 'for_value':block_val, - 'user':user - } - state_exist = frappe.db.exists(new_state_doc) - dist_exist = frappe.db.exists(new_dist_doc) - block_exist = frappe.db.exists(new_block_doc) - village_exist = frappe.db.exists(document) - if not state_exist: - state_perm = frappe.get_doc(new_state_doc) - state_perm.insert(ignore_permissions=True) - if not dist_exist: - dist_perm = frappe.get_doc(new_dist_doc) - dist_perm.insert(ignore_permissions=True) - if not block_exist: - block_perm = frappe.get_doc(new_block_doc) - block_perm.insert(ignore_permissions=True) - if not village_exist: - vill_perm = frappe.get_doc(document) - vill_perm.insert(ignore_permissions=True) + document = json.loads(doc) + allow = document.get("allow") + for_value = document.get("for_value") + doctype = document.get("doctype") + user = document.get("user") + if allow == "State": + exist = frappe.db.exists(document) + if not exist: + state_perm = frappe.get_doc(document) + state_perm.insert(ignore_permissions=True) + elif allow == "District": + state_value = frappe.db.get_value("District", for_value, ["state"]) + new_state_doc = {"doctype": doctype, "allow": "State", "for_value": state_value, "user": user} + state_exist = frappe.db.exists(new_state_doc) + dist_exist = frappe.db.exists(document) + if not state_exist: + state_perm = frappe.get_doc(new_state_doc) + state_perm.insert(ignore_permissions=True) + if not dist_exist: + dist_perm = frappe.get_doc(document) + dist_perm.insert(ignore_permissions=True) + elif allow == "Block": + state_value, dist_value = frappe.db.get_value("Block", for_value, ["state", "district"]) + new_state_doc = {"doctype": doctype, "allow": "State", "for_value": state_value, "user": user} + new_dist_doc = {"doctype": doctype, "allow": "District", "for_value": dist_value, "user": user} + state_exist = frappe.db.exists(new_state_doc) + dist_exist = frappe.db.exists(new_dist_doc) + block_exist = frappe.db.exists(document) + if not state_exist: + state_perm = frappe.get_doc(new_state_doc) + state_perm.insert(ignore_permissions=True) + if not dist_exist: + dist_perm = frappe.get_doc(new_dist_doc) + dist_perm.insert(ignore_permissions=True) + if not block_exist: + block_perm = frappe.get_doc(document) + block_perm.insert(ignore_permissions=True) + elif allow == "Village": + state_value, dist_value, block_val = frappe.db.get_value( + "Village", for_value, ["state", "district", "block"] + ) + new_state_doc = {"doctype": doctype, "allow": "State", "for_value": state_value, "user": user} + new_dist_doc = {"doctype": doctype, "allow": "District", "for_value": dist_value, "user": user} + new_block_doc = {"doctype": doctype, "allow": "Block", "for_value": block_val, "user": user} + state_exist = frappe.db.exists(new_state_doc) + dist_exist = frappe.db.exists(new_dist_doc) + block_exist = frappe.db.exists(new_block_doc) + village_exist = frappe.db.exists(document) + if not state_exist: + state_perm = frappe.get_doc(new_state_doc) + state_perm.insert(ignore_permissions=True) + if not dist_exist: + dist_perm = frappe.get_doc(new_dist_doc) + dist_perm.insert(ignore_permissions=True) + if not block_exist: + block_perm = frappe.get_doc(new_block_doc) + block_perm.insert(ignore_permissions=True) + if not village_exist: + vill_perm = frappe.get_doc(document) + vill_perm.insert(ignore_permissions=True) - elif allow == "Centre": - state_value = frappe.db.get_value("Centre", for_value, ['state']) - new_state_doc = { - 'doctype': doctype, - 'allow': 'State', - 'for_value':state_value, - 'user':user - } - state_exist = frappe.db.exists(new_state_doc) - block_exist = frappe.db.exists(document) - if not state_exist: - state_perm = frappe.get_doc(new_state_doc) - state_perm.insert(ignore_permissions=True) - if not block_exist: - block_perm = frappe.get_doc(document) - block_perm.insert(ignore_permissions=True) - elif allow == "Sub Centre": - state_value,centre_value = frappe.db.get_value("Sub Centre", for_value, ['state','centre']) - new_state_doc = { - 'doctype': doctype, - 'allow': 'State', - 'for_value':state_value, - 'user':user - } - new_centre_doc = { - 'doctype': doctype, - 'allow': 'Centre', - 'for_value':centre_value, - 'user':user - } - state_exist = frappe.db.exists(new_state_doc) - centre_exist = frappe.db.exists(new_centre_doc) - sub_centre_exist = frappe.db.exists(document) - if not state_exist: - state_perm = frappe.get_doc(new_state_doc) - state_perm.insert(ignore_permissions=True) - if not centre_exist: - dist_perm = frappe.get_doc(new_centre_doc) - dist_perm.insert(ignore_permissions=True) - if not sub_centre_exist: - sub_centre_perm = frappe.get_doc(document) - sub_centre_perm.insert(ignore_permissions=True) - else: - return document \ No newline at end of file + elif allow == "Centre": + state_value = frappe.db.get_value("Centre", for_value, ["state"]) + new_state_doc = {"doctype": doctype, "allow": "State", "for_value": state_value, "user": user} + state_exist = frappe.db.exists(new_state_doc) + block_exist = frappe.db.exists(document) + if not state_exist: + state_perm = frappe.get_doc(new_state_doc) + state_perm.insert(ignore_permissions=True) + if not block_exist: + block_perm = frappe.get_doc(document) + block_perm.insert(ignore_permissions=True) + elif allow == "Sub Centre": + state_value, centre_value = frappe.db.get_value("Sub Centre", for_value, ["state", "centre"]) + new_state_doc = {"doctype": doctype, "allow": "State", "for_value": state_value, "user": user} + new_centre_doc = {"doctype": doctype, "allow": "Centre", "for_value": centre_value, "user": user} + state_exist = frappe.db.exists(new_state_doc) + centre_exist = frappe.db.exists(new_centre_doc) + sub_centre_exist = frappe.db.exists(document) + if not state_exist: + state_perm = frappe.get_doc(new_state_doc) + state_perm.insert(ignore_permissions=True) + if not centre_exist: + dist_perm = frappe.get_doc(new_centre_doc) + dist_perm.insert(ignore_permissions=True) + if not sub_centre_exist: + sub_centre_perm = frappe.get_doc(document) + sub_centre_perm.insert(ignore_permissions=True) + else: + return document diff --git a/myojana/apis/whatsapp.py b/myojana/apis/whatsapp.py index 5a99fba..8b49336 100644 --- a/myojana/apis/whatsapp.py +++ b/myojana/apis/whatsapp.py @@ -1,110 +1,108 @@ +import http.client +import json + import frappe -from frappe import _ import requests -import json -import http.client -from myojana.apis.html_to_image import create_image +from frappe import _ from frappe.utils import get_site_name + +from myojana.apis.html_to_image import create_image + + def format_mobile_number(mobile): - # Remove any leading '+' sign - if mobile.startswith('+'): - mobile = mobile[1:] - - # Check if the mobile number starts with the country code for India (91) - if mobile.startswith('91') and len(mobile) > 10: - mobile = mobile[2:] - - # Ensure the mobile number is 10 digits long - if len(mobile) == 10 and mobile.isdigit(): - return mobile - else: - raise ValueError("Invalid mobile number format") + # Remove any leading '+' sign + if mobile.startswith("+"): + mobile = mobile[1:] + + # Check if the mobile number starts with the country code for India (91) + if mobile.startswith("91") and len(mobile) > 10: + mobile = mobile[2:] + + # Ensure the mobile number is 10 digits long + if len(mobile) == 10 and mobile.isdigit(): + return mobile + else: + raise ValueError("Invalid mobile number format") + + @frappe.whitelist() def test_auth_key(auth_key): - conn = http.client.HTTPSConnection("control.msg91.com") - headers = { - 'accept': "application/json", - 'authkey': auth_key - } - conn.request("GET", "/api/v5/whatsapp/whatsapp-activation/", headers=headers) + conn = http.client.HTTPSConnection("control.msg91.com") + headers = {"accept": "application/json", "authkey": auth_key} + conn.request("GET", "/api/v5/whatsapp/whatsapp-activation/", headers=headers) - res = conn.getresponse() - response_str = res.read().decode("utf-8") # Read and decode the response - response_json = json.loads(response_str) # Convert the string to a JSON object - return response_json + res = conn.getresponse() + response_str = res.read().decode("utf-8") # Read and decode the response + response_json = json.loads(response_str) # Convert the string to a JSON object + return response_json @frappe.whitelist() def send_id(doc): - template_name, auth_key , integrated_number = frappe.db.get_value('mYojana Settings', None, ['id_card_template', 'auth_key' ,'integrated_number']) - - print("template_name",auth_key) - if not auth_key: - frappe.throw(_("Please set Auth Key in mYojana Settings")) - - if not template_name: - frappe.throw(_("Please set ID Card Template in mYojana Settings")) - - file,doc = create_image(doc, template_name) - conn = http.client.HTTPSConnection("api.msg91.com") - payload = json.dumps({ - "integrated_number": integrated_number, - "content_type": "template", - "payload": { - "messaging_product": "whatsapp", - "type": "template", - "template": { - "name": "beneficiary_profile_id", - "language": { - "code": "en", - "policy": "deterministic" - }, - "namespace": None, - "to_and_components": [{ - "to": [ - f"91{format_mobile_number(doc.contact_number)}" - ], - "components": { - "header_1": { - "type": "image", - "value": f"{frappe.local.request.scheme}://{frappe.local.request.host}{file.file_url}" - }, - "body_1": { - "type": "text", - "value": f"{doc.name_of_the_beneficiary}" - } - } - }] - } - } - }) - # return payload - # print(payload) - headers = { - 'Content-Type': 'application/json', - 'authkey': auth_key - } - conn.request("POST", "/api/v5/whatsapp/whatsapp-outbound-message/bulk/", payload, headers) - res = conn.getresponse() - data = res.read() - print(data.decode("utf-8")) - return data.decode("utf-8") + template_name, auth_key, integrated_number = frappe.db.get_value( + "mYojana Settings", None, ["id_card_template", "auth_key", "integrated_number"] + ) + + print("template_name", auth_key) + if not auth_key: + frappe.throw(_("Please set Auth Key in mYojana Settings")) + + if not template_name: + frappe.throw(_("Please set ID Card Template in mYojana Settings")) + + file, doc = create_image(doc, template_name) + conn = http.client.HTTPSConnection("api.msg91.com") + payload = json.dumps( + { + "integrated_number": integrated_number, + "content_type": "template", + "payload": { + "messaging_product": "whatsapp", + "type": "template", + "template": { + "name": "beneficiary_profile_id", + "language": {"code": "en", "policy": "deterministic"}, + "namespace": None, + "to_and_components": [ + { + "to": [f"91{format_mobile_number(doc.contact_number)}"], + "components": { + "header_1": { + "type": "image", + "value": f"{frappe.local.request.scheme}://{frappe.local.request.host}{file.file_url}", + }, + "body_1": {"type": "text", "value": f"{doc.name_of_the_beneficiary}"}, + }, + } + ], + }, + }, + } + ) + # return payload + # print(payload) + headers = {"Content-Type": "application/json", "authkey": auth_key} + conn.request("POST", "/api/v5/whatsapp/whatsapp-outbound-message/bulk/", payload, headers) + res = conn.getresponse() + data = res.read() + print(data.decode("utf-8")) + return data.decode("utf-8") + @frappe.whitelist() def send(phoneNo): - whatsapp = frappe.conf.get('whatsapp') - message = '%7B%22type%22%3A%22text%22%2C%22text%22%3A%22Hi%20Sir%2FMadam%20Ji%5Cn%5CnNamaskar!%5Cn%5CnAap%20apna%20organization%20ID%20yaha%20dekh%20sakte%20hai.%20Kripya%20isko%20star%20mark%20karke%20save%20kar%20lijiye.%5Cn%5CnRegards%5CnJanpahal%22%7D' - message_old = '%7B%22type%22%3A%22text%22%2C%22text%22%3A%22Congratulations!%20%F0%9F%8E%89%20Your%20loan%20application%20has%20been%20applied%20successfully!%20%F0%9F%92%B0%E2%9C%85%5Cn%5CnBest%20Regards%5CnGov%5Cn%5Cn%22%7D' - payload = f"channel=whatsapp&source={whatsapp.get('source')}&destination=91{phoneNo}&message={message_old}&src.name={whatsapp.get('src.name')}" - headers = { - 'Cache-Control': 'no-cache', - 'Content-Type': 'application/x-www-form-urlencoded', - 'apikey': whatsapp.get('apikey'), - 'cache-control': 'no-cache' - } - conn = http.client.HTTPSConnection("api.gupshup.io") - conn.request("POST", "/wa/api/v1/msg", payload, headers) - res = conn.getresponse() - data = res.read() - print("///////////////////////////////////////////////////////", data) - return json.loads(data.decode("utf-8")) \ No newline at end of file + whatsapp = frappe.conf.get("whatsapp") + message_old = "%7B%22type%22%3A%22text%22%2C%22text%22%3A%22Congratulations!%20%F0%9F%8E%89%20Your%20loan%20application%20has%20been%20applied%20successfully!%20%F0%9F%92%B0%E2%9C%85%5Cn%5CnBest%20Regards%5CnGov%5Cn%5Cn%22%7D" + payload = f"channel=whatsapp&source={whatsapp.get('source')}&destination=91{phoneNo}&message={message_old}&src.name={whatsapp.get('src.name')}" + headers = { + "Cache-Control": "no-cache", + "Content-Type": "application/x-www-form-urlencoded", + "apikey": whatsapp.get("apikey"), + "cache-control": "no-cache", + } + conn = http.client.HTTPSConnection("api.gupshup.io") + conn.request("POST", "/wa/api/v1/msg", payload, headers) + res = conn.getresponse() + data = res.read() + print("///////////////////////////////////////////////////////", data) + return json.loads(data.decode("utf-8")) diff --git a/myojana/hooks.py b/myojana/hooks.py index 5b91c0f..1d17716 100644 --- a/myojana/hooks.py +++ b/myojana/hooks.py @@ -7,70 +7,85 @@ # required_apps = ["Suvaidyam/sva_dashboard"] fixtures = [ - # "mYojana Settings", - # "Report List", - # "SVA Report" - # "scheme application submitted", - # "Scheme Paid by", - # "Client Script", - # "Custom HTML Block", - # "Caste category", - # "Religion", - # "Education", - # "Marital status", - # "Social vulnerable category", - # "PWD master", - # "ID Document", - # "Occupation", - # "Occupational Category", - # "Role Profile", - # "Source Of Information", - # "House Types", - # "Gender", - # "Role", - # "Name of the Department", - # "State", - # "District", - # "Block", - # "Village", - # "Scheme", - # "Camp", - # "Proof of Disability", - # "Milestone category", - # "Centre", - # "Sub Centre", - - # --- Jan Pahal CR fixtures (added 2026-04-12) --- - # Jan Pahal custom DocTypes (Collective ecosystem + Infrastructure assessment) - {"dt": "DocType", "filters": [["name", "in", [ - "Collective Members List", "Action child", "Collective" - ]], ["custom", "=", 1]]}, - # CR-2: Updated Occupational Category with "Mobile Street Vendors" - "Occupational Category", - # CR-11: Custom Fields for digital payments, MSME, digital onboarding - {"dt": "Custom Field", "filters": [["dt", "=", "Beneficiary Profiling"], ["fieldname", "like", "custom_%"]]}, - # CR-9: Property Setter to make DOB non-mandatory - {"dt": "Property Setter", "filters": [["doc_type", "=", "Beneficiary Profiling"], ["field_name", "=", "date_of_birth"]]}, - # CR-5, CR-6, CR-10: Client Scripts for Collective, Infrastructural Success, dropdown indicators - {"dt": "Client Script", "filters": [["dt", "in", ["Collective", "Infrastructural Success", "Beneficiary Profiling"]], ["name", "!=", "Scheme and Followup Validate"]]}, - # Meetings & Collectives workspace - {"dt": "Workspace", "filters": [["name", "=", "Meetings & Collectives"]]}, + # "mYojana Settings", + # "Report List", + # "SVA Report" + # "scheme application submitted", + # "Scheme Paid by", + # "Client Script", + # "Custom HTML Block", + # "Caste category", + # "Religion", + # "Education", + # "Marital status", + # "Social vulnerable category", + # "PWD master", + # "ID Document", + # "Occupation", + # "Occupational Category", + # "Role Profile", + # "Source Of Information", + # "House Types", + # "Gender", + # "Role", + # "Name of the Department", + # "State", + # "District", + # "Block", + # "Village", + # "Scheme", + # "Camp", + # "Proof of Disability", + # "Milestone category", + # "Centre", + # "Sub Centre", + # --- Jan Pahal CR fixtures (added 2026-04-12) --- + # Jan Pahal custom DocTypes (Collective ecosystem + Infrastructure assessment) + { + "dt": "DocType", + "filters": [ + ["name", "in", ["Collective Members List", "Action child", "Collective"]], + ["custom", "=", 1], + ], + }, + # CR-2: Updated Occupational Category with "Mobile Street Vendors" + "Occupational Category", + # CR-11: Custom Fields for digital payments, MSME, digital onboarding + { + "dt": "Custom Field", + "filters": [["dt", "=", "Beneficiary Profiling"], ["fieldname", "like", "custom_%"]], + }, + # CR-9: Property Setter to make DOB non-mandatory + { + "dt": "Property Setter", + "filters": [["doc_type", "=", "Beneficiary Profiling"], ["field_name", "=", "date_of_birth"]], + }, + # CR-5, CR-6, CR-10: Client Scripts for Collective, Infrastructural Success, dropdown indicators + { + "dt": "Client Script", + "filters": [ + ["dt", "in", ["Collective", "Infrastructural Success", "Beneficiary Profiling"]], + ["name", "!=", "Scheme and Followup Validate"], + ], + }, + # Meetings & Collectives workspace + {"dt": "Workspace", "filters": [["name", "=", "Meetings & Collectives"]]}, ] # Includes in # ------------------ permission_query_conditions = { - # "Sub Centre":"myojana.middlewares.sub_centre.list_query", - # "Myojana User":"myojana.middlewares.myojana_users.list_query", - "Role Profile":"myojana.middlewares.role_profile.list_query", - # "User":"myojana.middlewares.user.list_query", - # "Centre":"myojana.middlewares.centre.list_query", + # "Sub Centre":"myojana.middlewares.sub_centre.list_query", + # "Myojana User":"myojana.middlewares.myojana_users.list_query", + "Role Profile": "myojana.middlewares.role_profile.list_query", + # "User":"myojana.middlewares.user.list_query", + # "Centre":"myojana.middlewares.centre.list_query", } # include js, css files in header of desk.html app_include_css = "/assets/myojana/css/main.css" app_include_js = [ - "/assets/myojana/js/main.js", - "https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js" + "/assets/myojana/js/main.js", + "https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js", ] # include js, css files in header of web template @@ -89,20 +104,16 @@ # include js in doctype views doctype_js = { - "Beneficiary Profiling" : [ - "public/js/utils/utils.js" , - "public/js/beneficiary_profiling/beneficiary_profiling.js", - "public/js/beneficiary_profiling/follow_up.js", - "public/js/beneficiary_profiling/scheme.js", - "public/js/beneficiary_profiling/id_document.js", - ], - "Sub Centre":[ - "public/js/utils/utils.js" - ], - "mYojana Settings":[ - "public/js/utils/utils.js" - ], - "Scheme":"public/js/scheme/eligibile_ben.js" + "Beneficiary Profiling": [ + "public/js/utils/utils.js", + "public/js/beneficiary_profiling/beneficiary_profiling.js", + "public/js/beneficiary_profiling/follow_up.js", + "public/js/beneficiary_profiling/scheme.js", + "public/js/beneficiary_profiling/id_document.js", + ], + "Sub Centre": ["public/js/utils/utils.js"], + "mYojana Settings": ["public/js/utils/utils.js"], + "Scheme": "public/js/scheme/eligibile_ben.js", } # doctype_js = {"Beneficiary Profiling" : } # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} @@ -122,7 +133,7 @@ # website user home page (by Role) # role_home_page = { -# "Role": "home_page" +# "Role": "home_page" # } # Generators @@ -136,8 +147,8 @@ # add methods and filters to jinja environment # jinja = { -# "methods": "myojana.utils.jinja_methods", -# "filters": "myojana.utils.jinja_filters" +# "methods": "myojana.utils.jinja_methods", +# "filters": "myojana.utils.jinja_filters" # } # Installation @@ -179,11 +190,11 @@ # Permissions evaluated in scripted ways # permission_query_conditions = { -# "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", +# "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", # } # # has_permission = { -# "Event": "frappe.desk.doctype.event.event.has_permission", +# "Event": "frappe.desk.doctype.event.event.has_permission", # } # DocType Class @@ -191,7 +202,7 @@ # Override standard doctype classes # override_doctype_class = { -# "ToDo": "custom_app.overrides.CustomToDo" +# "ToDo": "custom_app.overrides.CustomToDo" # } # Document Events @@ -204,32 +215,32 @@ # "on_cancel": "myojana.scheduler_events.ben_dob_update.update_dob_of_ben", # "on_trash": "myojana.scheduler_events.ben_dob_update.update_dob_of_ben" }, - # "Beneficiary Profiling": { - # "on_update": "myojana.middlewares.test.test", - # } + # "Beneficiary Profiling": { + # "on_update": "myojana.middlewares.test.test", + # } } # Scheduled Tasks # --------------- scheduler_events = { -# "all": [ -# "myojana.tasks.all" -# ], + # "all": [ + # "myojana.tasks.all" + # ], "daily": [ - "myojana.scheduler_events.ben_dob_update.update_age", - # "myojana.scheduler_events.ben_dob_update.update_dob_of_ben", - # "myojana.scheduler_events.ben_dob_update.update_dob_months" + "myojana.scheduler_events.ben_dob_update.update_age", + # "myojana.scheduler_events.ben_dob_update.update_dob_of_ben", + # "myojana.scheduler_events.ben_dob_update.update_dob_months" ], -# "hourly": [ -# "myojana.tasks.hourly" -# ], -# "weekly": [ -# "myojana.tasks.weekly" -# ], -# "monthly": [ -# "myojana.tasks.monthly" -# ], + # "hourly": [ + # "myojana.tasks.hourly" + # ], + # "weekly": [ + # "myojana.tasks.weekly" + # ], + # "monthly": [ + # "myojana.tasks.monthly" + # ], } # Testing @@ -241,14 +252,14 @@ # ------------------------------ # # override_whitelisted_methods = { -# "frappe.desk.doctype.event.event.get_events": "myojana.event.get_events" +# "frappe.desk.doctype.event.event.get_events": "myojana.event.get_events" # } # # each overriding function accepts a `data` argument; # generated from the base implementation of the doctype dashboard, # along with any modifications made in other Frappe apps # override_doctype_dashboards = { -# "Task": "myojana.task.get_dashboard_data" +# "Task": "myojana.task.get_dashboard_data" # } # exempt linked doctypes from being automatically cancelled @@ -258,7 +269,7 @@ # Ignore links to specified DocTypes when deleting documents # ----------------------------------------------------------- -ignore_links_on_delete = ["Beneficiary Profiling", "Family" , "Route History"] +ignore_links_on_delete = ["Beneficiary Profiling", "Family", "Route History"] # Request Events # ---------------- @@ -274,29 +285,29 @@ # -------------------- # user_data_fields = [ -# { -# "doctype": "{doctype_1}", -# "filter_by": "{filter_by}", -# "redact_fields": ["{field_1}", "{field_2}"], -# "partial": 1, -# }, -# { -# "doctype": "{doctype_2}", -# "filter_by": "{filter_by}", -# "partial": 1, -# }, -# { -# "doctype": "{doctype_3}", -# "strict": False, -# }, -# { -# "doctype": "{doctype_4}" -# } +# { +# "doctype": "{doctype_1}", +# "filter_by": "{filter_by}", +# "redact_fields": ["{field_1}", "{field_2}"], +# "partial": 1, +# }, +# { +# "doctype": "{doctype_2}", +# "filter_by": "{filter_by}", +# "partial": 1, +# }, +# { +# "doctype": "{doctype_3}", +# "strict": False, +# }, +# { +# "doctype": "{doctype_4}" +# } # ] # Authentication and authorization # -------------------------------- # auth_hooks = [ -# "myojana.auth.validate" +# "myojana.auth.validate" # ] diff --git a/myojana/install/after_install.py b/myojana/install/after_install.py index 22876ea..7b04a61 100644 --- a/myojana/install/after_install.py +++ b/myojana/install/after_install.py @@ -1,49 +1,25 @@ from myojana.utils.after_install import AfterInstall state_json = [ - { - "docstatus": 0, - "doctype": "State", - "name": "S01", - "state_code": "S01", - "state_name": "Jammu & Kashmir" - }, - { - "docstatus": 0, - "doctype": "State", - "name": "S02", - "state_code": "S02", - "state_name": "Himachal Pradesh" - }, - { - "docstatus": 0, - "doctype": "State", - "name": "S03", - "state_code": "S03", - "state_name": "Punjab" - }, - { - "docstatus": 0, - "doctype": "State", - "name": "S04", - "state_code": "S04", - "state_name": "Chandigarh" - }, - { - "docstatus": 0, - "doctype": "State", - "name": "S05", - "state_code": "S05", - "state_name": "Uttarakhand" - } + {"docstatus": 0, "doctype": "State", "name": "S01", "state_code": "S01", "state_name": "Jammu & Kashmir"}, + { + "docstatus": 0, + "doctype": "State", + "name": "S02", + "state_code": "S02", + "state_name": "Himachal Pradesh", + }, + {"docstatus": 0, "doctype": "State", "name": "S03", "state_code": "S03", "state_name": "Punjab"}, + {"docstatus": 0, "doctype": "State", "name": "S04", "state_code": "S04", "state_name": "Chandigarh"}, + {"docstatus": 0, "doctype": "State", "name": "S05", "state_code": "S05", "state_name": "Uttarakhand"}, ] -def update_myojana_settings(): - AfterInstall.set_app_name() - AfterInstall.set_brand_logo() - AfterInstall.set_favicons() - AfterInstall.set_navbar_logo() - AfterInstall.set_navbar_setting() - AfterInstall.set_splash_image() - AfterInstall.set_website_logo() +def update_myojana_settings(): + AfterInstall.set_app_name() + AfterInstall.set_brand_logo() + AfterInstall.set_favicons() + AfterInstall.set_navbar_logo() + AfterInstall.set_navbar_setting() + AfterInstall.set_splash_image() + AfterInstall.set_website_logo() diff --git a/myojana/master/doctype/block/block.js b/myojana/master/doctype/block/block.js index 4e9db4c..0664779 100644 --- a/myojana/master/doctype/block/block.js +++ b/myojana/master/doctype/block/block.js @@ -1,35 +1,37 @@ // Copyright (c) 2023, suvaidyam and contributors // For license information, please see license.txt const apply_filter = (frm, field_name, filter_on, filter_value) => { - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: filter_value, - }, - page_length: 1000 - }; - } -} -function defult_filter(field_name, filter_on, frm) { - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, - }, - }; - } + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: filter_value, + }, + page_length: 1000, + }; + }; }; +function defult_filter(field_name, filter_on, frm) { + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, + }, + }; + }; +} function hide_advance_search(frm, list) { - for (item of list) { - frm.set_df_property(item, 'only_select', true); - } -}; + for (const item of list) { + frm.set_df_property(item, "only_select", true); + } +} frappe.ui.form.on("Block", { - refresh(frm) { - frm.doc.state ? apply_filter(frm, "district", "state", frm.doc.state) : defult_filter('district', "State", frm); - // frm.doc.district ? apply_filter(frm ,"block", "District", frm.doc.district) : defult_filter('block', "District", frm); - }, - state: function (frm) { - apply_filter(frm, 'district', "state", frm.doc.state) - }, + refresh(frm) { + frm.doc.state + ? apply_filter(frm, "district", "state", frm.doc.state) + : defult_filter("district", "State", frm); + // frm.doc.district ? apply_filter(frm ,"block", "District", frm.doc.district) : defult_filter('block', "District", frm); + }, + state: function (frm) { + apply_filter(frm, "district", "state", frm.doc.state); + }, }); diff --git a/myojana/master/doctype/block/block_list.js b/myojana/master/doctype/block/block_list.js index 3774fdf..b02c511 100644 --- a/myojana/master/doctype/block/block_list.js +++ b/myojana/master/doctype/block/block_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Block'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Block"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/camp/camp.js b/myojana/master/doctype/camp/camp.js index 6a05f21..e0fca72 100644 --- a/myojana/master/doctype/camp/camp.js +++ b/myojana/master/doctype/camp/camp.js @@ -2,7 +2,5 @@ // For license information, please see license.txt frappe.ui.form.on("Camp", { - refresh(frm) { - - }, + refresh(frm) {}, }); diff --git a/myojana/master/doctype/camp/camp_list.js b/myojana/master/doctype/camp/camp_list.js index 1880827..9a62552 100644 --- a/myojana/master/doctype/camp/camp_list.js +++ b/myojana/master/doctype/camp/camp_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Camp'] = { - onload: function (listview) { - // $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Camp"] = { + onload: function (listview) { + // $('.layout-side-section').hide(); + }, +}; diff --git a/myojana/master/doctype/caste_category/caste_category_list.js b/myojana/master/doctype/caste_category/caste_category_list.js index bdb61de..82bbcc4 100644 --- a/myojana/master/doctype/caste_category/caste_category_list.js +++ b/myojana/master/doctype/caste_category/caste_category_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Caste category'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Caste category"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/district/district_list.js b/myojana/master/doctype/district/district_list.js index 9a5d5ff..4279c5d 100644 --- a/myojana/master/doctype/district/district_list.js +++ b/myojana/master/doctype/district/district_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['District'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["District"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/education/education_list.js b/myojana/master/doctype/education/education_list.js index feb0476..7a1de19 100644 --- a/myojana/master/doctype/education/education_list.js +++ b/myojana/master/doctype/education/education_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Education'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Education"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/house_types/house_types_list.js b/myojana/master/doctype/house_types/house_types_list.js index bd46df4..e064927 100644 --- a/myojana/master/doctype/house_types/house_types_list.js +++ b/myojana/master/doctype/house_types/house_types_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['House Types'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["House Types"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/id_document/id_document_list.js b/myojana/master/doctype/id_document/id_document_list.js index 0fea897..2f0a31a 100644 --- a/myojana/master/doctype/id_document/id_document_list.js +++ b/myojana/master/doctype/id_document/id_document_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['ID Document'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["ID Document"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/marital_status/marital_status_list.js b/myojana/master/doctype/marital_status/marital_status_list.js index 04dcf39..44ab9c0 100644 --- a/myojana/master/doctype/marital_status/marital_status_list.js +++ b/myojana/master/doctype/marital_status/marital_status_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Marital status'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Marital status"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/milestone_category/milestone_category_list.js b/myojana/master/doctype/milestone_category/milestone_category_list.js index bd5269f..8c96caf 100644 --- a/myojana/master/doctype/milestone_category/milestone_category_list.js +++ b/myojana/master/doctype/milestone_category/milestone_category_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Milestone category'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Milestone category"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/name_of_the_department/name_of_the_department.js b/myojana/master/doctype/name_of_the_department/name_of_the_department.js index 5720118..77205de 100644 --- a/myojana/master/doctype/name_of_the_department/name_of_the_department.js +++ b/myojana/master/doctype/name_of_the_department/name_of_the_department.js @@ -3,13 +3,13 @@ frappe.ui.form.on("Name of the Department", { refresh(frm) { - if(frm.doc.department_urlwebsite){ - frm.add_web_link(frm?.doc?.department_urlwebsite) - } + if (frm.doc.department_urlwebsite) { + frm.add_web_link(frm?.doc?.department_urlwebsite); + } + }, + department_urlwebsite: function (frm) { + if (frm.doc.department_urlwebsite) { + frm.add_web_link(frm?.doc?.department_urlwebsite); + } }, - department_urlwebsite: function(frm){ - if(frm.doc.department_urlwebsite){ - frm.add_web_link(frm?.doc?.department_urlwebsite) - } - } }); diff --git a/myojana/master/doctype/name_of_the_department/name_of_the_department_list.js b/myojana/master/doctype/name_of_the_department/name_of_the_department_list.js index 4163436..718366b 100644 --- a/myojana/master/doctype/name_of_the_department/name_of_the_department_list.js +++ b/myojana/master/doctype/name_of_the_department/name_of_the_department_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Name of the Department'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Name of the Department"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/occupation/occupation_list.js b/myojana/master/doctype/occupation/occupation_list.js index 7966372..12420ad 100644 --- a/myojana/master/doctype/occupation/occupation_list.js +++ b/myojana/master/doctype/occupation/occupation_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Occupation'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Occupation"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/occupational_category/occupational_category_list.js b/myojana/master/doctype/occupational_category/occupational_category_list.js index 7f34852..f503d60 100644 --- a/myojana/master/doctype/occupational_category/occupational_category_list.js +++ b/myojana/master/doctype/occupational_category/occupational_category_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Occupational Category'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Occupational Category"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/proof_of_disability/proof_of_disability_list.js b/myojana/master/doctype/proof_of_disability/proof_of_disability_list.js index 3786a03..e29fce1 100644 --- a/myojana/master/doctype/proof_of_disability/proof_of_disability_list.js +++ b/myojana/master/doctype/proof_of_disability/proof_of_disability_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Proof of Disability'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Proof of Disability"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/pwd_master/pwd_master_list.js b/myojana/master/doctype/pwd_master/pwd_master_list.js index ec4c325..8fc3181 100644 --- a/myojana/master/doctype/pwd_master/pwd_master_list.js +++ b/myojana/master/doctype/pwd_master/pwd_master_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['PWD master'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["PWD master"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/religion/religion_list.js b/myojana/master/doctype/religion/religion_list.js index a2d1461..1578dcd 100644 --- a/myojana/master/doctype/religion/religion_list.js +++ b/myojana/master/doctype/religion/religion_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Religion'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Religion"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/scheme/scheme.js b/myojana/master/doctype/scheme/scheme.js index 5b2daa4..3fd832c 100644 --- a/myojana/master/doctype/scheme/scheme.js +++ b/myojana/master/doctype/scheme/scheme.js @@ -1,426 +1,481 @@ // Copyright (c) 2023, suvaidyam and contributors // For license information, please see license.txt let response; -var common_operators = ["=", "!="] +var common_operators = ["=", "!="]; let columns; let current_page = 1; var field_types = { - "Date": [...common_operators, ">", "<", ">=", "<="], - "Int": [...common_operators, ">", "<", ">=", "<="], - "Link": [...common_operators], - "Select": [...common_operators], - "Currency": [...common_operators, ">", "<", ">=", "<="] -} + Date: [...common_operators, ">", "<", ">=", "<="], + Int: [...common_operators, ">", "<", ">=", "<="], + Link: [...common_operators], + Select: [...common_operators], + Currency: [...common_operators, ">", "<", ">=", "<="], +}; // CHILD TABLE -var child_table_field = 'rules' +var child_table_field = "rules"; function evaluateExpression(input, expression) { - if (!(/^[a-zA-Z0-9\s()+\-/*%&|=!<>]*$/.test(expression))) { - return 'Invalid expression' - } - // expression = expression.toLowerCase(); - expression = expression.replace(/and/g, '&&').replace(/or/g, '||'); - expression = expression.replace(/AND/g, '&&').replace(/OR/g, '||'); - for (let key in input) { - expression = expression.replace(new RegExp(key, 'g'), input[key]); - } - try { - return eval(expression); - } catch (err) { - return err.message; - } + if (!/^[a-zA-Z0-9\s()+\-/*%&|=!<>]*$/.test(expression)) { + return "Invalid expression"; + } + // expression = expression.toLowerCase(); + expression = expression.replace(/and/g, "&&").replace(/or/g, "||"); + expression = expression.replace(/AND/g, "&&").replace(/OR/g, "||"); + for (let key in input) { + expression = expression.replace(new RegExp(key, "g"), input[key]); + } + try { + return eval(expression); + } catch (err) { + return err.message; + } } function convertJSONToCSV(jsonData, fileName) { - // Convert JSON to CSV format - const csvContent = []; - const keys = Object.keys(jsonData[0]); - csvContent.push(keys.join(',')); + // Convert JSON to CSV format + const csvContent = []; + const keys = Object.keys(jsonData[0]); + csvContent.push(keys.join(",")); - jsonData.forEach(entry => { - const values = keys.map(key => { - let value = entry[key]; - if (typeof value === 'string') { - value = `"${value}"`; // Enclose in double quotes to handle commas within strings - } - return value; - }); - csvContent.push(values.join(',')); - }); + jsonData.forEach((entry) => { + const values = keys.map((key) => { + let value = entry[key]; + if (typeof value === "string") { + value = `"${value}"`; // Enclose in double quotes to handle commas within strings + } + return value; + }); + csvContent.push(values.join(",")); + }); - // Create CSV file - const csvString = csvContent.join('\n'); - const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' }); - if (navigator.msSaveBlob) { // IE 10+ - navigator.msSaveBlob(blob, fileName); - } else { - const link = document.createElement('a'); - if (link.download !== undefined) { - const url = URL.createObjectURL(blob); - link.setAttribute('href', url); - link.setAttribute('download', fileName); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } else { - alert('Your browser does not support downloading files. Please try a different browser.'); - } - } + // Create CSV file + const csvString = csvContent.join("\n"); + const blob = new Blob([csvString], { type: "text/csv;charset=utf-8;" }); + if (navigator.msSaveBlob) { + // IE 10+ + navigator.msSaveBlob(blob, fileName); + } else { + const link = document.createElement("a"); + if (link.download !== undefined) { + const url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + alert( + "Your browser does not support downloading files. Please try a different browser." + ); + } + } } function generateQueryString(rows) { - // console.log("generateQueryString[called]", rows); - let obj = {}; - for (let row of rows) { - if (row.rule_field && row.operator && row.data) { - let val = ['IN', 'NOT IN'].includes(row.operator) ? row.data?.split(',').map(e => `'${e}'`).join(',') : row.data; - if (obj[row.group]) { - obj[row.group].push(`${row.rule_field} ${row.operator} ${val}`) - } else { - obj[row.group] = [`${row.rule_field} ${row.operator} ${val}`] - } - } - } - let cond = Object.keys(obj).map(e => `(${obj[e].join(' AND ')})`).join(' OR ') - document.getElementById('query').innerText = cond ? cond : 'Rules are not set for this scheme.' + // console.log("generateQueryString[called]", rows); + let obj = {}; + for (let row of rows) { + if (row.rule_field && row.operator && row.data) { + let val = ["IN", "NOT IN"].includes(row.operator) + ? row.data + ?.split(",") + .map((e) => `'${e}'`) + .join(",") + : row.data; + if (obj[row.group]) { + obj[row.group].push(`${row.rule_field} ${row.operator} ${val}`); + } else { + obj[row.group] = [`${row.rule_field} ${row.operator} ${val}`]; + } + } + } + let cond = Object.keys(obj) + .map((e) => `(${obj[e].join(" AND ")})`) + .join(" OR "); + document.getElementById("query").innerText = cond + ? cond + : "Rules are not set for this scheme."; } -var field_list = [] +var field_list = []; function get_field_list(child_table_field, frm) { - frappe.call({ - method: "myojana.rule_engine.apis.get_meta_api.get_field_lists", - args: { - doctype_name: "Beneficiary Profiling", - field_types: Object.keys(field_types) - }, - callback: function (response) { - // Handle the response - if (response.message) { - field_list = response.message - frm.fields_dict[child_table_field].grid.update_docfield_property("rule_field", "options", response.message); - // console.log(response.message); - } else { - // console.error("API call failed"); - } - } - }); - + frappe.call({ + method: "myojana.rule_engine.apis.get_meta_api.get_field_lists", + args: { + doctype_name: "Beneficiary Profiling", + field_types: Object.keys(field_types), + }, + callback: function (response) { + // Handle the response + if (response.message) { + field_list = response.message; + frm.fields_dict[child_table_field].grid.update_docfield_property( + "rule_field", + "options", + response.message + ); + // console.log(response.message); + } else { + // console.error("API call failed"); + } + }, + }); } function get_Link_list(doctype_name) { - return new Promise((resolve, reject) => { - frappe.call({ - method: "frappe.desk.search.search_link", - args: { - doctype: doctype_name, - txt: "", - page_length: 10000 - }, - callback: async function (response) { - let data = response?.results || response?.message - if (data) { - resolve(data); - } - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + method: "frappe.desk.search.search_link", + args: { + doctype: doctype_name, + txt: "", + page_length: 10000, + }, + callback: async function (response) { + let data = response?.results || response?.message; + if (data) { + resolve(data); + } + }, + }); + }); } function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: async function (response) { - resolve(response?.message || response?.value) - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: async function (response) { + resolve(response?.message || response?.value); + }, + }); + }); } const generate_filters = async (frm, datatable, filter_val) => { - response = await get_ben_list(frm, ['name', ...columns], filter_val) - await render_counts(response) - datatable.refresh(response.data) - // console.log("filter values", filter_val) - -} + response = await get_ben_list(frm, ["name", ...columns], filter_val); + await render_counts(response); + datatable.refresh(response.data); + // console.log("filter values", filter_val) +}; const addTableFilter = (datatable, elements = [], rows = []) => { - document.addEventListener('keyup', function (event) { - if (elements.includes(event.target.id)) { - let filters = [] - for (let el of elements) { - let val = document.getElementById(el)?.value; - if (val) { - filters.push({ [el]: __(val) }); - } else { - filters = filters.filter(filter => !filter.hasOwnProperty(el)); - } - } - generate_filters(cur_frm, datatable, filters) - datatable.refresh(rows) - } - }); -} + document.addEventListener("keyup", function (event) { + if (elements.includes(event.target.id)) { + let filters = []; + for (let el of elements) { + let val = document.getElementById(el)?.value; + if (val) { + filters.push({ [el]: __(val) }); + } else { + filters = filters.filter((filter) => !filter.hasOwnProperty(el)); + } + } + generate_filters(cur_frm, datatable, filters); + datatable.refresh(rows); + } + }); +}; const get_ben_list = async (frm, columns, filters = [], start = 0, page_imit = 100) => { - // console.log("filters", filters,) - let list = await callAPI({ - method: 'myojana.api.eligible_beneficiaries', - freeze: true, - args: { - "scheme": frm.doc.name, - columns: columns, - filters: filters, - start: start, - page_imit: page_imit - }, - freeze_message: __("Getting beneficiaries..."), - }) - // scheme_list = list.sort((a, b) => b.matching_rules_per - a.matching_rules_per); - return list -} + // console.log("filters", filters,) + let list = await callAPI({ + method: "myojana.api.eligible_beneficiaries", + freeze: true, + args: { + scheme: frm.doc.name, + columns: columns, + filters: filters, + start: start, + page_imit: page_imit, + }, + freeze_message: __("Getting beneficiaries..."), + }); + // scheme_list = list.sort((a, b) => b.matching_rules_per - a.matching_rules_per); + return list; +}; let tableConf = { - columns: [ - { - name: " ", - id: 'serial_no', - editable: false, - resizable: true, - sortable: false, - focusable: false, - dropdown: true, - width: 100, - format: (value, columns, ops, row) => { - // console.log(current_page) - return (columns?.[0]?.rowIndex + 1) - } - }, - { - name: __("Name of the beneficiary"), - id: 'name_of_the_beneficiary', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: true, - width: 200, - format: (value, columns, ops, row, i) => { - return `${row.name_of_the_beneficiary}` - } - }, - { - name: __("Primary member"), - id: 'name_of_parents', - field: 'select_primary_member.name_of_parents', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 200, - }, - { - name: __("Contact number"), - id: 'contact_number', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 150, - }, - { - name: __("Block"), - id: 'block_name', - field: 'ward.block_name', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 200, - }, - { - name: __("Name of the settlement"), - id: 'village_name', - field: 'name_of_the_settlement.village_name', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 200, - } - ], - rows: [], - filterable: true + columns: [ + { + name: " ", + id: "serial_no", + editable: false, + resizable: true, + sortable: false, + focusable: false, + dropdown: true, + width: 100, + format: (value, columns, ops, row) => { + // console.log(current_page) + return columns?.[0]?.rowIndex + 1; + }, + }, + { + name: __("Name of the beneficiary"), + id: "name_of_the_beneficiary", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: true, + width: 200, + format: (value, columns, ops, row, i) => { + return `${row.name_of_the_beneficiary}`; + }, + }, + { + name: __("Primary member"), + id: "name_of_parents", + field: "select_primary_member.name_of_parents", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 200, + }, + { + name: __("Contact number"), + id: "contact_number", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 150, + }, + { + name: __("Block"), + id: "block_name", + field: "ward.block_name", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 200, + }, + { + name: __("Name of the settlement"), + id: "village_name", + field: "name_of_the_settlement.village_name", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 200, + }, + ], + rows: [], + filterable: true, }; -const render_counts = async(response)=>{ - document.getElementById('total') ? document.getElementById('total').innerText = "Total: Beneficiary: " + response?.count?.total + ',' : '' - document.getElementById('total_family') ? document.getElementById('total_family').innerText = "Primary member: " + response?.count?.family_count + ',' : '' - document.getElementById('block_count') ? document.getElementById('block_count').innerText = "Block count: " + response?.count?.block_count + ',' : '' - document.getElementById('settlement_count') ? document.getElementById('settlement_count').innerText = "Settlement count: " + response?.count?.settlement_count : '' -} -var page_list +const render_counts = async (response) => { + document.getElementById("total") + ? (document.getElementById("total").innerText = + "Total: Beneficiary: " + response?.count?.total + ",") + : ""; + document.getElementById("total_family") + ? (document.getElementById("total_family").innerText = + "Primary member: " + response?.count?.family_count + ",") + : ""; + document.getElementById("block_count") + ? (document.getElementById("block_count").innerText = + "Block count: " + response?.count?.block_count + ",") + : ""; + document.getElementById("settlement_count") + ? (document.getElementById("settlement_count").innerText = + "Settlement count: " + response?.count?.settlement_count) + : ""; +}; +var page_list; const render_table = async (frm) => { - response = { count: { total: 0, family_count: 0, }, data: [] }; - let total_page = 0; - get_field_list('rules', frm) - if (!frm?.doc?.__islocal) { - columns = tableConf.columns.map(e => (e.field ? e.field : e.id)) - response = await get_ben_list(frm, ['name', ...columns]) - total_page = Math.ceil((response?.count.total / 100)); - } - page_list = `
  • + response = { count: { total: 0, family_count: 0 }, data: [] }; + let total_page = 0; + get_field_list("rules", frm); + if (!frm?.doc?.__islocal) { + columns = tableConf.columns.map((e) => (e.field ? e.field : e.id)); + response = await get_ben_list(frm, ["name", ...columns]); + total_page = Math.ceil(response?.count.total / 100); + } + page_list = `
  • « Previous -
  • ` - for (let i = 1; i <= total_page; i++) { - page_list = page_list + `
  • ${i}
  • ` - // console.log("loop page", i) - } - page_list = page_list + ` + `; + for (let i = 1; i <= total_page; i++) { + page_list = + page_list + `
  • ${i}
  • `; + // console.log("loop page", i) + } + page_list = + page_list + + `
  • » Next -
  • ` - let pagination_page = document.getElementById('page_list') - pagination_page.innerHTML = page_list + `; + let pagination_page = document.getElementById("page_list"); + pagination_page.innerHTML = page_list; - const container = document.getElementById('eligible_beneficiaries'); - const datatable = new DataTable(container, { - layout: 'fluid', - columns: tableConf.columns, - serialNoColumn: false - }); - // next page on pagination - document.getElementById('next-page').onclick = () => { - current_page += 1 - // console.log(current_page) - } - // previous page of pagination - document.getElementById("previous-page").onclick = () => { - current_page -= 1 - // console.log(current_page) - } - const elements = document.querySelectorAll('.page-value'); - elements.forEach(element => { - element.addEventListener('click', async function (event) { - current_page = Number(event.target.innerText); - let active_page = Number(event.target.innerText) - const start = (active_page > 1 ? ((active_page * (100)) - 100) : 0) - response = await get_ben_list(frm, ['name', ...columns], [], start, 100) - datatable.refresh(response.data); - }); - }); - datatable.style.setStyle(`.dt-scrollable`, { height: '400px!important', overflow: 'scroll!important' }); - datatable.style.setStyle(`.dt-instance-1 .dt-cell__content--col-0`, { width: '660px' }); - datatable.refresh(response?.data); - addTableFilter(datatable, ['name_of_the_beneficiary', 'name_of_parents', 'contact_number', 'block_name'], response?.data) - document.getElementById('parent').style.display = "flex"; - document.getElementById('parent').style.columnGap = "15px"; - document.getElementById('parent').style.flexWrap = "wrap"; - await render_counts(response) - // document.getElementById('pagination') ? document.getElementById('pagination').innerHTML = paginationHTML : "" - frm.set_query("name_of_department", () => { return { page_length: 1000 }; }); - if (frm.doc.department_urlwebsite) { - frm.add_web_link(frm?.doc?.department_urlwebsite) - } - generateQueryString(frm.doc[child_table_field]) -} + const container = document.getElementById("eligible_beneficiaries"); + const datatable = new DataTable(container, { + layout: "fluid", + columns: tableConf.columns, + serialNoColumn: false, + }); + // next page on pagination + document.getElementById("next-page").onclick = () => { + current_page += 1; + // console.log(current_page) + }; + // previous page of pagination + document.getElementById("previous-page").onclick = () => { + current_page -= 1; + // console.log(current_page) + }; + const elements = document.querySelectorAll(".page-value"); + elements.forEach((element) => { + element.addEventListener("click", async function (event) { + current_page = Number(event.target.innerText); + let active_page = Number(event.target.innerText); + const start = active_page > 1 ? active_page * 100 - 100 : 0; + response = await get_ben_list(frm, ["name", ...columns], [], start, 100); + datatable.refresh(response.data); + }); + }); + datatable.style.setStyle(`.dt-scrollable`, { + height: "400px!important", + overflow: "scroll!important", + }); + datatable.style.setStyle(`.dt-instance-1 .dt-cell__content--col-0`, { width: "660px" }); + datatable.refresh(response?.data); + addTableFilter( + datatable, + ["name_of_the_beneficiary", "name_of_parents", "contact_number", "block_name"], + response?.data + ); + document.getElementById("parent").style.display = "flex"; + document.getElementById("parent").style.columnGap = "15px"; + document.getElementById("parent").style.flexWrap = "wrap"; + await render_counts(response); + // document.getElementById('pagination') ? document.getElementById('pagination').innerHTML = paginationHTML : "" + frm.set_query("name_of_department", () => { + return { page_length: 1000 }; + }); + if (frm.doc.department_urlwebsite) { + frm.add_web_link(frm?.doc?.department_urlwebsite); + } + generateQueryString(frm.doc[child_table_field]); +}; frappe.ui.form.on("Scheme", { - async refresh(frm) { - // render_table(frm) - // document.getElementById('export-exel').onclick = function () { - // convertJSONToCSV(response.data, "eligible_ben") - // } - let wrapper = document.getElementById('eligible_beneficiaries'); - new SchemeEligibleBen(frm, wrapper) - }, - async onload(frm) { - }, - before_save: async function (frm) { - }, - type_of_the_scheme: function (frm) { - if (frm.doc.type_of_the_scheme != "State") { - frm.set_value("state", ""); - } - }, - name_of_department: function (frm) { - if (frm.doc.department_urlwebsite) { - frm.add_web_link(frm?.doc?.department_urlwebsite) - } - }, - // name_of_beneficiary: async function (frm) { - // generate_filters(frm) + async refresh(frm) { + // render_table(frm) + // document.getElementById('export-exel').onclick = function () { + // convertJSONToCSV(response.data, "eligible_ben") + // } + let wrapper = document.getElementById("eligible_beneficiaries"); + new SchemeEligibleBen(frm, wrapper); + }, + async onload(frm) {}, + before_save: async function (frm) {}, + type_of_the_scheme: function (frm) { + if (frm.doc.type_of_the_scheme != "State") { + frm.set_value("state", ""); + } + }, + name_of_department: function (frm) { + if (frm.doc.department_urlwebsite) { + frm.add_web_link(frm?.doc?.department_urlwebsite); + } + }, + // name_of_beneficiary: async function (frm) { + // generate_filters(frm) - // }, - // primary_member: async function (frm) { - // generate_filters(frm) - // }, - // phone_number: async function (frm) { - // generate_filters(frm) - // }, - // block: async function (frm) { - // generate_filters(frm) - // }, + // }, + // primary_member: async function (frm) { + // generate_filters(frm) + // }, + // phone_number: async function (frm) { + // generate_filters(frm) + // }, + // block: async function (frm) { + // generate_filters(frm) + // }, }); const form_events = { - [`${child_table_field}_add`]: (frm, cdt, cdn) => { - let initial_code = 64 - let row = frappe.get_doc(cdt, cdn); - if (row.idx <= 26) { - row.code = (String.fromCharCode(initial_code + row.idx)) - } else { - row.code = (String.fromCharCode(initial_code + (row.idx - 26)) + String.fromCharCode(initial_code + (row.idx - 26))) - } - get_field_list('rules', frm) - } -} -frappe.ui.form.on('Rule Engine Child', { - refresh(frm) { - generateQueryString(frm.doc[child_table_field]) - }, - form_render(frm) { - generateQueryString(frm.doc[child_table_field]) - }, - ...form_events, - rule_field: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.type = field_list?.find(f => f.value == row.rule_field)?.type; - frm.fields_dict[child_table_field].grid.update_docfield_property("operator", "options", field_types[row.type]); - let options = field_list.find(f => f.value == row.rule_field)?.options; + [`${child_table_field}_add`]: (frm, cdt, cdn) => { + let initial_code = 64; + let row = frappe.get_doc(cdt, cdn); + if (row.idx <= 26) { + row.code = String.fromCharCode(initial_code + row.idx); + } else { + row.code = + String.fromCharCode(initial_code + (row.idx - 26)) + + String.fromCharCode(initial_code + (row.idx - 26)); + } + get_field_list("rules", frm); + }, +}; +frappe.ui.form.on("Rule Engine Child", { + refresh(frm) { + generateQueryString(frm.doc[child_table_field]); + }, + form_render(frm) { + generateQueryString(frm.doc[child_table_field]); + }, + ...form_events, + rule_field: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.type = field_list?.find((f) => f.value == row.rule_field)?.type; + frm.fields_dict[child_table_field].grid.update_docfield_property( + "operator", + "options", + field_types[row.type] + ); + let options = field_list.find((f) => f.value == row.rule_field)?.options; - if (row.type == "Link") { - let link_data = await get_Link_list(options) - frm.fields_dict[child_table_field].grid.update_docfield_property("select", "options", link_data); - } - if (row.type == "Select") { - let link_data = options?.split('\n').filter(f => f).map(e => { return { 'label': e, 'value': e } }) - frm.fields_dict[child_table_field].grid.update_docfield_property("select", "options", link_data); - } - frm.fields_dict[child_table_field].grid.refresh(); - var cur_grid = frm.get_field(`${child_table_field}`).grid; - var cur_doc = locals[cdt][cdn]; - var cur_row = cur_grid.get_row(cur_doc.name); - // cur_row.toggle_view(); - }, - data: (frm) => { - frm.fields_dict[child_table_field].grid.refresh(); - generateQueryString(frm.doc[child_table_field]) - }, - date: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.date - frm.fields_dict[child_table_field].grid.refresh(); - generateQueryString(frm.doc[child_table_field]) - }, - select: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.select - frm.fields_dict[child_table_field].grid.refresh(); - generateQueryString(frm.doc[child_table_field]) - }, - value: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.value - frm.fields_dict[child_table_field].grid.refresh(); - generateQueryString(frm.doc[child_table_field]) - } -}) \ No newline at end of file + if (row.type == "Link") { + let link_data = await get_Link_list(options); + frm.fields_dict[child_table_field].grid.update_docfield_property( + "select", + "options", + link_data + ); + } + if (row.type == "Select") { + let link_data = options + ?.split("\n") + .filter((f) => f) + .map((e) => { + return { label: e, value: e }; + }); + frm.fields_dict[child_table_field].grid.update_docfield_property( + "select", + "options", + link_data + ); + } + frm.fields_dict[child_table_field].grid.refresh(); + var cur_grid = frm.get_field(`${child_table_field}`).grid; + var cur_doc = locals[cdt][cdn]; + var cur_row = cur_grid.get_row(cur_doc.name); + // cur_row.toggle_view(); + }, + data: (frm) => { + frm.fields_dict[child_table_field].grid.refresh(); + generateQueryString(frm.doc[child_table_field]); + }, + date: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.date; + frm.fields_dict[child_table_field].grid.refresh(); + generateQueryString(frm.doc[child_table_field]); + }, + select: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.select; + frm.fields_dict[child_table_field].grid.refresh(); + generateQueryString(frm.doc[child_table_field]); + }, + value: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.value; + frm.fields_dict[child_table_field].grid.refresh(); + generateQueryString(frm.doc[child_table_field]); + }, +}); diff --git a/myojana/master/doctype/scheme/scheme.py b/myojana/master/doctype/scheme/scheme.py index 9c2c9ac..2bdac9b 100644 --- a/myojana/master/doctype/scheme/scheme.py +++ b/myojana/master/doctype/scheme/scheme.py @@ -2,10 +2,13 @@ # For license information, please see license.txt # import frappe -from frappe.model.document import Document import re -from frappe import _ + import frappe +from frappe import _ +from frappe.model.document import Document + + class Scheme(Document): def validate(self): # validation for rules is set or not @@ -32,17 +35,17 @@ def validate(self): # return str(err) def generate_query_string(rows, __expression): - expression = __expression.replace('and', '#').replace('or', '%') - expression = expression.replace('AND', '#').replace('OR', '%') + expression = __expression.replace("and", "#").replace("or", "%") + expression = expression.replace("AND", "#").replace("OR", "%") for row in rows: - if row['operator'] in ['IN', 'NOT IN']: - val = ','.join([f"'{e.strip()}'" for e in row['data'].split(',')]) if row['data'] else '' - expression = expression.replace(row['code'], f"{row['rule_field']} {row['operator']} ({val})") + if row["operator"] in ["IN", "NOT IN"]: + val = ",".join([f"'{e.strip()}'" for e in row["data"].split(",")]) if row["data"] else "" + expression = expression.replace(row["code"], f"{row['rule_field']} {row['operator']} ({val})") else: - expression = expression.replace(row['code'], f"{row['rule_field']} {row['operator']} '{row['data']}'") + expression = expression.replace( + row["code"], f"{row['rule_field']} {row['operator']} '{row['data']}'" + ) - expression = expression.replace('#', 'and').replace('%', 'or') + expression = expression.replace("#", "and").replace("%", "or") return f"select * from `tabBeneficiary Profiling` where {expression}" - - diff --git a/myojana/master/doctype/scheme/scheme_list.js b/myojana/master/doctype/scheme/scheme_list.js index c4032fe..5e503f6 100644 --- a/myojana/master/doctype/scheme/scheme_list.js +++ b/myojana/master/doctype/scheme/scheme_list.js @@ -1,50 +1,49 @@ - async function update_enable_disable(listview, value) { - let names = []; - await $.each(listview.get_checked_items(), function (key, value) { - names.push(value.name); - }); - if (names.length === 0) { - frappe.throw(__("No rows selected.")); - } - let res = await toggleEnableDisable(names, value) - listview.clear_checked_items() - listview.refresh() - if (value === 1) { - frappe.msgprint(`

    ${res.message} Schemes enabled successfully

    `) - } else { - frappe.msgprint(`

    ${res.message} Schemes disabled successfully

    `) - } + let names = []; + await $.each(listview.get_checked_items(), function (key, value) { + names.push(value.name); + }); + if (names.length === 0) { + frappe.throw(__("No rows selected.")); + } + let res = await toggleEnableDisable(names, value); + listview.clear_checked_items(); + listview.refresh(); + if (value === 1) { + frappe.msgprint(`

    ${res.message} Schemes enabled successfully

    `); + } else { + frappe.msgprint(`

    ${res.message} Schemes disabled successfully

    `); + } } const toggleEnableDisable = async (list, value) => { - return await frappe.call({ - method: "myojana.apis.update_scheme.toggle_enable_disable", - freeze: true, - args: { - "list": list, - "value": value - }, - freeze_message: __("Updating schemes..."), - callback: function (response) { - if (response.message) { - return response.message - } else { - console.log("Api Failed....") - } - } - }); -} -frappe.listview_settings['Scheme'] = { - refresh: function (listview) { - // console.log(listview) - listview.page.add_actions_menu_item("Enable Selected", async function () { - await update_enable_disable(listview, 1) - }); - listview.page.add_actions_menu_item("Disable Selected", async function () { - await update_enable_disable(listview, 0) - }); - }, - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file + return await frappe.call({ + method: "myojana.apis.update_scheme.toggle_enable_disable", + freeze: true, + args: { + list: list, + value: value, + }, + freeze_message: __("Updating schemes..."), + callback: function (response) { + if (response.message) { + return response.message; + } else { + console.log("Api Failed...."); + } + }, + }); +}; +frappe.listview_settings["Scheme"] = { + refresh: function (listview) { + // console.log(listview) + listview.page.add_actions_menu_item("Enable Selected", async function () { + await update_enable_disable(listview, 1); + }); + listview.page.add_actions_menu_item("Disable Selected", async function () { + await update_enable_disable(listview, 0); + }); + }, + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/social_vulnerable_category/social_vulnerable_category_list.js b/myojana/master/doctype/social_vulnerable_category/social_vulnerable_category_list.js index c89c9de..abf5e9a 100644 --- a/myojana/master/doctype/social_vulnerable_category/social_vulnerable_category_list.js +++ b/myojana/master/doctype/social_vulnerable_category/social_vulnerable_category_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Social vulnerable category'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Social vulnerable category"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/source_of_information/source_of_information_list.js b/myojana/master/doctype/source_of_information/source_of_information_list.js index dd4eb93..d576086 100644 --- a/myojana/master/doctype/source_of_information/source_of_information_list.js +++ b/myojana/master/doctype/source_of_information/source_of_information_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Source Of Information'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Source Of Information"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/state/state_list.js b/myojana/master/doctype/state/state_list.js index 2c87ed2..5f8534c 100644 --- a/myojana/master/doctype/state/state_list.js +++ b/myojana/master/doctype/state/state_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['State'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["State"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/support_category/support_category_list.js b/myojana/master/doctype/support_category/support_category_list.js index 3a8c71f..e1d2c79 100644 --- a/myojana/master/doctype/support_category/support_category_list.js +++ b/myojana/master/doctype/support_category/support_category_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Support category'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Support category"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/doctype/village/village.js b/myojana/master/doctype/village/village.js index c21c2c5..ae7d0aa 100644 --- a/myojana/master/doctype/village/village.js +++ b/myojana/master/doctype/village/village.js @@ -1,38 +1,42 @@ // Copyright (c) 2023, suvaidyam and contributors // For license information, please see license.txt -const apply_filter = (frm , field_name , filter_on , filter_value)=>{ - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: filter_value, - }, - page_length: 1000 - }; - } -} +const apply_filter = (frm, field_name, filter_on, filter_value) => { + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: filter_value, + }, + page_length: 1000, + }; + }; +}; function defult_filter(field_name, filter_on, frm) { - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, - }, - }; - } - }; - function hide_advance_search(frm, list) { - for (item of list) { - frm.set_df_property(item, 'only_select', true); - } - }; + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, + }, + }; + }; +} +function hide_advance_search(frm, list) { + for (const item of list) { + frm.set_df_property(item, "only_select", true); + } +} frappe.ui.form.on("Village", { refresh(frm) { - frm.doc.state ? apply_filter(frm ,"district", "state", frm.doc.state) : defult_filter('district', "state", frm); - frm.doc.district ? apply_filter(frm ,"block", "district", frm.doc.district) : defult_filter('block', "district", frm); + frm.doc.state + ? apply_filter(frm, "district", "state", frm.doc.state) + : defult_filter("district", "state", frm); + frm.doc.district + ? apply_filter(frm, "block", "district", frm.doc.district) + : defult_filter("block", "district", frm); + }, + state: function (frm) { + apply_filter(frm, "district", "state", frm.doc.state); + }, + district: function (frm) { + apply_filter(frm, "block", "district", frm.doc.district); }, - state:function(frm){ - apply_filter(frm , 'district', "state", frm.doc.state) - }, - district:function(frm){ - apply_filter(frm , 'block', "district", frm.doc.district) - } }); diff --git a/myojana/master/doctype/village/village_list.js b/myojana/master/doctype/village/village_list.js index 41a6ec0..a5c0df1 100644 --- a/myojana/master/doctype/village/village_list.js +++ b/myojana/master/doctype/village/village_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Village'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Village"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/master/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js b/myojana/master/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js index d1458ee..9960051 100644 --- a/myojana/master/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js +++ b/myojana/master/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js @@ -2,7 +2,5 @@ // For license information, please see license.txt frappe.query_reports["Camps-wise beneficiaries"] = { - "filters": [ - - ] + filters: [], }; diff --git a/myojana/middlewares/centre.py b/myojana/middlewares/centre.py index 5764b2c..d84b80a 100644 --- a/myojana/middlewares/centre.py +++ b/myojana/middlewares/centre.py @@ -1,19 +1,20 @@ import frappe + from myojana.utils.cache import Cache -def list_query(user): - if not user: - user = frappe.session.user - # value = Cache.get_csc() - if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - pass - # return """(`tabCentre`.state = '{0}')""".format(value) - # elif "CSC Member" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - # return """(`tabCentre`.Centre = '{0}')""".format(value) - # elif "Sub-Centre" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - # return """(`tabCentre`.Centre = '{0}')""".format(value) - # elif "MIS executive" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - # return """(`tabCentre`.Centre = '{0}')""".format(value) - else: - return "" +def list_query(user): + if not user: + user = frappe.session.user + # value = Cache.get_csc() + if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + pass + # return """(`tabCentre`.state = '{0}')""".format(value) + # elif "CSC Member" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + # return """(`tabCentre`.Centre = '{0}')""".format(value) + # elif "Sub-Centre" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + # return """(`tabCentre`.Centre = '{0}')""".format(value) + # elif "MIS executive" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + # return """(`tabCentre`.Centre = '{0}')""".format(value) + else: + return "" diff --git a/myojana/middlewares/myojana_users.py b/myojana/middlewares/myojana_users.py index 2f4b635..2df59a4 100644 --- a/myojana/middlewares/myojana_users.py +++ b/myojana/middlewares/myojana_users.py @@ -1,20 +1,21 @@ import frappe + + def list_query(user): - if not user: - user = frappe.session.user - - # if"Administrator" not in frappe.get_roles(user): + if not user: + user = frappe.session.user + + # if"Administrator" not in frappe.get_roles(user): - - if"Administrator" in frappe.get_roles(user): - return '' - # elif "Admin" in frappe.get_roles(user) and "Administrator" not in frappe.get_roles(user): - # include_roles = ['CSC Member', 'MIS executive', 'Sub-Centre'] - # profile_condition = f"""(`tabMyojana User`.name = '{user}' OR `tabMyojana User`.role_profile IN ({', '.join(f"'{r}'" for r in include_roles)}) And `tabMyojana User`.state = '{state}')""" - # return profile_condition - # elif("MIS executive" in frappe.get_roles(user) and "Administrator" not in frappe.get_roles(user)): - # include_roles = ['CSC Member', 'Sub-Centre'] - # profile_condition = f"""(`tabMyojana User`.name = '{user}' OR `tabMyojana User`.role_profile IN ({', '.join(f"'{r}'" for r in include_roles)}) And `tabMyojana User`.state = '{state}')""" - # return profile_condition - else: - return "" + if "Administrator" in frappe.get_roles(user): + return "" + # elif "Admin" in frappe.get_roles(user) and "Administrator" not in frappe.get_roles(user): + # include_roles = ['CSC Member', 'MIS executive', 'Sub-Centre'] + # profile_condition = f"""(`tabMyojana User`.name = '{user}' OR `tabMyojana User`.role_profile IN ({', '.join(f"'{r}'" for r in include_roles)}) And `tabMyojana User`.state = '{state}')""" + # return profile_condition + # elif("MIS executive" in frappe.get_roles(user) and "Administrator" not in frappe.get_roles(user)): + # include_roles = ['CSC Member', 'Sub-Centre'] + # profile_condition = f"""(`tabMyojana User`.name = '{user}' OR `tabMyojana User`.role_profile IN ({', '.join(f"'{r}'" for r in include_roles)}) And `tabMyojana User`.state = '{state}')""" + # return profile_condition + else: + return "" diff --git a/myojana/middlewares/role_profile.py b/myojana/middlewares/role_profile.py index d048f56..fc8bbfc 100644 --- a/myojana/middlewares/role_profile.py +++ b/myojana/middlewares/role_profile.py @@ -1,11 +1,15 @@ import frappe + + def list_query(user): - if not user: - user = frappe.session.user - - if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - return """(`tabRole Profile`.role_profile != '{0}')""".format('Admin') - elif "MIS executive" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - excluded_roles = ['Admin', 'MIS executive'] - return """(`tabRole Profile`.role_profile NOT IN ({0}))""".format(', '.join(f"'{r}'" for r in excluded_roles)) - return "" + if not user: + user = frappe.session.user + + if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + return """(`tabRole Profile`.role_profile != '{}')""".format("Admin") + elif "MIS executive" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + excluded_roles = ["Admin", "MIS executive"] + return """(`tabRole Profile`.role_profile NOT IN ({}))""".format( + ", ".join(f"'{r}'" for r in excluded_roles) + ) + return "" diff --git a/myojana/middlewares/sub_centre.py b/myojana/middlewares/sub_centre.py index 48eb1c5..d360722 100644 --- a/myojana/middlewares/sub_centre.py +++ b/myojana/middlewares/sub_centre.py @@ -1,12 +1,14 @@ import frappe + + def list_query(user): - if not user: - user = frappe.session.user - - if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): - # return """(`tabSub Centre`.centre != '{0}')""".format('Admin') - return None - elif("Administrator" not in frappe.get_roles(user)): - pass - # return "(`tabSub Centre`.centre = '{0}')".format(centres) - return None + if not user: + user = frappe.session.user + + if "Admin" in frappe.get_roles(user) and ("Administrator" not in frappe.get_roles(user)): + # return """(`tabSub Centre`.centre != '{0}')""".format('Admin') + return None + elif "Administrator" not in frappe.get_roles(user): + pass + # return "(`tabSub Centre`.centre = '{0}')".format(centres) + return None diff --git a/myojana/middlewares/test.py b/myojana/middlewares/test.py index 7d5d0e0..d65f10f 100644 --- a/myojana/middlewares/test.py +++ b/myojana/middlewares/test.py @@ -2,5 +2,5 @@ def test(doc, method): - frappe.msgprint("Hello from test middleware") - frappe.msgprint(f"Method: {method}") + frappe.msgprint("Hello from test middleware") + frappe.msgprint(f"Method: {method}") diff --git a/myojana/middlewares/user.py b/myojana/middlewares/user.py index 5c49a8b..b293ecc 100644 --- a/myojana/middlewares/user.py +++ b/myojana/middlewares/user.py @@ -1,8 +1,9 @@ import frappe -def list_query(user): - if not user: - user = frappe.session.user - if "Administrator" and "Admin" not in frappe.get_roles(user): - profile_condition = f"""(`tabUser`.name = '{user}')""" - return profile_condition + +def list_query(user): + if not user: + user = frappe.session.user + if "Administrator" and "Admin" not in frappe.get_roles(user): + profile_condition = f"""(`tabUser`.name = '{user}')""" + return profile_condition diff --git a/myojana/myojana/doctype/app_template/app_template.js b/myojana/myojana/doctype/app_template/app_template.js index 4980652..2c88c92 100644 --- a/myojana/myojana/doctype/app_template/app_template.js +++ b/myojana/myojana/doctype/app_template/app_template.js @@ -1,46 +1,48 @@ // Copyright (c) 2024, dhwaniris and contributors // For license information, please see license.txt -const wait = (seconds)=>{ - return new Promise((resolve,reject)=>{ - setTimeout(()=>{ - resolve(); - },seconds*1000) - }) -} +const wait = (seconds) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(); + }, seconds * 1000); + }); +}; -const render_image = (frm)=>{ - frappe.call({ - method: "myojana.apis.html_to_image.preview_image", - headers:{ - - }, - args: { - doctype:frm.doc.ref_doctype, - doc:frm.doc.ref_doc, - template:frm.doc.html, - options:frm.doc.options - } - }).then(async(res)=>{ - document.getElementById("preview_html").innerHTML = ``; - - }).catch(err=>{ - console.log("Error",err); - }) -} +const render_image = (frm) => { + frappe + .call({ + method: "myojana.apis.html_to_image.preview_image", + headers: {}, + args: { + doctype: frm.doc.ref_doctype, + doc: frm.doc.ref_doc, + template: frm.doc.html, + options: frm.doc.options, + }, + }) + .then(async (res) => { + document.getElementById( + "preview_html" + ).innerHTML = ``; + }) + .catch((err) => { + console.log("Error", err); + }); +}; frappe.ui.form.on("App Template", { refresh(frm) { - if(frm.doc.ref_doctype&&frm.doc.ref_doc){ - render_image(frm); - } + if (frm.doc.ref_doctype && frm.doc.ref_doc) { + render_image(frm); + } + }, + html: (frm) => { + // if(frm.doc.ref_doctype&&frm.doc.ref_doc){ + // render_image(frm); + // } + }, + preview: (frm) => { + if (frm.doc.ref_doctype && frm.doc.ref_doc) { + render_image(frm); + } }, - html:(frm)=>{ - // if(frm.doc.ref_doctype&&frm.doc.ref_doc){ - // render_image(frm); - // } - }, - preview:(frm)=>{ - if(frm.doc.ref_doctype&&frm.doc.ref_doc){ - render_image(frm); - } - }, }); diff --git a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.js b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.js index 8bc09b9..9a5a2c8 100644 --- a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.js +++ b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.js @@ -6,424 +6,562 @@ const indianPhoneNumberRegex = /^(?:(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[6789] let state_option = []; let districts_option = []; function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: async function (response) { - resolve(response?.message || response?.value) - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: async function (response) { + resolve(response?.message || response?.value); + }, + }); + }); } async function autoSetOption(frm) { - let centre_meta = frm?.meta?.fields?.filter((e)=> e.fieldname == "centre")[0] - if(centre_meta.hidden != 1){ - let centres = await callAPI({ - method: 'frappe.desk.search.search_link', - freeze: false, - args: { - txt: '', - doctype: "Centre", - reference_doctype: "Beneficiary Profiling" - }, - }) - if (centres?.length === 1) { - frm.set_value("centre", centres[0].value) - } - }else{ - console.log("centre is hidden fields",) - } - state_option = await callAPI({ - method: 'frappe.desk.search.search_link', - freeze: false, - args: { - txt: '', - doctype: "State", - reference_doctype: "Beneficiary Profiling" - }, - }) - districts_option = await callAPI({ - method: 'frappe.desk.search.search_link', - freeze: false, - args: { - txt: '', - doctype: "District", - reference_doctype: "Beneficiary Profiling" - }, - // freeze_message: __("Getting Districts"), - }) - - if (state_option?.length === 1) { - frm.set_value("state", state_option[0].value) - } - if (districts_option?.length === 1) { - frm.set_value("district", districts_option[0].value) - } + let centre_meta = frm?.meta?.fields?.filter((e) => e.fieldname == "centre")[0]; + if (centre_meta.hidden != 1) { + let centres = await callAPI({ + method: "frappe.desk.search.search_link", + freeze: false, + args: { + txt: "", + doctype: "Centre", + reference_doctype: "Beneficiary Profiling", + }, + }); + if (centres?.length === 1) { + frm.set_value("centre", centres[0].value); + } + } else { + console.log("centre is hidden fields"); + } + state_option = await callAPI({ + method: "frappe.desk.search.search_link", + freeze: false, + args: { + txt: "", + doctype: "State", + reference_doctype: "Beneficiary Profiling", + }, + }); + districts_option = await callAPI({ + method: "frappe.desk.search.search_link", + freeze: false, + args: { + txt: "", + doctype: "District", + reference_doctype: "Beneficiary Profiling", + }, + // freeze_message: __("Getting Districts"), + }); + + if (state_option?.length === 1) { + frm.set_value("state", state_option[0].value); + } + if (districts_option?.length === 1) { + frm.set_value("district", districts_option[0].value); + } } async function get_myojana_setting() { - let get_myojana_setting = await callAPI({ - method: 'myojana.apis.myojana_setting.get_myojana_setting', - freeze: true, - args: { - fields: ['is_primary_member_link_through_phone_number'] - }, - // freeze_message: __("Getting Centres"), - }) - return get_myojana_setting.is_primary_member_link_through_phone_number + let get_myojana_setting = await callAPI({ + method: "myojana.apis.myojana_setting.get_myojana_setting", + freeze: true, + args: { + fields: ["is_primary_member_link_through_phone_number"], + }, + // freeze_message: __("Getting Centres"), + }); + return get_myojana_setting.is_primary_member_link_through_phone_number; } frappe.ui.form.on("Beneficiary Profiling", { - after_save: async function (frm) { - if (!frm.is_new()) { - frm.debounced_reload_doc() - } - }, - before_save: async function (frm) { - if ((frm.doc.completed_age || frm.doc.completed_age_month) && !frm.doc?.date_of_birth) { - await frm.set_value("date_of_birth", generateDOBFromAge(frm.doc?.completed_age, frm.doc?.completed_age_month, frm.doc?.date_of_birth)) - } - // fill into hidden fields - if (frm?.doc?.scheme_table && frm.doc?.scheme_table?.length) { - for (_doc of frm?.doc?.scheme_table) { - _doc.scheme = _doc.name_of_the_scheme; - _doc.milestone = _doc.milestone_category; - } - } - // check alternate mobile number digits - if (is_primary_member_link_through_phone_number && (frm.doc.alternate_contact_number || frm.doc.contact_number)) { - if (!indianPhoneNumberRegex.test(frm.doc.contact_number)) { - frappe.throw(`Phone Number ${frm.doc.contact_number} set in field contact_number is not valid.`) - } - } - if (!indianPhoneNumberRegex.test(frm.doc.alternate_contact_number) && frm.doc.alternate_contact_number?.length > 1) { - frappe.throw(`Phone Number ${frm.doc.alternate_contact_number} set in field alternate_contact_number is not valid.`) - } - }, - async refresh(frm) { - is_primary_member_link_through_phone_number = await get_myojana_setting() - if (frm.is_new()) { - console.log("new data") - await autoSetOption(frm); // set options of centre and sub centre - await frm.set_value('added_by', frappe.session.user); - await frm.set_value('date_of_visit', frappe.datetime.get_today()); // SET TODAY DATE IN DATE OF VISIT - - } else { - frm.add_custom_button(__('Add family members'), function () { - frappe.route_options = { - has_anyone_from_your_family_visisted_before: "Yes", - select_primary_member: frm.doc.select_primary_member || frm.doc.contact_number, - }; - frappe.new_doc('Beneficiary Profiling'); - }, __()); - - let id_card_template = await frappe.db.get_single_value('mYojana Settings', 'id_card_template') - if (id_card_template) { - frm.add_custom_button(__(' '), async function () { - let base64Image = await callAPI({ - method: 'myojana.apis.html_to_image.preview_doc_template', - freeze: true, - args: { - doc:frm.doc.name, - doctype:frm.doctype, - }, - // freeze_message: __("getting template..."), - }); - console.log('base64Image', base64Image); - - const imgSrc = `data:image/png;base64,${base64Image}`; - - // console.log('print_template', print_template); - let d = new frappe.ui.Dialog({ - title: __("Confirmation"), - fields: [ - { - fieldtype: 'HTML', - options: `Rendered Image` - } - ], - primary_action_label: 'Send', - primary_action: async function () { - console.log('Send button clicked primary action'); - let id_doc = await callAPI({ - method: 'myojana.apis.whatsapp.send_id', - freeze: true, - args: { - doc:frm.doc.name - }, - freeze_message: __("Sending Message ..."), - }); - console.log('id_doc', id_doc); - d.hide(); - } - }); - - d.set_secondary_action_label('Cancel'); - d.set_secondary_action(() => d.hide()); - d.show(); - }, __()).addClass('whatsapp-svg-button'); + after_save: async function (frm) { + if (!frm.is_new()) { + frm.debounced_reload_doc(); + } + }, + before_save: async function (frm) { + if ((frm.doc.completed_age || frm.doc.completed_age_month) && !frm.doc?.date_of_birth) { + await frm.set_value( + "date_of_birth", + generateDOBFromAge( + frm.doc?.completed_age, + frm.doc?.completed_age_month, + frm.doc?.date_of_birth + ) + ); + } + // fill into hidden fields + if (frm?.doc?.scheme_table && frm.doc?.scheme_table?.length) { + for (_doc of frm?.doc?.scheme_table) { + _doc.scheme = _doc.name_of_the_scheme; + _doc.milestone = _doc.milestone_category; + } + } + // check alternate mobile number digits + if ( + is_primary_member_link_through_phone_number && + (frm.doc.alternate_contact_number || frm.doc.contact_number) + ) { + if (!indianPhoneNumberRegex.test(frm.doc.contact_number)) { + frappe.throw( + `Phone Number ${frm.doc.contact_number} set in field contact_number is not valid.` + ); + } + } + if ( + !indianPhoneNumberRegex.test(frm.doc.alternate_contact_number) && + frm.doc.alternate_contact_number?.length > 1 + ) { + frappe.throw( + `Phone Number ${frm.doc.alternate_contact_number} set in field alternate_contact_number is not valid.` + ); + } + }, + async refresh(frm) { + is_primary_member_link_through_phone_number = await get_myojana_setting(); + if (frm.is_new()) { + console.log("new data"); + await autoSetOption(frm); // set options of centre and sub centre + await frm.set_value("added_by", frappe.session.user); + await frm.set_value("date_of_visit", frappe.datetime.get_today()); // SET TODAY DATE IN DATE OF VISIT + } else { + frm.add_custom_button( + __("Add family members"), + function () { + frappe.route_options = { + has_anyone_from_your_family_visisted_before: "Yes", + select_primary_member: + frm.doc.select_primary_member || frm.doc.contact_number, + }; + frappe.new_doc("Beneficiary Profiling"); + }, + __() + ); - } - - await apply_filter_on_id_document() + let id_card_template = await frappe.db.get_single_value( + "mYojana Settings", + "id_card_template" + ); + if (id_card_template) { + frm.add_custom_button( + __( + ' ' + ), + async function () { + let base64Image = await callAPI({ + method: "myojana.apis.html_to_image.preview_doc_template", + freeze: true, + args: { + doc: frm.doc.name, + doctype: frm.doctype, + }, + // freeze_message: __("getting template..."), + }); + console.log("base64Image", base64Image); - } - frm.fields_dict.date_of_visit.$input?.datepicker({ maxDate: new Date(frappe.datetime.get_today()) }); // restrict future date from date pickers - extend_options_length(frm, ["centre", "sub_centre", "religion", "caste_category", "marital_status", "current_house_type", "source_of_information", "current_house_type", "state", "district", "occupational_category", "education", "education", "ward", "name_of_the_settlement", "proof_of_disability", "block", "state_of_origin", "current_occupation", "district_of_origin", "social_vulnerable_category", "name_of_the_camp"]); - hide_advance_search(frm, ["state", "district", "ward", "state_of_origin", "religion", "caste_category", "marital_status", "district_of_origin", "block", "gender", "current_occupation", "social_vulnerable_category", "pwd_category", "family", "sub_centre", "centre", "source_of_information", "occupational_category", "current_house_type", "name_of_the_settlement", "name_of_the_camp", "proof_of_disability", "education"]); + const imgSrc = `data:image/png;base64,${base64Image}`; - // APPLY FILTER IN CASE OF EDIT OF DATA - apply_filter('select_primary_member', 'name_of_head_of_family', frm, ['!=', frm.doc.name]) - apply_filter("sub_centre", "centre", frm, frm.doc.centre); - apply_filter("district", "state", frm, frm.doc.state) - apply_filter("ward", "district", frm, frm.doc.district); - apply_filter("name_of_the_settlement", "block", frm, frm.doc.ward); - apply_filter("district_of_origin", "state", frm, frm.doc.state_of_origin); - apply_filter("block", "district", frm, frm.doc.district_of_origin); - // defult filter on current occupations - if (frm.doc?.current_occupation) { - if (frm.doc.current_occupation == 'Others') { - apply_filter('occupational_category', 'name', frm, '', true) - } else { - let doc = await get_occupation_category(frm) - apply_filter('occupational_category', 'name', frm, ['=', doc.occupational_category]) - frm.set_value('occupational_category', doc.occupational_category) - } - } + // console.log('print_template', print_template); + let d = new frappe.ui.Dialog({ + title: __("Confirmation"), + fields: [ + { + fieldtype: "HTML", + options: `Rendered Image`, + }, + ], + primary_action_label: "Send", + primary_action: async function () { + console.log("Send button clicked primary action"); + let id_doc = await callAPI({ + method: "myojana.apis.whatsapp.send_id", + freeze: true, + args: { + doc: frm.doc.name, + }, + freeze_message: __("Sending Message ..."), + }); + console.log("id_doc", id_doc); + d.hide(); + }, + }); - if (!frappe.user_roles.includes("Administrator")) { - if (!frm.doc.__islocal) { - frm.set_df_property('centre', 'read_only', 1); - frm.set_df_property('sub_centre', 'read_only', 1); - } - } + d.set_secondary_action_label("Cancel"); + d.set_secondary_action(() => d.hide()); + d.show(); + }, + __() + ).addClass("whatsapp-svg-button"); + } - if (frappe.user_roles.includes("Sub-Centre") || frappe.user_roles.includes("CSC Member") || frappe.user_roles.includes("MIS executive")) { - if (!frappe.user_roles.includes("Administrator")) { - frm.set_df_property('scheme_table', 'cannot_delete_rows', true); // Hide delete button - frm.set_df_property('scheme_table', 'cannot_delete_all_rows', true); - frm.set_df_property('follow_up_table', 'cannot_delete_rows', true); // Hide delete button - frm.set_df_property('follow_up_table', 'cannot_delete_all_rows', true); - } - } + await apply_filter_on_id_document(); + } + frm.fields_dict.date_of_visit.$input?.datepicker({ + maxDate: new Date(frappe.datetime.get_today()), + }); // restrict future date from date pickers + extend_options_length(frm, [ + "centre", + "sub_centre", + "religion", + "caste_category", + "marital_status", + "current_house_type", + "source_of_information", + "current_house_type", + "state", + "district", + "occupational_category", + "education", + "education", + "ward", + "name_of_the_settlement", + "proof_of_disability", + "block", + "state_of_origin", + "current_occupation", + "district_of_origin", + "social_vulnerable_category", + "name_of_the_camp", + ]); + hide_advance_search(frm, [ + "state", + "district", + "ward", + "state_of_origin", + "religion", + "caste_category", + "marital_status", + "district_of_origin", + "block", + "gender", + "current_occupation", + "social_vulnerable_category", + "pwd_category", + "family", + "sub_centre", + "centre", + "source_of_information", + "occupational_category", + "current_house_type", + "name_of_the_settlement", + "name_of_the_camp", + "proof_of_disability", + "education", + ]); + // APPLY FILTER IN CASE OF EDIT OF DATA + apply_filter("select_primary_member", "name_of_head_of_family", frm, ["!=", frm.doc.name]); + apply_filter("sub_centre", "centre", frm, frm.doc.centre); + apply_filter("district", "state", frm, frm.doc.state); + apply_filter("ward", "district", frm, frm.doc.district); + apply_filter("name_of_the_settlement", "block", frm, frm.doc.ward); + apply_filter("district_of_origin", "state", frm, frm.doc.state_of_origin); + apply_filter("block", "district", frm, frm.doc.district_of_origin); + // defult filter on current occupations + if (frm.doc?.current_occupation) { + if (frm.doc.current_occupation == "Others") { + apply_filter("occupational_category", "name", frm, "", true); + } else { + let doc = await get_occupation_category(frm); + apply_filter("occupational_category", "name", frm, [ + "=", + doc.occupational_category, + ]); + frm.set_value("occupational_category", doc.occupational_category); + } + } - await render_scheme_datatable(frm) // render scheme_data_tables + if (!frappe.user_roles.includes("Administrator")) { + if (!frm.doc.__islocal) { + frm.set_df_property("centre", "read_only", 1); + frm.set_df_property("sub_centre", "read_only", 1); + } + } - }, - ////////////////////DATE VALIDATION///////////////////////////////////////// - date_of_visit: async function (frm) { - if (new Date(frm.doc.date_of_visit) > new Date(frappe.datetime.get_today())) { - await frm.set_value("date_of_visit", ''); - await frappe.throw(__("Date of registration can't be greater than today's date")); - } - if (frm.doc.date_of_visit && frm.doc.date_of_birth) { - if (frm.doc.date_of_visit < frm.doc.date_of_birth) { - await frm.set_value('date_of_visit', ''); - return frappe.throw("Date of registration shall not be before the Date of Birth") - } - } - }, - contact_number: function (frm) { - if (is_primary_member_link_through_phone_number && (!indianPhoneNumberRegex.test(frm.doc.contact_number) && frm.doc.contact_number.length > 9)) { - console.log("frm.doc.contact_number.length", frm.doc.contact_number.length); - frappe.throw(`Phone Number ${frm.doc.contact_number} set in field contact_number is not valid.`) - } - }, - state: async function (frm) { - await apply_filter("district", "state", frm, frm.doc.state); - districts_option && districts_option.length > 1 ? await frm.set_value("district", '') : null; - await frm.set_value("ward", ''); - await frm.set_value("name_of_the_settlement", ''); - }, - district: async function (frm) { - await apply_filter("ward", "district", frm, frm.doc.district); - await frm.set_value("ward", ''); - await frm.set_value("name_of_the_settlement", ''); - }, - ward: async function (frm) { - await apply_filter("name_of_the_settlement", "block", frm, frm.doc.ward); - await frm.set_value("name_of_the_settlement", ''); - }, - state_of_origin: async function (frm) { - await apply_filter("district_of_origin", "state", frm, frm.doc.state_of_origin); - await frm.set_value("district_of_origin", ''); - await frm.set_value("block", ''); - }, - district_of_origin: async function (frm) { - await apply_filter("block", "district", frm, frm.doc.district_of_origin); - await frm.set_value("block", ''); - }, - centre: async function (frm) { - await frm.set_value('sub_centre', ''); - await apply_filter("sub_centre", "centre", frm, frm.doc.centre); - }, - current_occupation: async function (frm) { - if (!frm.doc.current_occupation) return; - if (frm.doc.current_occupation == 'Others') { - await apply_filter('occupational_category', 'name', frm, '', true); - await frm.set_value('occupational_category', ''); - } else { - let doc = await get_occupation_category(frm); - await apply_filter('occupational_category', 'name', frm, ['=', doc.occupational_category]); - await frm.set_value('occupational_category', doc.occupational_category); - await frm.set_value('new_occupation', ''); - } - }, - occupational_category: async function (frm) { - frm.doc.occupational_category != 'Others' ? await frm.set_value('new_occupation_category', '') : null; - }, - date_of_birth: async function (frm) { - let dob = frm.doc.date_of_birth; - if (new Date(dob) > new Date(frappe.datetime.get_today())) { - await frm.set_value("date_of_birth", ''); - return frappe.throw(__("Date of birth can't be greater than today's date")); - } - if (frm.doc.date_of_visit && frm.doc.date_of_birth) { - if (frm.doc.date_of_visit && frm.doc.date_of_birth) { - if (frm.doc.date_of_visit < frm.doc.date_of_birth) { - await frm.set_value("date_of_birth", ''); - return frappe.throw("Date of birth cannot be greater than the date of registration"); - } - } - } + if ( + frappe.user_roles.includes("Sub-Centre") || + frappe.user_roles.includes("CSC Member") || + frappe.user_roles.includes("MIS executive") + ) { + if (!frappe.user_roles.includes("Administrator")) { + frm.set_df_property("scheme_table", "cannot_delete_rows", true); // Hide delete button + frm.set_df_property("scheme_table", "cannot_delete_all_rows", true); + frm.set_df_property("follow_up_table", "cannot_delete_rows", true); // Hide delete button + frm.set_df_property("follow_up_table", "cannot_delete_all_rows", true); + } + } - if (dob) { - let today = frappe.datetime.get_today(); - let birthDate = new Date(dob); - let currentDate = new Date(today); - let years = currentDate.getFullYear() - birthDate.getFullYear(); - let months = currentDate.getMonth() - birthDate.getMonth(); - if (months < 0 || (months === 0 && currentDate.getDate() < birthDate.getDate())) { - years--; - months = 12 - birthDate.getMonth() + currentDate.getMonth(); - } else { - months = currentDate.getMonth() - birthDate.getMonth(); - } - if (currentDate.getDate() < birthDate.getDate()) { - months--; - } - let ageString = years > 0 ? years.toString() : '0'; - let completedAgeMonths = months <= 11 ? months : null; - if(frm.doc.completed_age != ageString){ - await frm.set_value( - 'completed_age', ageString, - ); - } - if(frm.doc.completed_age_month != completedAgeMonths){ - await frm.set_value( - 'completed_age_month', completedAgeMonths, - ); - } - // await frm.set_value({ - // 'completed_age': ageString, - // 'completed_age_month': completedAgeMonths - // }); - } - }, - completed_age: function (frm) { + await render_scheme_datatable(frm); // render scheme_data_tables + }, + ////////////////////DATE VALIDATION///////////////////////////////////////// + date_of_visit: async function (frm) { + if (new Date(frm.doc.date_of_visit) > new Date(frappe.datetime.get_today())) { + await frm.set_value("date_of_visit", ""); + await frappe.throw(__("Date of registration can't be greater than today's date")); + } + if (frm.doc.date_of_visit && frm.doc.date_of_birth) { + if (frm.doc.date_of_visit < frm.doc.date_of_birth) { + await frm.set_value("date_of_visit", ""); + return frappe.throw( + "Date of registration shall not be before the Date of Birth" + ); + } + } + }, + contact_number: function (frm) { + if ( + is_primary_member_link_through_phone_number && + !indianPhoneNumberRegex.test(frm.doc.contact_number) && + frm.doc.contact_number.length > 9 + ) { + console.log("frm.doc.contact_number.length", frm.doc.contact_number.length); + frappe.throw( + `Phone Number ${frm.doc.contact_number} set in field contact_number is not valid.` + ); + } + }, + state: async function (frm) { + await apply_filter("district", "state", frm, frm.doc.state); + districts_option && districts_option.length > 1 + ? await frm.set_value("district", "") + : null; + await frm.set_value("ward", ""); + await frm.set_value("name_of_the_settlement", ""); + }, + district: async function (frm) { + await apply_filter("ward", "district", frm, frm.doc.district); + await frm.set_value("ward", ""); + await frm.set_value("name_of_the_settlement", ""); + }, + ward: async function (frm) { + await apply_filter("name_of_the_settlement", "block", frm, frm.doc.ward); + await frm.set_value("name_of_the_settlement", ""); + }, + state_of_origin: async function (frm) { + await apply_filter("district_of_origin", "state", frm, frm.doc.state_of_origin); + await frm.set_value("district_of_origin", ""); + await frm.set_value("block", ""); + }, + district_of_origin: async function (frm) { + await apply_filter("block", "district", frm, frm.doc.district_of_origin); + await frm.set_value("block", ""); + }, + centre: async function (frm) { + await frm.set_value("sub_centre", ""); + await apply_filter("sub_centre", "centre", frm, frm.doc.centre); + }, + current_occupation: async function (frm) { + if (!frm.doc.current_occupation) return; + if (frm.doc.current_occupation == "Others") { + await apply_filter("occupational_category", "name", frm, "", true); + await frm.set_value("occupational_category", ""); + } else { + let doc = await get_occupation_category(frm); + await apply_filter("occupational_category", "name", frm, [ + "=", + doc.occupational_category, + ]); + await frm.set_value("occupational_category", doc.occupational_category); + await frm.set_value("new_occupation", ""); + } + }, + occupational_category: async function (frm) { + frm.doc.occupational_category != "Others" + ? await frm.set_value("new_occupation_category", "") + : null; + }, + date_of_birth: async function (frm) { + let dob = frm.doc.date_of_birth; + if (new Date(dob) > new Date(frappe.datetime.get_today())) { + await frm.set_value("date_of_birth", ""); + return frappe.throw(__("Date of birth can't be greater than today's date")); + } + if (frm.doc.date_of_visit && frm.doc.date_of_birth) { + if (frm.doc.date_of_visit && frm.doc.date_of_birth) { + if (frm.doc.date_of_visit < frm.doc.date_of_birth) { + await frm.set_value("date_of_birth", ""); + return frappe.throw( + "Date of birth cannot be greater than the date of registration" + ); + } + } + } - }, - completed_age_month: async function (frm) { - if (frm.doc.completed_age_month > 11) { - await frm.set_value("completed_age_month", ''); - await frappe.throw(__("Completed age in month should be less than or equal to 11")); - } - let dob = generateDOBFromAge(frm.doc?.completed_age, frm.doc?.completed_age_month, frm.doc?.date_of_birth) - // console.log("///////////////////", frm.doc?.date_of_birth , dob) - if (new Date(frm.doc.date_of_birth) !== new Date(dob)) { - console.log("generatedDOB", dob, frm.doc?.completed_age, frm.doc?.completed_age_month); - // frm.set_value("date_of_birth", dob) - } - }, - are_you_a_person_with_disability_pwd: async function (frm) { - frm.doc.are_you_a_person_with_disability_pwd == "No" ? await frm.set_value({ - "type_of_disability": '', - "proof_of_disability": '', - "what_is_the_extent_of_your_disability": '' - }) : null; - }, - what_is_the_extent_of_your_disability: async function (frm) { - frm.doc.what_is_the_extent_of_your_disability != "Above 40%" ? await frm.set_value('proof_of_disability', []) : null; - }, - marital_status: async function (frm) { - frm.doc.marital_status != "Married" ? await frm.set_value("spouses_name", '') : null; - }, - social_vulnerable: async function (frm) { - frm.doc.social_vulnerable != "Yes" ? await frm.set_value({ - "social_vulnerable_category": '', - 'other_social_vulnerable_category': '' - }) : null; - - }, - social_vulnerable_category: async function (frm) { - frm.doc.social_vulnerable_category != "Others" ? await frm.set_value('other_social_vulnerable_category', '') : null; - }, - source_of_information: async function (frm) { - frm.doc.source_of_information != "Others" ? await frm.set_value({ - 'new_source_of_information': '', - 'name_of_the_camp': '', - 'new_camp': '' - }) : null; - }, - name_of_the_camp: async function (frm) { - frm.doc.name_of_the_camp != "Others" ? await frm.set_value('new_camp', '') : null; - }, - has_anyone_from_your_family_visisted_before: async function (frm) { - if (frm.doc.has_anyone_from_your_family_visisted_before == "Yes") { - await frm.set_value('select_primary_member', '') - } else { - if (frm.is_new()) { - await truncate_multiple_fields_value(frm, ['current_house_type', 'state', 'district', 'ward', - 'name_of_the_settlement', 'address_with_landmark', 'same_as_above', 'state_of_origin', 'district_of_origin', 'block']) - } - } - }, - select_primary_member: async function (frm) { - const pm = frm.doc.select_primary_member; - if (pm && frm.is_new()) { - let response = await get_document({ "contact_number": pm }, - ['name', "name_of_the_beneficiary", 'current_house_type', 'state', 'district', 'ward', - 'name_of_the_settlement', 'address_with_landmark', 'same_as_above', 'state_of_origin', 'district_of_origin', 'block']); - const parent = response.message; - frm.doc.current_house_type = parent.current_house_type; - frm.doc.state = parent.state; - frm.doc.district = parent.district; - frm.doc.ward = parent.ward; - frm.doc.name_of_the_settlement = parent.name_of_the_settlement; - frm.doc.address_with_landmark = parent.address_with_landmark; - frm.doc.same_as_above = parent.same_as_above; - frm.doc.state_of_origin = parent.state_of_origin; - frm.doc.district_of_origin = parent.district_of_origin; - frm.doc.block = parent.block; - frm.refresh_fields(['current_house_type', 'state', 'district', 'ward', - 'name_of_the_settlement', 'address_with_landmark', 'same_as_above', 'state_of_origin', 'district_of_origin', 'block']) - } - }, - current_house_type: async function (frm) { - frm.doc.current_house_type != "Others" ? await frm.set_value('add_house_type', '') : null; - }, - same_as_above: async function (frm) { - frm.doc.same_as_above == '1' ? await frm.set_value({ - 'state_of_origin': frm.doc.state, - 'district_of_origin': frm.doc.district, - 'block': frm.doc.ward - }) : await frm.set_value({ - 'state_of_origin': '', - 'district_of_origin': '', - 'block': '' - }); - }, + if (dob) { + let today = frappe.datetime.get_today(); + let birthDate = new Date(dob); + let currentDate = new Date(today); + let years = currentDate.getFullYear() - birthDate.getFullYear(); + let months = currentDate.getMonth() - birthDate.getMonth(); + if (months < 0 || (months === 0 && currentDate.getDate() < birthDate.getDate())) { + years--; + months = 12 - birthDate.getMonth() + currentDate.getMonth(); + } else { + months = currentDate.getMonth() - birthDate.getMonth(); + } + if (currentDate.getDate() < birthDate.getDate()) { + months--; + } + let ageString = years > 0 ? years.toString() : "0"; + let completedAgeMonths = months <= 11 ? months : null; + if (frm.doc.completed_age != ageString) { + await frm.set_value("completed_age", ageString); + } + if (frm.doc.completed_age_month != completedAgeMonths) { + await frm.set_value("completed_age_month", completedAgeMonths); + } + // await frm.set_value({ + // 'completed_age': ageString, + // 'completed_age_month': completedAgeMonths + // }); + } + }, + completed_age: function (frm) {}, + completed_age_month: async function (frm) { + if (frm.doc.completed_age_month > 11) { + await frm.set_value("completed_age_month", ""); + await frappe.throw(__("Completed age in month should be less than or equal to 11")); + } + let dob = generateDOBFromAge( + frm.doc?.completed_age, + frm.doc?.completed_age_month, + frm.doc?.date_of_birth + ); + // console.log("///////////////////", frm.doc?.date_of_birth , dob) + if (new Date(frm.doc.date_of_birth) !== new Date(dob)) { + console.log("generatedDOB", dob, frm.doc?.completed_age, frm.doc?.completed_age_month); + // frm.set_value("date_of_birth", dob) + } + }, + are_you_a_person_with_disability_pwd: async function (frm) { + frm.doc.are_you_a_person_with_disability_pwd == "No" + ? await frm.set_value({ + type_of_disability: "", + proof_of_disability: "", + what_is_the_extent_of_your_disability: "", + }) + : null; + }, + what_is_the_extent_of_your_disability: async function (frm) { + frm.doc.what_is_the_extent_of_your_disability != "Above 40%" + ? await frm.set_value("proof_of_disability", []) + : null; + }, + marital_status: async function (frm) { + frm.doc.marital_status != "Married" ? await frm.set_value("spouses_name", "") : null; + }, + social_vulnerable: async function (frm) { + frm.doc.social_vulnerable != "Yes" + ? await frm.set_value({ + social_vulnerable_category: "", + other_social_vulnerable_category: "", + }) + : null; + }, + social_vulnerable_category: async function (frm) { + frm.doc.social_vulnerable_category != "Others" + ? await frm.set_value("other_social_vulnerable_category", "") + : null; + }, + source_of_information: async function (frm) { + frm.doc.source_of_information != "Others" + ? await frm.set_value({ + new_source_of_information: "", + name_of_the_camp: "", + new_camp: "", + }) + : null; + }, + name_of_the_camp: async function (frm) { + frm.doc.name_of_the_camp != "Others" ? await frm.set_value("new_camp", "") : null; + }, + has_anyone_from_your_family_visisted_before: async function (frm) { + if (frm.doc.has_anyone_from_your_family_visisted_before == "Yes") { + await frm.set_value("select_primary_member", ""); + } else { + if (frm.is_new()) { + await truncate_multiple_fields_value(frm, [ + "current_house_type", + "state", + "district", + "ward", + "name_of_the_settlement", + "address_with_landmark", + "same_as_above", + "state_of_origin", + "district_of_origin", + "block", + ]); + } + } + }, + select_primary_member: async function (frm) { + const pm = frm.doc.select_primary_member; + if (pm && frm.is_new()) { + let response = await get_document({ contact_number: pm }, [ + "name", + "name_of_the_beneficiary", + "current_house_type", + "state", + "district", + "ward", + "name_of_the_settlement", + "address_with_landmark", + "same_as_above", + "state_of_origin", + "district_of_origin", + "block", + ]); + const parent = response.message; + frm.doc.current_house_type = parent.current_house_type; + frm.doc.state = parent.state; + frm.doc.district = parent.district; + frm.doc.ward = parent.ward; + frm.doc.name_of_the_settlement = parent.name_of_the_settlement; + frm.doc.address_with_landmark = parent.address_with_landmark; + frm.doc.same_as_above = parent.same_as_above; + frm.doc.state_of_origin = parent.state_of_origin; + frm.doc.district_of_origin = parent.district_of_origin; + frm.doc.block = parent.block; + frm.refresh_fields([ + "current_house_type", + "state", + "district", + "ward", + "name_of_the_settlement", + "address_with_landmark", + "same_as_above", + "state_of_origin", + "district_of_origin", + "block", + ]); + } + }, + current_house_type: async function (frm) { + frm.doc.current_house_type != "Others" ? await frm.set_value("add_house_type", "") : null; + }, + same_as_above: async function (frm) { + frm.doc.same_as_above == "1" + ? await frm.set_value({ + state_of_origin: frm.doc.state, + district_of_origin: frm.doc.district, + block: frm.doc.ward, + }) + : await frm.set_value({ + state_of_origin: "", + district_of_origin: "", + block: "", + }); + }, }); -frappe.ui.form.on('Follow Up Child',{ - follow_up_status:function(frm,cdt, cdn){ - let row = locals[cdt][cdn]; - if(row.follow_up_status){ - let last_update_date = frappe.datetime.get_datetime_as_string() - let user = frappe.session.user - frappe.model.set_value(cdt, cdn, 'last_update_date', last_update_date); - frappe.model.set_value(cdt, cdn, 'last_update_by', user); - } - - }, -}) +frappe.ui.form.on("Follow Up Child", { + follow_up_status: function (frm, cdt, cdn) { + let row = locals[cdt][cdn]; + if (row.follow_up_status) { + let last_update_date = frappe.datetime.get_datetime_as_string(); + let user = frappe.session.user; + frappe.model.set_value(cdt, cdn, "last_update_date", last_update_date); + frappe.model.set_value(cdt, cdn, "last_update_by", user); + } + }, +}); diff --git a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.py b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.py index a1ce1b8..cf7997e 100644 --- a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.py +++ b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling.py @@ -1,10 +1,13 @@ # Copyright (c) 2023, suvaidyam and contributors # For license information, please see license.txt +from datetime import datetime, timedelta + import frappe from frappe.model.document import Document + from myojana.services.family import family -from datetime import datetime, timedelta + class BeneficiaryProfiling(Document): # def printKeys(obj, f=False): @@ -14,43 +17,55 @@ class BeneficiaryProfiling(Document): # else: # for key in obj.__dict__.keys(): # print(key,obj.get(key, None)) -# find family and get family function + # find family and get family function def get_family(contact_number): - docs = frappe.db.get_list(doctype='Primary Member', filters={'name':contact_number}, fields=["name", "name_of_head_of_family",'name_of_head_of_family.name_of_the_beneficiary as name_of_the_beneficiary']) + docs = frappe.db.get_list( + doctype="Primary Member", + filters={"name": contact_number}, + fields=[ + "name", + "name_of_head_of_family", + "name_of_head_of_family.name_of_the_beneficiary as name_of_the_beneficiary", + ], + ) if len(docs): return docs[0] return None - -# create new souource of information + + # create new souource of information def create_source_of_information(new_source_of_information): data_exist = frappe.db.exists("Source Of Information", new_source_of_information) if not data_exist: new_source_of_information_doc = frappe.new_doc("Source Of Information") new_source_of_information_doc.source_name = new_source_of_information new_source_of_information_doc.save() -# create new house_type + + # create new house_type def create_house_type(add_house_type): data_exist = frappe.db.exists("House Types", add_house_type) if not data_exist: current_house_type_doc = frappe.new_doc("House Types") current_house_type_doc.house_type_name = add_house_type current_house_type_doc.save() -# create new_camp + + # create new_camp def create_new_camp(new_camp): data_exist = frappe.db.exists("Camp", new_camp) if not data_exist: camp_doc = frappe.new_doc("Camp") camp_doc.name_of_the_camp = new_camp camp_doc.save() -# create social_vulnerable_category + + # create social_vulnerable_category def new_social_vulnerable_category(other_social_vulnerable_category): data_exist = frappe.db.exists("Social vulnerable category", other_social_vulnerable_category) if not data_exist: scc_doc = frappe.new_doc("Social vulnerable category") scc_doc.social_vulnerable_category = other_social_vulnerable_category scc_doc.save() -# create social_vulnerable_category - def other_new_occupation(new_occupation , occupational_category , new_occupation_category): + + # create social_vulnerable_category + def other_new_occupation(new_occupation, occupational_category, new_occupation_category): data_exist = frappe.db.exists("Occupation", new_occupation) if not data_exist: occupation = frappe.new_doc("Occupation") @@ -68,86 +83,112 @@ def other_new_occupation(new_occupation , occupational_category , new_occupation occupation.save() def validate(self): - if(self.contact_number == self.alternate_contact_number and self.contact_number is not None): + if self.contact_number == self.alternate_contact_number and self.contact_number is not None: return frappe.throw("Alternate contact number cannot be the same as mobile number") - if(self.do_you_have_any_id_documents != "Yes"): + if self.do_you_have_any_id_documents != "Yes": self.id_table_list = [] - if(self.date_of_birth and self.date_of_visit): + if self.date_of_birth and self.date_of_visit: if self.date_of_visit < self.date_of_birth: return frappe.throw("Date of Visit shall not be before the Date of Birth") - if(self.what_is_the_extent_of_your_disability == "Above 40%"): - if(self.proof_of_disability == []): - return frappe.throw("""Mandatory fields required in Beneficiary

    • Profiling Proof of disability""") + if self.what_is_the_extent_of_your_disability == "Above 40%": + if self.proof_of_disability == []: + return frappe.throw( + """Mandatory fields required in Beneficiary

    • Profiling Proof of disability""" + ) # BeneficiaryProfiling.printKeys(self) - if(self.has_anyone_from_your_family_visisted_before == "No"): - if self.get('_doc_before_save', None): # Update + if self.has_anyone_from_your_family_visisted_before == "No": + if self.get("_doc_before_save", None): # Update family_doc = BeneficiaryProfiling.get_family(self.contact_number) # akndcjkdxckjvbxjbvkjcxbvkjcxbkjvbckj if family_doc and not (family_doc.name_of_head_of_family == self.name): - frappe.throw(f"Primary member exist with name {family_doc.name_of_the_beneficiary} [{self.contact_number}], Please Select Primary Member") + frappe.throw( + f"Primary member exist with name {family_doc.name_of_the_beneficiary} [{self.contact_number}], Please Select Primary Member" + ) return - if self.get('_doc_before_save').get('has_anyone_from_your_family_visisted_before') == 'Yes': - self.select_primary_member = None # set family to None - else: # Create + if self.get("_doc_before_save").get("has_anyone_from_your_family_visisted_before") == "Yes": + self.select_primary_member = None # set family to None + else: # Create family_doc = BeneficiaryProfiling.get_family(self.contact_number) if family_doc: - frappe.throw(f"Primary member exist with name {family_doc.name_of_the_beneficiary} [{self.contact_number}], Please Select Primary Member") + frappe.throw( + f"Primary member exist with name {family_doc.name_of_the_beneficiary} [{self.contact_number}], Please Select Primary Member" + ) return else: - _doc_before_save = self.get('_doc_before_save', None) + _doc_before_save = self.get("_doc_before_save", None) # if _doc_before_save is not None: # if self.select_primary_member == _doc_before_save.get('select_primary_member'): # frappe.throw(f"Please select other primary member") # return + def after_insert(self): print("Ben[after_insert]") # if not self.centre and "Administrator" not in frappe.get_roles(frappe.session.user): - # frappe.db.set_value('Beneficiary Profiling', self.name, update_modified=False) + # frappe.db.set_value('Beneficiary Profiling', self.name, update_modified=False) # if not self.sub_centre: # self.sub_centre = sub_centre # frappe.db.set_value('Beneficiary Profiling', self.name, 'sub_centre', sub_centre, update_modified=False) - if(self.new_source_of_information): + if self.new_source_of_information: BeneficiaryProfiling.create_source_of_information(self.new_source_of_information) - if(self.add_house_type): + if self.add_house_type: BeneficiaryProfiling.create_house_type(self.add_house_type) - if(self.new_camp): + if self.new_camp: BeneficiaryProfiling.create_new_camp(self.new_camp) - if(self.other_social_vulnerable_category): + if self.other_social_vulnerable_category: BeneficiaryProfiling.new_social_vulnerable_category(self.other_social_vulnerable_category) - if(self.has_anyone_from_your_family_visisted_before == "No"): + if self.has_anyone_from_your_family_visisted_before == "No": family_doc = family.create(self) - frappe.db.set_value('Beneficiary Profiling', self.name, 'select_primary_member', family_doc.name, update_modified=False) + frappe.db.set_value( + "Beneficiary Profiling", + self.name, + "select_primary_member", + family_doc.name, + update_modified=False, + ) def on_update(self): - if(self.new_source_of_information): + if self.new_source_of_information: BeneficiaryProfiling.create_source_of_information(self.new_source_of_information) - if(self.add_house_type): + if self.add_house_type: BeneficiaryProfiling.create_house_type(self.add_house_type) - if(self.new_camp): + if self.new_camp: BeneficiaryProfiling.create_new_camp(self.new_camp) - if(self.other_social_vulnerable_category): + if self.other_social_vulnerable_category: BeneficiaryProfiling.new_social_vulnerable_category(self.other_social_vulnerable_category) - if(self.new_occupation and self.occupational_category or self.new_occupation_category): - BeneficiaryProfiling.other_new_occupation(self.new_occupation , self.occupational_category , self.new_occupation_category) - if self.get('localname'): + if self.new_occupation and self.occupational_category or self.new_occupation_category: + BeneficiaryProfiling.other_new_occupation( + self.new_occupation, self.occupational_category, self.new_occupation_category + ) + if self.get("localname"): return else: - if(self.has_anyone_from_your_family_visisted_before == "No"): - if self.get('_doc_before_save', None): - _doc_before_save = self.get('_doc_before_save') - if _doc_before_save.get('has_anyone_from_your_family_visisted_before') == 'Yes': + if self.has_anyone_from_your_family_visisted_before == "No": + if self.get("_doc_before_save", None): + _doc_before_save = self.get("_doc_before_save") + if _doc_before_save.get("has_anyone_from_your_family_visisted_before") == "Yes": family_doc = family.update(self) - frappe.db.set_value('Beneficiary Profiling', self.name, 'select_primary_member', family_doc.name, update_modified=False) + frappe.db.set_value( + "Beneficiary Profiling", + self.name, + "select_primary_member", + family_doc.name, + update_modified=False, + ) else: family_doc = family.update(self) - frappe.db.set_value('Beneficiary Profiling', self.name, 'select_primary_member', family_doc.name, update_modified=False) - else: # handle if No -> Yes - if self.get('_doc_before_save', None): - _doc_before_save = self.get('_doc_before_save') - if _doc_before_save.get('has_anyone_from_your_family_visisted_before') == 'No': + frappe.db.set_value( + "Beneficiary Profiling", + self.name, + "select_primary_member", + family_doc.name, + update_modified=False, + ) + else: # handle if No -> Yes + if self.get("_doc_before_save", None): + _doc_before_save = self.get("_doc_before_save") + if _doc_before_save.get("has_anyone_from_your_family_visisted_before") == "No": family_doc = BeneficiaryProfiling.get_family(_doc_before_save.contact_number) if family_doc: query = f"UPDATE `tabBeneficiary Profiling` SET select_primary_member = '{self.select_primary_member}' WHERE select_primary_member = '{_doc_before_save.select_primary_member}'" frappe.db.sql(query) frappe.db.delete("Primary Member", {"name": family_doc.name}) - diff --git a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling_list.js b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling_list.js index 57e7b6b..8f04172 100644 --- a/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling_list.js +++ b/myojana/myojana/doctype/beneficiary_profiling/beneficiary_profiling_list.js @@ -1,10 +1,9 @@ -frappe.listview_settings['Beneficiary Profiling'] = { +frappe.listview_settings["Beneficiary Profiling"] = { refresh: function (listview) { // console.log(listview) // listview.page.add_actions_menu_item("WhatsApp", async function () { // for(ben of listview.data){ // console.log("//////", ben) - // } // // await update_enable_disable(listview, 1) // }); @@ -17,13 +16,16 @@ frappe.listview_settings['Beneficiary Profiling'] = { }, before_render: async function () { cur_list?.page?.add_inner_button("Beneficiary report", function () { - window.location.href = 'report-list/Beneficiary%20Profiling' - }) - + window.location.href = "report-list/Beneficiary%20Profiling"; + }); }, add_fields: [ - 'name_of_the_beneficiary', 'date_of_visit', 'contact_number', - 'select_primary_member', 'overall_status', 'numeric_overall_status' + "name_of_the_beneficiary", + "date_of_visit", + "contact_number", + "select_primary_member", + "overall_status", + "numeric_overall_status", ], hide_name_column: true, -} +}; diff --git a/myojana/myojana/doctype/centre/centre_list.js b/myojana/myojana/doctype/centre/centre_list.js index 99395c4..45e0645 100644 --- a/myojana/myojana/doctype/centre/centre_list.js +++ b/myojana/myojana/doctype/centre/centre_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Centre'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Centre"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/myojana/doctype/fielddependencyconfiguration/fielddependencyconfiguration.js b/myojana/myojana/doctype/fielddependencyconfiguration/fielddependencyconfiguration.js index ff1b3e3..6e4a8a1 100644 --- a/myojana/myojana/doctype/fielddependencyconfiguration/fielddependencyconfiguration.js +++ b/myojana/myojana/doctype/fielddependencyconfiguration/fielddependencyconfiguration.js @@ -42,5 +42,4 @@ // } // }); - -// // \ No newline at end of file +// // diff --git a/myojana/myojana/doctype/myojana_settings/myojana_settings.js b/myojana/myojana/doctype/myojana_settings/myojana_settings.js index 1cfacd8..f9b8bb9 100644 --- a/myojana/myojana/doctype/myojana_settings/myojana_settings.js +++ b/myojana/myojana/doctype/myojana_settings/myojana_settings.js @@ -16,119 +16,131 @@ // } let deleted_row = []; const get_fields_list = async (doctype) => { - let list = await callAPI({ - method: 'myojana.apis.get_doctype_meta.get_allowed_doctype', - freeze: true, - args: { - "doctype_name": "Beneficiary Profiling", - "field_types": "Link", - "options": doctype - }, - freeze_message: __("Getting Fields..."), - }) - // list = list.map((e)=>{e.label = list.label, e.value = list.label}) - cur_frm.cur_grid.grid_form.fields_dict.field_name._data = list - // frm.fields_dict.select_doctypes.grid.open_grid_row.fields_dict.doctypes._data = list; - return list; -} + let list = await callAPI({ + method: "myojana.apis.get_doctype_meta.get_allowed_doctype", + freeze: true, + args: { + doctype_name: "Beneficiary Profiling", + field_types: "Link", + options: doctype, + }, + freeze_message: __("Getting Fields..."), + }); + // list = list.map((e)=>{e.label = list.label, e.value = list.label}) + cur_frm.cur_grid.grid_form.fields_dict.field_name._data = list; + // frm.fields_dict.select_doctypes.grid.open_grid_row.fields_dict.doctypes._data = list; + return list; +}; const toggle_track_changes = async (items, value) => { - let list = await callAPI({ - method: 'myojana.apis.track_seen.toggle_track_changes', - freeze: true, - args: { - 'list': items, - "value": value - }, - freeze_message: __("Updating Track Changes..."), - }) - return list; -} + let list = await callAPI({ + method: "myojana.apis.track_seen.toggle_track_changes", + freeze: true, + args: { + list: items, + value: value, + }, + freeze_message: __("Updating Track Changes..."), + }); + return list; +}; const apply_filter_on_doctypes = async (frm) => { - // APPLY Filter in ID DOCUMENT - var child_table = frm.fields_dict['enable_track_changes'].grid; - if (child_table) { - try { - child_table.get_field('doc').get_query = function () { - return { - filters: [ - ["DocType", "module", "IN", ["Sva Report", "Rule Engine", "Master", "myojana"]], - ["DocType", "istable", "=", 0], - ['DocType', 'name', 'NOT IN', cur_frm.doc.enable_track_changes.map(function (item) { - return item.doc; - })] - ] - }; - }; - } catch (error) { - console.error(error) - } - } -} + // APPLY Filter in ID DOCUMENT + var child_table = frm.fields_dict["enable_track_changes"].grid; + if (child_table) { + try { + child_table.get_field("doc").get_query = function () { + return { + filters: [ + [ + "DocType", + "module", + "IN", + ["Sva Report", "Rule Engine", "Master", "myojana"], + ], + ["DocType", "istable", "=", 0], + [ + "DocType", + "name", + "NOT IN", + cur_frm.doc.enable_track_changes.map(function (item) { + return item.doc; + }), + ], + ], + }; + }; + } catch (error) { + console.error(error); + } + } +}; const test_auth_key = async (frm) => { - let data = await callAPI({ - method: 'myojana.apis.whatsapp.test_auth_key', - freeze: true, - args: { - "auth_key":frm.doc.auth_key - }, - freeze_message: __("Validating Auth Key..."), - }) - if(data.status == "success"){ - // console.log(data, data?.data[0]?.integrated_number) - frm.set_value("integrated_number",data?.data[0]?.integrated_number) - // frappe.msgprint("Auth Key is valid") - }else{ - frm.set_value("integrated_number",'') - frm.__unsaved = 1; - return frappe.throw("Auth Key is invalid") - } - -} + let data = await callAPI({ + method: "myojana.apis.whatsapp.test_auth_key", + freeze: true, + args: { + auth_key: frm.doc.auth_key, + }, + freeze_message: __("Validating Auth Key..."), + }); + if (data.status == "success") { + // console.log(data, data?.data[0]?.integrated_number) + frm.set_value("integrated_number", data?.data[0]?.integrated_number); + // frappe.msgprint("Auth Key is valid") + } else { + frm.set_value("integrated_number", ""); + frm.__unsaved = 1; + return frappe.throw("Auth Key is invalid"); + } +}; frappe.ui.form.on("mYojana Settings", { - async refresh(frm) { - }, - async before_save(frm) { - if(frm.doc.auth_key){ - await test_auth_key(frm) - } - const disable_tracking = deleted_row.map((item) => { return item.doc }); - if (disable_tracking.length) { - await toggle_track_changes(disable_tracking, 0) - } - const enable_tracking = frm.doc.enable_track_changes.map((item) => { return item.doc }); - if (enable_tracking.length) { - await toggle_track_changes(enable_tracking, 1); - } - deleted_row = []; - }, - test_auth_key:async function(frm){ - console.log("data") - await test_auth_key(frm) - } + async refresh(frm) {}, + async before_save(frm) { + if (frm.doc.auth_key) { + await test_auth_key(frm); + } + const disable_tracking = deleted_row.map((item) => { + return item.doc; + }); + if (disable_tracking.length) { + await toggle_track_changes(disable_tracking, 0); + } + const enable_tracking = frm.doc.enable_track_changes.map((item) => { + return item.doc; + }); + if (enable_tracking.length) { + await toggle_track_changes(enable_tracking, 1); + } + deleted_row = []; + }, + test_auth_key: async function (frm) { + console.log("data"); + await test_auth_key(frm); + }, }); -frappe.ui.form.on('Setting Doctype Child', { - form_render: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.doctypes && await get_fields_list(row.doctypes) - }, - select_doctypes_add: async function (frm, cdt, cdn) { - console.log("hello everyone") - }, - doctypes: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.doctypes && await get_fields_list(row.doctypes) - } -}) -frappe.ui.form.on('DocType Child', { - form_render: async function (frm, cdt, cdn) { - await apply_filter_on_doctypes(frm) - }, - enable_track_changes_add: async function (frm, cdt, cdn) { - await apply_filter_on_doctypes(frm) - }, - before_enable_track_changes_remove: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - deleted_row.push(row) - } -}) \ No newline at end of file +frappe.ui.form.on("Setting Doctype Child", { + form_render: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.doctypes && (await get_fields_list(row.doctypes)); + }, + select_doctypes_add: async function (frm, cdt, cdn) { + console.log("hello everyone"); + }, + doctypes: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.doctypes && (await get_fields_list(row.doctypes)); + }, +}); +frappe.ui.form.on("DocType Child", { + form_render: async function (frm, cdt, cdn) { + await apply_filter_on_doctypes(frm); + }, + enable_track_changes_add: async function (frm, cdt, cdn) { + await apply_filter_on_doctypes(frm); + }, + before_enable_track_changes_remove: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + deleted_row.push(row); + }, +}); diff --git a/myojana/myojana/doctype/myojana_settings/myojana_settings.py b/myojana/myojana/doctype/myojana_settings/myojana_settings.py index 4222a72..97d3dfb 100644 --- a/myojana/myojana/doctype/myojana_settings/myojana_settings.py +++ b/myojana/myojana/doctype/myojana_settings/myojana_settings.py @@ -8,13 +8,13 @@ class mYojanaSettings(Document): def validate(self): pass + def before_save(self): if not self.enable_whats_app_notification: self.id_card_template = 0 - self.whatsapp_service_provider ="" + self.whatsapp_service_provider = "" self.auth_key = "" self.integrated_number = "" # Get the host_url and remove the trailing slash if present - self.base_url = frappe.local.request.host_url.rstrip('/') - + self.base_url = frappe.local.request.host_url.rstrip("/") diff --git a/myojana/myojana/doctype/myojana_settings/myojana_settings_list.js b/myojana/myojana/doctype/myojana_settings/myojana_settings_list.js index 4592b94..9ae4e66 100644 --- a/myojana/myojana/doctype/myojana_settings/myojana_settings_list.js +++ b/myojana/myojana/doctype/myojana_settings/myojana_settings_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['mYojana Settings'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["mYojana Settings"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.js b/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.js index 796861c..2e4990f 100644 --- a/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.js +++ b/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.js @@ -2,43 +2,55 @@ // For license information, please see license.txt const set_field_list = async (frm) => { - frappe.model.with_doctype( frm.doc.select_doctype, function() { - let meta = frappe.get_meta(frm.doc.select_doctype); - meta.istable == 1 ? frm.set_df_property('select_parent_doctype', 'hidden', 0): frm.set_df_property('select_parent_doctype', 'hidden', 1); - meta.istable == 1 ? frm.set_df_property('select_parent_doctype', 'reqd', 1): frm.set_df_property('select_parent_doctype', 'reqd', 0); - console.log(meta); - let meta_field = meta.fields.filter(field => field.fieldtype === 'Select' || field.fieldtype === 'Link' || field.fieldtype === 'Autocomplete' ); - const result = meta_field.map(item => ({ - value: item.fieldname, - // lable: item.label - })); - frm.fields_dict.table_lrtz.grid.update_docfield_property("select_field", "options", result); - return meta_field - }); -} + frappe.model.with_doctype(frm.doc.select_doctype, function () { + let meta = frappe.get_meta(frm.doc.select_doctype); + meta.istable == 1 + ? frm.set_df_property("select_parent_doctype", "hidden", 0) + : frm.set_df_property("select_parent_doctype", "hidden", 1); + meta.istable == 1 + ? frm.set_df_property("select_parent_doctype", "reqd", 1) + : frm.set_df_property("select_parent_doctype", "reqd", 0); + console.log(meta); + let meta_field = meta.fields.filter( + (field) => + field.fieldtype === "Select" || + field.fieldtype === "Link" || + field.fieldtype === "Autocomplete" + ); + const result = meta_field.map((item) => ({ + value: item.fieldname, + // lable: item.label + })); + frm.fields_dict.table_lrtz.grid.update_docfield_property( + "select_field", + "options", + result + ); + return meta_field; + }); +}; frappe.ui.form.on("mYojana System Notification Setting", { refresh(frm) { - if(!frm.is_new()){ - set_field_list(frm); - // let meta = frappe.get_meta(""); - // console.log(meta); - } + if (!frm.is_new()) { + set_field_list(frm); + // let meta = frappe.get_meta(""); + // console.log(meta); + } + }, + select_doctype(frm) { + set_field_list(frm); + // let meta = frappe.get_meta(frm.doc.select_doctype); }, - select_doctype(frm){ - set_field_list(frm); - // let meta = frappe.get_meta(frm.doc.select_doctype); - } }); frappe.ui.form.on("System Notification Child", { - form_render(frm, cdt, cdn){ - let row = locals[cdt][cdn]; - set_field_list(frm); - console.log("from form render"); - }, - select_action(frm, cdt, cdn){ - let row = locals[cdt][cdn]; - console.log(row); - } - + form_render(frm, cdt, cdn) { + let row = locals[cdt][cdn]; + set_field_list(frm); + console.log("from form render"); + }, + select_action(frm, cdt, cdn) { + let row = locals[cdt][cdn]; + console.log(row); + }, }); diff --git a/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.py b/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.py index 0d216cb..8f33c39 100644 --- a/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.py +++ b/myojana/myojana/doctype/myojana_system_notification_setting/myojana_system_notification_setting.py @@ -7,7 +7,9 @@ class mYojanaSystemNotificationSetting(Document): def validate(self): - is_system_notification_enabled = frappe.db.get_single_value('mYojana Settings', 'enable_system_notification') + is_system_notification_enabled = frappe.db.get_single_value( + "mYojana Settings", "enable_system_notification" + ) - if(is_system_notification_enabled != 1): + if is_system_notification_enabled != 1: frappe.throw("System Notification is disabled. Please enable it from mYojana Settings") diff --git a/myojana/myojana/doctype/myojana_user/myojana_user.js b/myojana/myojana/doctype/myojana_user/myojana_user.js index 62f7eb2..3887c2b 100644 --- a/myojana/myojana/doctype/myojana_user/myojana_user.js +++ b/myojana/myojana/doctype/myojana_user/myojana_user.js @@ -1,146 +1,153 @@ // Copyright (c) 2023, suvaidyam and contributors // For license information, please see license.txt -var settings = {} +var settings = {}; const openDialog = (_cb, role_profile) => { - var doctypes = settings?.role_doctype_mapping?.filter((e) => e.doctyperef && e.role_profile ==role_profile); - const doctypes_arr = settings?.role_doctype_mapping - ?.filter(e => e.doctyperef && e.role_profile === role_profile) - .map(e => e.doctyperef) || []; - // new_doctypes = doctypes.filter((e) => e.doctyperef && e.role_profile ==role_profile); - if (!doctypes) { - doctypes = settings?.doctype_which_is_shown_in_user_permission?.split(",").map(e => e.trim()).filter(f => f).join("\n"); - } - console.log("doctypes print", doctypes, doctypes_arr) - return new frappe.ui.Dialog({ - title: "Add User Permission", - fields: [ - { - "fieldname": "select_doctype", - "fieldtype": "Autocomplete", - "label": "Select Doctype", - "options": doctypes_arr, - // "default": doctypes.split("\n") - }, - { - "depends_on": "eval:doc.select_doctype==\"State\"", - "fieldname": "select_states", - "fieldtype": "Table MultiSelect", - "label": "Select States", - "options": "State Child" - }, - { - "depends_on": "eval:doc.select_doctype==\"District\"", - "fieldname": "select_districts", - "fieldtype": "Table MultiSelect", - "label": "Select Districts", - "options": "District Child" - }, - { - "depends_on": "eval:doc.select_doctype==\"Block\"", - "fieldname": "select_blocks", - "fieldtype": "Table MultiSelect", - "label": "Select Blocks", - "options": "Block Child" - }, - { - "depends_on": "eval:doc.select_doctype==\"Village\"", - "fieldname": "select_villages", - "fieldtype": "Table MultiSelect", - "label": "Select Villages", - "options": "Village Child" - }, - { - "depends_on": "eval:doc.select_doctype==\"Centre\"", - "fieldname": "select_centres", - "fieldtype": "Table MultiSelect", - "label": "Select Centres", - "options": "Centre Child" - }, - { - "depends_on": "eval:doc.select_doctype==\"Sub Centre\"", - "fieldname": "select_sub_centres", - "fieldtype": "Table MultiSelect", - "label": "Select Sub Centres", - "options": "Sub Centre Child" - } - ], - primary_action_label: 'Submit', - async primary_action(values) { - // Log the selected values - let doctype = values.select_doctype; - console.log(doctype); - let selected_keys; - switch (doctype) { - case "State": - selected_keys = values.select_states; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'state') - break; - case "District": - selected_keys = values.select_districts; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'district') - break; - case "Block": - selected_keys = values.select_blocks; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'block') - break; - case "Village": - selected_keys = values.select_villages; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'village') - break; - case "Centre": - selected_keys = values.select_centres; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'centre') - break; - case "Sub Centre": - selected_keys = values.select_sub_centres; - console.log(selected_keys) - await loop_values(selected_keys, doctype, cur_frm, 'sub_centre') - break - default: - break; - } - console.log("cur_frm", cur_frm) - _cb(cur_frm) - this.hide(); - } - }) -} + var doctypes = settings?.role_doctype_mapping?.filter( + (e) => e.doctyperef && e.role_profile == role_profile + ); + const doctypes_arr = + settings?.role_doctype_mapping + ?.filter((e) => e.doctyperef && e.role_profile === role_profile) + .map((e) => e.doctyperef) || []; + // new_doctypes = doctypes.filter((e) => e.doctyperef && e.role_profile ==role_profile); + if (!doctypes) { + doctypes = settings?.doctype_which_is_shown_in_user_permission + ?.split(",") + .map((e) => e.trim()) + .filter((f) => f) + .join("\n"); + } + console.log("doctypes print", doctypes, doctypes_arr); + return new frappe.ui.Dialog({ + title: "Add User Permission", + fields: [ + { + fieldname: "select_doctype", + fieldtype: "Autocomplete", + label: "Select Doctype", + options: doctypes_arr, + // "default": doctypes.split("\n") + }, + { + depends_on: 'eval:doc.select_doctype=="State"', + fieldname: "select_states", + fieldtype: "Table MultiSelect", + label: "Select States", + options: "State Child", + }, + { + depends_on: 'eval:doc.select_doctype=="District"', + fieldname: "select_districts", + fieldtype: "Table MultiSelect", + label: "Select Districts", + options: "District Child", + }, + { + depends_on: 'eval:doc.select_doctype=="Block"', + fieldname: "select_blocks", + fieldtype: "Table MultiSelect", + label: "Select Blocks", + options: "Block Child", + }, + { + depends_on: 'eval:doc.select_doctype=="Village"', + fieldname: "select_villages", + fieldtype: "Table MultiSelect", + label: "Select Villages", + options: "Village Child", + }, + { + depends_on: 'eval:doc.select_doctype=="Centre"', + fieldname: "select_centres", + fieldtype: "Table MultiSelect", + label: "Select Centres", + options: "Centre Child", + }, + { + depends_on: 'eval:doc.select_doctype=="Sub Centre"', + fieldname: "select_sub_centres", + fieldtype: "Table MultiSelect", + label: "Select Sub Centres", + options: "Sub Centre Child", + }, + ], + primary_action_label: "Submit", + async primary_action(values) { + // Log the selected values + let doctype = values.select_doctype; + console.log(doctype); + let selected_keys; + switch (doctype) { + case "State": + selected_keys = values.select_states; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "state"); + break; + case "District": + selected_keys = values.select_districts; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "district"); + break; + case "Block": + selected_keys = values.select_blocks; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "block"); + break; + case "Village": + selected_keys = values.select_villages; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "village"); + break; + case "Centre": + selected_keys = values.select_centres; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "centre"); + break; + case "Sub Centre": + selected_keys = values.select_sub_centres; + console.log(selected_keys); + await loop_values(selected_keys, doctype, cur_frm, "sub_centre"); + break; + default: + break; + } + console.log("cur_frm", cur_frm); + _cb(cur_frm); + this.hide(); + }, + }); +}; const delete_button = async (frm) => { - document.querySelectorAll(".delete-button").forEach(element => { - element.onclick = async (e) => { - frappe.confirm('Are you sure you want to delete this permission?', - async () => { - let list = await callAPI({ - method: 'frappe.desk.reportview.delete_items', - freeze: true, - args: { - items: [e.target.id], - doctype: "User Permission", - }, - - freeze_message: __("Deleting Data ..."), - }) - await render_tables(frm) - }, - () => { - return - } - ) - }; - }); + document.querySelectorAll(".delete-button").forEach((element) => { + element.onclick = async (e) => { + frappe.confirm( + "Are you sure you want to delete this permission?", + async () => { + let list = await callAPI({ + method: "frappe.desk.reportview.delete_items", + freeze: true, + args: { + items: [e.target.id], + doctype: "User Permission", + }, -} + freeze_message: __("Deleting Data ..."), + }); + await render_tables(frm); + }, + () => { + return; + } + ); + }; + }); +}; const render_tables = async (frm) => { - let list = await get_permission(frm.doc.name) - console.log(list) - let tables = ` + let list = await get_permission(frm.doc.name); + console.log(list); + let tables = `
    @@ -150,150 +157,156 @@ const render_tables = async (frm) => { - ` - for (let i = 0; i < list?.length; i++) { - tables = tables + ` + `; + for (let i = 0; i < list?.length; i++) { + tables = + tables + + ` - + - ` - } - tables = tables + ` + `; + } + tables = + tables + + `
    Sr.No
    ${i + 1} ${list?.[i].allow} ${list?.[i].name_value}
    `; - if (list?.length) { - document.getElementById('datatable').innerHTML = tables - } else { - document.getElementById('datatable').innerHTML = '' - } - delete_button(frm) -} + if (list?.length) { + document.getElementById("datatable").innerHTML = tables; + } else { + document.getElementById("datatable").innerHTML = ""; + } + delete_button(frm); +}; const loop_values = async (selected_keys, doctype, frm, key) => { - for (let i = 0; i < selected_keys.length; i++) { - console.log(doctype, selected_keys[i][key]) - await set_permission(doctype, selected_keys[i][key], frm) - } -} + for (let i = 0; i < selected_keys.length; i++) { + console.log(doctype, selected_keys[i][key]); + await set_permission(doctype, selected_keys[i][key], frm); + } +}; // Calling APIs Common function function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: async function (response) { - resolve(response?.message || response?.value) - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: async function (response) { + resolve(response?.message || response?.value); + }, + }); + }); } // get scheme lists const set_permission = async (doctype, values, frm) => { - let list = await callAPI({ - method: 'myojana.apis.user_permissions.create_user_permissions', - freeze: true, - args: { - doc: { - "doctype": "User Permission", - "user": frm.doc.name, - "allow": doctype, - "for_value": values - }, - action: "Save", - }, - freeze_message: __("Saving Data"), - }) - return list -} + let list = await callAPI({ + method: "myojana.apis.user_permissions.create_user_permissions", + freeze: true, + args: { + doc: { + doctype: "User Permission", + user: frm.doc.name, + allow: doctype, + for_value: values, + }, + action: "Save", + }, + freeze_message: __("Saving Data"), + }); + return list; +}; // get permissions const get_permission = async (user) => { - let list = await callAPI({ - method: 'myojana.api.get_user_permission', - freeze: true, - args: { - doctype: "User Permission", - user: user, - view: "List", - order_by: "", - group_by: '', - }, + let list = await callAPI({ + method: "myojana.api.get_user_permission", + freeze: true, + args: { + doctype: "User Permission", + user: user, + view: "List", + order_by: "", + group_by: "", + }, - freeze_message: __("Getting Permissions"), - }) - return list -} -function defult_filter(field_name, filter_on, frm) { - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, - }, - }; - } + freeze_message: __("Getting Permissions"), + }); + return list; }; +function defult_filter(field_name, filter_on, frm) { + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: frm.doc.filter_on || `please select ${filter_on}`, + }, + }; + }; +} function apply_filter(field_name, filter_on, frm, filter_value) { - frm.fields_dict[field_name].get_query = function (doc) { - return { - filters: { - [filter_on]: filter_value, - }, - page_length: 1000 - }; - } -}; + frm.fields_dict[field_name].get_query = function (doc) { + return { + filters: { + [filter_on]: filter_value, + }, + page_length: 1000, + }; + }; +} function extend_options_length(frm, fields) { - fields.forEach((field) => { - frm.set_query(field, () => { - return { page_length: 1000 }; - }); - }) -}; + fields.forEach((field) => { + frm.set_query(field, () => { + return { page_length: 1000 }; + }); + }); +} function hide_advance_search(frm, list) { - for (item of list) { - frm.set_df_property(item, 'only_select', true); - } -}; + for (const item of list) { + frm.set_df_property(item, "only_select", true); + } +} frappe.ui.form.on("Myojana User", { - async refresh(frm) { - await render_tables(frm); - if (frm.is_new()) { - frm.set_df_property('add_permission', 'hidden', true); - } else { - frm.set_df_property('add_permission', 'hidden', false); - } - frm.doc.password = frm.doc.confirm_password - frm.doc.state ? apply_filter("centre", "state", frm, frm.doc.state) :null - extend_options_length(frm, ["state"]) - hide_advance_search(frm, ["role_profile", "state", "centre"]) - }, - state: function (frm) { - if (frm.doc.state) { - apply_filter("centre", "state", frm, frm.doc.state) - } else { - defult_filter('centre', "state", frm) - } - }, - add_permission: async function (frm) { - if (!Object.keys(settings).length) { - settings = await callAPI({ - method: 'myojana.api.get_mYojana_settings', - freeze: true, - freeze_message: __("Getting Permissions"), - }) - } - console.log("frm.role_profile", frm.doc.role_profile) - openDialog((_frm) => { - render_tables(_frm) - }, frm.doc.role_profile).show() - // d.show(); - } - // centre: function (frm) { - // if (frm.doc.centre) { - // apply_filter("sub_centre", "centre", frm, frm.doc.centre) - // } else { - // defult_filter('sub_centre', "centre", frm); - // } - // } + async refresh(frm) { + await render_tables(frm); + if (frm.is_new()) { + frm.set_df_property("add_permission", "hidden", true); + } else { + frm.set_df_property("add_permission", "hidden", false); + } + frm.doc.password = frm.doc.confirm_password; + frm.doc.state ? apply_filter("centre", "state", frm, frm.doc.state) : null; + extend_options_length(frm, ["state"]); + hide_advance_search(frm, ["role_profile", "state", "centre"]); + }, + state: function (frm) { + if (frm.doc.state) { + apply_filter("centre", "state", frm, frm.doc.state); + } else { + defult_filter("centre", "state", frm); + } + }, + add_permission: async function (frm) { + if (!Object.keys(settings).length) { + settings = await callAPI({ + method: "myojana.api.get_mYojana_settings", + freeze: true, + freeze_message: __("Getting Permissions"), + }); + } + console.log("frm.role_profile", frm.doc.role_profile); + openDialog((_frm) => { + render_tables(_frm); + }, frm.doc.role_profile).show(); + // d.show(); + }, + // centre: function (frm) { + // if (frm.doc.centre) { + // apply_filter("sub_centre", "centre", frm, frm.doc.centre) + // } else { + // defult_filter('sub_centre', "centre", frm); + // } + // } }); diff --git a/myojana/myojana/doctype/myojana_user/myojana_user.py b/myojana/myojana/doctype/myojana_user/myojana_user.py index 978239d..f1ea24d 100644 --- a/myojana/myojana/doctype/myojana_user/myojana_user.py +++ b/myojana/myojana/doctype/myojana_user/myojana_user.py @@ -4,9 +4,10 @@ import frappe from frappe.model.document import Document + class MyojanaUser(Document): def validate(self): - if(self.password != self.confirm_password): + if self.password != self.confirm_password: frappe.throw("Password and Confirm password not matched") def after_insert(self): @@ -19,7 +20,6 @@ def after_insert(self): new_user.new_password = self.confirm_password new_user.save() - def on_update(self): user_doc = frappe.get_doc("User", self.email) user_doc.email = self.email @@ -29,7 +29,7 @@ def on_update(self): user_doc.user_image = self.user_image user_doc.new_password = self.confirm_password user_doc.save() - + def on_trash(self): # Check if the user exists if frappe.db.exists("User", self.name): @@ -38,4 +38,3 @@ def on_trash(self): frappe.msgprint(f"The user {self.name} has been deleted.") else: frappe.msgprint(f"The user {self.name} does not exist.") - \ No newline at end of file diff --git a/myojana/myojana/doctype/myojana_user/myojana_user_list.js b/myojana/myojana/doctype/myojana_user/myojana_user_list.js index 2ce6b73..9b28f54 100644 --- a/myojana/myojana/doctype/myojana_user/myojana_user_list.js +++ b/myojana/myojana/doctype/myojana_user/myojana_user_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Myojana User'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Myojana User"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/myojana/doctype/primary_member/primary_member_list.js b/myojana/myojana/doctype/primary_member/primary_member_list.js index e9689d2..b3d3915 100644 --- a/myojana/myojana/doctype/primary_member/primary_member_list.js +++ b/myojana/myojana/doctype/primary_member/primary_member_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Primary Member'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Primary Member"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/myojana/doctype/sub_centre/sub_centre.js b/myojana/myojana/doctype/sub_centre/sub_centre.js index 20fce6c..e7edfae 100644 --- a/myojana/myojana/doctype/sub_centre/sub_centre.js +++ b/myojana/myojana/doctype/sub_centre/sub_centre.js @@ -2,13 +2,12 @@ // For license information, please see license.txt frappe.ui.form.on("Sub Centre", { - - refresh(frm) { - apply_filter("centre", "State", frm, frm.doc.state); - extend_options_length(frm, ['state','centre']); - hide_advance_search(frm, ['state','centre']) - }, - state: function (frm) { - apply_filter("centre", "State", frm, frm.doc.state); - } + refresh(frm) { + apply_filter("centre", "State", frm, frm.doc.state); + extend_options_length(frm, ["state", "centre"]); + hide_advance_search(frm, ["state", "centre"]); + }, + state: function (frm) { + apply_filter("centre", "State", frm, frm.doc.state); + }, }); diff --git a/myojana/myojana/doctype/sub_centre/sub_centre_list.js b/myojana/myojana/doctype/sub_centre/sub_centre_list.js index 7709ee2..a2ad7f7 100644 --- a/myojana/myojana/doctype/sub_centre/sub_centre_list.js +++ b/myojana/myojana/doctype/sub_centre/sub_centre_list.js @@ -1,5 +1,5 @@ -frappe.listview_settings['Sub Centre'] = { - onload: function (listview) { - $('.layout-side-section').hide(); - } -}; \ No newline at end of file +frappe.listview_settings["Sub Centre"] = { + onload: function (listview) { + $(".layout-side-section").hide(); + }, +}; diff --git a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.js b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.js index 3e8978e..a0d6afb 100644 --- a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.js +++ b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.js @@ -2,43 +2,40 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", }, ]; if (frappe.user_roles.includes("Admin")) { filters.push( { - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", }, { - "fieldname": "district", - "fieldtype": "Link", - "label": "District", - "options": "District", - "get_query": function () { - var state = frappe.query_report.get_filter_value('state'); + fieldname: "district", + fieldtype: "Link", + label: "District", + options: "District", + get_query: function () { + var state = frappe.query_report.get_filter_value("state"); return { filters: { - 'state': state - } + state: state, + }, }; - } + }, } - ) + ); } frappe.query_reports["Age-wise beneficiaries"] = { - filters: filters + filters: filters, }; - - - diff --git a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.json b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.json index 5b4aae0..226f158 100644 --- a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.json +++ b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.json @@ -1,15 +1,16 @@ { - "add_total_row": 1, + "add_total_row": 0, + "add_translate_data": 0, "columns": [], "creation": "2024-01-16 10:06:38.820516", "disabled": 0, "docstatus": 0, "doctype": "Report", "filters": [], - "idx": 0, + "idx": 1, "is_standard": "Yes", - "letterhead": null, - "modified": "2025-04-01 10:57:03.277066", + "letter_head": null, + "modified": "2026-06-09 12:38:52.009075", "modified_by": "Administrator", "module": "myojana", "name": "Age-wise beneficiaries", diff --git a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.py b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.py index e0f9edc..5edbd8d 100644 --- a/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.py +++ b/myojana/myojana/report/age_wise_beneficiaries/age_wise_beneficiaries.py @@ -3,33 +3,28 @@ import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "age_category", - "label": "Age Category", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "number_of_beneficiaries", - "label": "Number of beneficiaries", - "fieldtype": "Int", - "width": 300 - } - ] - condition_str = ReportFilter.set_report_filters( - filters, 'date_of_visit', True) - - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" - - sql_query = f""" + columns = [ + {"fieldname": "age_category", "label": "Age Category", "fieldtype": "Data", "width": 200}, + { + "fieldname": "number_of_beneficiaries", + "label": "Number of beneficiaries", + "fieldtype": "Int", + "width": 300, + }, + ] + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True) + + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" + + sql_query = f""" SELECT 'Less than 5 years' AS age_category, COUNT(CASE WHEN completed_age < 5 THEN 1 END) AS number_of_beneficiaries FROM @@ -77,5 +72,5 @@ def execute(filters=None): {condition_str} """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.js b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.js index ada8886..2dbc6bf 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.js +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.js @@ -2,16 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; frappe.query_reports["Beneficiaries who have received benefits of 2 or more schemes"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.py b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.py index 763a62f..1e83d32 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.py +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_2_or_more_schemes/beneficiaries_who_have_received_benefits_of_2_or_more_schemes.py @@ -1,33 +1,30 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "n", - "label": _("No. of members"), - "fieldtype": "Data", # Note: 'Int' should be properly capitalized - "width": 200 - }, - { - "fieldname": "count", - "label": _("No. distinct member"), - "fieldtype": "Int", - "width": 200 - } - ] + columns = [ + { + "fieldname": "n", + "label": _("No. of members"), + "fieldtype": "Data", # Note: 'Int' should be properly capitalized + "width": 200, + }, + {"fieldname": "count", "label": _("No. distinct member"), "fieldtype": "Int", "width": 200}, + ] + + # Set the report filters + condition_str = ReportFilter.set_report_filters(filters, "creation", True, "ben") - # Set the report filters - condition_str = ReportFilter.set_report_filters(filters, 'creation', True, 'ben') - - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" - # SQL Query - sql_query = f""" + # SQL Query + sql_query = f""" SELECT 'Number of members' AS n, COUNT(t.name) AS count @@ -37,12 +34,12 @@ def execute(filters=None): ben.name, COUNT(sc.name) AS sc_count FROM - "tabBeneficiary Profiling" AS ben - INNER JOIN "tabScheme Child" sc ON (sc.parent = ben.name AND sc.status = 'Completed') + `tabBeneficiary Profiling` AS ben + INNER JOIN `tabScheme Child` sc ON (sc.parent = ben.name AND sc.status = 'Completed') {condition_str} GROUP BY ben.name HAVING COUNT(sc.name) >= 2 ) as t; """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.js b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.js index d2d4816..407d9d8 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.js +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.js @@ -2,16 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; frappe.query_reports["Beneficiaries who have received benefits of 3 or more schemes"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.py b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.py index 3c47aef..da0785f 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.py +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_3_or_more_schemes/beneficiaries_who_have_received_benefits_of_3_or_more_schemes.py @@ -6,30 +6,22 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"n", - "label":_("No. of members"), - "fieldtype":"int", - "width":200 - }, - { - "fieldname":"count", - "label":_("No. distinct member"), - "fieldtype":"int", - "width":200 - } + {"fieldname": "n", "label": _("No. of members"), "fieldtype": "int", "width": 200}, + {"fieldname": "count", "label": _("No. distinct member"), "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True,'ben') + condition_str = ReportFilter.set_report_filters(filters, "creation", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT 'Number of members' AS n, @@ -40,8 +32,8 @@ def execute(filters=None): ben.name, COUNT(sc.name) AS sc_count FROM - "tabBeneficiary Profiling" AS ben - INNER JOIN "tabScheme Child" sc ON (sc.parent = ben.name AND sc.status = 'Completed') + `tabBeneficiary Profiling` AS ben + INNER JOIN `tabScheme Child` sc ON (sc.parent = ben.name AND sc.status = 'Completed') WHERE 1=1 {condition_str} GROUP BY ben.name HAVING COUNT(sc.name) >= 3 diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js index c236cbb..83f888c 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js @@ -2,16 +2,18 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; -frappe.query_reports["Beneficiaries who have received benefits of at least 1 scheme in each category"] = { - filters: filters +frappe.query_reports[ + "Beneficiaries who have received benefits of at least 1 scheme in each category" +] = { + filters: filters, }; diff --git a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py index b10998e..cd205c9 100644 --- a/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py +++ b/myojana/myojana/report/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category/beneficiaries_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py @@ -6,35 +6,29 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"n", - "label":_("No. of beneficiaries"), - "fieldtype":"int", - "width":200 - }, - { - "fieldname":"count", - "label":_("No. distinct beneficiaries"), - "fieldtype":"int", - "width":200 - } + {"fieldname": "n", "label": _("No. of beneficiaries"), "fieldtype": "int", "width": 200}, + {"fieldname": "count", "label": _("No. distinct beneficiaries"), "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True,'bp') + condition_str = ReportFilter.set_report_filters(filters, "creation", True, "bp") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - milestones = frappe.db.sql("SELECT DISTINCT milestone as milestone FROM `tabScheme` WHERE enabled = 1", as_dict=True) + milestones = frappe.db.sql( + "SELECT DISTINCT milestone as milestone FROM `tabScheme` WHERE enabled = 1", as_dict=True + ) mcount = len(milestones) milestones = [f"'{m['milestone']}'" for m in milestones] - query =f""" - SELECT + query = f""" + SELECT COUNT(t.name) as count, 'Number of beneficiaries' as n FROM @@ -45,8 +39,8 @@ def execute(filters=None): from `tabScheme Child` as s INNER JOIN `tabBeneficiary Profiling` bp ON bp.name = parent - WHERE - s.parenttype = 'Beneficiary Profiling' and s.parentfield = 'scheme_table' {condition_str} + WHERE + s.parenttype = 'Beneficiary Profiling' and s.parentfield = 'scheme_table' {condition_str} AND s.milestone_category IN ({','.join(milestones)}) GROUP BY bp.name HAVING COUNT(DISTINCT s.milestone) = {mcount} diff --git a/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.js b/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.js index 11052bb..66870fe 100644 --- a/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.js +++ b/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.js @@ -2,25 +2,24 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Beneficiaries with Bank Account"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.py b/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.py index 1bb207b..7fda0b9 100644 --- a/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.py +++ b/myojana/myojana/report/beneficiaries_with_bank_account/beneficiaries_with_bank_account.py @@ -2,30 +2,27 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ { - "fieldname":"bank_account", - "label":"Bank account status of Beneficiaries", - "fieldtype":"Data", - "width":300 + "fieldname": "bank_account", + "label": "Bank account status of Beneficiaries", + "fieldtype": "Data", + "width": 300, }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True) + condition_str = ReportFilter.set_report_filters(filters, "creation", True) if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT CASE @@ -42,4 +39,4 @@ def execute(filters=None): """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js b/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js index 928a38a..d6bba2c 100644 --- a/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js +++ b/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.js @@ -2,27 +2,23 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - - - ) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Camps-wise beneficiaries"] = { filters: filters, diff --git a/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.py b/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.py index 3240ecc..51d8f3b 100644 --- a/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.py +++ b/myojana/myojana/report/camps_wise_beneficiaries/camps_wise_beneficiaries.py @@ -2,30 +2,25 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "camp", - "label": "Camp", - "fieldtype": "Data", - "width": 400 - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "int", - "width": 200 - } - ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True,) - if condition_str: - condition_str = f"{condition_str}" - else: - condition_str = "1=1" - sql_query = f""" + columns = [ + {"fieldname": "camp", "label": "Camp", "fieldtype": "Data", "width": 400}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, + ] + condition_str = ReportFilter.set_report_filters( + filters, + "date_of_visit", + True, + ) + if condition_str: + condition_str = f"{condition_str}" + else: + condition_str = "1=1" + sql_query = f""" SELECT name_of_the_camp as camp, COUNT(name) AS count @@ -36,5 +31,5 @@ def execute(filters=None): name_of_the_camp """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.js b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.js index 91de9ef..b18091e 100644 --- a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.js +++ b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.js @@ -2,27 +2,23 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - - - ) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Centre wise demands"] = { filters: filters, diff --git a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.json b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.json index d9025bc..53b3f7f 100644 --- a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.json +++ b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.json @@ -1,38 +1,40 @@ { - "add_total_row": 0, - "columns": [], - "creation": "2024-01-16 10:49:32.351251", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "filters": [], - "idx": 0, - "is_standard": "Yes", - "letterhead": null, - "modified": "2024-01-16 10:49:32.351251", - "modified_by": "Administrator", - "module": "myojana", - "name": "Centre wise demands", - "owner": "Administrator", - "prepared_report": 0, - "ref_doctype": "Beneficiary Profiling", - "report_name": "Centre wise demands", - "report_type": "Script Report", - "roles": [ - { - "role": "Admin" - }, - { - "role": "CSC Member" - }, - { - "role": "Sub-Centre" - }, - { - "role": "MIS executive" - }, - { - "role": "System Manager" - } - ] + "add_total_row": 0, + "add_translate_data": 0, + "columns": [], + "creation": "2024-01-16 10:49:32.351251", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "filters": [], + "idx": 1, + "is_standard": "Yes", + "letter_head": null, + "modified": "2026-06-10 10:19:10.406002", + "modified_by": "Administrator", + "module": "myojana", + "name": "Centre wise demands", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Beneficiary Profiling", + "report_name": "Centre wise demands", + "report_type": "Script Report", + "roles": [ + { + "role": "Admin" + }, + { + "role": "CSC Member" + }, + { + "role": "Sub-Centre" + }, + { + "role": "MIS executive" + }, + { + "role": "System Manager" + } + ], + "timeout": 0 } \ No newline at end of file diff --git a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.py b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.py index 3d6ffab..3ffeee2 100644 --- a/myojana/myojana/report/centre_wise_demands/centre_wise_demands.py +++ b/myojana/myojana/report/centre_wise_demands/centre_wise_demands.py @@ -2,60 +2,60 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "centre_name", - "label": " Centre Name ", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - } - ] + columns = [ + { + "fieldname": "centre_name", + "label": " Centre Name ", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'bp') - condition_str = f"WHERE {condition_str}" if condition_str else "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") + condition_str = f"WHERE {condition_str}" if condition_str else "" - sql_query = f""" + sql_query = f""" SELECT tw.centre_name, SUM(CASE WHEN (sc.status = 'Open') THEN 1 ELSE 0 END) as open_demands, @@ -75,6 +75,5 @@ def execute(filters=None): tw.centre_name; """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).js b/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).js index db44968..3e866bf 100644 --- a/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).js +++ b/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).js @@ -2,27 +2,25 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "options": "Centre", - "label": "Centre" - - }) + fieldname: "centre", + fieldtype: "Link", + options: "Centre", + label: "Centre", + }); } frappe.query_reports["Current Location(agrasar)"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).py b/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).py index 7781117..55c5cf7 100644 --- a/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).py +++ b/myojana/myojana/report/current_location(agrasar)/current_location(agrasar).py @@ -2,48 +2,47 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "location", - "label": "Current Location", - "fieldtype": "Data", - "width": 150, - - }, - { - "fieldname": "count", - "label": "count", - "fieldtype": "Data", - "width": 160, - }, - ] - - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'ben') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" - - sql_query = f""" - SELECT - cl.name_of_location AS location, + columns = [ + { + "fieldname": "location", + "label": "Current Location", + "fieldtype": "Data", + "width": 150, + }, + { + "fieldname": "count", + "label": "count", + "fieldtype": "Data", + "width": 160, + }, + ] + + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" + + sql_query = f""" + SELECT + cl.name_of_location AS location, COUNT(ben.name) AS count - FROM + FROM `tabBeneficiary Profiling` AS ben - LEFT JOIN - `tabCurrent location` AS cl + LEFT JOIN + `tabCurrent location` AS cl ON cl.name = ben.custom_current_location WHERE 1=1 {condition_str} - GROUP BY + GROUP BY cl.name - ORDER BY + ORDER BY Count DESC """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/district_wise_demands/district_wise_demands.js b/myojana/myojana/report/district_wise_demands/district_wise_demands.js index 4a2fd6c..af6410b 100644 --- a/myojana/myojana/report/district_wise_demands/district_wise_demands.js +++ b/myojana/myojana/report/district_wise_demands/district_wise_demands.js @@ -2,39 +2,39 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { - filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - { - "fieldname": "district", - "fieldtype": "Link", - "label": "District", - "options": "District", - "get_query": function() { - var state = frappe.query_report.get_filter_value('state'); - return { - filters: { - 'state': state - } - }; + filters.push( + { + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }, + { + fieldname: "district", + fieldtype: "Link", + label: "District", + options: "District", + get_query: function () { + var state = frappe.query_report.get_filter_value("state"); + return { + filters: { + state: state, + }, + }; + }, } - } - ) + ); } frappe.query_reports["District-wise demands"] = { filters: filters, diff --git a/myojana/myojana/report/district_wise_demands/district_wise_demands.py b/myojana/myojana/report/district_wise_demands/district_wise_demands.py index 6898a4a..53f5f42 100644 --- a/myojana/myojana/report/district_wise_demands/district_wise_demands.py +++ b/myojana/myojana/report/district_wise_demands/district_wise_demands.py @@ -2,63 +2,63 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "district_name", - "label": " Name Of District ", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - }, - ] + columns = [ + { + "fieldname": "district_name", + "label": " Name Of District ", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'bp') - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT COALESCE(d.district_name, 'Unknown') AS district_name, SUM(CASE WHEN (sc.status = 'Open') THEN 1 ELSE 0 END) as open_demands, @@ -78,8 +78,5 @@ def execute(filters=None): COALESCE(d.district_name, 'Unknown'); """ - - - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/education_composition/education_composition.js b/myojana/myojana/report/education_composition/education_composition.js index ad5eb01..cddc531 100644 --- a/myojana/myojana/report/education_composition/education_composition.js +++ b/myojana/myojana/report/education_composition/education_composition.js @@ -3,25 +3,24 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" - }) + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", + }); } frappe.query_reports["Education composition"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/education_composition/education_composition.py b/myojana/myojana/report/education_composition/education_composition.py index 9e11109..cdd6f97 100644 --- a/myojana/myojana/report/education_composition/education_composition.py +++ b/myojana/myojana/report/education_composition/education_composition.py @@ -2,30 +2,22 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"education", - "label":"Education of beneficiary", - "fieldtype":"Data", - "width":400 - }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "education", "label": "Education of beneficiary", "fieldtype": "Data", "width": 400}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 't1') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "t1") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT COALESCE(NULLIF(t1.education, ''), 'Unknown') AS education, diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.js b/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.js index 0787fd3..f4cc30a 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.js +++ b/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.js @@ -2,16 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; frappe.query_reports["Families who have received benefits of 2 or more schemes"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.py b/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.py index 8ffa9e3..caf7e35 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.py +++ b/myojana/myojana/report/families_who_have_received_benefits_of_2_or_more_schemes/families_who_have_received_benefits_of_2_or_more_schemes.py @@ -6,25 +6,17 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"n", - "label":_("No. of members"), - "fieldtype":"int", - "width":200 - }, - { - "fieldname":"count", - "label":_("No. distinct Families"), - "fieldtype":"int", - "width":200 - } + {"fieldname": "n", "label": _("No. of members"), "fieldtype": "int", "width": 200}, + {"fieldname": "count", "label": _("No. distinct Families"), "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: @@ -40,8 +32,8 @@ def execute(filters=None): ben.select_primary_member, COUNT(ben.select_primary_member) AS sc_count FROM - "tabBeneficiary Profiling" AS ben - INNER JOIN "tabScheme Child" sc ON (sc.parent = ben.name AND sc.status = 'Completed') + `tabBeneficiary Profiling` AS ben + INNER JOIN `tabScheme Child` sc ON (sc.parent = ben.name AND sc.status = 'Completed') WHERE 1=1 {condition_str} GROUP BY ben.select_primary_member HAVING COUNT(ben.select_primary_member) >= 2 diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.js b/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.js index 80851bc..9a94915 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.js +++ b/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.js @@ -2,16 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; frappe.query_reports["Families who have received benefits of 3 or more schemes"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.py b/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.py index 9191ab1..7ca3c83 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.py +++ b/myojana/myojana/report/families_who_have_received_benefits_of_3_or_more_schemes/families_who_have_received_benefits_of_3_or_more_schemes.py @@ -6,30 +6,22 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"n", - "label":_("No. of members"), - "fieldtype":"int", - "width":200 - }, - { - "fieldname":"count", - "label":_("No. distinct Families"), - "fieldtype":"int", - "width":200 - } + {"fieldname": "n", "label": _("No. of members"), "fieldtype": "int", "width": 200}, + {"fieldname": "count", "label": _("No. distinct Families"), "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT 'Number of members' AS n, @@ -40,8 +32,8 @@ def execute(filters=None): ben.select_primary_member, COUNT(ben.select_primary_member) AS sc_count FROM - "tabBeneficiary Profiling" AS ben - INNER JOIN "tabScheme Child" sc ON (sc.parent = ben.name AND sc.status = 'Completed') + `tabBeneficiary Profiling` AS ben + INNER JOIN `tabScheme Child` sc ON (sc.parent = ben.name AND sc.status = 'Completed') WHERE 1=1 {condition_str} GROUP BY ben.select_primary_member HAVING COUNT(ben.select_primary_member) >= 3 diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js b/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js index efd3c8b..df66c41 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js +++ b/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.js @@ -2,16 +2,17 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": __("From Date"), + fieldname: "from_date", + fieldtype: "Date", + label: __("From Date"), }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": __("To Date") + fieldname: "to_date", + fieldtype: "Date", + label: __("To Date"), }, ]; -frappe.query_reports["Families who have received benefits of at least 1 scheme in each category"] = { - filters: filters -}; +frappe.query_reports["Families who have received benefits of at least 1 scheme in each category"] = + { + filters: filters, + }; diff --git a/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py b/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py index eef2ff0..e86f81b 100644 --- a/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py +++ b/myojana/myojana/report/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category/families_who_have_received_benefits_of_at_least_1_scheme_in_each_category.py @@ -6,35 +6,29 @@ import frappe from frappe import _ + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"n", - "label":_("No. of families"), - "fieldtype":"int", - "width":200 - }, - { - "fieldname":"count", - "label":_("No. distinct families"), - "fieldtype":"int", - "width":200 - } + {"fieldname": "n", "label": _("No. of families"), "fieldtype": "int", "width": 200}, + {"fieldname": "count", "label": _("No. distinct families"), "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'bp') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - milestones = frappe.db.sql("select distinct milestone as milestone from `tabScheme` where enabled = 1", as_dict=True) + milestones = frappe.db.sql( + "select distinct milestone as milestone from `tabScheme` where enabled = 1", as_dict=True + ) mcount = len(milestones) milestones = [f"'{m['milestone']}'" for m in milestones] - query =f""" - SELECT + query = f""" + SELECT COUNT(t.select_primary_member) as count, 'Number of beneficiaries' as n FROM @@ -44,8 +38,8 @@ def execute(filters=None): bp.select_primary_member FROM `tabScheme Child` as s - INNER JOIN `tabBeneficiary Profiling` bp ON bp.name = s.parent - WHERE + INNER JOIN `tabBeneficiary Profiling` bp ON bp.name = s.parent + WHERE s.parenttype = 'Beneficiary Profiling' AND s.parentfield = 'scheme_table' {condition_str} AND s.milestone_category IN ({','.join(milestones)}) GROUP BY bp.select_primary_member diff --git a/myojana/myojana/report/gender_composition/__init__.py b/myojana/myojana/report/gender_composition/__init__.py index b28b04f..8b13789 100644 --- a/myojana/myojana/report/gender_composition/__init__.py +++ b/myojana/myojana/report/gender_composition/__init__.py @@ -1,3 +1 @@ - - diff --git a/myojana/myojana/report/gender_composition/gender_composition.js b/myojana/myojana/report/gender_composition/gender_composition.js index 476b540..06e92f7 100644 --- a/myojana/myojana/report/gender_composition/gender_composition.js +++ b/myojana/myojana/report/gender_composition/gender_composition.js @@ -3,27 +3,24 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Gender composition"] = { - filters: filters + filters: filters, }; - - diff --git a/myojana/myojana/report/gender_composition/gender_composition.py b/myojana/myojana/report/gender_composition/gender_composition.py index a6bb736..edabd28 100644 --- a/myojana/myojana/report/gender_composition/gender_composition.py +++ b/myojana/myojana/report/gender_composition/gender_composition.py @@ -2,30 +2,22 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"gender", - "label":"Gender", - "fieldtype":"Data", - "width":300 - }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "gender", "label": "Gender", "fieldtype": "Data", "width": 300}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True) + condition_str = ReportFilter.set_report_filters(filters, "creation", True) if condition_str: condition_str = f"WHERE {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT COALESCE(NULLIF(gender, ''), 'Unknown') as gender, @@ -37,4 +29,4 @@ def execute(filters=None): COALESCE(NULLIF(gender, ''), 'Unknown'); """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.js b/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.js index 837b8dc..6921e51 100644 --- a/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.js +++ b/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.js @@ -2,16 +2,16 @@ // For license information, please see license.txt frappe.query_reports["Gender Split of Total Citizenship ID Demands"] = { - "filters": [ + filters: [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - ] + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, + ], }; diff --git a/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.py b/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.py index c0e314a..3ec13f8 100644 --- a/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.py +++ b/myojana/myojana/report/gender_split_of_total_citizenship_id_demands/gender_split_of_total_citizenship_id_demands.py @@ -2,66 +2,41 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"gender", - "label":"Gender", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"ben_count", - "label":"Beneficiary Count", - "fieldtype":"int", - "width":200 - }, - - { - "fieldname":"open", - "label":"Open", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"completed", - "label":"Completed", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"under_process", - "label":"Under Process", - "fieldtype":"Data", - "width":200 - } - + {"fieldname": "gender", "label": "Gender", "fieldtype": "Data", "width": 200}, + {"fieldname": "ben_count", "label": "Beneficiary Count", "fieldtype": "int", "width": 200}, + {"fieldname": "open", "label": "Open", "fieldtype": "Data", "width": 200}, + {"fieldname": "completed", "label": "Completed", "fieldtype": "Data", "width": 200}, + {"fieldname": "under_process", "label": "Under Process", "fieldtype": "Data", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" - SELECT + SELECT COUNT(ben.name) AS ben_count, ben.gender, SUM(CASE WHEN s.status = 'Open' THEN 1 ELSE 0 END) AS open, SUM(CASE WHEN s.status = 'Completed' THEN 1 ELSE 0 END) AS completed, SUM(CASE WHEN s.status = 'Under Process' THEN 1 ELSE 0 END) AS under_process - FROM + FROM `tabBeneficiary Profiling` AS ben - LEFT JOIN `tabScheme Child` AS s - ON ben.name = s.parent - WHERE - s.milestone_category = 'Citizenship Entitlement' AND s.status IN ('Open','Completed','Under Process') + LEFT JOIN `tabScheme Child` AS s + ON ben.name = s.parent + WHERE + s.milestone_category = 'Citizenship Entitlement' AND s.status IN ('Open','Completed','Under Process') {condition_str} - GROUP BY + GROUP BY ben.gender; """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.js b/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.js index 1d0bd39..56cc691 100644 --- a/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.js +++ b/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.js @@ -2,16 +2,16 @@ // For license information, please see license.txt frappe.query_reports["Gender Split of Total Demands"] = { - "filters": [ + filters: [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - ] + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, + ], }; diff --git a/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.py b/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.py index a16711b..548d645 100644 --- a/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.py +++ b/myojana/myojana/report/gender_split_of_total_demands/gender_split_of_total_demands.py @@ -2,66 +2,41 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"gender", - "label":"Gender", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"ben_count", - "label":"Beneficiary Count", - "fieldtype":"int", - "width":200 - }, - - { - "fieldname":"open", - "label":"Open", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"completed", - "label":"Completed", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"under_process", - "label":"Under Process", - "fieldtype":"Data", - "width":200 - } - + {"fieldname": "gender", "label": "Gender", "fieldtype": "Data", "width": 200}, + {"fieldname": "ben_count", "label": "Beneficiary Count", "fieldtype": "int", "width": 200}, + {"fieldname": "open", "label": "Open", "fieldtype": "Data", "width": 200}, + {"fieldname": "completed", "label": "Completed", "fieldtype": "Data", "width": 200}, + {"fieldname": "under_process", "label": "Under Process", "fieldtype": "Data", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" - SELECT + SELECT COUNT(ben.name) AS ben_count, ben.gender, SUM(CASE WHEN s.status = 'Open' THEN 1 ELSE 0 END) AS open, SUM(CASE WHEN s.status = 'Completed' THEN 1 ELSE 0 END) AS completed, SUM(CASE WHEN s.status = 'Under Process' THEN 1 ELSE 0 END) AS under_process - FROM + FROM `tabBeneficiary Profiling` AS ben - LEFT JOIN `tabScheme Child` AS s - ON ben.name = s.parent - WHERE - s.status IN ('Open','Completed','Under Process') + LEFT JOIN `tabScheme Child` AS s + ON ben.name = s.parent + WHERE + s.status IN ('Open','Completed','Under Process') {condition_str} - GROUP BY + GROUP BY ben.gender; """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.js b/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.js index b7e0058..0bb4396 100644 --- a/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.js +++ b/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.js @@ -2,16 +2,16 @@ // For license information, please see license.txt frappe.query_reports["Gender Split of Total Demands Exclusive Citizenship ID Demands"] = { - "filters": [ + filters: [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - ] + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, + ], }; diff --git a/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.py b/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.py index fafa4dc..5414d23 100644 --- a/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.py +++ b/myojana/myojana/report/gender_split_of_total_demands_exclusive_citizenship_id_demands/gender_split_of_total_demands_exclusive_citizenship_id_demands.py @@ -2,66 +2,41 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"gender", - "label":"Gender", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"ben_count", - "label":"Beneficiary Count", - "fieldtype":"int", - "width":200 - }, - - { - "fieldname":"open", - "label":"Open", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"completed", - "label":"Completed", - "fieldtype":"Data", - "width":200 - }, - { - "fieldname":"under_process", - "label":"Under Process", - "fieldtype":"Data", - "width":200 - } - + {"fieldname": "gender", "label": "Gender", "fieldtype": "Data", "width": 200}, + {"fieldname": "ben_count", "label": "Beneficiary Count", "fieldtype": "int", "width": 200}, + {"fieldname": "open", "label": "Open", "fieldtype": "Data", "width": 200}, + {"fieldname": "completed", "label": "Completed", "fieldtype": "Data", "width": 200}, + {"fieldname": "under_process", "label": "Under Process", "fieldtype": "Data", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" - SELECT + SELECT COUNT(ben.name) AS ben_count, ben.gender, SUM(CASE WHEN s.status = 'Open' THEN 1 ELSE 0 END) AS open, SUM(CASE WHEN s.status = 'Completed' THEN 1 ELSE 0 END) AS completed, SUM(CASE WHEN s.status = 'Under Process' THEN 1 ELSE 0 END) AS under_process - FROM + FROM `tabBeneficiary Profiling` AS ben - LEFT JOIN `tabScheme Child` AS s - ON ben.name = s.parent - WHERE - s.milestone_category != 'Citizenship Entitlement' AND s.status IN ('Open','Completed','Under Process') + LEFT JOIN `tabScheme Child` AS s + ON ben.name = s.parent + WHERE + s.milestone_category != 'Citizenship Entitlement' AND s.status IN ('Open','Completed','Under Process') {condition_str} - GROUP BY + GROUP BY ben.gender; """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.js b/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.js index 4565e70..0e19514 100644 --- a/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.js +++ b/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.js @@ -2,40 +2,40 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Admin")) { - filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - // { - // "fieldname": "district", - // "fieldtype": "Link", - // "label": "District", - // "options": "District", - // "get_query": function() { - // var state = frappe.query_report.get_filter_value('state'); - // return { - // filters: { - // 'state': state - // } - // }; - // } - // } - ) + filters.push( + { + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + } + // { + // "fieldname": "district", + // "fieldtype": "Link", + // "label": "District", + // "options": "District", + // "get_query": function() { + // var state = frappe.query_report.get_filter_value('state'); + // return { + // filters: { + // 'state': state + // } + // }; + // } + // } + ); } frappe.query_reports["House type-wise beneficiaries"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.py b/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.py index 06b92f3..dcf7b26 100644 --- a/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.py +++ b/myojana/myojana/report/house_type_wise_beneficiaries/house_type_wise_beneficiaries.py @@ -2,32 +2,29 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "house_type", - "label": "House Type", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "number_of_beneficiaries", - "label": "Number Of beneficiaries", - "fieldtype": "Int", - "width": 300 - } - ] - - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True) - - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" - - sql_query = f""" + columns = [ + {"fieldname": "house_type", "label": "House Type", "fieldtype": "Data", "width": 200}, + { + "fieldname": "number_of_beneficiaries", + "label": "Number Of beneficiaries", + "fieldtype": "Int", + "width": 300, + }, + ] + + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True) + + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" + + sql_query = f""" SELECT CASE WHEN COALESCE(current_house_type, '') = '' THEN 'Unknown' @@ -42,7 +39,5 @@ def execute(filters=None): ORDER BY number_of_beneficiaries DESC """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data - + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.js b/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.js index 7918993..17573be 100644 --- a/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.js +++ b/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.js @@ -2,16 +2,15 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; // if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { // filters.push({ diff --git a/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.py b/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.py index c9f0282..c1f3ca4 100644 --- a/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.py +++ b/myojana/myojana/report/milestone_wise_demands/milestone_wise_demands.py @@ -2,63 +2,63 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "milestone_category", - "label": "Milestone ", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - }, - ] + columns = [ + { + "fieldname": "milestone_category", + "label": "Milestone ", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT milestone_category, SUM(CASE WHEN (_sc.status = 'Open') THEN 1 ELSE 0 END) as open_demands, @@ -76,6 +76,5 @@ def execute(filters=None): milestone_category; """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).js b/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).js index 5de3bff..b23295d 100644 --- a/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).js +++ b/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).js @@ -2,17 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; frappe.query_reports["Number of Unique Beneficiaries ( Government schemes +Documentation )"] = { - "filters": filters + filters: filters, }; diff --git a/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).py b/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).py index d4c7849..231edd5 100644 --- a/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).py +++ b/myojana/myojana/report/number_of_unique_beneficiaries_(_government_schemes_+documentation_)/number_of_unique_beneficiaries_(_government_schemes_+documentation_).py @@ -2,33 +2,33 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - # { - # "fieldname": "milestone_category", - # "label": "Support Category", - # "fieldtype": "Data", - # "width": 200, - - # }, - { - "fieldname": "total_demands", - "label": "Total Unique Demands", - "fieldtype": "Data", - "width": 130, - } - ] + columns = [ + # { + # "fieldname": "milestone_category", + # "label": "Support Category", + # "fieldtype": "Data", + # "width": 200, + # }, + { + "fieldname": "total_demands", + "label": "Total Unique Demands", + "fieldtype": "Data", + "width": 130, + } + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT milestone_category, COUNT(DISTINCT ben_table.name) AS total_demands @@ -39,6 +39,5 @@ def execute(filters=None): 1=1 {condition_str} AND milestone_category IN ("Documentation","Government schemes") AND _sc.status = 'Completed'; """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.js b/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.js index e84ead4..2faf396 100644 --- a/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.js +++ b/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.js @@ -2,40 +2,40 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { - filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - { - "fieldname": "district", - "fieldtype": "Link", - "label": "District", - "options": "District", - "get_query": function() { - var state = frappe.query_report.get_filter_value('state'); - return { - filters: { - 'state': state - } - }; + filters.push( + { + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }, + { + fieldname: "district", + fieldtype: "Link", + label: "District", + options: "District", + get_query: function () { + var state = frappe.query_report.get_filter_value("state"); + return { + filters: { + state: state, + }, + }; + }, } - } - ) + ); } frappe.query_reports["Occupational category-wise beneficiaries"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.py b/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.py index be7cb85..6c4c843 100644 --- a/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.py +++ b/myojana/myojana/report/occupational_category_wise_beneficiaries/occupational_category_wise_beneficiaries.py @@ -1,32 +1,29 @@ # Copyright (c) 2023, suvaidyam and contributors # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "occupation", - "label": "Occupation category", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "number_of_beneficiaries", - "label": "Number Of beneficiaries", - "fieldtype": "Int", - "width": 300 - } - ] + columns = [ + {"fieldname": "occupation", "label": "Occupation category", "fieldtype": "Data", "width": 200}, + { + "fieldname": "number_of_beneficiaries", + "label": "Number Of beneficiaries", + "fieldtype": "Int", + "width": 300, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True) + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True) - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT COALESCE(occupational_category, 'Unknown') AS occupation, COUNT(name) AS number_of_beneficiaries @@ -38,6 +35,5 @@ def execute(filters=None): ORDER BY number_of_beneficiaries DESC """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.js b/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.js index ebee014..13a7e0e 100644 --- a/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.js +++ b/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.js @@ -2,32 +2,30 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", }, { - "fieldname": "milestone", - "fieldtype": "Link", - "label": "Support category", - "options":"Milestone category" + fieldname: "milestone", + fieldtype: "Link", + label: "Support category", + options: "Milestone category", }, - ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "options": "Centre", - "label": "Centre" - - }) + fieldname: "centre", + fieldtype: "Link", + options: "Centre", + label: "Centre", + }); } frappe.query_reports["Overall tracking of scheme"] = { - "filters": filters + filters: filters, }; diff --git a/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.py b/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.py index f4cc9d7..b3bd1e2 100644 --- a/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.py +++ b/myojana/myojana/report/overall_tracking_of_scheme/overall_tracking_of_scheme.py @@ -2,65 +2,64 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - if filters.milestone: - child_filter = f"""_sc.milestone = '{filters['milestone']}'""" - del filters['milestone'] - else: - child_filter = "1=1" - print(filters.milestone) - # return print(filters) - columns = [ - { - "fieldname": "milestone", - "label": "Support category", - "fieldtype": "Data", - "width": 150, - - }, - { - "fieldname": "scheme", - "label": "Support Name", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "No. of enquiries received", - "fieldtype": "Data", - "width": 200, - }, - { - "fieldname": "completed_demands", - "label": "Achieved", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "pending_count", - "label": "Pending", - "fieldtype": "Data", - "width": 160, - }, - ] + if filters.milestone: + child_filter = f"""_sc.milestone = '{filters['milestone']}'""" + del filters["milestone"] + else: + child_filter = "1=1" + print(filters.milestone) + # return print(filters) + columns = [ + { + "fieldname": "milestone", + "label": "Support category", + "fieldtype": "Data", + "width": 150, + }, + { + "fieldname": "scheme", + "label": "Support Name", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "No. of enquiries received", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "completed_demands", + "label": "Achieved", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "pending_count", + "label": "Pending", + "fieldtype": "Data", + "width": 160, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT _sc.modified_by as user, _sc.scheme, @@ -79,6 +78,5 @@ def execute(filters=None): _sc.scheme """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/place_of_origin/place_of_origin.js b/myojana/myojana/report/place_of_origin/place_of_origin.js index 535a209..b3cc2c6 100644 --- a/myojana/myojana/report/place_of_origin/place_of_origin.js +++ b/myojana/myojana/report/place_of_origin/place_of_origin.js @@ -3,32 +3,30 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", }, { - "fieldname": "state_of_origin", - "fieldtype": "Link", - "label": "State", - "options":"State" + fieldname: "state_of_origin", + fieldtype: "Link", + label: "State", + options: "State", }, - - ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" - }) + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", + }); } frappe.query_reports["Place of origin"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/place_of_origin/place_of_origin.py b/myojana/myojana/report/place_of_origin/place_of_origin.py index 09725a2..1629852 100644 --- a/myojana/myojana/report/place_of_origin/place_of_origin.py +++ b/myojana/myojana/report/place_of_origin/place_of_origin.py @@ -2,43 +2,24 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "state", - "label": "State", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "district", - "label": "District", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "block", - "label": "Block", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "int", - "width": 200 - } - ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'b') - if condition_str: - condition_str = f"{condition_str}" - else: - condition_str = "1=1" + columns = [ + {"fieldname": "state", "label": "State", "fieldtype": "Data", "width": 200}, + {"fieldname": "district", "label": "District", "fieldtype": "Data", "width": 200}, + {"fieldname": "block", "label": "Block", "fieldtype": "Data", "width": 200}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, + ] + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "b") + if condition_str: + condition_str = f"{condition_str}" + else: + condition_str = "1=1" - sql_query = f""" + sql_query = f""" SELECT COALESCE(NULLIF(s.state_name, ''), 'Unknown') AS state, COALESCE(NULLIF(d.district_name, ''), 'Unknown') AS district, @@ -55,5 +36,5 @@ def execute(filters=None): ORDER BY COALESCE(NULLIF(b.state_of_origin, ''), 'Unknown'), COALESCE(NULLIF(b.district_of_origin, ''), 'Unknown'); """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.js b/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.js index 18156aa..3a9cb4a 100644 --- a/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.js +++ b/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.js @@ -2,40 +2,40 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Administrator")) { - filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - { - "fieldname": "district", - "fieldtype": "Link", - "label": "District", - "options": "District", - "get_query": function() { - var state = frappe.query_report.get_filter_value('state'); - return { - filters: { - 'state': state - } - }; + filters.push( + { + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }, + { + fieldname: "district", + fieldtype: "Link", + label: "District", + options: "District", + get_query: function () { + var state = frappe.query_report.get_filter_value("state"); + return { + filters: { + state: state, + }, + }; + }, } - } - ) + ); } frappe.query_reports["Religion-wise beneficiaries"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.py b/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.py index f9f87be..b000991 100644 --- a/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.py +++ b/myojana/myojana/report/religion_wise_beneficiaries/religion_wise_beneficiaries.py @@ -2,32 +2,29 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "religion", - "label": "Religion", - "fieldtype": "Data", - "width": 200 - }, - { - "fieldname": "number_of_beneficiaries", - "label": "Number Of beneficiaries", - "fieldtype": "Int", - "width": 300 - } - ] - - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True) - - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" - - sql_query = f""" + columns = [ + {"fieldname": "religion", "label": "Religion", "fieldtype": "Data", "width": 200}, + { + "fieldname": "number_of_beneficiaries", + "label": "Number Of beneficiaries", + "fieldtype": "Int", + "width": 300, + }, + ] + + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True) + + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" + + sql_query = f""" SELECT CASE WHEN COALESCE(religion, '') = '' THEN 'Unknown' @@ -42,7 +39,5 @@ def execute(filters=None): ORDER BY number_of_beneficiaries DESC """ - - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/saving_status/saving_status.js b/myojana/myojana/report/saving_status/saving_status.js index c3e2c98..aef0796 100644 --- a/myojana/myojana/report/saving_status/saving_status.js +++ b/myojana/myojana/report/saving_status/saving_status.js @@ -2,17 +2,16 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; frappe.query_reports["Saving status"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/saving_status/saving_status.py b/myojana/myojana/report/saving_status/saving_status.py index eeb0868..cc41f29 100644 --- a/myojana/myojana/report/saving_status/saving_status.py +++ b/myojana/myojana/report/saving_status/saving_status.py @@ -2,30 +2,22 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"bank_account", - "label":"Saving status", - "fieldtype":"Data", - "width":300 - }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "bank_account", "label": "Saving status", "fieldtype": "Data", "width": 300}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True) + condition_str = ReportFilter.set_report_filters(filters, "creation", True) if condition_str: condition_str = f"AND {condition_str}" else: condition_str = "" - + sql_query = f""" SELECT CASE @@ -42,4 +34,4 @@ def execute(filters=None): """ data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + return columns, data diff --git a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.js b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.js index 84558b6..0fe706a 100644 --- a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.js +++ b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.js @@ -3,22 +3,21 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", }, { - "fieldname": "modified_by", - "fieldtype": "Link", - "options": "User", - "label": "User" - } - + fieldname: "modified_by", + fieldtype: "Link", + options: "User", + label: "User", + }, ]; // if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { // filters.push({ @@ -44,7 +43,6 @@ var filters = [ // ) // } - frappe.query_reports["Scheme-wise demands"] = { filters: filters, }; diff --git a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.json b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.json index 52c4a57..fc1a534 100644 --- a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.json +++ b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.json @@ -1,5 +1,6 @@ { "add_total_row": 1, + "add_translate_data": 0, "columns": [], "creation": "2024-05-07 16:46:18.197249", "disabled": 0, @@ -8,8 +9,8 @@ "filters": [], "idx": 1, "is_standard": "Yes", - "letterhead": null, - "modified": "2024-10-14 07:17:05.579676", + "letter_head": null, + "modified": "2026-06-10 10:19:35.540654", "modified_by": "Administrator", "module": "myojana", "name": "Scheme-wise demands", @@ -34,5 +35,6 @@ { "role": "System Manager" } - ] + ], + "timeout": 0 } \ No newline at end of file diff --git a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.py b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.py index c983fe9..546a903 100644 --- a/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.py +++ b/myojana/myojana/report/scheme_wise_demands/scheme_wise_demands.py @@ -2,77 +2,75 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "user", - "label": "User Name", - "fieldtype": "Data", - "width": 150, - - }, - { - "fieldname": "milestone", - "label": "Milestone category", - "fieldtype": "Data", - "width": 150, + columns = [ + { + "fieldname": "user", + "label": "User Name", + "fieldtype": "Data", + "width": 150, + }, + { + "fieldname": "milestone", + "label": "Milestone category", + "fieldtype": "Data", + "width": 150, + }, + { + "fieldname": "scheme", + "label": "Scheme ", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - }, - { - "fieldname": "scheme", - "label": "Scheme ", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - }, - ] + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" - - sql_query = f""" + sql_query = f""" SELECT _sc.modified_by as user, _sc.scheme, @@ -92,6 +90,5 @@ def execute(filters=None): scheme , user; """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/source_of_information/source_of_information.js b/myojana/myojana/report/source_of_information/source_of_information.js index ac2535b..81d3586 100644 --- a/myojana/myojana/report/source_of_information/source_of_information.js +++ b/myojana/myojana/report/source_of_information/source_of_information.js @@ -2,27 +2,23 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - - - ) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Source of information"] = { filters: filters, diff --git a/myojana/myojana/report/source_of_information/source_of_information.py b/myojana/myojana/report/source_of_information/source_of_information.py index ca07e45..b837269 100644 --- a/myojana/myojana/report/source_of_information/source_of_information.py +++ b/myojana/myojana/report/source_of_information/source_of_information.py @@ -2,31 +2,31 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "source_of_information", - "label": "Source of Information", - "fieldtype": "Data", - "width": 400 - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "int", - "width": 200 - } - ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True,) - if condition_str: - condition_str = f"WHERE {condition_str}" - else: - condition_str = "" - - sql_query = f""" + columns = [ + { + "fieldname": "source_of_information", + "label": "Source of Information", + "fieldtype": "Data", + "width": 400, + }, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, + ] + condition_str = ReportFilter.set_report_filters( + filters, + "date_of_visit", + True, + ) + if condition_str: + condition_str = f"WHERE {condition_str}" + else: + condition_str = "" + + sql_query = f""" SELECT COALESCE(NULLIF(source_of_information, ''), 'Unknown') as source_of_information, COUNT(name) AS count @@ -36,6 +36,6 @@ def execute(filters=None): GROUP BY COALESCE(NULLIF(source_of_information, ''), 'Unknown'); """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/state_of_origin/state_of_origin.js b/myojana/myojana/report/state_of_origin/state_of_origin.js index d612906..f357ebf 100644 --- a/myojana/myojana/report/state_of_origin/state_of_origin.js +++ b/myojana/myojana/report/state_of_origin/state_of_origin.js @@ -3,25 +3,24 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" - }) + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", + }); } frappe.query_reports["State of origin"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/state_of_origin/state_of_origin.py b/myojana/myojana/report/state_of_origin/state_of_origin.py index 5049cba..7df7c36 100644 --- a/myojana/myojana/report/state_of_origin/state_of_origin.py +++ b/myojana/myojana/report/state_of_origin/state_of_origin.py @@ -2,25 +2,17 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"state", - "label":"State", - "fieldtype":"Data", - "width":400 - }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "state", "label": "State", "fieldtype": "Data", "width": 400}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 't1') + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "t1") if condition_str: condition_str = f"AND {condition_str}" else: @@ -40,7 +32,6 @@ def execute(filters=None): COALESCE(t2.state_name, 'Unknown'); """ - data = frappe.db.sql(sql_query, as_dict=True) return columns, data diff --git a/myojana/myojana/report/state_wise_demands/state_wise_demands.js b/myojana/myojana/report/state_wise_demands/state_wise_demands.js index fb05f0c..8d0880f 100644 --- a/myojana/myojana/report/state_wise_demands/state_wise_demands.js +++ b/myojana/myojana/report/state_wise_demands/state_wise_demands.js @@ -2,27 +2,23 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - - - ) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["State-wise demands"] = { filters: filters, diff --git a/myojana/myojana/report/state_wise_demands/state_wise_demands.json b/myojana/myojana/report/state_wise_demands/state_wise_demands.json index 0a75416..c4c2422 100644 --- a/myojana/myojana/report/state_wise_demands/state_wise_demands.json +++ b/myojana/myojana/report/state_wise_demands/state_wise_demands.json @@ -1,39 +1,41 @@ { - "add_total_row": 0, - "columns": [], - "creation": "2024-01-16 10:31:02.572079", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "filters": [], - "idx": 0, - "is_standard": "Yes", - "json": "{}", - "letterhead": null, - "modified": "2024-01-16 10:31:09.622544", - "modified_by": "Administrator", - "module": "myojana", - "name": "State-wise demands", - "owner": "Administrator", - "prepared_report": 0, - "ref_doctype": "Beneficiary Profiling", - "report_name": "State-wise demands", - "report_type": "Script Report", - "roles": [ - { - "role": "Admin" - }, - { - "role": "CSC Member" - }, - { - "role": "Sub-Centre" - }, - { - "role": "MIS executive" - }, - { - "role": "System Manager" - } - ] + "add_total_row": 0, + "add_translate_data": 0, + "columns": [], + "creation": "2024-01-16 10:31:02.572079", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "filters": [], + "idx": 1, + "is_standard": "Yes", + "json": "{}", + "letter_head": null, + "modified": "2026-06-10 10:16:56.425572", + "modified_by": "Administrator", + "module": "myojana", + "name": "State-wise demands", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Beneficiary Profiling", + "report_name": "State-wise demands", + "report_type": "Script Report", + "roles": [ + { + "role": "Admin" + }, + { + "role": "CSC Member" + }, + { + "role": "Sub-Centre" + }, + { + "role": "MIS executive" + }, + { + "role": "System Manager" + } + ], + "timeout": 0 } \ No newline at end of file diff --git a/myojana/myojana/report/state_wise_demands/state_wise_demands.py b/myojana/myojana/report/state_wise_demands/state_wise_demands.py index 2e0c2f0..98a6adb 100644 --- a/myojana/myojana/report/state_wise_demands/state_wise_demands.py +++ b/myojana/myojana/report/state_wise_demands/state_wise_demands.py @@ -2,61 +2,60 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "state_name", - "label": " Name Of State ", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - }, - ] - + columns = [ + { + "fieldname": "state_name", + "label": " Name Of State ", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'bp') - condition_str = f"WHERE {condition_str}" if condition_str else "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") + condition_str = f"WHERE {condition_str}" if condition_str else "" - sql_query = f""" + sql_query = f""" SELECT COALESCE(s.state_name, 'Unknown') AS state_name, SUM(CASE WHEN (sc.status = 'Open') THEN 1 ELSE 0 END) as open_demands, @@ -76,6 +75,5 @@ def execute(filters=None): COALESCE(s.state_name, 'Unknown'); """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.js b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.js index 6065d12..074d114 100644 --- a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.js +++ b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.js @@ -2,27 +2,23 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "state", - "fieldtype": "Link", - "label": "State", - "options": "State" - }, - - - ) + fieldname: "state", + fieldtype: "Link", + label: "State", + options: "State", + }); } frappe.query_reports["Sub centre wise demands"] = { filters: filters, diff --git a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.json b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.json index 4c5f815..2204ae8 100644 --- a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.json +++ b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.json @@ -1,38 +1,40 @@ { - "add_total_row": 0, - "columns": [], - "creation": "2024-01-16 10:43:45.607853", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "filters": [], - "idx": 0, - "is_standard": "Yes", - "letterhead": null, - "modified": "2024-01-16 10:43:45.607853", - "modified_by": "Administrator", - "module": "myojana", - "name": "Sub centre wise demands", - "owner": "Administrator", - "prepared_report": 0, - "ref_doctype": "Beneficiary Profiling", - "report_name": "Sub centre wise demands", - "report_type": "Script Report", - "roles": [ - { - "role": "Admin" - }, - { - "role": "CSC Member" - }, - { - "role": "Sub centre member" - }, - { - "role": "MIS executive" - }, - { - "role": "System Manager" - } - ] + "add_total_row": 0, + "add_translate_data": 0, + "columns": [], + "creation": "2024-01-16 10:43:45.607853", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "filters": [], + "idx": 2, + "is_standard": "Yes", + "letter_head": null, + "modified": "2026-06-10 10:18:38.604148", + "modified_by": "Administrator", + "module": "myojana", + "name": "Sub centre wise demands", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Beneficiary Profiling", + "report_name": "Sub centre wise demands", + "report_type": "Script Report", + "roles": [ + { + "role": "Admin" + }, + { + "role": "CSC Member" + }, + { + "role": "Sub centre member" + }, + { + "role": "MIS executive" + }, + { + "role": "System Manager" + } + ], + "timeout": 0 } \ No newline at end of file diff --git a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.py b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.py index 42d6bcc..6f4f49c 100644 --- a/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.py +++ b/myojana/myojana/report/sub_centre_wise_demands/sub_centre_wise_demands.py @@ -2,68 +2,66 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "user", - "label": "User", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "sub_centre_name", - "label": "Sub Centre Name", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "total_demands", - "label": "Total Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "open_demands", - "label": "Open Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "submitted_demands", - "label": "Submitted Demands", - "fieldtype": "Data", - "width": 160, - }, - { - "fieldname": "completed_demands", - "label": "Completed Demands", - "fieldtype": "Data", - "width": 170, - }, - { - "fieldname": "rejected_demands", - "label": "Rejected Demands", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "closed_demands", - "label": "Closed Demands", - "fieldtype": "Data", - "width": 130, - } - ] - + columns = [ + { + "fieldname": "user", + "label": "User", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "sub_centre_name", + "label": "Sub Centre Name", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "total_demands", + "label": "Total Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "open_demands", + "label": "Open Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "submitted_demands", + "label": "Submitted Demands", + "fieldtype": "Data", + "width": 160, + }, + { + "fieldname": "completed_demands", + "label": "Completed Demands", + "fieldtype": "Data", + "width": 170, + }, + { + "fieldname": "rejected_demands", + "label": "Rejected Demands", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "closed_demands", + "label": "Closed Demands", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'bp') - condition_str = f"{condition_str}" if condition_str else "1=1" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") + condition_str = f"{condition_str}" if condition_str else "1=1" - sql_query = f""" + sql_query = f""" SELECT sc.modified_by as user, COALESCE(hd.sub_centre_name, 'Unknown') AS sub_centre_name, @@ -78,13 +76,11 @@ def execute(filters=None): LEFT JOIN `tabScheme Child` sc ON bp.name = sc.parent LEFT JOIN - `tabSub Centre` hd ON bp.sub_centre = hd.name + `tabSub Centre` hd ON bp.sub_centre = hd.name WHERE {condition_str} AND sc.modified_by !="" GROUP BY COALESCE(hd.sub_centre_name, 'Unknown') , user; """ - - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).js b/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).js index b1fa022..42dcb19 100644 --- a/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).js +++ b/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).js @@ -2,25 +2,24 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" - }) + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", + }); } frappe.query_reports["Support-wise status (unique beneficiaries)"] = { - "filters": filters + filters: filters, }; diff --git a/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).py b/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).py index 2bd35c7..a9c94fd 100644 --- a/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).py +++ b/myojana/myojana/report/support_wise_status_(unique_beneficiaries)/support_wise_status_(unique_beneficiaries).py @@ -2,39 +2,39 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "milestone_category", - "label": "Scheme Type", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "applied", - "label": "Applied", - "fieldtype": "Data", - "width": 130, - }, - { - "fieldname": "completed", - "label": "Completed", - "fieldtype": "Data", - "width": 130, - } - ] + columns = [ + { + "fieldname": "milestone_category", + "label": "Scheme Type", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "applied", + "label": "Applied", + "fieldtype": "Data", + "width": 130, + }, + { + "fieldname": "completed", + "label": "Completed", + "fieldtype": "Data", + "width": 130, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'bp') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "bp") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT sc.milestone_category as milestone_category, COUNT(DISTINCT sc.parent) AS applied, @@ -51,6 +51,5 @@ def execute(filters=None): sc.milestone_category """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.js b/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.js index 174f555..bb58ce7 100644 --- a/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.js +++ b/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.js @@ -2,7 +2,5 @@ // For license information, please see license.txt frappe.query_reports["Top schemes that most beneficiaries of that user are eligible"] = { - "filters": [ - - ] + filters: [], }; diff --git a/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.py b/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.py index abc9d8f..9699b86 100644 --- a/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.py +++ b/myojana/myojana/report/top_schemes_that_most_beneficiaries_of_that_user_are_eligible/top_schemes_that_most_beneficiaries_of_that_user_are_eligible.py @@ -2,47 +2,42 @@ # For license information, please see license.txt import frappe + from myojana.utils.misc import Misc + + def execute(filters=None): # frappe.errprint(filters) columns = [ - { - "fieldname":"scheme", - "label":"Scheme", - "fieldtype":"Data", - "width":400 - }, - { - "fieldname":"count", - "label":"Count", - "fieldtype":"int", - "width":200 - } + {"fieldname": "scheme", "label": "Scheme", "fieldtype": "Data", "width": 400}, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, ] # filter_condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 't1') - get_all_scheame = frappe.db.sql(f"select name from `tabScheme`", as_dict=True) - scheme_ben_count_list =[] + get_all_scheame = frappe.db.sql("select name from `tabScheme`", as_dict=True) + scheme_ben_count_list = [] for scheme in get_all_scheame: - conditions = [] - rule_cond_str = Misc.scheme_rules_to_condition(scheme.name) - if rule_cond_str: - conditions.append(rule_cond_str) - # if filter_condition_str: - # conditions.append(filter_condition_str) - get_elegible_ben = f""" + conditions = [] + rule_cond_str = Misc.scheme_rules_to_condition(scheme.name) + if rule_cond_str: + conditions.append(rule_cond_str) + # if filter_condition_str: + # conditions.append(filter_condition_str) + get_elegible_ben = f""" SELECT count(name) as count FROM `tabBeneficiary Profiling` {('WHERE '+' AND '.join(conditions)) if len(conditions) else ""} """ - - ben_result = frappe.db.sql(get_elegible_ben, as_dict=True) - scheme_ben_count_list.append({"scheme": scheme.name , "count": (ben_result[0].count if len(ben_result) else 0)}) + + ben_result = frappe.db.sql(get_elegible_ben, as_dict=True) + scheme_ben_count_list.append( + {"scheme": scheme.name, "count": (ben_result[0].count if len(ben_result) else 0)} + ) sorted_schemes = sorted(scheme_ben_count_list, key=lambda x: x["count"], reverse=True) - # Get the top 5 schemes + # Get the top 5 schemes top_5_schemes = sorted_schemes[:5] - # data = frappe.db.sql(sql_query, as_dict=True) + # data = frappe.db.sql(sql_query, as_dict=True) return columns, top_5_schemes diff --git a/myojana/myojana/report/total_approved_demands/total_approved_demands.js b/myojana/myojana/report/total_approved_demands/total_approved_demands.js index d2a326a..6a5f342 100644 --- a/myojana/myojana/report/total_approved_demands/total_approved_demands.js +++ b/myojana/myojana/report/total_approved_demands/total_approved_demands.js @@ -3,16 +3,15 @@ var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; // if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { // filters.push({ @@ -24,5 +23,5 @@ var filters = [ // } frappe.query_reports["Total Approved Demands"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/total_approved_demands/total_approved_demands.py b/myojana/myojana/report/total_approved_demands/total_approved_demands.py index 0e520a9..b4cc6e6 100644 --- a/myojana/myojana/report/total_approved_demands/total_approved_demands.py +++ b/myojana/myojana/report/total_approved_demands/total_approved_demands.py @@ -1,29 +1,26 @@ import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "application_submitted", - "label": "Application Submitted", - "fieldtype": "Data", - "width": 400, - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "Int", - "width": 200 - } - ] + columns = [ + { + "fieldname": "application_submitted", + "label": "Application Submitted", + "fieldtype": "Data", + "width": 400, + }, + {"fieldname": "count", "label": "Count", "fieldtype": "Int", "width": 200}, + ] - condition_str = ReportFilter.set_report_filters(filters, 'creation', True) - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "creation", True) + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT application_submitted, COUNT(name) as count @@ -37,5 +34,5 @@ def execute(filters=None): application_submitted """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.js b/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.js index 9378e16..3dcb811 100644 --- a/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.js +++ b/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.js @@ -2,7 +2,5 @@ // For license information, please see license.txt frappe.query_reports["Total beneficiary from the camps"] = { - "filters": [ - - ] + filters: [], }; diff --git a/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.py b/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.py index bd84138..fb39c8c 100644 --- a/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.py +++ b/myojana/myojana/report/total_beneficiary_from_the_camps/total_beneficiary_from_the_camps.py @@ -2,39 +2,37 @@ # For license information, please see license.txt import frappe + from myojana.utils.report_filter import ReportFilter def execute(filters=None): - columns = [ - { - "fieldname": "milestone", - "label": "Support Category", - "fieldtype": "Data", - "width": 200, - - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "Int", - "width": 130, - } - ] - - - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True , 'c') - condition_str = condition_str.replace("c.centre", "c.custom_centre") - condition_str = f"WHERE {condition_str}" if condition_str else "" - - sql_query = f""" - SELECT cc.support_category as milestone , SUM(cc.number_of_participants) as count + columns = [ + { + "fieldname": "milestone", + "label": "Support Category", + "fieldtype": "Data", + "width": 200, + }, + { + "fieldname": "count", + "label": "Count", + "fieldtype": "Int", + "width": 130, + }, + ] + + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "c") + condition_str = condition_str.replace("c.centre", "c.custom_centre") + condition_str = f"WHERE {condition_str}" if condition_str else "" + + sql_query = f""" + SELECT cc.support_category as milestone , SUM(cc.number_of_participants) as count FROM `tabCamp` AS c INNER JOIN `tabCamp Form Child` AS cc ON cc.parent = c.name - {condition_str} + {condition_str} Group by cc.support_category; """ - - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/total_demands/total_demands.js b/myojana/myojana/report/total_demands/total_demands.js index cc53e97..46a86af 100644 --- a/myojana/myojana/report/total_demands/total_demands.js +++ b/myojana/myojana/report/total_demands/total_demands.js @@ -2,27 +2,26 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; frappe.query_reports["Total Demands"] = { filters: filters, - "formatter": function(value, row, column, data, default_formatter) { - // Make the 'name' field clickable to open the relevant document - if (column.fieldname === "current_status" && data) { - value = `${value}`; - } - - value = default_formatter(value, row, column, data); - return value; - } + formatter: function (value, row, column, data, default_formatter) { + // Make the 'name' field clickable to open the relevant document + if (column.fieldname === "current_status" && data) { + value = `${value}`; + } + + value = default_formatter(value, row, column, data); + return value; + }, }; diff --git a/myojana/myojana/report/total_demands/total_demands.py b/myojana/myojana/report/total_demands/total_demands.py index 503d1ef..b3cf984 100644 --- a/myojana/myojana/report/total_demands/total_demands.py +++ b/myojana/myojana/report/total_demands/total_demands.py @@ -1,29 +1,31 @@ import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "current_status", - "label": "Current status", - "fieldtype": "Data", - "width": 400, - }, - { - "fieldname": "status", - "label": "Count", - "fieldtype": "Int", - "width": 400, - }, - ] + columns = [ + { + "fieldname": "current_status", + "label": "Current status", + "fieldtype": "Data", + "width": 400, + }, + { + "fieldname": "status", + "label": "Count", + "fieldtype": "Int", + "width": 400, + }, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT _sc.status as current_status, COUNT(_sc.status) as status @@ -36,5 +38,5 @@ def execute(filters=None): _sc.status; """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.js b/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.js index 5215d78..e82acd4 100644 --- a/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.js +++ b/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.js @@ -2,27 +2,26 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, ]; frappe.query_reports["Total sanctioned demands"] = { filters: filters, - "formatter": function(value, row, column, data, default_formatter) { - // Make the 'name' field clickable to open the relevant document + formatter: function (value, row, column, data, default_formatter) { + // Make the 'name' field clickable to open the relevant document console.log(column.fieldname); - if (column.fieldname === "status" && data) { - value = `${value}`; - } - - value = default_formatter(value, row, column, data); - return value; - } + if (column.fieldname === "status" && data) { + value = `${value}`; + } + + value = default_formatter(value, row, column, data); + return value; + }, }; diff --git a/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.py b/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.py index bb57c7d..eb2dad0 100644 --- a/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.py +++ b/myojana/myojana/report/total_sanctioned_demands/total_sanctioned_demands.py @@ -1,29 +1,26 @@ import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "status", - "label": "Current status", - "fieldtype": "Data", - "width": 400, - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "Int", - "width": 200 - } - ] + columns = [ + { + "fieldname": "status", + "label": "Current status", + "fieldtype": "Data", + "width": 400, + }, + {"fieldname": "count", "label": "Count", "fieldtype": "Int", "width": 200}, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT _sc.status, COUNT(_sc.name) AS count @@ -37,5 +34,5 @@ def execute(filters=None): _sc.status; """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data \ No newline at end of file + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/total_under_process_demands/total_under_process_demands.js b/myojana/myojana/report/total_under_process_demands/total_under_process_demands.js index f2e7921..492a953 100644 --- a/myojana/myojana/report/total_under_process_demands/total_under_process_demands.js +++ b/myojana/myojana/report/total_under_process_demands/total_under_process_demands.js @@ -2,28 +2,27 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" - } - -] + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", + }, +]; frappe.query_reports["Total under process demands"] = { filters: filters, - "formatter": function(value, row, column, data, default_formatter) { - // Make the 'name' field clickable to open the relevant document + formatter: function (value, row, column, data, default_formatter) { + // Make the 'name' field clickable to open the relevant document console.log(column.fieldname); - if (column.fieldname === "status" && data) { - value = `${value}`; - } - - value = default_formatter(value, row, column, data); - return value; - } + if (column.fieldname === "status" && data) { + value = `${value}`; + } + + value = default_formatter(value, row, column, data); + return value; + }, }; diff --git a/myojana/myojana/report/total_under_process_demands/total_under_process_demands.py b/myojana/myojana/report/total_under_process_demands/total_under_process_demands.py index d4f79ac..6de3279 100644 --- a/myojana/myojana/report/total_under_process_demands/total_under_process_demands.py +++ b/myojana/myojana/report/total_under_process_demands/total_under_process_demands.py @@ -1,29 +1,26 @@ import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "status", - "label": "Current status", - "fieldtype": "Data", - "width": 400, - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "Int", - "width": 200 - } - ] + columns = [ + { + "fieldname": "status", + "label": "Current status", + "fieldtype": "Data", + "width": 400, + }, + {"fieldname": "count", "label": "Count", "fieldtype": "Int", "width": 200}, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben_table') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben_table") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT _sc.status AS status, COUNT(_sc.name) AS count @@ -37,5 +34,5 @@ def execute(filters=None): _sc.application_submitted,_sc.status """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.js b/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.js index 059fd83..8d56081 100644 --- a/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.js +++ b/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.js @@ -2,30 +2,30 @@ // For license information, please see license.txt var filters = [ { - "fieldname": "from_date", - "fieldtype": "Date", - "label": "From Date", + fieldname: "from_date", + fieldtype: "Date", + label: "From Date", }, { - "fieldname": "to_date", - "fieldtype": "Date", - "label": "To Date" + fieldname: "to_date", + fieldtype: "Date", + label: "To Date", }, { - "fieldname":"caste_category", - "label":"Caste category", - "fieldtype":"Link", - "options":"Caste category" - } + fieldname: "caste_category", + label: "Caste category", + fieldtype: "Link", + options: "Caste category", + }, ]; if (!frappe.user_roles.includes("MIS executive") || frappe.user_roles.includes("Administrator")) { filters.push({ - "fieldname": "centre", - "fieldtype": "Link", - "label": "Centre", - "options": "Centre" - }) + fieldname: "centre", + fieldtype: "Link", + label: "Centre", + options: "Centre", + }); } frappe.query_reports["Tracking of Occupation of beneficiaries, segregated by Caste"] = { - filters: filters + filters: filters, }; diff --git a/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.py b/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.py index 1cb0ce0..d739ff0 100644 --- a/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.py +++ b/myojana/myojana/report/tracking_of_occupation_of_beneficiaries,_segregated_by_caste/tracking_of_occupation_of_beneficiaries,_segregated_by_caste.py @@ -1,37 +1,34 @@ import frappe + from myojana.utils.report_filter import ReportFilter + def execute(filters=None): - columns = [ - { - "fieldname": "caste_category", - "label": "Caste", - "fieldtype": "Link", - "options": "Caste category", - "width": 200 - }, - { - "fieldname": "occupation", - "label": "Occupation", - "fieldtype": "Link", - "options": "Occupation", - "width": 300 - }, - { - "fieldname": "count", - "label": "Count", - "fieldtype": "int", - "width": 200 - } - ] + columns = [ + { + "fieldname": "caste_category", + "label": "Caste", + "fieldtype": "Link", + "options": "Caste category", + "width": 200, + }, + { + "fieldname": "occupation", + "label": "Occupation", + "fieldtype": "Link", + "options": "Occupation", + "width": 300, + }, + {"fieldname": "count", "label": "Count", "fieldtype": "int", "width": 200}, + ] - condition_str = ReportFilter.set_report_filters(filters, 'date_of_visit', True, 'ben') - if condition_str: - condition_str = f"AND {condition_str}" - else: - condition_str = "" + condition_str = ReportFilter.set_report_filters(filters, "date_of_visit", True, "ben") + if condition_str: + condition_str = f"AND {condition_str}" + else: + condition_str = "" - sql_query = f""" + sql_query = f""" SELECT ben.caste_category as caste_category, ben.current_occupation as occupation, @@ -45,5 +42,5 @@ def execute(filters=None): ORDER BY caste_category ASC, occupation ASC """ - data = frappe.db.sql(sql_query, as_dict=True) - return columns, data + data = frappe.db.sql(sql_query, as_dict=True) + return columns, data diff --git a/myojana/public/js/beneficiary_profiling/beneficiary_profiling.js b/myojana/public/js/beneficiary_profiling/beneficiary_profiling.js index c777cf8..5c998cc 100644 --- a/myojana/public/js/beneficiary_profiling/beneficiary_profiling.js +++ b/myojana/public/js/beneficiary_profiling/beneficiary_profiling.js @@ -1,86 +1,86 @@ // order list in select fields const get_ordered_list = async (doctype, optionsToSort) => { - let list = await callAPI({ - method: 'frappe.desk.search.search_link', - freeze: false, - args: { - doctype: doctype, - page_length: 1000, - txt: '' - }, - // freeze_message: __("Getting list ..."), - }) - if (optionsToSort) { - let reOrderedList = []; - optionsToSort?.forEach(async (option) => { - const requiredOption = await list?.find(item => item.value === option); - reOrderedList.push(requiredOption); - }); - const exceptionList = await list?.filter(item => !optionsToSort.some(item2 => item.value === item2)); - exceptionList?.forEach(async (option) => { - reOrderedList = [...reOrderedList, option]; - }) - list = reOrderedList; - return list; - // const otherOption = list.find(item => item.value === 'Others'); - // if (otherOption) { - // list = list.filter(item => item.value !== 'Others'); - // list.push(otherOption); - // } - } - return list - -} + let list = await callAPI({ + method: "frappe.desk.search.search_link", + freeze: false, + args: { + doctype: doctype, + page_length: 1000, + txt: "", + }, + // freeze_message: __("Getting list ..."), + }); + if (optionsToSort) { + let reOrderedList = []; + optionsToSort?.forEach(async (option) => { + const requiredOption = await list?.find((item) => item.value === option); + reOrderedList.push(requiredOption); + }); + const exceptionList = await list?.filter( + (item) => !optionsToSort.some((item2) => item.value === item2) + ); + exceptionList?.forEach(async (option) => { + reOrderedList = [...reOrderedList, option]; + }); + list = reOrderedList; + return list; + // const otherOption = list.find(item => item.value === 'Others'); + // if (otherOption) { + // list = list.filter(item => item.value !== 'Others'); + // list.push(otherOption); + // } + } + return list; +}; const get_occupation_category = async (frm) => { - let list = await callAPI({ - method: 'frappe.client.get', - freeze: false, - args: { - doctype: 'Occupation', - name: frm.doc.current_occupation - }, - // freeze_message: __("Getting schemes..."), - }) - return list; -} + let list = await callAPI({ + method: "frappe.client.get", + freeze: false, + args: { + doctype: "Occupation", + name: frm.doc.current_occupation, + }, + // freeze_message: __("Getting schemes..."), + }); + return list; +}; const get_document = async (filter, fields) => { - return await frappe.call({ - method: 'frappe.client.get_value', - args: { - 'doctype': 'Beneficiary Profiling', - 'filters': filter, - 'fieldname': fields - }, - callback: function (response) { - // Handle the response - if (!response.exc) { - var doc = response.message; - return doc; - } else { - console.error('Error fetching document:', response.exc); - } - } - }); - -} + return await frappe.call({ + method: "frappe.client.get_value", + args: { + doctype: "Beneficiary Profiling", + filters: filter, + fieldname: fields, + }, + callback: function (response) { + // Handle the response + if (!response.exc) { + var doc = response.message; + return doc; + } else { + console.error("Error fetching document:", response.exc); + } + }, + }); +}; // generate date of birth function generateDOBFromAge(ageInYears = 0, ageInMonths = 0, date_of_birth) { - let date = 1; - if (date_of_birth) { - const split_value = date_of_birth.split('-'); - date = parseInt(split_value[2], 10); - } - let currentDate = new Date(); - let startOfMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), date); - let birthYear = startOfMonth.getFullYear() - ageInYears; - let birthMonth = startOfMonth.getMonth() - ageInMonths; - if (birthMonth < 0) { - birthYear--; - birthMonth += 11; - } - let generatedDOB = new Date(birthYear, birthMonth, date); - return generatedDOB; + let date = 1; + if (date_of_birth) { + const split_value = date_of_birth.split("-"); + date = parseInt(split_value[2], 10); + } + let currentDate = new Date(); + let startOfMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), date); + let birthYear = startOfMonth.getFullYear() - ageInYears; + let birthMonth = startOfMonth.getMonth() - ageInMonths; + if (birthMonth < 0) { + birthYear--; + birthMonth += 11; + } + let generatedDOB = new Date(birthYear, birthMonth, date); + return generatedDOB; } // function generateDOBFromAge(ageInYears = 0, ageInMonths = 0 , date_of_birth) { // if(date_of_birth){ @@ -103,117 +103,137 @@ function generateDOBFromAge(ageInYears = 0, ageInMonths = 0, date_of_birth) { // return generatedDOB; // } // get scheme lists -const get_scheme_list = async(frm) => { - let list = await callAPI({ - method: 'myojana.api.execute', - freeze: false, - args: { - name: frm.doc.name - }, - freeze_message: __("Getting schemes..."), - }) - scheme_list = list.sort((a, b) => b.matching_rules_per - a.matching_rules_per); - return scheme_list -} +const get_scheme_list = async (frm) => { + let list = await callAPI({ + method: "myojana.api.execute", + freeze: false, + args: { + name: frm.doc.name, + }, + freeze_message: __("Getting schemes..."), + }); + scheme_list = list.sort((a, b) => b.matching_rules_per - a.matching_rules_per); + return scheme_list; +}; async function render_scheme_datatable(frm) { + scheme_list = await get_scheme_list(frm); + let tableConf = { + columns: [ + { + name: " ", + id: "serial_no", + editable: false, + resizable: true, + sortable: false, + focusable: false, + dropdown: false, + width: 70, + format: (value, columns, ops, row) => { + return columns?.[0]?.rowIndex + 1; + }, + }, + { + name: "Name", + id: "name", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 400, + }, + { + name: "Milestone", + id: "milestone", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 200, + }, + { + name: "Matches", + id: "matches", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 90, + format: (value, columns, ops, row) => { + let rules = row?.rules + ?.map((e) => `${e.message} ${e.matched ? "✔" : "❌"}`) + .join("\n") + .toString(); + return `

    ${row?.matches?.bold()}

    `; + }, + }, + { + name: "Group", + id: "group", + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 70, + format: (value, columns, ops, row) => { + let messages = row.groups.map((g) => + g.rules + ?.map((e) => `${e.message} ${e.matched ? "✔" : "❌"}`) + .join("\n") + .toString() + ); + return `

    ${row?.groups + ?.filter((f) => f.percentage == 100) + ?.length?.toString() + ?.bold()}/${row?.groups?.length?.toString()?.bold()}

    `; + }, + }, + //milestone + // { + // name: "Availed", + // id: 'availed', + // editable: false, + // resizable: false, + // sortable: false, + // focusable: false, + // dropdown: false, + // width: 100, + // format: (value, columns, ops, row) => { + // return `

    ${value ? '' : '✔'}

    ` + // } + // } + ], + rows: [], + }; + let scheme_row_list = scheme_list + .map((scheme, i) => { + return ( + scheme.available && { + scheme_name: scheme?.name_of_the_scheme, + name: `${scheme.name_of_the_scheme}`, + matches: `${scheme.matching_rules}/${scheme?.total_rules}`, + rules: scheme.rules, + groups: scheme.groups, + availed: scheme.available, + milestone: scheme.milestone, + } + ); + }) + .filter((f) => f); - scheme_list = await get_scheme_list(frm) - let tableConf = { - columns: [ - { - name: " ", - id: 'serial_no', - editable: false, - resizable: true, - sortable: false, - focusable: false, - dropdown: false, - width: 70, - format: (value, columns, ops, row) => { - return (columns?.[0]?.rowIndex + 1) - } - }, - { - name: "Name", - id: 'name', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 400 - }, - { - name: "Milestone", - id: 'milestone', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 200 - }, - { - name: "Matches", - id: 'matches', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 90, - format: (value, columns, ops, row) => { - let rules = row?.rules?.map(e => `${e.message} ${e.matched ? '✔' : '❌'}`).join("\n").toString() - return `

    ${row?.matches?.bold()}

    ` - } - }, - { - name: "Group", - id: 'group', - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 70, - format: (value, columns, ops, row) => { - let messages = row.groups.map(g => (g.rules?.map(e => `${e.message} ${e.matched ? '✔' : '❌'}`).join("\n").toString())) - return `

    ${row?.groups?.filter(f => f.percentage == 100)?.length?.toString()?.bold()}/${row?.groups?.length?.toString()?.bold()}

    ` - } - }, - //milestone - // { - // name: "Availed", - // id: 'availed', - // editable: false, - // resizable: false, - // sortable: false, - // focusable: false, - // dropdown: false, - // width: 100, - // format: (value, columns, ops, row) => { - // return `

    ${value ? '' : '✔'}

    ` - // } - // } - ], - rows: [] - }; - let scheme_row_list = scheme_list.map((scheme, i) => { - return scheme.available && { - scheme_name: scheme?.name_of_the_scheme, - name: `${scheme.name_of_the_scheme}`, - matches: `${scheme.matching_rules}/${scheme?.total_rules}`, - rules: scheme.rules, - groups: scheme.groups, - availed: scheme.available, - milestone: scheme.milestone - } - }).filter(f => f); - - const container = document.getElementById('all_schemes'); - const datatable = new DataTable(container, { columns: tableConf.columns, serialNoColumn: false }); - datatable.style.setStyle(`.dt-scrollable`, { height: '300px!important', overflow: 'scroll!important' }); - addTableFilter(datatable, ['scheme_name', 'milestone'], scheme_row_list) - datatable.refresh(scheme_row_list); -} \ No newline at end of file + const container = document.getElementById("all_schemes"); + const datatable = new DataTable(container, { + columns: tableConf.columns, + serialNoColumn: false, + }); + datatable.style.setStyle(`.dt-scrollable`, { + height: "300px!important", + overflow: "scroll!important", + }); + addTableFilter(datatable, ["scheme_name", "milestone"], scheme_row_list); + datatable.refresh(scheme_row_list); +} diff --git a/myojana/public/js/beneficiary_profiling/dialogs.js b/myojana/public/js/beneficiary_profiling/dialogs.js index 3e81f69..23ea2ab 100644 --- a/myojana/public/js/beneficiary_profiling/dialogs.js +++ b/myojana/public/js/beneficiary_profiling/dialogs.js @@ -1,266 +1,266 @@ - let _frm; let global_frm; // global variable const dialogsConfig = { - document_submitted: { - title: __('Enter details for Support'), - fields: [ - { - label: __('Date of application'), - fieldname: 'date_of_application', - fieldtype: 'Date', - reqd: 1, - _doc: true - }, - { - label: __('Mode of application'), - fieldname: 'mode_of_application', - fieldtype: 'Select', - reqd: 1, - options: [__("Online"), __("Offline")], - _doc: true - }, - { - label: __('Reason of application'), - fieldname: 'reason_of_application', - fieldtype: 'Data', - _doc: true - }, - { - label: __('Application number'), - fieldname: 'application_number', - fieldtype: 'Data', - _doc: true - }, - { - label: __('Amount paid'), - fieldname: 'amount_paid', - fieldtype: 'Int', - _doc: true - }, - { - label: __('Paid by'), - fieldname: 'paid_by', - fieldtype: 'Link', - options: 'Scheme Paid by', - 'only_select':true, - _doc: true - }, - { - label: __('Remarks'), - fieldname: 'remarks', - fieldtype: 'Data', - _doc: true - } - ] - }, + document_submitted: { + title: __("Enter details for Support"), + fields: [ + { + label: __("Date of application"), + fieldname: "date_of_application", + fieldtype: "Date", + reqd: 1, + _doc: true, + }, + { + label: __("Mode of application"), + fieldname: "mode_of_application", + fieldtype: "Select", + reqd: 1, + options: [__("Online"), __("Offline")], + _doc: true, + }, + { + label: __("Reason of application"), + fieldname: "reason_of_application", + fieldtype: "Data", + _doc: true, + }, + { + label: __("Application number"), + fieldname: "application_number", + fieldtype: "Data", + _doc: true, + }, + { + label: __("Amount paid"), + fieldname: "amount_paid", + fieldtype: "Int", + _doc: true, + }, + { + label: __("Paid by"), + fieldname: "paid_by", + fieldtype: "Link", + options: "Scheme Paid by", + only_select: true, + _doc: true, + }, + { + label: __("Remarks"), + fieldname: "remarks", + fieldtype: "Data", + _doc: true, + }, + ], + }, - document_completed_frm_support: { - title: __('Enter details for Support'), - fields: [ - { - label: __('Date of application'), - fieldname: 'date_of_application', - fieldtype: 'Date', - reqd: 1, - _doc: true - }, - { - label: __('Date of completion'), - fieldname: 'date_of_completion', - fieldtype: 'Date', - reqd: 1, - _doc: true - }, - { - label: __('Mode of application'), - fieldname: 'mode_of_application', - fieldtype: 'Select', - reqd: 1, - options: [__("Online"), __("Offline")], - _doc: true - }, - { - label: __('Reason of application'), - fieldname: 'reason_of_application', - fieldtype: 'Data', - _doc: true - }, - { - label: __('Application number'), - fieldname: 'application_number', - fieldtype: 'Data', - _doc: true - }, - { - label: __('Amount paid'), - fieldname: 'amount_paid', - fieldtype: 'Int', - _doc: true - }, - { - label: __('Paid by'), - fieldname: 'paid_by', - fieldtype: 'Link', - options: 'Scheme Paid by', - 'only_select':true, - _doc: true - }, - { - label: __('Completion certificate'), - fieldname: 'completion_certificate', - fieldtype: 'Attach', - _doc: true - }, - { - label: __('Remarks'), - fieldname: 'remarks', - fieldtype: 'Data', - _doc: true - } - ] - }, - document_completed: { - title: __('Enter details for Support'), - fields: [ - { - label: __('Date of completion'), - fieldname: 'date_of_completion', - fieldtype: 'Date', - reqd: 1, - _doc: true - }, - { - label: __('Completion certificate'), - fieldname: 'completion_certificate', - fieldtype: 'Attach', - _doc: true - }, - { - label: __('Remarks'), - fieldname: 'remarks', - fieldtype: 'Data', - _doc: true - } - ] - }, - document_rejected: { - title: __('Enter details for Support'), - fields: [ - { - label: __('Date of rejection'), - fieldname: 'date_of_rejection', - fieldtype: 'Date', - reqd: 1, - _doc: true - }, - { - label: __('Reason of rejection'), - fieldname: 'reason_of_rejection', - fieldtype: 'Data', - reqd: 1, - _doc: true - }, - { - label: __('Remarks'), - fieldname: 'remarks', - fieldtype: 'Data', - _doc: true - } - ] - } -} + document_completed_frm_support: { + title: __("Enter details for Support"), + fields: [ + { + label: __("Date of application"), + fieldname: "date_of_application", + fieldtype: "Date", + reqd: 1, + _doc: true, + }, + { + label: __("Date of completion"), + fieldname: "date_of_completion", + fieldtype: "Date", + reqd: 1, + _doc: true, + }, + { + label: __("Mode of application"), + fieldname: "mode_of_application", + fieldtype: "Select", + reqd: 1, + options: [__("Online"), __("Offline")], + _doc: true, + }, + { + label: __("Reason of application"), + fieldname: "reason_of_application", + fieldtype: "Data", + _doc: true, + }, + { + label: __("Application number"), + fieldname: "application_number", + fieldtype: "Data", + _doc: true, + }, + { + label: __("Amount paid"), + fieldname: "amount_paid", + fieldtype: "Int", + _doc: true, + }, + { + label: __("Paid by"), + fieldname: "paid_by", + fieldtype: "Link", + options: "Scheme Paid by", + only_select: true, + _doc: true, + }, + { + label: __("Completion certificate"), + fieldname: "completion_certificate", + fieldtype: "Attach", + _doc: true, + }, + { + label: __("Remarks"), + fieldname: "remarks", + fieldtype: "Data", + _doc: true, + }, + ], + }, + document_completed: { + title: __("Enter details for Support"), + fields: [ + { + label: __("Date of completion"), + fieldname: "date_of_completion", + fieldtype: "Date", + reqd: 1, + _doc: true, + }, + { + label: __("Completion certificate"), + fieldname: "completion_certificate", + fieldtype: "Attach", + _doc: true, + }, + { + label: __("Remarks"), + fieldname: "remarks", + fieldtype: "Data", + _doc: true, + }, + ], + }, + document_rejected: { + title: __("Enter details for Support"), + fields: [ + { + label: __("Date of rejection"), + fieldname: "date_of_rejection", + fieldtype: "Date", + reqd: 1, + _doc: true, + }, + { + label: __("Reason of rejection"), + fieldname: "reason_of_rejection", + fieldtype: "Data", + reqd: 1, + _doc: true, + }, + { + label: __("Remarks"), + fieldname: "remarks", + fieldtype: "Data", + _doc: true, + }, + ], + }, +}; const doc_submitted_validate = (_doc, _scheme) => { - if (_doc.date_of_application < _frm.doc.date_of_visit) { - return { - status: false, - message: __("Date of application should not be less than date of visit"), - } - } else if (_doc.date_of_application > frappe.datetime.get_today()) { - return { - status: false, - message: __("Date of application should not be greater than today's date") - } - } else { - return { - status: true, - // message:"Invalid " - } - } -} + if (_doc.date_of_application < _frm.doc.date_of_visit) { + return { + status: false, + message: __("Date of application should not be less than date of visit"), + }; + } else if (_doc.date_of_application > frappe.datetime.get_today()) { + return { + status: false, + message: __("Date of application should not be greater than today's date"), + }; + } else { + return { + status: true, + // message:"Invalid " + }; + } +}; const doc_rejected_validate = (_doc, _scheme) => { - if (_doc.date_of_rejection < _frm.doc.date_of_visit) { - return { - status: false, - message: __("Date of visit should not be less than date of visit") - } - } else if (_doc.date_of_rejection < _scheme.date_of_application) { - return { - status: false, - message: __("Date of rejection should not be less than date of application") - } - } else if (_doc.date_of_rejection > frappe.datetime.get_today()) { - return { - status: false, - message: __("Date of rejection should not be greater than today's date") - } - } else { - return { - status: true, - // message:"Invalid " - } - } -} + if (_doc.date_of_rejection < _frm.doc.date_of_visit) { + return { + status: false, + message: __("Date of visit should not be less than date of visit"), + }; + } else if (_doc.date_of_rejection < _scheme.date_of_application) { + return { + status: false, + message: __("Date of rejection should not be less than date of application"), + }; + } else if (_doc.date_of_rejection > frappe.datetime.get_today()) { + return { + status: false, + message: __("Date of rejection should not be greater than today's date"), + }; + } else { + return { + status: true, + // message:"Invalid " + }; + } +}; const date_of_complete_validate = (_doc, _scheme) => { - console.log(_doc, _scheme) - if (_doc.date_of_application < _frm.doc.date_of_visit) { - return { - status: false, - message: __("Date of application should not be less than date of visit") - - } - } else if (_doc.date_of_completion < _frm.doc.date_of_visit) { - return { - status: false, - message: __("Date of completion should not be less than date of visit") - } - } else if (_doc.date_of_completion > frappe.datetime.get_today()) { - return { - status: false, - message: __("Date of completion should not be greater than today's date") - } - } else if ((_doc.date_of_completion < _doc.date_of_application) || (_doc.date_of_completion < _scheme?.date_of_application)) { - return { - status: false, - message: __("Date of completion should not be less than Date of Application") - } - } else { - return { - status: true, - // message:"Invalid " - } - } -} + console.log(_doc, _scheme); + if (_doc.date_of_application < _frm.doc.date_of_visit) { + return { + status: false, + message: __("Date of application should not be less than date of visit"), + }; + } else if (_doc.date_of_completion < _frm.doc.date_of_visit) { + return { + status: false, + message: __("Date of completion should not be less than date of visit"), + }; + } else if (_doc.date_of_completion > frappe.datetime.get_today()) { + return { + status: false, + message: __("Date of completion should not be greater than today's date"), + }; + } else if ( + _doc.date_of_completion < _doc.date_of_application || + _doc.date_of_completion < _scheme?.date_of_application + ) { + return { + status: false, + message: __("Date of completion should not be less than Date of Application"), + }; + } else { + return { + status: true, + // message:"Invalid " + }; + } +}; const createDialog = (_doc, config, validator = null) => { - return new frappe.ui.Dialog({ - title: config.title, - fields: config.fields, - size: 'small', // small, large, extra-large - primary_action_label: 'Save', - primary_action(obj) { - if (validator) { - let valid = validator(obj, _doc) - if (!valid.status) { - return frappe.throw(valid.message); - } - } - let fields = config.fields.filter(f => f._doc).map(e => e.fieldname) - for (let field of fields) { - if (obj[field]) - _doc[field] = obj[field] - } - this.hide() - } - }); -} + return new frappe.ui.Dialog({ + title: config.title, + fields: config.fields, + size: "small", // small, large, extra-large + primary_action_label: "Save", + primary_action(obj) { + if (validator) { + let valid = validator(obj, _doc); + if (!valid.status) { + return frappe.throw(valid.message); + } + } + let fields = config.fields.filter((f) => f._doc).map((e) => e.fieldname); + for (let field of fields) { + if (obj[field]) _doc[field] = obj[field]; + } + this.hide(); + }, + }); +}; diff --git a/myojana/public/js/beneficiary_profiling/follow_up.js b/myojana/public/js/beneficiary_profiling/follow_up.js index 5210445..a21b333 100644 --- a/myojana/public/js/beneficiary_profiling/follow_up.js +++ b/myojana/public/js/beneficiary_profiling/follow_up.js @@ -1,152 +1,298 @@ // ********************* FOLLOW UP CHILD Table*********************** -frappe.ui.form.on('Follow Up Child', { - form_render: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (frm.fields_dict.follow_up_table.grid && row.name_of_the_scheme) { - let _local_scheme_followups = frm.doc.follow_up_table.filter(f => f.__islocal).map(e => e.name_of_the_scheme); - let support_data = frm.doc.scheme_table.filter(f => ['Open', 'Under process', 'Closed'].includes(f.status) && !_local_scheme_followups.includes(f.scheme)).map(m => m.name_of_the_scheme); - frm.fields_dict.follow_up_table.grid.update_docfield_property("name_of_the_scheme", "options", [...support_data, row.name_of_the_scheme]); - } - }, - async follow_up_table_add(frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (frappe.user_roles.includes("Sub-Centre")) { - let sub_centre = await get_ordered_list("Sub Centre", false) - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow", "options", sub_centre); - } else { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow", "options", [`${frappe.session.user_fullname}`]); - row.follow = frappe.session.user_fullname - } - // call api of list of subcentre with checking roles - let _local_scheme_followups = frm.doc.follow_up_table.filter(f => f.__islocal).map(e => e.name_of_the_scheme) - let support_data = frm.doc.scheme_table.filter(f => ['Open', 'Under process', 'Closed'].includes(f.status) && !_local_scheme_followups.includes(f.scheme)).map(m => m.name_of_the_scheme); - frm.fields_dict.follow_up_table.grid.update_docfield_property("name_of_the_scheme", "options", support_data); - }, - name_of_the_scheme: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - let supports = frm.doc.scheme_table.filter(f => f.scheme == row.name_of_the_scheme && (['Open', 'Under process', 'Closed'].includes(f.status))); - row.date_of_application = supports[0].date_of_application - row.follow_up_date = frappe.datetime.get_today() - // console.log(supports, "supports") - row.parent_ref = supports[0].name - for (support_items of frm.doc.scheme_table) { - if (row.name_of_the_scheme == support_items.name_of_the_scheme) { - if (support_items.status === "Open" && support_items.application_submitted == "No") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_with", "options", ["Beneficiary"]); - row.follow_up_with = "Beneficiary" - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Interested", "Not interested", "Document submitted", "Not reachable" , "Completed"]); - } else if (support_items.status === "Under process" && support_items.application_submitted == "Yes") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_with", "options", ["Beneficiary", "Government department", "Government website", "Others"]); - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Not reachable", "Under process", "Additional info required", "Completed", "Rejected"]); - } else if (support_items.status === "Closed" && support_items.application_submitted == "Yes") { - // last call update ?? confusion changes - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_with", "options", ["Beneficiary", "Government department", "Government website", "Others"]); - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Not reachable", "Under process", "Additional info required", "Completed", "Rejected"]); - } else if (support_items.status === "Closed" && support_items.application_submitted == "No") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_with", "options", ["Beneficiary"]); - row.follow_up_with = "Beneficiary" - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Interested", "Not interested", "Document submitted", "Not reachable"]); - } - } - } - }, - follow_up_date: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - // console.log("follow up", row) - }, - follow_up_date: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (row.follow_up_date > frappe.datetime.get_today()) { - row.follow_up_date = null - frappe.throw(__("You can not select future date in Follow-up date")); - } - if (row.follow_up_date < row.date_of_application) { - row.follow_up_date = null - frappe.throw(__("Follow-up date should not be less than date of application")); - } - if (row.follow_up_date < frm.doc.date_of_visit) { - row.follow_up_date = null - frappe.throw(__("Follow-up date should not be less than date of date of registration")); - } - }, - follow_up_with: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (row.follow_up_with == "Government department" || row.follow_up_with == "Others") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_mode", "options", ["Phone call", "In-person visit"]); - } else { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_mode", "options", ["Phone call", "Home visit", "Centre visit"]); - } - let supports = frm.doc.scheme_table.filter(f => f.specific_support_type == row.support_name); - let latestSupport = supports.length ? supports[supports.length - 1] : null; - if (row.follow_up_with != "Beneficiary" && latestSupport.application_submitted == "Yes") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Not reachable", "Under process", "Additional info required", "Completed", "Rejected"]); - } else if (row.follow_up_with == "Beneficiary" && latestSupport.application_submitted == "Yes") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Not reachable", "Under process", "Additional info required", "Completed", "Rejected"]); - } else if (row.follow_up_with == "Beneficiary" && latestSupport.application_submitted == "No") { - frm.fields_dict.follow_up_table.grid.update_docfield_property("follow_up_status", "options", ["Interested", "Not interested", "Document submitted", "Not reachable","Completed"]); - } - }, - follow_up_status: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - let supports = frm.doc.scheme_table.filter(f => f.specific_support_type == row.support_name); - let latestSupport = supports.length ? supports[supports.length - 1] : null; - if (row.follow_up_status === "Not reachable" && latestSupport.status != "Closed") { - let followups = frm.doc.follow_up_table.filter(f => f.parent_ref == row.parent_ref && f.support_name == row.support_name && f.follow_up_status == "Not reachable") - if (followups.length >= 2) { - frappe.warn('Do you want to close the scheme?', - `The follow-up status is "Not reachable" ${followups.length} times`, - () => { - row.to_close_status = "Closed" - console.log(row, "row") - }, - 'Close', - true // Sets dialog as minimizable - ) - - } - // show popup and continue and close if more than two times - } - }, - date_of_application:function(frm , cdt , cdn){ - let row = frappe.get_doc(cdt, cdn); - if(row.date_of_application < frm.doc.date_of_visit){ - row.date_of_application = '' - frappe.throw(__("Date of application should not be less than date of registration")); - }else if (row.date_of_application > frappe.datetime.get_today()) { - row.date_of_application = '' - frappe.throw(__("Date of application should not be greater than today's date")); - } - }, - date_of_completion: function(frm , cdt, cdn){ - let row = frappe.get_doc(cdt, cdn); - if(row.date_of_application < frm.doc.date_of_visit){ - row.date_of_completion = '' - frappe.throw(__("Date of application should not be less than date of registration")) - } else if (row.date_of_completion < frm.doc.date_of_visit){ - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be less than date of registration")) - }else if (row.date_of_completion > frappe.datetime.get_today()){ - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be greater than today's date")) - }else if((row.date_of_completion < row.date_of_application)){ - // modified this logic - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be less than Date of Application")) - } - }, - date_of_rejection:function(frm, cdt, cdn){ - let row = frappe.get_doc(cdt, cdn); - if (row.date_of_rejection < frm.doc.date_of_visit){ - row.date_of_rejection = '' - frappe.throw(__("Date of rejection should not be less than date of registration")) - }else if((row.date_of_rejection < row.date_of_application)){ - // mmay be need modify - row.date_of_rejection = '' - frappe.throw(__("Date of rejection should not be less than date of application")) - }else if (row.date_of_rejection > frappe.datetime.get_today()) { - row.date_of_rejection = '' - frappe.throw(__("Date of rejection should not be greater than today's date")) - } - } - -}) \ No newline at end of file +frappe.ui.form.on("Follow Up Child", { + form_render: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (frm.fields_dict.follow_up_table.grid && row.name_of_the_scheme) { + let _local_scheme_followups = frm.doc.follow_up_table + .filter((f) => f.__islocal) + .map((e) => e.name_of_the_scheme); + let support_data = frm.doc.scheme_table + .filter( + (f) => + ["Open", "Under process", "Closed"].includes(f.status) && + !_local_scheme_followups.includes(f.scheme) + ) + .map((m) => m.name_of_the_scheme); + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "name_of_the_scheme", + "options", + [...support_data, row.name_of_the_scheme] + ); + } + }, + async follow_up_table_add(frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (frappe.user_roles.includes("Sub-Centre")) { + let sub_centre = await get_ordered_list("Sub Centre", false); + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow", + "options", + sub_centre + ); + } else { + frm.fields_dict.follow_up_table.grid.update_docfield_property("follow", "options", [ + `${frappe.session.user_fullname}`, + ]); + row.follow = frappe.session.user_fullname; + } + // call api of list of subcentre with checking roles + let _local_scheme_followups = frm.doc.follow_up_table + .filter((f) => f.__islocal) + .map((e) => e.name_of_the_scheme); + let support_data = frm.doc.scheme_table + .filter( + (f) => + ["Open", "Under process", "Closed"].includes(f.status) && + !_local_scheme_followups.includes(f.scheme) + ) + .map((m) => m.name_of_the_scheme); + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "name_of_the_scheme", + "options", + support_data + ); + }, + name_of_the_scheme: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + let supports = frm.doc.scheme_table.filter( + (f) => + f.scheme == row.name_of_the_scheme && + ["Open", "Under process", "Closed"].includes(f.status) + ); + row.date_of_application = supports[0].date_of_application; + row.follow_up_date = frappe.datetime.get_today(); + // console.log(supports, "supports") + row.parent_ref = supports[0].name; + for (support_items of frm.doc.scheme_table) { + if (row.name_of_the_scheme == support_items.name_of_the_scheme) { + if ( + support_items.status === "Open" && + support_items.application_submitted == "No" + ) { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_with", + "options", + ["Beneficiary"] + ); + row.follow_up_with = "Beneficiary"; + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Interested", + "Not interested", + "Document submitted", + "Not reachable", + "Completed", + ] + ); + } else if ( + support_items.status === "Under process" && + support_items.application_submitted == "Yes" + ) { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_with", + "options", + ["Beneficiary", "Government department", "Government website", "Others"] + ); + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Not reachable", + "Under process", + "Additional info required", + "Completed", + "Rejected", + ] + ); + } else if ( + support_items.status === "Closed" && + support_items.application_submitted == "Yes" + ) { + // last call update ?? confusion changes + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_with", + "options", + ["Beneficiary", "Government department", "Government website", "Others"] + ); + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Not reachable", + "Under process", + "Additional info required", + "Completed", + "Rejected", + ] + ); + } else if ( + support_items.status === "Closed" && + support_items.application_submitted == "No" + ) { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_with", + "options", + ["Beneficiary"] + ); + row.follow_up_with = "Beneficiary"; + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + ["Interested", "Not interested", "Document submitted", "Not reachable"] + ); + } + } + } + }, + follow_up_date: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.follow_up_date > frappe.datetime.get_today()) { + row.follow_up_date = null; + frappe.throw(__("You can not select future date in Follow-up date")); + } + if (row.follow_up_date < row.date_of_application) { + row.follow_up_date = null; + frappe.throw(__("Follow-up date should not be less than date of application")); + } + if (row.follow_up_date < frm.doc.date_of_visit) { + row.follow_up_date = null; + frappe.throw( + __("Follow-up date should not be less than date of date of registration") + ); + } + }, + follow_up_with: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.follow_up_with == "Government department" || row.follow_up_with == "Others") { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_mode", + "options", + ["Phone call", "In-person visit"] + ); + } else { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_mode", + "options", + ["Phone call", "Home visit", "Centre visit"] + ); + } + let supports = frm.doc.scheme_table.filter( + (f) => f.specific_support_type == row.support_name + ); + let latestSupport = supports.length ? supports[supports.length - 1] : null; + if (row.follow_up_with != "Beneficiary" && latestSupport.application_submitted == "Yes") { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Not reachable", + "Under process", + "Additional info required", + "Completed", + "Rejected", + ] + ); + } else if ( + row.follow_up_with == "Beneficiary" && + latestSupport.application_submitted == "Yes" + ) { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Not reachable", + "Under process", + "Additional info required", + "Completed", + "Rejected", + ] + ); + } else if ( + row.follow_up_with == "Beneficiary" && + latestSupport.application_submitted == "No" + ) { + frm.fields_dict.follow_up_table.grid.update_docfield_property( + "follow_up_status", + "options", + [ + "Interested", + "Not interested", + "Document submitted", + "Not reachable", + "Completed", + ] + ); + } + }, + follow_up_status: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + let supports = frm.doc.scheme_table.filter( + (f) => f.specific_support_type == row.support_name + ); + let latestSupport = supports.length ? supports[supports.length - 1] : null; + if (row.follow_up_status === "Not reachable" && latestSupport.status != "Closed") { + let followups = frm.doc.follow_up_table.filter( + (f) => + f.parent_ref == row.parent_ref && + f.support_name == row.support_name && + f.follow_up_status == "Not reachable" + ); + if (followups.length >= 2) { + frappe.warn( + "Do you want to close the scheme?", + `The follow-up status is "Not reachable" ${followups.length} times`, + () => { + row.to_close_status = "Closed"; + console.log(row, "row"); + }, + "Close", + true // Sets dialog as minimizable + ); + } + // show popup and continue and close if more than two times + } + }, + date_of_application: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.date_of_application < frm.doc.date_of_visit) { + row.date_of_application = ""; + frappe.throw(__("Date of application should not be less than date of registration")); + } else if (row.date_of_application > frappe.datetime.get_today()) { + row.date_of_application = ""; + frappe.throw(__("Date of application should not be greater than today's date")); + } + }, + date_of_completion: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.date_of_application < frm.doc.date_of_visit) { + row.date_of_completion = ""; + frappe.throw(__("Date of application should not be less than date of registration")); + } else if (row.date_of_completion < frm.doc.date_of_visit) { + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be less than date of registration")); + } else if (row.date_of_completion > frappe.datetime.get_today()) { + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be greater than today's date")); + } else if (row.date_of_completion < row.date_of_application) { + // modified this logic + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be less than Date of Application")); + } + }, + date_of_rejection: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.date_of_rejection < frm.doc.date_of_visit) { + row.date_of_rejection = ""; + frappe.throw(__("Date of rejection should not be less than date of registration")); + } else if (row.date_of_rejection < row.date_of_application) { + // mmay be need modify + row.date_of_rejection = ""; + frappe.throw(__("Date of rejection should not be less than date of application")); + } else if (row.date_of_rejection > frappe.datetime.get_today()) { + row.date_of_rejection = ""; + frappe.throw(__("Date of rejection should not be greater than today's date")); + } + }, +}); diff --git a/myojana/public/js/beneficiary_profiling/id_document.js b/myojana/public/js/beneficiary_profiling/id_document.js index 2a807bd..46c390f 100644 --- a/myojana/public/js/beneficiary_profiling/id_document.js +++ b/myojana/public/js/beneficiary_profiling/id_document.js @@ -1,45 +1,58 @@ const indianVoterIdRegex = /^[A-Z]{3}[0-9]{7}$/; const indianAadharRegex = /^\d{4}\d{4}\d{4}$/; - const apply_filter_on_id_document = async () => { - // APPLY Filter in ID DOCUMENT - var child_table = cur_frm.fields_dict['id_table_list'].grid; - if (child_table) { - try { - child_table.get_field('which_of_the_following_id_documents_do_you_have').get_query = function () { - return { - filters: [ - ['ID Document', 'document', 'NOT IN', cur_frm.doc.id_table_list.map(function (item) { - return item.which_of_the_following_id_documents_do_you_have; - })] - ] - }; - }; - } catch (error) { - console.error(error) - } - } -} + // APPLY Filter in ID DOCUMENT + var child_table = cur_frm.fields_dict["id_table_list"].grid; + if (child_table) { + try { + child_table.get_field("which_of_the_following_id_documents_do_you_have").get_query = + function () { + return { + filters: [ + [ + "ID Document", + "document", + "NOT IN", + cur_frm.doc.id_table_list.map(function (item) { + return item.which_of_the_following_id_documents_do_you_have; + }), + ], + ], + }; + }; + } catch (error) { + console.error(error); + } + } +}; // ********************* ID documents CHILD Table ********************* -frappe.ui.form.on('ID Document Child', { - form_render: async function (frm, cdt, cdn) { - apply_filter_on_id_document() - }, - id_table_list_add: async function (frm, cdt, cdn) { - apply_filter_on_id_document() - }, - enter_id_number: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (!indianVoterIdRegex.test(row.enter_id_number) && row.which_of_the_following_id_documents_do_you_have === "Voter ID card" && (row.enter_id_number.length < 11 || row.enter_id_number.length > 9)) { - row.enter_id_number = '' - frm.refresh_fields('enter_id_number') - frappe.throw(`The Voter ID Number entered is invalid`) - } - if (!indianAadharRegex.test(row.enter_id_number) && row.which_of_the_following_id_documents_do_you_have === "Aadhar card" && (row.enter_id_number.length < 12 || row.enter_id_number.length > 11)) { - row.enter_id_number = '' - frm.refresh_fields('enter_id_number') - frappe.throw(`The Aadhar number entered is invalid `) - } - }, -}) +frappe.ui.form.on("ID Document Child", { + form_render: async function (frm, cdt, cdn) { + apply_filter_on_id_document(); + }, + id_table_list_add: async function (frm, cdt, cdn) { + apply_filter_on_id_document(); + }, + enter_id_number: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if ( + !indianVoterIdRegex.test(row.enter_id_number) && + row.which_of_the_following_id_documents_do_you_have === "Voter ID card" && + (row.enter_id_number.length < 11 || row.enter_id_number.length > 9) + ) { + row.enter_id_number = ""; + frm.refresh_fields("enter_id_number"); + frappe.throw(`The Voter ID Number entered is invalid`); + } + if ( + !indianAadharRegex.test(row.enter_id_number) && + row.which_of_the_following_id_documents_do_you_have === "Aadhar card" && + (row.enter_id_number.length < 12 || row.enter_id_number.length > 11) + ) { + row.enter_id_number = ""; + frm.refresh_fields("enter_id_number"); + frappe.throw(`The Aadhar number entered is invalid `); + } + }, +}); diff --git a/myojana/public/js/beneficiary_profiling/scheme.js b/myojana/public/js/beneficiary_profiling/scheme.js index 6d56a9d..340fac3 100644 --- a/myojana/public/js/beneficiary_profiling/scheme.js +++ b/myojana/public/js/beneficiary_profiling/scheme.js @@ -1,136 +1,173 @@ -var scheme_list = [] +var scheme_list = []; const showRules = (row) => { - let rules = (row?.rules || []).map(e => `${e.rule_field} ${e.operator} ${e.data} ${e.check}`).join("\n") - frappe.msgprint({ - title: __('rules'), - message: rules, - primary_action: { - action(values) { - console.log(values); - } - } - }); -} + let rules = (row?.rules || []) + .map((e) => `${e.rule_field} ${e.operator} ${e.data} ${e.check}`) + .join("\n"); + frappe.msgprint({ + title: __("rules"), + message: rules, + primary_action: { + action(values) { + console.log(values); + }, + }, + }); +}; const addTableFilter = (datatable, elements = [], rows = []) => { - document.addEventListener('keyup', function (event) { - if (elements.includes(event.target.id)) { - let filters = [] - for (el of elements) { - let val = document.getElementById(el)?.value; - if (val) { - filters.push([el, val]) - } - } - if (filters.length) { - datatable.refresh(rows.filter(row => !filters.map(e => (row[e[0]]?.toString()?.toLowerCase()?.indexOf(e[1]?.toLowerCase()) > -1)).includes(false))) - } else { - datatable.refresh(rows) - } - } - }); -} + document.addEventListener("keyup", function (event) { + if (elements.includes(event.target.id)) { + let filters = []; + for (const el of elements) { + let val = document.getElementById(el)?.value; + if (val) { + filters.push([el, val]); + } + } + if (filters.length) { + datatable.refresh( + rows.filter( + (row) => + !filters + .map( + (e) => + row[e[0]] + ?.toString() + ?.toLowerCase() + ?.indexOf(e[1]?.toLowerCase()) > -1 + ) + .includes(false) + ) + ); + } else { + datatable.refresh(rows); + } + } + }); +}; // ********************* Support CHILD Table*********************** -frappe.ui.form.on('Scheme Child', { - form_render: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - let schemes_op = frm.doc.scheme_table.filter(f => ['Open', 'Under process', 'Closed', ''].includes(f.status)).map(e => e.name_of_the_scheme); - let fl_schemes_ops = scheme_list.filter(f => !schemes_op.includes(f.name) && f.available) - let milestones = {}; - let ops = fl_schemes_ops.map(e => { - milestones.hasOwnProperty(e.milestone) ? '' : milestones[e.milestone] = e.milestone - return { 'label': __(e.name_of_the_scheme), "value": __(e.name) } - }) - frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops; - frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.milestone_category._data = Object.keys(milestones) - .map(e => ({ 'label': __(milestones[e]), 'value': __(milestones[e]) })) - .filter(item => item.value !== ""); - }, - scheme_table_add: async function (frm, cdt, cdn) { - // get_milestone_category(frm) - let schemes_op = frm.doc.scheme_table.filter(f => ['Open', 'Under process', 'Closed', ''].includes(f.status)).map(e => e.name_of_the_scheme); - let fl_schemes_ops = scheme_list.filter(f => !schemes_op.includes(f.name) && f.available) - let milestones = {}; - let ops = fl_schemes_ops.map(e => { - milestones.hasOwnProperty(e.milestone) ? '' : milestones[e.milestone] = e.milestone - return { 'label': __(e.name), "value": __(e.name) } - }) - frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops; - frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.milestone_category._data = Object.keys(milestones) - .map(e => ({ 'label': __(milestones[e]), 'value': __(milestones[e]) })) - .filter(item => item.value !== ""); +frappe.ui.form.on("Scheme Child", { + form_render: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + let schemes_op = frm.doc.scheme_table + .filter((f) => ["Open", "Under process", "Closed", ""].includes(f.status)) + .map((e) => e.name_of_the_scheme); + let fl_schemes_ops = scheme_list.filter( + (f) => !schemes_op.includes(f.name) && f.available + ); + let milestones = {}; + let ops = fl_schemes_ops.map((e) => { + milestones.hasOwnProperty(e.milestone) ? "" : (milestones[e.milestone] = e.milestone); + return { label: __(e.name_of_the_scheme), value: __(e.name) }; + }); + frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops; + frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.milestone_category._data = + Object.keys(milestones) + .map((e) => ({ label: __(milestones[e]), value: __(milestones[e]) })) + .filter((item) => item.value !== ""); + }, + scheme_table_add: async function (frm, cdt, cdn) { + // get_milestone_category(frm) + let schemes_op = frm.doc.scheme_table + .filter((f) => ["Open", "Under process", "Closed", ""].includes(f.status)) + .map((e) => e.name_of_the_scheme); + let fl_schemes_ops = scheme_list.filter( + (f) => !schemes_op.includes(f.name) && f.available + ); + let milestones = {}; + let ops = fl_schemes_ops.map((e) => { + milestones.hasOwnProperty(e.milestone) ? "" : (milestones[e.milestone] = e.milestone); + return { label: __(e.name), value: __(e.name) }; + }); + frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops; + frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.milestone_category._data = + Object.keys(milestones) + .map((e) => ({ label: __(milestones[e]), value: __(milestones[e]) })) + .filter((item) => item.value !== ""); - // frm.fields_dict.scheme_table.grid.update_docfield_property("milestone_category", "options", ); - }, - name_of_the_scheme: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.milestone_category = '' - let scheme = scheme_list.find(f => row.name_of_the_scheme == f.name) - if (scheme && row.name_of_the_scheme) { - row.milestone_category = scheme.milestone; - // row.mode_of_application = scheme.mode_of_application; - row.name_of_the_department = scheme.name_of_department; - } - refresh_field("scheme_table") - }, - milestone_category: (frm, cdt, cdn) => { - let row = frappe.get_doc(cdt, cdn); - row.name_of_the_scheme = '' - frm.refresh_fields('name_of_the_scheme') - let schemes; - if (row.milestone_category === "") { - schemes = scheme_list; - } else { - schemes = scheme_list.filter(f => row.milestone_category == f.milestone); - } - let schemes_op = frm.doc.scheme_table.filter(f => ['Open', 'Under process', 'Closed', ''].includes(f.status)).map(e => e.name_of_the_scheme); - let fl_schemes_ops = schemes.filter(f => !schemes_op.includes(f.name) && f.available) - let milestones = {}; - let ops = fl_schemes_ops.map(e => { - milestones.hasOwnProperty(e.milestone) ? '' : milestones[e.milestone] = e.milestone - return { 'label': __(e.name), "value": __(e.name) } - }) - // frm.fields_dict.scheme_table.grid.update_docfield_property("name_of_the_scheme", "options", ops); - frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops - // frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme.set_options() - }, - application_submitted: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - if (row.application_submitted == "Yes") { - row.status = ''; row.date_of_completion = ''; - frm.refresh_fields('status', 'date_of_completion') - } else if (["Completed"].includes(row.application_submitted)) { - } else if (row.application_submitted == "No") { - row.date_of_application = ''; row.date_of_completion = ''; row.application_number = ''; row.amount_paid = ''; row.paid_by = ""; - frm.refresh_fields("date_of_application", "date_of_completion", "application_number", "amount_paid", "paid_by"); - } - }, - date_of_application: function(frm , cdt, cdn){ - let row = frappe.get_doc(cdt, cdn); - if(row.date_of_application < frm.doc.date_of_visit){ - row.date_of_application = '' - frappe.throw(__("Date of application should not be less than date of registration")); - }else if (row.date_of_application > frappe.datetime.get_today()) { - row.date_of_application = '' - frappe.throw(__("Date of application should not be greater than today's date")); - } - }, - date_of_completion: function(frm, cdt , cdn){ - let row = frappe.get_doc(cdt, cdn); - if(row.date_of_application < frm.doc.date_of_visit){ - row.date_of_completion = '' - frappe.throw(__("Date of application should not be less than date of registration")) - } else if (row.date_of_completion < frm.doc.date_of_visit){ - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be less than date of registration")) - }else if (row.date_of_completion > frappe.datetime.get_today()){ - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be greater than today's date")) - }else if((row.date_of_completion < row.date_of_application)){ - row.date_of_completion = '' - frappe.throw(__("Date of completion should not be greater than today's date")) - } - } - -}) \ No newline at end of file + // frm.fields_dict.scheme_table.grid.update_docfield_property("milestone_category", "options", ); + }, + name_of_the_scheme: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.milestone_category = ""; + let scheme = scheme_list.find((f) => row.name_of_the_scheme == f.name); + if (scheme && row.name_of_the_scheme) { + row.milestone_category = scheme.milestone; + // row.mode_of_application = scheme.mode_of_application; + row.name_of_the_department = scheme.name_of_department; + } + refresh_field("scheme_table"); + }, + milestone_category: (frm, cdt, cdn) => { + let row = frappe.get_doc(cdt, cdn); + row.name_of_the_scheme = ""; + frm.refresh_fields("name_of_the_scheme"); + let schemes; + if (row.milestone_category === "") { + schemes = scheme_list; + } else { + schemes = scheme_list.filter((f) => row.milestone_category == f.milestone); + } + let schemes_op = frm.doc.scheme_table + .filter((f) => ["Open", "Under process", "Closed", ""].includes(f.status)) + .map((e) => e.name_of_the_scheme); + let fl_schemes_ops = schemes.filter((f) => !schemes_op.includes(f.name) && f.available); + let milestones = {}; + let ops = fl_schemes_ops.map((e) => { + milestones.hasOwnProperty(e.milestone) ? "" : (milestones[e.milestone] = e.milestone); + return { label: __(e.name), value: __(e.name) }; + }); + // frm.fields_dict.scheme_table.grid.update_docfield_property("name_of_the_scheme", "options", ops); + frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme._data = ops; + // frm.fields_dict.scheme_table.grid.open_grid_row.fields_dict.name_of_the_scheme.set_options() + }, + application_submitted: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.application_submitted == "Yes") { + row.status = ""; + row.date_of_completion = ""; + frm.refresh_fields("status", "date_of_completion"); + } else if (["Completed"].includes(row.application_submitted)) { + } else if (row.application_submitted == "No") { + row.date_of_application = ""; + row.date_of_completion = ""; + row.application_number = ""; + row.amount_paid = ""; + row.paid_by = ""; + frm.refresh_fields( + "date_of_application", + "date_of_completion", + "application_number", + "amount_paid", + "paid_by" + ); + } + }, + date_of_application: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.date_of_application < frm.doc.date_of_visit) { + row.date_of_application = ""; + frappe.throw(__("Date of application should not be less than date of registration")); + } else if (row.date_of_application > frappe.datetime.get_today()) { + row.date_of_application = ""; + frappe.throw(__("Date of application should not be greater than today's date")); + } + }, + date_of_completion: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + if (row.date_of_application < frm.doc.date_of_visit) { + row.date_of_completion = ""; + frappe.throw(__("Date of application should not be less than date of registration")); + } else if (row.date_of_completion < frm.doc.date_of_visit) { + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be less than date of registration")); + } else if (row.date_of_completion > frappe.datetime.get_today()) { + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be greater than today's date")); + } else if (row.date_of_completion < row.date_of_application) { + row.date_of_completion = ""; + frappe.throw(__("Date of completion should not be greater than today's date")); + } + }, +}); diff --git a/myojana/public/js/main.js b/myojana/public/js/main.js index ab4dcfe..ee7f171 100644 --- a/myojana/public/js/main.js +++ b/myojana/public/js/main.js @@ -1,59 +1,69 @@ -frappe.router.on('change', async () => { - let cur_router = await frappe.get_route(); - if (cur_router[0] != 'Workspaces') { - $('.sidebar-toggle-btn').hide(); - $('.layout-side-section').hide(); - } else { - $('.sidebar-toggle-btn').show(); - $('.layout-side-section').show(); - } +frappe.router.on("change", async () => { + let cur_router = await frappe.get_route(); + if (cur_router[0] != "Workspaces") { + $(".sidebar-toggle-btn").hide(); + $(".layout-side-section").hide(); + } else { + $(".sidebar-toggle-btn").show(); + $(".layout-side-section").show(); + } }); async function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: function (response) { - resolve(response?.message || response?.value); - }, - error: function (error) { - reject(error); - } - }); - }); + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: function (response) { + resolve(response?.message || response?.value); + }, + error: function (error) { + reject(error); + }, + }); + }); } async function fetchSettings() { - try { - let myojanaSetting = await callAPI({ - method: 'myojana.apis.myojana_setting.get_myojana_setting', - freeze: true, - args: { - fields: ['is_primary_member_link_through_phone_number'] - }, - }); - return myojanaSetting - // console.log(myojanaSetting); - } catch (error) { - console.error('Error fetching myojana settings:', error); - } + try { + let myojanaSetting = await callAPI({ + method: "myojana.apis.myojana_setting.get_myojana_setting", + freeze: true, + args: { + fields: ["is_primary_member_link_through_phone_number"], + }, + }); + return myojanaSetting; + // console.log(myojanaSetting); + } catch (error) { + console.error("Error fetching myojana settings:", error); + } } let data = {}; -fetchSettings().then((res) => {data = res}).catch((err) => {console.log(err);}); -console.log("jhvhjvhj",data); +fetchSettings() + .then((res) => { + data = res; + }) + .catch((err) => { + console.log(err); + }); +console.log("jhvhjvhj", data); setTimeout(() => { - if (frappe.user_roles.includes("Sub-Centre") || frappe.user_roles.includes("CSC Member") || frappe.user_roles.includes("MIS executive")) { - if (!frappe.user_roles.includes("Administrator")) { - document.getElementById('navbar-search').hidden = true; - document.getElementsByClassName('search-icon')[0].hidden = true; - } else { - document.getElementById('navbar-search').hidden = false; - document.getElementsByClassName('search-icon')[0].hidden = false; - } - } else { - document.getElementById('navbar-search').hidden = false; - document.getElementsByClassName('search-icon')[0].hidden = false; - } + if ( + frappe.user_roles.includes("Sub-Centre") || + frappe.user_roles.includes("CSC Member") || + frappe.user_roles.includes("MIS executive") + ) { + if (!frappe.user_roles.includes("Administrator")) { + document.getElementById("navbar-search").hidden = true; + document.getElementsByClassName("search-icon")[0].hidden = true; + } else { + document.getElementById("navbar-search").hidden = false; + document.getElementsByClassName("search-icon")[0].hidden = false; + } + } else { + document.getElementById("navbar-search").hidden = false; + document.getElementsByClassName("search-icon")[0].hidden = false; + } }, 100); diff --git a/myojana/public/js/scheme/eligibile_ben.js b/myojana/public/js/scheme/eligibile_ben.js index 2ba7b8a..0dd128a 100644 --- a/myojana/public/js/scheme/eligibile_ben.js +++ b/myojana/public/js/scheme/eligibile_ben.js @@ -1,44 +1,54 @@ class SchemeEligibleBen { - constructor(frm = null, wrapper = null) { - // debugger - this.frm = frm; - this.wrapper = wrapper; - this.eligible_ben = []; - this.total_pages = 1; - this.currentPage = 1; - if (frm) { - this.show_table(); - } - this.filters = [{ - name_of_the_beneficiary: '', - name_of_parents: '', - contact_number: '', - block_name: '' - }] - } - getRandomColor() { - const letters = '0123456789ABCDEF'; - let color = '#'; - for (let i = 0; i < 6; i++) { - color += letters[Math.floor(Math.random() * 16)]; - } - return color; - } - stripHtmlTags(input) { - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = input; - return tempDiv.textContent || tempDiv.innerText || ''; - } - getActionBar() { - let el = document.createElement('div'); - el.className = 'd-flex pb-4 justify-content-between align-items-center'; - el.style = 'gap: 20px;' - el.innerHTML = ` + constructor(frm = null, wrapper = null) { + // debugger + this.frm = frm; + this.wrapper = wrapper; + this.eligible_ben = []; + this.total_pages = 1; + this.currentPage = 1; + if (frm) { + this.show_table(); + } + this.filters = [ + { + name_of_the_beneficiary: "", + name_of_parents: "", + contact_number: "", + block_name: "", + }, + ]; + } + getRandomColor() { + const letters = "0123456789ABCDEF"; + let color = "#"; + for (let i = 0; i < 6; i++) { + color += letters[Math.floor(Math.random() * 16)]; + } + return color; + } + stripHtmlTags(input) { + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = input; + return tempDiv.textContent || tempDiv.innerText || ""; + } + getActionBar() { + let el = document.createElement("div"); + el.className = "d-flex pb-4 justify-content-between align-items-center"; + el.style = "gap: 20px;"; + el.innerHTML = `
    - - - - + + + + @@ -46,301 +56,379 @@ class SchemeEligibleBen { - ` - return el; - } - createTable() { - let el = document.createElement('div'); - el.className = 'form-grid-container form-grid'; - el.style = 'overflow-y:auto;' - el.innerHTML = ` + `; + return el; + } + createTable() { + let el = document.createElement("div"); + el.className = "form-grid-container form-grid"; + el.style = "overflow-y:auto;"; + el.innerHTML = ` - - - - - + + + + + - ${this.eligible_ben?.data?.length === 0 - ? ` + ${ + this.eligible_ben?.data?.length === 0 + ? ` ` - : this.eligible_ben?.data?.map((item,index) => ` + : this.eligible_ben?.data + ?.map( + (item, index) => ` - - + + - `).join('')} + ` + ) + .join("") + }
    # ${__('Name of the Beneficiary')}${__('Head of household')}${__('Contact number')}${__('Block')}${__('Village')}${__( + "Name of the Beneficiary" + )}${__( + "Head of household" + )}${__( + "Contact number" + )}${__( + "Block" + )}${__( + "Village" + )}
    No rows
    ${index + 1} - ${item.name_of_the_beneficiary} + ${ + item.name_of_the_beneficiary + } ${item.name_of_parents ?? ``} ${item.contact_number ?? ``}${item.block_name ?? ``}${item.village_name ?? ``}${ + item.block_name ?? `` + }${ + item.village_name ?? `` + }
    - ` - return el; - } - createFooter() { - let el = document.createElement('div'); - el.className = 'd-flex py-2 justify-content-between align-items-center'; - el.style = 'gap: 10px;' - let totalPages = this.total_pages; - let currentPage = this.currentPage; + `; + return el; + } + createFooter() { + let el = document.createElement("div"); + el.className = "d-flex py-2 justify-content-between align-items-center"; + el.style = "gap: 10px;"; + let totalPages = this.total_pages; + let currentPage = this.currentPage; - const getPagination = () => { - if (totalPages <= 7) { - return Array.from({ length: totalPages }, (_, i) => i + 1); - } + const getPagination = () => { + if (totalPages <= 7) { + return Array.from({ length: totalPages }, (_, i) => i + 1); + } - let pages = new Set([1, 2, totalPages - 1, totalPages]); + let pages = new Set([1, 2, totalPages - 1, totalPages]); - if (currentPage > 3) pages.add(currentPage - 1); - if (currentPage > 2) pages.add(currentPage); - if (currentPage < totalPages - 1) pages.add(currentPage + 1); + if (currentPage > 3) pages.add(currentPage - 1); + if (currentPage > 2) pages.add(currentPage); + if (currentPage < totalPages - 1) pages.add(currentPage + 1); - let result = []; - let prev = 0; - [...pages].sort((a, b) => a - b).forEach(page => { - if (prev && page - prev > 1) { - result.push("..."); - } - result.push(page); - prev = page; - }); + let result = []; + let prev = 0; + [...pages] + .sort((a, b) => a - b) + .forEach((page) => { + if (prev && page - prev > 1) { + result.push("..."); + } + result.push(page); + prev = page; + }); - return result; - }; + return result; + }; - el.innerHTML = ` + el.innerHTML = `
    Total Beneficiary: ${this.eligible_ben?.count?.total ?? 0} Primary member: ${this.eligible_ben?.count?.family_count ?? 0} Block count: ${this.eligible_ben?.count?.block_count ?? 0} Settlement count: ${this.eligible_ben?.count?.settlement_count ?? 0}
    - ${totalPages > 1 ? ` + ${ + totalPages > 1 + ? ` - ` : ''} + ` + : "" + } `; - return el; - } + return el; + } - noDataFound() { - let el = document.createElement('div'); - el.style = 'flex-direction: column; height: 200px;' - el.classList.add('d-flex', 'justify-content-center', 'align-items-center'); - el.innerHTML = ` + noDataFound() { + let el = document.createElement("div"); + el.style = "flex-direction: column; height: 200px;"; + el.classList.add("d-flex", "justify-content-center", "align-items-center"); + el.innerHTML = `

    You haven't created a Recored yet

    - ` - return el; - } - async show_table() { - let limit = 50; - let start = (this.currentPage - 1) * limit; - this.eligible_ben = await callAPI({ - method: 'myojana.api.eligible_beneficiaries', - freeze: false, - args: { - scheme: this.frm.doc.name, - columns: ["name", "serial_no", "name_of_the_beneficiary", "select_primary_member.name_of_parents", "contact_number", "ward.block_name", "name_of_the_settlement.village_name"], - filters: this.filters ?? [], - start: start, - page_imit: limit, - is_limit: true, - }, - // freeze_message: __("Getting beneficiaries..."), - }) - this.total_pages = Math.ceil(this.eligible_ben?.count?.total / limit); - this.currentPage = Math.max(1, Math.min(this.currentPage, this.total_pages)); + `; + return el; + } + async show_table() { + let limit = 50; + let start = (this.currentPage - 1) * limit; + this.eligible_ben = await callAPI({ + method: "myojana.api.eligible_beneficiaries", + freeze: false, + args: { + scheme: this.frm.doc.name, + columns: [ + "name", + "serial_no", + "name_of_the_beneficiary", + "select_primary_member.name_of_parents", + "contact_number", + "ward.block_name", + "name_of_the_settlement.village_name", + ], + filters: this.filters ?? [], + start: start, + page_imit: limit, + is_limit: true, + }, + // freeze_message: __("Getting beneficiaries..."), + }); + this.total_pages = Math.ceil(this.eligible_ben?.count?.total / limit); + this.currentPage = Math.max(1, Math.min(this.currentPage, this.total_pages)); - if (document.getElementById('task-list')) { - document.getElementById('eligible_ben-body').remove(); - document.getElementById('eligible_ben-footer').remove(); - } - let task_container = document.createElement('div'); - task_container.classList.add('task-list'); - task_container.id = 'task-list'; - task_container.style = 'min-width: 100%;' - task_container.innerHTML = ` + if (document.getElementById("task-list")) { + document.getElementById("eligible_ben-body").remove(); + document.getElementById("eligible_ben-footer").remove(); + } + let task_container = document.createElement("div"); + task_container.classList.add("task-list"); + task_container.id = "task-list"; + task_container.style = "min-width: 100%;"; + task_container.innerHTML = `
    `; - if(!document.getElementById('eligible_ben-header')){ - task_container.querySelector('#eligible_ben-header').appendChild(this.getActionBar()); - } - task_container.querySelector('#eligible_ben-body').appendChild(this.createTable()); - task_container.querySelector('#eligible_ben-footer').appendChild(this.createFooter()); - this.wrapper.appendChild(task_container); + if (!document.getElementById("eligible_ben-header")) { + task_container.querySelector("#eligible_ben-header").appendChild(this.getActionBar()); + } + task_container.querySelector("#eligible_ben-body").appendChild(this.createTable()); + task_container.querySelector("#eligible_ben-footer").appendChild(this.createFooter()); + this.wrapper.appendChild(task_container); - // Function to toggle Clear Filters button visibility - const toggleClearFiltersButton = () => { - const filtersApplied = - $('#name_of_beneficiary').val().trim() !== '' || - $('#name_of_parents').val().trim() !== '' || - $('#phone_number').val().trim() !== '' || - $('#block_name').val().trim() !== ''; - $('#clearFilters').css('display', filtersApplied ? 'inline-block' : 'none'); - }; + // Function to toggle Clear Filters button visibility + const toggleClearFiltersButton = () => { + const filtersApplied = + $("#name_of_beneficiary").val().trim() !== "" || + $("#name_of_parents").val().trim() !== "" || + $("#phone_number").val().trim() !== "" || + $("#block_name").val().trim() !== ""; + $("#clearFilters").css("display", filtersApplied ? "inline-block" : "none"); + }; - // Pagination events - $(document).off('click', '.page-link').on('click', '.page-link', (e) => { - let page = Number($(e.target).text()); - if (!isNaN(page)) { - this.currentPage = page; - this.show_table(); - } - }); + // Pagination events + $(document) + .off("click", ".page-link") + .on("click", ".page-link", (e) => { + let page = Number($(e.target).text()); + if (!isNaN(page)) { + this.currentPage = page; + this.show_table(); + } + }); - $(document).off('click', '.prev-page').on('click', '.prev-page', (e) => { - if (this.currentPage > 1) { - this.currentPage--; - this.show_table(); - } - }); + $(document) + .off("click", ".prev-page") + .on("click", ".prev-page", (e) => { + if (this.currentPage > 1) { + this.currentPage--; + this.show_table(); + } + }); - $(document).off('click', '.next-page').on('click', '.next-page', (e) => { - if (this.currentPage < this.total_pages) { - this.currentPage++; - this.show_table(); - } - }); + $(document) + .off("click", ".next-page") + .on("click", ".next-page", (e) => { + if (this.currentPage < this.total_pages) { + this.currentPage++; + this.show_table(); + } + }); - // Filter input events with toggle - $(document).off('keyup', '#name_of_beneficiary').on('keyup', '#name_of_beneficiary', (e) => { - let name_of_beneficiary = $(e.target).val(); - this.filters[0].name_of_the_beneficiary = name_of_beneficiary; - this.show_table(); - toggleClearFiltersButton(); - }); + // Filter input events with toggle + $(document) + .off("keyup", "#name_of_beneficiary") + .on("keyup", "#name_of_beneficiary", (e) => { + let name_of_beneficiary = $(e.target).val(); + this.filters[0].name_of_the_beneficiary = name_of_beneficiary; + this.show_table(); + toggleClearFiltersButton(); + }); - $(document).off('keyup', '#name_of_parents').on('keyup', '#name_of_parents', (e) => { - let name_of_parents = $(e.target).val(); - this.filters[0].name_of_parents = name_of_parents; - this.show_table(); - toggleClearFiltersButton(); - }); + $(document) + .off("keyup", "#name_of_parents") + .on("keyup", "#name_of_parents", (e) => { + let name_of_parents = $(e.target).val(); + this.filters[0].name_of_parents = name_of_parents; + this.show_table(); + toggleClearFiltersButton(); + }); - $(document).off('keyup', '#phone_number').on('keyup', '#phone_number', (e) => { - let phone_number = $(e.target).val(); - this.filters[0].contact_number = Number(phone_number); - this.show_table(); - toggleClearFiltersButton(); - }); + $(document) + .off("keyup", "#phone_number") + .on("keyup", "#phone_number", (e) => { + let phone_number = $(e.target).val(); + this.filters[0].contact_number = Number(phone_number); + this.show_table(); + toggleClearFiltersButton(); + }); - $(document).off('keyup', '#block_name').on('keyup', '#block_name', (e) => { - let block_name = $(e.target).val(); - this.filters[0].block_name = block_name; - this.show_table(); - toggleClearFiltersButton(); - }); + $(document) + .off("keyup", "#block_name") + .on("keyup", "#block_name", (e) => { + let block_name = $(e.target).val(); + this.filters[0].block_name = block_name; + this.show_table(); + toggleClearFiltersButton(); + }); - // Export - $(document).off('click', '#bulkDeleteButton').on('click', '#bulkDeleteButton', async(e) => { - let data = await callAPI({ - method: 'myojana.api.eligible_beneficiaries', - freeze: false, - args: { - scheme: this.frm.doc.name, - columns: ["name", "serial_no", "name_of_the_beneficiary", "select_primary_member.name_of_parents", "contact_number", "ward.block_name", "name_of_the_settlement.village_name"], - filters: [], - start: 0 - }, - // freeze_message: __("Getting beneficiaries..."), - }) - this.convertJSONToCSV(data.data, 'Eligible Beneficiary'); - }); + // Export + $(document) + .off("click", "#bulkDeleteButton") + .on("click", "#bulkDeleteButton", async (e) => { + let data = await callAPI({ + method: "myojana.api.eligible_beneficiaries", + freeze: false, + args: { + scheme: this.frm.doc.name, + columns: [ + "name", + "serial_no", + "name_of_the_beneficiary", + "select_primary_member.name_of_parents", + "contact_number", + "ward.block_name", + "name_of_the_settlement.village_name", + ], + filters: [], + start: 0, + }, + // freeze_message: __("Getting beneficiaries..."), + }); + this.convertJSONToCSV(data.data, "Eligible Beneficiary"); + }); - // Clear Filters with toggle - $(document).off('click', '#clearFilters').on('click', '#clearFilters', (e) => { - $('#name_of_beneficiary').val(''); - $('#name_of_parents').val(''); - $('#phone_number').val(''); - $('#block_name').val(''); - this.filters = [{ // Reset filters object - name_of_the_beneficiary: '', - name_of_parents: '', - contact_number: '', - block_name: '' - }]; - this.show_table(); - toggleClearFiltersButton(); // Hide button after clearing - }); + // Clear Filters with toggle + $(document) + .off("click", "#clearFilters") + .on("click", "#clearFilters", (e) => { + $("#name_of_beneficiary").val(""); + $("#name_of_parents").val(""); + $("#phone_number").val(""); + $("#block_name").val(""); + this.filters = [ + { + // Reset filters object + name_of_the_beneficiary: "", + name_of_parents: "", + contact_number: "", + block_name: "", + }, + ]; + this.show_table(); + toggleClearFiltersButton(); // Hide button after clearing + }); - // Initial toggle check - toggleClearFiltersButton(); - } - convertJSONToCSV(jsonData, fileName) { - // Convert JSON to CSV format - const csvContent = []; - const keys = Object.keys(jsonData[0]); - csvContent.push(keys.join(',')); + // Initial toggle check + toggleClearFiltersButton(); + } + convertJSONToCSV(jsonData, fileName) { + // Convert JSON to CSV format + const csvContent = []; + const keys = Object.keys(jsonData[0]); + csvContent.push(keys.join(",")); - jsonData.forEach(entry => { - const values = keys.map(key => { - let value = entry[key]; - if (typeof value === 'string') { - value = `"${value}"`; // Enclose in double quotes to handle commas within strings - } - return value; - }); - csvContent.push(values.join(',')); - }); + jsonData.forEach((entry) => { + const values = keys.map((key) => { + let value = entry[key]; + if (typeof value === "string") { + value = `"${value}"`; // Enclose in double quotes to handle commas within strings + } + return value; + }); + csvContent.push(values.join(",")); + }); - // Create CSV file - const csvString = csvContent.join('\n'); - const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' }); - if (navigator.msSaveBlob) { // IE 10+ - navigator.msSaveBlob(blob, fileName); - } else { - const link = document.createElement('a'); - if (link.download !== undefined) { - const url = URL.createObjectURL(blob); - link.setAttribute('href', url); - link.setAttribute('download', fileName); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } else { - alert('Your browser does not support downloading files. Please try a different browser.'); - } - } - } -} \ No newline at end of file + // Create CSV file + const csvString = csvContent.join("\n"); + const blob = new Blob([csvString], { type: "text/csv;charset=utf-8;" }); + if (navigator.msSaveBlob) { + // IE 10+ + navigator.msSaveBlob(blob, fileName); + } else { + const link = document.createElement("a"); + if (link.download !== undefined) { + const url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + alert( + "Your browser does not support downloading files. Please try a different browser." + ); + } + } + } +} diff --git a/myojana/public/js/utils/utils.js b/myojana/public/js/utils/utils.js index 0a445e7..1634be2 100644 --- a/myojana/public/js/utils/utils.js +++ b/myojana/public/js/utils/utils.js @@ -1,51 +1,50 @@ - // This Function Hide Advance search option in Link Fields -const hide_advance_search=(frm, list)=> { - for (item of list) { - frm.set_df_property(item, 'only_select', true); - } +const hide_advance_search = (frm, list) => { + for (const item of list) { + frm.set_df_property(item, "only_select", true); + } }; // This Function extend limit of Link field in dropdowns -const extend_options_length=(frm, fields) => { - fields?.forEach((field) => { - frm.set_query(field, () => { - return { page_length: 1000 }; - }); - }) +const extend_options_length = (frm, fields) => { + fields?.forEach((field) => { + frm.set_query(field, () => { + return { page_length: 1000 }; + }); + }); }; // COMMON FUNCTON FOR FILTER OF LINK FIELD // this function apply filter function apply_filter(field_name, filter_on, frm, filter_value, withoutFilter = false) { - frm.fields_dict[field_name].get_query = () => { - if (withoutFilter) { - return { - filters: {}, - page_length: 1000 - }; - } - return { - filters: { - [filter_on]: filter_value || frm.doc[filter_on] || `please select ${filter_on}`, - }, - page_length: 1000 - }; - } -}; + frm.fields_dict[field_name].get_query = () => { + if (withoutFilter) { + return { + filters: {}, + page_length: 1000, + }; + } + return { + filters: { + [filter_on]: filter_value || frm.doc[filter_on] || `please select ${filter_on}`, + }, + page_length: 1000, + }; + }; +} // This Fields delete fields values async function truncate_multiple_fields_value(_frm, fields) { - for (field of fields) { - _frm.set_value(field, '') - } + for (const field of fields) { + _frm.set_value(field, ""); + } } // Calling APIs Common function function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: async function (response) { - resolve(response?.message || response?.value) - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: async function (response) { + resolve(response?.message || response?.value); + }, + }); + }); } diff --git a/myojana/rule_engine/apis/get_meta_api.py b/myojana/rule_engine/apis/get_meta_api.py index 92e9c44..c6dc136 100644 --- a/myojana/rule_engine/apis/get_meta_api.py +++ b/myojana/rule_engine/apis/get_meta_api.py @@ -1,9 +1,14 @@ import frappe from frappe import _ + @frappe.whitelist(allow_guest=True) def get_field_lists(doctype_name, field_types): - # Your API logic here - meta = frappe.get_meta(doctype_name) - filtered_fields = [{"label": field.label, "value": field.fieldname, "type": field.fieldtype , "options":field.options} for field in meta.fields if field.fieldtype in field_types] - return filtered_fields \ No newline at end of file + # Your API logic here + meta = frappe.get_meta(doctype_name) + filtered_fields = [ + {"label": field.label, "value": field.fieldname, "type": field.fieldtype, "options": field.options} + for field in meta.fields + if field.fieldtype in field_types + ] + return filtered_fields diff --git a/myojana/rule_engine/doctype/rule_engine/rule_engine.js b/myojana/rule_engine/doctype/rule_engine/rule_engine.js index 1fd602c..4166929 100644 --- a/myojana/rule_engine/doctype/rule_engine/rule_engine.js +++ b/myojana/rule_engine/doctype/rule_engine/rule_engine.js @@ -1,167 +1,182 @@ // Copyright (c) 2023, suvaidyam and contributors // For license information, please see license.txt -var common_operators = ["=", "!="] +var common_operators = ["=", "!="]; var field_types = { - "Date": [...common_operators, ">", "<", ">=", "<="], - "Int": [...common_operators, ">", "<", ">=", "<="], - "Link": [...common_operators] -} + Date: [...common_operators, ">", "<", ">=", "<="], + Int: [...common_operators, ">", "<", ">=", "<="], + Link: [...common_operators], +}; function evaluateExpression(input, expression) { - if (!(/^[a-zA-Z0-9\s()+\-/*%&|=!<>]*$/.test(expression))) { - return 'Invalid expression' - } - // expression = expression.toLowerCase(); - expression = expression.replace(/and/g, '&&').replace(/or/g, '||'); - expression = expression.replace(/AND/g, '&&').replace(/OR/g, '||'); - for (let key in input) { - expression = expression.replace(new RegExp(key, 'g'), input[key]); - } - try { - return eval(expression); - } catch (err) { - return err.message; - } + if (!/^[a-zA-Z0-9\s()+\-/*%&|=!<>]*$/.test(expression)) { + return "Invalid expression"; + } + // expression = expression.toLowerCase(); + expression = expression.replace(/and/g, "&&").replace(/or/g, "||"); + expression = expression.replace(/AND/g, "&&").replace(/OR/g, "||"); + for (let key in input) { + expression = expression.replace(new RegExp(key, "g"), input[key]); + } + try { + return eval(expression); + } catch (err) { + return err.message; + } } function generateQueryString(rows, expression) { - - for (let row of rows) { - if (['IN', 'NOT IN'].includes(row.operator)) { - let val = row.data?.split(',').map(e => `'${e}'`).join(','); - expression = expression.replace(new RegExp(row.code, 'g'), `${row.rule_field} ${row.operator} (${val})`) - } else { - expression = expression.replace(new RegExp(row.code, 'g'), `${row.rule_field} ${row.operator} '${row.data}'`) - } - } - return 'select * from `tabBeneficiary Profiling` where ' + expression + for (let row of rows) { + if (["IN", "NOT IN"].includes(row.operator)) { + let val = row.data + ?.split(",") + .map((e) => `'${e}'`) + .join(","); + expression = expression.replace( + new RegExp(row.code, "g"), + `${row.rule_field} ${row.operator} (${val})` + ); + } else { + expression = expression.replace( + new RegExp(row.code, "g"), + `${row.rule_field} ${row.operator} '${row.data}'` + ); + } + } + return "select * from `tabBeneficiary Profiling` where " + expression; } -var field_list = [] +var field_list = []; function get_field_list(frm) { - frappe.call({ - method: "myojana.rule_engine.apis.get_meta_api.get_field_lists", - args: { - doctype_name: "Beneficiary Profiling", - field_types: Object.keys(field_types) - }, - callback: function (response) { - // Handle the response - if (response.message) { - field_list = response.message - frm.fields_dict.field_table.grid.update_docfield_property("rule_field", "options", response.message); - console.log(response.message); - } else { - // console.error("API call failed"); - } - } - }); - + frappe.call({ + method: "myojana.rule_engine.apis.get_meta_api.get_field_lists", + args: { + doctype_name: "Beneficiary Profiling", + field_types: Object.keys(field_types), + }, + callback: function (response) { + // Handle the response + if (response.message) { + field_list = response.message; + frm.fields_dict.field_table.grid.update_docfield_property( + "rule_field", + "options", + response.message + ); + console.log(response.message); + } else { + // console.error("API call failed"); + } + }, + }); } function get_Link_list(doctype_name) { - return new Promise((resolve, reject) => { - frappe.call({ - method: "frappe.desk.search.search_link", - args: { - doctype: doctype_name, - txt: "", - page_length: 10000 - }, - callback: async function (response) { - let data = response?.results || response?.message - if (data) { - resolve(data); - } - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + method: "frappe.desk.search.search_link", + args: { + doctype: doctype_name, + txt: "", + page_length: 10000, + }, + callback: async function (response) { + let data = response?.results || response?.message; + if (data) { + resolve(data); + } + }, + }); + }); } frappe.ui.form.on("Rule Engine", { - refresh(frm) { - - }, - condition: (frm) => { - let el = document.querySelector("[data-fieldname='condition'] p") - let rows = frm.get_field('field_table')?.grid?.data; - if (rows && rows?.length) { - let input = {}; - for (let row of rows) { - input[row.code] = true - } - let eval = evaluateExpression(input, frm.doc.condition); - if (typeof eval == 'string') { - // el.style.color = 'red !important'; - el.setAttribute("style", "color: red !important"); - el.textContent = eval; - } else { - el.setAttribute("style", "color: green !important"); - el.textContent = generateQueryString(rows, frm.doc.condition); - } - } else if (frm.doc.condition) { - el.setAttribute("style", "color: red !important"); - el.textContent = 'Invalid expression.'; - } else { - el.setAttribute("style", ""); - el.textContent = ''; - } - } + refresh(frm) {}, + condition: (frm) => { + let el = document.querySelector("[data-fieldname='condition'] p"); + let rows = frm.get_field("field_table")?.grid?.data; + if (rows && rows?.length) { + let input = {}; + for (let row of rows) { + input[row.code] = true; + } + let result = evaluateExpression(input, frm.doc.condition); + if (typeof result == "string") { + // el.style.color = 'red !important'; + el.setAttribute("style", "color: red !important"); + el.textContent = result; + } else { + el.setAttribute("style", "color: green !important"); + el.textContent = generateQueryString(rows, frm.doc.condition); + } + } else if (frm.doc.condition) { + el.setAttribute("style", "color: red !important"); + el.textContent = "Invalid expression."; + } else { + el.setAttribute("style", ""); + el.textContent = ""; + } + }, }); // CHILD TABLE -frappe.ui.form.on('Rule Engine Child', { - refresh(frm) { - }, - field_table_add(frm, cdt, cdn) { - let initial_code = 64 - let row = frappe.get_doc(cdt, cdn); - if (row.idx <= 26) { - row.code = (String.fromCharCode(initial_code + row.idx)) - } else { - row.code = (String.fromCharCode(initial_code + (row.idx - 26)) + String.fromCharCode(initial_code + (row.idx - 26))) - } +frappe.ui.form.on("Rule Engine Child", { + refresh(frm) {}, + field_table_add(frm, cdt, cdn) { + let initial_code = 64; + let row = frappe.get_doc(cdt, cdn); + if (row.idx <= 26) { + row.code = String.fromCharCode(initial_code + row.idx); + } else { + row.code = + String.fromCharCode(initial_code + (row.idx - 26)) + + String.fromCharCode(initial_code + (row.idx - 26)); + } - get_field_list(frm) - console.log("aa", row) - // frm.fields_dict.field_table.grid.toggle_reqd("data", 1) - // console.log(frm.fields_dict.field_table.grid.get_field('rule_field')) - // frm.fields_dict.field_table.section.fields_dict.field_table.grid.df.fields_dict.rule_field.toggle(false) - // frm.fields_dict.field_table.grid.df.fields_dict.rule_field.toggle(false); - // frm.fields_dict.field_table.grid.get_field('rule_field').df.hidden = true; + get_field_list(frm); + console.log("aa", row); + // frm.fields_dict.field_table.grid.toggle_reqd("data", 1) + // console.log(frm.fields_dict.field_table.grid.get_field('rule_field')) + // frm.fields_dict.field_table.section.fields_dict.field_table.grid.df.fields_dict.rule_field.toggle(false) + // frm.fields_dict.field_table.grid.df.fields_dict.rule_field.toggle(false); + // frm.fields_dict.field_table.grid.get_field('rule_field').df.hidden = true; + // frm.fields_dict.field_table.grid.df.read_only = 1 + // frm.fields_dict.field_table.row.data.df.data = 'Date'; + // console.log(frm.fields_dict.field_table.section.fields_dict.field_table) + }, + rule_field: async function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.type = field_list?.find((f) => f.value == row.rule_field)?.type; + frm.fields_dict.field_table.grid.update_docfield_property( + "operator", + "options", + field_types[row.type] + ); - // frm.fields_dict.field_table.grid.df.read_only = 1 - // frm.fields_dict.field_table.row.data.df.data = 'Date'; - // console.log(frm.fields_dict.field_table.section.fields_dict.field_table) - - - }, - rule_field: async function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.type = field_list?.find(f => f.value == row.rule_field)?.type; - frm.fields_dict.field_table.grid.update_docfield_property("operator", "options", field_types[row.type]); - - if (row.type == "Link") { - let options = field_list.find(f => f.value == row.rule_field)?.options; - console.log("rule_field", row.type, options); - let link_data = await get_Link_list(options) - console.log("link_data:", link_data); - frm.fields_dict.field_table.grid.update_docfield_property("select", "options", link_data); - } - frm.fields_dict.field_table.grid.refresh(); - var cur_grid = frm.get_field('field_table').grid; - var cur_doc = locals[cdt][cdn]; - var cur_row = cur_grid.get_row(cur_doc.name); - cur_row.toggle_view(); - }, - date: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.date - frm.fields_dict.field_table.grid.refresh(); - }, - select: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.select - frm.fields_dict.field_table.grid.refresh(); - }, - value: function (frm, cdt, cdn) { - let row = frappe.get_doc(cdt, cdn); - row.data = row.value - frm.fields_dict.field_table.grid.refresh(); - } -}) + if (row.type == "Link") { + let options = field_list.find((f) => f.value == row.rule_field)?.options; + console.log("rule_field", row.type, options); + let link_data = await get_Link_list(options); + console.log("link_data:", link_data); + frm.fields_dict.field_table.grid.update_docfield_property( + "select", + "options", + link_data + ); + } + frm.fields_dict.field_table.grid.refresh(); + var cur_grid = frm.get_field("field_table").grid; + var cur_doc = locals[cdt][cdn]; + var cur_row = cur_grid.get_row(cur_doc.name); + cur_row.toggle_view(); + }, + date: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.date; + frm.fields_dict.field_table.grid.refresh(); + }, + select: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.select; + frm.fields_dict.field_table.grid.refresh(); + }, + value: function (frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.data = row.value; + frm.fields_dict.field_table.grid.refresh(); + }, +}); diff --git a/myojana/scheduler_events/ben_dob_update.py b/myojana/scheduler_events/ben_dob_update.py index b0ce9b4..6d8fa24 100644 --- a/myojana/scheduler_events/ben_dob_update.py +++ b/myojana/scheduler_events/ben_dob_update.py @@ -1,7 +1,8 @@ import frappe + def update_age(): - query = """ + query = """ UPDATE `tabBeneficiary Profiling` SET @@ -22,22 +23,24 @@ def update_age(): OR completed_age_month != (TIMESTAMPDIFF(MONTH, date_of_birth, CURDATE()) % 12); """ - try: - data = frappe.db.sql(query, as_dict=True) - except Exception as e: - frappe.throw(str(e)) + try: + frappe.db.sql(query, as_dict=True) + except Exception as e: + frappe.throw(str(e)) + def update_dob_of_ben(): - query = """UPDATE `tabBeneficiary Profiling` + query = """UPDATE `tabBeneficiary Profiling` SET completed_age = completed_age + 1 WHERE DATE_FORMAT(date_of_birth, '%m-%d') = DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 DAY), '%m-%d'); """ - data = frappe.db.sql(query, as_dict=True) + data = frappe.db.sql(query, as_dict=True) + + return data - return data def update_dob_months(): - query = """UPDATE `tabBeneficiary Profiling` + query = """UPDATE `tabBeneficiary Profiling` SET completed_age_month = CASE WHEN completed_age_month < 11 THEN completed_age_month + 1 @@ -45,6 +48,5 @@ def update_dob_months(): END WHERE DATE_FORMAT(date_of_birth, '%d') = DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 DAY), '%d'); """ - data = frappe.db.sql(query, as_dict=True) - return data - + data = frappe.db.sql(query, as_dict=True) + return data diff --git a/myojana/services/beneficiary_scheme.py b/myojana/services/beneficiary_scheme.py index 05f665b..dc618bc 100644 --- a/myojana/services/beneficiary_scheme.py +++ b/myojana/services/beneficiary_scheme.py @@ -1,52 +1,57 @@ import frappe + from myojana.utils.misc import Misc + + class BeneficaryScheme: - def run(beneficiary=None): - schemes = frappe.get_list('Scheme', fields=['name', 'name_of_department', 'milestone']) - for scheme in schemes: - doc = frappe.get_doc("Scheme", scheme.name) - rule_list = [] - matching_counter = 0 - if doc.rules and len(doc.rules): - filters = Misc.rules_to_filters(doc.rules,True) - for group in filters: - sql_query = ' AND '.join([f"{condition[0]} {condition[1]} {condition[2]}" for condition in filters[group]]) - filter = filters[group] - filter.append(['name','=',beneficiary]) - beneficiary_list = frappe.get_list("Beneficiary Profiling", filters=filter,page_length=1) - check = True if len(beneficiary_list) else False - if check: - matching_counter += 1 - rule_list.append({ - 'message':f"[{group if group else ''}]:({sql_query})", - 'check':check - }) - scheme['rules'] = rule_list + def run(beneficiary=None): + schemes = frappe.get_list("Scheme", fields=["name", "name_of_department", "milestone"]) + for scheme in schemes: + doc = frappe.get_doc("Scheme", scheme.name) + rule_list = [] + matching_counter = 0 + if doc.rules and len(doc.rules): + filters = Misc.rules_to_filters(doc.rules, True) + for group in filters: + sql_query = " AND ".join( + [f"{condition[0]} {condition[1]} {condition[2]}" for condition in filters[group]] + ) + filter = filters[group] + filter.append(["name", "=", beneficiary]) + beneficiary_list = frappe.get_list("Beneficiary Profiling", filters=filter, page_length=1) + check = True if len(beneficiary_list) else False + if check: + matching_counter += 1 + rule_list.append({"message": f"[{group if group else ''}]:({sql_query})", "check": check}) + scheme["rules"] = rule_list + + scheme["total_rules"] = len(rule_list) + scheme["matching_rules"] = matching_counter + scheme["matching_rules_per"] = 0 + if matching_counter > 0: + scheme["matching_rules_per"] = (matching_counter / scheme["total_rules"]) * 100 + return schemes + + def validate(beneficiary, condition): + list = frappe.get_list( + "Beneficiary Profiling", filters=[condition, ["name", "=", beneficiary]], page_length=1 + ) + return True if len(list) > 0 else False - scheme['total_rules'] = len(rule_list) - scheme['matching_rules'] = matching_counter - scheme['matching_rules_per'] = 0 - if matching_counter > 0: - scheme['matching_rules_per'] = (matching_counter/scheme['total_rules'])*100 - return schemes - def validate(beneficiary, condition): - list = frappe.get_list("Beneficiary Profiling", filters=[condition,['name','=',beneficiary]],page_length=1) - return True if len(list) > 0 else False + def validate_conditions(beneficiary, key, conditions): + obj = {"total": len(conditions), "matched": 0, "percentage": 0, "rules": [], "key": key} + for condition in conditions: + is_matched = BeneficaryScheme.validate(beneficiary, condition) + if is_matched: + obj["matched"] += 1 + obj["rules"].append( + {"message": f"{condition[0]} {condition[1]} {condition[2]}", "matched": is_matched} + ) + obj["percentage"] = ((obj["matched"] / obj["total"]) * 100) if obj["total"] > 0 else 0 + return obj - def validate_conditions(beneficiary, key, conditions): - obj = {'total':len(conditions), 'matched':0, 'percentage':0,'rules':[],'key':key} - for condition in conditions: - is_matched = BeneficaryScheme.validate(beneficiary, condition) - if is_matched: - obj['matched'] += 1 - obj['rules'].append({ - 'message':f"{condition[0]} {condition[1]} {condition[2]}", - 'matched':is_matched - }) - obj['percentage'] = ((obj['matched']/obj['total'])*100) if obj['total'] > 0 else 0 - return obj - def has_availed(beneficiary, scheme): - sql = f""" + def has_availed(beneficiary, scheme): + sql = f""" select name from @@ -61,36 +66,56 @@ def has_availed(beneficiary, scheme): status IN ('Completed','Availed') limit 1 """ - count_list = frappe.db.sql(sql, as_dict=True) - return False if len(count_list) else True + count_list = frappe.db.sql(sql, as_dict=True) + return False if len(count_list) else True - def get_schemes(beneficiary=None): - schemes = frappe.get_list('Scheme', fields=['name','name_of_the_scheme', 'name_of_department', 'milestone', 'how_many_times_can_this_scheme_be_availed'], filters={'enabled': '1'}) - for scheme in schemes: - doc = frappe.get_doc("Scheme", scheme.name) - scheme['groups'] = [] - scheme['available'] = True - if scheme.get('how_many_times_can_this_scheme_be_availed') == 'Once': - scheme['available'] = BeneficaryScheme.has_availed(beneficiary, scheme.name) - scheme['rules'] = [] - scheme['total_rules'] = 0 - scheme['matching_rules'] = 0 - scheme['matching_rules_per'] = 0 - if doc.rules and len(doc.rules): - filters = Misc.rules_to_filters(doc.rules,True) - groups = [] - for key in filters: - groups.append(BeneficaryScheme.validate_conditions(beneficiary,key,filters[key])) - denominator_sorted_list = sorted(groups, key=lambda x: x['total'], reverse=True) - percentage_sorted_list = sorted(denominator_sorted_list, key=lambda x: x['percentage'], reverse=True) + def get_schemes(beneficiary=None): + schemes = frappe.get_list( + "Scheme", + fields=[ + "name", + "name_of_the_scheme", + "name_of_department", + "milestone", + "how_many_times_can_this_scheme_be_availed", + ], + filters={"enabled": "1"}, + ) + for scheme in schemes: + doc = frappe.get_doc("Scheme", scheme.name) + scheme["groups"] = [] + scheme["available"] = True + if scheme.get("how_many_times_can_this_scheme_be_availed") == "Once": + scheme["available"] = BeneficaryScheme.has_availed(beneficiary, scheme.name) + scheme["rules"] = [] + scheme["total_rules"] = 0 + scheme["matching_rules"] = 0 + scheme["matching_rules_per"] = 0 + if doc.rules and len(doc.rules): + filters = Misc.rules_to_filters(doc.rules, True) + groups = [] + for key in filters: + groups.append(BeneficaryScheme.validate_conditions(beneficiary, key, filters[key])) + denominator_sorted_list = sorted(groups, key=lambda x: x["total"], reverse=True) + percentage_sorted_list = sorted( + denominator_sorted_list, key=lambda x: x["percentage"], reverse=True + ) - scheme['groups'] = percentage_sorted_list - scheme['rules'] = percentage_sorted_list[0]['rules'] if len(percentage_sorted_list)>0 else [] - scheme['total_rules'] = percentage_sorted_list[0]['total'] if len(percentage_sorted_list)>0 else 0 - scheme['matching_rules'] = percentage_sorted_list[0]['matched'] if len(percentage_sorted_list)>0 else 0 - scheme['matching_rules_per'] = 0 - if scheme['matching_rules'] > 0: - scheme['matching_rules_per'] = ((scheme['matching_rules']/scheme['total_rules'])*100) - res_schemes_denominator_sort = sorted(schemes, key=lambda x: x.get('total_rules', 0), reverse=True) - res_schemes = sorted(res_schemes_denominator_sort, key=lambda x: x.get('matching_rules_per', 0), reverse=True) - return res_schemes + scheme["groups"] = percentage_sorted_list + scheme["rules"] = ( + percentage_sorted_list[0]["rules"] if len(percentage_sorted_list) > 0 else [] + ) + scheme["total_rules"] = ( + percentage_sorted_list[0]["total"] if len(percentage_sorted_list) > 0 else 0 + ) + scheme["matching_rules"] = ( + percentage_sorted_list[0]["matched"] if len(percentage_sorted_list) > 0 else 0 + ) + scheme["matching_rules_per"] = 0 + if scheme["matching_rules"] > 0: + scheme["matching_rules_per"] = (scheme["matching_rules"] / scheme["total_rules"]) * 100 + res_schemes_denominator_sort = sorted(schemes, key=lambda x: x.get("total_rules", 0), reverse=True) + res_schemes = sorted( + res_schemes_denominator_sort, key=lambda x: x.get("matching_rules_per", 0), reverse=True + ) + return res_schemes diff --git a/myojana/services/family.py b/myojana/services/family.py index 6925d32..1c28ff1 100644 --- a/myojana/services/family.py +++ b/myojana/services/family.py @@ -1,62 +1,65 @@ import frappe -class family: - def create(beneficiary): - print("family[create]") - family_doc = frappe.new_doc("Primary Member") - family_doc.name_of_head_of_family = beneficiary.name - family_doc.name_of_parents = beneficiary.name_of_the_beneficiary - family_doc.phone_no = beneficiary.contact_number - family_doc.state = beneficiary.state - family_doc.centre = beneficiary.centre - family_doc.sub_centre = beneficiary.sub_centre - family_doc.save() - return family_doc +class family: + def create(beneficiary): + print("family[create]") + family_doc = frappe.new_doc("Primary Member") + family_doc.name_of_head_of_family = beneficiary.name + family_doc.name_of_parents = beneficiary.name_of_the_beneficiary + family_doc.phone_no = beneficiary.contact_number + family_doc.state = beneficiary.state + family_doc.centre = beneficiary.centre + family_doc.sub_centre = beneficiary.sub_centre + family_doc.save() + return family_doc - def update(beneficiary): - family_doc_name = frappe.db.exists('Primary Member', beneficiary.contact_number) - family_doc = None - if(family_doc_name): - family_doc = frappe.get_doc("Primary Member", family_doc_name) - family_doc.name_of_parents = beneficiary.name - family_doc.phone_no = beneficiary.contact_number - family_doc.state = beneficiary.state - family_doc.centre = beneficiary.centre - family_doc.sub_centre = beneficiary.sub_centre - family_doc.save() - else: - family_doc = frappe.new_doc("Primary Member") - family_doc.name_of_head_of_family = beneficiary.name - family_doc.name_of_parents = beneficiary.name_of_the_beneficiary - family_doc.phone_no = beneficiary.contact_number - family_doc.centre = beneficiary.centre - family_doc.sub_centre = beneficiary.sub_centre - family_doc.state = beneficiary.state - family_doc.insert() - family.handle_contactnumber_change(beneficiary,family_doc) - frappe.msgprint("The beneficiary has been updated to a primary member") - return family_doc + def update(beneficiary): + family_doc_name = frappe.db.exists("Primary Member", beneficiary.contact_number) + family_doc = None + if family_doc_name: + family_doc = frappe.get_doc("Primary Member", family_doc_name) + family_doc.name_of_parents = beneficiary.name + family_doc.phone_no = beneficiary.contact_number + family_doc.state = beneficiary.state + family_doc.centre = beneficiary.centre + family_doc.sub_centre = beneficiary.sub_centre + family_doc.save() + else: + family_doc = frappe.new_doc("Primary Member") + family_doc.name_of_head_of_family = beneficiary.name + family_doc.name_of_parents = beneficiary.name_of_the_beneficiary + family_doc.phone_no = beneficiary.contact_number + family_doc.centre = beneficiary.centre + family_doc.sub_centre = beneficiary.sub_centre + family_doc.state = beneficiary.state + family_doc.insert() + family.handle_contactnumber_change(beneficiary, family_doc) + frappe.msgprint("The beneficiary has been updated to a primary member") + return family_doc - def handle_contactnumber_change(doc,family_doc): - _doc_before_save = doc.get('_doc_before_save',None) - # print("_doc_before_save",_doc_before_save) - if _doc_before_save: - # print("_doc_before_save[IF]") - if doc.get('contact_number') != _doc_before_save.get('contact_number'): - # print("_doc_before_save[IF->IF]") - families = frappe.db.get_list(doctype='Primary Member', filters={'name':_doc_before_save.contact_number}, fields=["name"]) - family = families[0] if len(families) else None - # print("family",family) - if family: - # print("_doc_before_save[IF->IF->IF]") - query = f"UPDATE `tabBeneficiary Profiling` SET select_primary_member = '{family_doc.name}' WHERE select_primary_member = '{_doc_before_save.select_primary_member}'" - up_doc = frappe.db.sql(query) - # print("_doc_before_save[IF->IF->IF] up_doc",up_doc,query) - del_doc = frappe.db.delete("Primary Member", {"name": _doc_before_save.select_primary_member}) - # print("_doc_before_save[IF->IF->IF] del_doc",del_doc) + def handle_contactnumber_change(doc, family_doc): + _doc_before_save = doc.get("_doc_before_save", None) + # print("_doc_before_save",_doc_before_save) + if _doc_before_save: + # print("_doc_before_save[IF]") + if doc.get("contact_number") != _doc_before_save.get("contact_number"): + # print("_doc_before_save[IF->IF]") + families = frappe.db.get_list( + doctype="Primary Member", + filters={"name": _doc_before_save.contact_number}, + fields=["name"], + ) + family = families[0] if len(families) else None + # print("family",family) + if family: + # print("_doc_before_save[IF->IF->IF]") + query = f"UPDATE `tabBeneficiary Profiling` SET select_primary_member = '{family_doc.name}' WHERE select_primary_member = '{_doc_before_save.select_primary_member}'" + frappe.db.sql(query) + # print("_doc_before_save[IF->IF->IF] up_doc",up_doc,query) + frappe.db.delete("Primary Member", {"name": _doc_before_save.select_primary_member}) + # print("_doc_before_save[IF->IF->IF] del_doc",del_doc) - def delete_family(beneficiary): - delate_family = frappe.db.delete("Primary Member", { - "name": beneficiary.contact_number}) - return delate_family \ No newline at end of file + def delete_family(beneficiary): + delate_family = frappe.db.delete("Primary Member", {"name": beneficiary.contact_number}) + return delate_family diff --git a/myojana/sva_report/controllers/child_table_crud.py b/myojana/sva_report/controllers/child_table_crud.py index 9e1d510..e0e748e 100644 --- a/myojana/sva_report/controllers/child_table_crud.py +++ b/myojana/sva_report/controllers/child_table_crud.py @@ -3,39 +3,47 @@ import frappe + @frappe.whitelist() -def insert_child_doc(doctype=None,parent=None,parentfield=None,parenttype=None,fieldname=None,label=None,fieldtype=None,idx=None): - doc = frappe.get_doc({ - 'doctype': doctype, - 'parent':parent, - 'parentfield':parentfield, - 'parenttype':parenttype, - 'fieldname':fieldname, - 'label':label, - 'fieldtype':fieldtype, - 'idx':idx - }) - doc.insert(ignore_permissions=True) - return doc +def insert_child_doc( + doctype=None, + parent=None, + parentfield=None, + parenttype=None, + fieldname=None, + label=None, + fieldtype=None, + idx=None, +): + doc = frappe.get_doc( + { + "doctype": doctype, + "parent": parent, + "parentfield": parentfield, + "parenttype": parenttype, + "fieldname": fieldname, + "label": label, + "fieldtype": fieldtype, + "idx": idx, + } + ) + doc.insert(ignore_permissions=True) + return doc + @frappe.whitelist() -def delete_all_child_doc(doctype=None,parent=None,parentfield=None,parenttype=None): - frappe.db.delete(doctype, { - "parent":parent, - 'parentfield':parentfield, - 'parenttype':parenttype - }) - return True +def delete_all_child_doc(doctype=None, parent=None, parentfield=None, parenttype=None): + frappe.db.delete(doctype, {"parent": parent, "parentfield": parentfield, "parenttype": parenttype}) + return True + + @frappe.whitelist() -def get_all_child_doc(doctype=None,parent=None,parentfield=None,parenttype=None): - list = frappe.db.get_list(doctype, - filters={ - "parent":parent, - 'parentfield':parentfield, - 'parenttype':parenttype - }, - pluck='fieldname', - order_by='idx asc', - ignore_permissions=True - ) - return list \ No newline at end of file +def get_all_child_doc(doctype=None, parent=None, parentfield=None, parenttype=None): + list = frappe.db.get_list( + doctype, + filters={"parent": parent, "parentfield": parentfield, "parenttype": parenttype}, + pluck="fieldname", + order_by="idx asc", + ignore_permissions=True, + ) + return list diff --git a/myojana/sva_report/controllers/doc_type_info.py b/myojana/sva_report/controllers/doc_type_info.py index fcde704..e2f86e2 100644 --- a/myojana/sva_report/controllers/doc_type_info.py +++ b/myojana/sva_report/controllers/doc_type_info.py @@ -1,180 +1,203 @@ -import frappe +import copy import csv from io import StringIO + +import frappe from frappe.utils.response import Response -import copy -allowed_types = ['Data','Date', 'Int', 'Select', 'Check', 'Phone'] -child_types = ['Table', 'Table MultiSelect'] +allowed_types = ["Data", "Date", "Int", "Select", "Check", "Phone"] +child_types = ["Table", "Table MultiSelect"] + + class DocTypeInfo: + def get_fields( + doc_type, + fields, + parent_field="", + degree=1, + link_table=None, + child_table=None, + child_degree=1, + idx=0, + section=False, + ): + # print("section",section, type(section)) + if parent_field: + parent_field = f"{parent_field}." + ref_doc_meta = frappe.get_meta(doc_type) + for field in ref_doc_meta.fields: + # print("field.fieldtype:",field.fieldtype) + local_field = { + "idx": float(f"{idx}.{field.idx}") if idx else field.idx, + "label": field.label, + "fieldtype": field.fieldtype, + "fieldname": f"{field.fieldname}", + "options": field.options, + } + if ( + (field.fieldtype in allowed_types) + or (degree == 1 and section == "1" and field.fieldtype in ["Section Break", "Tab Break"]) + ) and (field.print_hide != 1 and field.hidden != 1): + fields.append( + { + "idx": float(f"{idx}.{field.idx}") if idx else field.idx, + "doc_type": doc_type, + "label": field.label, + "fieldtype": field.fieldtype, + "fieldname": f"{parent_field}{field.fieldname}", + "options": field.options, + "link_table": link_table, + "child_table": child_table, + } + ) + elif field.fieldtype == "Link": + if degree == 1: + new_parent_field = field.fieldname + if parent_field: + new_parent_field = f"{parent_field}{field.fieldname}" + DocTypeInfo.get_fields( + doc_type=field.options, + fields=fields, + parent_field=new_parent_field, + degree=2, + link_table=local_field, + child_table=child_table, + child_degree=2, + idx=field.idx, + section=section, + ) + elif child_degree == 1 and field.fieldtype in child_types: + local_field["parenttype"] = doc_type + if child_degree == 1: + # print(child_degree,field.fieldtype,doc_type,field.options) + DocTypeInfo.get_fields( + doc_type=field.options, + fields=fields, + parent_field=field.fieldname, + degree=1, + link_table=None, + child_table=local_field, + child_degree=2, + idx=field.idx, + section=section, + ) + + return fields + + def prepare_fields(report_doc): + all_fields = DocTypeInfo.get_fields(report_doc.ref_doctype, [], parent_field="") + fields = [] + # print("all_fields",all_fields) + # print("report_fields",report_fields, all_fields) + if len(report_doc.columns) > 0: + for column in report_doc.columns: + for field in all_fields: + if field.get("fieldname") == column.fieldname: + field["label"] = column.label + fields.append(field) + else: + fields.extend(all_fields) + return fields + + def prepare_joins(base_tbl, fields): + joins = [] + unique_link_table = [] + unique_child_table = [] + unique_child_link_table = [] + for field in fields: + if field.get("child_table") is None and field.get("link_table"): + tbl_name = f"`tab{field.get('link_table').get('options')}`" + lnk_fieldname = f"{field.get('link_table').get('fieldname')}" + if lnk_fieldname not in unique_link_table: + joins.append( + f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`name` = {base_tbl}.{lnk_fieldname}" + ) + unique_link_table.append(lnk_fieldname) + elif field.get("child_table") and field.get("link_table") is None: + tbl_name = f"`tab{field.get('child_table').get('options')}`" + lnk_fieldname = f"{field.get('child_table').get('fieldname')}" + if lnk_fieldname not in unique_child_table: + joins.append( + f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`parent` = {base_tbl}.name" + ) + unique_child_table.append(lnk_fieldname) + elif field.get("child_table") and field.get("link_table"): + tbl_name_ = f"`tab{field.get('child_table').get('options')}`" + lnk_fieldname_ = f"{field.get('child_table').get('fieldname')}" + lnk_fieldname_alias_ = f"{lnk_fieldname_}_child" + if lnk_fieldname_ not in unique_child_table: + joins.append( + f"LEFT JOIN {tbl_name_} as {lnk_fieldname_alias_} ON {lnk_fieldname_alias_}.`parent` = {base_tbl}.name" + ) + unique_child_table.append(lnk_fieldname_) - def get_fields( - doc_type, - fields, - parent_field="", - degree=1, - link_table=None, - child_table=None, - child_degree=1, - idx=0, - section=False - ): - # print("section",section, type(section)) - if parent_field: - parent_field = f"{parent_field}." - ref_doc_meta = frappe.get_meta(doc_type) - for field in ref_doc_meta.fields: - # print("field.fieldtype:",field.fieldtype) - local_field = {"idx":float(f"{idx}.{field.idx}") if idx else field.idx,"label": field.label,"fieldtype": field.fieldtype,"fieldname": f"{field.fieldname}","options": field.options} - if ( - ( - (field.fieldtype in allowed_types) - or - (degree ==1 and section=='1' and field.fieldtype in ['Section Break','Tab Break'])) - and - (field.print_hide != 1 and field.hidden != 1) - ) : - fields.append({ - "idx":float(f"{idx}.{field.idx}") if idx else field.idx, - "doc_type":doc_type, - "label": field.label, - "fieldtype": field.fieldtype, - "fieldname": f"{parent_field}{field.fieldname}", - "options": field.options, - "link_table":link_table, - "child_table":child_table - }) - elif field.fieldtype == 'Link': - if degree == 1: - new_parent_field = field.fieldname - if parent_field: - new_parent_field = f"{parent_field}{field.fieldname}" - link_fields = DocTypeInfo.get_fields( - doc_type=field.options, - fields=fields, - parent_field=new_parent_field, - degree=2, - link_table=local_field, - child_table=child_table, - child_degree=2, - idx=field.idx, - section=section - ) - elif child_degree == 1 and field.fieldtype in child_types: - local_field['parenttype'] = doc_type - if child_degree == 1: - # print(child_degree,field.fieldtype,doc_type,field.options) - DocTypeInfo.get_fields( - doc_type=field.options, - fields=fields, - parent_field=field.fieldname, - degree=1, - link_table=None, - child_table=local_field, - child_degree=2, - idx=field.idx, - section=section - ) + tbl_name = f"`tab{field.get('link_table').get('options')}`" + lnk_fieldname = f"{field.get('link_table').get('fieldname')}" + if lnk_fieldname not in unique_child_link_table: + joins.append( + f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`name` = {lnk_fieldname_alias_}.parent" + ) + unique_child_link_table.append(lnk_fieldname) + return "\n".join(joins) - return fields - def prepare_fields(report_doc): - all_fields = DocTypeInfo.get_fields(report_doc.ref_doctype,[], parent_field="") - fields = [] - # print("all_fields",all_fields) - # print("report_fields",report_fields, all_fields) - if len(report_doc.columns) > 0: - for column in report_doc.columns: - for field in all_fields: - if field.get('fieldname') == column.fieldname: - field['label'] = column.label - fields.append(field) - else: - fields.extend(all_fields) - return fields - def prepare_joins(base_tbl,fields): - joins = [] - unique_link_table = [] - unique_child_table = [] - unique_child_link_table = [] - for field in fields: - if field.get('child_table') is None and field.get('link_table'): - tbl_name = f"`tab{field.get('link_table').get('options')}`" - lnk_fieldname = f"{field.get('link_table').get('fieldname')}" - if lnk_fieldname not in unique_link_table: - joins.append(f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`name` = {base_tbl}.{lnk_fieldname}") - unique_link_table.append(lnk_fieldname) - elif field.get('child_table') and field.get('link_table') is None: - tbl_name = f"`tab{field.get('child_table').get('options')}`" - lnk_fieldname = f"{field.get('child_table').get('fieldname')}" - if lnk_fieldname not in unique_child_table: - joins.append(f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`parent` = {base_tbl}.name") - unique_child_table.append(lnk_fieldname) - elif field.get('child_table') and field.get('link_table'): - tbl_name_ = f"`tab{field.get('child_table').get('options')}`" - lnk_fieldname_ = f"{field.get('child_table').get('fieldname')}" - lnk_fieldname_alias_ = f"{lnk_fieldname_}_child" - if lnk_fieldname_ not in unique_child_table: - joins.append(f"LEFT JOIN {tbl_name_} as {lnk_fieldname_alias_} ON {lnk_fieldname_alias_}.`parent` = {base_tbl}.name") - unique_child_table.append(lnk_fieldname_) + def prepare_columns(base_tbl, fields): + columns = [] + field_obj = {} + field_index = 0 + for field in fields: + label = f"{field.get('label')}" + fl = field_obj.get(label.lower(), None) + if fl is None: + field_obj[label.lower()] = 1 + else: + field_obj[label.lower()] += 1 + label = f"{label}{str(fl)}" - tbl_name = f"`tab{field.get('link_table').get('options')}`" - lnk_fieldname = f"{field.get('link_table').get('fieldname')}" - if lnk_fieldname not in unique_child_link_table: - joins.append(f"LEFT JOIN {tbl_name} as {lnk_fieldname} ON {lnk_fieldname}.`name` = {lnk_fieldname_alias_}.parent") - unique_child_link_table.append(lnk_fieldname) - return '\n'.join(joins) - def prepare_columns(base_tbl,fields): - columns = [] - field_obj = {} - field_index = 0 - for field in fields: - label = f"{field.get('label')}" - fl = field_obj.get(label.lower(), None) - if fl is None: - field_obj[label.lower()] = 1 - else: - field_obj[label.lower()] += 1 - label = f"{label}{str(fl)}" + if len(field.get("fieldname").split(".")) == 3: + columns.append( + f"{field.get('fieldname').split('.')[1]}.{field.get('fieldname').split('.')[2]} as `{label}`" + ) + elif len(field.get("fieldname").split(".")) == 2: + columns.append(f"{field.get('fieldname')} as `{label}`") + elif len(field.get("fieldname").split(".")) == 1: + columns.append(f"{base_tbl}.{field.get('fieldname')} as `{label}`") - if len(field.get('fieldname').split('.')) == 3: - columns.append(f"{field.get('fieldname').split('.')[1]}.{field.get('fieldname').split('.')[2]} as `{label}`") - elif len(field.get('fieldname').split('.')) == 2: - columns.append(f"{field.get('fieldname')} as `{label}`") - elif len(field.get('fieldname').split('.')) == 1: - columns.append(f"{base_tbl}.{field.get('fieldname')} as `{label}`") + fields[field_index]["label"] = label + field_index += 1 - fields[field_index]['label'] = label - field_index += 1 + columns_str = ",\n".join(columns) + if columns_str == "": + columns_str = "*" + return columns_str - columns_str = ',\n'.join(columns) - if columns_str=="": - columns_str = "*" - return columns_str - def prepare_condition(filters, rpt_filters): - base_tbl_cond_list = [] - outer_tbl_condition = [] - if filters is not None: - for filter in filters: - if len(filter) == 3: - cond_str = f"{filter[0]} {filter[1]} '{filter[2]}'" - if len(filter[0].split('.')) == 1: - if all(filt.get('fieldname') == filter[0] for filt in rpt_filters): - base_tbl_cond_list.append(cond_str) - else: - outer_tbl_condition.append(cond_str) - elif len(filter[0].split('.')) == 2: - print("Logic pending") - outer_tbl_condition.append(cond_str) - # base_tbl_cond_list.append(cond_str) - base_tbl_cond_str = f"WHERE {'AND'.join(base_tbl_cond_list)}" if len(base_tbl_cond_list) > 0 else "" - outer_tbl_cond_str = f"WHERE {'AND'.join(outer_tbl_condition)}" if len(outer_tbl_condition) > 0 else "" - return base_tbl_cond_str,outer_tbl_cond_str - def prepare_base_query(doctype, fields, doc_filters, req_filters): - base_tbl = f"`tab{doctype}`" - columns_str = DocTypeInfo.prepare_columns(base_tbl,fields) - join_str = DocTypeInfo.prepare_joins(base_tbl,fields) - base_tbl_cond_str,outer_tbl_cond_str = DocTypeInfo.prepare_condition(req_filters, doc_filters) - with_query = f""" + def prepare_condition(filters, rpt_filters): + base_tbl_cond_list = [] + outer_tbl_condition = [] + if filters is not None: + for filter in filters: + if len(filter) == 3: + cond_str = f"{filter[0]} {filter[1]} '{filter[2]}'" + if len(filter[0].split(".")) == 1: + if all(filt.get("fieldname") == filter[0] for filt in rpt_filters): + base_tbl_cond_list.append(cond_str) + else: + outer_tbl_condition.append(cond_str) + elif len(filter[0].split(".")) == 2: + print("Logic pending") + outer_tbl_condition.append(cond_str) + # base_tbl_cond_list.append(cond_str) + base_tbl_cond_str = f"WHERE {'AND'.join(base_tbl_cond_list)}" if len(base_tbl_cond_list) > 0 else "" + outer_tbl_cond_str = ( + f"WHERE {'AND'.join(outer_tbl_condition)}" if len(outer_tbl_condition) > 0 else "" + ) + return base_tbl_cond_str, outer_tbl_cond_str + + def prepare_base_query(doctype, fields, doc_filters, req_filters): + base_tbl = f"`tab{doctype}`" + columns_str = DocTypeInfo.prepare_columns(base_tbl, fields) + join_str = DocTypeInfo.prepare_joins(base_tbl, fields) + base_tbl_cond_str, outer_tbl_cond_str = DocTypeInfo.prepare_condition(req_filters, doc_filters) + with_query = f""" WITH tmp_tble AS ( select {columns_str} @@ -184,251 +207,294 @@ def prepare_base_query(doctype, fields, doc_filters, req_filters): {outer_tbl_cond_str} ) """ - return with_query - def get_total(with_query, skip=0): - count=None - if skip == 0: - count_query = f""" + return with_query + + def get_total(with_query, skip=0): + count = None + if skip == 0: + count_query = f""" {with_query} select count(*) as count from tmp_tble """ - count_result = frappe.db.sql(count_query, as_dict=True) - if len(count_result)>0: - count = count_result[0].get('count', None) - return count - def get_result(with_query, skip=0, limit=20): - limit_str = '' if limit < 0 else f"LIMIT {limit} OFFSET {skip}" - data_query = f""" + count_result = frappe.db.sql(count_query, as_dict=True) + if len(count_result) > 0: + count = count_result[0].get("count", None) + return count + + def get_result(with_query, skip=0, limit=20): + limit_str = "" if limit < 0 else f"LIMIT {limit} OFFSET {skip}" + data_query = f""" {with_query} select * from tmp_tble {limit_str} """ - results = frappe.db.sql(data_query, as_dict=True) - return results - def generate_csv(doc_type, with_query,batch_size = 1000): - start = 0 - rows_count = batch_size + results = frappe.db.sql(data_query, as_dict=True) + return results - header = True + def generate_csv(doc_type, with_query, batch_size=1000): + start = 0 + rows_count = batch_size - while batch_size == rows_count: - rows = DocTypeInfo.get_result(with_query, start, batch_size) - rows_count = len(rows) + header = True - if header and rows_count: - # Write header - csv_buffer = StringIO() - csv_writer = csv.writer(csv_buffer) - csv_writer.writerow(rows[0].keys()) - yield csv_buffer.getvalue() - csv_buffer.seek(0) - csv_buffer.truncate(0) - header = False - for row in rows: - csv_buffer = StringIO() - csv_writer = csv.writer(csv_buffer) - csv_writer.writerow(row.values()) - yield csv_buffer.getvalue() - csv_buffer.seek(0) - csv_buffer.truncate(0) - start += batch_size + while batch_size == rows_count: + rows = DocTypeInfo.get_result(with_query, start, batch_size) + rows_count = len(rows) - def export_csv(doc_type, with_query): - response = Response(DocTypeInfo.generate_csv(doc_type, with_query), content_type='text/csv') - response.http_status_code = 200 - response.headers["Content-Disposition"] = f"attachment; filename={doc_type.lower()}.csv" - return response + if header and rows_count: + # Write header + csv_buffer = StringIO() + csv_writer = csv.writer(csv_buffer) + csv_writer.writerow(rows[0].keys()) + yield csv_buffer.getvalue() + csv_buffer.seek(0) + csv_buffer.truncate(0) + header = False + for row in rows: + csv_buffer = StringIO() + csv_writer = csv.writer(csv_buffer) + csv_writer.writerow(row.values()) + yield csv_buffer.getvalue() + csv_buffer.seek(0) + csv_buffer.truncate(0) + start += batch_size - def get_fields_info(fields): - obj = { - 'columns':['name'], - '_columns':[], - 'children':{} - } - for field in fields: - if field.get('child_table') is None: - obj.get('columns').append(f"{field.get('fieldname')} as `{field.get('fieldname')}`") - obj.get('_columns').append(field.get('fieldname')) - else: - child_table_field = field.get('child_table').get('fieldname') - _fn = field.get('fieldname').replace(f"{child_table_field}.",'', 1) - fn = f"{_fn} as `{_fn}`" - # fn = f"{_fn} as `{field.get('fieldname')}`" - if obj.get('children').get(child_table_field): - obj['children'][child_table_field].get('columns').append(fn) - obj['children'][child_table_field].get('_columns').append(_fn) - else: - obj['children'][child_table_field] = { - 'columns':[fn], - '_columns':[_fn], - 'info':field.get('child_table') - } - return obj - def create_data(rows, fields, repeat_parent=False): - print("repeat_parent",repeat_parent) - obj,index, res_data = fields, 1, [] - table_multiselect = [obj.get('children').get(child_table_name) for child_table_name in obj.get('children') if obj.get('children').get(child_table_name).get('info').get('fieldtype') == "Table MultiSelect"] - tables = [obj.get('children').get(child_table_name) for child_table_name in obj.get('children') if obj.get('children').get(child_table_name).get('info').get('fieldtype') != "Table MultiSelect"] + def export_csv(doc_type, with_query): + response = Response(DocTypeInfo.generate_csv(doc_type, with_query), content_type="text/csv") + response.http_status_code = 200 + response.headers["Content-Disposition"] = f"attachment; filename={doc_type.lower()}.csv" + return response - for row in rows: - row.id = index - index = index+1 - _rows = [] - for child_table in table_multiselect: - ct_info = child_table.get('info') - ct_columns = child_table.get('columns') - _ct_columns = child_table.get('_columns') - # print(ct_info.get('options')) - # records = frappe.db.sql(f"select * from `tab{ct_info.get('options')}` where parent = '{row.name}' and parenttype = '{ct_info.get('parenttype')}'") - records = frappe.get_list(ct_info.get('options'),fields=ct_columns, filters={'parent':row.name,'parenttype':ct_info.get('parenttype')},ignore_permissions=True) - if len(_ct_columns): - k = _ct_columns[0] - row[f"{ct_info.get('fieldname')}.{k}"] = ",".join([record[k] for record in records]) - _rows.append(row) - for child_table in tables: - ct_info = child_table.get('info') - ct_columns = child_table.get('columns') - _ct_columns = child_table.get('_columns') - records = frappe.get_list(ct_info.get('options'),fields=ct_columns, filters={'parent':row.name,'parenttype':ct_info.get('parenttype')},ignore_permissions=True) - # row[child_table] = records - for i,record in enumerate(records): - if len(_rows) < (i+1): - index = index+1 - if repeat_parent: - _r = copy.deepcopy(row) - _r.update({'id':index}) - _rows.append(_r) - else: - _rows.append({'id':index}) - for k in _ct_columns: - # print("data:",ct_info,k) - _rows[i][f"{ct_info.get('fieldname')}.{k}"] = record.get(k, None) - res_data.extend(_rows) - # print("res_data",res_data) - return res_data - def write_csv_data(report_doc,fields, fields_info, filters): - headers = [field.get('label') for field in fields] - csv_buffer = StringIO() - csv_writer = csv.writer(csv_buffer) - csv_writer.writerow(headers) - yield csv_buffer.getvalue() - csv_buffer.seek(0) - csv_buffer.truncate(0) + def get_fields_info(fields): + obj = {"columns": ["name"], "_columns": [], "children": {}} + for field in fields: + if field.get("child_table") is None: + obj.get("columns").append(f"{field.get('fieldname')} as `{field.get('fieldname')}`") + obj.get("_columns").append(field.get("fieldname")) + else: + child_table_field = field.get("child_table").get("fieldname") + _fn = field.get("fieldname").replace(f"{child_table_field}.", "", 1) + fn = f"{_fn} as `{_fn}`" + # fn = f"{_fn} as `{field.get('fieldname')}`" + if obj.get("children").get(child_table_field): + obj["children"][child_table_field].get("columns").append(fn) + obj["children"][child_table_field].get("_columns").append(_fn) + else: + obj["children"][child_table_field] = { + "columns": [fn], + "_columns": [_fn], + "info": field.get("child_table"), + } + return obj - skip, limit= 0, 100 - while True: - rows = frappe.get_list( - report_doc.ref_doctype, - fields=fields_info.get('columns'), - filters=filters, - order_by=report_doc.order_by if report_doc.order_by else None, - start=skip, - page_length=limit - ) - results = DocTypeInfo.create_data(rows, fields_info, report_doc.repeat_parent_data) - res_data = [] - csv_buffer = StringIO() - csv_writer = csv.writer(csv_buffer) - for result in results: - # res_data.append([f"`{result.get(field.get('fieldname'), '')}`" for field in fields]) - csv_writer.writerow([f"{result.get(field.get('fieldname'), '') if result.get(field.get('fieldname'), '') else ''}" for field in fields]) - yield csv_buffer.getvalue() - csv_buffer.seek(0) - csv_buffer.truncate(0) + def create_data(rows, fields, repeat_parent=False): + print("repeat_parent", repeat_parent) + obj, index, res_data = fields, 1, [] + table_multiselect = [ + obj.get("children").get(child_table_name) + for child_table_name in obj.get("children") + if obj.get("children").get(child_table_name).get("info").get("fieldtype") == "Table MultiSelect" + ] + tables = [ + obj.get("children").get(child_table_name) + for child_table_name in obj.get("children") + if obj.get("children").get(child_table_name).get("info").get("fieldtype") != "Table MultiSelect" + ] + + for row in rows: + row.id = index + index = index + 1 + _rows = [] + for child_table in table_multiselect: + ct_info = child_table.get("info") + ct_columns = child_table.get("columns") + _ct_columns = child_table.get("_columns") + # print(ct_info.get('options')) + # records = frappe.db.sql(f"select * from `tab{ct_info.get('options')}` where parent = '{row.name}' and parenttype = '{ct_info.get('parenttype')}'") + records = frappe.get_list( + ct_info.get("options"), + fields=ct_columns, + filters={"parent": row.name, "parenttype": ct_info.get("parenttype")}, + ignore_permissions=True, + ) + if len(_ct_columns): + k = _ct_columns[0] + row[f"{ct_info.get('fieldname')}.{k}"] = ",".join([record[k] for record in records]) + _rows.append(row) + for child_table in tables: + ct_info = child_table.get("info") + ct_columns = child_table.get("columns") + _ct_columns = child_table.get("_columns") + records = frappe.get_list( + ct_info.get("options"), + fields=ct_columns, + filters={"parent": row.name, "parenttype": ct_info.get("parenttype")}, + ignore_permissions=True, + ) + # row[child_table] = records + for i, record in enumerate(records): + if len(_rows) < (i + 1): + index = index + 1 + if repeat_parent: + _r = copy.deepcopy(row) + _r.update({"id": index}) + _rows.append(_r) + else: + _rows.append({"id": index}) + for k in _ct_columns: + # print("data:",ct_info,k) + _rows[i][f"{ct_info.get('fieldname')}.{k}"] = record.get(k, None) + res_data.extend(_rows) + # print("res_data",res_data) + return res_data + + def write_csv_data(report_doc, fields, fields_info, filters): + headers = [field.get("label") for field in fields] + csv_buffer = StringIO() + csv_writer = csv.writer(csv_buffer) + csv_writer.writerow(headers) + yield csv_buffer.getvalue() + csv_buffer.seek(0) + csv_buffer.truncate(0) + + skip, limit = 0, 100 + while True: + rows = frappe.get_list( + report_doc.ref_doctype, + fields=fields_info.get("columns"), + filters=filters, + order_by=report_doc.order_by if report_doc.order_by else None, + start=skip, + page_length=limit, + ) + results = DocTypeInfo.create_data(rows, fields_info, report_doc.repeat_parent_data) + csv_buffer = StringIO() + csv_writer = csv.writer(csv_buffer) + for result in results: + # res_data.append([f"`{result.get(field.get('fieldname'), '')}`" for field in fields]) + csv_writer.writerow( + [ + f"{result.get(field.get('fieldname'), '') if result.get(field.get('fieldname'), '') else ''}" + for field in fields + ] + ) + yield csv_buffer.getvalue() + csv_buffer.seek(0) + csv_buffer.truncate(0) + + if len(results) < limit: + break + skip = skip + limit + + def validate_skip_limit(skip, limit): + try: + skip = int(skip) + limit = int(limit) + except (ValueError, TypeError): + skip = 0 + limit = 20 + return skip, limit - if len(results) < limit: - break - skip = skip + limit - def validate_skip_limit(skip, limit): - try: - skip = int(skip) - limit = int(limit) - except (ValueError, TypeError): - skip = 0 - limit = 20 - return skip, limit + def get_data(doc_type, doc_name, filters=None, skip=0, limit=20, csv_export="0", debug=False): + # return "doc_name" + if filters is None: + filters = [] + report_doc = frappe.get_doc(doc_type, doc_name) + fields = DocTypeInfo.prepare_fields(report_doc) + fields_info = DocTypeInfo.get_fields_info(fields) + skip, limit = DocTypeInfo.validate_skip_limit(skip, limit) - def get_data(doc_type, doc_name,filters=[], skip=0, limit=20,csv_export='0',debug=False): - # return "doc_name" - report_doc = frappe.get_doc(doc_type, doc_name) - fields = DocTypeInfo.prepare_fields(report_doc) - fields_info = DocTypeInfo.get_fields_info(fields) - skip, limit = DocTypeInfo.validate_skip_limit(skip, limit) + if report_doc.ref_doctype is not None: + if csv_export == "1": + response = Response( + DocTypeInfo.write_csv_data(report_doc, fields, fields_info, filters), + content_type="text/csv", + ) + response.http_status_code = 200 + response.headers["Content-Disposition"] = f"attachment; filename={doc_type.lower()}.csv" + return response + else: + results, count = [], 0 + count_res = frappe.get_list( + report_doc.ref_doctype, fields=["count(name) as count"], filters=filters + ) + if len(count_res): + count = count_res[0].count + rows = frappe.get_list( + report_doc.ref_doctype, + fields=fields_info.get("columns"), + filters=filters, + order_by=report_doc.order_by if report_doc.order_by else None, + start=skip, + page_length=limit, + ) + results = DocTypeInfo.create_data(rows, fields_info, report_doc.repeat_parent_data) + return { + "filters": [ + { + "label": field.get("label"), + "name": field.get("label"), + "fieldname": field.get("fieldname"), + "fieldtype": field.get("fieldtype"), + "options": field.get("options"), + } + for field in report_doc.filters + ], + "report_doc": report_doc, + "fields_info": fields_info, + "columns": [ + { + "label": field.get("label"), + "name": field.get("label"), + "fieldname": field.get("fieldname"), + "key": field.get("fieldname"), + "fieldtype": field.get("fieldtype"), + "options": field.get("options"), + } + for field in fields + ], + "data": results, + "total_records": count, + } + else: + return "Invalid" - if report_doc.ref_doctype is not None: - if csv_export == "1": - response = Response(DocTypeInfo.write_csv_data(report_doc,fields, fields_info, filters), content_type='text/csv') - response.http_status_code = 200 - response.headers["Content-Disposition"] = f"attachment; filename={doc_type.lower()}.csv" - return response - else: - results, count = [], 0 - count_res = frappe.get_list(report_doc.ref_doctype,fields=["count(name) as count"],filters=filters) - if len(count_res): - count = count_res[0].count - rows = frappe.get_list( - report_doc.ref_doctype, - fields=fields_info.get('columns'), - filters=filters, - order_by=report_doc.order_by if report_doc.order_by else None, - start=skip, - page_length=limit - ) - results = DocTypeInfo.create_data(rows, fields_info,report_doc.repeat_parent_data) - return { - 'filters':[ - { - "label":field.get('label'), - "name":field.get('label'), - "fieldname":field.get('fieldname'), - "fieldtype":field.get('fieldtype'), - "options":field.get('options') - } for field in report_doc.filters - ], - 'report_doc':report_doc, - 'fields_info':fields_info, - 'columns':[{ - "label":field.get('label'), - "name":field.get('label'), - "fieldname":field.get('fieldname'), - "key":field.get('fieldname'), - "fieldtype":field.get('fieldtype'), - "options":field.get('options') - } for field in fields - ], - 'data':results, - 'total_records':count - } - else: - return "Invalid" - def get_data_old(doc_type, doc_name,filters=[], skip=0, limit=20,csv_export='1',debug=False ): - report_doc = frappe.get_doc(doc_type, doc_name) - fields = DocTypeInfo.prepare_fields(report_doc) - # print("fields",fields,report_doc) - with_query = DocTypeInfo.prepare_base_query(report_doc.ref_doctype,fields,report_doc.filters, filters) - # print("with_query",with_query) - # return with_query - if csv_export != '1': - count=DocTypeInfo.get_total(with_query, skip) - results=DocTypeInfo.get_result(with_query, skip, limit) - return { - 'filters':[ - { - "label":field.get('label'), - "name":field.get('label'), - "fieldname":field.get('fieldname'), - "fieldtype":field.get('fieldtype'), - "options":field.get('options') - } for field in report_doc.filters - ], - 'columns':[{ - "label":field.get('label'), - "name":field.get('label'), - "fieldname":field.get('fieldname'), - "fieldtype":field.get('fieldtype'), - "options":field.get('options') - } for field in fields], - 'data':results, - 'total_records':count - } - else: - return DocTypeInfo.export_csv(doc_type, with_query) \ No newline at end of file + def get_data_old(doc_type, doc_name, filters=None, skip=0, limit=20, csv_export="1", debug=False): + if filters is None: + filters = [] + report_doc = frappe.get_doc(doc_type, doc_name) + fields = DocTypeInfo.prepare_fields(report_doc) + # print("fields",fields,report_doc) + with_query = DocTypeInfo.prepare_base_query( + report_doc.ref_doctype, fields, report_doc.filters, filters + ) + # print("with_query",with_query) + # return with_query + if csv_export != "1": + count = DocTypeInfo.get_total(with_query, skip) + results = DocTypeInfo.get_result(with_query, skip, limit) + return { + "filters": [ + { + "label": field.get("label"), + "name": field.get("label"), + "fieldname": field.get("fieldname"), + "fieldtype": field.get("fieldtype"), + "options": field.get("options"), + } + for field in report_doc.filters + ], + "columns": [ + { + "label": field.get("label"), + "name": field.get("label"), + "fieldname": field.get("fieldname"), + "fieldtype": field.get("fieldtype"), + "options": field.get("options"), + } + for field in fields + ], + "data": results, + "total_records": count, + } + else: + return DocTypeInfo.export_csv(doc_type, with_query) diff --git a/myojana/sva_report/controllers/get_report_data.py b/myojana/sva_report/controllers/get_report_data.py index e67a764..c1f9c4b 100644 --- a/myojana/sva_report/controllers/get_report_data.py +++ b/myojana/sva_report/controllers/get_report_data.py @@ -2,17 +2,23 @@ # For license information, please see license.txt import frappe + # from sva_report.utils.filter import Filter # from sva_report.utils.doc_type_info import DocTypeInfo from myojana.sva_report.controllers.doc_type_info import DocTypeInfo + @frappe.whitelist() -def execute(doc,filters=[],skip=0, limit=10,csv_export=0,debug=None): - # print("doc",doc) - res= DocTypeInfo.get_data('SVA Report',doc, filters,skip, limit,csv_export, debug ) - return res +def execute(doc, filters=None, skip=0, limit=10, csv_export=0, debug=None): + # print("doc",doc) + if filters is None: + filters = [] + res = DocTypeInfo.get_data("SVA Report", doc, filters, skip, limit, csv_export, debug) + return res + + @frappe.whitelist() -def get_fields(doc, section='0'): - # res = DocTypeInfo.get_data('SVA Report',doc, filters,skip, limit,csv_export, debug ) - res = DocTypeInfo.get_fields(doc,fields=[], section=section) - return res \ No newline at end of file +def get_fields(doc, section="0"): + # res = DocTypeInfo.get_data('SVA Report',doc, filters,skip, limit,csv_export, debug ) + res = DocTypeInfo.get_fields(doc, fields=[], section=section) + return res diff --git a/myojana/sva_report/controllers/get_report_list.py b/myojana/sva_report/controllers/get_report_list.py index b0f4937..01a4058 100644 --- a/myojana/sva_report/controllers/get_report_list.py +++ b/myojana/sva_report/controllers/get_report_list.py @@ -1,5 +1,6 @@ import frappe + @frappe.whitelist() def get_report_list(): - return frappe.get_list('SVA Report') + return frappe.get_list("SVA Report") diff --git a/myojana/sva_report/doctype/report_list/report_list.js b/myojana/sva_report/doctype/report_list/report_list.js index 348f237..cf1e4de 100644 --- a/myojana/sva_report/doctype/report_list/report_list.js +++ b/myojana/sva_report/doctype/report_list/report_list.js @@ -1,166 +1,164 @@ - let filters_data; function fetchAndRenderData(frm, limit, filters) { - frappe.call({ - method: "myojana.sva_report.controllers.get_report_data.execute", - args: { - doc: frm.doc.name, - limit: limit, - filters: filters, - }, - callback: function (response) { - if (response.message) { - renderDataTable(response.message); - filters_data = response.message.filters - buttion(frm) - } else { - console.error("Error fetching data from API."); - } - } - }); + frappe.call({ + method: "myojana.sva_report.controllers.get_report_data.execute", + args: { + doc: frm.doc.name, + limit: limit, + filters: filters, + }, + callback: function (response) { + if (response.message) { + renderDataTable(response.message); + filters_data = response.message.filters; + buttion(frm); + } else { + console.error("Error fetching data from API."); + } + }, + }); } frappe.ui.form.on("Report List", { - refresh(frm) { - // to hide unwanted buttons - // $('.standard-actions').hide(); - // - - if (!frm.is_new() == 1) { - console.log("frm.is_new()",frm.is_new()); - $('.standard-actions').hide(); - fetchAndRenderData(frm, {}); - DataExportButton(frm) - } + refresh(frm) { + // to hide unwanted buttons + // $('.standard-actions').hide(); + // - frm.add_custom_button('Filter', () => { - frappe.prompt( - filter_fields = filters_data?.map(fltr => ({ - fieldname: fltr.fieldname, - fieldtype: fltr.fieldtype, - label: fltr.label, - options: fltr.options, - default: fltr.default || '' - })) || [], - function (values) { - let appliedFilters = {}; - filter_fields.forEach(filter => { - appliedFilters[filter.fieldname] = values[filter.fieldname]; - }); - fetchAndRenderData(frm, {}, appliedFilters); - }, - __('Apply') - ); - }); + if (!frm.is_new() == 1) { + console.log("frm.is_new()", frm.is_new()); + $(".standard-actions").hide(); + fetchAndRenderData(frm, {}); + DataExportButton(frm); + } - } + frm.add_custom_button("Filter", () => { + const filter_fields = + filters_data?.map((fltr) => ({ + fieldname: fltr.fieldname, + fieldtype: fltr.fieldtype, + label: fltr.label, + options: fltr.options, + default: fltr.default || "", + })) || []; + frappe.prompt( + filter_fields, + function (values) { + let appliedFilters = {}; + filter_fields.forEach((filter) => { + appliedFilters[filter.fieldname] = values[filter.fieldname]; + }); + fetchAndRenderData(frm, {}, appliedFilters); + }, + __("Apply") + ); + }); + }, }); - function renderDataTable(e) { - Total(e.total_records, e.data.length) - let columns = e.columns.map(function (coloum) { - return `${coloum.label}` - }) - let data = e.data.map(function (row) { - let rowData = []; - for (let column of e.columns) { - rowData.push(row[column.fieldname]); - } - return rowData; - }); - let datatable = new frappe.DataTable("#list", { - columns: columns, - data: data, - width: '80%', - }); - datatable.refresh(); + Total(e.total_records, e.data.length); + let columns = e.columns.map(function (coloum) { + return `${coloum.label}`; + }); + let data = e.data.map(function (row) { + let rowData = []; + for (let column of e.columns) { + rowData.push(row[column.fieldname]); + } + return rowData; + }); + let datatable = new frappe.DataTable("#list", { + columns: columns, + data: data, + width: "80%", + }); + datatable.refresh(); } function Total(total_count = 0, page_count = 0) { - let buttonsHTML = ` + let buttonsHTML = `
    Total esult ${total_count}
    `; - // document.getElementById("total").innerHTML = buttonsHTML; + // document.getElementById("total").innerHTML = buttonsHTML; } function buttion(frm) { - let buttonsHTML = ` + let buttonsHTML = ` `; - document.getElementById("button").innerHTML = buttonsHTML; - function removeActiveClass() { - let buttons = document.querySelectorAll("#button button"); - buttons.forEach(button => { - button.style.backgroundColor = ''; - button.style.color = ''; - }); - } + document.getElementById("button").innerHTML = buttonsHTML; + function removeActiveClass() { + let buttons = document.querySelectorAll("#button button"); + buttons.forEach((button) => { + button.style.backgroundColor = ""; + button.style.color = ""; + }); + } - document.getElementById("limit20").addEventListener("click", function () { - removeActiveClass(); - this.style.backgroundColor = 'rgb(249,248,249)'; - this.style.color = 'black'; - fetchAndRenderData(frm, 20); - }); - document.getElementById("limit100").addEventListener("click", function () { - removeActiveClass(); - this.style.backgroundColor = 'rgb(249,248,249)'; - this.style.color = 'black'; - fetchAndRenderData(frm, 100); - }); - document.getElementById("limit500").addEventListener("click", function () { - removeActiveClass(); - this.style.backgroundColor = 'rgb(249,248,249)'; - this.style.color = 'black'; - fetchAndRenderData(frm, 500); - }); - document.getElementById("limit1000").addEventListener("click", function () { - removeActiveClass(); - this.style.backgroundColor = 'rgb(249,248,249)'; - this.style.color = 'black'; - fetchAndRenderData(frm, 1000); - }); + document.getElementById("limit20").addEventListener("click", function () { + removeActiveClass(); + this.style.backgroundColor = "rgb(249,248,249)"; + this.style.color = "black"; + fetchAndRenderData(frm, 20); + }); + document.getElementById("limit100").addEventListener("click", function () { + removeActiveClass(); + this.style.backgroundColor = "rgb(249,248,249)"; + this.style.color = "black"; + fetchAndRenderData(frm, 100); + }); + document.getElementById("limit500").addEventListener("click", function () { + removeActiveClass(); + this.style.backgroundColor = "rgb(249,248,249)"; + this.style.color = "black"; + fetchAndRenderData(frm, 500); + }); + document.getElementById("limit1000").addEventListener("click", function () { + removeActiveClass(); + this.style.backgroundColor = "rgb(249,248,249)"; + this.style.color = "black"; + fetchAndRenderData(frm, 1000); + }); } - function DataExportButton(frm) { - frm.add_custom_button(__('Export'), function () { - const a = document.createElement('a'); - a.href = `/api/method/myojana.sva_report.controllers.get_report_data.execute?doc=${frm.doc.name}&csv_export=1`; - a.target = '_blank'; // Open link in new tab - a.download = ''; // This attribute triggers the download - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - }); + frm.add_custom_button(__("Export"), function () { + const a = document.createElement("a"); + a.href = `/api/method/myojana.sva_report.controllers.get_report_data.execute?doc=${frm.doc.name}&csv_export=1`; + a.target = "_blank"; // Open link in new tab + a.download = ""; // This attribute triggers the download + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }); } function downloadTableAsCSV(data, filename) { - var csv = convertToCSV(data); - var blob = new Blob([csv], { type: 'text/csv' }); - var link = document.createElement("a"); - link.href = window.URL.createObjectURL(blob); - link.download = filename; - document.body.appendChild(link); - link.click(); + var csv = convertToCSV(data); + var blob = new Blob([csv], { type: "text/csv" }); + var link = document.createElement("a"); + link.href = window.URL.createObjectURL(blob); + link.download = filename; + document.body.appendChild(link); + link.click(); } function convertToCSV(data) { - var csv = ''; - var headers = Object.keys(data[0]); - csv += headers.join(',') + '\n'; - data.forEach(function (row) { - var values = headers.map(function (header) { - return row[header]; - }); - csv += values.join(',') + '\n'; - }); - return csv; + var csv = ""; + var headers = Object.keys(data[0]); + csv += headers.join(",") + "\n"; + data.forEach(function (row) { + var values = headers.map(function (header) { + return row[header]; + }); + csv += values.join(",") + "\n"; + }); + return csv; } diff --git a/myojana/sva_report/doctype/sva_report/sva_report.js b/myojana/sva_report/doctype/sva_report/sva_report.js index d7b20c7..1a8d8cb 100644 --- a/myojana/sva_report/doctype/sva_report/sva_report.js +++ b/myojana/sva_report/doctype/sva_report/sva_report.js @@ -1,155 +1,161 @@ // Copyright (c) 2023, Rahul Sah and contributors // For license information, please see license.txt -var fields = [] -var checked_data = [] -var new_checked_data = [] +var fields = []; +var checked_data = []; +var new_checked_data = []; // Calling APIs Common function function callAPI(options) { - return new Promise((resolve, reject) => { - frappe.call({ - ...options, - callback: async function (response) { - resolve(response?.message || response?.value) - } - }); - }) + return new Promise((resolve, reject) => { + frappe.call({ + ...options, + callback: async function (response) { + resolve(response?.message || response?.value); + }, + }); + }); } async function arrangeFields(fields, checked_data = []) { - const groupedFields = {}; - // await fields.forEach(field => { - // const doctype = field.doc_type || 'default'; - // if (!groupedFields[doctype]) groupedFields[doctype] = []; - // groupedFields[doctype].push(field); - // }); - // return Object.entries(groupedFields).flatMap(([doctype, fields]) => [ - // { fieldname: `${doctype}_section_break`, fieldtype: "Section Break", label: `${doctype} Details` }, - // ...fields.map(field => { - // // field.label = `${field.label}${(field?.link_table?.label?' ('+field?.link_table?.label+')':'')}` - // if (checked_data.length > 0 && checked_data.includes(field.fieldname)) { - // return { - // fieldname: field.fieldname, fieldtype: "Check", label: field.label, ft: field.fieldtype, default: 1, onchange: (e) => { - // if (e.currentTarget.checked) { - // new_checked_data.push(field.fieldname) - // } else { - // new_checked_data = new_checked_data.filter((doc) => doc !== field.fieldname) - // } - // console.log(new_checked_data) - // } - // } - // } else { - // return { - // fieldname: field.fieldname, fieldtype: "Check", label: field.label, ft: field.fieldtype, default: 0, onchange: (e) => { - // if (e.currentTarget.checked) { - // if (!new_checked_data.includes(field.fieldname)) { - // new_checked_data.push(field.fieldname) - // } - // } else { - // new_checked_data = new_checked_data.filter((doc) => doc !== field.fieldname) - // } - // } - // } - // } - // }) - // ]); - return [...fields.map(field => { - // field.label = `${field.label}${(field?.link_table?.label?' ('+field?.link_table?.label+')':'')}` - if(["Section Break",'Tab Break'].includes(field.fieldtype)){ - if(!field.label){ - console.log(field); - } - return { fieldname: `${field.fieldname}_section_break`, fieldtype: "Section Break", label: `${field.label ? field.label:''}` }; - } - return { - fieldname: field.fieldname, - fieldtype: "Check", - label: field.label, - ft: field.fieldtype, - default: (checked_data.length > 0 && checked_data.includes(field.fieldname)), - onchange: (e) => { - if (e.currentTarget.checked) { - new_checked_data.push(field.fieldname) - } else { - new_checked_data = new_checked_data.filter((doc) => doc !== field.fieldname) - } - } - } - })] + const groupedFields = {}; + // await fields.forEach(field => { + // const doctype = field.doc_type || 'default'; + // if (!groupedFields[doctype]) groupedFields[doctype] = []; + // groupedFields[doctype].push(field); + // }); + // return Object.entries(groupedFields).flatMap(([doctype, fields]) => [ + // { fieldname: `${doctype}_section_break`, fieldtype: "Section Break", label: `${doctype} Details` }, + // ...fields.map(field => { + // // field.label = `${field.label}${(field?.link_table?.label?' ('+field?.link_table?.label+')':'')}` + // if (checked_data.length > 0 && checked_data.includes(field.fieldname)) { + // return { + // fieldname: field.fieldname, fieldtype: "Check", label: field.label, ft: field.fieldtype, default: 1, onchange: (e) => { + // if (e.currentTarget.checked) { + // new_checked_data.push(field.fieldname) + // } else { + // new_checked_data = new_checked_data.filter((doc) => doc !== field.fieldname) + // } + // console.log(new_checked_data) + // } + // } + // } else { + // return { + // fieldname: field.fieldname, fieldtype: "Check", label: field.label, ft: field.fieldtype, default: 0, onchange: (e) => { + // if (e.currentTarget.checked) { + // if (!new_checked_data.includes(field.fieldname)) { + // new_checked_data.push(field.fieldname) + // } + // } else { + // new_checked_data = new_checked_data.filter((doc) => doc !== field.fieldname) + // } + // } + // } + // } + // }) + // ]); + return [ + ...fields.map((field) => { + // field.label = `${field.label}${(field?.link_table?.label?' ('+field?.link_table?.label+')':'')}` + if (["Section Break", "Tab Break"].includes(field.fieldtype)) { + if (!field.label) { + console.log(field); + } + return { + fieldname: `${field.fieldname}_section_break`, + fieldtype: "Section Break", + label: `${field.label ? field.label : ""}`, + }; + } + return { + fieldname: field.fieldname, + fieldtype: "Check", + label: field.label, + ft: field.fieldtype, + default: checked_data.length > 0 && checked_data.includes(field.fieldname), + onchange: (e) => { + if (e.currentTarget.checked) { + new_checked_data.push(field.fieldname); + } else { + new_checked_data = new_checked_data.filter( + (doc) => doc !== field.fieldname + ); + } + }, + }; + }), + ]; } frappe.ui.form.on("SVA Report", { - refresh(frm) { - - }, - map_columns: async (frm) => { - if (!fields.length) { - fields = await callAPI({ - method: 'myojana.sva_report.controllers.get_report_data.get_fields', - args: { - doc: frm.doc.ref_doctype, - section:'1' - }, - freeze_message: __("Getting fields..."), - }) - } - checked_data = await callAPI({ - method: 'myojana.sva_report.controllers.child_table_crud.get_all_child_doc', - args: { - doctype: "Report Column", - parent: frm.doc.name, - parentfield: "columns", - parenttype: "SVA Report", - }, - freeze_message: __("Getting fields..."), - }) - if (checked_data.length > 0) { - new_checked_data = [...checked_data] - } - const arrangedFields = await arrangeFields(fields, checked_data); - let dialog_fields = [...arrangedFields] - var d = new frappe.ui.Dialog({ - 'title': "Fields", - 'fields': dialog_fields, - primary_action: async function (obj) { - const checked_docs = d?.fields - ?.filter(field => new_checked_data?.includes(field?.fieldname)) - ?.sort((a, b) => { - const indexA = new_checked_data.indexOf(a.fieldname); - const indexB = new_checked_data.indexOf(b.fieldname); - return indexA - indexB; - }); - await callAPI({ - method: 'myojana.sva_report.controllers.child_table_crud.delete_all_child_doc', - args: { - doctype: "Report Column", - parent: frm.doc.name, - parentfield: "columns", - parenttype: "SVA Report", - }, - freeze_message: __("Mapping columns..."), - }) - if (checked_docs.length > 0) { - await checked_docs?.forEach(async (doc, index) => { - await callAPI({ - method: 'myojana.sva_report.controllers.child_table_crud.insert_child_doc', - args: { - doctype: "Report Column", - parent: frm.doc.name, - parentfield: "columns", - parenttype: "SVA Report", - fieldname: doc.fieldname, - label: doc.label, - fieldtype: doc.ft, - idx: index + 1 - }, - freeze_message: __("Mapping columns..."), - }) - }); - } - d.hide(); - checked_data = [] - new_checked_data = [] - frm.debounced_reload_doc(); - } - }); - d.show(); - } + refresh(frm) {}, + map_columns: async (frm) => { + if (!fields.length) { + fields = await callAPI({ + method: "myojana.sva_report.controllers.get_report_data.get_fields", + args: { + doc: frm.doc.ref_doctype, + section: "1", + }, + freeze_message: __("Getting fields..."), + }); + } + checked_data = await callAPI({ + method: "myojana.sva_report.controllers.child_table_crud.get_all_child_doc", + args: { + doctype: "Report Column", + parent: frm.doc.name, + parentfield: "columns", + parenttype: "SVA Report", + }, + freeze_message: __("Getting fields..."), + }); + if (checked_data.length > 0) { + new_checked_data = [...checked_data]; + } + const arrangedFields = await arrangeFields(fields, checked_data); + let dialog_fields = [...arrangedFields]; + var d = new frappe.ui.Dialog({ + title: "Fields", + fields: dialog_fields, + primary_action: async function (obj) { + const checked_docs = d?.fields + ?.filter((field) => new_checked_data?.includes(field?.fieldname)) + ?.sort((a, b) => { + const indexA = new_checked_data.indexOf(a.fieldname); + const indexB = new_checked_data.indexOf(b.fieldname); + return indexA - indexB; + }); + await callAPI({ + method: "myojana.sva_report.controllers.child_table_crud.delete_all_child_doc", + args: { + doctype: "Report Column", + parent: frm.doc.name, + parentfield: "columns", + parenttype: "SVA Report", + }, + freeze_message: __("Mapping columns..."), + }); + if (checked_docs.length > 0) { + await checked_docs?.forEach(async (doc, index) => { + await callAPI({ + method: "myojana.sva_report.controllers.child_table_crud.insert_child_doc", + args: { + doctype: "Report Column", + parent: frm.doc.name, + parentfield: "columns", + parenttype: "SVA Report", + fieldname: doc.fieldname, + label: doc.label, + fieldtype: doc.ft, + idx: index + 1, + }, + freeze_message: __("Mapping columns..."), + }); + }); + } + d.hide(); + checked_data = []; + new_checked_data = []; + frm.debounced_reload_doc(); + }, + }); + d.show(); + }, }); diff --git a/myojana/utils/__init__.py b/myojana/utils/__init__.py index b6456a1..71352b8 100644 --- a/myojana/utils/__init__.py +++ b/myojana/utils/__init__.py @@ -1,2 +1,3 @@ import sys + print(sys.path) diff --git a/myojana/utils/after_install.py b/myojana/utils/after_install.py index 13d3af2..b72bc62 100644 --- a/myojana/utils/after_install.py +++ b/myojana/utils/after_install.py @@ -1,29 +1,31 @@ import frappe + + class AfterInstall: - def set_favicons(): - update_favicon = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Website Settings" AND field = "favicon";""" - frappe.db.sql(update_favicon, as_dict=True) + def set_favicons(): + update_favicon = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Website Settings" AND field = "favicon";""" + frappe.db.sql(update_favicon, as_dict=True) - def set_website_logo(): - update_website_logo = """UPDATE tabSingles SET value = "images/mYojana-remove.png" WHERE doctype = "Website Settings" AND field = "app_logo";""" - frappe.db.sql(update_website_logo, as_dict=True) + def set_website_logo(): + update_website_logo = """UPDATE tabSingles SET value = "images/mYojana-remove.png" WHERE doctype = "Website Settings" AND field = "app_logo";""" + frappe.db.sql(update_website_logo, as_dict=True) - def set_navbar_logo(): - update_app_logo = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Navbar Settings" AND field = "app_logo";""" - frappe.db.sql(update_app_logo, as_dict=True) + def set_navbar_logo(): + update_app_logo = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Navbar Settings" AND field = "app_logo";""" + frappe.db.sql(update_app_logo, as_dict=True) - def set_splash_image(): - update_splash_image = """UPDATE tabSingles SET value = "/images/mYojana-remove.png" WHERE doctype = "Website Settings" AND field = "splash_image";""" - frappe.db.sql(update_splash_image, as_dict=True) + def set_splash_image(): + update_splash_image = """UPDATE tabSingles SET value = "/images/mYojana-remove.png" WHERE doctype = "Website Settings" AND field = "splash_image";""" + frappe.db.sql(update_splash_image, as_dict=True) - def set_brand_logo(): - update_website_brand_image = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Website Settings" AND field = "banner_image";""" - frappe.db.sql(update_website_brand_image, as_dict=True) + def set_brand_logo(): + update_website_brand_image = """UPDATE tabSingles SET value = "/images/favicon.png" WHERE doctype = "Website Settings" AND field = "banner_image";""" + frappe.db.sql(update_website_brand_image, as_dict=True) - def set_app_name(): - set_app_name = """UPDATE tabSingles SET value = "mYojana" WHERE doctype = "Website Settings" AND field = "app_name";""" - frappe.db.sql(set_app_name, as_dict=True) + def set_app_name(): + set_app_name = """UPDATE tabSingles SET value = "mYojana" WHERE doctype = "Website Settings" AND field = "app_name";""" + frappe.db.sql(set_app_name, as_dict=True) - def set_navbar_setting(): - update_home_page = """UPDATE tabSingles SET value = "/app" WHERE doctype = "Website Settings" AND field = "home_page";""" - frappe.db.sql(update_home_page, as_dict=True) + def set_navbar_setting(): + update_home_page = """UPDATE tabSingles SET value = "/app" WHERE doctype = "Website Settings" AND field = "home_page";""" + frappe.db.sql(update_home_page, as_dict=True) diff --git a/myojana/utils/cache.py b/myojana/utils/cache.py index fd8fb7a..d3c4967 100644 --- a/myojana/utils/cache.py +++ b/myojana/utils/cache.py @@ -1,71 +1,72 @@ -import frappe import ast -class Cache: - def dict_to_sql_where_clause(conditions, table_name = None, op="AND"): - """ - Convert a dictionary to an SQL WHERE clause with OR conditions. +import frappe + + +class Cache: + def dict_to_sql_where_clause(conditions, table_name=None, op="AND"): + """ + Convert a dictionary to an SQL WHERE clause with OR conditions. - :param conditions: A dictionary containing conditions in the form of {'key': ['value1', 'value2', ...], ...} - :return: A string representing the SQL WHERE clause with OR conditions. - """ - where_clauses = [] + :param conditions: A dictionary containing conditions in the form of {'key': ['value1', 'value2', ...], ...} + :return: A string representing the SQL WHERE clause with OR conditions. + """ + where_clauses = [] - for key, values in conditions.items(): - # Check if there's only one value for the current key - if len(values) == 1: - # Create a condition for the single value - if table_name: - where_clauses.append(f"{table_name}.{key} = '{values[0]}'") - else: - where_clauses.append(f"{key} = '{values[0]}'") - else: - # Create an IN condition for multiple values - val = [f"'{value}'" for value in values] - if(table_name): - in_clause = f"{table_name+'.'+key} IN ({', '.join(val)})" - else: - in_clause = f"{key} IN ({', '.join(val)})" - where_clauses.append(in_clause) + for key, values in conditions.items(): + # Check if there's only one value for the current key + if len(values) == 1: + # Create a condition for the single value + if table_name: + where_clauses.append(f"{table_name}.{key} = '{values[0]}'") + else: + where_clauses.append(f"{key} = '{values[0]}'") + else: + # Create an IN condition for multiple values + val = [f"'{value}'" for value in values] + if table_name: + in_clause = f"{table_name+'.'+key} IN ({', '.join(val)})" + else: + in_clause = f"{key} IN ({', '.join(val)})" + where_clauses.append(in_clause) - # Combine all conditions with OR - where_clause = f" {op} ".join(where_clauses) + # Combine all conditions with OR + where_clause = f" {op} ".join(where_clauses) - return where_clause + return where_clause - def get_user_permission(cond_str=True,table=None): - usr = frappe.session.user - # getting myojan setting and mapping of state and district - mapper_docs = frappe.db.sql(""" + def get_user_permission(cond_str=True, table=None): + usr = frappe.session.user + # getting myojan setting and mapping of state and district + mapper_docs = frappe.db.sql( + """ SELECT doctypes , field_name FROM `tabSetting Doctype Child` - """,as_dict=True) - # print("myojana_setting_child:",myojana_setting_child) - mapperObj = {} - for doc in mapper_docs: - mapperObj[doc.doctypes] = doc.field_name - # getting the list of user permission list - permission_list = frappe.db.get_list('User Permission', - filters={ - 'user': usr - }, - fields=['allow', 'for_value'], - ignore_permissions=True - ) - # print("permission_list",permission_list) - conditions = {} - for doc in permission_list: - if mapperObj[doc.allow] is not None: - # print(mapperObj[doc.allow]) - if conditions.get(mapperObj[doc.allow], None) is not None: - conditions[mapperObj[doc.allow]].append(f"{doc.for_value}") - else: - conditions[mapperObj[doc.allow]] = [f"{doc.for_value}"] - new_conditions = {} - if cond_str: - new_conditions = Cache.dict_to_sql_where_clause(conditions, table) - else: - for field_name in conditions: - new_conditions[field_name] = ["IN",conditions[field_name]] - return new_conditions \ No newline at end of file + """, + as_dict=True, + ) + # print("myojana_setting_child:",myojana_setting_child) + mapperObj = {} + for doc in mapper_docs: + mapperObj[doc.doctypes] = doc.field_name + # getting the list of user permission list + permission_list = frappe.db.get_list( + "User Permission", filters={"user": usr}, fields=["allow", "for_value"], ignore_permissions=True + ) + # print("permission_list",permission_list) + conditions = {} + for doc in permission_list: + if mapperObj[doc.allow] is not None: + # print(mapperObj[doc.allow]) + if conditions.get(mapperObj[doc.allow], None) is not None: + conditions[mapperObj[doc.allow]].append(f"{doc.for_value}") + else: + conditions[mapperObj[doc.allow]] = [f"{doc.for_value}"] + new_conditions = {} + if cond_str: + new_conditions = Cache.dict_to_sql_where_clause(conditions, table) + else: + for field_name in conditions: + new_conditions[field_name] = ["IN", conditions[field_name]] + return new_conditions diff --git a/myojana/utils/htmltoimg.py b/myojana/utils/htmltoimg.py index f28e659..612639f 100644 --- a/myojana/utils/htmltoimg.py +++ b/myojana/utils/htmltoimg.py @@ -1,17 +1,26 @@ import frappe import imgkit + def create_image(ben_id): - # Retrieve the document based on the Beneficiary ID - doc = frappe.get_doc("Beneficiary Profiling", ben_id) + # Retrieve the document based on the Beneficiary ID + doc = frappe.get_doc("Beneficiary Profiling", ben_id) - # Get organization details if available - if doc.custom_which_organization_do_you_want_to_be_part_of or doc.custom_which_organization_are_you_part_of: - org = doc.custom_which_organization_do_you_want_to_be_part_of or doc.custom_which_organization_are_you_part_of - org_details = frappe.db.get_value("Org Signature", org, ['logo', 'email', 'signature', 'name'], as_dict=True) + # Get organization details if available + if ( + doc.custom_which_organization_do_you_want_to_be_part_of + or doc.custom_which_organization_are_you_part_of + ): + org = ( + doc.custom_which_organization_do_you_want_to_be_part_of + or doc.custom_which_organization_are_you_part_of + ) + org_details = frappe.db.get_value( + "Org Signature", org, ["logo", "email", "signature", "name"], as_dict=True + ) - # Adjusted HTML and CSS content - html_content = f''' + # Adjusted HTML and CSS content + html_content = f""" @@ -94,7 +103,7 @@ def create_image(ben_id):

    Membership Card

    - +
    Member Photo
    @@ -107,7 +116,7 @@ def create_image(ben_id): Blood Group: {doc.custom_blood_group}
    Location: {doc.address_with_landmark} - +

    Note: This membership card is issued with your knowledge and consent. If you do not agree, please email at {org_details['email']}

    @@ -118,12 +127,12 @@ def create_image(ben_id): - ''' + """ - # Convert HTML to image with fixed size - options = { - 'width': 447, - 'height': 273, - } + # Convert HTML to image with fixed size + options = { + "width": 447, + "height": 273, + } - return imgkit.from_string(html_content, 'output_image.png', options=options) + return imgkit.from_string(html_content, "output_image.png", options=options) diff --git a/myojana/utils/misc.py b/myojana/utils/misc.py index 5ff0c0a..67a3fcc 100644 --- a/myojana/utils/misc.py +++ b/myojana/utils/misc.py @@ -1,55 +1,57 @@ import frappe + class Misc: - @staticmethod - def rules_to_filters(rules, obj=False): - filters = [] - if rules is not None and len(rules): - groups = {} - for rule in rules: - if groups.get(rule.group) is None: - groups[rule.group] = [ - [rule.rule_field, rule.operator, f"{rule.data}"] - ] - else: - groups[rule.group].append([rule.rule_field, rule.operator, f"{rule.data}"]) - if obj: - return groups - for key in groups.keys(): - filters.append(groups[key]) - return filters - @staticmethod - def create_condition(rules=[], queries_groups=False): - conditions = [] - if rules is not None and len(rules): - groups = {} - gIndex = 0 - for rule in rules: - # if not rule.group: - # gIndex += 1 - # groups[f"G{gIndex}"] = [f"{rule.rule_field} {rule.operator} '{rule.data}'"] - if groups.get(rule.group) is None: - groups[rule.group] = [f"{rule.rule_field} {rule.operator} '{rule.data}'"] - else: - groups[rule.group].append(f"{rule.rule_field} {rule.operator} '{rule.data}'") - for key in groups.keys(): - conditions.append(f"({' AND '.join(groups[key])})") - if queries_groups: - return conditions - return f"({' OR '.join(conditions)})" if len(conditions) else "" - @staticmethod - def scheme_rules_to_condition(scheme, queries_groups=False): - """ - Converts scheme rules into SQL conditions. + @staticmethod + def rules_to_filters(rules, obj=False): + filters = [] + if rules is not None and len(rules): + groups = {} + for rule in rules: + if groups.get(rule.group) is None: + groups[rule.group] = [[rule.rule_field, rule.operator, f"{rule.data}"]] + else: + groups[rule.group].append([rule.rule_field, rule.operator, f"{rule.data}"]) + if obj: + return groups + for key in groups.keys(): + filters.append(groups[key]) + return filters - Args: - scheme (str): Name of the scheme. - queries_groups (bool, optional): If True, returns conditions grouped by queries. Defaults to False. + @staticmethod + def create_condition(rules=None, queries_groups=False): + if rules is None: + rules = [] + conditions = [] + if rules is not None and len(rules): + groups = {} + for rule in rules: + # if not rule.group: + # gIndex += 1 + # groups[f"G{gIndex}"] = [f"{rule.rule_field} {rule.operator} '{rule.data}'"] + if groups.get(rule.group) is None: + groups[rule.group] = [f"{rule.rule_field} {rule.operator} '{rule.data}'"] + else: + groups[rule.group].append(f"{rule.rule_field} {rule.operator} '{rule.data}'") + for key in groups.keys(): + conditions.append(f"({' AND '.join(groups[key])})") + if queries_groups: + return conditions + return f"({' OR '.join(conditions)})" if len(conditions) else "" - Returns: - str or list: SQL conditions or grouped conditions based on the queries_groups flag. - """ - sql = f""" + @staticmethod + def scheme_rules_to_condition(scheme, queries_groups=False): + """ + Converts scheme rules into SQL conditions. + + Args: + scheme (str): Name of the scheme. + queries_groups (bool, optional): If True, returns conditions grouped by queries. Defaults to False. + + Returns: + str or list: SQL conditions or grouped conditions based on the queries_groups flag. + """ + sql = """ select _tsc.rule_field, _tsc.operator, @@ -62,5 +64,5 @@ def scheme_rules_to_condition(scheme, queries_groups=False): where _ts.name_of_the_scheme = %s """ - rules = frappe.db.sql(sql, (scheme), as_dict=True) - return Misc.create_condition(rules, queries_groups) + rules = frappe.db.sql(sql, (scheme), as_dict=True) + return Misc.create_condition(rules, queries_groups) diff --git a/myojana/utils/report_filter.py b/myojana/utils/report_filter.py index e459e2d..7606ccb 100644 --- a/myojana/utils/report_filter.py +++ b/myojana/utils/report_filter.py @@ -1,54 +1,56 @@ import frappe + # from myojana.utils.filter import Filter from myojana.utils.cache import Cache + class ReportFilter: - def set_report_filters(filters=None, date_column='creation', str=False, table_name=None, role_per_filter=True): - cond_str = Cache.get_user_permission(True,table_name) - new_filters = {} - str_list = [] - if table_name: - date_column = f"{table_name}.{date_column}" - if filters is None: - return new_filters - if filters.from_date and filters.to_date: - if str: - str_list.append( - f"({date_column} between '{filters.from_date}' AND '{filters.to_date}')") - else: - new_filters[date_column] = ["between", [ - filters.from_date, filters.to_date]] - elif filters.from_date: - if str: - str_list.append(f"({date_column} >= '{filters.from_date}')") - else: - new_filters[date_column] = [">=", filters.from_date] - elif filters.to_date: - if str: - str_list.append(f"({date_column} <= '{filters.to_date}')") - else: - new_filters[date_column] = ["<=", filters.to_date] + def set_report_filters( + filters=None, date_column="creation", str=False, table_name=None, role_per_filter=True + ): + cond_str = Cache.get_user_permission(True, table_name) + new_filters = {} + str_list = [] + if table_name: + date_column = f"{table_name}.{date_column}" + if filters is None: + return new_filters + if filters.from_date and filters.to_date: + if str: + str_list.append(f"({date_column} between '{filters.from_date}' AND '{filters.to_date}')") + else: + new_filters[date_column] = ["between", [filters.from_date, filters.to_date]] + elif filters.from_date: + if str: + str_list.append(f"({date_column} >= '{filters.from_date}')") + else: + new_filters[date_column] = [">=", filters.from_date] + elif filters.to_date: + if str: + str_list.append(f"({date_column} <= '{filters.to_date}')") + else: + new_filters[date_column] = ["<=", filters.to_date] - for filter_key in filters: - if filter_key not in ['from_date', 'to_date']: - if str: - if table_name: - str_list.append(f"({table_name}.{filter_key}='{filters[filter_key]}')") - else: - str_list.append(f"({filter_key}='{filters[filter_key]}')") - else: - new_filters[filter_key] = filters[filter_key] + for filter_key in filters: + if filter_key not in ["from_date", "to_date"]: + if str: + if table_name: + str_list.append(f"({table_name}.{filter_key}='{filters[filter_key]}')") + else: + str_list.append(f"({filter_key}='{filters[filter_key]}')") + else: + new_filters[filter_key] = filters[filter_key] - if role_per_filter and ("Administrator" not in frappe.get_roles(frappe.session.user)): - per_obj = Cache.get_user_permission(False) - # # query_filter = Filter.set_query_filters(True) - # csc_key = f"{table_name}.{query_filter[0]}" if table_name else f"{query_filter[0]}" - if str and len(cond_str) > 0: - str_list.append(cond_str) - else: - "" - # new_filters[csc_key] = f"'{query_filter[1]}'" - if str: - return ' AND '.join(str_list) - else: - return new_filters + if role_per_filter and ("Administrator" not in frappe.get_roles(frappe.session.user)): + Cache.get_user_permission(False) + # # query_filter = Filter.set_query_filters(True) + # csc_key = f"{table_name}.{query_filter[0]}" if table_name else f"{query_filter[0]}" + if str and len(cond_str) > 0: + str_list.append(cond_str) + else: + "" + # new_filters[csc_key] = f"'{query_filter[1]}'" + if str: + return " AND ".join(str_list) + else: + return new_filters