629 lines
175 KiB
JSON
629 lines
175 KiB
JSON
[
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Workspace",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 21:19:46.116635",
|
||
"module": "Asset Lite",
|
||
"name": "Asset Workspace",
|
||
"script": "frappe.ui.form.on('Workspace', {\r\n onload: function(frm) {\r\n \r\n // Get the current user's roles\r\n frappe.ready(function() {\r\n // Get the current user's roles\r\n const user_roles = frappe.user.get_roles();\r\n\r\n // Hide all shortcut cards initially\r\n $('.shortcut-card').hide();\r\n\r\n // Show blocks based on user roles\r\n \r\n\r\n \r\n\r\n if (user_roles.includes('Finance Manager')) { // Replace with actual role names\r\n $('#procurement-custom-block').show();\r\n }\r\n\r\n if (user_roles.includes('Finance Manager')) { // Replace with actual role names\r\n $('#procurement-custom-block').show();\r\n }\r\n});\r\n \r\n }\r\n \r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 16:30:44.059835",
|
||
"module": "Asset Lite",
|
||
"name": "Work Job Order",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n asset_type: function (frm) {\n if(frm.doc.asset_type === \"Non Biomedical\"){\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"Sub Contractor\" \n }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"General WOA\" \n }\n };\n });\n // apply_contractor_filter(frm);\n }\n else{\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n filters: { }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n filters: {}\n };\n });\n }\n \n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.custom_site_contractor){\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\n }\n \n if (frm.doc.asset_type === 'Non Biomedical') {\n // Show all work order types\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {custom_biomedical: 0} \n };\n });\n } else {\n // Only show work order types where custom_biomedical is checked\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 1\n }\n };\n });\n }\n\n // Optionally clear previously selected work_order_type if it doesn’t match filter\n frm.set_value(\"work_order_type\", null);\n },\n site_name(frm){\n if(frm.doc.site_name){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n custom_site: frm.doc.site_name,\n company:frm.doc.company\n }\n };\n });\n }\n // if(frm.dic.asset_type === \"Non Biomedical\"){\n // apply_contractor_filter(frm);\n // }\n },\n company(frm){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n company:frm.doc.company\n }\n };\n });\n },\n department(frm){\n if(frm.doc.department){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n department:frm.doc.department,\n company:frm.doc.company\n }\n };\n });\n }\n },\n refresh(frm){\n if(!frappe.user.has_role(\"System Manager\")){\n $(\".form-assignments\").hide();\n }\n\t\t\n\t\n if(frm.doc.department){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n department:frm.doc.department,\n company:frm.doc.company\n }\n };\n });\n }\n if(frm.doc.asset_type === \"Non Biomedical\"){\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"Sub Contractor\" \n }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"General WOA\" \n }\n };\n });\n // apply_contractor_filter(frm);\n }\n \n frm.set_query(\"company\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n \n \n if(frm.doc.site_name){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n custom_site: frm.doc.site_name,\n company:frm.doc.company\n }\n };\n });\n }else{\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n company:frm.doc.company\n }\n };\n });\n }\n \n \n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.custom_site_contractor){\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\n }\n \n if (frm.doc.asset_type === 'Non Biomedical') {\n // Show all work order types\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 0\n \n }\n };\n });\n } else {\n // Only show work order types where custom_biomedical is checked\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 1\n }\n };\n });\n }\n\n \n if (!frm.doc.failure_date) {\n // frm.set_value('failure_date', frappe.datetime.now_datetime());\n let now = frappe.datetime.now_datetime(); // This is usually UTC\n // let local_now = frappe.datetime.convert_to_system_timezone(now);\n let local_now = frappe.datetime.get_datetime_as_string();\n console.log(local_now)\n frm.set_value('failure_date', local_now);\n }\n \n // // Roles allowed to edit the field\n // const allowed_roles = [\"System Manager\", \"Maintenance Manager\"];\n // const user_roles = frappe.user_roles;\n \n // console.log(user_roles)\n\n // const is_only_end_user = (\n // user_roles.includes(\"End user\") && !user_roles.includes(\"System Manager\") && !user_roles.includes(\"Maintenance Manager\")\n // // user_roles.every(role => role === \"End user\")\n // );\n // console.log(is_only_end_user)\n\n // // Make field read-only if user has only End User role\n // frm.set_df_property(\"failure_date\", \"read_only\", is_only_end_user);\n \n // const is_only_phcc_end_user = (\n // user_roles.includes(\"PHCC End User\") && !user_roles.includes(\"System Manager\") && !user_roles.includes(\"PHCC Site Manager\")\n // // user_roles.every(role => role === \"End user\")\n // );\n // console.log(is_only_phcc_end_user)\n\n // // Make field read-only if user has only End User role\n // frm.set_df_property(\"failure_date\", \"read_only\", is_only_phcc_end_user);\n \n const user_roles = frappe.user_roles || [];\n \n // Roles that are allowed to edit\n const editable_roles = [\"System Manager\", \"Maintenance Manager\", \"PHCC Site Manager\"];\n \n // Helper to check if user has any of the editable roles\n const has_edit_permission = editable_roles.some(role => user_roles.includes(role));\n \n // Check if user has only \"End user\" or only \"PHCC End User\", and no editable roles\n const is_restricted_user =\n (user_roles.includes(\"End user\") || user_roles.includes(\"PHCC End User\") ||user_roles.includes(\"Technician\")) &&\n !has_edit_permission;\n \n // Set \"failure_date\" as read-only based on restriction\n frm.set_df_property(\"failure_date\", \"read_only\", is_restricted_user);\n \n frappe.call({\n method: \"frappe.client.get\",\n args: {\n doctype: \"User\",\n name: frappe.session.user,\n },\n callback: function (r) {\n if (r.message) {\n const site_name = r.message.custom_site_name || \"\";\n \n frm.set_query(\"department\", function () {\n // Base filter\n let base_filters = [[\"Department\", \"company\", \"=\", frm.doc.company]];\n \n // If site name starts with \"Mobile\", exclude Bio departments\n if(site_name){\n if (site_name.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n if(frm.doc.company){\n if (frm.doc.company.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n \n \n return {\n filters: base_filters\n };\n });\n }\n }\n });\n\n \n // frm.set_query(\"asset\", function() {\n // console.log(\"Asset Id\")\n // return {\n // filters: {\n // company: frm.doc.company\n // }\n // };\n // });\n \n frm.fields_dict['stock_items'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {\n var child = locals[cdt][cdn];\n console.log(child)\n return { \n filters:[\n [\"custom_hospital_name\",'=',frm.doc.company],\n [\"is_stock_item\", \"=\", 1]\n \n ]\n }\n }\n\n \n frm.fields_dict['invoice_table'].grid.get_field('purchase_invoice').get_query = function(doc, cdt, cdn) {\n var child = locals[cdt][cdn];\n console.log(child)\n return { \n filters:[\n [\"custom_work_order\",'=',frm.doc.name]\n \n ]\n }\n }\n \n// frappe.db.get_list('Material Request', {\n// fields: ['name'],\n// filters: {\n// custom_work_orders: frm.doc.name\n// },\n// limit:500\n// }).then(records => {\n// console.log(records);\n// var list =[]\n// for(var i in records){\n// list.push(records[i].name)\n// }\n// console.log(list);\n// \t\tfrm.fields_dict['invoice_table'].grid.get_field('purchase_invoice').get_query = function(doc, cdt, cdn) {\n// var child = locals[cdt][cdn];\n// console.log(child)\n// return { \n// filters:[\n// [\"purchase_request\",'in',list]\n \n// ]\n// }\n// }\n// })\n \n if(frm.doc.workflow_state==\"Pending Approval\"){\n frm.set_df_property(\"repair_status\", \"options\", [\"Open\", \"Work In Progress\",\"Pending Review\",\"Completed\",\"Cancelled\",\"Closed\"]);\n frm.refresh_field(\"repair_status\")\n }\n else{\n frm.set_df_property(\"repair_status\", \"options\", [\"Open\", \"Work In Progress\",\"Pending Review\",\"Cancelled\",\"Closed\"]);\n frm.refresh_field(\"repair_status\")\n }\n \n /* if (frm.doc.docstatus === 0) { // Only for Draft status\n // Ensure connections are defined in the dashboard and set allow_add\n if (frm.dashboard && frm.dashboard.links) {\n frm.dashboard.links.forEach(link => {\n link.allow_add = true; // Explicitly enable + Add button\n });\n \n // Full refresh to apply changes\n frm.dashboard.show();\n }\n }*/\n \n // if (frm.is_new()) {\n \n // frm.set_value(\"aseet_id\", frm.doc.asset)\n \n // frm.refresh_field('aseet_id')\n // // frm.set_value(\"asset\", \"\")\n // // frm.set_value(\"asset\", frm.doc.asset);\n // frm.set_value(\"asset\", frm.doc.aseet_id)\n // console.log(frm.doc.asset)\n // console.log(frm.doc.aseet_id)\n // }\n if (frm.is_new() && frm.doc.asset) {\n let asset_value = frm.doc.asset;\n \n frm.set_value(\"asset\", \"\"); // Clear the field\n frm.refresh_field(\"asset\");\n \n // Slight delay to ensure re-setting triggers fetch logic\n setTimeout(() => {\n frm.set_value(\"asset\", asset_value); // Re-enter the original value\n frm.refresh_field(\"asset\");\n }, 10);\n }\n\n \n \n\n \n \n checkboxcolour(frm)\n \n // if(frm.doc.asset&&frm.doc.workflow_state==\"Draft\"){\n if(frm.doc.asset){\n\t frappe.db.get_doc('Asset', frm.doc.asset)\n .then(doc => {\n const today = new Date();\n console.log(today)\n \n \n if(frm.doc.custom_start_date && frm.doc.custom_end_date){\n var warrantyStart = new Date(frm.doc.custom_start_date)\n var warrantyEnd = new Date(frm.doc.custom_end_date)\n if (warrantyStart && warrantyEnd) {\n if (warrantyStart <= today && today <= warrantyEnd) {\n if(frm.doc.custom_service_agreement == \"Warranty\"){\n frm.dashboard.add_comment(__(\"<i>This Asset has an Active Warranty Service Agreement!</i>\"),\"green\",true);\n }\n else if(frm.doc.custom_service_agreement == \"Contract\"){\n frm.dashboard.add_comment(__(\"<i>This Asset has an Active Contract Service Agreement!</i>\"),\"green\",true);\n }\n else if(frm.doc.custom_service_agreement == \"Frame Work\"){\n frm.dashboard.add_comment(__(\"<i>This Asset has an Active Frame Work Service Agreement!</i>\"),\"green\",true);\n }\n }\n else if (today > warrantyEnd){\n frm.dashboard.add_comment(__(\"<i>This Asset's warranty has expired!</i>\"),\"yellow\",true);\n }\n }\n }\n })\n \n // if(frm.doc.asset&&frm.doc.workflow_state==\"Draft\"){\n\t // frappe.db.get_doc('Asset', frm.doc.asset)\n // .then(doc => {\n // const today = new Date();\n // console.log(today)\n \n \n // if(doc.custom_warranty == 1&&frm.doc.workflow_state==\"Draft\"){\n // var warrantyStart = new Date(doc.custom_warranty_start_date)\n // var warrantyEnd = new Date(doc.custom_warranty_end_date)\n // if (warrantyStart && warrantyEnd) {\n // if (warrantyStart <= today && today <= warrantyEnd) {\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active warranty!</i>\"),\"green\",true);\n // }\n // else if (today > warrantyEnd){\n // frm.dashboard.add_comment(__(\"<i>This Asset's warranty has expired!</i>\"),\"yellow\",true);\n // }\n // else {\n\t\t // frm.dashboard.add_comment(__(\"<i>This Asset's warranty period is yet to start!</i>\"),\"blue\",true);\n // \t\t }\n // }\n // }\n // else{\n // frm.dashboard.add_comment(__(\"<i>No warranty found for this Asset!</i>\"),\"red\",true);\n // }\n // if(doc.custom_support_plan&&frm.doc.workflow_state==\"Draft\"){\n // frappe.db.get_doc('Support Plans', doc.custom_support_plan)\n // .then(sp_doc => {\n // if(doc.custom__service_contract == 1){\n // console.log(\"ASC\")\n // var serviceStart = new Date(doc.custom_service_contract_start)\n // var serviceEnd = new Date(doc.custom_service_contract_end)\n // console.log(serviceStart)\n // console.log(serviceEnd)\n \n // if (serviceStart && serviceEnd) {\n // if (serviceStart <= today && today <= serviceEnd && doc.custom_covering_spare_parts == 1 && doc.custom_covering_labour == 0 && doc.custom_ppm_only == 0 && doc.custom_spare_parts_labour == 0) {\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active Comprehensive Service Contract. Please contact this Vendor {0}</i>\",[sp_doc.vendor]),\"green\",true);\n // }\n // else if (serviceStart <= today && today <= serviceEnd && doc.custom_covering_spare_parts == 0 && doc.custom_covering_labour == 0 && doc.custom_ppm_only == 1 && doc.custom_spare_parts_labour == 0) {\n // console.log(\"spare parts wirh ASC\")\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active Service Contract with PPM only. Please contact this Vendor {0}</i>\",[sp_doc.vendor]),\"blue\",true);\n\t\n \n // }\n // else if (serviceStart <= today && today <= serviceEnd && doc.custom_covering_spare_parts == 0 && doc.custom_covering_labour == 0 && doc.custom_ppm_only == 0 && doc.custom_spare_parts_labour == 1) {\n // console.log(\"spare parts wirh ASC\")\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active Service Contract with Spare parts and Labour. Please contact this Vendor {0}</i>\",[sp_doc.vendor]),\"blue\",true);\n\t\n \n // }\n // else if (serviceStart <= today && today <= serviceEnd && doc.custom_covering_spare_parts == 0 && doc.custom_covering_labour == 1 && doc.custom_ppm_only == 0 && doc.custom_spare_parts_labour == 0) {\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active Service Contract with Covering Of Labour. Please contact this Vendor {0}</i>\",[sp_doc.vendor]),\"blue\",true);\n \n // }\n // else if (serviceStart <= today && today <= serviceEnd && doc.custom_covering_spare_parts == 0 && doc.custom_covering_labour == 0 && doc.custom_spare_parts_labour == 0 && doc.custom_ppm_only == 0) {\n // frm.dashboard.add_comment(__(\"<i>This Asset has an Active Service Contract!. Please contact this Vendor {0}</i>\",[sp_doc.vendor]),\"green\",true);\n \n // }\n // else if (today > serviceEnd){\n // frm.dashboard.add_comment(__(\"<i>This Asset's Service Contract has expired!</i>\"),\"yellow\",true);\n // }\n \n \n // }\n // }\n \n // else{\n // frm.dashboard.add_comment(__(\"<i>No Service Contract found for this Asset!</i>\"),\"red\",true);\n // }\n // })\n // }\n // else{\n // frm.dashboard.add_comment(__(\"<i>No Service Contract found for this Asset!</i>\"),\"red\",true);\n // }\n \n \n \n // })\n \n }\n },\n \n \n onload: function (frm,cdt,cdn) {\n // if(frm.dic.asset_type === \"Non Biomedical\"){\n // apply_contractor_filter(frm);\n // }\n \n },\n before_submit:function(frm,cdt,cdn){\n calculate_total_hours(frm)\n },\n before_workflow_action:function(frm){\n if(frm.selected_workflow_action === 'Accept'){\n console.log(\"Accept\")\n calculate_total_hours(frm)\n frm.set_value(\"job_completed\", \"Yes\")\n frm.set_value(\"completion_date\", frappe.datetime.now_datetime());\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n // else if(frm.doc.repair_status == \"Completed\" || frm.doc.repair_status == \"Closed\"){\n // console.log(\"Completed\")\n // frm.set_value(\"job_completed\", \"Yes\")\n // frm.set_value(\"completion_date\", frappe.datetime.now_datetime());\n // frm.refresh_field('job_completed')\n // frm.refresh_field('completion_date')\n // }\n else if(frm.doc.repair_status == \"Work In Progress\"&&(frm.doc.first_responded_on==''||frm.doc.first_responded_on==undefined)){\n frm.set_value(\"first_responded_on\", frappe.datetime.now_datetime());\n frm.refresh_field('first_responded_on')\n }\n // else{\n // console.log(\"Nothing\")\n // frm.set_value(\"job_completed\", \"No\")\n // frm.set_value(\"completion_date\", \"\");\n // frm.refresh_field('job_completed')\n // frm.refresh_field('completion_date')\n // }\n // calculate_total_hours(frm)\n },\n // asset(frm){\n \n // const today = new Date();\n // console.log(today)\n // frappe.db.get_doc('Asset', frm.doc.asset).then(asset_doc => {\n // if(asset_doc.custom_warranty){\n // // Convert form fields to Date objects\n // const warrantyStart = asset_doc.custom_warranty_start_date ? new Date(asset_doc.custom_warranty_start_date) : null;\n // const warrantyEnd = asset_doc.custom_warranty_end_date ? new Date(asset_doc.custom_warranty_end_date) : null;\n \n // if (warrantyStart && warrantyEnd) {\n // if (warrantyStart <= today && today <= warrantyEnd) {\n // frm.set_value('warranty', 1);\n // } else {\n // frm.set_value('warranty', 0);\n // }\n // }\n // }\n // if(asset_doc.custom__service_contract == 1){\n // // Convert form fields to Date objects\n // const serviceStart = asset_doc.custom_service_contract_start ? new Date(asset_doc.custom_service_contract_start) : null;\n // const serviceEnd = asset_doc.custom_service_contract_end ? new Date(asset_doc.custom_service_contract_end) : null;\n \n // if (serviceStart && serviceEnd) {\n // if (serviceStart <= today && today <= serviceEnd) {\n // frm.set_value('service_contract', 1);\n // frm.set_value('covering_spare_parts', asset_doc.custom_covering_spare_parts);\n // frm.set_value('covering_labour',asset_doc.custom_covering_labour);\n // frm.set_value('ppm_only',asset_doc.custom_ppm_only);\n // frm.set_value('spare_parts_labour',asset_doc.custom_spare_parts_labour);\n // } else {\n // frm.set_value('service_contract', 0);\n // frm.set_value('covering_spare_parts', 0);\n // frm.set_value('covering_labour', 0);\n // frm.set_value('ppm_only',0);\n // frm.set_value('spare_parts_labour',0)\n // }\n // }\n // }\n // })\n // checkboxcolour(frm)\n // },\n work_order_type(frm){\n filterTechniciansBasedOnManagerAndExpertise(frm)\n },\n \n spare_parts: function(frm) {\n if (frm.doc.asset) {\n // Fetch spare parts data from the selected Asset\n frappe.db.get_doc('Asset', frm.doc.asset).then(asset_doc => {\n if (asset_doc.custom_spare_parts) {\n \n frm.clear_table(\"table_cmqp\");\n\n // Loop through the spare parts in Asset and add them to the Work Order\n asset_doc.custom_spare_parts.forEach(function(d) {\n let row = frm.add_child(\"table_cmqp\");\n row.item_code = d.item_code;\n row.item_name = d.item_name;\n row.qty = d.qty;\n row.rate = d.rate;\n row.amount = d.amount;\n });\n\n frm.refresh_field(\"table_cmqp\");\n }\n });\n } else {\n \n frm.clear_table(\"table_cmqp\");\n frm.refresh_field(\"table_cmqp\");\n }\n },\n repair_status(frm){\n if(frm.doc.repair_status == \"Completed\" || frm.doc.repair_status == \"Closed\"){\n frm.set_value(\"job_completed\", \"Yes\")\n frm.set_value(\"completion_date\", frappe.datetime.now_datetime());\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n else if(frm.doc.repair_status == \"Work In Progress\"){\n frm.set_value(\"first_responded_on\", frappe.datetime.now_datetime());\n frm.refresh_field('first_responded_on')\n }\n else{\n frm.set_value(\"job_completed\", \"No\")\n frm.set_value(\"completion_date\", \"\");\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n },\n before_save(frm){\n if(frm.doc.repair_status == \"Completed\" || frm.doc.repair_status == \"Closed\"){\n frm.set_value(\"job_completed\", \"Yes\")\n frm.set_value(\"completion_date\", frappe.datetime.now_datetime());\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n else if(frm.doc.repair_status == \"Work In Progress\"&&(frm.doc.first_responded_on==''||frm.doc.first_responded_on==undefined)){\n frm.set_value(\"first_responded_on\", frappe.datetime.now_datetime());\n frm.refresh_field('first_responded_on')\n }\n else{\n frm.set_value(\"job_completed\", \"No\")\n frm.set_value(\"completion_date\", \"\");\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n frappe.db.get_list('Asset Maintenance Team', {\n fields: ['maintenance_manager'],\n filters: {\n custom_expertise: frm.doc.work_order_type\n },\n limit:500\n }).then(records => {\n console.log(records);\n frm.set_value('assigned_manager',records[0].maintenance_manager)\n frm.refresh_field('assigned_manager')\n })\n calculate_total_hours(frm)\n },\n after_save:function(frm){\n filterTechniciansBasedOnManagerAndExpertise(frm)\n },\n \n after_workflow_action(frm){\n\t if(frm.doc.workflow_state == \"Pending Purchase\"){\n\t frappe.route_options={\n\t\t\t \"custom_work_order\":frm.doc.name,\n\t\t\t \"asset\":frm.doc.asset,\n \n\t\t\t},\n frappe.set_route('Form','Material Request','new-material-request')\n\t }\n// \t if(frm.doc.workflow_state == \"Repair InProgress\"){\n// \t frappe.route_options={\n// \t\t\t \"custom_work_order\":frm.doc.name,\n// \t\t\t \"asset\":frm.doc.asset,\n \n// \t\t\t},\n// frappe.set_route('Form','Material Request','new-material-request')\n// \t }\n\t \n\t if(frm.doc.repair_status == \"Completed\" || frm.doc.repair_status == \"Closed\"){\n frm.set_value(\"job_completed\", \"Yes\")\n frm.set_value(\"completion_date\", frappe.datetime.now_datetime());\n frm.refresh_field('job_completed')\n frm.refresh_field('completion_date')\n }\n else if(frm.doc.repair_status == \"Work In Progress\"&&(frm.doc.first_responded_on==''||frm.doc.first_responded_on==undefined)){\n frm.set_value(\"first_responded_on\", frappe.datetime.now_datetime());\n frm.refresh_field('first_responded_on')\n }\n // else{\n // frm.set_value(\"job_completed\", \"No\")\n // frm.set_value(\"completion_date\", \"\");\n // frm.refresh_field('job_completed')\n // frm.refresh_field('completion_date')\n // }\n\t // calculate_total_hours(frm)\n\t},\n \n \n \n});\n\nfunction filterTechniciansBasedOnManagerAndExpertise(frm) {\n if (frm.doc.assigned_manager && frm.doc.work_order_type) {\n console.log(frm.doc.assigned_manager);\n \n // Fetch the Asset Maintenance Team document based on the assigned manager and expertise\n frappe.db.get_list('Asset Maintenance Team', {\n fields: ['name'],\n filters: {\n 'maintenance_manager': frm.doc.assigned_manager,\n 'custom_expertise': frm.doc.work_order_type\n },\n limit: 100\n }).then(records => {\n if (records.length > 0) {\n // Get the first matching document\n frappe.db.get_doc('Asset Maintenance Team', records[0].name)\n .then(rec => {\n console.log(rec);\n\n var table = rec.maintenance_team_members || [];\n var member_list = [];\n\n console.log(table);\n\n // Loop through the maintenance team members\n for (var j in table) {\n member_list.push(table[j].team_member);\n }\n\n console.log(member_list);\n\n // Set query for 'assigned_technician' field to filter by team members\n cur_frm.fields_dict['assigned_technician'].get_query = function(doc) {\n return {\n filters: {\n \"name\": ['in', member_list]\n }\n };\n };\n });\n\t\t}\n })\n }\n}\n\n\nfunction checkboxcolour(frm){\n if(frm.doc.service_contract == 1){\n frm.fields_dict.service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t \n\t if(frm.doc.warranty == 1){\n frm.fields_dict.warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t \n\t if(frm.doc.covering_labour == 1){\n frm.fields_dict.covering_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.covering_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t \n\t if(frm.doc.covering_spare_parts == 1){\n frm.fields_dict.covering_spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.covering_spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t if(frm.doc.ppm_only == 1){\n frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t if(frm.doc.spare_parts_labour == 1){\n frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n}\nfunction calculate_total_hours(frm) {\n console.log(\"Total HR\")\n if (frm.doc.first_responded_on && frm.doc.completion_date) {\n console.log(\"Inside Total HR\")\n let first_response = moment(frm.doc.first_responded_on);\n let completion = moment(frm.doc.completion_date);\n\n // Calculate difference in hours (including days)\n let diff_in_hours = completion.diff(first_response); // true for fractional hours\n\n // Convert the difference into hours (including days)\n let total_hours = diff_in_hours /(1000 * 60 * 60);\n console.log(total_hours)\n frm.set_value('total_hours_spent', total_hours);\n frm.refresh_field(\"total_hours_spent\")\n }\n}\n\nfrappe.ui.form.on('Asset Repair Consumed Item', {\n\tvaluation_rate:function(frm,cdt,cdn) {\n\t\tvar row = locals [cdt][cdn]\n\t\trow.total_value = row.consumed_quantity * row.valuation_rate\n\t\tfrm.refresh_field('stock_items');\n\t\t\n\t\t\n\t},\n\tconsumed_quantity:function(frm,cdt,cdn) {\n\t\tvar row = locals [cdt][cdn]\n\t\trow.total_value = row.consumed_quantity * row.valuation_rate\n\t\tfrm.refresh_field('stock_items');\n\t\t\n// \t\tcheck_stock_availability(frm);\n\t\t\n\t}\n})\n\n// // ✅ Function to check stock availability\n// function check_stock_availability(frm) {\n// frm.fields_dict[\"stock_items\"].grid.grid_rows.forEach(row => {\n// let item_code = row.doc.item_code;\n// let warehouse = row.doc.warehouse;\n// let required_qty = row.doc.consumed_quantity;\n\n// if (item_code && warehouse) {\n// frappe.call({\n// method: \"frappe.client.get_value\",\n// args: {\n// doctype: \"Bin\",\n// filters: { item_code: item_code, warehouse: warehouse },\n// fieldname: \"actual_qty\"\n// },\n// callback: function(r) {\n// if (r.message) {\n// let available_qty = r.message.actual_qty || 0;\n// let indicator_color = available_qty >= required_qty ? \"green\" : \"red\"; // Green if sufficient, Red if not\n// let indicator_html = `<span class=\"stock-indicator\"\n// style=\"display:inline-block; width:10px; height:10px; border-radius:50%;\n// background-color:${indicator_color}; margin-right:5px;\"></span>`;\n\n// // ✅ Insert Indicator Inside the Item Code Field\n// let $input = $(row.grid_form.fields_dict.item_code.wrapper).find(\"input\");\n\n// if ($input.length) {\n// $input.before(indicator_html);\n// }\n// }\n// }\n// });\n// }\n// });\n// }\n\n\n\nfrappe.ui.form.on('Asset Repair Consumed Item', {\n item_code: function(frm, cdt, cdn) {\n let row = locals[cdt][cdn]; // Get the clicked row\n\n if (frm.doc.company) {\n frappe.db.get_value(\"Company\", { name: frm.doc.company }, \"abbr\").then(r => {\n if (r.message && r.message.abbr) {\n // let abbr = r.message.abbr;\n // let warehouse = `Stores - ${abbr}`;\n\n // Set the warehouse field in the current row\n frappe.model.set_value(cdt, cdn, \"warehouse\", warehouse);\n frappe.db.get_value(\"Bin\", { item_code: row.item_code, warehouse: warehouse }, \"actual_qty\")\n .then(r => {\n let available_qty = (r.message && r.message.actual_qty) ? r.message.actual_qty : 0;\n frappe.model.set_value(cdt, cdn, \"custom_available_stock\", available_qty);\n });\n }\n });\n }\n \n if (row.item_code && row.warehouse) {\n frappe.db.get_value(\"Bin\", { item_code: row.item_code, warehouse: row.warehouse }, \"actual_qty\")\n .then(r => {\n let available_qty = (r.message && r.message.actual_qty) ? r.message.actual_qty : 0;\n frappe.model.set_value(cdt, cdn, \"custom_available_stock\", available_qty);\n });\n }\n },\n \n consumed_quantity: function(frm, cdt, cdn) {\n let row = locals[cdt][cdn];\n\n if (row.consumed_quantity && row.custom_available_stock !== undefined) {\n if (parseFloat(row.consumed_quantity) > parseFloat(row.custom_available_stock)) {\n frappe.msgprint({\n title: __(\"Insufficient Stock\"),\n message: __(`\n ❌ Insufficient stock for <b>${row.item_code}</b> in warehouse <b>${row.warehouse}</b>.<br>\n Available: <b>${row.custom_available_stock}</b>, Required: <b>${row.consumed_quantity}</b>.\n `),\n indicator: \"red\"\n });\n // frappe.model.set_value(cdt, cdn, \"consumed_quantity\", 0); // Reset to 0 if invalid\n }\n }\n }\n \n\n});\n// frappe.ui.form.on('Asset Repair Consumed Item', {\n// item_code: function(frm, cdt, cdn) {\n// let row = locals[cdt][cdn]; // Current row\n\n// if (row.item_code && frm.doc.company) {\n// frappe.db.get_doc(\"Item\", row.item_code).then(item_doc => {\n// let warehouse = null;\n\n// if (item_doc.item_defaults && item_doc.item_defaults.length > 0) {\n// let def = item_doc.item_defaults.find(d => d.company === frm.doc.company);\n// if (def && def.default_warehouse) {\n// warehouse = def.default_warehouse;\n// }\n// }\n\n// if (warehouse) {\n// frappe.model.set_value(cdt, cdn, \"warehouse\", warehouse);\n\n// // Fetch available stock from Bin\n// frappe.db.get_value(\"Bin\", { item_code: row.item_code, warehouse: warehouse }, \"actual_qty\")\n// .then(r2 => {\n// let available_qty = (r2.message && r2.message.actual_qty) ? r2.message.actual_qty : 0;\n// frappe.model.set_value(cdt, cdn, \"custom_available_stock\", available_qty);\n// });\n// }\n// });\n// }\n// },\n \n// consumed_quantity: function(frm, cdt, cdn) {\n// let row = locals[cdt][cdn];\n\n// if (row.consumed_quantity && row.custom_available_stock !== undefined) {\n// if (parseFloat(row.consumed_quantity) > parseFloat(row.custom_available_stock)) {\n// frappe.msgprint({\n// title: __(\"Insufficient Stock\"),\n// message: __(`\n// ❌ Insufficient stock for <b>${row.item_code}</b> in warehouse <b>${row.warehouse}</b>.<br>\n// Available: <b>${row.custom_available_stock}</b>, Required: <b>${row.consumed_quantity}</b>.\n// `),\n// indicator: \"red\"\n// });\n// }\n// }\n// }\n// });\n\n\n\n// function apply_contractor_filter(frm) {\n// if (!frm.doc.site_name) {\n// // No site selected → only filter by role\n// frm.set_query(\"custom_assign_to_contractor\", function() {\n// return {\n// query: \"frappe.core.doctype.user.user.user_query\",\n// filters: {\n// role: \"Sub Contractor\"\n// }\n// };\n// });\n// return;\n// }\n\n// // Step 1: Get all Users who have permission for this site\n// frappe.db.get_list(\"User Permission\", {\n// filters: {\n// allow: \"Mobile Team\",\n// for_value: frm.doc.site_name\n// },\n// fields: [\"user\"]\n// }).then(res => {\n// let allowed_users = res.map(r => r.user);\n\n// // Step 2: Apply filter (role + user restriction)\n// frm.set_query(\"custom_assign_to_contractor\", function() {\n// return {\n// query: \"frappe.core.doctype.user.user.user_query\",\n// filters: {\n// role: \"Sub Contractor\",\n// name: [\"in\", allowed_users.length ? allowed_users : [\"__none\"]] // avoid showing all users\n// }\n// };\n// });\n// });\n// }\n\n\n\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "PPM OF CT SCAN MACHINE",
|
||
"enabled": 1,
|
||
"modified": "2024-09-23 16:44:24.576470",
|
||
"module": "Asset Lite",
|
||
"name": "PPM CT SCAN",
|
||
"script": "frappe.ui.form.on('PPM OF CT SCAN MACHINE', {\n\t data: function (frm) {\n \n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.data, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.data);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table\");\n });\n });\n },\n \n refresh(frm){\n if(!frm.doc.month || !frm.doc.year){\n let today = new Date();\n \n let monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n \n let currentMonth = monthNames[today.getMonth()];\n let currentYear = today.getFullYear();\n \n frm.set_value('month', currentMonth);\n frm.set_value('year', currentYear);\n }\n \n if(!frm.doc.table){\n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.date, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.date);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table\");\n });\n });\n }\n }\n \n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "PPM OF MRI SCAN MACHINE",
|
||
"enabled": 1,
|
||
"modified": "2024-09-23 16:43:32.926352",
|
||
"module": "Asset Lite",
|
||
"name": "PPM OF MRI",
|
||
"script": "frappe.ui.form.on('PPM OF MRI SCAN MACHINE', {\n\t date: function (frm) {\n \n frm.clear_table('table_5');\n frappe.model.with_doc('PPM Templates', frm.doc.date, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.date);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table_5\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table_5\");\n });\n });\n },\n \n refresh(frm){\n if(!frm.doc.month || !frm.doc.year){\n let today = new Date();\n \n let monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n \n let currentMonth = monthNames[today.getMonth()];\n let currentYear = today.getFullYear();\n \n frm.set_value('month', currentMonth);\n frm.set_value('year', currentYear);\n }\n \n if(!frm.doc.table_5){\n frm.clear_table('table_5');\n frappe.model.with_doc('PPM Templates', frm.doc.date, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.date);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table_5\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table_5\");\n });\n });\n }\n }\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:37:43.304522",
|
||
"module": "Asset Lite",
|
||
"name": "Asset",
|
||
"script": "frappe.ui.form.on('Asset', {\n\trefresh: function(frm) {\n\t frm.set_query(\"company\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n\t \n\t frappe.call({\n method: \"frappe.client.get\",\n args: {\n doctype: \"User\",\n name: frappe.session.user,\n },\n callback: function (r) {\n if (r.message) {\n const site_name = r.message.custom_site_name || \"\";\n \n frm.set_query(\"department\", function () {\n // Base filter\n let base_filters = [[\"Department\", \"company\", \"=\", frm.doc.company]];\n \n // If site name starts with \"Mobile\", exclude Bio departments\n if(site_name){\n if (site_name.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n if(frm.doc.company){\n if (frm.doc.company.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n \n \n return {\n filters: base_filters\n };\n });\n }\n }\n });\n\t \n\t \n\t if (frm.doc.name && !frm.is_new()) {\n // Add Asset History Button\n if (!frm.doc.__islocal) {\n frm.add_custom_button(__('Asset History'), function() {\n let asset_id = frm.doc.name; // Get Asset ID\n let url = `/app/asset-history?asset=${asset_id}`; // Construct URL with Query Param\n window.location.href = url; // Redirect to Asset History Page\n }); \n }\n }\n \n // Add Asset PPM planner Button\n if (frm.doc.name && !frm.is_new())\n frm.add_custom_button(__('PPM Plan'), function() {\n let asset_id = frm.doc.name; // Get Asset ID\n let url = `/app/query-report/PPM%20Planner?asset=${asset_id}`; // Absolute Path\n window.location.href = url; // Redirect to Asset Planner\n });\n\n \n\t if (frm.doc.calculate_depreciation == 1 && frm.doc.finance_books.length == 0) {\n let child = frm.add_child(\"finance_books\");\n child.finance_book = \"Depreciation Entries\"; // Set default value (optional)\n child.depreciation_method = \"Straight Line\"; // Example of setting a default method\n child.total_number_of_depreciations = 10;\n child.frequency_of_depreciation = 12;\n \n child.salvage_value_percentage = 0;\n \n\n frm.refresh_field(\"finance_books\"); // Refresh the table to show the new row\n }\n\t \n\t \n\t checkboxcolour(frm)\n\t if(frm.doc.custom_warranty == 1){\n frm.fields_dict.custom_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // Green border\n });\n \t }\n \t else{\n \t frm.fields_dict.custom_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n \t }\n\t \n },\n \n custom_support_plan: function(frm) {\n checkboxcolour(frm)\n }\n})\n\n\nfrappe.ui.form.on('Spare Parts', {\n\t\trate:function(frm,cdt,cdn) {\n\t\tvar row = locals [cdt][cdn]\n\t\trow.amount = row.qty * row.rate\n\t\tfrm.refresh_field('custom_spare_parts');\n\t\tvar result =0\n\t\tvar data = frm.doc.custom_spare_parts\n\t\tfor(var i in data){\n\t result = result+data[i].amount\n\t frm.set_value('custom_total_spare_parts_amount',result)\n\t frm.refresh_field('custom_total_spare_parts_amount')\n\t\t}\n\t\t\n\t},\n\tqty:function(frm,cdt,cdn) {\n\t\tvar row = locals [cdt][cdn]\n\t\trow.amount = row.qty * row.rate\n\t\tfrm.refresh_field('custom_spare_parts');\n\t\tvar result =0\n\t\tvar data = frm.doc.custom_spare_parts\n\t\tfor(var i in data){\n\t result = result+data[i].amount\n\t frm.set_value('custom_total_spare_parts_amount',result)\n\t frm.refresh_field('custom_total_spare_parts_amount')\n\t\t}\n\t\t\n\t}\n})\n\nfunction checkboxcolour(frm){\n if(frm.doc.custom_warranty == 1){\n frm.fields_dict.custom_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t if(frm.doc.custom_extended_warranty == 1){\n frm.fields_dict.custom_extended_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_extended_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n \n \n \n if(frm.doc.custom__service_contract == 1){\n frm.fields_dict.custom__service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom__service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t \n\t if(frm.doc.custom_covering_spare_parts == 1){\n frm.fields_dict.custom_covering_spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_covering_spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t if(frm.doc.custom_spare_parts_labour == 1){\n frm.fields_dict.custom_spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t \n\t if(frm.doc.custom_covering_labour == 1){\n frm.fields_dict.custom_covering_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_covering_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n if(frm.doc.custom_ppm_only == 1){\n frm.fields_dict.custom_ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t else{\n\t frm.fields_dict.custom_ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n}",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:40:40.146413",
|
||
"module": "Asset Lite",
|
||
"name": "Asset Maintenance",
|
||
"script": "frappe.ui.form.on('Asset Maintenance', {\r\n refresh(frm){\r\n frm.set_query(\"company\", () => {\r\n return {\r\n filters: {\r\n domain:\"Healthcare\"\r\n }\r\n };\r\n });\r\n },\r\n \r\n onload: function(frm) {\r\n var custom_frequency = frm.doc.custom_frequency;\r\n console.log(custom_frequency)\r\n\r\n // Loop through the child table rows\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n // Set the value in the child_field for each row\r\n // frappe.model.set_value(row.doctype, row.name, 'periodicity', custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'maintenance_task', \"Maintenance Task\");\r\n });\r\n \r\n var startingDate = frm.doc.custom_starting_date;\r\n console.log(startingDate)\r\n\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n if (row.periodicity === 'Monthly') {\r\n // Set due_date as exact after one month from starting_date\r\n var dueDate = frappe.datetime.add_months(startingDate, 1);\r\n console.log(dueDate)\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', dueDate);\r\n }\r\n if (row.periodicity === 'Daily'){\r\n var daily = frappe.datetime.add_days(startingDate, 1);\r\n console.log(daily)\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', daily);\r\n }\r\n if (row.periodicity === 'Weekly'){\r\n var weekly = frappe.datetime.add_days(startingDate, 7);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', weekly);\r\n }\r\n if (row.periodicity === 'Quarterly'){\r\n var quat = frappe.datetime.add_months(startingDate, 3);\r\n console.log(quat)\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', quat);\r\n }\r\n if (row.periodicity === 'Yearly'){\r\n var year = frappe.datetime.add_months(startingDate, 12);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', year);\r\n }\r\n if (row.periodicity === '2 Yearly'){\r\n var year2 = frappe.datetime.add_months(startingDate, 24);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', year2);\r\n }\r\n });\r\n \r\n },\r\n // refresh(frm){\r\n // // if(frm.doc.asset_name){\r\n\t //// frappe.db.get_doc('Asset', frm.doc.asset_name)\r\n // // .then(doc => {\r\n // // console.log(doc)\r\n // // if(doc.includes_warranty){\r\n // // var start = new Date (doc.warranty_start)\r\n // // \t\t var end = new Date (doc.warranty_end)\r\n // // \t\t var today = new Date()\r\n // // \t\t if((today>start && today>end)&&frm.doc.status!='Expired'){\r\n\t\t //// frm.dashboard.add_comment(__(\"<i>This Asset's warranty has been expired!</i>\"),\"yellow\",true);\r\n // // \t\t }\r\n // // \t\t else if((today>=start && today<=end)&&frm.doc.status!='Expired'){\r\n\t\t //// frm.dashboard.add_comment(__(\"<i>This Asset has an Active warranty!</i>\"),\"green\",true);\r\n // // \t\t }\r\n // // \t\t else {\r\n\t\t //// frm.dashboard.add_comment(__(\"<i>This Asset's warranty period is yet to start!</i>\"),\"blue\",true);\r\n // // \t\t }\r\n // // }\r\n // // else{\r\n // // frm.dashboard.add_comment(__(\"<i>No warranty found for this Asset!</i>\"),\"red\",true);\r\n // // }\r\n // // })\r\n\t //// }\r\n // }\r\n});\r\nfrappe.ui.form.on('Asset Maintenance', {\r\n custom_frequency:function(frm){\r\n setfrequency(frm)\r\n \r\n },\r\n custom_starting_date(frm){\r\n setfrequency(frm)\r\n }\r\n \r\n})\r\n\r\nfunction setfrequency(frm){\r\n var startingDate = frm.doc.custom_starting_date;\r\n if(frm.doc.custom_frequency === \"Daily\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var dai = frappe.datetime.add_days(startingDate, 1);\r\n console.log(dai)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', dai);\r\n \r\n })\r\n }\r\n if(frm.doc.custom_frequency === \"Weekly\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var week = frappe.datetime.add_days(startingDate, 7);\r\n console.log(week)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', week);\r\n \r\n })\r\n }\r\n if(frm.doc.custom_frequency === \"Monthly\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var mon = frappe.datetime.add_months(startingDate, 1);\r\n console.log(mon)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', mon);\r\n \r\n })\r\n }\r\n if(frm.doc.custom_frequency === \"Quarterly\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var qa = frappe.datetime.add_months(startingDate, 3);\r\n console.log(qa)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', qa);\r\n })\r\n }\r\n if(frm.doc.custom_frequency === \"Yearly\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var year = frappe.datetime.add_months(startingDate, 12);\r\n console.log(year)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', year);\r\n })\r\n }\r\n if(frm.doc.custom_frequency === \"2 Yearly\"){\r\n $.each(frm.doc.asset_maintenance_tasks || [], function(i, row) {\r\n var yea2 = frappe.datetime.add_months(startingDate, 24);\r\n console.log(yea2)\r\n frappe.model.set_value(row.doctype, row.name, 'periodicity', frm.doc.custom_frequency);\r\n frappe.model.set_value(row.doctype, row.name, 'next_due_date', yea2);\r\n })\r\n }\r\n}\r\n\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Support Plans",
|
||
"enabled": 1,
|
||
"modified": "2024-09-26 14:32:23.508971",
|
||
"module": "Asset Lite",
|
||
"name": "Support Plans",
|
||
"script": "frappe.ui.form.on('Support Plans', {\n before_save(frm){\n if(frm.doc.service_contract == 1){\n frm.fields_dict.service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n if(frm.doc.spare_parts ==1){\n\t \n\t frm.fields_dict.spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n if(frm.doc.labour ==1){\n\t \n\t frm.fields_dict.labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n if(frm.doc.ppm_only ==1){\n\t \n\t frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n if(frm.doc.spare_parts_labour ==1){\n\t \n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n if(frm.doc.warranty ==1){\n\t \n\t frm.fields_dict.warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n else{\n\t \n\t frm.fields_dict.warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n }\n \n if(frm.doc.extended_warranty ==1){\n\t \n\t frm.fields_dict.extended_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n }\n else{\n\t \n\t frm.fields_dict.extended_warranty.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n }\n },\n \n\tservice_contract(frm) {\n\t if(frm.doc.service_contract == 0){\n\t frm.set_value('labour', 0)\n\t frm.set_value('ppm_only', 0)\n\t frm.set_value('spare_parts', 0)\n\t frm.set_value('spare_parts_labour', 0)\n\t frm.set_value('start_date', '')\n\t frm.set_value('end_date', '')\n\t frm.set_value('service_contract_status', '')\n\t \n\t frm.fields_dict.service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n\t }\n\t else{\n\t frm.fields_dict.service_contract.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n\t }\n\t frm.refresh_field('service_contract')\n\t},\n\tspare_parts(frm){\n\t if(frm.doc.spare_parts ==1){\n\t frm.set_value('labour', 0)\n\t frm.set_value('ppm_only', 0)\n\t frm.set_value('spare_parts_labour', 0)\n\t \n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n\t \n\t frm.fields_dict.spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n frm.fields_dict.labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n \n frm.refresh_field('spare_parts')\n\t }\n\t},\n\tlabour(frm){\n\t if(frm.doc.labour == 1){\n\t frm.set_value('spare_parts', 0)\n\t frm.set_value('ppm_only', 0)\n\t frm.set_value('spare_parts_labour', 0)\n\t \n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n\t \n\t frm.fields_dict.spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n frm.fields_dict.labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', \n 'border-color': 'black' \n });\n frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n \n frm.refresh_field('labour')\n\t }\n\t},\n\tppm_only(frm){\n\t if(frm.doc.ppm_only == 1){\n\t frm.set_value('labour', 0)\n\t frm.set_value('spare_parts', 0)\n\t frm.set_value('spare_parts_labour', 0)\n\t \n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n\t \n\t frm.fields_dict.spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n frm.fields_dict.labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', \n 'border-color': 'black' \n });\n\t }\n\t frm.refresh_field('ppm_only')\n\t},\n\tspare_parts_labour(frm){\n\t if(frm.doc.spare_parts_labour ==1){\n\t frm.set_value('labour', 0)\n\t frm.set_value('ppm_only', 0)\n\t frm.set_value('spare_parts', 0)\n\t \n\t frm.fields_dict.spare_parts.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', // Green background\n 'border-color': 'black' // black border\n });\n\t \n\t frm.fields_dict.spare_parts_labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': '#28a745', // Green background\n 'border-color': 'black' // black border\n });\n frm.fields_dict.labour.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n frm.fields_dict.ppm_only.$wrapper.find('input[type=\"checkbox\"]').css({\n 'background-color': 'red', \n 'border-color': 'black' \n });\n \n frm.refresh_field('spare_parts')\n\t }\n\t},\n\t\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Purchase Request",
|
||
"enabled": 1,
|
||
"modified": "2024-09-17 20:11:03.491171",
|
||
"module": "Asset Lite",
|
||
"name": "PR-PO Creation",
|
||
"script": "frappe.ui.form.on('Purchase Request', {\n\trefresh(frm) {\n\t\tif(frm.doc.docstatus == 1){\n\t\t frm.add_custom_button(__('Create Purchase Order'), function(){\n\t\t frappe.route_options={\n\t\t\t \"custom_purchase_request\":frm.doc.name,\n \n\t\t\t },\n frappe.set_route('Form','Purchase Order','new-purchase-order')\n }).css({\"color\":\"white\", \"background-color\": \"#14141f\", \"font-weight\": \"400\"})\n\t\t}\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Purchase Order",
|
||
"enabled": 0,
|
||
"modified": "2025-03-08 16:23:30.088974",
|
||
"module": "Asset Lite",
|
||
"name": "Purchase Order",
|
||
"script": "frappe.ui.form.on('Purchase Order', {\n\tcustom_purchase_request(frm) {\n\t frm.clear_table('items');\n\t\tfrappe.db.get_doc('Purchase Request', frm.doc.custom_purchase_request)\n .then(doc => {\n console.log(doc)\n console.log(frappe.user.has_role())\n console.log(doc.pr_table)\n var table = doc.pr_table\n \n for(var i in table){\n \n let row = frm.add_child('items', {\n item_code: table[i].item_code,\n item_name: table[i].item_name,\n rate : table[i].unit_price,\n \n qty: table[i].quantity,\n schedule_date:table[i].required_by,\n uom:table[i].uom,\n description:table[i].description\n });\n \n frm.refresh_field('items')\n console.log(row)\n console.log(table)\n }\n })\n\t},\n\t\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Purchase Invoice",
|
||
"enabled": 1,
|
||
"modified": "2024-09-20 16:32:48.717517",
|
||
"module": "Asset Lite",
|
||
"name": "Purchase Invoice",
|
||
"script": "\nfrappe.ui.form.on(\"Purchase Invoice\", {\n refresh: function(frm) {\n if(!frm.doc.custom_purchase_order)\n // Check if the Purchase Invoice has items linked to a Purchase Order\n if(frm.doc.items && frm.doc.items.length > 0 && frm.doc.items[0].purchase_order) {\n frm.set_value(\"custom_purchase_order\", frm.doc.items[0].purchase_order);\n }\n }\n});",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "PPM",
|
||
"enabled": 1,
|
||
"modified": "2024-09-23 18:17:37.996323",
|
||
"module": "Asset Lite",
|
||
"name": "PPM",
|
||
"script": "frappe.ui.form.on('PPM', {\n\t data: function (frm) {\n \n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.data, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.data);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table\");\n });\n });\n },\n before_save: function (frm) {\n \n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.data, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.data);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table\");\n });\n });\n },\n \n refresh(frm){\n if(!frm.doc.month || !frm.doc.year){\n let today = new Date();\n \n let monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n \n let currentMonth = monthNames[today.getMonth()];\n let currentYear = today.getFullYear();\n \n frm.set_value('month', currentMonth);\n frm.set_value('year', currentYear);\n }\n \n if(!frm.doc.table){\n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.date, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.date);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"table\");\n });\n });\n }\n }\n \n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 0,
|
||
"modified": "2024-10-16 18:40:54.019837",
|
||
"module": "Asset Lite",
|
||
"name": "Asset status",
|
||
"script": "frappe.ui.form.on('Asset', {\r\n Item_code: function(frm) {\r\n // Check the status of the work order for this asset when the form is refreshed\r\n update_asset_status(frm);\r\n },\r\n validate: function(frm) {\r\n // Also check the status before saving\r\n update_asset_status(frm);\r\n }\r\n});\r\n\r\nfunction update_asset_status(frm) {\r\n frappe.call({\r\n method: \"frappe.client.get_list\",\r\n args: {\r\n doctype: \"Work_Order\",\r\n filters: {\r\n 'asset': frm.doc.name,\r\n 'repair_status': ['in', ['Open', 'Work In Progress','Pending Review']]\r\n },\r\n fields: [\"name\", \"repair_status\"],\r\n limit:5000\r\n },\r\n callback: function(response) {\r\n console.log(response)\r\n if (response.message && response.message.length > 0) {\r\n // If there are work orders with status Open or In Progress, set asset status to 'Down'\r\n frm.set_value('custom_device_status', 'Down');\r\n frm.refresh_field('custom_device_status')\r\n } else {\r\n // If no such work order exists, set the status back to 'Active' or any other default value\r\n frm.set_value('custom_device_status', 'Up');\r\n }\r\n }\r\n });\r\n}\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Item",
|
||
"enabled": 1,
|
||
"modified": "2024-10-17 20:39:09.813209",
|
||
"module": "Asset Lite",
|
||
"name": "Item Dashboard",
|
||
"script": "frappe.ui.form.on('Item', {\nrefresh:function(frm,cdt,cdn){\n $(\"[data-doctype='BOM']\").hide();\n $(\"[data-doctype='Product Bundle']\").hide();\n $(\"[data-doctype='Item Alternative']\").hide();\n $(\"[data-doctype='Quotation']\").hide();\n $(\"[data-doctype='Sales Order']\").hide();\n $(\"[data-doctype='Delivery Note']\").hide();\n $(\"[data-doctype='Sales Invoice']\").hide();\n $(\"[data-doctype='Production Plan']\").hide();\n $(\"[data-doctype='Work Order']\").hide();\n $(\"[data-doctype='Item Manufacturer']\").hide();\n $(\"[data-doctype='Serial No']\").hide();\n $(\"[data-doctype='Batch']\").hide();\n $(\"[data-doctype='Stock Entry']\").hide();\n $(\"[data-doctype='Stock Reconciliation']\").hide();\n $(\".form-link-title:has(span:contains('Sell'))\").hide();//hiding Heading\n $(\".form-link-title:has(span:contains('Traceability'))\").hide();\n $(\".form-link-title:has(span:contains('Groups'))\").hide();\n $(\".form-link-title:has(span:contains('Stock Movement'))\").hide();\n $(\".form-link-title:has(span:contains('Manufacture'))\").hide();\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-03-08 20:00:51.127457",
|
||
"module": "Asset Lite",
|
||
"name": "Total Hours of Asset",
|
||
"script": "frappe.ui.form.on('Asset', {\r\n available_for_use_date:function(frm,cdt,cdn){\r\n /* if (frm.doc.available_for_use_date) {\r\n // Get the current date and time in local timezone\r\n let now = new Date();\r\n \r\n // Get components of the date and time\r\n let year = now.getFullYear();\r\n let month = String(now.getMonth() + 1).padStart(2, '0'); // Months are zero-based\r\n let day = String(now.getDate()).padStart(2, '0');\r\n let hours = String(now.getHours()).padStart(2, '0');\r\n let minutes = String(now.getMinutes()).padStart(2, '0');\r\n let seconds = String(now.getSeconds()).padStart(2, '0');\r\n \r\n // Format the current date and time in local format for the Datetime field\r\n let currentDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n \r\n \r\n frm.set_value(\"custom_installation_date\",currentDateTime)\r\n frm.refresh_field(\"custom_installation_date\")\r\n console.log(frm.doc.custom_installation_date)\r\n }*/\r\n calculate_total_hours(frm);\r\n },\r\n \r\n // refresh: function(frm) {\r\n /* if (frm.doc.custom_installation_date) {\r\n console.log(frm.doc.custom_installation_date)\r\n // Parse the 'current_datetime' field value as a Date object\r\n let installationDateTime = new Date(frm.doc.custom_installation_date);\r\n\r\n // Get the current date and time in local timezone\r\n let now = new Date();\r\n console.log(\"current date and time\"+now)\r\n // Calculate the time difference in milliseconds\r\n let timeDiff = now - installationDateTime;\r\n console.log(\"Time difference\"+timeDiff)\r\n // Convert time difference from milliseconds to hours\r\n let totalHours = timeDiff / (1000 * 60 * 60); // 1 hour = 3600000 milliseconds\r\n console.log(\"Total hours after converting to hours\"+totalHours)\r\n // Update the total hours field\r\n frm.set_value('custom_total_hours', totalHours.toFixed(2));\r\n frm.refresh_field(\"custom_total_hours\")\r\n }*/\r\n // calculate_total_hours(frm);\r\n \r\n // var total = frm.doc.custom_total_hours - frm.doc.custom_down_time\r\n // frm.set_value(\"custom_up_time\",total)\r\n // frm.refresh_field(\"custom_up_time\")\r\n // }\r\n});\r\n\r\n\r\nfunction calculate_total_hours(frm) {\r\n if (frm.doc.available_for_use_date) {\r\n // Get the available date and the current date as date strings\r\n let availableDate = frappe.datetime.str_to_obj(frm.doc.available_for_use_date);\r\n let currentDate = new Date();\r\n \r\n // Get the time difference in milliseconds and convert it to days\r\n let timeDiff = currentDate - availableDate;\r\n let dayDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));\r\n \r\n // Convert days to hours\r\n let totalHours = dayDiff * 24;\r\n console.log(totalHours);\r\n \r\n // Update the total_hours field\r\n frm.set_value('custom_total_hours', totalHours);\r\n frm.refresh_field(\"custom_total_hours\");\r\n \r\n var total = totalHours - frm.doc.custom_down_time\r\n frm.set_value(\"custom_up_time\",total)\r\n frm.refresh_field(\"custom_up_time\")\r\n }\r\n}",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Dashboard",
|
||
"enabled": 0,
|
||
"modified": "2024-10-18 19:31:09.126624",
|
||
"module": "Asset Lite",
|
||
"name": "Dashboard filter",
|
||
"script": "frappe.ui.form.on('Repo', {\r\n onload: function(frm) {\r\n // Fetch the department of the logged-in user\r\n frappe.call({\r\n method: \"frappe.client.get_value\",\r\n args: {\r\n doctype: \"Employee\",\r\n filters: {\r\n \"user_id\": frappe.session.user\r\n },\r\n fieldname: \"department\"\r\n },\r\n callback: function(response) {\r\n if (response && response.message) {\r\n let department = response.message.department;\r\n if (department) {\r\n // Set the department in the report filter\r\n frm.set_value(\"department_filter\", department);\r\n\r\n // Also set the department in the chart filter if applicable\r\n if (frm.dashboard && frm.dashboard.charts) {\r\n frm.dashboard.charts.forEach(chart => {\r\n chart.set_filter(\"department\", department);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n refresh: function(frm) {\r\n // Listen for any changes in the department filter and update the chart filter\r\n frm.fields_dict.department_filter.$input.on('change', function() {\r\n let department = frm.doc.department_filter;\r\n if (frm.dashboard && frm.dashboard.charts) {\r\n frm.dashboard.charts.forEach(chart => {\r\n chart.set_filter(\"department\", department);\r\n });\r\n }\r\n });\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance Log",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 21:19:21.186829",
|
||
"module": "Asset Lite",
|
||
"name": "PPM Update",
|
||
"script": "frappe.ui.form.on('Asset Maintenance Log', {\n\t /*custom_template: function (frm) {\n \n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.custom_template, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.custom_template);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"custom_table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"custom_table\");\n });\n });\n },\n before_save: function (frm) {\n \n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.custom_template, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.custom_template);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"custom_table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"custom_table\");\n });\n });\n },*/\n \n onload:function(frm,cdt,cdn){\n \n \n if(frm.doc.custom_table.length == 0){\n frm.clear_table('table');\n frappe.model.with_doc('PPM Templates', frm.doc.custom_template, function() {\n let source_doc = frappe.model.get_doc('PPM Templates', frm.doc.custom_template);\n $.each(source_doc.ppm_template_table, function (index, source_row) {\n \n var addChild = cur_frm.add_child(\"custom_table\");\n addChild.maintenance_name = source_row.maintenance_name;\n frm.refresh_field(\"custom_table\");\n });\n });\n }\n }\n \n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Item",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:41:24.974201",
|
||
"module": "Asset Lite",
|
||
"name": "Material Button",
|
||
"script": "frappe.ui.form.on('Item', {\r\n refresh: function(frm) {\r\n \r\n frm.set_query(\"custom_hospital_name\", () => {\r\n return {\r\n filters: {\r\n domain:\"Healthcare\"\r\n }\r\n };\r\n });\r\n var user=frappe.session.user\r\n\t \r\n\t frappe.db.get_list('User Permission', {\r\n fields: ['for_value'],\r\n filters: {\r\n user:user,\r\n allow:'Company'\r\n },\r\n limit: 1\r\n }).then(records => {\r\n if (records.length > 0){\r\n console.log(records[0].for_value);\r\n if(!frm.doc.custom_hospital_name){\r\n frm.set_value('custom_hospital_name',records[0].for_value)\r\n frm.refresh_field('custom_hospital_name')\r\n }\r\n }\r\n })\r\n \r\n // Add a custom button in the Item doctype\r\n frm.add_custom_button(__('Create Request'), function() {\r\n // Redirect to Material Request doctype\r\n frappe.model.with_doctype('Material Request', function() {\r\n let mr = frappe.model.get_new_doc('Material Request');\r\n\r\n // Set the type of Material Request (e.g., Purchase, Manufacture, etc.)\r\n mr.material_request_type = 'Purchase'; // You can adjust this to the desired type\r\n\r\n // Add a row to the child table 'items' in Material Request\r\n let row = frappe.model.add_child(mr, 'items');\r\n let today = new Date();\r\n let formattedDate = today.toISOString().split('T')[0]; // Format the date as YYYY-MM-DD\r\n\r\n \r\n \r\n // Set values from the Item doctype to the Material Request 'items' child table\r\n row.item_code = frm.doc.item_code;\r\n row.item_name = frm.doc.item_name;\r\n row.description = frm.doc.description;\r\n row.uom = frm.doc.stock_uom;\r\n row.schedule_date = formattedDate,\r\n row.conversion_factor=1,\r\n row.qty = 1; // You can adjust the quantity as needed\r\n\r\n // Open the Material Request form with prefilled details\r\n frappe.set_route('Form', 'Material Request', mr.name);\r\n });\r\n });\r\n frm.add_custom_button(__('Item Price'), function() {\r\n // Redirect to the Item Price doctype and pass the item details\r\n frappe.new_doc('Item Price', {\r\n item_code: frm.doc.item_code, // Pass the item code\r\n price_list: frm.doc.default_price_list, // Pass default price list if applicable\r\n // Add other fields if needed, like price, currency, etc.\r\n });\r\n });\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-05-19 13:39:37.455215",
|
||
"module": "Asset Lite",
|
||
"name": "Difference b/w max downtime",
|
||
"script": "// frappe.ui.form.on('Work_Order', {\n// \trefresh(frm) {\n// \t\t// your code here\n// \t}\n// })\n\n\nfrappe.ui.form.on('Work_Order', {\n /* vendor_total_hrs: function (frm) {\n update_difference(frm);\n },*/\n support_plan: function (frm) {\n update_difference(frm);\n },\n before_save: function (frm) {\n update_difference(frm); // Ensure it's updated before saving\n },\n before_workflow_action:function(frm){\n if(frm.selected_workflow_action==\"Accept\"){\n console.log('text')\n update_difference(frm); \n }\n \n },\n after_workflow_action(frm){\n update_difference(frm); \n },\n before_submit:function(frm){\n update_difference(frm); \n }\n \n \n});\n\nfunction update_difference(frm) {\n console.log(frm.doc.warranty)\n if (frm.doc.asset && frm.doc.warranty==1&&frm.doc.completion_date) {\n // Fetch the support plan from the linked Asset\n if (frm.doc.first_responded_on && frm.doc.completion_date) {\n let first_response = moment(frm.doc.first_responded_on);\n let completion = moment(frm.doc.completion_date);\n\n // Calculate difference in hours (including days)\n let diff_in_hours = completion.diff(first_response); // true for fractional hours\n\n // Convert the difference into hours (including days)\n var total_hours = diff_in_hours /(1000 * 60 * 60);\n \n \n frappe.db.get_value('Asset', frm.doc.asset, 'custom_support_plan', (r) => {\n if (r && r.custom_support_plan) {\n // Fetch the Max Down Time Hours from the Support Plan\n frappe.db.get_value('Support Plans', r.custom_support_plan, ['max_downtime_hrs','penalty_factor'], (sp) => {\n console.log(sp)\n if (sp && sp.max_downtime_hrs != null&&frm.doc.total_hours_spent>sp.max_downtime_hrs ) {\n frm.set_value('custom_diffrence', (total_hours || 0)-sp.max_downtime_hrs );\n frm.set_value('penalty', ((total_hours || 0)-sp.max_downtime_hrs )*sp.penalty_factor );\n console.log(frm.doc.custom_diffrence)\n frm.refresh_field(\"penalty\")\n frm.refresh_field(\"custom_diffrence\")\n } else {\n frappe.msgprint(__('Max Down Time Hours is not defined in the selected Support Plan.'));\n }\n });\n } \n else {\n frappe.msgprint(__('The linked Asset does not have an associated Support Plan.'));\n }\n });\n } else {\n console.log('Asset ID is not linked in the Work Order.')\n //frappe.msgprint(__('Asset ID is not linked in the Work Order.'));\n }\n }\n\n}\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:37:17.059765",
|
||
"module": "Asset Lite",
|
||
"name": "Serial Number",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n serial_number: function (frm) {\n if (frm.doc.serial_number) {\n // Fetch the Asset linked to the selected Serial No\n frappe.db.get_value('Asset', { custom_serial_number: frm.doc.serial_number }, ['name', 'company'], (r) => {\n if (r && r.name) {\n console.log(r.name)\n console.log(r.company)\n if (r.company === frm.doc.company) {\n frm.set_value('asset', r.name);\n console.log(\"✅ Asset set: Company matches\");\n } else {\n frappe.msgprint(__('⚠️ Asset belongs to a different Hospital: {0}', [r.company]));\n // frm.set_value('asset', null);\n \n const user = frappe.session.user;\n console.log(user)\n \n frappe.db.get_list('User', {\n fields: ['custom_phcc_site_name', 'custom_site_name'],\n filters: { email: user },\n limit: 1\n }).then(records => {\n if (records && records.length > 0) {\n const user_data = records[0];\n console.log(user_data)\n \n if (frm.is_new() && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n } else if (!frm.doc.company && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n }\n \n if (!frm.doc.site_name && user_data.custom_phcc_site_name) {\n frm.set_value('site_name', user_data.custom_phcc_site_name);\n }\n } else {\n console.log(\"User record not found.\");\n }\n })\n \n }\n } else {\n frappe.msgprint(__('No Asset found with the selected Serial No.'));\n // frm.set_value('asset', null); // Clear the Asset ID field if no match is found\n }\n });\n \n // Dynamically filter the Asset ID field based on the Serial No\n // frm.set_query('asset', function () {\n // return {\n // filters: {\n // custom_serial_number: frm.doc.serial_number, // Filter Asset records with the same Serial No\n // },\n // };\n // });\n // } else {\n // frm.set_value('asset', null); // Clear the Asset ID field if Serial No is empty\n // frm.set_query('asset', function () {\n // return {}; // Remove any filters if Serial No is cleared\n // });\n }\n },\n});\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Feedback",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 21:18:59.033151",
|
||
"module": "Asset Lite",
|
||
"name": "Feed",
|
||
"script": "frappe.ui.form.on('Feedback', {\n\t onload: function(frm) {\n if (!frm.doc.parameters || frm.doc.parameters.length === 0) {\n let default_bodies = ['Quality of Service', 'Timeliness','Professionalism','Communication'];\n\n default_bodies.forEach(body => {\n let row = frm.add_child(\"parameters\");\n row.parameter = body; \n });\n\n frm.refresh_field(\"parameters\"); \n }\n frm.set_value('feedback_by',frappe.session.user)\n frm.refresh_field('feedback_by')\n\t },\n\t before_save:function(frm){\n\t calculate_overall_satisfaction(frm); \n\t }\n})\n\nfunction calculate_overall_satisfaction(frm) {\n let total = 0;\n let count = 0;\n\n if (frm.doc.parameters) { // 'feedback_ratings' is the child table field name\n frm.doc.parameters.forEach(row => {\n // Check if the parameter matches one of the required categories\n if ([\"Quality of Service\", \"Timeliness\", \"Professionalism\", \"Communication\"].includes(row.parameter)) {\n if (row.rating) { // 'rating' should be the star rating field in child table\n total += row.rating;\n count++;\n }\n }\n });\n }\n\n if (count > 0) {\n let avg = total / count;\n frm.set_value(\"overall\", avg.toFixed(2)); // Update parent field\n } else {\n frm.set_value(\"overall\", 0);\n }\n}",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-05-19 13:39:00.975896",
|
||
"module": "Asset Lite",
|
||
"name": "Feedback",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n after_workflow_action:function(frm,cdt,cdn){\n \n if(frm.doc.repair_status=='Completed'){\n frappe.db.insert({\n \"doctype\": \"Feedback\",\n \"work_order\": frm.doc.name,\n \n \n }).then(function(doc) {\n console.log(doc);\n });\n \n }\n },\n// refresh:function(frm){\n// if(frm.doc.repair_status=='Completed'){\n// frappe.call({\n// method:\"frappe.client.get_value\",\n// args:{\n// 'doctype': 'Feedback',\n// 'filters': {'work_order': frm.doc.name},\n// 'fieldname': [\n// 'name',\n// 'work_order',\n// ]\n// },\n// callback: function(r) {\n// if(r.message.work_order===frm.doc.name) {\n// console.log(\"Feed back\")\n// frm.set_value('feedback',r.message.name)\n// frm.refresh_field('feedback')\n// }\n// }\n// })\n// }\n// }\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:42:25.154490",
|
||
"module": "Asset Lite",
|
||
"name": "Autopopulate Company Based On User",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n before_save:function(frm){\n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.custom_site_contractor){\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\n }\n \n if(frm.doc.asset_type === \"Non Biomedical\" && frm.doc.company){\n frm.set_value('company', \"\");\n }\n if(frm.doc.asset_type === \"Non Biomedical\" && frm.doc.asset){\n frm.set_value('asset', \"\");\n }\n },\n refresh:function(frm){\n var user=frappe.session.user\n\t frappe.db.get_list('User Permission', {\n fields: ['for_value'],\n filters: {\n user:user,\n allow:'Asset Type'\n }\n }).then(records => {\n if(records){\n console.log(records);\n if(!frm.doc.asset_type){\n console.log(\"Asset Type\")\n frm.set_value('asset_type',records[0].for_value)\n console.log(frm.doc.asset_type)\n frm.refresh_field('asset_type')\n }\n }\n })\n },\n onload: function (frm) {\n \n \n const user = frappe.session.user;\n \n \n\n frappe.db.get_list('User', {\n fields: ['custom_phcc_site_name', 'custom_site_name', 'custom_department'],\n filters: { email: user },\n limit: 1\n }).then(records => {\n if (records && records.length > 0) {\n const user_data = records[0];\n\n // Auto-set company\n if(frm.doc.asset_type === \"Biomedical\"){\n if (frm.is_new() && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n } else if (!frm.doc.company && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n }\n }\n\n // Auto-set site name\n if (!frm.doc.site_name && user_data.custom_phcc_site_name) {\n console.log(\"Site name\")\n frm.set_value('site_name', user_data.custom_phcc_site_name);\n }\n\n // Auto-set department\n if (!frm.doc.department && user_data.custom_department) {\n frm.set_value('department', user_data.custom_department);\n }\n }\n })\n \n apply_city_filter_from_site(frm);\n },\n\n asset_type: function (frm) {\n if(frm.doc.asset_type === \"Biomedical\"){\n const user = frappe.session.user;\n\n frappe.db.get_list('User', {\n fields: ['custom_phcc_site_name', 'custom_site_name', 'custom_department'],\n filters: { email: user },\n limit: 1\n }).then(records => {\n if (records && records.length > 0) {\n const user_data = records[0];\n\n // Auto-set company\n if (user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n } else if (!frm.doc.company && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n }\n\n // Auto-set site name\n if (!frm.doc.site_name && user_data.custom_phcc_site_name) {\n frm.set_value('site_name', user_data.custom_phcc_site_name);\n }\n }\n })\n }\n else if(frm.doc.asset_type === \"Non Biomedical\"){\n frm.set_value('company', \"\");\n }\n \n // Auto-set Work Order Type based on Asset Type\n if (!frm.doc.work_order_type && frm.doc.asset_type === \"Biomedical\") {\n frm.set_value(\"work_order_type\", \"Repair (CM)\");\n } else if (!frm.doc.work_order_type && frm.doc.asset_type === \"Non Biomedical\") {\n frm.set_value(\"work_order_type\", \"\"); // clear field\n }\n },\n site_name: function (frm) {\n apply_city_filter_from_site(frm);\n }\n \n});\n\n\nfunction apply_city_filter_from_site(frm) {\n if (!frm.doc.site_name) {\n // clear filter when no site selected\n frm.set_query(\"custom_city\", () => ({}));\n return;\n }\n\n frappe.db.get_value(\"Mobile Team Site\", frm.doc.site_name, \"city\")\n .then(r => {\n const city = r?.message?.city;\n\n if (city) {\n // ✅ Apply filter only if site has a city\n frm.set_query(\"custom_city\", () => ({\n filters: { name: city }\n }));\n\n // Auto-set if different\n if (frm.doc.custom_city !== city) {\n frm.set_value(\"custom_city\", city);\n }\n } else {\n // ❌ No city in site → remove filter and don't overwrite\n frm.set_query(\"custom_city\", () => ({}));\n }\n });\n}\n\n// frappe.ui.form.on('Work_Order', {\n// \tonload:function(frm) {\n// \t var user=frappe.session.user\n// \t // frappe.db.get_list('User Permission', {\n// // fields: ['for_value'],\n// // filters: {\n// // user:user,\n// // allow:'Company'\n// // }\n// // }).then(records => {\n// // console.log(records[0].for_value);\n// // if(!frm.doc.company){\n// // frm.set_value('company',records[0].for_value)\n// // console.log(frm.doc.company)\n// // frm.refresh_field('company')\n// // }\n// // })\n \n// frappe.db.get_list('User', {\n// fields: ['custom_phcc_site_name',\"custom_site_name\"],\n// filters: {\n// email:user\n// }\n// }).then(records => {\n// console.log(records[0]);\n// if(!frm.doc.company){\n// frm.set_value('company',records[0].custom_site_name)\n// console.log(frm.doc.company)\n// frm.refresh_field('company')\n// }\n// if(!frm.doc.site_name){\n// frm.set_value('site_name',records[0].custom_phcc_site_name)\n// console.log(frm.doc.site_name)\n// frm.refresh_field('site_name')\n// }\n// })\n \n\n// \t}\n// })\n\n\n// frappe.ui.form.on('Work_Order', {\n// onload: function (frm) {\n// const user = frappe.session.user;\n// console.log(user)\n\n// frappe.db.get_list('User', {\n// fields: ['custom_phcc_site_name', 'custom_site_name'],\n// filters: { email: user },\n// limit: 1\n// }).then(records => {\n// if (records && records.length > 0) {\n// const user_data = records[0];\n// console.log(user_data)\n \n// if (frm.is_new() && user_data.custom_site_name) {\n// frm.set_value('company', user_data.custom_site_name);\n// } else if (!frm.doc.company && user_data.custom_site_name) {\n// frm.set_value('company', user_data.custom_site_name);\n// }\n\n// if (!frm.doc.site_name && user_data.custom_phcc_site_name) {\n// frm.set_value('site_name', user_data.custom_phcc_site_name);\n// }\n// } else {\n// console.log(\"User record not found.\");\n// }\n// })\n// }\n// });\n\n\n\n\n\n// frappe.ui.form.on('Work_Order', {\n// refresh: function(frm) {\n// // override the built-in assign_to dialog\n// frm.page.add_menu_item(__('Assign To (Filtered)'), function() {\n// new frappe.ui.form.AssignToDialog({\n// obj: frm,\n// method: 'frappe.desk.form.assign_to.add',\n// doctype: frm.doctype,\n// docname: frm.docname,\n// filters: {\n// // restrict user list here\n// 'role': 'General',\n// 'enabled': 1\n// }\n// });\n// });\n// }\n// });\n\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-06-23 16:26:17.996575",
|
||
"module": "Asset Lite",
|
||
"name": "Autopopulate Company in Asset Based On User",
|
||
"script": "frappe.ui.form.on('Asset', {\n\tonload:function(frm) {\n\t \n\t const user = frappe.session.user;\n console.log(user)\n\n frappe.db.get_list('User', {\n fields: ['custom_phcc_site_name', 'custom_site_name'],\n filters: { email: user },\n limit: 1\n }).then(records => {\n if (records && records.length > 0) {\n const user_data = records[0];\n console.log(user_data)\n \n if (frm.is_new() && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n frm.set_value('asset_owner_company', user_data.custom_site_name);\n } else if (!frm.doc.company && user_data.custom_site_name) {\n frm.set_value('company', user_data.custom_site_name);\n frm.set_value('asset_owner_company', user_data.custom_site_name);\n }\n\n if (!frm.doc.custom_site && user_data.custom_phcc_site_name) {\n frm.set_value('custom_site', user_data.custom_phcc_site_name);\n }\n } else {\n console.log(\"User record not found.\");\n }\n })\n\t \n\t // var user=frappe.session.user\n\t \n\t //frappe.db.get_list('User Permission', {\n // fields: ['for_value'],\n // filters: {\n // user:user,\n // allow:'Company'\n // },\n // limit: 1\n // }).then(records => {\n // if (records.length > 0){\n // console.log(records[0].for_value);\n // if(!frm.doc.company){\n // frm.set_value('company',records[0].for_value)\n // frm.set_value('asset_owner_company',records[0].for_value)\n // frm.refresh_field('company')\n // }\n // }\n // })\n \t\n },\n company(frm){\n if(frm.doc.company){\n frm.set_value('asset_owner_company',frm.doc.company)\n }\n }\n})\n\n\n// frappe.ui.form.on('Work_Order', {\n// onload: function (frm) {\n// const user = frappe.session.user;\n// console.log(user)\n\n// frappe.db.get_list('User', {\n// fields: ['custom_phcc_site_name', 'custom_site_name'],\n// filters: { email: user },\n// limit: 1\n// }).then(records => {\n// if (records && records.length > 0) {\n// const user_data = records[0];\n// console.log(user_data)\n \n// if (frm.is_new() && user_data.custom_site_name) {\n// frm.set_value('company', user_data.custom_site_name);\n// } else if (!frm.doc.company && user_data.custom_site_name) {\n// frm.set_value('company', user_data.custom_site_name);\n// }\n\n// if (!frm.doc.site_name && user_data.custom_phcc_site_name) {\n// frm.set_value('site_name', user_data.custom_phcc_site_name);\n// }\n// } else {\n// console.log(\"User record not found.\");\n// }\n// })\n// }\n// });",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-03-08 12:04:34.491511",
|
||
"module": "Asset Lite",
|
||
"name": "To add Creation Date in List View",
|
||
"script": "frappe.listview_settings['Asset'] = {\r\n onload: function (listview) {\r\n cur_list.columns.push({\r\n type: \"Field\",\r\n df: {\r\n label: __(\"Creation Date\"),\r\n fieldname: \"creation\",\r\n fieldtype: \"Datetime\",\r\n },\r\n });\r\n cur_list.refresh(true);\r\n }\r\n};\r\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-09-10 16:42:36.589107",
|
||
"module": "Asset Lite",
|
||
"name": "Work Order Creation Date in List view",
|
||
"script": "\n// frappe.listview_settings['Work_Order'] = {\n// onload: function (listview) {\n \n// listview.page.fields_dict.name.df.label = \"Work Order No\";\n// listview.page.fields_dict.name.refresh();\n \n// cur_list.columns.push({\n// type: \"Field\",\n// df: {\n// label: __(\"Creation Date\"),\n// fieldname: \"creation\",\n// fieldtype: \"Datetime\",\n// },\n// });\n// cur_list.refresh(true);\n// }\n// };\n\nfrappe.listview_settings['Work_Order'] = {\n onload: function (listview) {\n \n const hideNames = [\n \"Al Jouf Hospital\"\n ];\n\n // Exclude directly via get_query on company field\n let companyField = listview.page.fields_dict.company;\n if (companyField) {\n companyField.get_query = () => ({\n filters: [[\"name\", \"not in\", hideNames]]\n });\n }\n \n // Delay execution to ensure table renders\n setTimeout(() => {\n $('th:contains(\"ID\"), td[data-fieldname=\"name\"]').hide(); // Hide ID column header and cells\n }, 100);\n \n // Add Creation Date Column\n cur_list.columns.push({\n type: \"Field\",\n df: {\n label: __(\"Creation Date\"),\n fieldname: \"creation\",\n fieldtype: \"Datetime\",\n },\n });\n \n // Add Work Order No Column\n cur_list.columns.push({\n type: \"Field\",\n df: {\n label: __(\"Work Order No\"),\n fieldname: \"name\", // Using 'name' as Work Order No\n fieldtype: \"Data\",\n },\n });\n\n \n\n cur_list.refresh(true);\n \n \n }\n};\n\n\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-05-19 13:38:38.985115",
|
||
"module": "Asset Lite",
|
||
"name": "Deadline Date",
|
||
"script": "frappe.ui.form.on('Work_Order', {\r\n failure_date: function(frm) {\r\n set_deadline_date(frm);\r\n },\r\n custom_priority_: function(frm) {\r\n set_deadline_date(frm);\r\n },\r\n need_procurement: function(frm) {\r\n set_deadline_date(frm);\r\n }\r\n});\r\n\r\n// function set_deadline_date(frm) {\r\n// if (frm.doc.failure_date) {\r\n// let days_to_add = 0;\r\n// let is_procurement_needed = frm.doc.need_procurement == 1; // Checkbox: 1 (checked), 0 (unchecked)\r\n\r\n// if (frm.doc.custom_priority_ === 'Normal') {\r\n// if (is_procurement_needed) {\r\n// days_to_add = 30;\r\n// } else {\r\n// days_to_add = 5;\r\n// }\r\n// } else if (frm.doc.custom_priority_ === 'Urgent') {\r\n// if (is_procurement_needed) {\r\n// days_to_add = 30;\r\n// } else {\r\n// days_to_add = 1;\r\n// }\r\n// }\r\n\r\n// let deadline_date = frappe.datetime.add_days(frm.doc.failure_date, days_to_add);\r\n// frm.set_value('custom_deadline_date', deadline_date);\r\n// }\r\n// }\r\n\r\nfunction set_deadline_date(frm) {\r\n if (frm.doc.invoice_table && frm.doc.invoice_table.length > 0) {\r\n let first_row = frm.doc.invoice_table[0];\r\n\r\n if (first_row.purchase_invoice) {\r\n frappe.db.get_value('Purchase Invoice', first_row.purchase_invoice, 'posting_date')\r\n .then(r => {\r\n let invoice_date = r && r.message.posting_date ? r.message.posting_date : null;\r\n console.log(invoice_date)\r\n calculate_deadline_date(frm, invoice_date);\r\n });\r\n } else {\r\n calculate_deadline_date(frm, null);\r\n }\r\n } else {\r\n calculate_deadline_date(frm, null);\r\n }\r\n}\r\n\r\nfunction calculate_deadline_date(frm, base_date) {\r\n base_date = base_date || frm.doc.failure_date;\r\n \r\n if (base_date) {\r\n let days_to_add = 0;\r\n let is_procurement_needed = frm.doc.need_procurement == 1; // Checkbox: 1 (checked), 0 (unchecked)\r\n\r\n if (frm.doc.custom_priority_ === 'Normal') {\r\n days_to_add = is_procurement_needed ? 30 : 5;\r\n } else if (frm.doc.custom_priority_ === 'Urgent') {\r\n days_to_add = is_procurement_needed ? 30 : 1;\r\n }\r\n\r\n let deadline_date = frappe.datetime.add_days(base_date, days_to_add);\r\n frm.set_value('custom_deadline_date', deadline_date);\r\n }\r\n}\r\n\r\n\r\n\r\nfrappe.ui.form.on('PI Table', {\r\n\tpurchase_invoice:function(frm, cdt, cdn){\r\n var row = locals[cdt][cdn];\r\n console.log(row)\r\n set_deadline_date(frm);\r\n\t}\r\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-03-08 13:24:25.936104",
|
||
"module": "Asset Lite",
|
||
"name": "User email",
|
||
"script": "frappe.ui.form.on('Work_Order', {\r\n company: function(frm) {\r\n set_user_based_on_hospital(frm);\r\n }\r\n});\r\n\r\nfunction set_user_based_on_hospital(frm){\r\n if(frm.doc.company){\r\n frappe.db.get_list('Asset Maintenance Team', {\r\n filters: [\r\n ['company', '=', frm.doc.company],\r\n ],\r\n fields: ['name', 'maintenance_manager'],\r\n limit: 1\r\n }).then(user_response => {\r\n if (user_response.length > 0) {\r\n let user_email = user_response[0].maintenance_manager;\r\n console.log(\"User Email Found:\", user_email); // Debugging\r\n\r\n // Step 3: Set the user email in the Work Order\r\n frm.set_value('custom_maintenance_manager', user_email);\r\n }\r\n else{\r\n frm.set_value('custom_maintenance_manager', \"\");\r\n }\r\n })\r\n }\r\n}\r\n\r\n// function set_user_based_on_hospital(frm) {\r\n// if (frm.doc.company) {\r\n// // Step 1: Fetch the company abbreviation\r\n// frappe.db.get_value('Company', {'name': frm.doc.company}, 'abbr')\r\n// .then(response => {\r\n// let company_abbr = response.message.abbr;\r\n// console.log(\"Company Abbreviation:\", company_abbr); // Debugging\r\n\r\n// if (company_abbr) {\r\n// // Step 2: Find user whose last name contains the abbreviation OR first name contains \"Maintenance Manager\"\r\n// frappe.db.get_list('User', {\r\n// filters: [\r\n// ['last_name', 'like', `%${company_abbr}%`], \r\n// ['first_name', 'like', '%Maintenance Manager%']\r\n// ],\r\n// fields: ['name', 'email'],\r\n// limit: 1\r\n// }).then(user_response => {\r\n// if (user_response.length > 0) {\r\n// let user_email = user_response[0].email;\r\n// console.log(\"User Email Found:\", user_email); // Debugging\r\n\r\n// // Step 3: Set the user email in the Work Order\r\n// frm.set_value('custom_user', user_email);\r\n// } else {\r\n// frappe.msgprint(__('No user found with abbreviation in Last Name or \"Maintenance Manager\" in First Name.'));\r\n// }\r\n// });\r\n// }\r\n// });\r\n// }\r\n// }\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Purchase Order",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.891926",
|
||
"module": "Asset Lite",
|
||
"name": "PO",
|
||
"script": "frappe.ui.form.on('Purchase Order', {\n// \trefresh(frm) {\n// \t\tif(frm.doc.buying_price_list){\n// \t\t frm.set_value(\"buying_price_list\", \"\")\n// \t\t}\n// \t}\n \n refresh:function(frm) {\n\t var user=frappe.session.user\n\t \n\t frappe.db.get_list('User Permission', {\n fields: ['for_value'],\n filters: {\n user:user,\n allow:'Company'\n },\n limit: 1\n }).then(records => {\n if (records.length > 0){\n console.log(records[0].for_value);\n if(!frm.doc.company){\n frm.set_value('company',records[0].for_value)\n frm.refresh_field('company')\n }\n }\n })\n \t\n }\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.822309",
|
||
"module": "Asset Lite",
|
||
"name": "Company Autopopulate",
|
||
"script": "// frappe.ui.form.on('Asset Maintenance', {\n// onload: function(frm) {\n// if(!frm.doc.maintenance_team){\n// // Get the logged-in user's email\n// var user_email = frappe.session.user_email;\n\n// // Set the user's email in the 'maintenance_team' field\n// frm.set_value('maintenance_team', user_email);\n// frm.refresh_field('maintenance_team');\n// }\n// }\n// })\n\nfrappe.ui.form.on('Asset Maintenance', {\n onload: function(frm) {\n if (!frm.doc.maintenance_team) {\n // Get the logged-in user's email\n var user_email = frappe.session.user_email;\n\n // Define email-to-team mapping\n var team_mapping = {\n \"maintenancemanager-th@gmail.com\": \"TH Maintenance Team\",\n \"maintenancemanager-kash@gmail.com\": \"KASH Maintenance Team\",\n \"maintenancemanager-dajh@gmail.com\": \"DAJH Maintenance Team\",\n \"cluster-manager@gmail.com\": \"Biomedical Team\" // Added Cluster Manager mapping\n };\n\n // Check if the user's email exists in the mapping\n if (team_mapping[user_email]) {\n frm.set_value('maintenance_team', team_mapping[user_email]);\n frm.refresh_field('maintenance_team');\n }\n }\n }\n});\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:34.365478",
|
||
"module": "Asset Lite",
|
||
"name": "Due date update",
|
||
"script": "frappe.ui.form.on('Asset Maintenance', {\r\n custom_start_date: function(frm) {\r\n // Get the updated custom_start_date value\r\n var customStartDate = frm.doc.custom_start_date;\r\n console.log(\"🔄 Updating start_date with:\", customStartDate);\r\n\r\n // Ensure custom_start_date is not empty\r\n if (!customStartDate) {\r\n console.error(\"❌ ERROR: custom_start_date is empty!\");\r\n return;\r\n }\r\n\r\n // Ensure the child table exists and is not empty\r\n if (!frm.doc.asset_maintenance_tasks || frm.doc.asset_maintenance_tasks.length === 0) {\r\n console.error(\"❌ ERROR: No child table rows found!\");\r\n return;\r\n }\r\n\r\n // Loop through each row in the child table and update start_date\r\n $.each(frm.doc.asset_maintenance_tasks, function(i, row) {\r\n console.log(`✅ Updating Row ${i}:`, row);\r\n frappe.model.set_value(row.doctype, row.name, 'start_date', customStartDate);\r\n });\r\n\r\n // Refresh the child table to reflect changes\r\n frm.refresh_field('asset_maintenance_tasks');\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance Log",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:34.305819",
|
||
"module": "Asset Lite",
|
||
"name": "Validate date",
|
||
"script": "frappe.ui.form.on('Asset Maintenance Log', {\r\n completion_date: function(frm) {\r\n check_early_completion(frm);\r\n }\r\n});\r\n\r\nfunction check_early_completion(frm) {\r\n if (!frm.doc.due_date || !frm.doc.completion_date) {\r\n return; // Skip if dates are missing\r\n }\r\n\r\n let dueDate = frappe.datetime.str_to_obj(frm.doc.due_date);\r\n let completionDate = frappe.datetime.str_to_obj(frm.doc.completion_date);\r\n\r\n let dueMonthStart = new Date(dueDate.getFullYear(), dueDate.getMonth(), 1); // First day of due month\r\n\r\n // 🔥 If completion date is before the start of the due month\r\n if (completionDate < dueMonthStart) {\r\n // ✅ Set `custom_early_completion` to \"Yes\"\r\n frm.set_value('custom_early_completion', 'Yes');\r\n frm.refresh_field('custom_early_completion');\r\n // frm.refresh();\r\n\r\n // ✅ Show warning message immediately\r\n // frappe.msgprint({\r\n // // title: __('Warning'),\r\n // // indicator: 'red',\r\n // message: __('Completion Date ({0}) is before the Due Date Month ({1}). Please verify.', \r\n // [frappe.datetime.str_to_user(frm.doc.completion_date), frappe.datetime.str_to_user(frm.doc.due_date)])\r\n // });\r\n frappe.show_alert({\r\n message: __('⚠️ Warning: Completion Date ({0}) is before the Due Date Month ({1}). Please verify.', \r\n [frappe.datetime.str_to_user(frm.doc.completion_date), frappe.datetime.str_to_user(frm.doc.due_date)]),\r\n indicator: 'red'\r\n}, 10); // Shows for 10 seconds\r\n\r\n \r\n }\r\n}\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 0,
|
||
"modified": "2025-04-22 12:38:33.402211",
|
||
"module": "Asset Lite",
|
||
"name": "Active Map",
|
||
"script": "frappe.pages['asset-map'].on_page_load = function(wrapper) {\n let page = frappe.ui.make_app_page({\n parent: wrapper,\n title: 'Asset Map',\n single_column: true\n });\n\n // Create map container\n let $mapContainer = $('<div id=\"asset-map-container\">').css({\n height: '500px',\n width: '100%'\n }).appendTo(page.main);\n\n // Initialize map\n let map = L.map('asset-map-container').setView([20.5937, 78.9629], 5); // Default to India\n L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n maxZoom: 19\n }).addTo(map);\n\n // Fetch assets with linked locations\n frappe.call({\n method: 'frappe.client.get_list',\n args: {\n doctype: 'Asset',\n fields: ['name', 'asset_name', 'location']\n },\n callback: function(res) {\n if (res.message) {\n res.message.forEach(asset => {\n if (asset.location) {\n frappe.call({\n method: 'frappe.client.get',\n args: {\n doctype: 'Location',\n name: asset.location\n },\n callback: function(r) {\n if (r.message && r.message.latitude && r.message.longitude) {\n L.marker([r.message.latitude, r.message.longitude])\n .addTo(map)\n .bindPopup(`${asset.asset_name}`);\n }\n }\n });\n }\n });\n }\n }\n });\n};\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Item",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:43:17.232032",
|
||
"module": "Asset Lite",
|
||
"name": "Setting Site Name and warehouse",
|
||
"script": "frappe.ui.form.on('Item', {\r\n refresh: function(frm) {\r\n set_default_hospital(frm);\r\n },\r\n // custom_hospital_name: function(frm) {\r\n // set_default_hospital(frm);\r\n // }\r\n});\r\n\r\nfunction set_default_hospital(frm) {\r\n // Clear old rows\r\n // frm.clear_table(\"item_defaults\");\r\n\r\n // Always set Al Jouf Hospital with its default warehouse\r\n if (!frm.doc.item_defaults || frm.doc.item_defaults.length === 0) {\r\n let row = frm.add_child(\"item_defaults\");\r\n row.company = \"Al Jouf Hospital\";\r\n row.default_warehouse = \"Al Jouf Central Warehouse - AJH\";\r\n }\r\n\r\n frm.refresh_field(\"item_defaults\");\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n// frappe.ui.form.on('Item', {\r\n// // refresh: function(frm) {\r\n// // set_hospital(frm);\r\n// // },\r\n// custom_hospital_name: function(frm) {\r\n// set_hospital(frm);\r\n// }\r\n// });\r\n\r\n\r\n// function set_hospital(frm) {\r\n// if (frm.doc.custom_hospital_name) {\r\n// frappe.db.get_value('Company', {'name': frm.doc.custom_hospital_name}, 'abbr')\r\n// .then(r => {\r\n// // if (r.message && r.message.abbr) {\r\n// // let abbr = r.message.abbr;\r\n// // let warehouse = `Stores - ${abbr}`;\r\n\r\n// // // // Check if Item Defaults table is empty\r\n// // // if (!frm.doc.item_defaults || frm.doc.item_defaults.length === 0) {\r\n// // // let row = frm.add_child(\"item_defaults\");\r\n// // // row.company = frm.doc.custom_hospital_name;\r\n// // // row.default_warehouse = warehouse;\r\n// // // } else {\r\n// // // // Update existing rows\r\n// // // frm.doc.item_defaults.forEach(row => {\r\n// // // frappe.model.set_value(row.doctype, row.name, 'company', frm.doc.custom_hospital_name);\r\n// // // frappe.model.set_value(row.doctype, row.name, 'default_warehouse', warehouse);\r\n// // // });\r\n// // // }\r\n\r\n// // // // Refresh the table\r\n// // // frm.refresh_field(\"item_defaults\");\r\n// // }\r\n// });\r\n// }\r\n// }\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "User",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:34.055068",
|
||
"module": "Asset Lite",
|
||
"name": "User language setting",
|
||
"script": "frappe.ui.form.on('User', {\r\n refresh: function(frm) {\r\n if (!frappe.user.has_role('System Manager')) {\r\n frm.set_query(\"language\", function() {\r\n return {\r\n filters: {\r\n name: [\"in\", [\"ar\", \"en\"]]\r\n }\r\n };\r\n });\r\n }\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Supplier Quotation",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.989652",
|
||
"module": "Asset Lite",
|
||
"name": "To set Manufacturer Field",
|
||
"script": "frappe.ui.form.on('Supplier Quotation', {\n\trefresh(frm) {\n\t\t// your code here\n\t}\n})\n\n\nfrappe.ui.form.on('Supplier Quotation Item', {\n item_code: function(frm, cdt, cdn) {\n let row = locals[cdt][cdn]; // Get the row in the child table\n \n if (row.item_code) {\n console.log(\"hi\")\n frappe.db.get_value('Item', row.item_code, 'custom_manufacturer', function(data) {\n if (data.custom_manufacturer) {\n console.log(\"hiabd\")\n // frappe.model.set_value(cdt, cdn, 'qty', \"2\");\n frappe.model.set_value(cdt, cdn, 'manufacturer', data.custom_manufacturer);\n }\n });\n }\n }\n});\n\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Supplier Quotation",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.950764",
|
||
"module": "Asset Lite",
|
||
"name": "Banner Set in Supplier Quotation",
|
||
"script": "frappe.ui.form.on('Supplier Quotation', {\n refresh: function(frm) {\n let supplier_name = frm.doc.supplier; // Get the supplier from form-level\n let show_banner = false;\n\n // Loop through child table (items) and check if any custom_manufacturer1 matches supplier\n frm.doc.items.forEach(item => {\n if (item.custom_manufacturer1 === supplier_name) {\n show_banner = true;\n }\n });\n\n // Show banner if match is found\n if (show_banner) {\n frm.dashboard.add_comment(__(\"<i>This Supplier is same as the Item Manufacturer. You do not need to create any quotations after this and can click on 'Create Purchase Order' after this step. </i>\"),\"green\",true);\n // frm.dashboard.set_headline(\n // '<div style=\"background-color: #d4edda; color: #155724; padding: 10px; border-radius: 5px;\">' +\n // 'Manufacturer is the same as the supplier, so there\\'s no need to create a new supplier in the supplier quotation.' +\n // '</div>'\n // );\n }\n }\n});\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-05-19 13:38:18.512615",
|
||
"module": "Asset Lite",
|
||
"name": "Scrapped",
|
||
"script": "frappe.ui.form.on('Work_Order', {\r\n refresh: function(frm) {\r\n let has_scrapped = frm.doc.stock_items && frm.doc.stock_items.some(item => item.reason === \"Scrapped\");\r\n\r\n if (has_scrapped) {\r\n frm.add_custom_button(__('Material Transfer'), function() {\r\n let items = frm.doc.stock_items\r\n .filter(item => item.reason === \"Scrapped\") // Only include scrapped items\r\n .map(item => ({\r\n item_code: item.item_code,\r\n s_warehouse: item.warehouse || frm.doc.source_warehouse,\r\n t_warehouse: \"Scrapped - AJH\",\r\n qty: item.consumed_quantity\r\n }));\r\n\r\n if (items.length === 0) {\r\n frappe.msgprint(__('No scrapped items found for transfer.'));\r\n return;\r\n }\r\n\r\n // ✅ Store items in localStorage\r\n localStorage.setItem(\"stock_entry_items\", JSON.stringify(items));\r\n\r\n // ✅ Pass only non-array values in frappe.route_options\r\n frappe.route_options = {\r\n stock_entry_type: \"Material Transfer\",\r\n company: frm.doc.company\r\n };\r\n\r\n frappe.set_route('Form', 'Stock Entry', 'new-stock-entry');\r\n });\r\n }\r\n }\r\n});\r\n\r\n// ✅ Fetch items in Stock Entry form\r\nfrappe.ui.form.on('Stock Entry', {\r\n onload: function(frm) {\r\n let items = localStorage.getItem(\"stock_entry_items\");\r\n if (items) {\r\n items = JSON.parse(items);\r\n\r\n // ✅ Remove empty row if it exists\r\n if (frm.doc.items && frm.doc.items.length === 1 && !frm.doc.items[0].item_code) {\r\n frm.doc.items = [];\r\n }\r\n\r\n // ✅ Add the stored items\r\n items.forEach(item => {\r\n let child = frm.add_child(\"items\");\r\n frappe.model.set_value(child.doctype, child.name, \"item_code\", item.item_code);\r\n frappe.model.set_value(child.doctype, child.name, \"s_warehouse\", item.s_warehouse);\r\n frappe.model.set_value(child.doctype, child.name, \"t_warehouse\", item.t_warehouse);\r\n frappe.model.set_value(child.doctype, child.name, \"qty\", item.qty);\r\n });\r\n\r\n frm.refresh_field(\"items\");\r\n\r\n // ✅ Clear localStorage after use\r\n localStorage.removeItem(\"stock_entry_items\");\r\n }\r\n }\r\n});\r\n\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.861846",
|
||
"module": "Asset Lite",
|
||
"name": "To Set Service Agreement Table",
|
||
"script": "// frappe.ui.form.on('Asset Maintenance', {\n// \trefresh(frm) {\n// \t\t// your code here\n// \t}\n// })\n\nfrappe.ui.form.on('Asset Maintenance', {\n \n asset_name: function(frm) {\n if (frm.doc.asset_name) {\n calculate_no_of_pms(frm)\n frappe.call({\n method: \"frappe.client.get\",\n args: {\n doctype: \"Asset\",\n name: frm.doc.asset_name\n },\n callback: function(r) {\n if (r.message) {\n let asset = r.message;\n let table = frm.doc.custom_service_coverage_table || [];\n\n // Check if table is empty before adding a row\n if (table.length === 0) {\n let new_row = frm.add_child('custom_service_coverage_table');\n new_row.service_agreement = asset.custom_service_agreement;\n new_row.start_date = asset.custom_start_date;\n new_row.end_date = asset.custom_end_date;\n \n frm.refresh_field('custom_service_coverage_table');\n }\n }\n }\n });\n }\n },\n \n refresh: function(frm) {\n let today = frappe.datetime.get_today();\n let updated = false;\n\n // Check each row in the custom_service_coverage_table\n (frm.doc.custom_service_coverage_table || []).forEach(row => {\n if (row.start_date && row.end_date) {\n let is_active = frappe.datetime.get_diff(row.end_date, today) >= 0 &&\n frappe.datetime.get_diff(today, row.start_date) >= 0;\n \n // Update 'active' field only if needed\n if (is_active && row.active !== 'Yes') {\n frappe.model.set_value(row.doctype, row.name, 'active', 'Yes');\n updated = true;\n } else if (!is_active && row.active !== 'No') {\n frappe.model.set_value(row.doctype, row.name, 'active', 'No');\n updated = true;\n }\n }\n });\n\n // Refresh the field only if any updates were made\n if (updated) {\n frm.refresh_field('custom_service_coverage_table');\n }\n }\n});\n\n\nfrappe.ui.form.on('Service Coverage', {\n\tstart_date:function(frm, cdt, cdn){\n var row = locals[cdt][cdn];\n calculate_no_of_pms(frm)\n if(row.start_date && row.service_agreement !== \"Warranty\"){\n console.log(\"Table start date\")\n frm.set_value(\"custom_start_date\", row.start_date)\n frm.refresh_field('custom_start_date');\n console.log(\"Date\")\n \n }\n\t},\n\tend_date:function(frm, cdt, cdn){\n var row = locals[cdt][cdn];\n calculate_no_of_pms(frm)\n if(row.end_date && row.service_agreement !== \"Warranty\"){\n \n frm.set_value(\"custom_end_date\", row.end_date)\n frm.refresh_field('custom_end_date');\n \n \n }\n\t}\n})\n\nfunction calculate_no_of_pms(frm) {\n if (!frm.doc.asset_maintenance_tasks.length) {\n return; // No task row, exit\n }\n\n let periodicity = frm.doc.asset_maintenance_tasks[0].periodicity; // First row periodicity\n\n let periodicity_mapping = {\n \"Daily\": 1,\n \"Weekly\": 7,\n \"Monthly\": 30,\n \"Quarterly\": 90,\n \"Half-yearly\": 180,\n \"Yearly\": 365,\n \"2 Yearly\": 730,\n \"3 Yearly\": 1095\n };\n\n frm.doc.custom_service_coverage_table.forEach(service_row => {\n if (service_row.start_date && service_row.end_date && periodicity in periodicity_mapping) {\n let start = frappe.datetime.str_to_obj(service_row.start_date);\n console.log(start)\n let end = frappe.datetime.str_to_obj(service_row.end_date);\n let diff_days = frappe.datetime.get_day_diff(end, start);\n \n console.log(diff_days)\n let no_of_pms = Math.floor(diff_days / periodicity_mapping[periodicity]);\n frappe.model.set_value(service_row.doctype, service_row.name, \"no_of_pms\", no_of_pms);\n frm.refresh_field('no_of_pms');\n }\n });\n\n frm.refresh_field(\"custom_service_coverage_table\");\n}\n\nfrappe.ui.form.on('Asset Maintenance Task', {\n\tperiodicity:function(frm, cdt, cdn){\n var row = locals[cdt][cdn];\n if(row.periodicity){\n calculate_no_of_pms(frm)\n }\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Request for Quotation",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.760310",
|
||
"module": "Asset Lite",
|
||
"name": "Asset ID Field",
|
||
"script": "frappe.ui.form.on('Request for Quotation', {\r\n material_request: function(frm) {\r\n if (frm.doc.material_request) {\r\n frappe.db.get_doc('Material Request', frm.doc.material_request).then(doc => {\r\n frm.set_value('custom_asset_id', doc.custom_asset_id);\r\n });\r\n }\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-04-22 12:38:33.735775",
|
||
"module": "Asset Lite",
|
||
"name": "QR generate",
|
||
"script": "// frappe.ui.form.on('Asset', {\r\n// refresh: function(frm) {\r\n// // Check if the asset has an ID (required for generating QR code)\r\n// if (frm.doc.name) {\r\n// // Generate QR code URL with asset ID\r\n// let qr_code_url = `https://quickchart.io/qr?text=${encodeURIComponent(frm.doc.name)}`;\r\n \r\n// // Set the custom HTML field with the QR code image\r\n// frm.set_df_property('custom_qr_link', 'options', `<img src=\"${qr_code_url}\" alt=\"QR Code\" style=\"max-width: 150px; max-height: 150px;\">`);\r\n// }\r\n// }\r\n// });\r\n\r\nfrappe.ui.form.on('Asset', {\r\n refresh: function(frm) {\r\n if(!frm.doc.custom_attach_image){\r\n frappe.db.get_value(\"File\", {\r\n attached_to_doctype: \"Asset\",\r\n attached_to_name: frm.doc.name,\r\n attached_to_field: \"custom_attach_image\"\r\n }, \"file_url\").then(r => {\r\n if (r && r.message && r.message.file_url) {\r\n // File already exists, set the image field\r\n frm.set_value(\"custom_attach_image\", r.message.file_url);\r\n frm.refresh_field(\"custom_attach_image\");\r\n }\r\n });\r\n }\r\n \r\n if(frm.doc.custom_attach_image){\r\n // Add Print QR Button\r\n frm.add_custom_button(__('Print QR'), function() {\r\n let asset_id = frm.doc.name;\r\n let print_format = \"Asset QR\"; // Your custom Print Format name\r\n let url = `/printview?doctype=Asset&name=${asset_id}&format=${print_format}&no_letterhead=1&_lang=en`;\r\n window.open(url, '_blank'); // Open in new tab\r\n });\r\n }\r\n }\r\n});\r\n\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-09-15 16:21:20.470782",
|
||
"module": "Asset Lite",
|
||
"name": "PF",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n refresh(frm) {\n // --- your existing button ---\n if (frm.doc.name && !frm.is_new() && !frm.doc.__islocal) {\n frm.add_custom_button(__('Service Report'), function() {\n let asset = frm.doc.name;\n let print = \"Job Order\";\n let url = `/printview?doctype=Work_Order&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank');\n });\n }\n\n // --- one-line check for asset_type ---\n // if (!frm.doc.asset_type) {\n // let roles = frappe.user_roles;\n // if (\n // (roles.includes(\"PHCC Site Manager\") || roles.includes(\"PHCC End User\"))\n // // !roles.includes(\"General WOA\") &&\n // // !roles.includes(\"Maintenance Manager\") &&\n // // !roles.includes(\"Technician\")\n // ) {\n // frm.set_value(\"asset_type\", \"Biomedical\");\n // }\n // }\n // If empty, set default for specific roles\n if (!frm.doc.asset_type) {\n let roles = frappe.user_roles;\n if (roles.includes(\"PHCC Site Manager\") || roles.includes(\"PHCC End User\") &&\n !roles.includes(\"General WOA\") &&\n !roles.includes(\"Maintenance Manager\") &&\n !roles.includes(\"Technician\")\n )\n {\n frm.set_value(\"asset_type\", \"Biomedical\");\n }\n }\n\n // Always apply read-only condition for these roles\n let roles = frappe.user_roles;\n \n if (\n (roles.includes(\"PHCC Site Manager\") || roles.includes(\"PHCC End User\")) &&\n !roles.includes(\"System Manager\")\n ) {\n frm.set_df_property(\"asset_type\", \"read_only\", 1);\n } else {\n frm.set_df_property(\"asset_type\", \"read_only\", 0);\n }\n\n }\n});\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance Log",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:40:18.906137",
|
||
"module": "Asset Lite",
|
||
"name": "Asset PF",
|
||
"script": "frappe.ui.form.on('Asset Maintenance Log', {\n\trefresh(frm) {\n\t frm.set_query(\"custom_hospital_name\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n\t // Wait for buttons to load then hide them\n setTimeout(function() {\n // Hide buttons by text content\n $('.btn-default:contains(\"PPM Sticker\")').hide();\n $('.btn-default:contains(\"Service Report\")').hide();\n \n // Or hide buttons by specific selectors\n $('button[data-original-title=\"PPM Sticker\"]').hide();\n $('button[data-original-title=\"Service Report\"]').hide();\n \n // Hide dropdown menu items\n $('.dropdown-menu li:contains(\"PPM Sticker\")').hide();\n $('.dropdown-menu li:contains(\"Service Report\")').hide();\n }, 500);\n\t \n\t \n\t if (frm.doc.name && !frm.is_new())\n\t\tfrm.add_custom_button(__('PPM'), function() {\n let asset = frm.doc.name;\n let print = \"PPM Assets\"; // Your custom Print Format name\n let url = `/printview?doctype=Asset Maintenance Log&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank'); // Open in new tab\n });\n if (frm.doc.name && !frm.is_new())\n\t\tfrm.add_custom_button(__('Safety check'), function() {\n let asset = frm.doc.name;\n let print = \"Safety check\"; // Your custom Print Format name\n let url = `/printview?doctype=Asset Maintenance Log&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank'); // Open in new tab\n });\n\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Material Request",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:38:08.112181",
|
||
"module": "Asset Lite",
|
||
"name": "Material PF",
|
||
"script": "frappe.ui.form.on('Material Request', {\n\trefresh(frm) {\n\t frm.set_query(\"company\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n\t \n\t // Wait for buttons to load then hide them\n setTimeout(function() {\n // Hide buttons by text content\n $('.btn-default:contains(\"Get Items From\")').hide();\n \n // Or hide buttons by specific selectors\n $('button[data-original-title=\"Get Items From\"]').hide();\n \n // Hide dropdown menu items\n $('.dropdown-menu li:contains(\"Get Items From\")').hide();\n }, 500);\n\t \n\t \n// \t\t\tfrm.add_custom_button(__('Spare Parts Request'), function() {\n// let asset = frm.doc.name;\n// let print = \"Spare Parts Request\"; // Your custom Print Format name\n// let url = `/printview?doctype=Material Request&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n// window.open(url, '_blank'); // Open in new tab\n// });\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-08-08 17:49:59.050067",
|
||
"module": "Asset Lite",
|
||
"name": "AssetPF button",
|
||
"script": "frappe.ui.form.on('Asset', {\n\trefresh(frm) {\n\t if (frm.doc.name && !frm.is_new())\n\t\tfrm.add_custom_button(__('Installation Report'), function() {\n let asset = frm.doc.name;\n let print = \"Installation Report\"; // Your custom Print Format name\n let url = `/printview?doctype=Asset&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank'); // Open in new tab\n });\n if (frm.doc.name && !frm.is_new())\n\t\tfrm.add_custom_button(__('Stay Plugged'), function() {\n let asset = frm.doc.name;\n let print = \"Stay Plugged\"; // Your custom Print Format name\n let url = `/printview?doctype=Asset&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank'); // Open in new tab\n });\n\n \n if (frm.doc.status === 'Scrapped') {\n frm.add_custom_button(__('Dismantling Report'), function() {\n let asset = frm.doc.name;\n let print = \"Dismantelling Report\"; // Your custom Print Format name\n let url = `/printview?doctype=Asset&name=${asset}&format=${print}&no_letterhead=1&_lang=en`;\n window.open(url, '_blank'); // Open in new tab\n });\n }\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Material Transfer",
|
||
"enabled": 1,
|
||
"modified": "2025-07-30 20:46:55.416502",
|
||
"module": "Asset Lite",
|
||
"name": "Material Transfer",
|
||
"script": "frappe.ui.form.on('Material Transfer', {\r\n onload: function(frm) {\r\n console.log(\"Asset:\", frm.doc.asset);\r\n console.log(\"Item:\", frm.doc.item);\r\n\r\n // Ensure route options exist\r\n if (!frappe.route_options) return;\r\n\r\n // Case 1: Asset is present, Item is empty\r\n if (frm.doc.asset && !frm.doc.item) {\r\n console.log(\"Processing Asset\");\r\n\r\n frm.set_value('transfer_type', 'Asset');\r\n\r\n frm.clear_table('asset_transfer');\r\n\r\n frappe.db.get_value('Asset', frm.doc.asset, 'asset_name')\r\n .then(r => {\r\n if (r.message) {\r\n let value = r.message.asset_name;\r\n\r\n let row = frm.add_child('asset_transfer');\r\n row.asset = frm.doc.asset;\r\n row.asset_name = value;\r\n\r\n frm.refresh_field('asset_transfer');\r\n delete frappe.route_options;\r\n }\r\n });\r\n\r\n }\r\n // Case 2: Item is present, Asset is empty\r\n else if (frm.doc.item && !frm.doc.asset) {\r\n console.log(\"Processing Item\");\r\n\r\n frm.set_value('transfer_type', 'Item');\r\n\r\n // Set item value from route_options if available\r\n if (frappe.route_options.item_code) {\r\n frm.set_value(\"item\", frappe.route_options.item_code);\r\n }\r\n\r\n frm.clear_table('item_table');\r\n\r\n frappe.db.get_value('Item', frm.doc.item, ['item_name', 'stock_uom'])\r\n .then(r => {\r\n if (r.message) {\r\n let item_name = r.message.item_name;\r\n let uom = r.message.stock_uom;\r\n\r\n let row = frm.add_child('item_table');\r\n row.item = frm.doc.item;\r\n row.item_name = item_name;\r\n row.uom = uom;\r\n\r\n frm.refresh_field('item_table');\r\n delete frappe.route_options;\r\n }\r\n });\r\n }\r\n // Case 3: Neither or both are present\r\n else {\r\n console.log(\"Neither Asset nor Item or both provided. Clearing type.\");\r\n frm.set_value('transfer_type', '');\r\n frm.refresh_field('transfer_type');\r\n }\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "PM Schedule Generator",
|
||
"enabled": 1,
|
||
"modified": "2025-09-18 13:12:54.763131",
|
||
"module": "Asset Lite",
|
||
"name": "PM Schedule Generator",
|
||
"script": "frappe.ui.form.on('PM Schedule Generator', {\r\n refresh: function (frm) {\r\n \r\n \r\n frm.set_query(\"hospital\", () => {\r\n return {\r\n filters: {\r\n domain:\"Healthcare\"\r\n }\r\n };\r\n });\r\n frm.set_query(\"maintenance_team\", () => {\r\n return {\r\n filters: {\r\n company:frm.doc.hospital\r\n }\r\n };\r\n });\r\n \r\n frm.trigger('maintenance_team');\r\n // Add the button only when the doc is saved\r\n if (!frm.is_new()) {\r\n frm.add_custom_button(__('Fetch Assets'), () => {\r\n frm.trigger('fetch_assets');\r\n });\r\n }\r\n \r\n if(frm.doc.docstatus == 0){\r\n // Hide the default print icon\r\n frm.page.hide_icon_group('print');\r\n }\r\n },\r\n \r\n fetch_assets: function (frm) {\r\n console.log(\"Called method\");\r\n \r\n frappe.call({\r\n method: 'get_assets', // This will call the server script method\r\n args: {\r\n company: frm.doc.hospital,\r\n // asset_name: frm.doc.asset_name,\r\n custom_modality: frm.doc.modality,\r\n custom_manufacturer: frm.doc.manufacturer,\r\n custom_device_status: frm.doc.device_status,\r\n custom_model:frm.doc.model\r\n },\r\n callback: function (r) {\r\n console.log(r);\r\n if (r.message && r.message.length > 0) {\r\n console.log(r.message);\r\n frm.clear_table('maintenance_entries');\r\n r.message.forEach(asset => {\r\n let row = frm.add_child('maintenance_entries');\r\n row.asset = asset.name;\r\n row.asset_name = asset.asset_name;\r\n row.start_date = frm.doc.start_date;\r\n row.end_date = frm.doc.end_date;\r\n row.manufacturer = asset.custom_manufacturer;\r\n row.model = asset.custom_model;\r\n // row.periodicity = frm.doc.periodicity;\r\n // row.assigned_to = frm.doc.assigned_to;\r\n // row.maintenance_team = frm.doc.maintenance_team;\r\n });\r\n frm.refresh_field('maintenance_entries');\r\n frappe.msgprint(__('Fetched {0} asset(s).', [r.message.length]));\r\n } else {\r\n frappe.msgprint(__('No assets found matching the criteria.'));\r\n }\r\n },\r\n error: function(r) {\r\n console.error(\"Error fetching assets:\", r);\r\n frappe.msgprint(__('Error fetching assets. Please check the console for details.'));\r\n }\r\n });\r\n },\r\n \r\n \r\n maintenance_team: function(frm) {\r\n if (!frm.doc.maintenance_team) return;\r\n\r\n frappe.db.get_doc(\"Asset Maintenance Team\", frm.doc.maintenance_team).then(doc => {\r\n let members = [];\r\n if (doc.maintenance_team_members) {\r\n members = doc.maintenance_team_members.map(row => row.team_member);\r\n }\r\n\r\n frm.set_query(\"assign_to\", () => {\r\n return {\r\n filters: {\r\n name: [\"in\", members]\r\n }\r\n };\r\n });\r\n\r\n // Clear old value if it's not in allowed members\r\n if (frm.doc.assign_to && !members.includes(frm.doc.assign_to)) {\r\n frm.set_value(\"assign_to\", null);\r\n }\r\n });\r\n }\r\n\r\n\r\n});",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-08-08 17:53:23.209103",
|
||
"module": "Asset Lite",
|
||
"name": "Default Site contractor value",
|
||
"script": "frappe.ui.form.on(\"Asset\", {\r\n custom_asset_type: function(frm) {\r\n const type = (frm.doc.custom_asset_type || \"\").toString().trim().toLowerCase();\r\n if (type === \"biomedical\") {\r\n if (frm.doc.custom_site_contractor !== \"SAMAMA\") {\r\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\r\n }\r\n } else {\r\n // only clear if it was auto-set to SAMAMA, avoid stomping on other manual values\r\n if (frm.doc.custom_site_contractor === \"SAMAMA\") {\r\n frm.set_value(\"custom_site_contractor\", \"\");\r\n }\r\n }\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Movement",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:41:01.882538",
|
||
"module": "Asset Lite",
|
||
"name": "Asset Movement",
|
||
"script": "frappe.ui.form.on('Asset Movement', {\n\trefresh(frm) {\n\t\tfrm.set_query(\"company\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n\t}\n})",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:41:54.938994",
|
||
"module": "Asset Lite",
|
||
"name": "Auto assignment based on Workflow",
|
||
"script": "frappe.ui.form.on('Work_Order', {\n before_workflow_action: function(frm) {\n let action = frm.selected_workflow_action;\n\n frappe.call({\n method: \"assign_supervisor_or_technician\",\n args: {\n work_order: frm.doc.name,\n action: action,\n asset_type:frm.doc.asset_type\n },\n callback: function(r) {\n if (r.message && r.message.assigned_to) {\n frappe.msgprint(\"Assigned to: \" + r.message.assigned_to);\n frm.reload_doc(); // refresh with updated server values\n }\n }\n });\n }\n \n});\n\n\n// frappe.ui.form.on(\"Work_Order\", {\n// after_workflow_action: function(frm) {\n// let action = frm.selected_workflow_action;\n// console.log(action)\n// console.log(frm.doc.workflow_state)\n\n// if (frm.doc.workflow_state === \"Sent To Maintenance manger\") {\n// frappe.call({\n// method: \"frappe.client.get_list\",\n// args: {\n// doctype: \"User\",\n// filters: {\n// \"custom_site_name\": frm.doc.company,\n// \"enabled\": 1\n// },\n// fields: [\"name\"],\n// limit_page_length: 50\n// },\n// callback: function(r) {\n// if (r.message) {\n// for (let user of r.message) {\n// frappe.call({\n// method: \"frappe.client.get\",\n// args: { doctype: \"User\", name: user.name },\n// callback: function(res) {\n// if (res.message) {\n// let roles = res.message.roles.map(x => x.role);\n// if (roles.includes(\"Maintenance Manager\") && !frm.doc.custom_assigned_supervisor) {\n// frm.set_value(\"custom_assigned_supervisor\", user.name);\n// frm.refresh_field(\"custom_assigned_supervisor\");\n \n// console.log(\"Assigned MM:\", user.name);\n// frm.save().then(() => {\n// console.log(\"✅ Assigned & saved MM:\", user.name);\n// });\n// }\n// }\n// }\n// });\n// }\n// }\n// }\n// });\n// }\n// }\n// });\n\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:43:49.044605",
|
||
"module": "Asset Lite",
|
||
"name": "To cancel Work Order",
|
||
"script": "frappe.ui.form.on('Work_Order', {\r\n asset_type: function(frm) {\r\n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.work_order_type){\r\n frm.set_value(\"work_order_type\", \"Repair (CM)\")\r\n }\r\n },\r\n \r\n refresh: function(frm) {\r\n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.work_order_type){\r\n frm.set_value(\"work_order_type\", \"Repair (CM)\")\r\n }\r\n if (frm.doc.repair_status === \"Open\" && !frappe.user.has_role(\"System Manager\")) {\r\n frm.set_df_property(\"repair_status\", \"read_only\", 1);\r\n }\r\n if (frm.doc.repair_status === \"Work In Progress\" && !frappe.user.has_role(\"System Manager\")) {\r\n frm.set_df_property(\"repair_status\", \"read_only\", 1);\r\n }\r\n \r\n \r\n if (frm.doc.docstatus === 0 && frappe.user.has_role(\"System Manager\") && !frm.is_new()) {\r\n frm.add_custom_button(__('Cancel WO'), function() {\r\n frappe.confirm(\r\n 'Are you sure you want to Cancel this order?',\r\n function() {\r\n frm.set_value(\"repair_status\", \"Cancelled\").then(() => {\r\n frappe.call({\r\n method: \"frappe.client.submit\",\r\n args: {\r\n doc: frm.doc\r\n },\r\n callback: function() {\r\n frappe.call({\r\n method: \"frappe.client.cancel\",\r\n args: {\r\n doctype: frm.doc.doctype,\r\n name: frm.doc.name\r\n },\r\n callback: function() {\r\n frappe.call({\r\n method: \"frappe.client.set_value\",\r\n args: {\r\n doctype: frm.doc.doctype,\r\n name: frm.doc.name,\r\n fieldname: \"workflow_state\",\r\n value: \"Cancelled\"\r\n },\r\n callback: function() {\r\n frappe.show_alert({\r\n message: __('Order Cancelled'),\r\n indicator: 'red'\r\n });\r\n frm.reload_doc();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n );\r\n });\r\n }\r\n }\r\n});\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 1,
|
||
"modified": "2025-08-26 13:44:02.628643",
|
||
"module": "Asset Lite",
|
||
"name": "Central Warehouse",
|
||
"script": "frappe.ui.form.on('Work_Order', {\r\n refresh: function(frm) {\r\n console.log(\"Work Order fields:\", frm.doc);\r\n console.log(\"Stock items field:\", frm.doc.stock_items);\r\n }\r\n});\r\n\r\n// Child table events\r\nfrappe.ui.form.on('Asset Repair Consumed Item', { // child table Doctype\r\n\r\n // When a row is added\r\n stock_items_add: function(frm, cdt, cdn) {\r\n let row = locals[cdt][cdn];\r\n // if (!row.warehouse) {\r\n row.warehouse = 'Al Jouf Central Warehouse - AJH';\r\n frm.refresh_field('stock_items');\r\n // }\r\n },\r\n\r\n // When an item is selected/changed\r\n item_code: function(frm, cdt, cdn) {\r\n let row = locals[cdt][cdn];\r\n // If warehouse is empty, keep it default\r\n // if (!row.warehouse) {\r\n row.warehouse = 'Al Jouf Central Warehouse - AJH';\r\n frm.refresh_field('stock_items');\r\n // }\r\n // If user already selected warehouse, don't overwrite\r\n }\r\n});\r\n\r\n\r\n",
|
||
"view": "Form"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Web Page",
|
||
"enabled": 1,
|
||
"modified": "2025-09-08 20:52:52.613500",
|
||
"module": "Asset Lite",
|
||
"name": "Test code Push",
|
||
"script": "frappe.listview_settings['Web Page'] = {\r\n onload: function(listview) {\r\n console.log('=== WEB PAGE TEST ===');\r\n console.log('Code push working!');\r\n console.log('Time:', new Date().toISOString());\r\n console.log('User:', frappe.session.user);\r\n console.log('List data:', listview.data.length, 'items');\r\n console.log(\"Test\")\r\n }\r\n};",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Work_Order",
|
||
"enabled": 0,
|
||
"modified": "2025-09-10 16:05:00.010007",
|
||
"module": "Asset Lite",
|
||
"name": "Hospital Filter for wo",
|
||
"script": "frappe.listview_settings['Work_Order'] = {\r\n onload(listview) {\r\n const hideNames = [\r\n \"Al Jouf Hospital\"\r\n ];\r\n\r\n // Exclude directly via get_query on company field\r\n let companyField = listview.page.fields_dict.company;\r\n if (companyField) {\r\n companyField.get_query = () => ({\r\n filters: [[\"name\", \"not in\", hideNames]]\r\n });\r\n }\r\n\r\n // Extra safeguard: strip suggestions from dropdown\r\n const obs = new MutationObserver(muts => {\r\n muts.forEach(m => {\r\n m.addedNodes.forEach(node => {\r\n if (node.nodeType === 1) {\r\n node.querySelectorAll(\"li, div, span\").forEach(el => {\r\n if (hideNames.includes((el.textContent || \"\").trim())) {\r\n el.remove();\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n obs.observe(document.body, { childList: true, subtree: true });\r\n }\r\n};\r\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset",
|
||
"enabled": 1,
|
||
"modified": "2025-09-08 16:31:16.492729",
|
||
"module": "Asset Lite",
|
||
"name": "Hospital Filter for Asset",
|
||
"script": "frappe.listview_settings['Asset'] = {\r\n onload(listview) {\r\n const hideNames = [\r\n \"Al Jouf Hospital\"\r\n ];\r\n\r\n // Exclude directly via get_query on company field\r\n let companyField = listview.page.fields_dict.company;\r\n if (companyField) {\r\n companyField.get_query = () => ({\r\n filters: [[\"name\", \"not in\", hideNames]]\r\n });\r\n }\r\n\r\n // Extra safeguard: strip suggestions from dropdown\r\n const obs = new MutationObserver(muts => {\r\n muts.forEach(m => {\r\n m.addedNodes.forEach(node => {\r\n if (node.nodeType === 1) {\r\n node.querySelectorAll(\"li, div, span\").forEach(el => {\r\n if (hideNames.includes((el.textContent || \"\").trim())) {\r\n el.remove();\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n obs.observe(document.body, { childList: true, subtree: true });\r\n }\r\n};\r\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance",
|
||
"enabled": 1,
|
||
"modified": "2025-09-08 18:16:34.856363",
|
||
"module": "Asset Lite",
|
||
"name": "Hospital Filter for AM",
|
||
"script": "frappe.listview_settings['Asset Maintenance'] = {\r\n onload(listview) {\r\n const hideNames = [\r\n \"Al Jouf Hospital\"\r\n ];\r\n\r\n // Exclude directly via get_query on company field\r\n let companyField = listview.page.fields_dict.company;\r\n if (companyField) {\r\n companyField.get_query = () => ({\r\n filters: [[\"name\", \"not in\", hideNames]]\r\n });\r\n }\r\n\r\n // Extra safeguard: strip suggestions from dropdown\r\n const obs = new MutationObserver(muts => {\r\n muts.forEach(m => {\r\n m.addedNodes.forEach(node => {\r\n if (node.nodeType === 1) {\r\n node.querySelectorAll(\"li, div, span\").forEach(el => {\r\n if (hideNames.includes((el.textContent || \"\").trim())) {\r\n el.remove();\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n obs.observe(document.body, { childList: true, subtree: true });\r\n }\r\n};\r\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Maintenance Log",
|
||
"enabled": 1,
|
||
"modified": "2025-09-09 13:07:55.732709",
|
||
"module": "Asset Lite",
|
||
"name": "Hospital Filter for AML",
|
||
"script": "frappe.listview_settings['Asset Maintenance Log'] = {\n onload(listview) {\n const hideNames = [\n \"Al Jouf Hospital\"\n ];\n\n // Exclude directly via get_query on company field\n let companyField = listview.page.fields_dict.custom_hospital_name;\n if (companyField) {\n companyField.get_query = () => ({\n filters: [[\"name\", \"not in\", hideNames]]\n });\n }\n\n // Extra safeguard: strip suggestions from dropdown\n const obs = new MutationObserver(muts => {\n muts.forEach(m => {\n m.addedNodes.forEach(node => {\n if (node.nodeType === 1) {\n node.querySelectorAll(\"li, div, span\").forEach(el => {\n if (hideNames.includes((el.textContent || \"\").trim())) {\n el.remove();\n }\n });\n }\n });\n });\n });\n obs.observe(document.body, { childList: true, subtree: true });\n }\n};\n",
|
||
"view": "List"
|
||
},
|
||
{
|
||
"docstatus": 0,
|
||
"doctype": "Client Script",
|
||
"dt": "Asset Movement",
|
||
"enabled": 1,
|
||
"modified": "2025-09-09 13:05:17.524870",
|
||
"module": "Asset Lite",
|
||
"name": "Hospital Filter for Asset Movement",
|
||
"script": "frappe.listview_settings['Asset Movement'] = {\n onload(listview) {\n const hideNames = [\n \"Al Jouf Hospital\"\n ];\n\n // Exclude directly via get_query on company field\n let companyField = listview.page.fields_dict.company;\n if (companyField) {\n companyField.get_query = () => ({\n filters: [[\"name\", \"not in\", hideNames]]\n });\n }\n\n // Extra safeguard: strip suggestions from dropdown\n const obs = new MutationObserver(muts => {\n muts.forEach(m => {\n m.addedNodes.forEach(node => {\n if (node.nodeType === 1) {\n node.querySelectorAll(\"li, div, span\").forEach(el => {\n if (hideNames.includes((el.textContent || \"\").trim())) {\n el.remove();\n }\n });\n }\n });\n });\n });\n obs.observe(document.body, { childList: true, subtree: true });\n }\n};\n",
|
||
"view": "List"
|
||
}
|
||
] |