[
{
"docstatus": 0,
"doctype": "Client Script",
"dt": "Workspace",
"enabled": 1,
"modified": "2025-04-22 21:19:46.116635",
"module": "Asset Lite",
"name": "Asset Workspace",
"script": "frappe.ui.form.on('Workspace', {\r\n onload: function(frm) {\r\n \r\n // Get the current user's roles\r\n frappe.ready(function() {\r\n // Get the current user's roles\r\n const user_roles = frappe.user.get_roles();\r\n\r\n // Hide all shortcut cards initially\r\n $('.shortcut-card').hide();\r\n\r\n // Show blocks based on user roles\r\n \r\n\r\n \r\n\r\n if (user_roles.includes('Finance Manager')) { // Replace with actual role names\r\n $('#procurement-custom-block').show();\r\n }\r\n\r\n if (user_roles.includes('Finance Manager')) { // Replace with actual role names\r\n $('#procurement-custom-block').show();\r\n }\r\n});\r\n \r\n }\r\n \r\n});\r\n",
"view": "Form"
},
{
"docstatus": 0,
"doctype": "Client Script",
"dt": "Work_Order",
"enabled": 1,
"modified": "2025-08-26 16:30:44.059835",
"module": "Asset Lite",
"name": "Work Job Order",
"script": "frappe.ui.form.on('Work_Order', {\n asset_type: function (frm) {\n if(frm.doc.asset_type === \"Non Biomedical\"){\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"Sub Contractor\" \n }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"General WOA\" \n }\n };\n });\n // apply_contractor_filter(frm);\n }\n else{\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n filters: { }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n filters: {}\n };\n });\n }\n \n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.custom_site_contractor){\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\n }\n \n if (frm.doc.asset_type === 'Non Biomedical') {\n // Show all work order types\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {custom_biomedical: 0} \n };\n });\n } else {\n // Only show work order types where custom_biomedical is checked\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 1\n }\n };\n });\n }\n\n // Optionally clear previously selected work_order_type if it doesn’t match filter\n frm.set_value(\"work_order_type\", null);\n },\n site_name(frm){\n if(frm.doc.site_name){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n custom_site: frm.doc.site_name,\n company:frm.doc.company\n }\n };\n });\n }\n // if(frm.dic.asset_type === \"Non Biomedical\"){\n // apply_contractor_filter(frm);\n // }\n },\n company(frm){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n company:frm.doc.company\n }\n };\n });\n },\n department(frm){\n if(frm.doc.department){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n department:frm.doc.department,\n company:frm.doc.company\n }\n };\n });\n }\n },\n refresh(frm){\n if(!frappe.user.has_role(\"System Manager\")){\n $(\".form-assignments\").hide();\n }\n\t\t\n\t\n if(frm.doc.department){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n department:frm.doc.department,\n company:frm.doc.company\n }\n };\n });\n }\n if(frm.doc.asset_type === \"Non Biomedical\"){\n frm.set_query(\"custom_assign_to_contractor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"Sub Contractor\" \n }\n };\n });\n frm.set_query(\"custom_assigned_supervisor\", function() {\n return {\n query: \"frappe.core.doctype.user.user.user_query\",\n filters: {\n role: \"General WOA\" \n }\n };\n });\n // apply_contractor_filter(frm);\n }\n \n frm.set_query(\"company\", () => {\n return {\n filters: {\n domain:\"Healthcare\"\n }\n };\n });\n \n \n if(frm.doc.site_name){\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n custom_site: frm.doc.site_name,\n company:frm.doc.company\n }\n };\n });\n }else{\n frm.set_query(\"asset\", () => {\n return {\n filters: {\n company:frm.doc.company\n }\n };\n });\n }\n \n \n if(frm.doc.asset_type === \"Biomedical\" && !frm.doc.custom_site_contractor){\n frm.set_value(\"custom_site_contractor\", \"SAMAMA\");\n }\n \n if (frm.doc.asset_type === 'Non Biomedical') {\n // Show all work order types\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 0\n \n }\n };\n });\n } else {\n // Only show work order types where custom_biomedical is checked\n frm.set_query(\"work_order_type\", () => {\n return {\n filters: {\n custom_biomedical: 1\n }\n };\n });\n }\n\n \n if (!frm.doc.failure_date) {\n // frm.set_value('failure_date', frappe.datetime.now_datetime());\n let now = frappe.datetime.now_datetime(); // This is usually UTC\n // let local_now = frappe.datetime.convert_to_system_timezone(now);\n let local_now = frappe.datetime.get_datetime_as_string();\n console.log(local_now)\n frm.set_value('failure_date', local_now);\n }\n \n // // Roles allowed to edit the field\n // const allowed_roles = [\"System Manager\", \"Maintenance Manager\"];\n // const user_roles = frappe.user_roles;\n \n // console.log(user_roles)\n\n // const is_only_end_user = (\n // user_roles.includes(\"End user\") && !user_roles.includes(\"System Manager\") && !user_roles.includes(\"Maintenance Manager\")\n // // user_roles.every(role => role === \"End user\")\n // );\n // console.log(is_only_end_user)\n\n // // Make field read-only if user has only End User role\n // frm.set_df_property(\"failure_date\", \"read_only\", is_only_end_user);\n \n // const is_only_phcc_end_user = (\n // user_roles.includes(\"PHCC End User\") && !user_roles.includes(\"System Manager\") && !user_roles.includes(\"PHCC Site Manager\")\n // // user_roles.every(role => role === \"End user\")\n // );\n // console.log(is_only_phcc_end_user)\n\n // // Make field read-only if user has only End User role\n // frm.set_df_property(\"failure_date\", \"read_only\", is_only_phcc_end_user);\n \n const user_roles = frappe.user_roles || [];\n \n // Roles that are allowed to edit\n const editable_roles = [\"System Manager\", \"Maintenance Manager\", \"PHCC Site Manager\"];\n \n // Helper to check if user has any of the editable roles\n const has_edit_permission = editable_roles.some(role => user_roles.includes(role));\n \n // Check if user has only \"End user\" or only \"PHCC End User\", and no editable roles\n const is_restricted_user =\n (user_roles.includes(\"End user\") || user_roles.includes(\"PHCC End User\") ||user_roles.includes(\"Technician\")) &&\n !has_edit_permission;\n \n // Set \"failure_date\" as read-only based on restriction\n frm.set_df_property(\"failure_date\", \"read_only\", is_restricted_user);\n \n frappe.call({\n method: \"frappe.client.get\",\n args: {\n doctype: \"User\",\n name: frappe.session.user,\n },\n callback: function (r) {\n if (r.message) {\n const site_name = r.message.custom_site_name || \"\";\n \n frm.set_query(\"department\", function () {\n // Base filter\n let base_filters = [[\"Department\", \"company\", \"=\", frm.doc.company]];\n \n // If site name starts with \"Mobile\", exclude Bio departments\n if(site_name){\n if (site_name.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n if(frm.doc.company){\n if (frm.doc.company.startsWith(\"Mobile\")) {\n // base_filters.push([\"Department\", \"department_name\", \"not like\", \"Bio%\"]);\n console.log(site_name)\n }\n else{\n base_filters.push([\"Department\", \"department_name\", \"not like\", \"Non Bio%\"]);\n }\n }\n \n \n return {\n filters: base_filters\n };\n });\n }\n }\n });\n\n \n // frm.set_query(\"asset\", function() {\n // console.log(\"Asset Id\")\n // return {\n // filters: {\n // company: frm.doc.company\n // }\n // };\n // });\n \n frm.fields_dict['stock_items'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {\n var child = locals[cdt][cdn];\n console.log(child)\n return { \n filters:[\n [\"custom_hospital_name\",'=',frm.doc.company],\n [\"is_stock_item\", \"=\", 1]\n \n ]\n }\n }\n\n \n frm.fields_dict['invoice_table'].grid.get_field('purchase_invoice').get_query = function(doc, cdt, cdn) {\n var child = locals[cdt][cdn];\n console.log(child)\n return { \n filters:[\n [\"custom_work_order\",'=',frm.doc.name]\n \n ]\n }\n }\n \n// frappe.db.get_list('Material Request', {\n// fields: ['name'],\n// filters: {\n// custom_work_orders: frm.doc.name\n// },\n// limit:500\n// }).then(records => {\n// console.log(records);\n// var list =[]\n// for(var i in records){\n// list.push(records[i].name)\n// }\n// console.log(list);\n// \t\tfrm.fields_dict['invoice_table'].grid.get_field('purchase_invoice').get_query = function(doc, cdt, cdn) {\n// var child = locals[cdt][cdn];\n// console.log(child)\n// return { \n// filters:[\n// [\"purchase_request\",'in',list]\n \n// ]\n// }\n// }\n// })\n \n if(frm.doc.workflow_state==\"Pending Approval\"){\n frm.set_df_property(\"repair_status\", \"options\", [\"Open\", \"Work In Progress\",\"Pending Review\",\"Completed\",\"Cancelled\",\"Closed\"]);\n frm.refresh_field(\"repair_status\")\n }\n else{\n frm.set_df_property(\"repair_status\", \"options\", [\"Open\", \"Work In Progress\",\"Pending Review\",\"Cancelled\",\"Closed\"]);\n frm.refresh_field(\"repair_status\")\n }\n \n /* if (frm.doc.docstatus === 0) { // Only for Draft status\n // Ensure connections are defined in the dashboard and set allow_add\n if (frm.dashboard && frm.dashboard.links) {\n frm.dashboard.links.forEach(link => {\n link.allow_add = true; // Explicitly enable + Add button\n });\n \n // Full refresh to apply changes\n frm.dashboard.show();\n }\n }*/\n \n // if (frm.is_new()) {\n \n // frm.set_value(\"aseet_id\", frm.doc.asset)\n \n // frm.refresh_field('aseet_id')\n // // frm.set_value(\"asset\", \"\")\n // // frm.set_value(\"asset\", frm.doc.asset);\n // frm.set_value(\"asset\", frm.doc.aseet_id)\n // console.log(frm.doc.asset)\n // console.log(frm.doc.aseet_id)\n // }\n if (frm.is_new() && frm.doc.asset) {\n let asset_value = frm.doc.asset;\n \n frm.set_value(\"asset\", \"\"); // Clear the field\n frm.refresh_field(\"asset\");\n \n // Slight delay to ensure re-setting triggers fetch logic\n setTimeout(() => {\n frm.set_value(\"asset\", asset_value); // Re-enter the original value\n frm.refresh_field(\"asset\");\n }, 10);\n }\n\n \n \n\n \n \n checkboxcolour(frm)\n \n // if(frm.doc.asset&&frm.doc.workflow_state==\"Draft\"){\n if(frm.doc.asset){\n\t frappe.db.get_doc('Asset', frm.doc.asset)\n .then(doc => {\n const today = new Date();\n console.log(today)\n \n \n if(frm.doc.custom_start_date && frm.doc.custom_end_date){\n var warrantyStart = new Date(frm.doc.custom_start_date)\n var warrantyEnd = new Date(frm.doc.custom_end_date)\n if (warrantyStart && warrantyEnd) {\n if (warrantyStart <= today && today <= warrantyEnd) {\n if(frm.doc.custom_service_agreement == \"Warranty\"){\n frm.dashboard.add_comment(__(\"This Asset has an Active Warranty Service Agreement!\"),\"green\",true);\n }\n else if(frm.doc.custom_service_agreement == \"Contract\"){\n frm.dashboard.add_comment(__(\"This Asset has an Active Contract Service Agreement!\"),\"green\",true);\n }\n else if(frm.doc.custom_service_agreement == \"Frame Work\"){\n frm.dashboard.add_comment(__(\"This Asset has an Active Frame Work Service Agreement!\"),\"green\",true);\n }\n }\n else if (today > warrantyEnd){\n frm.dashboard.add_comment(__(\"This Asset's warranty has expired!\"),\"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(__(\"This Asset has an Active warranty!\"),\"green\",true);\n // }\n // else if (today > warrantyEnd){\n // frm.dashboard.add_comment(__(\"This Asset's warranty has expired!\"),\"yellow\",true);\n // }\n // else {\n\t\t // frm.dashboard.add_comment(__(\"This Asset's warranty period is yet to start!\"),\"blue\",true);\n // \t\t }\n // }\n // }\n // else{\n // frm.dashboard.add_comment(__(\"No warranty found for this Asset!\"),\"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(__(\"This Asset has an Active Comprehensive Service Contract. Please contact this Vendor {0}\",[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(__(\"This Asset has an Active Service Contract with PPM only. Please contact this Vendor {0}\",[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(__(\"This Asset has an Active Service Contract with Spare parts and Labour. Please contact this Vendor {0}\",[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(__(\"This Asset has an Active Service Contract with Covering Of Labour. Please contact this Vendor {0}\",[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(__(\"This Asset has an Active Service Contract!. Please contact this Vendor {0}\",[sp_doc.vendor]),\"green\",true);\n \n // }\n // else if (today > serviceEnd){\n // frm.dashboard.add_comment(__(\"This Asset's Service Contract has expired!\"),\"yellow\",true);\n // }\n \n \n // }\n // }\n \n // else{\n // frm.dashboard.add_comment(__(\"No Service Contract found for this Asset!\"),\"red\",true);\n // }\n // })\n // }\n // else{\n // frm.dashboard.add_comment(__(\"No Service Contract found for this Asset!\"),\"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 = ``;\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 ${row.item_code} in warehouse ${row.warehouse}.
\n Available: ${row.custom_available_stock}, Required: ${row.consumed_quantity}.\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 ${row.item_code} in warehouse ${row.warehouse}.
\n// Available: ${row.custom_available_stock}, Required: ${row.consumed_quantity}.\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(__(\"This Asset's warranty has been expired!\"),\"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(__(\"This Asset has an Active warranty!\"),\"green\",true);\r\n // // \t\t }\r\n // // \t\t else {\r\n\t\t //// frm.dashboard.add_comment(__(\"This Asset's warranty period is yet to start!\"),\"blue\",true);\r\n // // \t\t }\r\n // // }\r\n // // else{\r\n // // frm.dashboard.add_comment(__(\"No warranty found for this Asset!\"),\"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 = $('