KFSH/asset_lite/fixtures/client_script.json
2025-12-11 13:37:26 +05:30

629 lines
175 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[
{
"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 doesnt 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"
}
]