From ec38044fe2094ea46610c463c1d92758277be1a2 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Fri, 13 Apr 2018 20:20:24 +0530 Subject: [PATCH 001/154] New DocTypes for HR Module (#13650) * New DocType Employee Incentive * New DocType Shift Type * New DocType Shift Assignment * New DocType Shift Assignment Tool * New DocType Shift Request * New DocType Salary Structure Assignment * Added Permissions * New DocType Employee Lifecycle Process * New DocType Employee Lifecycle Activity Type * New DocType Employee Lifecycle Activity * New DocType Employee Lifecycle Process Template * New DocType Employee Lifecycle Process Template Detail * Permissions and Auto Name * New DocType Staffing Plan * New DocType Staffing Plan Detail * Added fields in Job Opening * New DocType Employee Transfer * New DocType Employee Promotion * [minor] --- .../hr/doctype/employee_incentive/__init__.py | 0 .../employee_incentive/employee_incentive.js | 8 + .../employee_incentive.json | 225 ++++++++++ .../employee_incentive/employee_incentive.py | 10 + .../test_employee_incentive.js | 23 + .../test_employee_incentive.py | 10 + .../__init__.py | 0 .../employee_life_cycle_process_template.js | 8 + .../employee_life_cycle_process_template.json | 194 +++++++++ .../employee_life_cycle_process_template.py | 10 + ...st_employee_life_cycle_process_template.js | 23 + ...st_employee_life_cycle_process_template.py | 10 + .../__init__.py | 0 ...ee_life_cycle_process_template_detail.json | 137 ++++++ ...oyee_life_cycle_process_template_detail.py | 10 + .../employee_lifecycle_activity/__init__.py | 0 .../employee_lifecycle_activity.js | 8 + .../employee_lifecycle_activity.json | 227 ++++++++++ .../employee_lifecycle_activity.py | 10 + .../test_employee_lifecycle_activity.js | 23 + .../test_employee_lifecycle_activity.py | 10 + .../__init__.py | 0 .../employee_lifecycle_activity_type.js | 8 + .../employee_lifecycle_activity_type.json | 163 ++++++++ .../employee_lifecycle_activity_type.py | 10 + .../test_employee_lifecycle_activity_type.js | 23 + .../test_employee_lifecycle_activity_type.py | 10 + .../employee_lifecycle_process/__init__.py | 0 .../employee_lifecycle_process.js | 8 + .../employee_lifecycle_process.json | 320 ++++++++++++++ .../employee_lifecycle_process.py | 10 + .../test_employee_lifecycle_process.js | 23 + .../test_employee_lifecycle_process.py | 10 + .../__init__.py | 0 .../employee_lifecycle_process_template.js | 8 + .../employee_lifecycle_process_template.json | 194 +++++++++ .../employee_lifecycle_process_template.py | 10 + ...est_employee_lifecycle_process_template.js | 23 + ...est_employee_lifecycle_process_template.py | 10 + .../hr/doctype/employee_promotion/__init__.py | 0 .../employee_promotion/employee_promotion.js | 8 + .../employee_promotion.json | 289 +++++++++++++ .../employee_promotion/employee_promotion.py | 10 + .../test_employee_promotion.js | 23 + .../test_employee_promotion.py | 10 + .../employee_promotion_detail/__init__.py | 0 .../employee_promotion_detail.json | 134 ++++++ .../employee_promotion_detail.py | 10 + .../hr/doctype/employee_transfer/__init__.py | 0 .../employee_transfer/employee_transfer.js | 8 + .../employee_transfer/employee_transfer.json | 383 +++++++++++++++++ .../employee_transfer/employee_transfer.py | 10 + .../test_employee_transfer.js | 23 + .../test_employee_transfer.py | 10 + .../employee_transfer_detail/__init__.py | 0 .../employee_transfer_detail.js | 8 + .../employee_transfer_detail.json | 134 ++++++ .../employee_transfer_detail.py | 10 + .../test_employee_transfer_detail.js | 23 + .../test_employee_transfer_detail.py | 10 + .../employee_transfer_property/__init__.py | 0 .../employee_transfer_property.js | 8 + .../employee_transfer_property.json | 154 +++++++ .../employee_transfer_property.py | 10 + .../test_employee_transfer_property.js | 23 + .../test_employee_transfer_property.py | 10 + .../hr/doctype/job_opening/job_opening.json | 260 ++++++++++-- .../salary_structure_assignment/__init__.py | 0 .../salary_structure_assignment.js | 8 + .../salary_structure_assignment.json | 257 ++++++++++++ .../salary_structure_assignment.py | 10 + .../test_salary_structure_assignment.js | 23 + .../test_salary_structure_assignment.py | 10 + .../hr/doctype/shift_assignment/__init__.py | 0 .../shift_assignment/shift_assignment.js | 8 + .../shift_assignment/shift_assignment.json | 319 ++++++++++++++ .../shift_assignment/shift_assignment.py | 10 + .../shift_assignment/test_shift_assignment.js | 23 + .../shift_assignment/test_shift_assignment.py | 10 + .../doctype/shift_assignment_tool/__init__.py | 0 .../shift_assignment_tool.js | 8 + .../shift_assignment_tool.json | 352 ++++++++++++++++ .../shift_assignment_tool.py | 10 + .../test_shift_assignment_tool.js | 23 + .../test_shift_assignment_tool.py | 10 + erpnext/hr/doctype/shift_request/__init__.py | 0 .../hr/doctype/shift_request/shift_request.js | 8 + .../doctype/shift_request/shift_request.json | 289 +++++++++++++ .../hr/doctype/shift_request/shift_request.py | 10 + .../shift_request/test_shift_request.js | 23 + .../shift_request/test_shift_request.py | 10 + erpnext/hr/doctype/shift_type/__init__.py | 0 erpnext/hr/doctype/shift_type/shift_type.js | 8 + erpnext/hr/doctype/shift_type/shift_type.json | 194 +++++++++ erpnext/hr/doctype/shift_type/shift_type.py | 10 + .../hr/doctype/shift_type/test_shift_type.js | 23 + .../hr/doctype/shift_type/test_shift_type.py | 10 + erpnext/hr/doctype/staffing_plan/__init__.py | 0 .../hr/doctype/staffing_plan/staffing_plan.js | 8 + .../doctype/staffing_plan/staffing_plan.json | 392 ++++++++++++++++++ .../hr/doctype/staffing_plan/staffing_plan.py | 10 + .../staffing_plan/test_staffing_plan.js | 23 + .../staffing_plan/test_staffing_plan.py | 10 + .../doctype/staffing_plan_detail/__init__.py | 0 .../staffing_plan_detail.json | 228 ++++++++++ .../staffing_plan_detail.py | 10 + 106 files changed, 5659 insertions(+), 32 deletions(-) create mode 100644 erpnext/hr/doctype/employee_incentive/__init__.py create mode 100644 erpnext/hr/doctype/employee_incentive/employee_incentive.js create mode 100644 erpnext/hr/doctype/employee_incentive/employee_incentive.json create mode 100644 erpnext/hr/doctype/employee_incentive/employee_incentive.py create mode 100644 erpnext/hr/doctype/employee_incentive/test_employee_incentive.js create mode 100644 erpnext/hr/doctype/employee_incentive/test_employee_incentive.py create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/__init__.py create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json create mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/__init__.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/__init__.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js create mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py create mode 100644 erpnext/hr/doctype/employee_promotion/__init__.py create mode 100644 erpnext/hr/doctype/employee_promotion/employee_promotion.js create mode 100644 erpnext/hr/doctype/employee_promotion/employee_promotion.json create mode 100644 erpnext/hr/doctype/employee_promotion/employee_promotion.py create mode 100644 erpnext/hr/doctype/employee_promotion/test_employee_promotion.js create mode 100644 erpnext/hr/doctype/employee_promotion/test_employee_promotion.py create mode 100644 erpnext/hr/doctype/employee_promotion_detail/__init__.py create mode 100644 erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json create mode 100644 erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py create mode 100644 erpnext/hr/doctype/employee_transfer/__init__.py create mode 100644 erpnext/hr/doctype/employee_transfer/employee_transfer.js create mode 100644 erpnext/hr/doctype/employee_transfer/employee_transfer.json create mode 100644 erpnext/hr/doctype/employee_transfer/employee_transfer.py create mode 100644 erpnext/hr/doctype/employee_transfer/test_employee_transfer.js create mode 100644 erpnext/hr/doctype/employee_transfer/test_employee_transfer.py create mode 100644 erpnext/hr/doctype/employee_transfer_detail/__init__.py create mode 100644 erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js create mode 100644 erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json create mode 100644 erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py create mode 100644 erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js create mode 100644 erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py create mode 100644 erpnext/hr/doctype/employee_transfer_property/__init__.py create mode 100644 erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js create mode 100644 erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json create mode 100644 erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py create mode 100644 erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.js create mode 100644 erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py create mode 100644 erpnext/hr/doctype/salary_structure_assignment/__init__.py create mode 100644 erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js create mode 100644 erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json create mode 100644 erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py create mode 100644 erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js create mode 100644 erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py create mode 100644 erpnext/hr/doctype/shift_assignment/__init__.py create mode 100644 erpnext/hr/doctype/shift_assignment/shift_assignment.js create mode 100644 erpnext/hr/doctype/shift_assignment/shift_assignment.json create mode 100644 erpnext/hr/doctype/shift_assignment/shift_assignment.py create mode 100644 erpnext/hr/doctype/shift_assignment/test_shift_assignment.js create mode 100644 erpnext/hr/doctype/shift_assignment/test_shift_assignment.py create mode 100644 erpnext/hr/doctype/shift_assignment_tool/__init__.py create mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js create mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json create mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py create mode 100644 erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js create mode 100644 erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py create mode 100644 erpnext/hr/doctype/shift_request/__init__.py create mode 100644 erpnext/hr/doctype/shift_request/shift_request.js create mode 100644 erpnext/hr/doctype/shift_request/shift_request.json create mode 100644 erpnext/hr/doctype/shift_request/shift_request.py create mode 100644 erpnext/hr/doctype/shift_request/test_shift_request.js create mode 100644 erpnext/hr/doctype/shift_request/test_shift_request.py create mode 100644 erpnext/hr/doctype/shift_type/__init__.py create mode 100644 erpnext/hr/doctype/shift_type/shift_type.js create mode 100644 erpnext/hr/doctype/shift_type/shift_type.json create mode 100644 erpnext/hr/doctype/shift_type/shift_type.py create mode 100644 erpnext/hr/doctype/shift_type/test_shift_type.js create mode 100644 erpnext/hr/doctype/shift_type/test_shift_type.py create mode 100644 erpnext/hr/doctype/staffing_plan/__init__.py create mode 100644 erpnext/hr/doctype/staffing_plan/staffing_plan.js create mode 100644 erpnext/hr/doctype/staffing_plan/staffing_plan.json create mode 100644 erpnext/hr/doctype/staffing_plan/staffing_plan.py create mode 100644 erpnext/hr/doctype/staffing_plan/test_staffing_plan.js create mode 100644 erpnext/hr/doctype/staffing_plan/test_staffing_plan.py create mode 100644 erpnext/hr/doctype/staffing_plan_detail/__init__.py create mode 100644 erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json create mode 100644 erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.py diff --git a/erpnext/hr/doctype/employee_incentive/__init__.py b/erpnext/hr/doctype/employee_incentive/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.js b/erpnext/hr/doctype/employee_incentive/employee_incentive.js new file mode 100644 index 0000000000..d2ddfb67a8 --- /dev/null +++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Incentive', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.json b/erpnext/hr/doctype/employee_incentive/employee_incentive.json new file mode 100644 index 0000000000..fe9e9c4db5 --- /dev/null +++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.json @@ -0,0 +1,225 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EI.#####", + "beta": 0, + "creation": "2018-04-13 16:13:43.404546", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "incentive_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Incentive Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payroll Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Incentive", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:55:05.862607", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Incentive", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.py b/erpnext/hr/doctype/employee_incentive/employee_incentive.py new file mode 100644 index 0000000000..6c9a315336 --- /dev/null +++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeIncentive(Document): + pass diff --git a/erpnext/hr/doctype/employee_incentive/test_employee_incentive.js b/erpnext/hr/doctype/employee_incentive/test_employee_incentive.js new file mode 100644 index 0000000000..10bc03701f --- /dev/null +++ b/erpnext/hr/doctype/employee_incentive/test_employee_incentive.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Incentive", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Incentive + () => frappe.tests.make('Employee Incentive', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_incentive/test_employee_incentive.py b/erpnext/hr/doctype/employee_incentive/test_employee_incentive.py new file mode 100644 index 0000000000..f7597ad605 --- /dev/null +++ b/erpnext/hr/doctype/employee_incentive/test_employee_incentive.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeIncentive(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/__init__.py b/erpnext/hr/doctype/employee_life_cycle_process_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js new file mode 100644 index 0000000000..d525a00fef --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Life Cycle Process Template', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json new file mode 100644 index 0000000000..087e1057f7 --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ELCP.#####", + "beta": 0, + "creation": "2018-04-13 17:40:38.806266", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "process_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lifecycle Process Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "process_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Lifecycle Process Template Detail", + "length": 0, + "no_copy": 0, + "options": "Employee Lifecycle Process Template Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Life Cycle Process Template", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:57:48.489059", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Life Cycle Process Template", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py new file mode 100644 index 0000000000..a7cf2ba8e3 --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifeCycleProcessTemplate(Document): + pass diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js new file mode 100644 index 0000000000..3b035e633f --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Life Cycle Process Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Life Cycle Process Template + () => frappe.tests.make('Employee Life Cycle Process Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py new file mode 100644 index 0000000000..a6115bb5cb --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeLifeCycleProcessTemplate(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json new file mode 100644 index 0000000000..e6670e81f8 --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json @@ -0,0 +1,137 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 17:38:53.419981", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_lifecycle_activity_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee Lifecycle Activity Type ", + "length": 0, + "no_copy": 0, + "options": "Employee Lifecycle Activity Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "role", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Role", + "length": 0, + "no_copy": 0, + "options": "Role", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "User", + "length": 0, + "no_copy": 0, + "options": "User", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:41:46.695599", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Life Cycle Process Template Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py new file mode 100644 index 0000000000..3406cf551e --- /dev/null +++ b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifeCycleProcessTemplateDetail(Document): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/__init__.py b/erpnext/hr/doctype/employee_lifecycle_activity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js new file mode 100644 index 0000000000..4cd5f0f06d --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Lifecycle Activity', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json new file mode 100644 index 0000000000..28b22fd318 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json @@ -0,0 +1,227 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "prompt", + "beta": 0, + "creation": "2018-04-13 17:58:34.106717", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activity_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Activity Type", + "length": 0, + "no_copy": 0, + "options": "Activity Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_lifecycle_process", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Lifecycle Process", + "length": 0, + "no_copy": 0, + "options": "Employee Lifecycle Process", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Pending\nCompleted", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Lifecycle Activity", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:48:06.800183", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Lifecycle Activity", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py new file mode 100644 index 0000000000..a8770310aa --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifecycleActivity(Document): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js new file mode 100644 index 0000000000..64a28d9d68 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Lifecycle Activity", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Lifecycle Activity + () => frappe.tests.make('Employee Lifecycle Activity', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py new file mode 100644 index 0000000000..e90de0f6f9 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeLifecycleActivity(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js new file mode 100644 index 0000000000..7935e4fd34 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Lifecycle Activity Type', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json new file mode 100644 index 0000000000..793b79a71b --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json @@ -0,0 +1,163 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ELAT.#####", + "beta": 0, + "creation": "2018-04-13 17:34:21.728815", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activity_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Activity Type", + "length": 0, + "no_copy": 0, + "options": "Activity Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "before_employee_creation", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Before Employee Creation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:02:22.731902", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Lifecycle Activity Type", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py new file mode 100644 index 0000000000..aca6bd495b --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifecycleActivityType(Document): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js new file mode 100644 index 0000000000..b775086ee5 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Lifecycle Activity Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Lifecycle Activity Type + () => frappe.tests.make('Employee Lifecycle Activity Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py new file mode 100644 index 0000000000..ff3e2c7aa3 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeLifecycleActivityType(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js new file mode 100644 index 0000000000..406436e05c --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Lifecycle Process', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json new file mode 100644 index 0000000000..86b01582f1 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json @@ -0,0 +1,320 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ELP.#####", + "beta": 0, + "creation": "2018-04-13 17:55:47.341454", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "job_applicant", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Job Applicant", + "length": 0, + "no_copy": 0, + "options": "Job Applicant", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Pending\nComplated", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lifecycle_process_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lifecycle Process Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "process_section", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Lifecycle Process Template Detail", + "length": 0, + "no_copy": 0, + "options": "Employee Lifecycle Process Template Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Lifecycle Process", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:00:17.008613", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Lifecycle Process", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py new file mode 100644 index 0000000000..8f051184b7 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifecycleProcess(Document): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js new file mode 100644 index 0000000000..cd892d9a0f --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Lifecycle Process", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Lifecycle Process + () => frappe.tests.make('Employee Lifecycle Process', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py new file mode 100644 index 0000000000..f680311d51 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeLifecycleProcess(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js new file mode 100644 index 0000000000..c9ce3d10c7 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Lifecycle Process Template', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json new file mode 100644 index 0000000000..df5db6c30f --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ELCP.#####", + "beta": 0, + "creation": "2018-04-13 17:40:38.806266", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "process_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lifecycle Process Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "process_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Lifecycle Process Template Detail", + "length": 0, + "no_copy": 0, + "options": "Employee Lifecycle Process Template Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Lifecycle Process Template", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:57:55.627207", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Lifecycle Process Template", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py new file mode 100644 index 0000000000..b6f3a438a0 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeLifecycleProcessTemplate(Document): + pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js new file mode 100644 index 0000000000..607ccd52fa --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Lifecycle Process Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Lifecycle Process Template + () => frappe.tests.make('Employee Lifecycle Process Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py new file mode 100644 index 0000000000..916cfe1fd1 --- /dev/null +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeLifecycleProcessTemplate(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_promotion/__init__.py b/erpnext/hr/doctype/employee_promotion/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.js b/erpnext/hr/doctype/employee_promotion/employee_promotion.js new file mode 100644 index 0000000000..c1bb7888e5 --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Promotion', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json new file mode 100644 index 0000000000..1dee7ead70 --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -0,0 +1,289 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EP.#####", + "beta": 0, + "creation": "2018-04-13 18:33:59.476562", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "promotion_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Promotion Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "details_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Promotion Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "promotion_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Promotion Detail", + "length": 0, + "no_copy": 0, + "options": "Employee Promotion Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Promotion", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:34:01.662392", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Promotion", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.py b/erpnext/hr/doctype/employee_promotion/employee_promotion.py new file mode 100644 index 0000000000..564f1ad6ac --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeePromotion(Document): + pass diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.js b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.js new file mode 100644 index 0000000000..5f0a5baf81 --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Promotion", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Promotion + () => frappe.tests.make('Employee Promotion', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py new file mode 100644 index 0000000000..8b668e7390 --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeePromotion(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_promotion_detail/__init__.py b/erpnext/hr/doctype/employee_promotion_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json new file mode 100644 index 0000000000..56823ea4ce --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json @@ -0,0 +1,134 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:32:35.242437", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 4, + "fieldname": "property", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Property", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "current", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Current", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "new", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "New", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:37:09.265584", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Promotion Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py new file mode 100644 index 0000000000..35f1297efc --- /dev/null +++ b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeePromotionDetail(Document): + pass diff --git a/erpnext/hr/doctype/employee_transfer/__init__.py b/erpnext/hr/doctype/employee_transfer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.js b/erpnext/hr/doctype/employee_transfer/employee_transfer.js new file mode 100644 index 0000000000..1d694bdc41 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Transfer', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json new file mode 100644 index 0000000000..78da7c52aa --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -0,0 +1,383 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ET.#####", + "beta": 0, + "creation": "2018-04-13 18:20:01.603830", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "transfer_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Transfer Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "New Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "details_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Transfer Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "transfer_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Transfer Detail", + "length": 0, + "no_copy": 0, + "options": "Employee Transfer Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reallocate_leaves", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Re-allocate Leaves", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "create_new_employee_id", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Create New Employee Id", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Transfer", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:33:00.045834", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Transfer", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py new file mode 100644 index 0000000000..96645c4d69 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTransfer(Document): + pass diff --git a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.js b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.js new file mode 100644 index 0000000000..05a3e1a573 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Transfer", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Transfer + () => frappe.tests.make('Employee Transfer', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py new file mode 100644 index 0000000000..049273e0cf --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTransfer(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_transfer_detail/__init__.py b/erpnext/hr/doctype/employee_transfer_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js new file mode 100644 index 0000000000..c453d9d1f2 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Transfer Detail', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json new file mode 100644 index 0000000000..3ec8ffedf3 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json @@ -0,0 +1,134 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:24:30.579965", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 4, + "fieldname": "property", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Property", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "current", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Current", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "new", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "New", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:38:59.649399", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Transfer Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py new file mode 100644 index 0000000000..d23c4feae4 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTransferDetail(Document): + pass diff --git a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js new file mode 100644 index 0000000000..8fa15ea85f --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Transfer Detail", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Transfer Detail + () => frappe.tests.make('Employee Transfer Detail', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py new file mode 100644 index 0000000000..7537f3449b --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTransferDetail(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_transfer_property/__init__.py b/erpnext/hr/doctype/employee_transfer_property/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js new file mode 100644 index 0000000000..9987c82d41 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Transfer Property', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json new file mode 100644 index 0000000000..829169ddd6 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.json @@ -0,0 +1,154 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:24:30.579965", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "property", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Property", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "current", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Current", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "New", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:25:54.889579", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Transfer Property", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py new file mode 100644 index 0000000000..1a665dc100 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_property/employee_transfer_property.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTransferProperty(Document): + pass diff --git a/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.js b/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.js new file mode 100644 index 0000000000..00a334a63d --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Transfer Property", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Transfer Property + () => frappe.tests.make('Employee Transfer Property', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py b/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py new file mode 100644 index 0000000000..39c20a6f71 --- /dev/null +++ b/erpnext/hr/doctype/employee_transfer_property/test_employee_transfer_property.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTransferProperty(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json index cde97e5e00..de15114a43 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.json +++ b/erpnext/hr/doctype/job_opening/job_opening.json @@ -15,6 +15,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -40,9 +41,230 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Open\nClosed", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "staffing_plan", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Staffing Plan", + "length": 0, + "no_copy": 0, + "options": "Staffing Plan", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -69,9 +291,11 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -99,38 +323,11 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 1 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Open\nClosed", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -157,6 +354,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -171,7 +369,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-03-22 12:36:26.807200", + "modified": "2018-04-13 18:52:56.109392", "modified_by": "Administrator", "module": "HR", "name": "Job Opening", @@ -179,7 +377,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -199,7 +396,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/hr/doctype/salary_structure_assignment/__init__.py b/erpnext/hr/doctype/salary_structure_assignment/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js new file mode 100644 index 0000000000..37a6fc8746 --- /dev/null +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Salary Structure Assignment', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json new file mode 100644 index 0000000000..0dd4f90f89 --- /dev/null +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json @@ -0,0 +1,257 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SSA.#####", + "beta": 0, + "creation": "2018-04-13 16:38:41.769237", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "salary_structure", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Salary Structure", + "length": 0, + "no_copy": 0, + "options": "Salary Structure", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Salary Structure Assignment", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:54:11.425087", + "modified_by": "Administrator", + "module": "HR", + "name": "Salary Structure Assignment", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py new file mode 100644 index 0000000000..f4fbb3c62e --- /dev/null +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class SalaryStructureAssignment(Document): + pass diff --git a/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js b/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js new file mode 100644 index 0000000000..2f52576c7a --- /dev/null +++ b/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Salary Structure Assignment", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Salary Structure Assignment + () => frappe.tests.make('Salary Structure Assignment', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py new file mode 100644 index 0000000000..a9833bf733 --- /dev/null +++ b/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestSalaryStructureAssignment(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/shift_assignment/__init__.py b/erpnext/hr/doctype/shift_assignment/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.js b/erpnext/hr/doctype/shift_assignment/shift_assignment.js new file mode 100644 index 0000000000..74708b1aaa --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Shift Assignment', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json new file mode 100644 index 0000000000..4d04ab3672 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -0,0 +1,319 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SH.#####", + "beta": 0, + "creation": "2018-04-13 16:25:04.562730", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Shift Type", + "length": 0, + "no_copy": 0, + "options": "Shift Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "present", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Present", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Shift Assignment", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:53:32.395707", + "modified_by": "Administrator", + "module": "HR", + "name": "Shift Assignment", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.py b/erpnext/hr/doctype/shift_assignment/shift_assignment.py new file mode 100644 index 0000000000..272dd2b32d --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ShiftAssignment(Document): + pass diff --git a/erpnext/hr/doctype/shift_assignment/test_shift_assignment.js b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.js new file mode 100644 index 0000000000..7727287742 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Shift Assignment", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Shift Assignment + () => frappe.tests.make('Shift Assignment', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py new file mode 100644 index 0000000000..eb51adbebd --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestShiftAssignment(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/shift_assignment_tool/__init__.py b/erpnext/hr/doctype/shift_assignment_tool/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js new file mode 100644 index 0000000000..d3658bf816 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Shift Assignment Tool', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json new file mode 100644 index 0000000000..aacfb8a9c9 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json @@ -0,0 +1,352 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 16:29:29.473589", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Shift Type", + "length": 0, + "no_copy": 0, + "options": "Shift Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "assignment_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Assignment Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Project", + "length": 0, + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 16:46:42.234317", + "modified_by": "Administrator", + "module": "HR", + "name": "Shift Assignment Tool", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py new file mode 100644 index 0000000000..fef8ab0791 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ShiftAssignmentTool(Document): + pass diff --git a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js new file mode 100644 index 0000000000..ca0be39983 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Shift Assignment Tool", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Shift Assignment Tool + () => frappe.tests.make('Shift Assignment Tool', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py new file mode 100644 index 0000000000..b1a8076108 --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestShiftAssignmentTool(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/shift_request/__init__.py b/erpnext/hr/doctype/shift_request/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/shift_request/shift_request.js b/erpnext/hr/doctype/shift_request/shift_request.js new file mode 100644 index 0000000000..1db7c7d10e --- /dev/null +++ b/erpnext/hr/doctype/shift_request/shift_request.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Shift Request', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/shift_request/shift_request.json b/erpnext/hr/doctype/shift_request/shift_request.json new file mode 100644 index 0000000000..c22127745a --- /dev/null +++ b/erpnext/hr/doctype/shift_request/shift_request.json @@ -0,0 +1,289 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SREQ.#####", + "beta": 0, + "creation": "2018-04-13 16:32:27.974273", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Shift Type", + "length": 0, + "no_copy": 0, + "options": "Shift Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Shift Request", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:55:41.428419", + "modified_by": "Administrator", + "module": "HR", + "name": "Shift Request", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_request/shift_request.py b/erpnext/hr/doctype/shift_request/shift_request.py new file mode 100644 index 0000000000..e6755ae44e --- /dev/null +++ b/erpnext/hr/doctype/shift_request/shift_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ShiftRequest(Document): + pass diff --git a/erpnext/hr/doctype/shift_request/test_shift_request.js b/erpnext/hr/doctype/shift_request/test_shift_request.js new file mode 100644 index 0000000000..9c8cd70020 --- /dev/null +++ b/erpnext/hr/doctype/shift_request/test_shift_request.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Shift Request", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Shift Request + () => frappe.tests.make('Shift Request', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/shift_request/test_shift_request.py b/erpnext/hr/doctype/shift_request/test_shift_request.py new file mode 100644 index 0000000000..0b8bcb811c --- /dev/null +++ b/erpnext/hr/doctype/shift_request/test_shift_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestShiftRequest(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/shift_type/__init__.py b/erpnext/hr/doctype/shift_type/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/shift_type/shift_type.js b/erpnext/hr/doctype/shift_type/shift_type.js new file mode 100644 index 0000000000..feae889ecd --- /dev/null +++ b/erpnext/hr/doctype/shift_type/shift_type.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Shift Type', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/shift_type/shift_type.json b/erpnext/hr/doctype/shift_type/shift_type.json new file mode 100644 index 0000000000..d5af2e46fc --- /dev/null +++ b/erpnext/hr/doctype/shift_type/shift_type.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "prompt", + "beta": 0, + "creation": "2018-04-13 16:22:52.954783", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "start_time", + "fieldtype": "Time", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_time", + "fieldtype": "Time", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "End Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "holiday_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Holiday List", + "length": 0, + "no_copy": 0, + "options": "Holiday List", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 17:48:00.309273", + "modified_by": "Administrator", + "module": "HR", + "name": "Shift Type", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_type/shift_type.py b/erpnext/hr/doctype/shift_type/shift_type.py new file mode 100644 index 0000000000..6721439ce6 --- /dev/null +++ b/erpnext/hr/doctype/shift_type/shift_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ShiftType(Document): + pass diff --git a/erpnext/hr/doctype/shift_type/test_shift_type.js b/erpnext/hr/doctype/shift_type/test_shift_type.js new file mode 100644 index 0000000000..846f9316f5 --- /dev/null +++ b/erpnext/hr/doctype/shift_type/test_shift_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Shift Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Shift Type + () => frappe.tests.make('Shift Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/shift_type/test_shift_type.py b/erpnext/hr/doctype/shift_type/test_shift_type.py new file mode 100644 index 0000000000..bc4f0eafcd --- /dev/null +++ b/erpnext/hr/doctype/shift_type/test_shift_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestShiftType(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/staffing_plan/__init__.py b/erpnext/hr/doctype/staffing_plan/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.js b/erpnext/hr/doctype/staffing_plan/staffing_plan.js new file mode 100644 index 0000000000..3cadfc56c5 --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Staffing Plan', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.json b/erpnext/hr/doctype/staffing_plan/staffing_plan.json new file mode 100644 index 0000000000..a5d26e6d4f --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.json @@ -0,0 +1,392 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "prompt", + "beta": 0, + "creation": "2018-04-13 18:07:21.582747", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "staffing_plan_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Staffing Plan Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "staffing_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Staffing Plan Detail", + "length": 0, + "no_copy": 0, + "options": "Staffing Plan Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_8", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_estimated_budget", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Estimated Budget", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Staffing Plan", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 18:45:16.729979", + "modified_by": "Administrator", + "module": "HR", + "name": "Staffing Plan", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.py b/erpnext/hr/doctype/staffing_plan/staffing_plan.py new file mode 100644 index 0000000000..510d2dcc49 --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class StaffingPlan(Document): + pass diff --git a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.js b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.js new file mode 100644 index 0000000000..64320bcd92 --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Staffing Plan", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Staffing Plan + () => frappe.tests.make('Staffing Plan', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py new file mode 100644 index 0000000000..426ab3ab64 --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestStaffingPlan(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/staffing_plan_detail/__init__.py b/erpnext/hr/doctype/staffing_plan_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json new file mode 100644 index 0000000000..7c395647be --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json @@ -0,0 +1,228 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:04:20.978931", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "number_of_positions", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Number Of Positions", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "current_count", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Current Count", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "vacancies", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Vacancies", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "estimated_cost_per_position", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Estimated Cost Per Position", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_estimated_cost", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Estimated Cost", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:39:52.783341", + "modified_by": "Administrator", + "module": "HR", + "name": "Staffing Plan Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.py b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.py new file mode 100644 index 0000000000..28a651e72d --- /dev/null +++ b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class StaffingPlanDetail(Document): + pass From 1c13e70d133f9bcd46181705913827bfd391c597 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 13 Apr 2018 20:20:46 +0530 Subject: [PATCH 002/154] New doctypes for HR and Accounting (#13652) --- .../doctype/accounting_period/__init__.py | 0 .../accounting_period/accounting_period.js | 8 + .../accounting_period/accounting_period.json | 349 ++++++++++ .../accounting_period/accounting_period.py | 10 + .../test_accounting_period.js | 23 + .../test_accounting_period.py | 10 + .../doctype/closed_document/__init__.py | 0 .../closed_document/closed_document.json | 104 +++ .../closed_document/closed_document.py | 10 + .../exchange_rate_revaluation/__init__.py | 0 .../exchange_rate_revaluation.js | 8 + .../exchange_rate_revaluation.json | 378 +++++++++++ .../exchange_rate_revaluation.py | 10 + .../test_exchange_rate_revaluation.js | 23 + .../test_exchange_rate_revaluation.py | 10 + .../__init__.py | 0 .../exchange_rate_revaluation_account.json | 259 ++++++++ .../exchange_rate_revaluation_account.py | 10 + .../tax_withholding_account/__init__.py | 0 .../tax_withholding_account.json | 105 +++ .../tax_withholding_account.py | 10 + .../tax_withholding_category/__init__.py | 0 .../tax_withholding_category.js | 8 + .../tax_withholding_category.json | 347 ++++++++++ .../tax_withholding_category.py | 10 + .../test_tax_withholding_category.js | 23 + .../test_tax_withholding_category.py | 10 + erpnext/buying/doctype/supplier/supplier.json | 101 ++- .../hr/doctype/attendance_request/__init__.py | 0 .../attendance_request/attendance_request.js | 8 + .../attendance_request.json | 337 ++++++++++ .../attendance_request/attendance_request.py | 10 + .../test_attendance_request.js | 23 + .../test_attendance_request.py | 10 + .../compensatory_leave_request/__init__.py | 0 .../compensatory_leave_request.js | 8 + .../compensatory_leave_request.json | 304 +++++++++ .../compensatory_leave_request.py | 10 + .../test_compensatory_leave_request.js | 23 + .../test_compensatory_leave_request.py | 10 + erpnext/hr/doctype/employee/employee.json | 34 +- .../employee_benefit_application/__init__.py | 0 .../employee_benefit_application.js | 8 + .../employee_benefit_application.json | 306 +++++++++ .../employee_benefit_application.py | 10 + .../test_employee_benefit_application.js | 23 + .../test_employee_benefit_application.py | 10 + .../__init__.py | 0 .../employee_benefit_application_detail.json | 105 +++ .../employee_benefit_application_detail.py | 10 + .../employee_benefit_claim/__init__.py | 0 .../employee_benefit_claim.js | 8 + .../employee_benefit_claim.json | 430 +++++++++++++ .../employee_benefit_claim.py | 10 + .../test_employee_benefit_claim.js | 23 + .../test_employee_benefit_claim.py | 10 + erpnext/hr/doctype/employee_grade/__init__.py | 0 .../doctype/employee_grade/employee_grade.js | 8 + .../employee_grade/employee_grade.json | 164 +++++ .../doctype/employee_grade/employee_grade.py | 10 + .../employee_grade/test_employee_grade.js | 23 + .../employee_grade/test_employee_grade.py | 10 + .../__init__.py | 0 .../employee_tax_excemption_category.js | 8 + .../employee_tax_excemption_category.json | 194 ++++++ .../employee_tax_excemption_category.py | 10 + .../test_employee_tax_excemption_category.js | 23 + .../test_employee_tax_excemption_category.py | 10 + .../__init__.py | 0 .../employee_tax_exemption_category.js | 8 + .../employee_tax_exemption_category.json | 194 ++++++ .../employee_tax_exemption_category.py | 10 + .../test_employee_tax_exemption_category.js | 23 + .../test_employee_tax_exemption_category.py | 10 + .../__init__.py | 0 .../employee_tax_exemption_declaration.js | 8 + .../employee_tax_exemption_declaration.json | 306 +++++++++ .../employee_tax_exemption_declaration.py | 10 + ...test_employee_tax_exemption_declaration.js | 23 + ...test_employee_tax_exemption_declaration.py | 10 + .../__init__.py | 0 ...ee_tax_exemption_declaration_category.json | 104 +++ ...oyee_tax_exemption_declaration_category.py | 10 + .../__init__.py | 0 ...employee_tax_exemption_proof_submission.js | 8 + ...ployee_tax_exemption_proof_submission.json | 399 ++++++++++++ ...employee_tax_exemption_proof_submission.py | 10 + ...employee_tax_exemption_proof_submission.js | 23 + ...employee_tax_exemption_proof_submission.py | 10 + .../__init__.py | 0 ...tax_exemption_proof_submission_detail.json | 136 ++++ ...e_tax_exemption_proof_submission_detail.py | 10 + .../leave_control_panel.json | 113 +++- .../test_leave_control_panel.py | 10 + .../hr/doctype/leave_encashment/__init__.py | 0 .../leave_encashment/leave_encashment.js | 8 + .../leave_encashment/leave_encashment.json | 399 ++++++++++++ .../leave_encashment/leave_encashment.py | 10 + .../leave_encashment/test_leave_encashment.js | 23 + .../leave_encashment/test_leave_encashment.py | 10 + erpnext/hr/doctype/leave_period/__init__.py | 0 .../hr/doctype/leave_period/leave_period.js | 8 + .../hr/doctype/leave_period/leave_period.json | 255 ++++++++ .../hr/doctype/leave_period/leave_period.py | 10 + .../doctype/leave_period/test_leave_period.js | 23 + .../doctype/leave_period/test_leave_period.py | 10 + erpnext/hr/doctype/leave_policy/__init__.py | 0 .../hr/doctype/leave_policy/leave_policy.js | 8 + .../hr/doctype/leave_policy/leave_policy.json | 316 +++++++++ .../hr/doctype/leave_policy/leave_policy.py | 10 + .../doctype/leave_policy/test_leave_policy.js | 23 + .../doctype/leave_policy/test_leave_policy.py | 10 + .../doctype/leave_policy_detail/__init__.py | 0 .../leave_policy_detail.js | 8 + .../leave_policy_detail.json | 166 +++++ .../leave_policy_detail.py | 10 + .../test_leave_policy_detail.js | 23 + .../test_leave_policy_detail.py | 10 + erpnext/hr/doctype/leave_type/leave_type.json | 599 +++++++++++++++++- .../doctype/payroll_entry/payroll_entry.json | 151 ++++- erpnext/hr/doctype/payroll_period/__init__.py | 0 .../doctype/payroll_period/payroll_period.js | 8 + .../payroll_period/payroll_period.json | 164 +++++ .../doctype/payroll_period/payroll_period.py | 10 + .../payroll_period/test_payroll_period.js | 23 + .../payroll_period/test_payroll_period.py | 10 + .../doctype/payroll_period_date/__init__.py | 0 .../payroll_period_date.json | 103 +++ .../payroll_period_date.py | 10 + .../salary_component/salary_component.json | 349 +++++++++- .../salary_component/test_salary_component.js | 23 + .../hr/doctype/salary_slip/salary_slip.json | 97 ++- .../salary_structure/salary_structure.json | 93 ++- .../doctype/taxable_salary_slab/__init__.py | 0 .../taxable_salary_slab.json | 165 +++++ .../taxable_salary_slab.py | 10 + 136 files changed, 8532 insertions(+), 74 deletions(-) create mode 100644 erpnext/accounts/doctype/accounting_period/__init__.py create mode 100644 erpnext/accounts/doctype/accounting_period/accounting_period.js create mode 100644 erpnext/accounts/doctype/accounting_period/accounting_period.json create mode 100644 erpnext/accounts/doctype/accounting_period/accounting_period.py create mode 100644 erpnext/accounts/doctype/accounting_period/test_accounting_period.js create mode 100644 erpnext/accounts/doctype/accounting_period/test_accounting_period.py create mode 100644 erpnext/accounts/doctype/closed_document/__init__.py create mode 100644 erpnext/accounts/doctype/closed_document/closed_document.json create mode 100644 erpnext/accounts/doctype/closed_document/closed_document.py create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/__init__.py create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.js create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation_account/__init__.py create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json create mode 100644 erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.py create mode 100644 erpnext/accounts/doctype/tax_withholding_account/__init__.py create mode 100644 erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json create mode 100644 erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.py create mode 100644 erpnext/accounts/doctype/tax_withholding_category/__init__.py create mode 100644 erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.js create mode 100644 erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json create mode 100644 erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py create mode 100644 erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.js create mode 100644 erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py create mode 100644 erpnext/hr/doctype/attendance_request/__init__.py create mode 100644 erpnext/hr/doctype/attendance_request/attendance_request.js create mode 100644 erpnext/hr/doctype/attendance_request/attendance_request.json create mode 100644 erpnext/hr/doctype/attendance_request/attendance_request.py create mode 100644 erpnext/hr/doctype/attendance_request/test_attendance_request.js create mode 100644 erpnext/hr/doctype/attendance_request/test_attendance_request.py create mode 100644 erpnext/hr/doctype/compensatory_leave_request/__init__.py create mode 100644 erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js create mode 100644 erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json create mode 100644 erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py create mode 100644 erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.js create mode 100644 erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py create mode 100644 erpnext/hr/doctype/employee_benefit_application/__init__.py create mode 100644 erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js create mode 100644 erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json create mode 100644 erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py create mode 100644 erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js create mode 100644 erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py create mode 100644 erpnext/hr/doctype/employee_benefit_application_detail/__init__.py create mode 100644 erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json create mode 100644 erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py create mode 100644 erpnext/hr/doctype/employee_benefit_claim/__init__.py create mode 100644 erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js create mode 100644 erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json create mode 100644 erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py create mode 100644 erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js create mode 100644 erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py create mode 100644 erpnext/hr/doctype/employee_grade/__init__.py create mode 100644 erpnext/hr/doctype/employee_grade/employee_grade.js create mode 100644 erpnext/hr/doctype/employee_grade/employee_grade.json create mode 100644 erpnext/hr/doctype/employee_grade/employee_grade.py create mode 100644 erpnext/hr/doctype/employee_grade/test_employee_grade.js create mode 100644 erpnext/hr/doctype/employee_grade/test_employee_grade.py create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration_category/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json create mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json create mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py create mode 100644 erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.py create mode 100644 erpnext/hr/doctype/leave_encashment/__init__.py create mode 100644 erpnext/hr/doctype/leave_encashment/leave_encashment.js create mode 100644 erpnext/hr/doctype/leave_encashment/leave_encashment.json create mode 100644 erpnext/hr/doctype/leave_encashment/leave_encashment.py create mode 100644 erpnext/hr/doctype/leave_encashment/test_leave_encashment.js create mode 100644 erpnext/hr/doctype/leave_encashment/test_leave_encashment.py create mode 100644 erpnext/hr/doctype/leave_period/__init__.py create mode 100644 erpnext/hr/doctype/leave_period/leave_period.js create mode 100644 erpnext/hr/doctype/leave_period/leave_period.json create mode 100644 erpnext/hr/doctype/leave_period/leave_period.py create mode 100644 erpnext/hr/doctype/leave_period/test_leave_period.js create mode 100644 erpnext/hr/doctype/leave_period/test_leave_period.py create mode 100644 erpnext/hr/doctype/leave_policy/__init__.py create mode 100644 erpnext/hr/doctype/leave_policy/leave_policy.js create mode 100644 erpnext/hr/doctype/leave_policy/leave_policy.json create mode 100644 erpnext/hr/doctype/leave_policy/leave_policy.py create mode 100644 erpnext/hr/doctype/leave_policy/test_leave_policy.js create mode 100644 erpnext/hr/doctype/leave_policy/test_leave_policy.py create mode 100644 erpnext/hr/doctype/leave_policy_detail/__init__.py create mode 100644 erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.js create mode 100644 erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json create mode 100644 erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.py create mode 100644 erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.js create mode 100644 erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.py create mode 100644 erpnext/hr/doctype/payroll_period/__init__.py create mode 100644 erpnext/hr/doctype/payroll_period/payroll_period.js create mode 100644 erpnext/hr/doctype/payroll_period/payroll_period.json create mode 100644 erpnext/hr/doctype/payroll_period/payroll_period.py create mode 100644 erpnext/hr/doctype/payroll_period/test_payroll_period.js create mode 100644 erpnext/hr/doctype/payroll_period/test_payroll_period.py create mode 100644 erpnext/hr/doctype/payroll_period_date/__init__.py create mode 100644 erpnext/hr/doctype/payroll_period_date/payroll_period_date.json create mode 100644 erpnext/hr/doctype/payroll_period_date/payroll_period_date.py create mode 100644 erpnext/hr/doctype/salary_component/test_salary_component.js create mode 100644 erpnext/hr/doctype/taxable_salary_slab/__init__.py create mode 100644 erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json create mode 100644 erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py diff --git a/erpnext/accounts/doctype/accounting_period/__init__.py b/erpnext/accounts/doctype/accounting_period/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.js b/erpnext/accounts/doctype/accounting_period/accounting_period.js new file mode 100644 index 0000000000..1fb57eabcf --- /dev/null +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Accounting Period', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.json b/erpnext/accounts/doctype/accounting_period/accounting_period.json new file mode 100644 index 0000000000..ed30b83c26 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -0,0 +1,349 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:period_name", + "beta": 0, + "creation": "2018-04-13 18:50:14.672323", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "period_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Period Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Open\nClosed", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "closed_documents", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Closed Documents", + "length": 0, + "no_copy": 0, + "options": "Closed Document", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:14:47.593753", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounting Period", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py new file mode 100644 index 0000000000..31f18490a3 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AccountingPeriod(Document): + pass diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.js b/erpnext/accounts/doctype/accounting_period/test_accounting_period.js new file mode 100644 index 0000000000..71ce5b8d04 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Accounting Period", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Accounting Period + () => frappe.tests.make('Accounting Period', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py new file mode 100644 index 0000000000..99694d2136 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAccountingPeriod(unittest.TestCase): + pass diff --git a/erpnext/accounts/doctype/closed_document/__init__.py b/erpnext/accounts/doctype/closed_document/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/closed_document/closed_document.json b/erpnext/accounts/doctype/closed_document/closed_document.json new file mode 100644 index 0000000000..f6ec76b14c --- /dev/null +++ b/erpnext/accounts/doctype/closed_document/closed_document.json @@ -0,0 +1,104 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:51:29.720606", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "document_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Document Type", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "closed", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Closed", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:51:41.118025", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Closed Document", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/closed_document/closed_document.py b/erpnext/accounts/doctype/closed_document/closed_document.py new file mode 100644 index 0000000000..048ceeecbf --- /dev/null +++ b/erpnext/accounts/doctype/closed_document/closed_document.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ClosedDocument(Document): + pass diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/__init__.py b/erpnext/accounts/doctype/exchange_rate_revaluation/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js new file mode 100644 index 0000000000..9302a24108 --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Exchange Rate Revaluation', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json new file mode 100644 index 0000000000..3d302929ae --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json @@ -0,0 +1,378 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "ERV.####", + "beta": 0, + "creation": "2018-04-13 18:25:55.943587", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "posting_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Posting Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "get_entries", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Get Entries", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "exchange_rate_revaluation_account", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Exchange Rate Revaluation Account", + "length": 0, + "no_copy": 0, + "options": "Exchange Rate Revaluation Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_gain_loss", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Gain/Loss", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Exchange Rate Revaluation", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:19:01.029331", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Exchange Rate Revaluation", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py new file mode 100644 index 0000000000..46abddc3f9 --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ExchangeRateRevaluation(Document): + pass diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.js b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.js new file mode 100644 index 0000000000..57c6a7871d --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Exchange Rate Revaluation", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Exchange Rate Revaluation + () => frappe.tests.make('Exchange Rate Revaluation', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py new file mode 100644 index 0000000000..3b037d1dc4 --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestExchangeRateRevaluation(unittest.TestCase): + pass diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation_account/__init__.py b/erpnext/accounts/doctype/exchange_rate_revaluation_account/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json new file mode 100644 index 0000000000..66561a0718 --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json @@ -0,0 +1,259 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:30:06.110433", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_base_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Balance In Base Currency", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_alternate_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Balance In Alternate Currency", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "current_exchange_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Current Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new_exchange_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "New Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new_balance_in_base_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "New Balance In Base Currency", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "difference", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Difference", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:30:57.531401", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Exchange Rate Revaluation Account", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.py b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.py new file mode 100644 index 0000000000..87d7b67346 --- /dev/null +++ b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ExchangeRateRevaluationAccount(Document): + pass diff --git a/erpnext/accounts/doctype/tax_withholding_account/__init__.py b/erpnext/accounts/doctype/tax_withholding_account/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json b/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json new file mode 100644 index 0000000000..06d6b088e5 --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json @@ -0,0 +1,105 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 18:43:14.898336", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 18:44:25.055382", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Tax Withholding Account", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.py b/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.py new file mode 100644 index 0000000000..76e3fa32b0 --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class TaxWithholdingAccount(Document): + pass diff --git a/erpnext/accounts/doctype/tax_withholding_category/__init__.py b/erpnext/accounts/doctype/tax_withholding_category/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.js b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.js new file mode 100644 index 0000000000..da99a8d901 --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Tax Withholding Category', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json new file mode 100644 index 0000000000..f02a52043e --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json @@ -0,0 +1,347 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 18:42:06.431683", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "percent_of_tax_withheld", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Percent of Tax Withheld", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "threshold", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Threshold", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "book_on_invoice", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Book on Invoice", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "book_on_advance", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Book on Advance", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "withhold_cumulative_tax_amount", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Withhold Cumulative Tax Amount On First Invoice After Threshold", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "accounts", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Accounts", + "length": 0, + "no_copy": 0, + "options": "Tax Withholding Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:17:12.494050", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Tax Withholding Category", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py new file mode 100644 index 0000000000..4940c4f3fe --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class TaxWithholdingCategory(Document): + pass diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.js b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.js new file mode 100644 index 0000000000..eab98d4389 --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Tax Withholding Category", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Tax Withholding Category + () => frappe.tests.make('Tax Withholding Category', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py new file mode 100644 index 0000000000..7d990119d1 --- /dev/null +++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestTaxWithholdingCategory(unittest.TestCase): + pass diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index efaec835a2..e64dcb7d12 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -43,6 +43,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -75,6 +76,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 1, + "translatable": 0, "unique": 0 }, { @@ -106,6 +108,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -137,6 +140,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -167,6 +171,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -197,6 +202,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -225,6 +231,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -258,6 +265,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -289,6 +297,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -320,6 +329,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -350,6 +360,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -380,6 +391,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -410,6 +422,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -440,6 +453,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -470,6 +484,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -500,6 +515,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -529,6 +545,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -559,6 +576,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -589,6 +607,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -621,6 +640,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -653,6 +673,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -682,6 +703,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -710,6 +732,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -740,6 +763,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -770,6 +794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -802,6 +827,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -832,6 +858,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -864,6 +891,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -896,6 +924,37 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_30", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -926,6 +985,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_withholding_category", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Tax Withholding Category", + "length": 0, + "no_copy": 0, + "options": "Tax Withholding Category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -941,7 +1033,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-26 04:50:15.317590", + "modified": "2018-04-13 18:45:44.023746", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", @@ -950,7 +1042,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -970,7 +1061,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -990,7 +1080,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -1010,7 +1099,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1030,7 +1118,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1050,7 +1137,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1070,7 +1156,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/hr/doctype/attendance_request/__init__.py b/erpnext/hr/doctype/attendance_request/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.js b/erpnext/hr/doctype/attendance_request/attendance_request.js new file mode 100644 index 0000000000..76a28a056e --- /dev/null +++ b/erpnext/hr/doctype/attendance_request/attendance_request.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Attendance Request', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.json b/erpnext/hr/doctype/attendance_request/attendance_request.json new file mode 100644 index 0000000000..42317ed631 --- /dev/null +++ b/erpnext/hr/doctype/attendance_request/attendance_request.json @@ -0,0 +1,337 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "EAR.####", + "beta": 0, + "creation": "2018-04-13 15:37:40.918990", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reason", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Reason", + "length": 0, + "no_copy": 0, + "options": "Work From Home\nOn Duty", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "explanation", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Explanation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Attendance Request", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 20:02:38.231185", + "modified_by": "Administrator", + "module": "HR", + "name": "Attendance Request", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.py b/erpnext/hr/doctype/attendance_request/attendance_request.py new file mode 100644 index 0000000000..0114b99de3 --- /dev/null +++ b/erpnext/hr/doctype/attendance_request/attendance_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AttendanceRequest(Document): + pass diff --git a/erpnext/hr/doctype/attendance_request/test_attendance_request.js b/erpnext/hr/doctype/attendance_request/test_attendance_request.js new file mode 100644 index 0000000000..d40ec61b08 --- /dev/null +++ b/erpnext/hr/doctype/attendance_request/test_attendance_request.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Attendance Request", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Attendance Request + () => frappe.tests.make('Attendance Request', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/attendance_request/test_attendance_request.py b/erpnext/hr/doctype/attendance_request/test_attendance_request.py new file mode 100644 index 0000000000..d737699f6b --- /dev/null +++ b/erpnext/hr/doctype/attendance_request/test_attendance_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAttendanceRequest(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/compensatory_leave_request/__init__.py b/erpnext/hr/doctype/compensatory_leave_request/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js new file mode 100644 index 0000000000..28553e35fc --- /dev/null +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Compensatory Leave Request', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json new file mode 100644 index 0000000000..1003bc5b15 --- /dev/null +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json @@ -0,0 +1,304 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 14:51:39.326768", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "work_from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Work From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "work_end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Work End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reason", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reason", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Compensatory Leave Request", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 20:06:17.469422", + "modified_by": "Administrator", + "module": "HR", + "name": "Compensatory Leave Request", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py new file mode 100644 index 0000000000..bf0212ace9 --- /dev/null +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class CompensatoryLeaveRequest(Document): + pass diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.js b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.js new file mode 100644 index 0000000000..bebcaac400 --- /dev/null +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Compensatory Leave Request", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Compensatory Leave Request + () => frappe.tests.make('Compensatory Leave Request', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py new file mode 100644 index 0000000000..5d771baf83 --- /dev/null +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestCompensatoryLeaveRequest(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index a5c9722504..0c715e647d 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1198,6 +1198,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_leave_policy", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Leave policy", + "length": 0, + "no_copy": 0, + "options": "Leave Policy", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2670,7 +2702,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-16 09:08:06.852604", + "modified": "2018-04-25 09:08:06.852604", "modified_by": "Administrator", "module": "HR", "name": "Employee", diff --git a/erpnext/hr/doctype/employee_benefit_application/__init__.py b/erpnext/hr/doctype/employee_benefit_application/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js new file mode 100644 index 0000000000..8cf6909a12 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Benefit Application', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json new file mode 100644 index 0000000000..0b74f4fcff --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json @@ -0,0 +1,306 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "EBA.#####", + "beta": 0, + "creation": "2018-04-13 16:31:39.190787", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll_period", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payroll Period", + "length": 0, + "no_copy": 0, + "options": "Payroll Period", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Benefit Application", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_benefits", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Benefits", + "length": 0, + "no_copy": 0, + "options": "Employee Benefit Application Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:33:14.303161", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Benefit Application", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py new file mode 100644 index 0000000000..9282d98475 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeBenefitApplication(Document): + pass diff --git a/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js b/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js new file mode 100644 index 0000000000..b355e1c436 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Benefit Application", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Benefit Application + () => frappe.tests.make('Employee Benefit Application', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py b/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py new file mode 100644 index 0000000000..9b915a66b9 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeBenefitApplication(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/__init__.py b/erpnext/hr/doctype/employee_benefit_application_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json b/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json new file mode 100644 index 0000000000..35918e1722 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json @@ -0,0 +1,105 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EBAD.#####", + "beta": 0, + "creation": "2018-04-13 16:36:18.389786", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "earning_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Earning Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 19:32:35.064272", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Benefit Application Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py b/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py new file mode 100644 index 0000000000..3a502fe524 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeBenefitApplicationDetail(Document): + pass diff --git a/erpnext/hr/doctype/employee_benefit_claim/__init__.py b/erpnext/hr/doctype/employee_benefit_claim/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js new file mode 100644 index 0000000000..816b1bd90a --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Benefit Claim', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json new file mode 100644 index 0000000000..28fdc7245e --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -0,0 +1,430 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "EBC.#####", + "beta": 0, + "creation": "2018-04-13 16:43:10.386409", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "claim_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Claim Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "earning_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Earning Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_amount_eligible", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Amount Eligible", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "claimed_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Claimed Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "salary_slip", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Salary Slip", + "length": 0, + "no_copy": 0, + "options": "Salary Slip", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Benefit Claim", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_9", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "attachments", + "fieldtype": "Attach", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Attachments", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:36:23.572732", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Benefit Claim", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py new file mode 100644 index 0000000000..551d1accd5 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeBenefitClaim(Document): + pass diff --git a/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js b/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js new file mode 100644 index 0000000000..3c808c0a56 --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Benefit Claim", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Benefit Claim + () => frappe.tests.make('Employee Benefit Claim', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py b/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py new file mode 100644 index 0000000000..e8dc0da47c --- /dev/null +++ b/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeBenefitClaim(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_grade/__init__.py b/erpnext/hr/doctype/employee_grade/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_grade/employee_grade.js b/erpnext/hr/doctype/employee_grade/employee_grade.js new file mode 100644 index 0000000000..fa679faec7 --- /dev/null +++ b/erpnext/hr/doctype/employee_grade/employee_grade.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Grade', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_grade/employee_grade.json b/erpnext/hr/doctype/employee_grade/employee_grade.json new file mode 100644 index 0000000000..e619c7b3dc --- /dev/null +++ b/erpnext/hr/doctype/employee_grade/employee_grade.json @@ -0,0 +1,164 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 16:14:24.174138", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_leave_policy", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Leave Policy", + "length": 0, + "no_copy": 0, + "options": "Leave Policy", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_salary_structure", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Salary Structure", + "length": 0, + "no_copy": 0, + "options": "Salary Structure", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 16:14:24.174138", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Grade", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_grade/employee_grade.py b/erpnext/hr/doctype/employee_grade/employee_grade.py new file mode 100644 index 0000000000..42a9f16135 --- /dev/null +++ b/erpnext/hr/doctype/employee_grade/employee_grade.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeGrade(Document): + pass diff --git a/erpnext/hr/doctype/employee_grade/test_employee_grade.js b/erpnext/hr/doctype/employee_grade/test_employee_grade.js new file mode 100644 index 0000000000..d684fb2ad1 --- /dev/null +++ b/erpnext/hr/doctype/employee_grade/test_employee_grade.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Grade", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Grade + () => frappe.tests.make('Employee Grade', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_grade/test_employee_grade.py b/erpnext/hr/doctype/employee_grade/test_employee_grade.py new file mode 100644 index 0000000000..93058cf108 --- /dev/null +++ b/erpnext/hr/doctype/employee_grade/test_employee_grade.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeGrade(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py b/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js new file mode 100644 index 0000000000..2c4377cdbd --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Tax Excemption Category', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json new file mode 100644 index 0000000000..e49e780ffa --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 16:51:36.971140", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "deduction_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Deduction Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 16:52:11.640756", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Excemption Category", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py new file mode 100644 index 0000000000..1586bf136c --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExcemptionCategory(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js new file mode 100644 index 0000000000..3872438079 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Tax Excemption Category", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Tax Excemption Category + () => frappe.tests.make('Employee Tax Excemption Category', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py new file mode 100644 index 0000000000..7438f6464c --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTaxExcemptionCategory(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/__init__.py b/erpnext/hr/doctype/employee_tax_exemption_category/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js new file mode 100644 index 0000000000..1df609f320 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Tax Exemption Category', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json new file mode 100644 index 0000000000..9a4c1817e4 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 16:51:36.971140", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "deduction_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Deduction Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Max Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:29:34.579934", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Exemption Category", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py new file mode 100644 index 0000000000..4f705db22e --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExemptionCategory(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js b/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js new file mode 100644 index 0000000000..e0e43c32e3 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Tax Exemption Category", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Tax Exemption Category + () => frappe.tests.make('Employee Tax Exemption Category', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py b/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py new file mode 100644 index 0000000000..669fb71f46 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTaxExemptionCategory(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/__init__.py b/erpnext/hr/doctype/employee_tax_exemption_declaration/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js new file mode 100644 index 0000000000..d204efc5bf --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Tax Exemption Declaration', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json new file mode 100644 index 0000000000..ebfce2b9e3 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json @@ -0,0 +1,306 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "ETED.#####", + "beta": 0, + "creation": "2018-04-13 16:53:36.175504", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll_period", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payroll Period", + "length": 0, + "no_copy": 0, + "options": "Payroll Period", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Tax Exemption Declaration", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "declarations", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Declarations", + "length": 0, + "no_copy": 0, + "options": "Employee Tax Exemption Declaration Category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:23:54.363578", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Exemption Declaration", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py new file mode 100644 index 0000000000..1a5f195d02 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExemptionDeclaration(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js b/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js new file mode 100644 index 0000000000..274a3a3860 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Tax Exemption Declaration", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Tax Exemption Declaration + () => frappe.tests.make('Employee Tax Exemption Declaration', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py b/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py new file mode 100644 index 0000000000..48f561a167 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTaxExemptionDeclaration(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/__init__.py b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json new file mode 100644 index 0000000000..48a5dd09db --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json @@ -0,0 +1,104 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 16:56:23.333041", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "exemption_category", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Exemption Category", + "length": 0, + "no_copy": 0, + "options": "Employee Tax Exemption Category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 19:24:18.076613", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Exemption Declaration Category", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py new file mode 100644 index 0000000000..362677e887 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExemptionDeclarationCategory(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/__init__.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js new file mode 100644 index 0000000000..d8036c48e9 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Tax Exemption Proof Submission', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json new file mode 100644 index 0000000000..41d9681b1b --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json @@ -0,0 +1,399 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ETEPS.#####", + "beta": 0, + "creation": "2018-04-13 17:24:11.456132", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll_period", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payroll Period", + "length": 0, + "no_copy": 0, + "options": "Payroll Period", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "processed_in_payroll", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Processed in Payroll", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_5", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_exemption_proofs", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Tax Exemption Proofs", + "length": 0, + "no_copy": 0, + "options": "Employee Tax Exemption Proof Submission Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "attachment_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "attachments", + "fieldtype": "Attach", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Attachments", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Tax Exemption Proof Submission", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:21:59.969371", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Exemption Proof Submission", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py new file mode 100644 index 0000000000..1c31cc4080 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExemptionProofSubmission(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js new file mode 100644 index 0000000000..cec7508728 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Tax Exemption Proof Submission", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Tax Exemption Proof Submission + () => frappe.tests.make('Employee Tax Exemption Proof Submission', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py new file mode 100644 index 0000000000..1dc090f0bb --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTaxExemptionProofSubmission(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/__init__.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json new file mode 100644 index 0000000000..509e425270 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json @@ -0,0 +1,136 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 17:19:03.006149", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "exemption_category", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Exemption Category", + "length": 0, + "no_copy": 0, + "options": "Employee Tax Exemption Category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "type_of_proof", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Type of Proof", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 17:19:03.006149", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Exemption Proof Submission Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py new file mode 100644 index 0000000000..c5d1a8fe5d --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExemptionProofSubmissionDetail(Document): + pass diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json index d3c309719d..96a4681216 100644 --- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json +++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json @@ -39,6 +39,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -70,6 +71,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -101,6 +103,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -132,6 +135,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -163,6 +167,71 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -191,6 +260,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -222,6 +292,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -252,6 +323,39 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_policy", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Policy", + "length": 0, + "no_copy": 0, + "options": "Leave Policy", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -279,9 +383,10 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -312,6 +417,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -341,6 +447,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -371,6 +478,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -385,7 +493,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-11-10 18:42:17.060492", + "modified": "2018-04-13 16:17:15.115389", "modified_by": "Administrator", "module": "HR", "name": "Leave Control Panel", @@ -393,7 +501,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, diff --git a/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.py new file mode 100644 index 0000000000..9a907c885a --- /dev/null +++ b/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLeaveControlPanel(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_encashment/__init__.py b/erpnext/hr/doctype/leave_encashment/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.js b/erpnext/hr/doctype/leave_encashment/leave_encashment.js new file mode 100644 index 0000000000..0556756f92 --- /dev/null +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Leave Encashment', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.json b/erpnext/hr/doctype/leave_encashment/leave_encashment.json new file mode 100644 index 0000000000..11d903c700 --- /dev/null +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.json @@ -0,0 +1,399 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "beta": 0, + "creation": "2018-04-13 15:31:51.197046", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_period", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Leave Period", + "length": 0, + "no_copy": 0, + "options": "Leave Period", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payroll Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Leave Type", + "length": 0, + "no_copy": 0, + "options": "Leave Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_balance", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Balance", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "encashable_days", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Encashable days", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "encashment_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Encashment Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Leave Encashment", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 20:05:42.659510", + "modified_by": "Administrator", + "module": "HR", + "name": "Leave Encashment", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.py b/erpnext/hr/doctype/leave_encashment/leave_encashment.py new file mode 100644 index 0000000000..5966a0ba7a --- /dev/null +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class LeaveEncashment(Document): + pass diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.js b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.js new file mode 100644 index 0000000000..cafd9602cb --- /dev/null +++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Leave Encashment", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Leave Encashment + () => frappe.tests.make('Leave Encashment', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py new file mode 100644 index 0000000000..653012a46e --- /dev/null +++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLeaveEncashment(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_period/__init__.py b/erpnext/hr/doctype/leave_period/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/leave_period/leave_period.js b/erpnext/hr/doctype/leave_period/leave_period.js new file mode 100644 index 0000000000..2a6010e44f --- /dev/null +++ b/erpnext/hr/doctype/leave_period/leave_period.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Leave Period', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json new file mode 100644 index 0000000000..91727a0b3b --- /dev/null +++ b/erpnext/hr/doctype/leave_period/leave_period.json @@ -0,0 +1,255 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 15:20:52.864288", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:39:02.199315", + "modified_by": "Administrator", + "module": "HR", + "name": "Leave Period", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_period/leave_period.py b/erpnext/hr/doctype/leave_period/leave_period.py new file mode 100644 index 0000000000..619336a8a9 --- /dev/null +++ b/erpnext/hr/doctype/leave_period/leave_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class LeavePeriod(Document): + pass diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.js b/erpnext/hr/doctype/leave_period/test_leave_period.js new file mode 100644 index 0000000000..ec0a809689 --- /dev/null +++ b/erpnext/hr/doctype/leave_period/test_leave_period.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Leave Period", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Leave Period + () => frappe.tests.make('Leave Period', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py new file mode 100644 index 0000000000..f7a4368c26 --- /dev/null +++ b/erpnext/hr/doctype/leave_period/test_leave_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLeavePeriod(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_policy/__init__.py b/erpnext/hr/doctype/leave_policy/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.js b/erpnext/hr/doctype/leave_policy/leave_policy.js new file mode 100644 index 0000000000..309215e778 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy/leave_policy.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Leave Policy', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.json b/erpnext/hr/doctype/leave_policy/leave_policy.json new file mode 100644 index 0000000000..bf7f38aa77 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy/leave_policy.json @@ -0,0 +1,316 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "LP.####", + "beta": 0, + "creation": "2018-04-13 16:06:19.507624", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Leave Policy", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_policy_details", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Policy Details", + "length": 0, + "no_copy": 0, + "options": "Leave Policy Detail", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:57:49.400508", + "modified_by": "Administrator", + "module": "HR", + "name": "Leave Policy", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.py b/erpnext/hr/doctype/leave_policy/leave_policy.py new file mode 100644 index 0000000000..1da84c2e43 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy/leave_policy.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class LeavePolicy(Document): + pass diff --git a/erpnext/hr/doctype/leave_policy/test_leave_policy.js b/erpnext/hr/doctype/leave_policy/test_leave_policy.js new file mode 100644 index 0000000000..5404a63bed --- /dev/null +++ b/erpnext/hr/doctype/leave_policy/test_leave_policy.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Leave Policy", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Leave Policy + () => frappe.tests.make('Leave Policy', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/leave_policy/test_leave_policy.py b/erpnext/hr/doctype/leave_policy/test_leave_policy.py new file mode 100644 index 0000000000..3317ac3831 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy/test_leave_policy.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLeavePolicy(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_policy_detail/__init__.py b/erpnext/hr/doctype/leave_policy_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.js b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.js new file mode 100644 index 0000000000..ee21f8d3ae --- /dev/null +++ b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Leave Policy Detail', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json new file mode 100644 index 0000000000..9c29bf97e7 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json @@ -0,0 +1,166 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 16:01:20.928853", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "leave_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Leave Type", + "length": 0, + "no_copy": 0, + "options": "Leave Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "annual_allocation", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Annual Allocation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "is_pro_rata_applicable", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Is Pro-rata Applicable", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 3, + "fieldname": "month_threshold_day", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Month Threshold Day", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 19:59:47.087760", + "modified_by": "Administrator", + "module": "HR", + "name": "Leave Policy Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.py b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.py new file mode 100644 index 0000000000..c103f08cd9 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class LeavePolicyDetail(Document): + pass diff --git a/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.js b/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.js new file mode 100644 index 0000000000..1c8995b796 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Leave Policy Detail", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Leave Policy Detail + () => frappe.tests.make('Leave Policy Detail', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.py b/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.py new file mode 100644 index 0000000000..610b1fa332 --- /dev/null +++ b/erpnext/hr/doctype/leave_policy_detail/test_leave_policy_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLeavePolicyDetail(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 9153bbf92f..6b0433f802 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -1,24 +1,32 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "autoname": "field:leave_type_name", + "beta": 0, "creation": "2013-02-21 09:55:58", "custom": 0, "docstatus": 0, "doctype": "DocType", "document_type": "Setup", + "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "leave_type_name", "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Leave Type Name", "length": 0, "no_copy": 0, @@ -26,47 +34,156 @@ "oldfieldtype": "Data", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "max_days_allowed", - "fieldtype": "Data", + "columns": 0, + "depends_on": "", + "fieldname": "max_leaves_allowed", + "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Leaves Allowed", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "applicable_after", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Applicable After (Working Days)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_days_allowed", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, - "label": "Max Days Leave Allowed", + "in_standard_filter": 0, + "label": "Maximum Continuous Days Applicable", "length": 0, "no_copy": 0, "oldfieldname": "max_days_allowed", "oldfieldtype": "Data", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, "fieldname": "is_carry_forward", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Is Carry Forward", "length": 0, "no_copy": 0, @@ -74,23 +191,183 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, + "fieldname": "is_lwp", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Leave Without Pay", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow_negative", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Negative Balance", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "include_holiday", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Include holidays within leaves as leaves", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_parental_leave", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Parental Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "encashment", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Encashment", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, "fieldname": "is_encash", "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Is Encash", "length": 0, "no_copy": 0, @@ -98,91 +375,378 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 1, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 1, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "is_lwp", + "columns": 0, + "fieldname": "allow_encashment", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, - "label": "Is Leave Without Pay", + "in_standard_filter": 0, + "label": "Allow Encashment", "length": 0, "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "allow_negative", - "fieldtype": "Check", + "columns": 0, + "depends_on": "allow_encashment", + "fieldname": "encashment_threshold_days", + "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, - "label": "Allow Negative Balance", + "in_standard_filter": 0, + "label": "Encashment Threshold Days", "length": 0, "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "include_holiday", - "fieldtype": "Check", + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, - "label": "Include holidays within leaves as leaves", + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "allow_encashment", + "fieldname": "earning_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Earning Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "section_break_13", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Optional Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_optional_leave", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Optional Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_optional_leave", + "fieldname": "holiday_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Holiday List", + "length": 0, + "no_copy": 0, + "options": "Holiday List", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "earned_leave", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Earned Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_earned_leave", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Earned Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_earned_leave", + "fieldname": "earned_leave_frequency", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Earned Leave Frequency", + "length": 0, + "no_copy": 0, + "options": "Monthly\nQuarterly\nYearly", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0.5", + "depends_on": "is_earned_leave", + "fieldname": "rounding", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rounding", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-flag", "idx": 1, + "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:29:49.659028", + "modified": "2018-04-13 19:54:03.588288", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", @@ -190,7 +754,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -210,7 +773,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -230,7 +792,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -249,6 +810,10 @@ "write": 0 } ], + "quick_entry": 0, "read_only": 0, - "read_only_onload": 0 + "read_only_onload": 0, + "show_name_in_global_search": 0, + "track_changes": 0, + "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.json b/erpnext/hr/doctype/payroll_entry/payroll_entry.json index 5cd1e53a6d..0af6d5d82e 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.json +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.json @@ -41,6 +41,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -70,6 +71,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -103,6 +105,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -134,6 +137,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -167,6 +171,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -196,6 +201,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -228,6 +234,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -259,6 +266,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -290,6 +298,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -319,6 +328,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -349,6 +359,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -380,6 +391,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -409,6 +421,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -441,6 +454,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -471,6 +485,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -502,35 +517,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -562,6 +549,99 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "include_unclaimed_employee_benefits", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Include Unclaimed Employee Benefits", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "deduct_tax_for_unsubmitted_tax_exemption_proof", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Deduct Tax For Unsubmitted Tax Exemption Proof", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -592,6 +672,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -623,6 +704,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -652,6 +734,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -683,6 +766,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -712,6 +796,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -743,6 +828,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -775,6 +861,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -804,6 +891,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -834,6 +922,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -864,6 +953,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -878,7 +968,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-06 19:47:03.235021", + "modified": "2018-04-13 17:28:42.759513", "modified_by": "Administrator", "module": "HR", "name": "Payroll Entry", @@ -887,7 +977,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, diff --git a/erpnext/hr/doctype/payroll_period/__init__.py b/erpnext/hr/doctype/payroll_period/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.js b/erpnext/hr/doctype/payroll_period/payroll_period.js new file mode 100644 index 0000000000..67caf9d101 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period/payroll_period.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Payroll Period', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.json b/erpnext/hr/doctype/payroll_period/payroll_period.json new file mode 100644 index 0000000000..44ead2bc27 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period/payroll_period.json @@ -0,0 +1,164 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 15:18:53.698553", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "periods", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payroll Periods", + "length": 0, + "no_copy": 0, + "options": "Payroll Period Date", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 19:38:28.013664", + "modified_by": "Administrator", + "module": "HR", + "name": "Payroll Period", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.py b/erpnext/hr/doctype/payroll_period/payroll_period.py new file mode 100644 index 0000000000..1e18388e16 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period/payroll_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class PayrollPeriod(Document): + pass diff --git a/erpnext/hr/doctype/payroll_period/test_payroll_period.js b/erpnext/hr/doctype/payroll_period/test_payroll_period.js new file mode 100644 index 0000000000..8c4ded96f3 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period/test_payroll_period.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Payroll Period", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Payroll Period + () => frappe.tests.make('Payroll Period', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/payroll_period/test_payroll_period.py b/erpnext/hr/doctype/payroll_period/test_payroll_period.py new file mode 100644 index 0000000000..d06dc739a6 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period/test_payroll_period.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestPayrollPeriod(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/payroll_period_date/__init__.py b/erpnext/hr/doctype/payroll_period_date/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json b/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json new file mode 100644 index 0000000000..29bd2a3322 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json @@ -0,0 +1,103 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 15:17:30.513630", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 19:39:37.473294", + "modified_by": "Administrator", + "module": "HR", + "name": "Payroll Period Date", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.py b/erpnext/hr/doctype/payroll_period_date/payroll_period_date.py new file mode 100644 index 0000000000..06ecb495f3 --- /dev/null +++ b/erpnext/hr/doctype/payroll_period_date/payroll_period_date.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class PayrollPeriodDate(Document): + pass diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index 29d601545e..ac8e51d3a8 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "autoname": "field:salary_component", @@ -12,6 +13,7 @@ "editable_grid": 1, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -22,6 +24,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Name", @@ -37,9 +40,11 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -49,7 +54,8 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, + "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Abbr", @@ -66,10 +72,12 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "120px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -80,6 +88,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 1, "label": "Type", @@ -96,9 +105,41 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -109,6 +150,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Description", @@ -124,19 +166,117 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "section_break_5", + "depends_on": "eval:doc.type==\"Earning\"", + "fieldname": "flexible_benefits", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Flexible Benefits", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_flexible_benefit", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Flexible Benefit", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_flexible_benefit", + "fieldname": "is_pro_rata_applicable", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Pro-rata Applicable", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_9", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -151,9 +291,202 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_flexible_benefit", + "fieldname": "max_benefit", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Benefit (Amount)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_flexible_benefit", + "fieldname": "earning_component_if_unclaimed", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Earning Component If Unclaimed", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.type=='Deduction'", + "fieldname": "section_break_11", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "variable_based_on_taxable_salary", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Variable Based On Taxable Salary", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "variable_based_on_taxable_salary", + "fieldname": "taxable_salary_slabs", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Taxable Salary Slabs", + "length": 0, + "no_copy": 0, + "options": "Taxable Salary Slab", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_5", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Accounts", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -164,6 +497,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Accounts", @@ -180,21 +514,22 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-flag", "idx": 0, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-16 12:44:37.733773", + "modified": "2018-04-13 20:10:20.771538", "modified_by": "Administrator", "module": "HR", "name": "Salary Component", @@ -203,7 +538,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -211,7 +545,6 @@ "export": 1, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -223,10 +556,12 @@ "write": 1 } ], - "quick_entry": 1, + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_component/test_salary_component.js b/erpnext/hr/doctype/salary_component/test_salary_component.js new file mode 100644 index 0000000000..c47d32d996 --- /dev/null +++ b/erpnext/hr/doctype/salary_component/test_salary_component.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Salary Component", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Salary Component + () => frappe.tests.make('Salary Component', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/hr/doctype/salary_slip/salary_slip.json index 00deb0fc5e..240e3cfc60 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.json +++ b/erpnext/hr/doctype/salary_slip/salary_slip.json @@ -1008,6 +1008,98 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_32", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "include_unclaimed_employee_benefits", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Include Unclaimed Employee Benefits", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "deduct_tax_for_unsubmitted_tax_exemption_proof", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Deduct Tax For Unsubmitted Tax Exemption Proof", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1720,7 +1812,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-02-26 05:16:47.169743", + "modified": "2018-04-13 20:14:23.105069", "modified_by": "Administrator", "module": "HR", "name": "Salary Slip", @@ -1728,7 +1820,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -1749,7 +1840,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -1769,7 +1859,6 @@ }, { "amend": 0, - "apply_user_permissions": 1, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/hr/doctype/salary_structure/salary_structure.json index 945ebd05cb..4da472fc8c 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.json +++ b/erpnext/hr/doctype/salary_structure/salary_structure.json @@ -40,6 +40,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -71,6 +72,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -99,6 +101,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -133,6 +136,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -166,6 +170,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -198,6 +203,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -227,6 +233,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -259,6 +266,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -289,6 +297,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -320,6 +329,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -349,6 +359,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -382,6 +393,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -414,6 +426,69 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_encashment_amount_per_day", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Encashment Amount Per Day", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_benefits", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Benefits (Amount)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -448,6 +523,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -479,6 +555,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -513,6 +590,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -544,6 +622,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -577,6 +656,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -607,6 +687,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -635,6 +716,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -668,6 +750,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -700,6 +783,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -730,6 +814,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -760,6 +845,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -791,6 +877,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -820,6 +907,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -851,6 +939,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -865,7 +954,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-11-10 18:45:07.120254", + "modified": "2018-04-13 16:31:24.837556", "modified_by": "Administrator", "module": "HR", "name": "Salary Structure", @@ -873,7 +962,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -893,7 +981,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, diff --git a/erpnext/hr/doctype/taxable_salary_slab/__init__.py b/erpnext/hr/doctype/taxable_salary_slab/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json b/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json new file mode 100644 index 0000000000..bd0ec6be31 --- /dev/null +++ b/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json @@ -0,0 +1,165 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-13 17:42:13.516032", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "From Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_amount", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "To Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "percent_deduction", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Percent Deduction", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "condition", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Condition", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-13 20:09:36.675987", + "modified_by": "Administrator", + "module": "HR", + "name": "Taxable Salary Slab", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py b/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py new file mode 100644 index 0000000000..23e5ffbe62 --- /dev/null +++ b/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class TaxableSalarySlab(Document): + pass From 8f14cb590c54a5ffbb57e7c1e39919671990efa1 Mon Sep 17 00:00:00 2001 From: Pawan Mehta Date: Sat, 14 Apr 2018 11:01:10 +0530 Subject: [PATCH 003/154] Add grade to employee master (#13654) --- erpnext/hr/doctype/employee/employee.json | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 0c715e647d..39383ffd59 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -972,6 +972,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, From b15ef8450fbb03f1388ec394cce1aafcbe00eef2 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Sat, 14 Apr 2018 12:33:01 +0530 Subject: [PATCH 004/154] [Enterprise] Patch and child table changes (#13656) * [patch] rename field * Employee Property History child table * remove child tables --- .../employee_promotion.json | 4 +- .../employee_promotion_detail.json | 134 ------------------ .../employee_promotion_detail.py | 10 -- .../__init__.py | 0 .../employee_property_history.json} | 4 +- .../employee_property_history.py} | 2 +- .../employee_transfer/employee_transfer.json | 4 +- .../employee_transfer_detail/__init__.py | 0 .../employee_transfer_detail.js | 8 -- .../test_employee_transfer_detail.js | 23 --- .../test_employee_transfer_detail.py | 10 -- erpnext/hr/doctype/leave_type/leave_type.json | 4 +- erpnext/patches.txt | 1 + .../v11_0/rename_field_max_days_allowed.py | 7 + 14 files changed, 17 insertions(+), 194 deletions(-) delete mode 100644 erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json delete mode 100644 erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py rename erpnext/hr/doctype/{employee_promotion_detail => employee_property_history}/__init__.py (100%) rename erpnext/hr/doctype/{employee_transfer_detail/employee_transfer_detail.json => employee_property_history/employee_property_history.json} (97%) rename erpnext/hr/doctype/{employee_transfer_detail/employee_transfer_detail.py => employee_property_history/employee_property_history.py} (85%) delete mode 100644 erpnext/hr/doctype/employee_transfer_detail/__init__.py delete mode 100644 erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js delete mode 100644 erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js delete mode 100644 erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py create mode 100644 erpnext/patches/v11_0/rename_field_max_days_allowed.py diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index 1dee7ead70..0bf2031f9a 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -157,7 +157,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Promotion Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, @@ -213,7 +213,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:34:01.662392", + "modified": "2018-04-14 11:45:04.685356", "modified_by": "Administrator", "module": "HR", "name": "Employee Promotion", diff --git a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json deleted file mode 100644 index 56823ea4ce..0000000000 --- a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 18:32:35.242437", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 4, - "fieldname": "property", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Property", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 3, - "fieldname": "current", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Current", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 3, - "fieldname": "new", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "New", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-04-13 18:37:09.265584", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Promotion Detail", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py b/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py deleted file mode 100644 index 35f1297efc..0000000000 --- a/erpnext/hr/doctype/employee_promotion_detail/employee_promotion_detail.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeePromotionDetail(Document): - pass diff --git a/erpnext/hr/doctype/employee_promotion_detail/__init__.py b/erpnext/hr/doctype/employee_property_history/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_promotion_detail/__init__.py rename to erpnext/hr/doctype/employee_property_history/__init__.py diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json b/erpnext/hr/doctype/employee_property_history/employee_property_history.json similarity index 97% rename from erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json rename to erpnext/hr/doctype/employee_property_history/employee_property_history.json index 3ec8ffedf3..7a416b2ed1 100644 --- a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.json +++ b/erpnext/hr/doctype/employee_property_history/employee_property_history.json @@ -116,10 +116,10 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 18:38:59.649399", + "modified": "2018-04-14 11:44:36.458039", "modified_by": "Administrator", "module": "HR", - "name": "Employee Transfer Detail", + "name": "Employee Property History", "name_case": "", "owner": "Administrator", "permissions": [], diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py b/erpnext/hr/doctype/employee_property_history/employee_property_history.py similarity index 85% rename from erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py rename to erpnext/hr/doctype/employee_property_history/employee_property_history.py index d23c4feae4..fb67852d16 100644 --- a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.py +++ b/erpnext/hr/doctype/employee_property_history/employee_property_history.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -class EmployeeTransferDetail(Document): +class EmployeePropertyHistory(Document): pass diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 78da7c52aa..5d0a3679f7 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -189,7 +189,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Transfer Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, @@ -307,7 +307,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:33:00.045834", + "modified": "2018-04-14 11:45:36.493830", "modified_by": "Administrator", "module": "HR", "name": "Employee Transfer", diff --git a/erpnext/hr/doctype/employee_transfer_detail/__init__.py b/erpnext/hr/doctype/employee_transfer_detail/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js b/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js deleted file mode 100644 index c453d9d1f2..0000000000 --- a/erpnext/hr/doctype/employee_transfer_detail/employee_transfer_detail.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Transfer Detail', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js deleted file mode 100644 index 8fa15ea85f..0000000000 --- a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Transfer Detail", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Transfer Detail - () => frappe.tests.make('Employee Transfer Detail', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py b/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py deleted file mode 100644 index 7537f3449b..0000000000 --- a/erpnext/hr/doctype/employee_transfer_detail/test_employee_transfer_detail.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeTransferDetail(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 6b0433f802..1a001c53fb 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -113,7 +113,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "max_days_allowed", + "fieldname": "max_continuous_days_allowed", "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, @@ -746,7 +746,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:54:03.588288", + "modified": "2018-04-14 11:53:59.503513", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 71802b40f4..8eab16d8e6 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -523,3 +523,4 @@ erpnext.patches.v11_0.update_department_lft_rgt erpnext.patches.v11_0.add_default_email_template_for_leave erpnext.patches.v11_0.set_default_email_template_in_hr erpnext.patches.v10_0.taxes_issue_with_pos +erpnext.patches.v11_0.rename_field_max_days_allowed diff --git a/erpnext/patches/v11_0/rename_field_max_days_allowed.py b/erpnext/patches/v11_0/rename_field_max_days_allowed.py new file mode 100644 index 0000000000..bdf87f4719 --- /dev/null +++ b/erpnext/patches/v11_0/rename_field_max_days_allowed.py @@ -0,0 +1,7 @@ +import frappe +from frappe.model.utils.rename_field import rename_field + +def execute(): + frappe.reload_doc("hr", "doctype", "leave_type") + frappe.db.sql("""ALTER table `tabLeave Type` modify max_days_allowed int(8) NOT NULL""") + rename_field("Leave Type", "max_days_allowed", "max_continuous_days_allowed") \ No newline at end of file From f914bd374d22134ecc81c3bf12bad8714cd077e3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 12:38:55 +0530 Subject: [PATCH 005/154] Added links in HR module --- erpnext/config/hr.py | 129 +++++++++++- .../en/human-resources/health-insurance.md | 4 +- erpnext/hr/doctype/employee/employee.json | 2 +- .../employee_life_cycle_process_template.js | 8 - .../employee_life_cycle_process_template.json | 194 ------------------ .../employee_life_cycle_process_template.py | 10 - ...st_employee_life_cycle_process_template.js | 23 --- ...st_employee_life_cycle_process_template.py | 10 - .../__init__.py | 0 ...oyee_life_cycle_process_template_detail.py | 10 - .../employee_lifecycle_process_template.json | 4 +- .../__init__.py | 0 ..._lifecycle_process_template_activity.json} | 6 +- ...ee_lifecycle_process_template_activity.py} | 2 +- .../__init__.py | 0 .../employee_tax_excemption_category.js | 8 - .../employee_tax_excemption_category.json | 194 ------------------ .../test_employee_tax_excemption_category.js | 23 --- .../test_employee_tax_excemption_category.py | 10 - .../hr/doctype/health_insurance/__init__.py | 0 .../health_insurance/health_insurance.js | 8 - .../health_insurance/health_insurance.json | 115 ----------- .../health_insurance/health_insurance.py | 10 - .../health_insurance/test_health_insurance.js | 23 --- .../health_insurance/test_health_insurance.py | 10 - 25 files changed, 127 insertions(+), 676 deletions(-) delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py delete mode 100644 erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py rename erpnext/hr/doctype/{employee_life_cycle_process_template => employee_lifecycle_process_template_activity}/__init__.py (100%) rename erpnext/hr/doctype/{employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json => employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json} (95%) rename erpnext/hr/doctype/{employee_tax_excemption_category/employee_tax_excemption_category.py => employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py} (81%) delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/__init__.py delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py delete mode 100644 erpnext/hr/doctype/health_insurance/__init__.py delete mode 100644 erpnext/hr/doctype/health_insurance/health_insurance.js delete mode 100644 erpnext/hr/doctype/health_insurance/health_insurance.json delete mode 100644 erpnext/hr/doctype/health_insurance/health_insurance.py delete mode 100644 erpnext/hr/doctype/health_insurance/test_health_insurance.js delete mode 100644 erpnext/hr/doctype/health_insurance/test_health_insurance.py diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index 4cd1b14a00..85d917bb87 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -23,12 +23,16 @@ def get_data(): "name": "Attendance", "description": _("Attendance record."), }, + { + "type": "doctype", + "name": "Attendance Request", + }, { "type": "doctype", "name": "Upload Attendance", "description":_("Upload attendance from a .csv file"), "hide_count": True - }, + } ] }, { @@ -59,6 +63,22 @@ def get_data(): "name": "Leave Application", "description": _("Applications for leave."), }, + { + "type": "doctype", + "name": "Compensatory Leave Request", + }, + { + "type": "doctype", + "name": "Leave Period", + }, + { + "type": "doctype", + "name": "Leave Policy", + }, + { + "type": "doctype", + "name": "Leave Encashment", + }, { "type": "doctype", "name":"Leave Type", @@ -89,33 +109,94 @@ def get_data(): ] }, + { + "label": _("Employee Lifecycle"), + "items": [ + { + "type": "doctype", + "name": "Employee Transfer", + }, + { + "type": "doctype", + "name": "Employee Promotion", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity Type", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process Template", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process", + } + ] + }, { "label": _("Payroll"), "items": [ + { + "type": "doctype", + "name": "Salary Structure Assignment", + }, { "type": "doctype", "name": "Salary Slip", - "description": _("Monthly salary statement."), }, { "type": "doctype", "name": "Payroll Entry", "label": _("Payroll Entry"), - "description":_("Generate Salary Slips"), "hide_count": True }, { "type": "doctype", - "name": "Salary Structure", - "description": _("Salary template master.") + "name": "Employee Benefit Claim", + }, + { + "type": "doctype", + "name": "Employee Incentive", + }, + { + "type": "doctype", + "name": "Employee Benefit Application", + }, + { + "type": "doctype", + "name": "Employee Tax Exemption Proof Submission", + }, + { + "type": "doctype", + "name": "Employee Tax Exemption Declaration", + } + ] + }, + { + "label": _("Payroll Setup"), + "items": [ + { + "type": "doctype", + "name": "Payroll Period", }, { "type": "doctype", "name": "Salary Component", - "label": _("Salary Components"), - "description": _("Earnings, Deductions and other Salary components") }, - + { + "type": "doctype", + "name": "Salary Structure", + }, + { + "type": "doctype", + "name": "Employee Tax Exemption Category", + }, + ] }, { @@ -199,7 +280,27 @@ def get_data(): }, ] }, - + { + "label": _("Shift Management"), + "items": [ + { + "type": "doctype", + "name": "Shift Type", + }, + { + "type": "doctype", + "name": "Shift Request", + }, + { + "type": "doctype", + "name": "Shift Assignment", + }, + { + "type": "doctype", + "name": "Shift Assignment Tool", + } + ] + }, { "label": _("Fleet Management"), "items": [ @@ -248,7 +349,15 @@ def get_data(): }, { "type": "doctype", - "name": "Health Insurance" + "name": "Employee Health Insurance" + }, + { + "type": "doctype", + "name": "Staffing Plan", + }, + { + "type": "doctype", + "name": "Employee Grade", } ] }, diff --git a/erpnext/docs/user/manual/en/human-resources/health-insurance.md b/erpnext/docs/user/manual/en/human-resources/health-insurance.md index ed4d778757..af4bee9072 100644 --- a/erpnext/docs/user/manual/en/human-resources/health-insurance.md +++ b/erpnext/docs/user/manual/en/human-resources/health-insurance.md @@ -1,6 +1,4 @@ -# Health Insurance - -Health Insurance is an important information attached to Employee. +# Employee Health Insurance To create Health Insurance Provider: diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 39383ffd59..a1f37608ed 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -640,7 +640,7 @@ "label": "Health Insurance Provider", "length": 0, "no_copy": 0, - "options": "Health Insurance", + "options": "Employee Health Insurance", "permlevel": 0, "precision": "", "print_hide": 0, diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js deleted file mode 100644 index d525a00fef..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Life Cycle Process Template', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json deleted file mode 100644 index 087e1057f7..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "ELCP.#####", - "beta": 0, - "creation": "2018-04-13 17:40:38.806266", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "process_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lifecycle Process Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "process_details", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Lifecycle Process Template Detail", - "length": 0, - "no_copy": 0, - "options": "Employee Lifecycle Process Template Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Life Cycle Process Template", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 18:57:48.489059", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Life Cycle Process Template", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py b/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py deleted file mode 100644 index a7cf2ba8e3..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template/employee_life_cycle_process_template.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifeCycleProcessTemplate(Document): - pass diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js deleted file mode 100644 index 3b035e633f..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Life Cycle Process Template", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Life Cycle Process Template - () => frappe.tests.make('Employee Life Cycle Process Template', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py b/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py deleted file mode 100644 index a6115bb5cb..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template/test_employee_life_cycle_process_template.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeLifeCycleProcessTemplate(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py b/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py deleted file mode 100644 index 3406cf551e..0000000000 --- a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifeCycleProcessTemplateDetail(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json index df5db6c30f..582a94f4ac 100644 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json +++ b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json @@ -62,7 +62,7 @@ "label": "Employee Lifecycle Process Template Detail", "length": 0, "no_copy": 0, - "options": "Employee Lifecycle Process Template Detail", + "options": "Employee Lifecycle Process Template Activity", "permlevel": 0, "precision": "", "print_hide": 0, @@ -118,7 +118,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:57:55.627207", + "modified": "2018-04-14 11:35:19.465613", "modified_by": "Administrator", "module": "HR", "name": "Employee Lifecycle Process Template", diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_life_cycle_process_template/__init__.py rename to erpnext/hr/doctype/employee_lifecycle_process_template_activity/__init__.py diff --git a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json similarity index 95% rename from erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json rename to erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json index e6670e81f8..6d3c96cf4b 100644 --- a/erpnext/hr/doctype/employee_life_cycle_process_template_detail/employee_life_cycle_process_template_detail.json +++ b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json @@ -4,7 +4,7 @@ "allow_import": 0, "allow_rename": 0, "beta": 0, - "creation": "2018-04-13 17:38:53.419981", + "creation": "2018-04-14 11:34:30.508196", "custom": 0, "docstatus": 0, "doctype": "DocType", @@ -119,10 +119,10 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 18:41:46.695599", + "modified": "2018-04-14 11:34:30.508196", "modified_by": "Administrator", "module": "HR", - "name": "Employee Life Cycle Process Template Detail", + "name": "Employee Lifecycle Process Template Activity", "name_case": "", "owner": "Administrator", "permissions": [], diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py similarity index 81% rename from erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py rename to erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py index 1586bf136c..eeea2366b1 100644 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py +++ b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -class EmployeeTaxExcemptionCategory(Document): +class EmployeeLifecycleProcessTemplateActivity(Document): pass diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py b/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js deleted file mode 100644 index 2c4377cdbd..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Tax Excemption Category', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json deleted file mode 100644 index e49e780ffa..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "Prompt", - "beta": 0, - "creation": "2018-04-13 16:51:36.971140", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "deduction_component", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Deduction Component", - "length": 0, - "no_copy": 0, - "options": "Salary Component", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Max Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 16:52:11.640756", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Excemption Category", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js deleted file mode 100644 index 3872438079..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Tax Excemption Category", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Tax Excemption Category - () => frappe.tests.make('Employee Tax Excemption Category', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py deleted file mode 100644 index 7438f6464c..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeTaxExcemptionCategory(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/health_insurance/__init__.py b/erpnext/hr/doctype/health_insurance/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/health_insurance/health_insurance.js b/erpnext/hr/doctype/health_insurance/health_insurance.js deleted file mode 100644 index 504da27b2e..0000000000 --- a/erpnext/hr/doctype/health_insurance/health_insurance.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Health Insurance', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/health_insurance/health_insurance.json b/erpnext/hr/doctype/health_insurance/health_insurance.json deleted file mode 100644 index 301f0e5c1d..0000000000 --- a/erpnext/hr/doctype/health_insurance/health_insurance.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "field:health_insurance_name", - "beta": 0, - "creation": "2017-03-27 14:32:51.628588", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "health_insurance_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Health Insurance Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-03-13 08:19:33.710429", - "modified_by": "Administrator", - "module": "HR", - "name": "Health Insurance", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "health_insurance_name", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/health_insurance/health_insurance.py b/erpnext/hr/doctype/health_insurance/health_insurance.py deleted file mode 100644 index c2802543eb..0000000000 --- a/erpnext/hr/doctype/health_insurance/health_insurance.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class HealthInsurance(Document): - pass diff --git a/erpnext/hr/doctype/health_insurance/test_health_insurance.js b/erpnext/hr/doctype/health_insurance/test_health_insurance.js deleted file mode 100644 index 81b0f8d331..0000000000 --- a/erpnext/hr/doctype/health_insurance/test_health_insurance.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Health Insurance", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Health Insurance - () => frappe.tests.make('Health Insurance', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/health_insurance/test_health_insurance.py b/erpnext/hr/doctype/health_insurance/test_health_insurance.py deleted file mode 100644 index 6978720e89..0000000000 --- a/erpnext/hr/doctype/health_insurance/test_health_insurance.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestHealthInsurance(unittest.TestCase): - pass From fcdca7f2a0631ec8d44f5bc587a4bf1138784d1c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 12:54:51 +0530 Subject: [PATCH 006/154] Documents order in hr page --- erpnext/config/hr.py | 160 +++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 97 deletions(-) diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index 85d917bb87..fefa3e9f41 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -9,19 +9,15 @@ def get_data(): { "type": "doctype", "name": "Employee", - "description": _("Employee records."), }, { "type": "doctype", "name": "Employee Attendance Tool", - "label": _("Employee Attendance Tool"), - "description":_("Mark Attendance for multiple employees"), "hide_count": True }, { "type": "doctype", "name": "Attendance", - "description": _("Attendance record."), }, { "type": "doctype", @@ -30,43 +26,13 @@ def get_data(): { "type": "doctype", "name": "Upload Attendance", - "description":_("Upload attendance from a .csv file"), "hide_count": True } ] }, - { - "label": _("Recruitment"), - "items": [ - { - "type": "doctype", - "name": "Job Applicant", - "description": _("Applicant for a Job."), - }, - { - "type": "doctype", - "name": "Job Opening", - "description": _("Opening for a Job."), - }, - { - "type": "doctype", - "name": "Job Offer", - "description": _("Offer candidate a Job."), - }, - ] - }, { "label": _("Leaves and Holiday"), "items": [ - { - "type": "doctype", - "name": "Leave Application", - "description": _("Applications for leave."), - }, - { - "type": "doctype", - "name": "Compensatory Leave Request", - }, { "type": "doctype", "name": "Leave Period", @@ -75,6 +41,18 @@ def get_data(): "type": "doctype", "name": "Leave Policy", }, + { + "type": "doctype", + "name": "Leave Application", + }, + { + "type": "doctype", + "name": "Leave Allocation", + }, + { + "type": "doctype", + "name": "Compensatory Leave Request", + }, { "type": "doctype", "name": "Leave Encashment", @@ -82,60 +60,15 @@ def get_data(): { "type": "doctype", "name":"Leave Type", - "description": _("Type of leaves like casual, sick etc."), }, { "type": "doctype", "name": "Holiday List", - "description": _("Holiday master.") - }, - { - "type": "doctype", - "name": "Leave Allocation", - "description": _("Allocate leaves for a period.") - }, - { - "type": "doctype", - "name": "Leave Control Panel", - "label": _("Leave Allocation Tool"), - "description":_("Allocate leaves for the year."), - "hide_count": True }, { "type": "doctype", "name": "Leave Block List", - "description": _("Block leave applications by department.") }, - - ] - }, - { - "label": _("Employee Lifecycle"), - "items": [ - { - "type": "doctype", - "name": "Employee Transfer", - }, - { - "type": "doctype", - "name": "Employee Promotion", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Activity", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Activity Type", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Process Template", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Process", - } ] }, { @@ -196,26 +129,22 @@ def get_data(): "type": "doctype", "name": "Employee Tax Exemption Category", }, - ] }, { - "label": _("Expense Claims"), + "label": _("Expense Claim"), "items": [ { "type": "doctype", "name": "Employee Advance", - "description": _("Manage advance amount given to the Employee"), }, { "type": "doctype", "name": "Expense Claim", - "description": _("Claims for company expense."), }, { "type": "doctype", "name": "Expense Claim Type", - "description": _("Types of Expense Claim.") }, ] }, @@ -225,12 +154,10 @@ def get_data(): { "type": "doctype", "name": "Appraisal", - "description": _("Performance appraisal."), }, { "type": "doctype", "name": "Appraisal Template", - "description": _("Template for performance appraisals.") }, { "type": "page", @@ -246,12 +173,10 @@ def get_data(): { "type": "doctype", "name": "Loan Type", - "description": _("Define various loan types") }, { "type": "doctype", "name": "Loan Application", - "description": _("Loan Application") }, { "type": "doctype", @@ -259,6 +184,52 @@ def get_data(): }, ] }, + { + "label": _("Employee Lifecycle"), + "items": [ + { + "type": "doctype", + "name": "Employee Transfer", + }, + { + "type": "doctype", + "name": "Employee Promotion", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity Type", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process Template", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process", + } + ] + }, + { + "label": _("Recruitment"), + "items": [ + { + "type": "doctype", + "name": "Job Applicant", + }, + { + "type": "doctype", + "name": "Job Opening", + }, + { + "type": "doctype", + "name": "Job Offer", + }, + ] + }, { "label": _("Training"), "items": [ @@ -321,27 +292,26 @@ def get_data(): { "type": "doctype", "name": "HR Settings", - "description": _("Settings for HR Module") }, { "type": "doctype", "name": "Employment Type", - "description": _("Types of employment (permanent, contract, intern etc.).") }, { "type": "doctype", "name": "Branch", - "description": _("Organization branch master.") }, { "type": "doctype", "name": "Department", - "description": _("Organization unit (department) master.") }, { "type": "doctype", "name": "Designation", - "description": _("Employee designation (e.g. CEO, Director etc.).") + }, + { + "type": "doctype", + "name": "Employee Grade", }, { "type": "doctype", @@ -354,10 +324,6 @@ def get_data(): { "type": "doctype", "name": "Staffing Plan", - }, - { - "type": "doctype", - "name": "Employee Grade", } ] }, From 551844881b17facbf1d26e8fdfa67ff9a8fa352c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 17:04:56 +0530 Subject: [PATCH 007/154] Removed employee table from Salary Structure and added employee name in all forms --- erpnext/config/hr.py | 24 +- .../attendance_request.json | 35 ++- .../compensatory_leave_request.json | 68 ++++- .../compensatory_leave_request.py | 4 +- .../test_compensatory_leave_request.py | 33 +- erpnext/hr/doctype/employee/employee.json | 38 ++- .../employee_benefit_application.json | 35 ++- .../employee_benefit_claim.json | 35 ++- .../employee_incentive.json | 35 ++- .../employee_promotion.json | 37 ++- .../employee_transfer/employee_transfer.json | 37 ++- .../test_leave_application.py | 77 +++++ .../leave_encashment/leave_encashment.json | 148 ++++++--- .../leave_encashment/test_leave_encashment.py | 34 ++- .../hr/doctype/leave_period/leave_period.json | 284 +++++++++++++++++- .../doctype/leave_period/test_leave_period.py | 23 +- .../hr/doctype/leave_policy/leave_policy.json | 167 +--------- .../leave_policy_detail.json | 64 +--- erpnext/hr/doctype/leave_type/leave_type.json | 34 +-- .../salary_structure/salary_structure.js | 141 +++------ .../salary_structure/salary_structure.json | 112 +++---- .../salary_structure/salary_structure.py | 55 +--- .../salary_structure_assignment.js | 11 + .../salary_structure_assignment.json | 229 +++++++++++++- .../salary_structure_assignment.py | 44 ++- .../shift_assignment/shift_assignment.json | 47 ++- .../doctype/shift_request/shift_request.json | 35 ++- erpnext/patches.txt | 1 + .../create_salary_structure_assignments.py | 24 ++ 29 files changed, 1355 insertions(+), 556 deletions(-) create mode 100644 erpnext/patches/v11_0/create_salary_structure_assignments.py diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index fefa3e9f41..9a8298120a 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -84,17 +84,7 @@ def get_data(): }, { "type": "doctype", - "name": "Payroll Entry", - "label": _("Payroll Entry"), - "hide_count": True - }, - { - "type": "doctype", - "name": "Employee Benefit Claim", - }, - { - "type": "doctype", - "name": "Employee Incentive", + "name": "Payroll Entry" }, { "type": "doctype", @@ -102,12 +92,20 @@ def get_data(): }, { "type": "doctype", - "name": "Employee Tax Exemption Proof Submission", + "name": "Employee Benefit Claim", }, { "type": "doctype", "name": "Employee Tax Exemption Declaration", - } + }, + { + "type": "doctype", + "name": "Employee Tax Exemption Proof Submission", + }, + { + "type": "doctype", + "name": "Employee Incentive", + }, ] }, { diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.json b/erpnext/hr/doctype/attendance_request/attendance_request.json index 42317ed631..e33acf35fe 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.json +++ b/erpnext/hr/doctype/attendance_request/attendance_request.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -242,7 +274,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:02:38.231185", + "modified": "2018-04-14 15:38:14.344570", "modified_by": "Administrator", "module": "HR", "name": "Attendance Request", @@ -332,6 +364,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json index 1003bc5b15..f8b91a6bc1 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.json @@ -3,6 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 0, + "autoname": "CLR-.####", "beta": 0, "creation": "2018-04-13 14:51:39.326768", "custom": 0, @@ -44,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -136,6 +169,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Type", + "length": 0, + "no_copy": 0, + "options": "Leave Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -209,7 +274,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:06:17.469422", + "modified": "2018-04-14 15:36:39.668733", "modified_by": "Administrator", "module": "HR", "name": "Compensatory Leave Request", @@ -299,6 +364,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index bf0212ace9..90d482abcd 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -7,4 +7,6 @@ import frappe from frappe.model.document import Document class CompensatoryLeaveRequest(Document): - pass + def validate_present(self): + pass + diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py index 5d771baf83..ea73ca987a 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -7,4 +7,35 @@ import frappe import unittest class TestCompensatoryLeaveRequest(unittest.TestCase): - pass + def get_compensatory_leave_request(self): + return frappe.get_doc('Compensatory Leave Request', dict( + employee = employee, + work_from_date = today, + work_to_date = today, + reason = 'test' + )).insert() + + def test_creation_of_leave_allocation(self): + employee = get_employee() + today = get_today() + + compensatory_leave_request = self.get_compensatory_leave_request(today) + + before = get_leave_balance(employee, compensatory_leave_request.leave_type) + + compensatory_leave_request.submit() + + self.assertEqual(get_leave_balance(employee, compensatory_leave_request.leave_type), before + 1) + + def test_max_compensatory_leave(self): + employee = get_employee() + today = get_today() + + compensatory_leave_request = self.get_compensatory_leave_request() + + frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 0) + + self.assertRaises(MaxLeavesLimitCrossed, compensatory_leave_request.submit) + + frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 10) + \ No newline at end of file diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index a1f37608ed..025631b50e 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1236,7 +1236,43 @@ "bold": 0, "collapsible": 0, "columns": 0, +<<<<<<< HEAD "fieldname": "default_leave_policy", +======= + "description": "The first Leave Approver in the list will be set as the default Leave Approver", + "fieldname": "leave_approvers", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Approvers", + "length": 0, + "no_copy": 0, + "options": "Employee Leave Approver", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_policy", +>>>>>>> Removed employee table from Salary Structure and added employee name in all forms "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -1245,7 +1281,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Leave policy", + "label": "Leave Policy", "length": 0, "no_copy": 0, "options": "Leave Policy", diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json index 0b74f4fcff..0fff4fdab2 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -211,7 +243,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:33:14.303161", + "modified": "2018-04-14 15:35:20.748301", "modified_by": "Administrator", "module": "HR", "name": "Employee Benefit Application", @@ -301,6 +333,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json index 28fdc7245e..5e2b34b7d7 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -335,7 +367,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:36:23.572732", + "modified": "2018-04-14 15:38:41.538646", "modified_by": "Administrator", "module": "HR", "name": "Employee Benefit Claim", @@ -425,6 +457,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.json b/erpnext/hr/doctype/employee_incentive/employee_incentive.json index fe9e9c4db5..6d2bf5a9fb 100644 --- a/erpnext/hr/doctype/employee_incentive/employee_incentive.json +++ b/erpnext/hr/doctype/employee_incentive/employee_incentive.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -149,7 +181,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:55:05.862607", + "modified": "2018-04-14 15:41:16.126334", "modified_by": "Administrator", "module": "HR", "name": "Employee Incentive", @@ -220,6 +252,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index 0bf2031f9a..a7d49bcad3 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -157,7 +189,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Promotion Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -213,7 +245,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:45:04.685356", + "modified": "2018-04-14 15:42:49.452085", "modified_by": "Administrator", "module": "HR", "name": "Employee Promotion", @@ -284,6 +316,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 5d0a3679f7..55fa073fa2 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -189,7 +221,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Transfer Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -307,7 +339,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:45:36.493830", + "modified": "2018-04-14 15:42:31.098910", "modified_by": "Administrator", "module": "HR", "name": "Employee Transfer", @@ -378,6 +410,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index 0f77fb93b9..f220d7860b 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -225,6 +225,83 @@ class TestLeaveApplication(unittest.TestCase): frappe.db.set_value("Leave Block List", "_Test Leave Block List", "applies_to_all_departments", 0) + + def test_optional_leave(self): + '''''' + leave_period = get_leave_period() + today = get_today() + + holiday_list = frappe.get_doc(dict( + doctype = 'Holiday List', + name = 'test holiday list for optional holiday' + from_date = year_start_date(), + from_date = year_end_date() + holidays = [ + dict(holiday_date = today, description = 'test') + ] + )) + employee = get_employee() + + frappe.db.set_value('Employee', employee, 'holiday_list', holiday_list) + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Optional Type', + doctype = 'Leave Type', + is_optional_leave = 1, + holiday_list = holiday_list + )).insert() + + allocate_leaves(employee, leave_period, leave_type.name, 10) + + date = get_today() - 1 + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee, + leave_type = leave_type.name, + from_date = date, + to_date = date, + )) + + # can only apply on optional holidays + self.assertTrue(NotAnOptionalHoliday, leave_application.insert) + + leave_application.from_date = today + leave_application.to_date = today + leave_application.insert() + leave_application.submit() + + # check leave balance is reduced + self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 9) + + def test_leaves_allowed(self): + # TODO: test cannot allocate more than max leaves + + def test_applicable_after(self): + # TODO: test not applicable until applicable working days + + def test_max_continuous_leaves(self): + # TODO: test cannot take continuous leaves more than + + def test_earned_leave(self): + leave_period = get_leave_period() + employee = get_employee() + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Earned Leave Type', + doctype = 'Leave Type', + is_earned_leave = 1, + earned_leave_frequency = 'Monthly', + rounding = 0.5 + )).insert() + + allocate_leaves(employee, leave_period, leave_type.name, 0, eligible_leaves = 12) + + # this method will be called by scheduler + allocate_earned_leaves(leave_type.name, leave_period, as_on = half_of_leave_period) + + self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 6) + def make_allocation_record(employee=None, leave_type=None): frappe.db.sql("delete from `tabLeave Allocation`") diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.json b/erpnext/hr/doctype/leave_encashment/leave_encashment.json index 11d903c700..22f0b20fdb 100644 --- a/erpnext/hr/doctype/leave_encashment/leave_encashment.json +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.json @@ -3,6 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, + "autoname": "Leave-Encashment-.####", "beta": 0, "creation": "2018-04-13 15:31:51.197046", "custom": 0, @@ -82,8 +83,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "payroll_date", - "fieldtype": "Date", + "fieldname": "employee_name", + "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -91,44 +92,15 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payroll Date", + "label": "Employee Name", "length": 0, "no_copy": 0, + "options": "employee.employee_name", "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -169,6 +141,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -222,6 +224,68 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Leave Encashment", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payroll", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payroll", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, @@ -268,8 +332,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", + "fieldname": "payroll_date", + "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -277,14 +341,14 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Amended From", + "label": "Payroll Date", "length": 0, - "no_copy": 1, - "options": "Leave Encashment", + "no_copy": 0, "permlevel": 0, - "print_hide": 1, + "precision": "", + "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -304,7 +368,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:05:42.659510", + "modified": "2018-04-14 15:35:51.428448", "modified_by": "Administrator", "module": "HR", "name": "Leave Encashment", diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py index 653012a46e..a5052582a4 100644 --- a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py @@ -7,4 +7,36 @@ import frappe import unittest class TestLeaveEncashment(unittest.TestCase): - pass + def test_leave_balance_value_and_amount(self): + employee = get_employee() + leave_period = get_leave_period() + today = get_today() + + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type', + doctype = 'Leave Type', + allow_encashment = 1, + encashment_threshold_days = 3, + earning_component = 'Leave Encashment' + )).insert() + + allocate_leave(employee, leave_period, leave_type.name, 5) + + leave_encashment = frappe.get_doc(dict( + doctype = 'Leave Encashment', + employee = employee, + leave_period = leave_period, + leave_type = leave_type.name, + payroll_date = today + )).insert() + + self.assertEqual(leave_encashment.leave_balance, 5) + self.assertEqual(leave_encashment.encashable_days, 2) + + # TODO; validate value + salary_structure = get_current_structure(employee, today) + self.assertEqual(leave_encashment.encashment_value, + 2 * frappe.db.get_value('Salary Structure', salary_structure, 'leave_encashment_amount_per_day')) + + + diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json index 91727a0b3b..946ceec238 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.json +++ b/erpnext/hr/doctype/leave_period/leave_period.json @@ -167,6 +167,288 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "grant_leaves", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Grant Leaves", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "filter_by", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Filter By", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grant", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Grant", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_12", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "carry_forward_leaves", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Carry Forward Leaves", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -179,7 +461,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:39:02.199315", + "modified": "2018-04-14 13:29:57.066314", "modified_by": "Administrator", "module": "HR", "name": "Leave Period", diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py index f7a4368c26..381fbb234d 100644 --- a/erpnext/hr/doctype/leave_period/test_leave_period.py +++ b/erpnext/hr/doctype/leave_period/test_leave_period.py @@ -7,4 +7,25 @@ import frappe import unittest class TestLeavePeriod(unittest.TestCase): - pass + def test_leave_grant(self): + employee = get_employee() + leave_policy = get_leave_policy() + leave_period = get_leave_period() + + frappe.db.set_value('Employee', employee, 'leave_policy', leave_policy) + + leave_period.employee = employee + + clear_leave_allocation(employee) + + leave_period.grant_leaves() + + for d in leave_policy: + self.assertEqual(get_leave_balance(employee, d.leave_type), d.annual_allocation) + + return leave_period + + def test_duplicate_grant(self): + leave_period = self.test_leave_grant() + self.assertRaises(DuplicateLeaveGrant, leave_period.grant_leaves) + \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.json b/erpnext/hr/doctype/leave_policy/leave_policy.json index bf7f38aa77..13cd823f16 100644 --- a/erpnext/hr/doctype/leave_policy/leave_policy.json +++ b/erpnext/hr/doctype/leave_policy/leave_policy.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, - "autoname": "LP.####", + "autoname": "Leave-Policy-.####", "beta": 0, "creation": "2018-04-13 16:06:19.507624", "custom": 0, @@ -19,18 +19,19 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "start_date", - "fieldtype": "Date", + "fieldname": "leave_policy_details", + "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, - "label": "Start Date", + "label": "Leave Policy Details", "length": 0, "no_copy": 0, + "options": "Leave Policy Detail", "permlevel": 0, "precision": "", "print_hide": 0, @@ -44,98 +45,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "end_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "End Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -166,68 +75,6 @@ "set_only_once": 0, "translatable": 0, "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "leave_policy_details", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Leave Policy Details", - "length": 0, - "no_copy": 0, - "options": "Leave Policy Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 } ], "has_web_view": 0, @@ -240,7 +87,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:57:49.400508", + "modified": "2018-04-14 13:13:27.915855", "modified_by": "Administrator", "module": "HR", "name": "Leave Policy", diff --git a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json index 9c29bf97e7..572b2f7953 100644 --- a/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json +++ b/erpnext/hr/doctype/leave_policy_detail/leave_policy_detail.json @@ -74,68 +74,6 @@ "set_only_once": 0, "translatable": 0, "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 2, - "fieldname": "is_pro_rata_applicable", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Pro-rata Applicable", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 3, - "fieldname": "month_threshold_day", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Month Threshold Day", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 } ], "has_web_view": 0, @@ -148,7 +86,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 19:59:47.087760", + "modified": "2018-04-14 13:00:34.511109", "modified_by": "Administrator", "module": "HR", "name": "Leave Policy Detail", diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 1a001c53fb..1d1aef2045 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -113,7 +113,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "max_continuous_days_allowed", + "fieldname": "max_days_allowed", "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, @@ -448,36 +448,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -746,7 +716,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 11:53:59.503513", + "modified": "2018-04-14 14:36:46.824289", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js index 8e6b69bd9e..8e5f8e651f 100755 --- a/erpnext/hr/doctype/salary_structure/salary_structure.js +++ b/erpnext/hr/doctype/salary_structure/salary_structure.js @@ -2,7 +2,6 @@ // License: GNU General Public License v3. See license.txt {% include "erpnext/public/js/controllers/accounts.js" %} -cur_frm.add_fetch('employee', 'company', 'company'); cur_frm.add_fetch('company', 'default_letter_head', 'letter_head'); @@ -31,14 +30,6 @@ frappe.ui.form.on('Salary Structure', { } } }); - frm.set_query("employee", "employees", function(doc) { - return { - query: "erpnext.controllers.queries.employee_query", - filters: { - company: doc.company - } - } - }); frm.set_query("payment_account", function () { var account_types = ["Bank", "Cash"]; return { @@ -58,61 +49,6 @@ frappe.ui.form.on('Salary Structure', { frm.add_custom_button(__("Preview Salary Slip"), function() { frm.trigger('preview_salary_slip'); }, "fa fa-sitemap", "btn-default"); - - frm.add_custom_button(__("Add Employees"),function () { - frm.trigger('add_employees') - }) - - }, - - add_employees:function (frm) { - frm.$emp_dialog = new frappe.ui.Dialog({ - title: __("Add Employees"), - fields: [ - {fieldname:'company', fieldtype:'Link', options: 'Company', label: __('Company')}, - {fieldname:'branch', fieldtype:'Link', options: 'Branch', label: __('Branch')}, - {fieldname:'department', fieldtype:'Link', options: 'Department', label: __('Department')}, - {fieldname:'designation', fieldtype:'Link', options: 'Designation', label: __('Designation')}, - {fieldname:'base_variable', fieldtype:'Section Break'}, - {fieldname:'base', fieldtype:'Currency', label: __('Base')}, - {fieldname:'base_col_br', fieldtype:'Column Break'}, - {fieldname:'variable', fieldtype:'Currency', label: __('Variable')} - ] - }); - frm.$emp_dialog.set_primary_action(__("Add"), function() { - frm.trigger('get_employees'); - }); - frm.$emp_dialog.show(); - }, - - get_employees:function (frm) { - var filters = frm.$emp_dialog.get_values(); - if ('variable' in filters) { - delete filters.variable - } - if ('base' in filters) { - delete filters.base - } - frappe.call({ - method:'erpnext.hr.doctype.salary_structure.salary_structure.get_employees', - args:{ - filters: filters - }, - callback:function (r) { - var employees = $.map(frm.doc.employees, function(d) { return d.employee }); - for (var i=0; i< r.message.length; i++) { - if (employees.indexOf(r.message[i].name) === -1) { - var row = frappe.model.add_child(frm.doc, frm.fields_dict.employees.df.options, frm.fields_dict.employees.df.fieldname); - row.employee = r.message[i].name; - row.employee_name = r.message[i].employee_name; - row.base = frm.$emp_dialog.get_value('base'); - row.variable = frm.$emp_dialog.get_value('variable'); - } - } - frm.refresh_field('employees'); - frm.$emp_dialog.hide() - } - }) }, salary_slip_based_on_timesheet: function(frm) { @@ -120,38 +56,54 @@ frappe.ui.form.on('Salary Structure', { }, preview_salary_slip: function(frm) { - var d = new frappe.ui.Dialog({ - title: __("Preview Salary Slip"), - fields: [ - { "fieldname":"employee", "fieldtype":"Select", "label":__("Employee"), - options: $.map(frm.doc.employees, function(d) { return d.employee }), reqd: 1 }, - { fieldname:"fetch", "label":__("Show Salary Slip"), "fieldtype":"Button"} - ] - }); - d.get_input("fetch").on("click", function() { - var values = d.get_values(); - if(!values) return; - var print_format; - frm.doc.salary_slip_based_on_timesheet ? - print_format="Salary Slip based on Timesheet" : - print_format="Salary Slip Standard"; + frappe.call({ + method: "erpnext.hr.doctype.salary_structure.salary_structure.get_employees", + args: { + salary_structure: frm.doc.name + }, + callback: function(r) { + var employees = r.message; + var d = new frappe.ui.Dialog({ + title: __("Preview Salary Slip"), + fields: [ + { + "label":__("Employee"), + "fieldname":"employee", + "fieldtype":"Select", + options: employees + }, { + fieldname:"fetch", + "label":__("Show Salary Slip"), + "fieldtype":"Button" + } + ] + }); + d.get_input("fetch").on("click", function() { + var values = d.get_values(); + if(!values) return; + var print_format; + frm.doc.salary_slip_based_on_timesheet ? + print_format="Salary Slip based on Timesheet" : + print_format="Salary Slip Standard"; - frappe.call({ - method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", - args: { - source_name: frm.doc.name, - employee: values.employee, - as_print: 1, - print_format: print_format - }, - callback: function(r) { - var new_window = window.open(); - new_window.document.write(r.message); - // frappe.msgprint(r.message); - } - }); + frappe.call({ + method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", + args: { + source_name: frm.doc.name, + employee: values.employee, + as_print: 1, + print_format: print_format + }, + callback: function(r) { + var new_window = window.open(); + new_window.document.write(r.message); + // frappe.msgprint(r.message); + } + }); + }); + d.show(); + } }); - d.show(); }, toggle_fields: function(frm) { @@ -189,7 +141,6 @@ var calculate_totals = function(doc) { cur_frm.cscript.validate = function(doc, cdt, cdn) { calculate_totals(doc); - if(doc.employee && doc.is_active == "Yes") frappe.model.clear_doc("Employee", doc.employee); } diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/hr/doctype/salary_structure/salary_structure.json index 4da472fc8c..5480c0ee92 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.json +++ b/erpnext/hr/doctype/salary_structure/salary_structure.json @@ -206,69 +206,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee_break", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Select employees for current Salary Structure", - "fieldname": "employees", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employees", - "length": 0, - "no_copy": 0, - "options": "Salary Structure Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -941,6 +878,37 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Salary Structure", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -950,21 +918,21 @@ "idx": 1, "image_view": 0, "in_create": 0, - "is_submittable": 0, + "is_submittable": 1, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 16:31:24.837556", + "modified": "2018-04-14 16:05:11.002259", "modified_by": "Administrator", "module": "HR", "name": "Salary Structure", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, + "amend": 1, + "cancel": 1, "create": 1, - "delete": 0, + "delete": 1, "email": 1, "export": 0, "if_owner": 0, @@ -976,12 +944,12 @@ "role": "HR User", "set_user_permissions": 0, "share": 1, - "submit": 0, + "submit": 1, "write": 1 }, { - "amend": 0, - "cancel": 0, + "amend": 1, + "cancel": 1, "create": 1, "delete": 1, "email": 1, @@ -995,7 +963,7 @@ "role": "HR Manager", "set_user_permissions": 0, "share": 1, - "submit": 0, + "submit": 1, "write": 1 } ], diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py index d8b56e3045..23c57de651 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.py +++ b/erpnext/hr/doctype/salary_structure/salary_structure.py @@ -4,65 +4,20 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, cint, getdate +from frappe.utils import flt, cint from frappe import _ from frappe.model.mapper import get_mapped_doc from frappe.model.document import Document -from erpnext.hr.utils import set_employee_name class SalaryStructure(Document): - def validate(self): self.validate_amount() - for e in self.get('employees'): - set_employee_name(e) - self.validate_date() self.strip_condition_and_formula_fields() - def get_ss_values(self,employee): - basic_info = frappe.db.sql("""select bank_name, bank_ac_no - from `tabEmployee` where name =%s""", employee) - ret = {'bank_name': basic_info and basic_info[0][0] or '', - 'bank_ac_no': basic_info and basic_info[0][1] or ''} - return ret - def validate_amount(self): if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet: frappe.throw(_("Net pay cannot be negative")) - def validate_date(self): - for employee in self.get('employees'): - joining_date, relieving_date = frappe.db.get_value("Employee", employee.employee, - ["date_of_joining", "relieving_date"]) - - if employee.from_date and joining_date and getdate(employee.from_date) < joining_date: - frappe.throw(_("From Date {0} for Employee {1} cannot be before employee's joining Date {2}") - .format(employee.from_date, employee.employee, joining_date)) - - st_name = frappe.db.sql("""select parent from `tabSalary Structure Employee` - where - employee=%(employee)s - and ( - (%(from_date)s between from_date and ifnull(to_date, '2199-12-31')) - or (%(to_date)s between from_date and ifnull(to_date, '2199-12-31')) - or (from_date between %(from_date)s and %(to_date)s) - ) - and ( - exists (select name from `tabSalary Structure` - where name = `tabSalary Structure Employee`.parent and is_active = 'Yes') - ) - and parent != %(salary_struct)s""", - { - 'employee': employee.employee, - 'from_date': employee.from_date, - 'to_date': (employee.to_date or '2199-12-31'), - 'salary_struct': self.name - }) - - if st_name: - frappe.throw(_("Active Salary Structure {0} found for employee {1} for the given dates") - .format(st_name[0][0], employee.employee)) - def strip_condition_and_formula_fields(self): # remove whitespaces from condition and formula fields for row in self.earnings: @@ -78,7 +33,7 @@ def make_salary_slip(source_name, target_doc = None, employee = None, as_print = def postprocess(source, target): if employee: employee_details = frappe.db.get_value("Employee", employee, - ["employee_name", "branch", "designation", "department"], as_dict=1) + ["employee_name", "branch", "designation", "department"], as_dict=1) target.employee = employee target.employee_name = employee_details.employee_name target.branch = employee_details.branch @@ -104,5 +59,7 @@ def make_salary_slip(source_name, target_doc = None, employee = None, as_print = @frappe.whitelist() -def get_employees(**args): - return frappe.get_list('Employee',filters=args['filters'], fields=['name', 'employee_name']) +def get_employees(salary_structure): + employees = frappe.get_list('Salary Structure Assignment', + filters={'salary_structure': salary_structure}, fields=['employee']) + return list(set([d.employee for d in employees])) \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js index 37a6fc8746..e7c6598653 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js @@ -2,6 +2,17 @@ // For license information, please see license.txt frappe.ui.form.on('Salary Structure Assignment', { + setup: function(frm) { + frm.set_query("employee", function() { + return { + query: "erpnext.controllers.queries.employee_query", + filters: { + company: frm.doc.company + } + } + }); + }, + refresh: function(frm) { } diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json index 0dd4f90f89..ab0353636c 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json @@ -1,9 +1,9 @@ { "allow_copy": 0, "allow_guest_to_view": 0, - "allow_import": 0, + "allow_import": 1, "allow_rename": 0, - "autoname": "SSA.#####", + "autoname": "SSA-.#####", "beta": 0, "creation": "2018-04-13 16:38:41.769237", "custom": 0, @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -77,6 +109,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_6", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -110,7 +172,7 @@ }, { "allow_bulk_edit": 0, - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "columns": 0, @@ -133,7 +195,161 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Base", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_9", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "variable", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Variable", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0, "set_only_once": 0, "translatable": 0, @@ -181,7 +397,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:54:11.425087", + "modified": "2018-04-14 16:11:12.749326", "modified_by": "Administrator", "module": "HR", "name": "Salary Structure Assignment", @@ -246,12 +462,13 @@ "write": 1 } ], - "quick_entry": 1, + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py index f4fbb3c62e..e5188c3a29 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py @@ -4,7 +4,49 @@ from __future__ import unicode_literals import frappe +from frappe import _ +from frappe.utils import getdate from frappe.model.document import Document class SalaryStructureAssignment(Document): - pass + def validate(self): + self.validate_dates() + + def validate_date(self): + joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, + ["date_of_joining", "relieving_date"]) + + if self.from_date: + if joining_date and getdate(self.from_date) < joining_date: + frappe.throw(_("From Date {0} cannot be before employee's joining Date {2}") + .format(self.from_date, joining_date)) + if relieving_date and getdate(self.from_date) > relieving_date: + frappe.throw(_("From Date {0} cannot be after employee's relieving Date {2}") + .format(self.from_date, relieving_date)) + + if self.to_date: + if self.from_date and getdate(self.from_date) < getdate(self.to_date): + frappe.throw(_("From Date {0} cannot be before To Date {2}") + .format(self.from_date, self.to_date)) + if relieving_date and getdate(self.to_date) > relieving_date: + frappe.throw(_("To Date {0} cannot be after employee's relieving Date {2}") + .format(self.to_date, relieving_date)) + + def validate_duplicate_assignments(self): + assignment = frappe.db.sql(""" + select name from `tabSalary Structure Assignment` + where employee=%(employee)s + and name != %(salary_struct)s + and ( + (%(from_date)s between from_date and ifnull(to_date, '2199-12-31')) + or (%(to_date)s between from_date and ifnull(to_date, '2199-12-31')) + or (from_date between %(from_date)s and %(to_date)s) + )""", { + 'employee': self.employee, + 'from_date': self.from_date, + 'to_date': (self.to_date or '2199-12-31'), + 'salary_struct': self.salary_struct + }) + + if assignment: + frappe.throw(_("Active Salary Structure Assignment {0} found for employee {1} for the given dates").format(assignment[0][0], self.employee)) \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json index 4d04ab3672..87d69e4816 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.json +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -19,7 +19,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "shift_type", + "fieldname": "employee", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -28,10 +28,10 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Shift Type", + "label": "Employee", "length": 0, "no_copy": 0, - "options": "Shift Type", + "options": "Employee", "permlevel": 0, "precision": "", "print_hide": 0, @@ -51,7 +51,39 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "employee", + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -60,10 +92,10 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Employee", + "label": "Shift Type", "length": 0, "no_copy": 0, - "options": "Employee", + "options": "Shift Type", "permlevel": 0, "precision": "", "print_hide": 0, @@ -243,7 +275,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:53:32.395707", + "modified": "2018-04-14 15:42:12.617715", "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", @@ -314,6 +346,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_request/shift_request.json b/erpnext/hr/doctype/shift_request/shift_request.json index c22127745a..1210d157dc 100644 --- a/erpnext/hr/doctype/shift_request/shift_request.json +++ b/erpnext/hr/doctype/shift_request/shift_request.json @@ -45,6 +45,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -213,7 +245,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:55:41.428419", + "modified": "2018-04-14 15:40:39.590051", "modified_by": "Administrator", "module": "HR", "name": "Shift Request", @@ -284,6 +316,7 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 8eab16d8e6..a23324d64d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -524,3 +524,4 @@ erpnext.patches.v11_0.add_default_email_template_for_leave erpnext.patches.v11_0.set_default_email_template_in_hr erpnext.patches.v10_0.taxes_issue_with_pos erpnext.patches.v11_0.rename_field_max_days_allowed +erpnext.patches.v11_0.create_salary_structure_assignments diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py new file mode 100644 index 0000000000..e321db60a5 --- /dev/null +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -0,0 +1,24 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc("hr", "doctype", "salary_structure_assignment") + for d in frappe.db.sql(""" + select * from `tabSalary Structure Employee` sse, `tabSalary Structure` ss + where ss.name = sse.parent""", as_dict=1): + + s = frappe.new_doc("Salary Structure Assignment") + s.employee = d.employee + s.employee_name = d.employee_name + s.salary_structure = d.parent + s.from_date = d.from_date + s.to_date = d.to_date + s.base = d.base + s.variable = d.variable + s.company = d.company + s.save() + + frappe.db.sql("update `tabSalary Structure` set docstatus=1") \ No newline at end of file From 81706fdb4683e55382bbef79190b27a353828382 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 17:11:48 +0530 Subject: [PATCH 008/154] Update rename_field_max_days_allowed.py --- erpnext/patches/v11_0/rename_field_max_days_allowed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/patches/v11_0/rename_field_max_days_allowed.py b/erpnext/patches/v11_0/rename_field_max_days_allowed.py index bdf87f4719..e0acf06f4b 100644 --- a/erpnext/patches/v11_0/rename_field_max_days_allowed.py +++ b/erpnext/patches/v11_0/rename_field_max_days_allowed.py @@ -3,5 +3,5 @@ from frappe.model.utils.rename_field import rename_field def execute(): frappe.reload_doc("hr", "doctype", "leave_type") - frappe.db.sql("""ALTER table `tabLeave Type` modify max_days_allowed int(8) NOT NULL""") - rename_field("Leave Type", "max_days_allowed", "max_continuous_days_allowed") \ No newline at end of file + frappe.db.sql_ddl("""ALTER table `tabLeave Type` modify max_days_allowed int(8) NOT NULL""") + rename_field("Leave Type", "max_days_allowed", "max_continuous_days_allowed") From 265426a5a6a8a190157413bae0b357b0aac4be43 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 17:18:54 +0530 Subject: [PATCH 009/154] Minor fixes --- .../leave_application/test_leave_application.py | 7 +++++-- .../salary_structure_assignment.py | 12 ++++++------ .../v11_0/create_salary_structure_assignments.py | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index f220d7860b..424da90791 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -233,9 +233,9 @@ class TestLeaveApplication(unittest.TestCase): holiday_list = frappe.get_doc(dict( doctype = 'Holiday List', - name = 'test holiday list for optional holiday' + name = 'test holiday list for optional holiday', from_date = year_start_date(), - from_date = year_end_date() + to_date = year_end_date(), holidays = [ dict(holiday_date = today, description = 'test') ] @@ -276,12 +276,15 @@ class TestLeaveApplication(unittest.TestCase): def test_leaves_allowed(self): # TODO: test cannot allocate more than max leaves + pass def test_applicable_after(self): # TODO: test not applicable until applicable working days + pass def test_max_continuous_leaves(self): # TODO: test cannot take continuous leaves more than + pass def test_earned_leave(self): leave_period = get_leave_period() diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py index e5188c3a29..c9269d7c92 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py @@ -12,24 +12,24 @@ class SalaryStructureAssignment(Document): def validate(self): self.validate_dates() - def validate_date(self): + def validate_dates(self): joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, ["date_of_joining", "relieving_date"]) if self.from_date: if joining_date and getdate(self.from_date) < joining_date: - frappe.throw(_("From Date {0} cannot be before employee's joining Date {2}") + frappe.throw(_("From Date {0} cannot be before employee's joining Date {1}") .format(self.from_date, joining_date)) if relieving_date and getdate(self.from_date) > relieving_date: - frappe.throw(_("From Date {0} cannot be after employee's relieving Date {2}") + frappe.throw(_("From Date {0} cannot be after employee's relieving Date {1}") .format(self.from_date, relieving_date)) if self.to_date: - if self.from_date and getdate(self.from_date) < getdate(self.to_date): - frappe.throw(_("From Date {0} cannot be before To Date {2}") + if self.from_date and getdate(self.from_date) > getdate(self.to_date): + frappe.throw(_("From Date {0} cannot be after To Date {1}") .format(self.from_date, self.to_date)) if relieving_date and getdate(self.to_date) > relieving_date: - frappe.throw(_("To Date {0} cannot be after employee's relieving Date {2}") + frappe.throw(_("To Date {0} cannot be after employee's relieving Date {1}") .format(self.to_date, relieving_date)) def validate_duplicate_assignments(self): diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py index e321db60a5..fc3a4315ee 100644 --- a/erpnext/patches/v11_0/create_salary_structure_assignments.py +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -7,9 +7,9 @@ import frappe def execute(): frappe.reload_doc("hr", "doctype", "salary_structure_assignment") for d in frappe.db.sql(""" - select * from `tabSalary Structure Employee` sse, `tabSalary Structure` ss + select sse.*, ss.company from `tabSalary Structure Employee` sse, `tabSalary Structure` ss where ss.name = sse.parent""", as_dict=1): - + print(d) s = frappe.new_doc("Salary Structure Assignment") s.employee = d.employee s.employee_name = d.employee_name From 8076d6ddc8f07d30bc7bddeeff85816d273b296d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sun, 15 Apr 2018 15:03:54 +0530 Subject: [PATCH 010/154] Renamed Health Insurance to Employee Health Insurance --- erpnext/hr/doctype/employee/employee.json | 36 ------ .../employee_health_insurance/__init__.py | 0 .../employee_health_insurance.js | 8 ++ .../employee_health_insurance.json | 113 ++++++++++++++++++ .../employee_health_insurance.py | 10 ++ .../test_employee_health_insurance.js | 23 ++++ .../test_employee_health_insurance.py | 10 ++ erpnext/patches.txt | 1 + .../patches/v11_0/rename_health_insurance.py | 10 ++ 9 files changed, 175 insertions(+), 36 deletions(-) create mode 100644 erpnext/hr/doctype/employee_health_insurance/__init__.py create mode 100644 erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.js create mode 100644 erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.json create mode 100644 erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.py create mode 100644 erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.js create mode 100644 erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.py create mode 100644 erpnext/patches/v11_0/rename_health_insurance.py diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 025631b50e..2d76dcf303 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1236,43 +1236,7 @@ "bold": 0, "collapsible": 0, "columns": 0, -<<<<<<< HEAD - "fieldname": "default_leave_policy", -======= - "description": "The first Leave Approver in the list will be set as the default Leave Approver", - "fieldname": "leave_approvers", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Leave Approvers", - "length": 0, - "no_copy": 0, - "options": "Employee Leave Approver", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "leave_policy", ->>>>>>> Removed employee table from Salary Structure and added employee name in all forms "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, diff --git a/erpnext/hr/doctype/employee_health_insurance/__init__.py b/erpnext/hr/doctype/employee_health_insurance/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.js b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.js new file mode 100644 index 0000000000..69d46e20d0 --- /dev/null +++ b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Health Insurance', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.json b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.json new file mode 100644 index 0000000000..e63da3974c --- /dev/null +++ b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.json @@ -0,0 +1,113 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 1, + "autoname": "field:health_insurance_name", + "beta": 0, + "creation": "2017-03-27 14:32:51.628588", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "health_insurance_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Health Insurance Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-15 14:56:46.924890", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Health Insurance", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "health_insurance_name", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.py b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.py new file mode 100644 index 0000000000..abc01ef8d4 --- /dev/null +++ b/erpnext/hr/doctype/employee_health_insurance/employee_health_insurance.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeHealthInsurance(Document): + pass diff --git a/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.js b/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.js new file mode 100644 index 0000000000..245cb32971 --- /dev/null +++ b/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Health Insurance", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Health Insurance + () => frappe.tests.make('Employee Health Insurance', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.py b/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.py new file mode 100644 index 0000000000..f0787f52d2 --- /dev/null +++ b/erpnext/hr/doctype/employee_health_insurance/test_employee_health_insurance.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeHealthInsurance(unittest.TestCase): + pass diff --git a/erpnext/patches.txt b/erpnext/patches.txt index a23324d64d..f2dd923b43 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -525,3 +525,4 @@ erpnext.patches.v11_0.set_default_email_template_in_hr erpnext.patches.v10_0.taxes_issue_with_pos erpnext.patches.v11_0.rename_field_max_days_allowed erpnext.patches.v11_0.create_salary_structure_assignments +erpnext.patches.v11_0.rename_health_insurance diff --git a/erpnext/patches/v11_0/rename_health_insurance.py b/erpnext/patches/v11_0/rename_health_insurance.py new file mode 100644 index 0000000000..24d1ddf031 --- /dev/null +++ b/erpnext/patches/v11_0/rename_health_insurance.py @@ -0,0 +1,10 @@ +# Copyright (c) 2018, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +from frappe.model.rename_doc import rename_doc +import frappe + +def execute(): + rename_doc('DocType', 'Health Insurance', 'Employee Health Insurance', force=True) + frappe.reload_doc('hr', 'doctype', 'employee_health_insurance') \ No newline at end of file From 0a17f8d51b8496aab9d401f161e617eda7ff5781 Mon Sep 17 00:00:00 2001 From: Pawan Mehta Date: Tue, 17 Apr 2018 14:44:18 +0530 Subject: [PATCH 011/154] remove shift schedule tool (#13658) --- .../doctype/shift_assignment_tool/__init__.py | 0 .../shift_assignment_tool.js | 8 - .../shift_assignment_tool.json | 352 ------------------ .../shift_assignment_tool.py | 10 - .../test_shift_assignment_tool.js | 23 -- .../test_shift_assignment_tool.py | 10 - 6 files changed, 403 deletions(-) delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/__init__.py delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js delete mode 100644 erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py diff --git a/erpnext/hr/doctype/shift_assignment_tool/__init__.py b/erpnext/hr/doctype/shift_assignment_tool/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js deleted file mode 100644 index d3658bf816..0000000000 --- a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Shift Assignment Tool', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json deleted file mode 100644 index aacfb8a9c9..0000000000 --- a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 16:29:29.473589", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "from_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "From Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "to_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "To Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "shift_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Shift Type", - "length": 0, - "no_copy": 0, - "options": "Shift Type", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Company", - "length": 0, - "no_copy": 0, - "options": "Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "assignment_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Assignment Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "project", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Project", - "length": 0, - "no_copy": 0, - "options": "Project", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 16:46:42.234317", - "modified_by": "Administrator", - "module": "HR", - "name": "Shift Assignment Tool", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py b/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py deleted file mode 100644 index fef8ab0791..0000000000 --- a/erpnext/hr/doctype/shift_assignment_tool/shift_assignment_tool.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class ShiftAssignmentTool(Document): - pass diff --git a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js deleted file mode 100644 index ca0be39983..0000000000 --- a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Shift Assignment Tool", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Shift Assignment Tool - () => frappe.tests.make('Shift Assignment Tool', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py b/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py deleted file mode 100644 index b1a8076108..0000000000 --- a/erpnext/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestShiftAssignmentTool(unittest.TestCase): - pass From fb9af3810644a98659dcb5448fd5808986106c89 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Tue, 17 Apr 2018 15:12:26 +0530 Subject: [PATCH 012/154] Group by party in general ledger report (#13649) * Group wise Ledger for Customer and Supplier * commonify group by fields --- .../report/general_ledger/general_ledger.js | 18 +++----- .../report/general_ledger/general_ledger.py | 43 +++++++++++-------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 68625db65f..0b7ae658bb 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -103,23 +103,19 @@ frappe.query_reports["General Ledger"] = { "fieldtype": "Data", "hidden": 1 }, + { + "fieldname":"group_by", + "label": __("Group by"), + "fieldtype": "Select", + "options": ["Group by Voucher", "Group by Account", "Group by Party"], + "default": "Group by Voucher" + }, { "fieldname":"tax_id", "label": __("Tax Id"), "fieldtype": "Data", "hidden": 1 }, - { - "fieldname":"group_by_voucher", - "label": __("Group by Voucher"), - "fieldtype": "Check", - "default": 1 - }, - { - "fieldname":"group_by_account", - "label": __("Group by Account"), - "fieldtype": "Check", - }, { "fieldname": "presentation_currency", "label": __("Currency"), diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 4789f9f978..d6972b937a 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -40,11 +40,11 @@ def validate_filters(filters, account_details): if filters.get("account") and not account_details.get(filters.account): frappe.throw(_("Account {0} does not exists").format(filters.account)) - if filters.get("account") and filters.get("group_by_account") \ - and account_details[filters.account].is_group == 0: + if (filters.get("account") and filters.get("group_by") == 'Group by Account' + and account_details[filters.account].is_group == 0): frappe.throw(_("Can not filter based on Account, if grouped by Account")) - if filters.get("voucher_no") and filters.get("group_by_voucher"): + if (filters.get("voucher_no") and filters.get("group_by") == 'Group by Voucher'): frappe.throw(_("Can not filter based on Voucher No, if grouped by Voucher")) if filters.from_date > filters.to_date: @@ -106,9 +106,9 @@ def get_gl_entries(filters): select_fields = """, sum(debit_in_account_currency) as debit_in_account_currency, sum(credit_in_account_currency) as credit_in_account_currency""" \ - - group_by_condition = "group by voucher_type, voucher_no, account, cost_center" \ - if filters.get("group_by_voucher") else "group by name" + group_by_condition = "group by name" + if filters.get("group_by") == "Group by Voucher": + group_by_condition = "group by voucher_type, voucher_no, account, cost_center" gl_entries = frappe.db.sql( """ @@ -144,13 +144,17 @@ def get_conditions(filters): if filters.get("voucher_no"): conditions.append("voucher_no=%(voucher_no)s") + if filters.get("group_by") == "Group by Party" and not filters.get("party_type"): + conditions.append("party_type in ('Customer', 'Supplier')") + if filters.get("party_type"): conditions.append("party_type=%(party_type)s") if filters.get("party"): conditions.append("party=%(party)s") - if not (filters.get("account") or filters.get("party") or filters.get("group_by_account")): + if not (filters.get("account") or filters.get("party") or + filters.get("group_by") in ["Group by Account", "Group by Party"]): conditions.append("posting_date >=%(from_date)s") conditions.append("posting_date <=%(to_date)s") @@ -168,15 +172,17 @@ def get_conditions(filters): def get_data_with_opening_closing(filters, account_details, gl_entries): data = [] - gle_map = initialize_gle_map(gl_entries) + + gle_map = initialize_gle_map(gl_entries, filters) totals, entries = get_accountwise_gle(filters, gl_entries, gle_map) # Opening for filtered account data.append(totals.opening) - if filters.get("group_by_account"): + if filters.get("group_by") in ["Group by Account", "Group by Party"]: for acc, acc_dict in gle_map.items(): + # acc if acc_dict.entries: # opening data.append({}) @@ -219,16 +225,19 @@ def get_totals_dict(): ) -def initialize_gle_map(gl_entries): +def initialize_gle_map(gl_entries, filters): gle_map = frappe._dict() + group_by = 'party' if filters.get('group_by') == 'Group by Party' else "account" + for gle in gl_entries: - gle_map.setdefault(gle.account, _dict(totals=get_totals_dict(), entries=[])) + gle_map.setdefault(gle.get(group_by), _dict(totals=get_totals_dict(), entries=[])) return gle_map def get_accountwise_gle(filters, gl_entries, gle_map): totals = get_totals_dict() entries = [] + group_by = 'party' if filters.get('group_by') == 'Group by Party' else "account" def update_value_in_dict(data, key, gle): data[key].debit += flt(gle.debit) @@ -240,21 +249,21 @@ def get_accountwise_gle(filters, gl_entries, gle_map): from_date, to_date = getdate(filters.from_date), getdate(filters.to_date) for gle in gl_entries: if gle.posting_date < from_date or cstr(gle.is_opening) == "Yes": - update_value_in_dict(gle_map[gle.account].totals, 'opening', gle) + update_value_in_dict(gle_map[gle.get(group_by)].totals, 'opening', gle) update_value_in_dict(totals, 'opening', gle) - update_value_in_dict(gle_map[gle.account].totals, 'closing', gle) + update_value_in_dict(gle_map[gle.get(group_by)].totals, 'closing', gle) update_value_in_dict(totals, 'closing', gle) elif gle.posting_date <= to_date: - update_value_in_dict(gle_map[gle.account].totals, 'total', gle) + update_value_in_dict(gle_map[gle.get(group_by)].totals, 'total', gle) update_value_in_dict(totals, 'total', gle) - if filters.get("group_by_account"): - gle_map[gle.account].entries.append(gle) + if filters.get("group_by") in ["Group by Account", "Group by Party"]: + gle_map[gle.get(group_by)].entries.append(gle) else: entries.append(gle) - update_value_in_dict(gle_map[gle.account].totals, 'closing', gle) + update_value_in_dict(gle_map[gle.get(group_by)].totals, 'closing', gle) update_value_in_dict(totals, 'closing', gle) return totals, entries From efff6e53deffd0e4b104e25b93550d94cfc6ea87 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 18 Apr 2018 10:52:07 +0530 Subject: [PATCH 013/154] Consolidated financial statement (#13678) * added fields to support treeview * tree file added, nestedset implemented * patch added to reload doc and configure lft rgt * Added consolidated financial statement report --- .../report/balance_sheet/balance_sheet.py | 17 +- .../accounts/report/cash_flow/cash_flow.py | 146 ++++--- .../__init__.py | 0 .../consolidated_financial_statement.js | 46 ++ .../consolidated_financial_statement.json | 35 ++ .../consolidated_financial_statement.py | 408 ++++++++++++++++++ .../profit_and_loss_statement.py | 16 +- erpnext/config/accounts.py | 6 + erpnext/patches.txt | 1 + .../patches/v11_0/rebuild_tree_for_company.py | 6 + erpnext/setup/doctype/company/company.json | 233 +++++++++- erpnext/setup/doctype/company/company.py | 39 +- erpnext/setup/doctype/company/company_tree.js | 33 ++ 13 files changed, 891 insertions(+), 95 deletions(-) create mode 100644 erpnext/accounts/report/consolidated_financial_statement/__init__.py create mode 100644 erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js create mode 100644 erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.json create mode 100644 erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py create mode 100644 erpnext/patches/v11_0/rebuild_tree_for_company.py create mode 100644 erpnext/setup/doctype/company/company_tree.js diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py index 97990fadca..c71ecf45f6 100644 --- a/erpnext/accounts/report/balance_sheet/balance_sheet.py +++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py @@ -58,7 +58,7 @@ def execute(filters=None): return columns, data, message, chart -def get_provisional_profit_loss(asset, liability, equity, period_list, company): +def get_provisional_profit_loss(asset, liability, equity, period_list, company, consolidated=False): provisional_profit_loss = {} total_row = {} if asset and (liability or equity): @@ -73,22 +73,23 @@ def get_provisional_profit_loss(asset, liability, equity, period_list, company): has_value = False for period in period_list: + key = period if consolidated else period.key effective_liability = 0.0 if liability: - effective_liability += flt(liability[-2].get(period.key)) + effective_liability += flt(liability[-2].get(key)) if equity: - effective_liability += flt(equity[-2].get(period.key)) + effective_liability += flt(equity[-2].get(key)) - provisional_profit_loss[period.key] = flt(asset[-2].get(period.key)) - effective_liability - total_row[period.key] = effective_liability + provisional_profit_loss[period.key] + provisional_profit_loss[key] = flt(asset[-2].get(key)) - effective_liability + total_row[key] = effective_liability + provisional_profit_loss[key] - if provisional_profit_loss[period.key]: + if provisional_profit_loss[key]: has_value = True - total += flt(provisional_profit_loss[period.key]) + total += flt(provisional_profit_loss[key]) provisional_profit_loss["total"] = total - total_row_total += flt(total_row[period.key]) + total_row_total += flt(total_row[key]) total_row["total"] = total_row_total if has_value: diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py index c81db38ebe..56de941c1b 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.py +++ b/erpnext/accounts/report/cash_flow/cash_flow.py @@ -18,6 +18,60 @@ def execute(filters=None): period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year, filters.periodicity, filters.accumulated_values, filters.company) + cash_flow_accounts = get_cash_flow_accounts() + + # compute net profit / loss + income = get_data(filters.company, "Income", "Credit", period_list, + accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True) + expense = get_data(filters.company, "Expense", "Debit", period_list, + accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True) + + net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company) + + data = [] + company_currency = frappe.db.get_value("Company", filters.company, "default_currency") + + for cash_flow_account in cash_flow_accounts: + section_data = [] + data.append({ + "account_name": cash_flow_account['section_header'], + "parent_account": None, + "indent": 0.0, + "account": cash_flow_account['section_header'] + }) + + if len(data) == 1: + # add first net income in operations section + if net_profit_loss: + net_profit_loss.update({ + "indent": 1, + "parent_account": cash_flow_accounts[0]['section_header'] + }) + data.append(net_profit_loss) + section_data.append(net_profit_loss) + + for account in cash_flow_account['account_types']: + account_data = get_account_type_based_data(filters.company, + account['account_type'], period_list, filters.accumulated_values) + account_data.update({ + "account_name": account['label'], + "account": account['label'], + "indent": 1, + "parent_account": cash_flow_account['section_header'], + "currency": company_currency + }) + data.append(account_data) + section_data.append(account_data) + + add_total_row_account(data, section_data, cash_flow_account['section_footer'], + period_list, company_currency) + + add_total_row_account(data, data, _("Net Change in Cash"), period_list, company_currency) + columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company) + + return columns, data + +def get_cash_flow_accounts(): operation_accounts = { "section_name": "Operations", "section_footer": _("Net Cash from Operations"), @@ -49,80 +103,17 @@ def execute(filters=None): } # combine all cash flow accounts for iteration - cash_flow_accounts = [operation_accounts, investing_accounts, financing_accounts] - - # compute net profit / loss - income = get_data(filters.company, "Income", "Credit", period_list, - accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True) - expense = get_data(filters.company, "Expense", "Debit", period_list, - accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True) - - net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company) - - data = [] - company_currency = frappe.db.get_value("Company", filters.company, "default_currency") - - for cash_flow_account in cash_flow_accounts: - section_data = [] - data.append({ - "account_name": cash_flow_account['section_header'], - "parent_account": None, - "indent": 0.0, - "account": cash_flow_account['section_header'] - }) - - if len(data) == 1: - # add first net income in operations section - if net_profit_loss: - net_profit_loss.update({ - "indent": 1, - "parent_account": operation_accounts['section_header'] - }) - data.append(net_profit_loss) - section_data.append(net_profit_loss) - - for account in cash_flow_account['account_types']: - account_data = get_account_type_based_data(filters.company, - account['account_type'], period_list, filters.accumulated_values) - account_data.update({ - "account_name": account['label'], - "account": account['label'], - "indent": 1, - "parent_account": cash_flow_account['section_header'], - "currency": company_currency - }) - data.append(account_data) - section_data.append(account_data) - - add_total_row_account(data, section_data, cash_flow_account['section_footer'], - period_list, company_currency) - - add_total_row_account(data, data, _("Net Change in Cash"), period_list, company_currency) - columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company) - - return columns, data - + return [operation_accounts, investing_accounts, financing_accounts] def get_account_type_based_data(company, account_type, period_list, accumulated_values): data = {} total = 0 for period in period_list: start_date = get_start_date(period, accumulated_values, company) - gl_sum = frappe.db.sql_list(""" - select sum(credit) - sum(debit) - from `tabGL Entry` - where company=%s and posting_date >= %s and posting_date <= %s - and voucher_type != 'Period Closing Voucher' - and account in ( SELECT name FROM tabAccount WHERE account_type = %s) - """, (company, start_date if accumulated_values else period['from_date'], - period['to_date'], account_type)) - if gl_sum and gl_sum[0]: - amount = gl_sum[0] - if account_type == "Depreciation": - amount *= -1 - else: - amount = 0 + amount = get_account_type_based_gl_data(company, start_date, period['to_date'], account_type) + if amount and account_type == "Depreciation": + amount *= -1 total += amount data.setdefault(period["key"], amount) @@ -130,16 +121,28 @@ def get_account_type_based_data(company, account_type, period_list, accumulated_ data["total"] = total return data +def get_account_type_based_gl_data(company, start_date, end_date, account_type): + gl_sum = frappe.db.sql_list(""" + select sum(credit) - sum(debit) + from `tabGL Entry` + where company=%s and posting_date >= %s and posting_date <= %s + and voucher_type != 'Period Closing Voucher' + and account in ( SELECT name FROM tabAccount WHERE account_type = %s) + """, (company, start_date, end_date, account_type)) + + return gl_sum[0] if gl_sum and gl_sum[0] else 0 def get_start_date(period, accumulated_values, company): + if not accumulated_values and period.get('from_date'): + return period['from_date'] + start_date = period["year_start_date"] if accumulated_values: start_date = get_fiscal_year(period.to_date, company=company)[1] return start_date - -def add_total_row_account(out, data, label, period_list, currency): +def add_total_row_account(out, data, label, period_list, currency, consolidated = False): total_row = { "account_name": "'" + _("{0}").format(label) + "'", "account": "'" + _("{0}").format(label) + "'", @@ -148,8 +151,9 @@ def add_total_row_account(out, data, label, period_list, currency): for row in data: if row.get("parent_account"): for period in period_list: - total_row.setdefault(period.key, 0.0) - total_row[period.key] += row.get(period.key, 0.0) + key = period if consolidated else period['key'] + total_row.setdefault(key, 0.0) + total_row[key] += row.get(key, 0.0) total_row.setdefault("total", 0.0) total_row["total"] += row["total"] diff --git a/erpnext/accounts/report/consolidated_financial_statement/__init__.py b/erpnext/accounts/report/consolidated_financial_statement/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js new file mode 100644 index 0000000000..63f263f56d --- /dev/null +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js @@ -0,0 +1,46 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Consolidated Financial Statement"] = { + "filters": [ + { + "fieldname":"company", + "label": __("Company"), + "fieldtype": "Link", + "options": "Company", + "default": frappe.defaults.get_user_default("Company"), + "reqd": 1 + }, + { + "fieldname":"from_fiscal_year", + "label": __("Start Year"), + "fieldtype": "Link", + "options": "Fiscal Year", + "default": frappe.defaults.get_user_default("fiscal_year"), + "reqd": 1 + }, + { + "fieldname":"to_fiscal_year", + "label": __("End Year"), + "fieldtype": "Link", + "options": "Fiscal Year", + "default": frappe.defaults.get_user_default("fiscal_year"), + "reqd": 1 + }, + { + "fieldname":"report", + "label": __("Report"), + "fieldtype": "Select", + "options": ["Profit and Loss Statement", "Balance Sheet", "Cash Flow"], + "default": "Balance Sheet", + "reqd": 1 + }, + { + "fieldname":"accumulated_in_group_company", + "label": __("Accumulated Values in Group Company"), + "fieldtype": "Check", + "default": 0 + }, + ] +} diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.json b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.json new file mode 100644 index 0000000000..e03f1aff44 --- /dev/null +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.json @@ -0,0 +1,35 @@ +{ + "add_total_row": 0, + "creation": "2018-04-14 16:01:07.919565", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "Test AEF", + "modified": "2018-04-14 16:01:07.919565", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Consolidated Financial Statement", + "owner": "Administrator", + "ref_doctype": "Account", + "report_name": "Consolidated Financial Statement", + "report_type": "Script Report", + "roles": [ + { + "role": "Accounts User" + }, + { + "role": "Auditor" + }, + { + "role": "Sales User" + }, + { + "role": "Purchase User" + }, + { + "role": "Accounts Manager" + } + ] +} \ No newline at end of file diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py new file mode 100644 index 0000000000..ec2de2b6ec --- /dev/null +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -0,0 +1,408 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import flt, cint +from erpnext.accounts.report.financial_statements import get_fiscal_year_data, sort_accounts +from erpnext.accounts.report.balance_sheet.balance_sheet import (get_provisional_profit_loss, + check_opening_balance, get_chart_data) +from erpnext.accounts.report.profit_and_loss_statement.profit_and_loss_statement import (get_net_profit_loss, + get_chart_data as get_pl_chart_data) +from erpnext.accounts.report.cash_flow.cash_flow import (get_cash_flow_accounts, get_account_type_based_gl_data, + add_total_row_account) + +def execute(filters=None): + columns, data, message, chart = [], [], [], [] + fiscal_year = get_fiscal_year_data(filters.get('from_fiscal_year'), filters.get('to_fiscal_year')) + companies_column, companies = get_companies(filters) + columns = get_columns(companies_column) + + if filters.get('report') == "Balance Sheet": + data, message, chart = get_balance_sheet_data(fiscal_year, companies, columns, filters) + elif filters.get('report') == "Profit and Loss Statement": + data, message, chart = get_profit_loss_data(fiscal_year, companies, columns, filters) + else: + if cint(frappe.db.get_single_value('Accounts Settings', 'use_custom_cash_flow')): + from erpnext.accounts.report.cash_flow.custom_cash_flow import execute as execute_custom + return execute_custom(filters=filters) + + data = get_cash_flow_data(fiscal_year, companies, filters) + + return columns, data, message, chart + +def get_balance_sheet_data(fiscal_year, companies, columns, filters): + asset = get_data(companies, "Asset", "Debit", fiscal_year, filters=filters) + + liability = get_data(companies, "Liability", "Credit", fiscal_year, filters=filters) + + equity = get_data(companies, "Equity", "Credit", fiscal_year, filters=filters) + + data = [] + data.extend(asset or []) + data.extend(liability or []) + data.extend(equity or []) + + provisional_profit_loss, total_credit = get_provisional_profit_loss(asset, liability, equity, + companies, filters.get('company'), True) + + message, opening_balance = check_opening_balance(asset, liability, equity) + + if opening_balance and round(opening_balance,2) !=0: + unclosed ={ + "account_name": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'", + "account": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'", + "warn_if_negative": True, + "currency": frappe.db.get_value("Company", filters.company, "default_currency") + } + for company in companies: + unclosed[company] = opening_balance + if provisional_profit_loss: + provisional_profit_loss[company] = provisional_profit_loss[company] - opening_balance + + unclosed["total"]=opening_balance + data.append(unclosed) + + if provisional_profit_loss: + data.append(provisional_profit_loss) + if total_credit: + data.append(total_credit) + + chart = get_chart_data(filters, columns, asset, liability, equity) + + return data, message, chart + +def get_profit_loss_data(fiscal_year, companies, columns, filters): + income, expense, net_profit_loss = get_income_expense_data(companies, fiscal_year, filters) + + data = [] + data.extend(income or []) + data.extend(expense or []) + if net_profit_loss: + data.append(net_profit_loss) + + chart = get_pl_chart_data(filters, columns, income, expense, net_profit_loss) + + return data, None, chart + +def get_income_expense_data(companies, fiscal_year, filters): + income = get_data(companies, "Income", "Credit", fiscal_year, filters, True) + + expense = get_data(companies, "Expense", "Debit", fiscal_year, filters, True) + + net_profit_loss = get_net_profit_loss(income, expense, companies, filters.company, True) + + return income, expense, net_profit_loss + +def get_cash_flow_data(fiscal_year, companies, filters): + cash_flow_accounts = get_cash_flow_accounts() + + income, expense, net_profit_loss = get_income_expense_data(companies, fiscal_year, filters) + + data = [] + company_currency = frappe.db.get_value("Company", filters.company, "default_currency") + + for cash_flow_account in cash_flow_accounts: + section_data = [] + data.append({ + "account_name": cash_flow_account['section_header'], + "parent_account": None, + "indent": 0.0, + "account": cash_flow_account['section_header'] + }) + + if len(data) == 1: + # add first net income in operations section + if net_profit_loss: + net_profit_loss.update({ + "indent": 1, + "parent_account": cash_flow_accounts[0]['section_header'] + }) + data.append(net_profit_loss) + section_data.append(net_profit_loss) + + for account in cash_flow_account['account_types']: + account_data = get_account_type_based_data(account['account_type'], companies, fiscal_year) + account_data.update({ + "account_name": account['label'], + "account": account['label'], + "indent": 1, + "parent_account": cash_flow_account['section_header'], + "currency": company_currency + }) + data.append(account_data) + section_data.append(account_data) + + add_total_row_account(data, section_data, cash_flow_account['section_footer'], + companies, company_currency, True) + + add_total_row_account(data, data, _("Net Change in Cash"), companies, company_currency, True) + + return data + +def get_account_type_based_data(account_type, companies, fiscal_year): + data = {} + total = 0 + for company in companies: + amount = get_account_type_based_gl_data(company, + fiscal_year.year_start_date, fiscal_year.year_end_date, account_type) + + if amount and account_type == "Depreciation": + amount *= -1 + + total += amount + data.setdefault(company, amount) + + data["total"] = total + return data + +def get_columns(companies): + columns = [{ + "fieldname": "account", + "label": _("Account"), + "fieldtype": "Link", + "options": "Account", + "width": 300 + }] + + columns.append({ + "fieldname": "currency", + "label": _("Currency"), + "fieldtype": "Link", + "options": "Currency", + "hidden": 1 + }) + + for company in companies: + columns.append({ + "fieldname": company, + "label": company, + "fieldtype": "Currency", + "width": 150 + }) + + return columns + +def get_data(companies, root_type, balance_must_be, fiscal_year, filters=None, ignore_closing_entries=False): + accounts, accounts_by_name = get_account_heads(root_type, + companies, filters) + + company_currency = get_company_currency(filters) + + gl_entries_by_account = {} + for root in frappe.db.sql("""select lft, rgt from tabAccount + where root_type=%s and ifnull(parent_account, '') = ''""", root_type, as_dict=1): + + set_gl_entries_by_account(fiscal_year.year_start_date, + fiscal_year.year_end_date, root.lft, root.rgt, filters, + gl_entries_by_account, accounts_by_name, ignore_closing_entries=False) + + calculate_values(accounts_by_name, gl_entries_by_account, companies, fiscal_year, filters) + accumulate_values_into_parents(accounts, accounts_by_name, companies) + out = prepare_data(accounts, fiscal_year, balance_must_be, companies, company_currency) + + if out: + add_total_row(out, root_type, balance_must_be, companies, company_currency) + + return out + +def get_company_currency(filters=None): + return frappe.db.get_value("Company", filters.get('company'), "default_currency") + +def calculate_values(accounts_by_name, gl_entries_by_account, companies, fiscal_year, filters): + for entries in gl_entries_by_account.values(): + for entry in entries: + key = entry.account_number or entry.account_name + d = accounts_by_name.get(key) + if d: + for company in companies: + # check if posting date is within the period + if (entry.company == company or (filters.get('accumulated_in_group_company')) + and entry.company in companies.get(company)): + d[company] = d.get(company, 0.0) + flt(entry.debit) - flt(entry.credit) + + if entry.posting_date < fiscal_year.year_start_date: + d["opening_balance"] = d.get("opening_balance", 0.0) + flt(entry.debit) - flt(entry.credit) + +def accumulate_values_into_parents(accounts, accounts_by_name, companies): + """accumulate children's values in parent accounts""" + for d in reversed(accounts): + if d.parent_account: + account = d.parent_account.split('-')[0].strip() + for company in companies: + accounts_by_name[account][company] = \ + accounts_by_name[account].get(company, 0.0) + d.get(company, 0.0) + + accounts_by_name[account]["opening_balance"] = \ + accounts_by_name[account].get("opening_balance", 0.0) + d.get("opening_balance", 0.0) + +def get_account_heads(root_type, companies, filters): + accounts = get_accounts(root_type, filters) + + if not accounts: + return None + + accounts, accounts_by_name, parent_children_map = filter_accounts(accounts) + + return accounts, accounts_by_name + +def get_companies(filters): + companies = {} + all_companies = get_subsidiary_companies(filters.get('company')) + companies.setdefault(filters.get('company'), all_companies) + + for d in all_companies: + if d not in companies: + subsidiary_companies = get_subsidiary_companies(d) + companies.setdefault(d, subsidiary_companies) + + return all_companies, companies + +def get_subsidiary_companies(company): + lft, rgt = frappe.db.get_value('Company', + company, ["lft", "rgt"]) + + return frappe.db.sql_list("""select name from `tabCompany` + where lft >= {0} and rgt <= {1}""".format(lft, rgt)) + +def get_accounts(root_type, filters): + return frappe.db.sql(""" select name, is_group, company, + parent_account, lft, rgt, root_type, report_type, account_name, account_number + from + `tabAccount` where company = %s and root_type = %s + """ , (filters.get('company'), root_type), as_dict=1) + +def prepare_data(accounts, fiscal_year, balance_must_be, companies, company_currency): + data = [] + year_start_date = fiscal_year.year_start_date + year_end_date = fiscal_year.year_end_date + + for d in accounts: + # add to output + has_value = False + total = 0 + row = frappe._dict({ + "account_name": _(d.account_name), + "account": _(d.account_name), + "parent_account": _(d.parent_account), + "indent": flt(d.indent), + "year_start_date": year_start_date, + "year_end_date": year_end_date, + "currency": company_currency, + "opening_balance": d.get("opening_balance", 0.0) * (1 if balance_must_be == "Debit" else -1) + }) + for company in companies: + if d.get(company) and balance_must_be == "Credit": + # change sign based on Debit or Credit, since calculation is done using (debit - credit) + d[company] *= -1 + + row[company] = flt(d.get(company, 0.0), 3) + + if abs(row[company]) >= 0.005: + # ignore zero values + has_value = True + total += flt(row[company]) + + row["has_value"] = has_value + row["total"] = total + data.append(row) + + return data + +def set_gl_entries_by_account(from_date, to_date, root_lft, root_rgt, filters, gl_entries_by_account, + accounts_by_name, ignore_closing_entries=False): + """Returns a dict like { "account": [gl entries], ... }""" + + company_lft, company_rgt = frappe.db.get_value('Company', + filters.get('company'), ["lft", "rgt"]) + + additional_conditions = get_additional_conditions(from_date, ignore_closing_entries) + + gl_entries = frappe.db.sql("""select gl.posting_date, gl.account, gl.debit, gl.credit, gl.is_opening, gl.company, + gl.fiscal_year, gl.debit_in_account_currency, gl.credit_in_account_currency, gl.account_currency, + acc.account_name, acc.account_number + from `tabGL Entry` gl, `tabAccount` acc where acc.name = gl.account and gl.company in + (select name from `tabCompany` where lft >= %(company_lft)s and rgt <= %(company_rgt)s) + {additional_conditions} and gl.posting_date <= %(to_date)s and acc.lft >= %(lft)s and acc.rgt <= %(rgt)s + order by gl.account, gl.posting_date""".format(additional_conditions=additional_conditions), + { + "from_date": from_date, + "to_date": to_date, + "lft": root_lft, + "rgt": root_rgt, + "company_lft": company_lft, + "company_rgt": company_rgt, + }, + as_dict=True) + + for entry in gl_entries: + key = entry.account_number or entry.account_name + validate_entries(key, entry, accounts_by_name) + gl_entries_by_account.setdefault(key, []).append(entry) + + return gl_entries_by_account + +def validate_entries(key, entry, accounts_by_name): + if key not in accounts_by_name: + field = "Account number" if entry.account_number else "Account name" + frappe.throw(_("{0} {1} is not present in the parent company").format(field, key)) + +def get_additional_conditions(from_date, ignore_closing_entries): + additional_conditions = [] + + if ignore_closing_entries: + additional_conditions.append("ifnull(gl.voucher_type, '')!='Period Closing Voucher'") + + if from_date: + additional_conditions.append("gl.posting_date >= %(from_date)s") + + return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else "" + +def add_total_row(out, root_type, balance_must_be, companies, company_currency): + total_row = { + "account_name": "'" + _("Total {0} ({1})").format(_(root_type), _(balance_must_be)) + "'", + "account": "'" + _("Total {0} ({1})").format(_(root_type), _(balance_must_be)) + "'", + "currency": company_currency + } + + for row in out: + if not row.get("parent_account"): + for company in companies: + total_row.setdefault(company, 0.0) + total_row[company] += row.get(company, 0.0) + row[company] = 0.0 + + total_row.setdefault("total", 0.0) + total_row["total"] += flt(row["total"]) + row["total"] = "" + + if "total" in total_row: + out.append(total_row) + + # blank row after Total + out.append({}) + +def filter_accounts(accounts, depth=10): + parent_children_map = {} + accounts_by_name = {} + for d in accounts: + key = d.account_number or d.account_name + accounts_by_name[key] = d + parent_children_map.setdefault(d.parent_account or None, []).append(d) + + filtered_accounts = [] + + def add_to_list(parent, level): + if level < depth: + children = parent_children_map.get(parent) or [] + sort_accounts(children, is_root=True if parent==None else False) + + for child in children: + child.indent = level + filtered_accounts.append(child) + add_to_list(child.name, level + 1) + + add_to_list(None, 0) + + return filtered_accounts, accounts_by_name, parent_children_map diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py index c8d9857d54..249d9d301c 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py @@ -33,7 +33,11 @@ def execute(filters=None): return columns, data, None, chart +<<<<<<< HEAD def get_net_profit_loss(income, expense, period_list, company, currency=None): +======= +def get_net_profit_loss(income, expense, period_list, company, consolidated=False): +>>>>>>> Consolidated financial statement (#13678) total = 0 net_profit_loss = { "account_name": "'" + _("Profit for the year") + "'", @@ -45,21 +49,21 @@ def get_net_profit_loss(income, expense, period_list, company, currency=None): has_value = False for period in period_list: - total_income = flt(income[-2][period.key], 3) if income else 0 - total_expense = flt(expense[-2][period.key], 3) if expense else 0 + key = period if consolidated else period.key + total_income = flt(income[-2][key], 3) if income else 0 + total_expense = flt(expense[-2][key], 3) if expense else 0 - net_profit_loss[period.key] = total_income - total_expense + net_profit_loss[key] = total_income - total_expense - if net_profit_loss[period.key]: + if net_profit_loss[key]: has_value=True - total += flt(net_profit_loss[period.key]) + total += flt(net_profit_loss[key]) net_profit_loss["total"] = total if has_value: return net_profit_loss - def get_chart_data(filters, columns, income, expense, net_profit_loss): labels = [d.get("label") for d in columns[2:]] diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py index 088a119678..6c7c298bd9 100644 --- a/erpnext/config/accounts.py +++ b/erpnext/config/accounts.py @@ -128,6 +128,12 @@ def get_data(): "doctype": "GL Entry", "is_query_report": True }, + { + "type": "report", + "name": "Consolidated Financial Statement", + "doctype": "GL Entry", + "is_query_report": True + }, ] }, { diff --git a/erpnext/patches.txt b/erpnext/patches.txt index f2dd923b43..3fffade9bb 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -526,3 +526,4 @@ erpnext.patches.v10_0.taxes_issue_with_pos erpnext.patches.v11_0.rename_field_max_days_allowed erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance +erpnext.patches.v11_0.rebuild_tree_for_company diff --git a/erpnext/patches/v11_0/rebuild_tree_for_company.py b/erpnext/patches/v11_0/rebuild_tree_for_company.py new file mode 100644 index 0000000000..0fc4780a30 --- /dev/null +++ b/erpnext/patches/v11_0/rebuild_tree_for_company.py @@ -0,0 +1,6 @@ +import frappe +from frappe.utils.nestedset import rebuild_tree + +def execute(): + frappe.reload_doc("setup", "doctype", "company") + rebuild_tree('Company', 'parent_company') diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 31e18593e2..eb861d5a03 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -42,6 +42,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -105,6 +107,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -135,6 +138,38 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "is_group", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Is Group", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -163,6 +198,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +229,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "parent_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Parent Comapny", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -223,6 +292,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -253,6 +323,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -284,6 +355,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -313,6 +385,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -344,6 +417,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -373,6 +447,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -404,6 +479,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -435,6 +511,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -465,6 +542,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -495,6 +573,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -524,6 +603,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -554,6 +634,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -585,6 +666,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -617,6 +699,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -649,6 +732,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -679,6 +763,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -709,6 +794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -742,6 +828,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -773,6 +860,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -806,6 +894,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -837,6 +926,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -868,6 +958,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -899,6 +990,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -928,6 +1020,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -962,6 +1055,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -993,6 +1087,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1024,6 +1119,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1055,6 +1151,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1087,6 +1184,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1118,6 +1216,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1147,6 +1246,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1178,6 +1278,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1207,6 +1308,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1240,6 +1342,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1272,6 +1375,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1302,6 +1406,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1333,6 +1438,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1364,6 +1470,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1394,6 +1501,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1423,6 +1531,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1453,6 +1562,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1483,6 +1593,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1513,6 +1624,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1544,6 +1656,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1575,6 +1688,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1605,6 +1719,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1634,6 +1749,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1665,6 +1781,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1696,6 +1813,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1726,6 +1844,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1755,6 +1874,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1784,6 +1904,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1817,6 +1938,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1849,6 +1971,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1881,6 +2004,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1912,6 +2036,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1943,6 +2068,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1976,6 +2102,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2006,6 +2133,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2036,6 +2164,100 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lft", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rgt", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "old_parent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -2052,15 +2274,14 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-02-14 15:54:26.776363", - "modified_by": "achilles@erpnext.com", + "modified": "2018-04-09 01:54:56.828976", + "modified_by": "Administrator", "module": "Setup", "name": "Company", "owner": "Administrator", "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -2080,7 +2301,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2100,7 +2320,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2120,7 +2339,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2140,7 +2358,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2160,7 +2377,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2180,7 +2396,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index cdcb0591c7..236f0b86d9 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -11,8 +11,11 @@ from frappe.cache_manager import clear_defaults_cache from frappe.model.document import Document from frappe.contacts.address_and_contact import load_address_and_contact +from frappe.utils.nestedset import NestedSet + +class Company(NestedSet): + nsm_parent_field = 'parent_company' -class Company(Document): def onload(self): load_address_and_contact(self, "company") self.get("__onload")["transactions_exist"] = self.check_if_transactions_exist() @@ -78,6 +81,7 @@ class Company(Document): frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.")) def on_update(self): + self.update_nsm_model() if not frappe.db.sql("""select name from tabAccount where company=%s and docstatus<2 limit 1""", self.name): if not frappe.local.flags.ignore_chart_of_accounts: @@ -245,10 +249,14 @@ class Company(Document): def abbreviate(self): self.abbr = ''.join([c[0].upper() for c in self.company_name.split()]) + def update_nsm_model(self): + frappe.utils.nestedset.update_nsm(self) + def on_trash(self): """ Trash accounts and cost centers for this company if no gl entry exists """ + self.update_nsm_model() accounts = frappe.db.sql_list("select name from tabAccount where company=%s", self.name) cost_centers = frappe.db.sql_list("select name from `tabCost Center` where company=%s", self.name) warehouses = frappe.db.sql_list("select name from tabWarehouse where company=%s", self.name) @@ -387,3 +395,32 @@ def cache_companies_monthly_sales_history(): for company in companies: update_company_monthly_sales(company) frappe.db.commit() + +@frappe.whitelist() +def get_children(doctype, parent=None, company=None, is_root=False): + if parent == None or parent == "All Companies": + parent = "" + + return frappe.db.sql(""" + select + name as value, + is_group as expandable + from + `tab{doctype}` comp + where + ifnull(parent_company, "")="{parent}" + """.format( + doctype = frappe.db.escape(doctype), + parent=frappe.db.escape(parent) + ), as_dict=1) + +@frappe.whitelist() +def add_node(): + from frappe.desk.treeview import make_tree_args + args = frappe.form_dict + args = make_tree_args(**args) + + if args.parent_company == 'All Companies': + args.parent_company = None + + frappe.get_doc(args).insert() diff --git a/erpnext/setup/doctype/company/company_tree.js b/erpnext/setup/doctype/company/company_tree.js new file mode 100644 index 0000000000..19b276c77d --- /dev/null +++ b/erpnext/setup/doctype/company/company_tree.js @@ -0,0 +1,33 @@ +frappe.treeview_settings["Company"] = { + ignore_fields:["parent_company"], + get_tree_nodes: 'erpnext.setup.doctype.company.company.get_children', + add_tree_node: 'erpnext.setup.doctype.company.company.add_node', + filters: [ + { + fieldname: "company", + fieldtype:"Link", + options: "Company", + label: __("Company"), + get_query: function() { + return { + filters: [["Company", 'is_group', '=', 1]] + }; + } + }, + ], + breadcrumb: "Setup", + root_label: "All Companies", + get_tree_root: false, + menu_items: [ + { + label: __("New Company"), + action: function() { + frappe.new_doc("Company", true); + }, + condition: 'frappe.boot.user.can_create.indexOf("Company") !== -1' + } + ], + onload: function(treeview) { + treeview.make_tree(); + } +}; \ No newline at end of file From 2215d4c593983b3ed4a52af66fb3b6d9ca561cd8 Mon Sep 17 00:00:00 2001 From: Pawan Mehta Date: Wed, 18 Apr 2018 10:59:59 +0530 Subject: [PATCH 014/154] Shift Management (#13667) * [fix] #13634 * review_changes * rename function * rename function --- erpnext/config/hr.py | 4 - .../shift_assignment/shift_assignment.json | 42 +++++++- .../shift_assignment/shift_assignment.py | 72 +++++++++++++- .../shift_assignment_calendar.js | 19 ++++ .../doctype/shift_request/shift_request.json | 98 ++++++++++++------- .../hr/doctype/shift_request/shift_request.py | 79 ++++++++++++++- erpnext/hr/doctype/shift_type/shift_type.py | 2 +- 7 files changed, 270 insertions(+), 46 deletions(-) create mode 100644 erpnext/hr/doctype/shift_assignment/shift_assignment_calendar.js diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index 9a8298120a..fb00529c16 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -263,10 +263,6 @@ def get_data(): { "type": "doctype", "name": "Shift Assignment", - }, - { - "type": "doctype", - "name": "Shift Assignment Tool", } ] }, diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json index 87d69e4816..897cfed68a 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.json +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -1,7 +1,7 @@ { "allow_copy": 0, "allow_guest_to_view": 0, - "allow_import": 0, + "allow_import": 1, "allow_rename": 0, "autoname": "SH.#####", "beta": 0, @@ -26,7 +26,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, "label": "Employee", "length": 0, @@ -183,7 +183,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, "label": "Company", "length": 0, @@ -215,7 +215,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Date", "length": 0, @@ -233,6 +233,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_request", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Shift Request", + "length": 0, + "no_copy": 0, + "options": "Shift Request", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -275,7 +307,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 15:42:12.617715", + "modified": "2018-04-17 14:50:09.125737", "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.py b/erpnext/hr/doctype/shift_assignment/shift_assignment.py index 272dd2b32d..fbbfe3102a 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.py +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.py @@ -4,7 +4,77 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document +from frappe.utils import cint, cstr, date_diff, flt, formatdate, getdate + +class OverlapError(frappe.ValidationError): pass class ShiftAssignment(Document): - pass + def validate(self): + self.validate_overlapping_dates(); + + def validate_overlapping_dates(self): + if not self.name: + self.name = "New Shift Assignment" + + d = frappe.db.sql(""" + select + name, shift_type, date + from `tabShift Assignment` + where employee = %(employee)s and docstatus < 2 + and date = %(date)s + and name != %(name)s""", { + "employee": self.employee, + "shift_type": self.shift_type, + "date": self.date, + "name": self.name + }, as_dict = 1) + + for date_overlap in d: + if date_overlap['name']: + self.throw_overlap_error(date_overlap) + + def throw_overlap_error(self, d): + msg = _("Employee {0} has already applied for {1} on {2} : ").format(self.employee, + d['shift_type'], formatdate(d['date'])) \ + + """ {0}""".format(d["name"]) + frappe.throw(msg, OverlapError) + +@frappe.whitelist() +def get_events(start, end, filters=None): + events = [] + + employee = frappe.db.get_value("Employee", {"user_id": frappe.session.user}, ["name", "company"], + as_dict=True) + if employee: + employee, company = employee.name, employee.company + else: + employee='' + company=frappe.db.get_value("Global Defaults", None, "default_company") + + from frappe.desk.reportview import get_filters_cond + conditions = get_filters_cond("Shift Assignment", filters, []) + add_assignments(events, start, end, conditions=conditions) + return events + +def add_assignments(events, start, end, conditions=None): + query = """select name, date, employee_name, + employee, docstatus + from `tabShift Assignment` where + date <= %(date)s + and docstatus < 2""" + if conditions: + query += conditions + + for d in frappe.db.sql(query, {"date":start, "date":end}, as_dict=True): + e = { + "name": d.name, + "doctype": "Shift Assignment", + "date": d.date, + "title": cstr(d.employee_name) + \ + cstr(d.shift_type), + "docstatus": d.docstatus + } + if e not in events: + events.append(e) \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment_calendar.js b/erpnext/hr/doctype/shift_assignment/shift_assignment_calendar.js new file mode 100644 index 0000000000..c2c9bc073a --- /dev/null +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment_calendar.js @@ -0,0 +1,19 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.views.calendar["Shift Assignment"] = { + field_map: { + "start": "date", + "end": "date", + "id": "name", + "docstatus": 1 + }, + options: { + header: { + left: 'prev,next today', + center: 'title', + right: 'month' + } + }, + get_events_method: "erpnext.hr.doctype.shift_assignment.shift_assignment.get_events" +} \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_request/shift_request.json b/erpnext/hr/doctype/shift_request/shift_request.json index 1210d157dc..04a3edf706 100644 --- a/erpnext/hr/doctype/shift_request/shift_request.json +++ b/erpnext/hr/doctype/shift_request/shift_request.json @@ -1,7 +1,7 @@ { "allow_copy": 0, "allow_guest_to_view": 0, - "allow_import": 0, + "allow_import": 1, "allow_rename": 0, "autoname": "SREQ.#####", "beta": 0, @@ -13,6 +13,38 @@ "editable_grid": 1, "engine": "InnoDB", "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shift_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Shift Type", + "length": 0, + "no_copy": 0, + "options": "Shift Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -77,6 +109,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -109,38 +171,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "shift_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Shift Type", - "length": 0, - "no_copy": 0, - "options": "Shift Type", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -245,7 +275,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 15:40:39.590051", + "modified": "2018-04-16 11:01:25.902995", "modified_by": "Administrator", "module": "HR", "name": "Shift Request", diff --git a/erpnext/hr/doctype/shift_request/shift_request.py b/erpnext/hr/doctype/shift_request/shift_request.py index e6755ae44e..7057d20d73 100644 --- a/erpnext/hr/doctype/shift_request/shift_request.py +++ b/erpnext/hr/doctype/shift_request/shift_request.py @@ -4,7 +4,84 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document +from frappe.utils import formatdate, getdate + +class OverlapError(frappe.ValidationError): pass class ShiftRequest(Document): - pass + def validate(self): + self.validate_dates(); + self.validate_shift_request_overlap_dates(); + + def on_submit(self): + date_list = self.get_working_days(self.from_date, self.to_date) + for date in date_list: + assignment_doc = frappe.new_doc("Shift Assignment") + assignment_doc.company = self.company + assignment_doc.shift_type = self.shift_type + assignment_doc.employee = self.employee + assignment_doc.date = date + assignment_doc.shift_request = self.name + assignment_doc.insert() + assignment_doc.submit() + + def validate_dates(self): + if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)): + frappe.throw(_("To date cannot be before from date")) + + def validate_shift_request_overlap_dates(self): + if not self.name: + self.name = "New Shift Request" + + d = frappe.db.sql(""" + select + name, shift_type, from_date, to_date + from `tabShift Request` + where employee = %(employee)s and docstatus < 2 + and ((%(from_date)s >= from_date + and %(from_date)s <= to_date) or + ( %(to_date)s >= from_date + and %(to_date)s <= to_date )) + and name != %(name)s""", { + "employee": self.employee, + "shift_type": self.shift_type, + "from_date": self.from_date, + "to_date": self.to_date, + "name": self.name + }, as_dict=1) + + for date_overlap in d: + if date_overlap ['name']: + self.throw_overlap_error(date_overlap) + + def throw_overlap_error(self, d): + msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(self.employee, + d['shift_type'], formatdate(d['from_date']), formatdate(d['to_date'])) \ + + """ {0}""".format(d["name"]) + frappe.throw(msg, OverlapError) + + def get_working_days(self, start_date, end_date): + start_date, end_date = getdate(start_date), getdate(end_date) + + from datetime import timedelta + + date_list = [] + employee_holiday_list = [] + + employee_holidays = frappe.db.sql("""select holiday_date from `tabHoliday` + where parent in (select holiday_list from `tabEmployee` + where name = %s)""",self.employee,as_dict=1) + + for d in employee_holidays: + employee_holiday_list.append(d.holiday_date) + + reference_date = start_date + + while reference_date <= end_date: + if reference_date not in employee_holiday_list: + date_list.append(reference_date) + reference_date += timedelta(days=1) + + return date_list \ No newline at end of file diff --git a/erpnext/hr/doctype/shift_type/shift_type.py b/erpnext/hr/doctype/shift_type/shift_type.py index 6721439ce6..88ae243dda 100644 --- a/erpnext/hr/doctype/shift_type/shift_type.py +++ b/erpnext/hr/doctype/shift_type/shift_type.py @@ -7,4 +7,4 @@ import frappe from frappe.model.document import Document class ShiftType(Document): - pass + pass \ No newline at end of file From ee09408dccd3a0386da0b4e32bf20c7210202eb9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Apr 2018 11:52:12 +0530 Subject: [PATCH 015/154] Minor fixes --- erpnext/setup/doctype/company/company.json | 4553 ++++++++++---------- erpnext/setup/doctype/company/company.py | 4 +- 2 files changed, 2294 insertions(+), 2263 deletions(-) diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index eb861d5a03..e9976f7493 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -1,2424 +1,2455 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "field:company_name", - "beta": 0, - "creation": "2013-04-10 08:35:39", - "custom": 0, - "description": "Legal Entity / Subsidiary with a separate Chart of Accounts belonging to the Organization.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, - "engine": "InnoDB", + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "field:company_name", + "beta": 0, + "creation": "2013-04-10 08:35:39", + "custom": 0, + "description": "Legal Entity / Subsidiary with a separate Chart of Accounts belonging to the Organization.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 0, + "engine": "InnoDB", "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "details", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "abbr", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Abbr", - "length": 0, - "no_copy": 0, - "oldfieldname": "abbr", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "abbr", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Abbr", + "length": 0, + "no_copy": 0, + "oldfieldname": "abbr", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal && in_list(frappe.user_roles, \"System Manager\")", - "fieldname": "change_abbr", - "fieldtype": "Button", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Change Abbreviation", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal && in_list(frappe.user_roles, \"System Manager\")", + "fieldname": "change_abbr", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Change Abbreviation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "is_group", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "is_group", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Group", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cb0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cb0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "domain", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Domain", - "length": 0, - "no_copy": 0, - "options": "Domain", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "domain", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Domain", + "length": 0, + "no_copy": 0, + "options": "Domain", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "parent_company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Parent Comapny", - "length": 0, - "no_copy": 0, - "options": "Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "parent_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Parent Comapny", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "sales_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Sales", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "sales_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Sales", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "sales_monthly_history", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Sales Monthly History", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "sales_monthly_history", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Sales Monthly History", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "monthly_sales_target", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Monthly Sales Target", - "length": 0, - "no_copy": 0, - "options": "default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "monthly_sales_target", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Monthly Sales Target", + "length": 0, + "no_copy": 0, + "options": "default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_goals", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_goals", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "total_monthly_sales", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Total Monthly Sales", - "length": 0, - "no_copy": 1, - "options": "default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_monthly_sales", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Monthly Sales", + "length": 0, + "no_copy": 1, + "options": "default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "charts_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Values", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "charts_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Values", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_letter_head", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Letter Head", - "length": 0, - "no_copy": 0, - "options": "Letter Head", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_letter_head", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Letter Head", + "length": 0, + "no_copy": 0, + "options": "Letter Head", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_holiday_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Holiday List", - "length": 0, - "no_copy": 0, - "options": "Holiday List", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_holiday_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Holiday List", + "length": 0, + "no_copy": 0, + "options": "Holiday List", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_terms", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Terms", - "length": 0, - "no_copy": 0, - "options": "Terms and Conditions", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_terms", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Terms", + "length": 0, + "no_copy": 0, + "options": "Terms and Conditions", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_10", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "country", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Country", - "length": 0, - "no_copy": 0, - "options": "Country", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "country", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Country", + "length": 0, + "no_copy": 0, + "options": "Country", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "create_chart_of_accounts_based_on", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Create Chart Of Accounts Based On", - "length": 0, - "no_copy": 0, - "options": "\nStandard Template\nExisting Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "create_chart_of_accounts_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Create Chart Of Accounts Based On", + "length": 0, + "no_copy": 0, + "options": "\nStandard Template\nExisting Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.create_chart_of_accounts_based_on===\"Standard Template\"", - "fieldname": "chart_of_accounts", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Chart Of Accounts Template", - "length": 0, - "no_copy": 1, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.create_chart_of_accounts_based_on===\"Standard Template\"", + "fieldname": "chart_of_accounts", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Chart Of Accounts Template", + "length": 0, + "no_copy": 1, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.create_chart_of_accounts_based_on===\"Existing Company\"", - "fieldname": "existing_company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Existing Company ", - "length": 0, - "no_copy": 1, - "options": "Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.create_chart_of_accounts_based_on===\"Existing Company\"", + "fieldname": "existing_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Existing Company ", + "length": 0, + "no_copy": 1, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "tax_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Tax ID", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_id", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Tax ID", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Accounts Settings", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date_of_establishment", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date of Establishment", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_bank_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Bank Account", - "length": 0, - "no_copy": 1, - "oldfieldname": "default_bank_account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Accounts Settings", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_cash_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Cash Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_bank_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Bank Account", + "length": 0, + "no_copy": 1, + "oldfieldname": "default_bank_account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_receivable_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Receivable Account", - "length": 0, - "no_copy": 1, - "oldfieldname": "receivables_group", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_cash_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Cash Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "round_off_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Round Off Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_receivable_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Receivable Account", + "length": 0, + "no_copy": 1, + "oldfieldname": "receivables_group", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "write_off_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Write Off Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "round_off_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Round Off Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "exchange_gain_loss_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Exchange Gain / Loss Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "write_off_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Write Off Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "exchange_gain_loss_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Exchange Gain / Loss Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_payable_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Payable Account", - "length": 0, - "no_copy": 1, - "oldfieldname": "payables_group", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_payable_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Payable Account", + "length": 0, + "no_copy": 1, + "oldfieldname": "payables_group", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_employee_advance_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Employee Advance Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_employee_advance_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Employee Advance Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_expense_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Cost of Goods Sold Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_expense_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Cost of Goods Sold Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_income_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Income Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_income_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Income Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "default_payroll_payable_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Payroll Payable Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "default_payroll_payable_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Payroll Payable Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "round_off_cost_center", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Round Off Cost Center", - "length": 0, - "no_copy": 0, - "options": "Cost Center", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "round_off_cost_center", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Round Off Cost Center", + "length": 0, + "no_copy": 0, + "options": "Cost Center", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_22", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_22", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "cost_center", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Cost Center", - "length": 0, - "no_copy": 1, - "options": "Cost Center", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "cost_center", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Cost Center", + "length": 0, + "no_copy": 1, + "options": "Cost Center", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_26", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_26", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "credit_limit", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Credit Limit", - "length": 0, - "no_copy": 0, - "oldfieldname": "credit_limit", - "oldfieldtype": "Currency", - "options": "default_currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "credit_limit", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Credit Limit", + "length": 0, + "no_copy": 0, + "oldfieldname": "credit_limit", + "oldfieldtype": "Currency", + "options": "default_currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "payment_terms", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Payment Terms Template", - "length": 0, - "no_copy": 0, - "options": "Payment Terms Template", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "payment_terms", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Payment Terms Template", + "length": 0, + "no_copy": 0, + "options": "Payment Terms Template", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "auto_accounting_for_stock_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Stock Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "auto_accounting_for_stock_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Stock Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "enable_perpetual_inventory", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Enable Perpetual Inventory", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fieldname": "enable_perpetual_inventory", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enable Perpetual Inventory", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_inventory_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Inventory Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_inventory_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Inventory Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "stock_adjustment_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Stock Adjustment Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "stock_adjustment_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Stock Adjustment Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_32", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_32", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "stock_received_but_not_billed", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Stock Received But Not Billed", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "stock_received_but_not_billed", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Stock Received But Not Billed", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "expenses_included_in_valuation", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Expenses Included In Valuation", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "expenses_included_in_valuation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Expenses Included In Valuation", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "fixed_asset_depreciation_settings", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Fixed Asset Depreciation Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fixed_asset_depreciation_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Fixed Asset Depreciation Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "accumulated_depreciation_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Accumulated Depreciation Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "accumulated_depreciation_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Accumulated Depreciation Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "depreciation_expense_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Depreciation Expense Account", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depreciation_expense_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Depreciation Expense Account", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "series_for_depreciation_entry", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Series for Asset Depreciation Entry (Journal Entry)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "series_for_depreciation_entry", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Series for Asset Depreciation Entry (Journal Entry)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_40", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_40", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "disposal_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Gain/Loss Account on Asset Disposal", - "length": 0, - "no_copy": 1, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disposal_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Gain/Loss Account on Asset Disposal", + "length": 0, + "no_copy": 1, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "depreciation_cost_center", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Asset Depreciation Cost Center", - "length": 0, - "no_copy": 1, - "options": "Cost Center", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depreciation_cost_center", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Depreciation Cost Center", + "length": 0, + "no_copy": 1, + "options": "Cost Center", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "For reference only.", - "fieldname": "company_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Company Info", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "For reference only.", + "fieldname": "company_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company Info", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "address_html", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "address_html", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "phone_no", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Phone No", - "length": 0, - "no_copy": 0, - "oldfieldname": "phone_no", - "oldfieldtype": "Data", - "options": "Phone", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "phone_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Phone No", + "length": 0, + "no_copy": 0, + "oldfieldname": "phone_no", + "oldfieldtype": "Data", + "options": "Phone", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "fax", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Fax", - "length": 0, - "no_copy": 0, - "oldfieldname": "fax", - "oldfieldtype": "Data", - "options": "Phone", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fax", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Fax", + "length": 0, + "no_copy": 0, + "oldfieldname": "fax", + "oldfieldtype": "Data", + "options": "Phone", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "email", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Email", - "length": 0, - "no_copy": 0, - "oldfieldname": "email", - "oldfieldtype": "Data", - "options": "Email", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "email", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Email", + "length": 0, + "no_copy": 0, + "oldfieldname": "email", + "oldfieldtype": "Data", + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "website", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Website", - "length": 0, - "no_copy": 0, - "oldfieldname": "website", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "website", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Website", + "length": 0, + "no_copy": 0, + "oldfieldname": "website", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "registration_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "registration_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Company registration numbers for your reference. Tax numbers etc.", - "fieldname": "registration_details", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Registration Details", - "length": 0, - "no_copy": 0, - "oldfieldname": "registration_details", - "oldfieldtype": "Code", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Company registration numbers for your reference. Tax numbers etc.", + "fieldname": "registration_details", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Registration Details", + "length": 0, + "no_copy": 0, + "oldfieldname": "registration_details", + "oldfieldtype": "Code", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "delete_company_transactions", - "fieldtype": "Button", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Delete Company Transactions", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "delete_company_transactions", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Delete Company Transactions", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company_logo", - "fieldtype": "Attach Image", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Company Logo", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company_logo", + "fieldtype": "Attach Image", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company Logo", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lft", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lft", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rgt", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rgt", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "old_parent", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "old_parent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-building", - "idx": 1, - "image_field": "company_logo", - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2018-04-09 01:54:56.828976", - "modified_by": "Administrator", - "module": "Setup", - "name": "Company", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-building", + "idx": 1, + "image_field": "company_logo", + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "menu_index": 0, + "modified": "2018-04-18 11:51:12.021190", + "modified_by": "Administrator", + "module": "Setup", + "name": "Company", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Employee", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Employee", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Sales User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Projects User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Projects User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 1, - "sort_order": "ASC", - "track_changes": 1, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 1, + "sort_order": "ASC", + "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 236f0b86d9..1b68b8a6b6 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -45,8 +45,8 @@ class Company(NestedSet): self.abbr = self.abbr.strip() - if self.get('__islocal') and len(self.abbr) > 5: - frappe.throw(_("Abbreviation cannot have more than 5 characters")) + # if self.get('__islocal') and len(self.abbr) > 5: + # frappe.throw(_("Abbreviation cannot have more than 5 characters")) if not self.abbr.strip(): frappe.throw(_("Abbreviation is mandatory")) From f1642035209b0b4d41bb2b0139573d43cc9e1e43 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Apr 2018 11:54:46 +0530 Subject: [PATCH 016/154] Fixed merge conflict --- .../profit_and_loss_statement/profit_and_loss_statement.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py index 249d9d301c..8687dce1a4 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py @@ -33,11 +33,7 @@ def execute(filters=None): return columns, data, None, chart -<<<<<<< HEAD -def get_net_profit_loss(income, expense, period_list, company, currency=None): -======= -def get_net_profit_loss(income, expense, period_list, company, consolidated=False): ->>>>>>> Consolidated financial statement (#13678) +def get_net_profit_loss(income, expense, period_list, company, currency=None, consolidated=False): total = 0 net_profit_loss = { "account_name": "'" + _("Profit for the year") + "'", From 074928cf6cb1fcdac425bf1a14481a5e7a65253c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Apr 2018 12:03:46 +0530 Subject: [PATCH 017/154] Company field added in department --- erpnext/hr/doctype/department/department.json | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/department/department.json b/erpnext/hr/doctype/department/department.json index 40270d556d..a1c8dc16ff 100644 --- a/erpnext/hr/doctype/department/department.json +++ b/erpnext/hr/doctype/department/department.json @@ -76,6 +76,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -402,7 +434,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-16 16:46:02.759012", + "modified": "2018-04-18 12:02:42.572599", "modified_by": "Administrator", "module": "HR", "name": "Department", From 26decaad6c334ad03d04d59bc7c0b88f830eba4b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 18 Apr 2018 15:56:24 +0530 Subject: [PATCH 018/154] [Fix] Profit and loss statment --- .../consolidated_financial_statement.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py index ec2de2b6ec..c53707a76d 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -87,11 +87,12 @@ def get_profit_loss_data(fiscal_year, companies, columns, filters): return data, None, chart def get_income_expense_data(companies, fiscal_year, filters): + company_currency = frappe.db.get_value("Company", filters.company, "default_currency") income = get_data(companies, "Income", "Credit", fiscal_year, filters, True) expense = get_data(companies, "Expense", "Debit", fiscal_year, filters, True) - net_profit_loss = get_net_profit_loss(income, expense, companies, filters.company, True) + net_profit_loss = get_net_profit_loss(income, expense, companies, filters.company, company_currency, True) return income, expense, net_profit_loss From 4110e00b2dddfaba7e986f7bf7757157bf19e02c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 19 Apr 2018 15:09:46 +0530 Subject: [PATCH 019/154] [Fix] general ledger group by validation --- erpnext/accounts/report/general_ledger/general_ledger.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 0b7ae658bb..6438263c65 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -46,6 +46,9 @@ frappe.query_reports["General Ledger"] = { "fieldname":"voucher_no", "label": __("Voucher No"), "fieldtype": "Data", + on_change: function() { + frappe.query_report_filters_by_name.group_by.set_value(""); + } }, { "fieldname":"project", @@ -107,7 +110,7 @@ frappe.query_reports["General Ledger"] = { "fieldname":"group_by", "label": __("Group by"), "fieldtype": "Select", - "options": ["Group by Voucher", "Group by Account", "Group by Party"], + "options": ["", "Group by Voucher", "Group by Account", "Group by Party"], "default": "Group by Voucher" }, { From a16c8d0a2bda45c2ccb5da221b9abeb423b39f49 Mon Sep 17 00:00:00 2001 From: Siddhi Sawant Date: Mon, 23 Apr 2018 13:24:54 +0530 Subject: [PATCH 020/154] Establishment / Effective Date field in the Company master (#13723) --- erpnext/setup/doctype/company/company.js | 10 ++ erpnext/setup/doctype/company/company.json | 142 ++++++++++----------- 2 files changed, 79 insertions(+), 73 deletions(-) diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 84e0a2037c..7c060d852d 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -18,6 +18,16 @@ frappe.ui.form.on("Company", { } }, + date_of_commencement: function(frm) { + if(frm.doc.date_of_commencement Date: Tue, 24 Apr 2018 17:46:37 +0530 Subject: [PATCH 021/154] Show company column in order in consolidated financial statement --- .../consolidated_financial_statement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py index c53707a76d..0b1fc6da84 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -265,7 +265,7 @@ def get_subsidiary_companies(company): company, ["lft", "rgt"]) return frappe.db.sql_list("""select name from `tabCompany` - where lft >= {0} and rgt <= {1}""".format(lft, rgt)) + where lft >= {0} and rgt <= {1} order by lft, rgt""".format(lft, rgt)) def get_accounts(root_type, filters): return frappe.db.sql(""" select name, is_group, company, From 25ccd1acbb87d679f646e5f0e662a8302581ca90 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 26 Apr 2018 12:09:33 +0530 Subject: [PATCH 022/154] minor fix in asset --- erpnext/assets/doctype/asset/asset.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index cb14484916..baffdd757d 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -52,15 +52,15 @@ class Asset(Document): self.set(field, value) def validate_asset_values(self): - if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): - frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount")) - if not flt(self.gross_purchase_amount): frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError) if not self.calculate_depreciation: return + if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): + frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount")) + if not self.is_existing_asset: self.opening_accumulated_depreciation = 0 self.number_of_depreciations_booked = 0 From 2f82bce387f163363f03ade2f4157b461a20200b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 26 Apr 2018 16:32:17 +0530 Subject: [PATCH 023/154] minor fix --- erpnext/demo/user/hr.py | 5 ++--- erpnext/hr/doctype/employee/employee_dashboard.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/demo/user/hr.py b/erpnext/demo/user/hr.py index 6c6a7d4e93..b8016869cf 100644 --- a/erpnext/demo/user/hr.py +++ b/erpnext/demo/user/hr.py @@ -105,10 +105,9 @@ def get_timesheet_based_salary_slip_employee(): and docstatus != 2""") if sal_struct: employees = frappe.db.sql(""" - select employee from `tabSalary Structure Employee` - where parent IN %(sal_struct)s""", {"sal_struct": sal_struct}, as_dict=True) + select employee from `tabSalary Structure Assignment` + where salary_structure IN %(sal_struct)s""", {"sal_struct": sal_struct}, as_dict=True) return employees - else: return [] diff --git a/erpnext/hr/doctype/employee/employee_dashboard.py b/erpnext/hr/doctype/employee/employee_dashboard.py index be92074da1..0f95020306 100644 --- a/erpnext/hr/doctype/employee/employee_dashboard.py +++ b/erpnext/hr/doctype/employee/employee_dashboard.py @@ -12,7 +12,7 @@ def get_data(): }, { 'label': _('Payroll'), - 'items': ['Salary Structure', 'Salary Slip', 'Timesheet'] + 'items': ['Salary Slip', 'Timesheet'] }, { 'label': _('Training Events/Results'), From b3799989616f28b505f6cf363368dabee1a3230a Mon Sep 17 00:00:00 2001 From: deepak-mnt Date: Thu, 26 Apr 2018 17:00:08 +0530 Subject: [PATCH 024/154] Added Update Cost Center Number button and it's functionality --- .../doctype/cost_center/cost_center.js | 51 +++++++++++++++- .../doctype/cost_center/cost_center.json | 59 ++++++++++++++++--- .../doctype/cost_center/cost_center.py | 46 ++++++++++++++- 3 files changed, 147 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js index cbc37fff8d..a5bcaf47c1 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.js +++ b/erpnext/accounts/doctype/cost_center/cost_center.js @@ -15,8 +15,57 @@ frappe.ui.form.on('Cost Center', { } } }) + }, + refresh: function(frm) { + if (!frm.is_new()) { + frm.add_custom_button(__('Update Cost Center Number'), function () { + frm.trigger("update_cost_center_number"); + }); + } + }, + update_cost_center_number: function(frm) { + var d = new frappe.ui.Dialog({ + title: __('Update Cost Center Number'), + fields: [ + { + "label": 'Cost Center Number', + "fieldname": "cost_center_number", + "fieldtype": "Data", + "reqd": 1 + } + ], + primary_action: function() { + var data = d.get_values(); + if(data.cost_center_number === frm.doc.cost_center_number) { + d.hide(); + return; + } + frappe.call({ + method: "erpnext.accounts.doctype.cost_center.cost_center.update_number_field", + args: { + doctype_name: frm.doc.doctype, + name: frm.doc.name, + field_name: d.fields[0].fieldname, + field_value: data.cost_center_number, + company: frm.doc.company + }, + callback: function(r) { + if(!r.exc) { + if(r.message) { + frappe.set_route("Form", "Cost Center", r.message); + } else { + me.set_value("cost_center_number", data.cost_center_number); + } + d.hide(); + } + } + }); + }, + primary_action_label: __('Update') + }); + d.show(); } -}) +}); cur_frm.cscript.refresh = function(doc, cdt, cdn) { var intro_txt = ''; diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json index 9eddeec04f..4da21f11fe 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.json +++ b/erpnext/accounts/doctype/cost_center/cost_center.json @@ -1,5 +1,6 @@ { "allow_copy": 1, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "autoname": "field:cost_center_name", @@ -13,6 +14,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -38,9 +40,11 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -68,9 +72,42 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cost_center_number", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Cost Center Number", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -99,9 +136,11 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -130,9 +169,11 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -157,10 +198,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -188,9 +231,11 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -218,9 +263,11 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -248,9 +295,11 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -279,22 +328,23 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-money", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-02-17 16:22:27.129572", + "modified": "2018-04-26 15:26:25.325778", "modified_by": "Administrator", "module": "Accounts", "name": "Cost Center", @@ -302,7 +352,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -322,7 +371,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -342,7 +390,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -362,7 +409,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -382,7 +428,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py index fe1e9076de..3fb1f75c2d 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.py +++ b/erpnext/accounts/doctype/cost_center/cost_center.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import cint, cstr from frappe.utils.nestedset import NestedSet class CostCenter(NestedSet): @@ -66,4 +67,47 @@ class CostCenter(NestedSet): " - ".join(newdn.split(" - ")[:-1])) def on_doctype_update(): - frappe.db.add_index("Cost Center", ["lft", "rgt"]) \ No newline at end of file + frappe.db.add_index("Cost Center", ["lft", "rgt"]) + +def get_doc_name_autoname(field_value, doc_title, name, company): + if company: + name_split=name.split("-") + parts = [doc_title.strip(), name_split[len(name_split)-1].strip()] + else: + parts = [doc_title.strip()] + if cstr(field_value).strip(): + parts.insert(0, cstr(field_value).strip()) + return ' - '.join(parts) + +def validate_field_number(doctype_name, name, field_value, company, field_name): + if field_value: + if company: + doctype_with_same_number = frappe.db.get_value(doctype_name, + {field_name: field_value, "company": company, "name": ["!=", name]}) + else: + doctype_with_same_number = frappe.db.get_value(doctype_name, + {field_name: field_value, "name": ["!=", name]}) + if doctype_with_same_number: + frappe.throw(_("{0} Number {1} already used in account {2}") + .format(doctype_name, field_value, doctype_with_same_number)) + +@frappe.whitelist() +def update_number_field(doctype_name, name, field_name, field_value, company): + + doc_title = frappe.db.get_value(doctype_name, name, frappe.scrub(doctype_name)+"_name") + + validate_field_number(doctype_name, name, field_value, company, field_name) + + frappe.db.set_value(doctype_name, name, field_name, field_value) + + if doc_title[0].isdigit(): + separator = " - " if " - " in doc_title else " " + doc_title = doc_title.split(separator, 1)[1] + + frappe.db.set_value(doctype_name, name, frappe.scrub(doctype_name)+"_name", doc_title) + + new_name = get_doc_name_autoname(field_value, doc_title, name, company) + + if name != new_name: + frappe.rename_doc(doctype_name, name, new_name) + return new_name \ No newline at end of file From b712d1905d5b5357b8738759cc6262a4fb25c002 Mon Sep 17 00:00:00 2001 From: deepak-mnt Date: Thu, 26 Apr 2018 17:04:06 +0530 Subject: [PATCH 025/154] Override after_rename method to fetch cost center number on changing from title --- .../doctype/cost_center/cost_center.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py index 3fb1f75c2d..24af0ce376 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.py +++ b/erpnext/accounts/doctype/cost_center/cost_center.py @@ -63,8 +63,25 @@ class CostCenter(NestedSet): super(CostCenter, self).after_rename(olddn, newdn, merge) if not merge: - frappe.db.set_value("Cost Center", newdn, "cost_center_name", - " - ".join(newdn.split(" - ")[:-1])) + new_cost_center = frappe.db.get_value("Cost Center", newdn, ["cost_center_name", "cost_center_number"], as_dict=1) + + # exclude company abbr + new_parts = newdn.split(" - ")[:-1] + # update cost center number and remove from parts + if new_parts[0][0].isdigit(): + if len(new_parts) == 1: + new_parts = newdn.split(" ") + if new_cost_center.cost_center_number != new_parts[0]: + validate_field_number("Cost Center", self.name, new_parts[0], self.company, "cost_center_number") + self.cost_center_number = new_parts[0] + self.db_set("cost_center_number", new_parts[0]) + new_parts = new_parts[1:] + + # update cost center name + cost_center_name = " - ".join(new_parts) + if new_cost_center.cost_center_name != cost_center_name: + self.cost_center_name = cost_center_name + self.db_set("cost_center_name", cost_center_name) def on_doctype_update(): frappe.db.add_index("Cost Center", ["lft", "rgt"]) From d39386bd559815637278bfbe228a04a2ccfd1c77 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 30 Apr 2018 16:21:37 +0530 Subject: [PATCH 026/154] Renamed some salary related fields --- .../doctype/payroll_entry/payroll_entry.json | 6 +- .../salary_component/salary_component.json | 116 ++++++++++++++++-- .../hr/doctype/salary_slip/salary_slip.json | 10 +- .../create_salary_structure_assignments.py | 1 - .../v11_0/make_quality_inspection_template.py | 2 +- erpnext/stock/doctype/item/item.json | 2 +- 6 files changed, 114 insertions(+), 23 deletions(-) diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.json b/erpnext/hr/doctype/payroll_entry/payroll_entry.json index 0af6d5d82e..54f1e45d0d 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.json +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.json @@ -588,7 +588,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "include_unclaimed_employee_benefits", + "fieldname": "deduct_tax_for_unclaimed_employee_benefits", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -597,7 +597,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Include Unclaimed Employee Benefits", + "label": "Deduct Tax For Unclaimed Employee Benefits", "length": 0, "no_copy": 0, "permlevel": 0, @@ -968,7 +968,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 17:28:42.759513", + "modified": "2018-04-27 12:42:45.054509", "modified_by": "Administrator", "module": "HR", "name": "Payroll Entry", diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index ac8e51d3a8..27b4bef036 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -138,6 +138,37 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -239,8 +270,8 @@ "collapsible": 0, "columns": 0, "depends_on": "is_flexible_benefit", - "fieldname": "is_pro_rata_applicable", - "fieldtype": "Check", + "fieldname": "max_benefit_amount", + "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -248,7 +279,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Is Pro-rata Applicable", + "label": "Max Benefit Amount (Yearly)", "length": 0, "no_copy": 0, "permlevel": 0, @@ -264,6 +295,39 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_flexible_benefit", + "fieldname": "earning_component_group", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Earning Component Group", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -301,8 +365,8 @@ "collapsible": 0, "columns": 0, "depends_on": "is_flexible_benefit", - "fieldname": "max_benefit", - "fieldtype": "Currency", + "fieldname": "is_pro_rata_applicable", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -310,7 +374,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Max Benefit (Amount)", + "label": "Is Pro-rata Applicable", "length": 0, "no_copy": 0, "permlevel": 0, @@ -333,8 +397,8 @@ "collapsible": 0, "columns": 0, "depends_on": "is_flexible_benefit", - "fieldname": "earning_component_if_unclaimed", - "fieldtype": "Link", + "fieldname": "only_tax_impact", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -342,10 +406,40 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Earning Component If Unclaimed", + "label": "Only Tax Impact (Cannot Claim But Part of Taxable Income)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "create_separate_payment_entry_against_benefit_claim", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Create Separate Payment Entry Against Benefit Claim", "length": 0, "no_copy": 0, - "options": "Salary Component", "permlevel": 0, "precision": "", "print_hide": 0, @@ -529,7 +623,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:10:20.771538", + "modified": "2018-04-27 13:23:34.503504", "modified_by": "Administrator", "module": "HR", "name": "Salary Component", diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/hr/doctype/salary_slip/salary_slip.json index 240e3cfc60..6f524f23b8 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.json +++ b/erpnext/hr/doctype/salary_slip/salary_slip.json @@ -1044,7 +1044,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "include_unclaimed_employee_benefits", + "fieldname": "deduct_tax_for_unclaimed_employee_benefits", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -1053,7 +1053,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Include Unclaimed Employee Benefits", + "label": "Deduct Tax For Unclaimed Employee Benefits", "length": 0, "no_copy": 0, "permlevel": 0, @@ -1435,7 +1435,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Loan", + "label": "Employee Loan", "length": 0, "no_copy": 0, "options": "Salary Slip Loan", @@ -1812,7 +1812,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 20:14:23.105069", + "modified": "2018-04-27 12:42:21.278360", "modified_by": "Administrator", "module": "HR", "name": "Salary Slip", @@ -1835,7 +1835,6 @@ "set_user_permissions": 0, "share": 1, "submit": 1, - "user_permission_doctypes": "[\"Branch\",\"Company\",\"Department\",\"Designation\",\"Fiscal Year\",\"Salary Slip\"]", "write": 1 }, { @@ -1874,7 +1873,6 @@ "set_user_permissions": 0, "share": 0, "submit": 0, - "user_permission_doctypes": "[\"Employee\"]", "write": 0 } ], diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py index fc3a4315ee..289554ee1a 100644 --- a/erpnext/patches/v11_0/create_salary_structure_assignments.py +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -9,7 +9,6 @@ def execute(): for d in frappe.db.sql(""" select sse.*, ss.company from `tabSalary Structure Employee` sse, `tabSalary Structure` ss where ss.name = sse.parent""", as_dict=1): - print(d) s = frappe.new_doc("Salary Structure Assignment") s.employee = d.employee s.employee_name = d.employee_name diff --git a/erpnext/patches/v11_0/make_quality_inspection_template.py b/erpnext/patches/v11_0/make_quality_inspection_template.py index 67755e8b44..9720af4121 100644 --- a/erpnext/patches/v11_0/make_quality_inspection_template.py +++ b/erpnext/patches/v11_0/make_quality_inspection_template.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc('stock', 'doctype', 'item') frappe.reload_doc('stock', 'doctype', 'quality_inspection_template') + frappe.reload_doc('stock', 'doctype', 'item') for data in frappe.get_all('Item Quality Inspection Parameter', fields = ["distinct parent"], filters = {'parenttype': 'Item'}): diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index caa44ac1f6..21900ad440 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -3717,7 +3717,7 @@ "issingle": 0, "istable": 0, "max_attachments": 1, - "modified": "2018-04-11 12:21:48.715529", + "modified": "2018-04-30 12:21:48.715529", "modified_by": "Administrator", "module": "Stock", "name": "Item", From 2f77ccce1b999f236697e0cff002beb87c427942 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 13 Apr 2018 20:20:46 +0530 Subject: [PATCH 027/154] New doctypes for HR and Accounting (#13652) --- .../compensatory_leave_request.py | 4 + .../test_compensatory_leave_request.py | 6 +- erpnext/hr/doctype/employee/employee.json | 32 +++ .../employee_benefit_claim.json | 3 - .../__init__.py | 0 .../employee_tax_excemption_category.js | 8 + .../employee_tax_excemption_category.json | 194 ++++++++++++++++++ .../employee_tax_excemption_category.py | 10 + .../test_employee_tax_excemption_category.js | 23 +++ .../test_employee_tax_excemption_category.py | 10 + .../doctype/leave_period/test_leave_period.py | 2 +- 11 files changed, 287 insertions(+), 5 deletions(-) create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/__init__.py create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js create mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index 90d482abcd..c211792f00 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -7,6 +7,10 @@ import frappe from frappe.model.document import Document class CompensatoryLeaveRequest(Document): +<<<<<<< HEAD def validate_present(self): pass +======= + pass +>>>>>>> New doctypes for HR and Accounting (#13652) diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py index ea73ca987a..edad571700 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -7,6 +7,7 @@ import frappe import unittest class TestCompensatoryLeaveRequest(unittest.TestCase): +<<<<<<< HEAD def get_compensatory_leave_request(self): return frappe.get_doc('Compensatory Leave Request', dict( employee = employee, @@ -38,4 +39,7 @@ class TestCompensatoryLeaveRequest(unittest.TestCase): self.assertRaises(MaxLeavesLimitCrossed, compensatory_leave_request.submit) frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 10) - \ No newline at end of file + +======= + pass +>>>>>>> New doctypes for HR and Accounting (#13652) diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 2d76dcf303..0cf6805693 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1262,6 +1262,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_leave_policy", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Leave policy", + "length": 0, + "no_copy": 0, + "options": "Leave Policy", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json index 5e2b34b7d7..b358247376 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -457,7 +457,4 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", - "title_field": "employee_name", "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py b/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js new file mode 100644 index 0000000000..2c4377cdbd --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Tax Excemption Category', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json new file mode 100644 index 0000000000..e49e780ffa --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json @@ -0,0 +1,194 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "beta": 0, + "creation": "2018-04-13 16:51:36.971140", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "deduction_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Deduction Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "max_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Max Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-04-13 16:52:11.640756", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Tax Excemption Category", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py new file mode 100644 index 0000000000..1586bf136c --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeTaxExcemptionCategory(Document): + pass diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js new file mode 100644 index 0000000000..3872438079 --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Tax Excemption Category", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Tax Excemption Category + () => frappe.tests.make('Employee Tax Excemption Category', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py new file mode 100644 index 0000000000..7438f6464c --- /dev/null +++ b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeTaxExcemptionCategory(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py index 381fbb234d..11d4ec5cac 100644 --- a/erpnext/hr/doctype/leave_period/test_leave_period.py +++ b/erpnext/hr/doctype/leave_period/test_leave_period.py @@ -28,4 +28,4 @@ class TestLeavePeriod(unittest.TestCase): def test_duplicate_grant(self): leave_period = self.test_leave_grant() self.assertRaises(DuplicateLeaveGrant, leave_period.grant_leaves) - \ No newline at end of file + From 24e8f31be138a1cb226e8592a222c314b914ed91 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Sat, 14 Apr 2018 12:33:01 +0530 Subject: [PATCH 028/154] [Enterprise] Patch and child table changes (#13656) * [patch] rename field * Employee Property History child table * remove child tables --- .../doctype/employee_promotion/employee_promotion.json | 2 +- ...ty_history.py => employee_property_history.py~HEAD} | 0 ...[Enterprise] Patch and child table changes (#13656) | 10 ++++++++++ .../doctype/employee_transfer/employee_transfer.json | 2 +- erpnext/hr/doctype/leave_type/leave_type.json | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) rename erpnext/hr/doctype/employee_property_history/{employee_property_history.py => employee_property_history.py~HEAD} (100%) create mode 100644 erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index a7d49bcad3..845eaf9890 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -189,7 +189,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Promotion Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, diff --git a/erpnext/hr/doctype/employee_property_history/employee_property_history.py b/erpnext/hr/doctype/employee_property_history/employee_property_history.py~HEAD similarity index 100% rename from erpnext/hr/doctype/employee_property_history/employee_property_history.py rename to erpnext/hr/doctype/employee_property_history/employee_property_history.py~HEAD diff --git a/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) b/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) new file mode 100644 index 0000000000..fb67852d16 --- /dev/null +++ b/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeePropertyHistory(Document): + pass diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 55fa073fa2..6b8d403159 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -221,7 +221,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Transfer Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 1d1aef2045..02f585d68e 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -113,7 +113,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "max_days_allowed", + "fieldname": "max_continuous_days_allowed", "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, From 501a64becda0f29f719a27c15d41e240bfa4237e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 12:38:55 +0530 Subject: [PATCH 029/154] Added links in HR module --- erpnext/config/hr.py | 4 + ...late_activity.py~Added links in HR module} | 0 ...fecycle_process_template_activity.py~HEAD} | 2 +- .../__init__.py | 0 .../employee_tax_excemption_category.js | 8 - .../employee_tax_excemption_category.json | 194 ------------------ .../test_employee_tax_excemption_category.js | 23 --- .../test_employee_tax_excemption_category.py | 10 - 8 files changed, 5 insertions(+), 236 deletions(-) rename erpnext/hr/doctype/employee_lifecycle_process_template_activity/{employee_lifecycle_process_template_activity.py => employee_lifecycle_process_template_activity.py~Added links in HR module} (100%) rename erpnext/hr/doctype/{employee_tax_excemption_category/employee_tax_excemption_category.py => employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD} (81%) delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/__init__.py delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js delete mode 100644 erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index fb00529c16..9ac48db388 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -23,6 +23,10 @@ def get_data(): "type": "doctype", "name": "Attendance Request", }, + { + "type": "doctype", + "name": "Attendance Request", + }, { "type": "doctype", "name": "Upload Attendance", diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module similarity index 100% rename from erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py rename to erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD similarity index 81% rename from erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py rename to erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD index 1586bf136c..eeea2366b1 100644 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.py +++ b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD @@ -6,5 +6,5 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -class EmployeeTaxExcemptionCategory(Document): +class EmployeeLifecycleProcessTemplateActivity(Document): pass diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py b/erpnext/hr/doctype/employee_tax_excemption_category/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js deleted file mode 100644 index 2c4377cdbd..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Tax Excemption Category', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json b/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json deleted file mode 100644 index e49e780ffa..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/employee_tax_excemption_category.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "Prompt", - "beta": 0, - "creation": "2018-04-13 16:51:36.971140", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "deduction_component", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Deduction Component", - "length": 0, - "no_copy": 0, - "options": "Salary Component", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Max Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 16:52:11.640756", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Excemption Category", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js deleted file mode 100644 index 3872438079..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Tax Excemption Category", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Tax Excemption Category - () => frappe.tests.make('Employee Tax Excemption Category', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py b/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py deleted file mode 100644 index 7438f6464c..0000000000 --- a/erpnext/hr/doctype/employee_tax_excemption_category/test_employee_tax_excemption_category.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeTaxExcemptionCategory(unittest.TestCase): - pass From e9ad03e23e49f22d818b3d7fcc639f58966459dc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 12:54:51 +0530 Subject: [PATCH 030/154] Documents order in hr page --- erpnext/config/hr.py | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index 9ac48db388..cdb7180756 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -232,6 +232,52 @@ def get_data(): }, ] }, + { + "label": _("Employee Lifecycle"), + "items": [ + { + "type": "doctype", + "name": "Employee Transfer", + }, + { + "type": "doctype", + "name": "Employee Promotion", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Activity Type", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process Template", + }, + { + "type": "doctype", + "name": "Employee Lifecycle Process", + } + ] + }, + { + "label": _("Recruitment"), + "items": [ + { + "type": "doctype", + "name": "Job Applicant", + }, + { + "type": "doctype", + "name": "Job Opening", + }, + { + "type": "doctype", + "name": "Job Offer", + }, + ] + }, { "label": _("Training"), "items": [ From 43274de5df456a760b5a0137fa4669eba2d2eb5e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 14 Apr 2018 17:04:56 +0530 Subject: [PATCH 031/154] Removed employee table from Salary Structure and added employee name in all forms --- .../compensatory_leave_request.py | 6 +----- .../test_compensatory_leave_request.py | 6 +----- erpnext/hr/doctype/employee/employee.json | 8 ++++++-- .../employee_benefit_claim/employee_benefit_claim.json | 1 + .../hr/doctype/employee_promotion/employee_promotion.json | 2 +- .../hr/doctype/employee_transfer/employee_transfer.json | 2 +- erpnext/hr/doctype/leave_period/test_leave_period.py | 2 +- erpnext/hr/doctype/leave_type/leave_type.json | 2 +- erpnext/hr/doctype/shift_assignment/shift_assignment.json | 4 ++++ .../patches/v11_0/create_salary_structure_assignments.py | 6 ++++++ 10 files changed, 23 insertions(+), 16 deletions(-) diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index c211792f00..b51b46c80f 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -7,10 +7,6 @@ import frappe from frappe.model.document import Document class CompensatoryLeaveRequest(Document): -<<<<<<< HEAD + def validate_present(self): pass - -======= - pass ->>>>>>> New doctypes for HR and Accounting (#13652) diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py index edad571700..f062325f5f 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -7,7 +7,6 @@ import frappe import unittest class TestCompensatoryLeaveRequest(unittest.TestCase): -<<<<<<< HEAD def get_compensatory_leave_request(self): return frappe.get_doc('Compensatory Leave Request', dict( employee = employee, @@ -39,7 +38,4 @@ class TestCompensatoryLeaveRequest(unittest.TestCase): self.assertRaises(MaxLeavesLimitCrossed, compensatory_leave_request.submit) frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 10) - -======= - pass ->>>>>>> New doctypes for HR and Accounting (#13652) + diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 0cf6805693..ecbb29f46b 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1268,7 +1268,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "default_leave_policy", + "fieldname": "leave_policy", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -1277,7 +1277,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Leave policy", + "label": "Leave Policy", "length": 0, "no_copy": 0, "options": "Leave Policy", @@ -2766,7 +2766,11 @@ "issingle": 0, "istable": 0, "max_attachments": 0, +<<<<<<< HEAD "modified": "2018-04-25 09:08:06.852604", +======= + "modified": "2018-04-14 13:30:43.761434", +>>>>>>> Removed employee table from Salary Structure and added employee name in all forms "modified_by": "Administrator", "module": "HR", "name": "Employee", diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json index b358247376..fed15edf84 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -457,4 +457,5 @@ "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "title_field": "employee_name", "track_changes": 1, diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index 845eaf9890..a7d49bcad3 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -189,7 +189,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Promotion Detail", "permlevel": 0, "precision": "", "print_hide": 0, diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 6b8d403159..55fa073fa2 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -221,7 +221,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Property History", + "options": "Employee Transfer Detail", "permlevel": 0, "precision": "", "print_hide": 0, diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py index 11d4ec5cac..dcf6293f11 100644 --- a/erpnext/hr/doctype/leave_period/test_leave_period.py +++ b/erpnext/hr/doctype/leave_period/test_leave_period.py @@ -28,4 +28,4 @@ class TestLeavePeriod(unittest.TestCase): def test_duplicate_grant(self): leave_period = self.test_leave_grant() self.assertRaises(DuplicateLeaveGrant, leave_period.grant_leaves) - + diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 02f585d68e..1d1aef2045 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -113,7 +113,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "max_continuous_days_allowed", + "fieldname": "max_days_allowed", "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json index 897cfed68a..86c1708f5f 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.json +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -307,7 +307,11 @@ "issingle": 0, "istable": 0, "max_attachments": 0, +<<<<<<< HEAD "modified": "2018-04-17 14:50:09.125737", +======= + "modified": "2018-04-14 15:42:12.617715", +>>>>>>> Removed employee table from Salary Structure and added employee name in all forms "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py index 289554ee1a..cf7646bcf5 100644 --- a/erpnext/patches/v11_0/create_salary_structure_assignments.py +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -7,8 +7,14 @@ import frappe def execute(): frappe.reload_doc("hr", "doctype", "salary_structure_assignment") for d in frappe.db.sql(""" +<<<<<<< HEAD select sse.*, ss.company from `tabSalary Structure Employee` sse, `tabSalary Structure` ss where ss.name = sse.parent""", as_dict=1): +======= + select * from `tabSalary Structure Employee` sse, `tabSalary Structure` ss + where ss.name = sse.parent""", as_dict=1): + +>>>>>>> Removed employee table from Salary Structure and added employee name in all forms s = frappe.new_doc("Salary Structure Assignment") s.employee = d.employee s.employee_name = d.employee_name From d2861df9394c0c5de41bd76686c424df658c8dff Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sun, 15 Apr 2018 15:03:54 +0530 Subject: [PATCH 032/154] Renamed Health Insurance to Employee Health Insurance --- erpnext/hr/doctype/employee/employee.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index ecbb29f46b..ef2c75dc83 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -2766,11 +2766,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, -<<<<<<< HEAD "modified": "2018-04-25 09:08:06.852604", -======= - "modified": "2018-04-14 13:30:43.761434", ->>>>>>> Removed employee table from Salary Structure and added employee name in all forms "modified_by": "Administrator", "module": "HR", "name": "Employee", From 7946ca216e69568d4dfc01dd79dd0668643841a2 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 13:58:56 +0530 Subject: [PATCH 033/154] Internal Customer check in Customer --- .../selling/doctype/customer/customer.json | 187 +++++++++++++++++- 1 file changed, 177 insertions(+), 10 deletions(-) diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index d43de100cf..e38f6b3e02 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -43,6 +43,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 1, + "translatable": 0, "unique": 0 }, { @@ -105,6 +107,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -136,6 +139,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -168,6 +172,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -201,6 +206,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -233,6 +239,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -263,6 +270,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -291,6 +299,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -325,6 +334,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -358,6 +368,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -388,6 +399,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -419,6 +431,137 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "is_internal_customer", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Internal Customer", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_internal_customer", + "fieldname": "represents_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Represents Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 1 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "represents_company", + "fieldname": "allowed_to_transact_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allowed To Transact With", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "represents_company", + "fieldname": "companies", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allowed To Transact With", + "length": 0, + "no_copy": 0, + "options": "Allowed To Transact With", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -449,6 +592,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -479,6 +623,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -509,6 +654,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -538,6 +684,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -569,6 +716,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -600,6 +748,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -629,6 +778,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -658,6 +808,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -686,6 +837,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -717,6 +869,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -748,6 +901,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -780,6 +934,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -811,6 +966,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -842,6 +998,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -871,6 +1028,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -903,6 +1061,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -935,6 +1094,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -965,6 +1125,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -997,6 +1158,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1027,6 +1189,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "" }, @@ -1060,6 +1223,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1091,6 +1255,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1120,6 +1285,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1152,6 +1318,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1184,6 +1351,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1216,6 +1384,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1246,6 +1415,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1278,6 +1448,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1310,6 +1481,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1341,6 +1513,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1372,6 +1545,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1404,6 +1578,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1434,6 +1609,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -1449,7 +1625,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-02-09 10:44:35.801716", + "modified": "2018-04-19 12:19:35.311509", "modified_by": "Administrator", "module": "Selling", "name": "Customer", @@ -1458,7 +1634,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -1478,7 +1653,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1498,7 +1672,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1518,7 +1691,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -1538,7 +1710,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1558,7 +1729,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1578,7 +1748,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1598,7 +1767,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1618,7 +1786,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From 59512aaaaa30fd62313e039538e42d037fa4cb19 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 13:59:35 +0530 Subject: [PATCH 034/154] Internal Supplier check in Supplier --- erpnext/buying/doctype/supplier/supplier.json | 132 +++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index e64dcb7d12..afb8899dcb 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -174,6 +174,71 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "is_internal_supplier", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Internal Supplier", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_internal_supplier", + "fieldname": "represents_company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Represents Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 1 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -456,6 +521,71 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "represents_company", + "fieldname": "allowed_to_transact_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allowed To Transact With", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "represents_company", + "fieldname": "companies", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allowed To Transact With", + "length": 0, + "no_copy": 0, + "options": "Allowed To Transact With", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1033,7 +1163,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:45:44.023746", + "modified": "2018-04-19 12:19:52.519026", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", From 462e18ad2ef86a92c08f07a86ac34d4196acdf08 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:01:30 +0530 Subject: [PATCH 035/154] Allowed To Transact With child table in Customer & Supplier --- .../allowed_to_transact_with/__init__.py | 0 .../allowed_to_transact_with.json | 74 +++++++++++++++++++ .../allowed_to_transact_with.py | 10 +++ 3 files changed, 84 insertions(+) create mode 100644 erpnext/accounts/doctype/allowed_to_transact_with/__init__.py create mode 100644 erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json create mode 100644 erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py diff --git a/erpnext/accounts/doctype/allowed_to_transact_with/__init__.py b/erpnext/accounts/doctype/allowed_to_transact_with/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json new file mode 100644 index 0000000000..f85bc52713 --- /dev/null +++ b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json @@ -0,0 +1,74 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-16 21:50:05.860195", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "", + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-20 14:00:46.014502", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Allowed To Transact With", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py new file mode 100644 index 0000000000..c4ab3b0961 --- /dev/null +++ b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AllowedToTransactWith(Document): + pass From 30b2480cfe609ce6eb48c9f565eb319d485dafaf Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:13:33 +0530 Subject: [PATCH 036/154] make inter company invoice button on Invoices --- .../doctype/sales_invoice/sales_invoice.js | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 2fcca755d8..91696c203d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -101,6 +101,18 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte } this.set_default_print_format(); + var me = this; + if (doc.docstatus == 1 && !doc.inter_company_invoice_reference) { + frappe.model.with_doc("Customer", me.frm.doc.customer, function() { + var customer = frappe.model.get_doc("Customer", me.frm.doc.customer); + var internal = customer.is_internal_customer; + if (internal == 1) { + me.frm.add_custom_button("Inter Company Invoice", function() { + me.validate_inter_company_invoice(me.frm); + }, __("Make")); + } + }); + } }, on_submit: function(doc, dt, dn) { @@ -213,11 +225,9 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte tc_name: function() { this.get_terms(); }, - customer: function() { var me = this; if(this.frm.updating_party_details) return; - erpnext.utils.get_party_details(this.frm, "erpnext.accounts.party.get_party_details", { posting_date: this.frm.doc.posting_date, @@ -229,6 +239,26 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte me.apply_pricing_rule(); }) }, + + validate_inter_company_invoice: function(frm) { + var me = this; + frappe.call({ + method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice", + args: {"doc": frm.doc}, + callback: function(r) { + if (r && r.message) { + me.make_inter_company_invoice(frm); + } + } + }); + }, + + make_inter_company_invoice: function(frm) { + frappe.model.open_mapped_doc({ + method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_inter_company_purchase_invoice", + frm: frm + }); + }, debit_to: function() { var me = this; From ed80cf1f2eaf6f593aad7ae1d83d506e277b08e9 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:13:57 +0530 Subject: [PATCH 037/154] Inter company invoice reference link field --- .../doctype/sales_invoice/sales_invoice.json | 2546 +++++++++-------- 1 file changed, 1363 insertions(+), 1183 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index cfcc341291..8fe63b4589 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -15,1263 +15,1304 @@ "engine": "InnoDB", "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "customer_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "options": "fa fa-user", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "customer_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "options": "fa fa-user", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "{customer_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "{customer_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Title", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "SINV-\nSINV-RET-", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 1, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "SINV-\nSINV-RET-", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 1, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "customer", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Customer", - "length": 0, - "no_copy": 0, - "oldfieldname": "customer", - "oldfieldtype": "Link", - "options": "Customer", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "customer", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Customer", + "length": 0, + "no_copy": 0, + "oldfieldname": "customer", + "oldfieldtype": "Link", + "options": "Customer", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "depends_on": "customer", - "fieldname": "customer_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "customer_name", - "oldfieldtype": "Data", - "options": "customer.customer_name", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "customer", + "fieldname": "customer_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "customer_name", + "oldfieldtype": "Data", + "options": "customer.customer_name", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "tax_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Tax Id", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_id", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Tax Id", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "project", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Project", - "length": 0, - "no_copy": 0, - "oldfieldname": "project_name", - "oldfieldtype": "Link", - "options": "Project", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Project", + "length": 0, + "no_copy": 0, + "oldfieldname": "project_name", + "oldfieldtype": "Link", + "options": "Project", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_pos", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Include Payment (POS)", - "length": 0, - "no_copy": 0, - "oldfieldname": "is_pos", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_pos", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Include Payment (POS)", + "length": 0, + "no_copy": 0, + "oldfieldname": "is_pos", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_pos", - "fieldname": "pos_profile", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "POS Profile", - "length": 0, - "no_copy": 0, - "options": "POS Profile", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_pos", + "fieldname": "pos_profile", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "POS Profile", + "length": 0, + "no_copy": 0, + "options": "POS Profile", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "offline_pos_name", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Offline POS Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "offline_pos_name", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Offline POS Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "posting_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Date", - "length": 0, - "no_copy": 1, - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "posting_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date", + "length": 0, + "no_copy": 1, + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "posting_time", - "fieldtype": "Time", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Posting Time", - "length": 0, - "no_copy": 1, - "oldfieldname": "posting_time", - "oldfieldtype": "Time", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "posting_time", + "fieldtype": "Time", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Posting Time", + "length": 0, + "no_copy": 1, + "oldfieldname": "posting_time", + "oldfieldtype": "Time", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.docstatus==0", - "fieldname": "set_posting_time", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Edit Posting Date and Time", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus==0", + "fieldname": "set_posting_time", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Edit Posting Date and Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "due_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Payment Due Date", - "length": 0, - "no_copy": 1, - "oldfieldname": "due_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "due_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Payment Due Date", + "length": 0, + "no_copy": 1, + "oldfieldname": "due_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Link", - "options": "Sales Invoice", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Link", + "options": "Sales Invoice", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_return", - "fieldname": "returns", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Returns", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "returns", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Returns", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_return", - "fieldname": "is_return", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Return", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "is_return", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Return", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_return", - "fieldname": "return_against", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Return Against Sales Invoice", - "length": 0, - "no_copy": 1, - "options": "Sales Invoice", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "return_against", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Return Against Sales Invoice", + "length": 0, + "no_copy": 1, + "options": "Sales Invoice", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "po_no", - "columns": 0, - "fieldname": "customer_po_details", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer PO Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "po_no", + "columns": 0, + "fieldname": "customer_po_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer PO Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "po_no", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer's Purchase Order", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "po_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer's Purchase Order", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_23", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_23", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "po_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer's Purchase Order Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "po_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer's Purchase Order Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "", - "fieldname": "address_and_contact", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Address and Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "depends_on": "", + "fieldname": "address_and_contact", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Address and Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "customer_address", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "customer_address", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "address_display", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "address_display", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "contact_person", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact Person", - "length": 0, - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_person", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact Person", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "contact_display", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_display", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "contact_mobile", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_mobile", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "contact_email", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact Email", - "length": 0, - "no_copy": 0, - "options": "Email", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_email", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact Email", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "territory", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Territory", - "length": 0, - "no_copy": 0, - "options": "Territory", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "territory", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Territory", + "length": 0, + "no_copy": 0, + "options": "Territory", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "col_break4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "shipping_address_name", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Shipping Address Name", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_address_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Shipping Address Name", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "shipping_address", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Shipping Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_address", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Shipping Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company_address", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Company Address Name", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company_address", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company Address Name", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company_address_display", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Company Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company_address_display", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "customer", - "fieldname": "currency_and_price_list", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Currency and Price List", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "depends_on": "customer", + "fieldname": "currency_and_price_list", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Currency and Price List", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Currency", - "length": 0, - "no_copy": 0, - "oldfieldname": "currency", - "oldfieldtype": "Select", - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Currency", + "length": 0, + "no_copy": 0, + "oldfieldname": "currency", + "oldfieldtype": "Select", + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Rate at which Customer Currency is converted to customer's base currency", - "fieldname": "conversion_rate", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Exchange Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Rate at which Customer Currency is converted to customer's base currency", + "fieldname": "conversion_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Exchange Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" }, { @@ -1304,6 +1345,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1334,6 +1376,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1365,6 +1408,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1394,6 +1438,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1425,6 +1470,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1456,6 +1502,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1488,6 +1535,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1518,6 +1566,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1548,6 +1597,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1577,6 +1627,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1609,6 +1660,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1640,6 +1692,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1671,6 +1724,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1699,6 +1753,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1730,6 +1785,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1762,6 +1818,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1790,6 +1847,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1821,6 +1879,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1851,6 +1910,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1881,6 +1941,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1912,6 +1973,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1944,6 +2006,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1972,6 +2035,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2003,6 +2067,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2031,6 +2096,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2063,6 +2129,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2093,6 +2160,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2123,6 +2191,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2151,6 +2220,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2183,6 +2253,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2212,6 +2283,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2242,6 +2314,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2273,6 +2346,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2305,6 +2379,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2336,6 +2411,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2364,6 +2440,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2394,6 +2471,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2424,6 +2502,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2455,6 +2534,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2487,6 +2567,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2518,6 +2599,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2550,6 +2632,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2582,6 +2665,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2611,6 +2695,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -2644,6 +2729,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2675,6 +2761,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2707,6 +2794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2738,6 +2826,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2770,6 +2859,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2802,6 +2892,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2834,6 +2925,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2865,6 +2957,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2897,6 +2990,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2928,6 +3022,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2960,6 +3055,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2992,6 +3088,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3024,6 +3121,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3057,6 +3155,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3089,6 +3188,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3118,6 +3218,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3149,6 +3250,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3178,6 +3280,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3211,6 +3314,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3240,6 +3344,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3272,6 +3377,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3301,6 +3407,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3333,6 +3440,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3365,6 +3473,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3396,6 +3505,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -3428,6 +3538,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3459,6 +3570,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3489,6 +3601,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3519,6 +3632,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3550,6 +3664,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3581,6 +3696,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3613,6 +3729,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3645,6 +3762,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3676,6 +3794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3706,6 +3825,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3738,6 +3858,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3768,6 +3889,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3797,6 +3919,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3829,6 +3952,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3860,6 +3984,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "inter_company_invoice_reference", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inter Company Invoice Reference", + "length": 0, + "no_copy": 0, + "options": "Purchase Invoice", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3891,6 +4048,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3924,6 +4082,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3952,6 +4111,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -3985,6 +4145,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4017,6 +4178,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4048,6 +4210,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4081,6 +4244,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4112,6 +4276,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4146,6 +4311,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4176,6 +4342,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4206,6 +4373,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4235,6 +4403,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4266,6 +4435,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4298,6 +4468,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4330,6 +4501,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4359,6 +4531,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -4391,6 +4564,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4423,6 +4597,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4453,6 +4628,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4485,6 +4661,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4515,6 +4692,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4546,6 +4724,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4577,6 +4756,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4606,6 +4786,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4637,6 +4818,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4668,6 +4850,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -4698,6 +4881,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -4713,7 +4897,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-03-16 15:19:54.711885", + "modified": "2018-04-19 15:46:45.766533", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -4722,7 +4906,6 @@ "permissions": [ { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -4742,7 +4925,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -4762,7 +4944,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -4782,7 +4963,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -4812,4 +4992,4 @@ "title_field": "title", "track_changes": 1, "track_seen": 1 -} +} \ No newline at end of file From 0bd987ab03888fbadbc603d766f4d7c7c7703ee5 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:14:40 +0530 Subject: [PATCH 038/154] validations before routing to invoice --- .../purchase_invoice/purchase_invoice.js | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 39f80396e3..af6839031a 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -92,12 +92,56 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ }) }, __("Get items from")); } - this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted==="Yes"); + + var me = this; + if (doc.docstatus == 1 && !doc.inter_company_invoice_reference) { + frappe.model.with_doc("Supplier", me.frm.doc.supplier, function() { + var supplier = frappe.model.get_doc("Supplier", me.frm.doc.supplier); + var internal = supplier.is_internal_supplier; + if (internal == 1) { + me.frm.add_custom_button("Inter Company Invoice", function() { + me.validate_inter_company_invoice(me.frm); + }, __("Make")); + } + }); + } }, supplier: function() { var me = this; + let internal; + frappe.db.get_value('Supplier', {name: this.frm.doc.supplier}, 'is_internal_supplier', (r) => { + if (r) { + internal = r.is_internal_supplier; + } + if (internal == 1) { + frappe.call({ + method:"erpnext.accounts.doctype.sales_invoice.sales_invoice.get_allowed_companies", + args: {supplier: this.frm.doc.supplier}, + callback: function(r){ + if (r.message){ + if (me.frm.doc.company) { + me.frm.set_value("company", r.message[0]); + } + me.frm.set_query('company', function() { + return { + "filters": {"name": ["in", r.message]} + } + } + ); + } + } + }); + } + else { + me.frm.set_query('company', function(){ + return { + "filters": {"name": ["like", "%" + "" + "%"]} + } + }); + } + }); if(this.frm.updating_party_details) return; erpnext.utils.get_party_details(this.frm, "erpnext.accounts.party.get_party_details", @@ -132,6 +176,25 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ }); } }, + validate_inter_company_invoice: function(frm) { + var me = this; + frappe.call({ + method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice", + args: {"doc": frm.doc}, + callback: function(r) { + if (r && r.message) { + me.make_inter_company_invoice(frm); + } + } + }); + }, + + make_inter_company_invoice: function(frm) { + frappe.model.open_mapped_doc({ + method: "erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_inter_company_sales_invoice", + frm: frm + }); + }, is_paid: function() { hide_fields(this.frm.doc); From 99ae0439d7bbb9e097cc999faf954b12dc1d1bc0 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:15:15 +0530 Subject: [PATCH 039/154] mapping of relevant fields --- .../purchase_invoice/purchase_invoice.py | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index d7e14e1f6c..66515e3452 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -73,6 +73,7 @@ class PurchaseInvoice(BuyingController): self.validate_fixed_asset_account() self.create_remarks() self.set_status() + self.validate_inter_company_supplier() def validate_cash(self): if not self.cash_bank_account and flt(self.paid_amount): @@ -119,6 +120,21 @@ class PurchaseInvoice(BuyingController): self.party_account_currency = account.account_currency + def validate_inter_company_supplier(self): + if frappe.db.get_value("Supplier", self.supplier, "is_internal_supplier") == 1: + if self.inter_company_invoice_reference: + doc = frappe.get_doc("Sales Invoice", self.inter_company_invoice_reference) + if not frappe.db.get_value("Supplier", {"represents_company": doc.company}, "name") == self.supplier: + frappe.throw(_("Invalid Supplier for Inter Company Invoice")) + if not frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company") == self.company: + frappe.throw(_("Invalid Company for Inter Company Invoice")) + else: + companies = frappe.db.sql("""select company from `tabAllowed To Transact With` + where parenttype = "Supplier" and parent = '{0}'""".format(self.supplier), as_list = 1) + companies = [company[0] for company in companies] + if not self.company in companies: + frappe.throw(_("Supplier not allowed to transact with {0}. Please change the Company.").format(self.company)) + def check_for_closed_status(self): check_list = [] @@ -303,6 +319,12 @@ class PurchaseInvoice(BuyingController): self.update_project() self.update_fixed_asset() + self.update_linked_invoice() + + def update_linked_invoice(self): + if self.inter_company_invoice_reference: + frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\ + "inter_company_invoice_reference", self.name) def update_fixed_asset(self): for d in self.get("items"): @@ -635,6 +657,8 @@ class PurchaseInvoice(BuyingController): self.update_fixed_asset() frappe.db.set(self, 'status', 'Cancelled') + self.unlink_inter_company_invoice() + def update_project(self): project_list = [] for d in self.items: @@ -672,6 +696,13 @@ class PurchaseInvoice(BuyingController): pi = pi[0][0] frappe.throw(_("Supplier Invoice No exists in Purchase Invoice {0}".format(pi))) + def unlink_inter_company_invoice(self): + if self.inter_company_invoice_reference: + frappe.db.set_value("Purchase Invoice", self.name,\ + "inter_company_invoice_reference", "") + frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\ + "inter_company_invoice_reference", "") + def update_billing_status_in_pr(self, update_modified=True): updated_pr = [] for d in self.get("items"): @@ -733,4 +764,9 @@ def make_stock_entry(source_name, target_doc=None): } }, target_doc) - return doc \ No newline at end of file + return doc + +@frappe.whitelist() +def make_inter_company_sales_invoice(source_name, target_doc=None): + from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_invoice + return make_inter_company_invoice("Purchase Invoice", source_name, target_doc) \ No newline at end of file From 79584b1cbd6ecdbbc0e4a0ea6d30075ead459761 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:15:40 +0530 Subject: [PATCH 040/154] validations to check price list and currencies --- .../purchase_invoice/purchase_invoice.json | 165 +++++++++++++++++- 1 file changed, 159 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index d707436077..e136a1dbad 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -41,6 +41,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 1, + "translatable": 0, "unique": 0 }, { @@ -105,6 +107,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -138,6 +141,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -169,6 +173,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -200,6 +205,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -230,6 +236,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -259,6 +266,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -290,6 +298,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -322,6 +331,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -353,6 +363,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "100px" }, @@ -385,6 +396,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -417,6 +429,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -448,6 +461,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -480,6 +494,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -509,6 +524,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -540,6 +556,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -571,6 +588,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -602,6 +620,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -634,6 +653,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -664,6 +684,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -694,6 +715,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -724,6 +746,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -754,6 +777,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -783,6 +807,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -812,6 +837,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -841,6 +867,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -870,6 +897,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -902,6 +930,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -932,6 +961,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -962,6 +992,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -994,6 +1025,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1027,6 +1059,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1055,6 +1088,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1085,6 +1119,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1115,6 +1150,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1145,6 +1181,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1174,6 +1211,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1205,6 +1243,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1236,6 +1275,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1268,6 +1308,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1296,6 +1337,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1327,6 +1369,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1360,6 +1403,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1388,6 +1432,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1419,6 +1464,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1451,6 +1497,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1481,6 +1528,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1512,6 +1560,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1544,6 +1593,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1573,6 +1623,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1604,6 +1655,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1633,6 +1685,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1665,6 +1718,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1695,6 +1749,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1725,6 +1780,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1756,6 +1812,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1788,6 +1845,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1820,6 +1878,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1852,6 +1911,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1881,6 +1941,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1913,6 +1974,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1945,6 +2007,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1976,6 +2039,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2007,6 +2071,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2039,6 +2104,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2070,6 +2136,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2099,6 +2166,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2129,6 +2197,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2160,6 +2229,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2189,6 +2259,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2221,6 +2292,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2252,6 +2324,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2284,6 +2357,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2316,6 +2390,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2345,6 +2420,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -2378,6 +2454,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2409,6 +2486,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2441,6 +2519,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2472,6 +2551,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2504,6 +2584,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2536,6 +2617,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2567,6 +2649,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2599,6 +2682,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2630,6 +2714,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2661,6 +2746,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2690,6 +2776,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2722,6 +2809,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2753,6 +2841,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2785,6 +2874,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2815,6 +2905,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2846,6 +2937,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2875,6 +2967,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2906,6 +2999,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2937,6 +3031,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2969,6 +3064,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3000,6 +3096,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3032,6 +3129,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3063,6 +3161,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3094,6 +3193,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3125,6 +3225,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3156,6 +3257,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3186,6 +3288,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3215,6 +3318,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3245,6 +3349,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3277,6 +3382,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3309,6 +3415,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50px" }, @@ -3341,6 +3448,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3371,6 +3479,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3402,6 +3511,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3434,6 +3544,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3464,6 +3575,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3495,6 +3607,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3528,6 +3641,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3559,6 +3673,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3593,6 +3708,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3624,6 +3740,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3652,6 +3769,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3684,6 +3802,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "inter_company_invoice_reference", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inter Company Invoice Reference", + "length": 0, + "no_copy": 0, + "options": "Sales Invoice", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3715,6 +3866,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3747,6 +3899,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3777,6 +3930,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3808,6 +3962,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3839,6 +3994,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3868,6 +4024,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -3899,6 +4056,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -3914,7 +4072,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-01-11 14:44:22.982512", + "modified": "2018-04-19 15:48:29.457594", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -3923,7 +4081,6 @@ "permissions": [ { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 0, @@ -3943,7 +4100,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3963,7 +4119,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -3983,7 +4138,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -4003,7 +4157,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From c804f424ab7161cef8f982c0afb427711622c6a0 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:20:02 +0530 Subject: [PATCH 041/154] update reference fields on both invoices --- .../doctype/sales_invoice/sales_invoice.py | 133 +++++++++++++++++- 1 file changed, 131 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 78dcee9fb8..acd455eb33 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe, erpnext +import frappe, erpnext, json import frappe.defaults from frappe.utils import cint, flt from frappe import _, msgprint, throw @@ -73,6 +73,7 @@ class SalesInvoice(SellingController): self.validate_account_for_change_amount() self.validate_fixed_asset() self.set_income_account_for_fixed_assets() + self.validate_inter_company_customer() if cint(self.is_pos): self.validate_pos() @@ -146,11 +147,32 @@ class SalesInvoice(SellingController): update_company_current_month_sales(self.company) self.update_project() + self.update_linked_invoice() def validate_pos_paid_amount(self): if len(self.payments) == 0 and self.is_pos: frappe.throw(_("At least one mode of payment is required for POS invoice.")) + def validate_inter_company_customer(self): + if frappe.db.get_value("Customer", self.customer, "is_internal_customer") == 1: + if self.inter_company_invoice_reference: + doc = frappe.get_doc("Purchase Invoice", self.inter_company_invoice_reference) + if not frappe.db.get_value("Customer", {"represents_company": doc.company}, "name") == self.customer: + frappe.throw(_("Invalid Customer for Inter Company Invoice")) + if not frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") == self.company: + frappe.throw(_("Invalid Company for Inter Company Invoice")) + else: + companies = frappe.db.sql("""select company from `tabAllowed To Transact With` + where parenttype = "Customer" and parent = '{0}'""".format(self.customer), as_list = 1) + companies = [company[0] for company in companies] + if not self.company in companies: + frappe.throw(_("Customer not allowed to transact with {0}. Please change the Company.").format(self.company)) + + def update_linked_invoice(self): + if self.inter_company_invoice_reference: + frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\ + "inter_company_invoice_reference", self.name) + def before_cancel(self): self.update_time_sheet(None) @@ -186,6 +208,8 @@ class SalesInvoice(SellingController): update_company_current_month_sales(self.company) self.update_project() + self.unlink_inter_company_invoice() + def update_status_updater_args(self): if cint(self.update_stock): self.status_updater.extend([{ @@ -336,7 +360,7 @@ class SalesInvoice(SellingController): for item in self.get("items"): if item.get('item_code'): for fname, val in get_pos_profile_item_details(pos, - frappe._dict(item.as_dict()), pos, True).items(): + frappe._dict(item.as_dict()), pos).items(): if (not for_validate) or (for_validate and not item.get(fname)): item.set(fname, val) @@ -907,6 +931,13 @@ class SalesInvoice(SellingController): project.update_billed_amount() project.save() + def unlink_inter_company_invoice(self): + if self.inter_company_invoice_reference: + frappe.db.set_value("Sales Invoice", self.name,\ + "inter_company_invoice_reference", "") + frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\ + "inter_company_invoice_reference", "") + def verify_payment_amount_is_positive(self): for entry in self.payments: if entry.amount < 0: @@ -992,3 +1023,101 @@ def set_account_for_mode_of_payment(self): for data in self.payments: if not data.account: data.account = get_bank_cash_account(data.mode_of_payment, self.company).get("account") + +def get_inter_company_details(doc, doctype): + if doctype == "Sales Invoice": + party = frappe.db.get_value("Supplier", {"is_internal_supplier":1, "represents_company": doc.get("company")}, "name") + company = frappe.db.get_value("Customer", {"name": doc.get("customer")}, "represents_company") + else: + party = frappe.db.get_value("Customer", {"is_internal_customer":1, "represents_company": doc.get("company")}, "name") + company = frappe.db.get_value("Customer", {"name": doc.get("supplier")}, "represents_company") + + return { + "party": party, + "company": company + } + +@frappe.whitelist() +def validate_inter_company_invoice(doc): + doc = json.loads(doc) + doctype = doc.get("doctype") + details = get_inter_company_details(doc, doctype) + if doctype == "Sales Invoice": + buying = frappe.db.get_value("Price List", doc.get("selling_price_list"), "buying") + if not buying: + frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions.")) + + supplier = details.get("party") + if not supplier: + frappe.throw(_("No Supplier found for Inter Company Transactions.")) + + company = details.get("company") + default_currency = frappe.db.get_value("Company", company, "default_currency") + if default_currency != doc.get("currency"): + frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) + + else: + selling = frappe.db.get_value("Price List", doc.get("buying_price_list"), "selling") + if not selling: + frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions.")) + + customer = details.get("party") + if not customer: + frappe.throw(_("No Customer found for Inter Company Transactions.")) + + company = details.get("company") + default_currency = frappe.db.get_value("Company", company, "default_currency") + if default_currency != doc.get("currency"): + frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) + + return company + +@frappe.whitelist() +def make_inter_company_purchase_invoice(source_name, target_doc=None): + return make_inter_company_invoice("Sales Invoice", source_name, target_doc) + +def make_inter_company_invoice(doctype, source_name, target_doc=None): + from frappe.model.mapper import get_mapped_doc + if doctype == "Sales Invoice": + source_doc = frappe.get_doc("Sales Invoice", source_name) + target_doctype = "Purchase Invoice" + else: + source_doc = frappe.get_doc("Purchase Invoice", source_name) + target_doctype = "Sales Invoice" + + details = get_inter_company_details(source_doc, doctype) + + def set_missing_values(source, target): + target.run_method("set_missing_values") + + def update_details(source_doc, target_doc, source_parent): + target_doc.inter_company_invoice_reference = source_doc.name + if target_doc.doctype == "Purchase Invoice": + target_doc.company = details.get("company") + target_doc.supplier = details.get("party") + target_doc.buying_price_list = source_doc.selling_price_list + else: + target_doc.company = details.get("company") + target_doc.customer = details.get("party") + target_doc.selling_price_list = source_doc.buying_price_list + + def update_item(source_doc, target_doc, source_parent): + target_doc.income_account = "" + target_doc.expense_account = "" + target_doc.cost_center = "" + + base_doc = "Sales Invoice" + target_doctype = "Purchase Invoice" + doclist = get_mapped_doc(doctype, source_name, { + doctype: { + "doctype": target_doctype, + "postprocess": update_details + }, + doctype +" Item": { + "doctype": target_doctype + " Item", + "postprocess": update_item + } + + }, target_doc, set_missing_values) + + return doclist From b47302dd528c36d7e9660ef97a168aba48f5ea1a Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 20 Apr 2018 14:20:49 +0530 Subject: [PATCH 042/154] unlink reference on cancellation of any invoice --- .../purchase_invoice/purchase_invoice.js | 32 ------------------- .../doctype/sales_invoice/sales_invoice.js | 1 - .../doctype/sales_invoice/sales_invoice.py | 5 ++- 3 files changed, 2 insertions(+), 36 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index af6839031a..a2ea0965aa 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -110,38 +110,6 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ supplier: function() { var me = this; - let internal; - frappe.db.get_value('Supplier', {name: this.frm.doc.supplier}, 'is_internal_supplier', (r) => { - if (r) { - internal = r.is_internal_supplier; - } - if (internal == 1) { - frappe.call({ - method:"erpnext.accounts.doctype.sales_invoice.sales_invoice.get_allowed_companies", - args: {supplier: this.frm.doc.supplier}, - callback: function(r){ - if (r.message){ - if (me.frm.doc.company) { - me.frm.set_value("company", r.message[0]); - } - me.frm.set_query('company', function() { - return { - "filters": {"name": ["in", r.message]} - } - } - ); - } - } - }); - } - else { - me.frm.set_query('company', function(){ - return { - "filters": {"name": ["like", "%" + "" + "%"]} - } - }); - } - }); if(this.frm.updating_party_details) return; erpnext.utils.get_party_details(this.frm, "erpnext.accounts.party.get_party_details", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 91696c203d..8e48cc3a89 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -663,4 +663,3 @@ var calculate_total_billing_amount = function(frm) { refresh_field('total_billing_amount') } - diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index acd455eb33..7a8ee2434f 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1030,7 +1030,7 @@ def get_inter_company_details(doc, doctype): company = frappe.db.get_value("Customer", {"name": doc.get("customer")}, "represents_company") else: party = frappe.db.get_value("Customer", {"is_internal_customer":1, "represents_company": doc.get("company")}, "name") - company = frappe.db.get_value("Customer", {"name": doc.get("supplier")}, "represents_company") + company = frappe.db.get_value("Supplier", {"name": doc.get("supplier")}, "represents_company") return { "party": party, @@ -1067,6 +1067,7 @@ def validate_inter_company_invoice(doc): company = details.get("company") default_currency = frappe.db.get_value("Company", company, "default_currency") + if default_currency != doc.get("currency"): frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) @@ -1106,8 +1107,6 @@ def make_inter_company_invoice(doctype, source_name, target_doc=None): target_doc.expense_account = "" target_doc.cost_center = "" - base_doc = "Sales Invoice" - target_doctype = "Purchase Invoice" doclist = get_mapped_doc(doctype, source_name, { doctype: { "doctype": target_doctype, From ae0b31c31d3160e07a19c7d26da0bb855a9af657 Mon Sep 17 00:00:00 2001 From: Shreya Date: Mon, 23 Apr 2018 16:21:59 +0530 Subject: [PATCH 043/154] changes as per the reviews --- .../purchase_invoice/purchase_invoice.js | 17 +-- .../purchase_invoice/purchase_invoice.py | 35 +---- .../doctype/sales_invoice/sales_invoice.js | 22 +-- .../doctype/sales_invoice/sales_invoice.py | 126 +++++++++--------- 4 files changed, 75 insertions(+), 125 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index a2ea0965aa..e7fdd64a6d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -99,9 +99,10 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ frappe.model.with_doc("Supplier", me.frm.doc.supplier, function() { var supplier = frappe.model.get_doc("Supplier", me.frm.doc.supplier); var internal = supplier.is_internal_supplier; - if (internal == 1) { + var disabled = supplier.disabled; + if (internal == 1 && disabled == 0) { me.frm.add_custom_button("Inter Company Invoice", function() { - me.validate_inter_company_invoice(me.frm); + me.make_inter_company_invoice(me.frm); }, __("Make")); } }); @@ -144,18 +145,6 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ }); } }, - validate_inter_company_invoice: function(frm) { - var me = this; - frappe.call({ - method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice", - args: {"doc": frm.doc}, - callback: function(r) { - if (r && r.message) { - me.make_inter_company_invoice(frm); - } - } - }); - }, make_inter_company_invoice: function(frm) { frappe.model.open_mapped_doc({ diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 66515e3452..67b41a3248 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -17,6 +17,8 @@ from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt from erpnext.buying.utils import check_for_closed_status from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center from frappe.model.mapper import get_mapped_doc +from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\ + unlink_inter_company_invoice form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -73,7 +75,7 @@ class PurchaseInvoice(BuyingController): self.validate_fixed_asset_account() self.create_remarks() self.set_status() - self.validate_inter_company_supplier() + validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_invoice_reference) def validate_cash(self): if not self.cash_bank_account and flt(self.paid_amount): @@ -120,21 +122,6 @@ class PurchaseInvoice(BuyingController): self.party_account_currency = account.account_currency - def validate_inter_company_supplier(self): - if frappe.db.get_value("Supplier", self.supplier, "is_internal_supplier") == 1: - if self.inter_company_invoice_reference: - doc = frappe.get_doc("Sales Invoice", self.inter_company_invoice_reference) - if not frappe.db.get_value("Supplier", {"represents_company": doc.company}, "name") == self.supplier: - frappe.throw(_("Invalid Supplier for Inter Company Invoice")) - if not frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company") == self.company: - frappe.throw(_("Invalid Company for Inter Company Invoice")) - else: - companies = frappe.db.sql("""select company from `tabAllowed To Transact With` - where parenttype = "Supplier" and parent = '{0}'""".format(self.supplier), as_list = 1) - companies = [company[0] for company in companies] - if not self.company in companies: - frappe.throw(_("Supplier not allowed to transact with {0}. Please change the Company.").format(self.company)) - def check_for_closed_status(self): check_list = [] @@ -319,12 +306,7 @@ class PurchaseInvoice(BuyingController): self.update_project() self.update_fixed_asset() - self.update_linked_invoice() - - def update_linked_invoice(self): - if self.inter_company_invoice_reference: - frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\ - "inter_company_invoice_reference", self.name) + update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference) def update_fixed_asset(self): for d in self.get("items"): @@ -657,7 +639,7 @@ class PurchaseInvoice(BuyingController): self.update_fixed_asset() frappe.db.set(self, 'status', 'Cancelled') - self.unlink_inter_company_invoice() + unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference) def update_project(self): project_list = [] @@ -696,13 +678,6 @@ class PurchaseInvoice(BuyingController): pi = pi[0][0] frappe.throw(_("Supplier Invoice No exists in Purchase Invoice {0}".format(pi))) - def unlink_inter_company_invoice(self): - if self.inter_company_invoice_reference: - frappe.db.set_value("Purchase Invoice", self.name,\ - "inter_company_invoice_reference", "") - frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\ - "inter_company_invoice_reference", "") - def update_billing_status_in_pr(self, update_modified=True): updated_pr = [] for d in self.get("items"): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 8e48cc3a89..77babf41f5 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -106,9 +106,10 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte frappe.model.with_doc("Customer", me.frm.doc.customer, function() { var customer = frappe.model.get_doc("Customer", me.frm.doc.customer); var internal = customer.is_internal_customer; - if (internal == 1) { + var disabled = customer.disabled; + if (internal == 1 && disabled == 0) { me.frm.add_custom_button("Inter Company Invoice", function() { - me.validate_inter_company_invoice(me.frm); + me.make_inter_company_invoice(); }, __("Make")); } }); @@ -239,24 +240,11 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte me.apply_pricing_rule(); }) }, - - validate_inter_company_invoice: function(frm) { - var me = this; - frappe.call({ - method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice", - args: {"doc": frm.doc}, - callback: function(r) { - if (r && r.message) { - me.make_inter_company_invoice(frm); - } - } - }); - }, - make_inter_company_invoice: function(frm) { + make_inter_company_invoice: function() { frappe.model.open_mapped_doc({ method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_inter_company_purchase_invoice", - frm: frm + frm: me.frm }); }, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 7a8ee2434f..115cf14119 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -73,7 +73,7 @@ class SalesInvoice(SellingController): self.validate_account_for_change_amount() self.validate_fixed_asset() self.set_income_account_for_fixed_assets() - self.validate_inter_company_customer() + validate_inter_company_party(self.doctype, self.customer, self.company, self.inter_company_invoice_reference) if cint(self.is_pos): self.validate_pos() @@ -147,32 +147,12 @@ class SalesInvoice(SellingController): update_company_current_month_sales(self.company) self.update_project() - self.update_linked_invoice() + update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference) def validate_pos_paid_amount(self): if len(self.payments) == 0 and self.is_pos: frappe.throw(_("At least one mode of payment is required for POS invoice.")) - def validate_inter_company_customer(self): - if frappe.db.get_value("Customer", self.customer, "is_internal_customer") == 1: - if self.inter_company_invoice_reference: - doc = frappe.get_doc("Purchase Invoice", self.inter_company_invoice_reference) - if not frappe.db.get_value("Customer", {"represents_company": doc.company}, "name") == self.customer: - frappe.throw(_("Invalid Customer for Inter Company Invoice")) - if not frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") == self.company: - frappe.throw(_("Invalid Company for Inter Company Invoice")) - else: - companies = frappe.db.sql("""select company from `tabAllowed To Transact With` - where parenttype = "Customer" and parent = '{0}'""".format(self.customer), as_list = 1) - companies = [company[0] for company in companies] - if not self.company in companies: - frappe.throw(_("Customer not allowed to transact with {0}. Please change the Company.").format(self.company)) - - def update_linked_invoice(self): - if self.inter_company_invoice_reference: - frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\ - "inter_company_invoice_reference", self.name) - def before_cancel(self): self.update_time_sheet(None) @@ -208,7 +188,7 @@ class SalesInvoice(SellingController): update_company_current_month_sales(self.company) self.update_project() - self.unlink_inter_company_invoice() + unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference) def update_status_updater_args(self): if cint(self.update_stock): @@ -931,18 +911,48 @@ class SalesInvoice(SellingController): project.update_billed_amount() project.save() - def unlink_inter_company_invoice(self): - if self.inter_company_invoice_reference: - frappe.db.set_value("Sales Invoice", self.name,\ - "inter_company_invoice_reference", "") - frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\ - "inter_company_invoice_reference", "") def verify_payment_amount_is_positive(self): for entry in self.payments: if entry.amount < 0: frappe.throw(_("Row #{0} (Payment Table): Amount must be positive").format(entry.idx)) +def validate_inter_company_party(doctype, party, company, inter_company_invoice_reference): + if doctype == "Sales Invoice": + partytype, ref_partytype, internal = "Customer", "Supplier", "is_internal_customer" + ref_doc = "Purchase Invoice" + else: + partytype, ref_partytype, internal = "Supplier", "Customer", "is_internal_supplier" + ref_doc = "Sales Invoice" + + if inter_company_invoice_reference: + doc = frappe.get_doc(ref_doc, inter_company_invoice_reference) + ref_party = doc.supplier if doctype == "Sales Invoice" else doc.customer + if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party: + frappe.throw(_("Invalid {0} for Inter Company Invoice.").format(partytype)) + if not frappe.db.get_value(ref_partytype, {"name": ref_party}, "represents_company") == company: + frappe.throw(_("Invalid Company for Inter Company Invoice.")) + + elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party: + companies = frappe.db.sql("""select company from `tabAllowed To Transact With` + where parenttype = '{0}' and parent = '{1}'""".format(partytype, party), as_list = 1) + companies = [d[0] for d in companies] + if not company in companies: + frappe.throw(_("{0} not allowed to transact with {1}. Please change the Company.").format(partytype, company)) + +def update_linked_invoice(doctype, name, inter_company_invoice_reference): + if inter_company_invoice_reference: + frappe.db.set_value(doctype, inter_company_invoice_reference,\ + "inter_company_invoice_reference", name) + +def unlink_inter_company_invoice(doctype, name, inter_company_invoice_reference): + ref_doc = "Purchase Invoice" if doctype == "Sales Invoice" else "Sales Invoice" + if inter_company_invoice_reference: + frappe.db.set_value(doctype, name,\ + "inter_company_invoice_reference", "") + frappe.db.set_value(ref_doc, inter_company_invoice_reference,\ + "inter_company_invoice_reference", "") + def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context list_context = get_list_context(context) @@ -1026,58 +1036,44 @@ def set_account_for_mode_of_payment(self): def get_inter_company_details(doc, doctype): if doctype == "Sales Invoice": - party = frappe.db.get_value("Supplier", {"is_internal_supplier":1, "represents_company": doc.get("company")}, "name") - company = frappe.db.get_value("Customer", {"name": doc.get("customer")}, "represents_company") + party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name") + company = frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company") else: - party = frappe.db.get_value("Customer", {"is_internal_customer":1, "represents_company": doc.get("company")}, "name") - company = frappe.db.get_value("Supplier", {"name": doc.get("supplier")}, "represents_company") + party = frappe.db.get_value("Customer", {"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company}, "name") + company = frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") return { "party": party, "company": company } -@frappe.whitelist() -def validate_inter_company_invoice(doc): - doc = json.loads(doc) - doctype = doc.get("doctype") + +def validate_inter_company_invoice(doc, doctype): + details = get_inter_company_details(doc, doctype) - if doctype == "Sales Invoice": - buying = frappe.db.get_value("Price List", doc.get("selling_price_list"), "buying") - if not buying: - frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions.")) + price_list = doc.selling_price_list if doctype == "Sales Invoice" else doc.buying_price_list + valid_price_list = frappe.db.get_value("Price List", {"name": price_list, "buying": 1, "selling": 1}) + if not valid_price_list: + frappe.throw(_("Selected Price List should have buying and selling fields checked.")) - supplier = details.get("party") - if not supplier: - frappe.throw(_("No Supplier found for Inter Company Transactions.")) + party = details.get("party") + if not party: + partytype = "Supplier" if doctype == "Sales Invoice" else "Customer" + frappe.throw(_("No {0} found for Inter Company Transactions.").format(partytype)) - company = details.get("company") - default_currency = frappe.db.get_value("Company", company, "default_currency") - if default_currency != doc.get("currency"): - frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) - - else: - selling = frappe.db.get_value("Price List", doc.get("buying_price_list"), "selling") - if not selling: - frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions.")) + company = details.get("company") + default_currency = frappe.db.get_value("Company", company, "default_currency") + if default_currency != doc.currency: + frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) - customer = details.get("party") - if not customer: - frappe.throw(_("No Customer found for Inter Company Transactions.")) - - company = details.get("company") - default_currency = frappe.db.get_value("Company", company, "default_currency") - - if default_currency != doc.get("currency"): - frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions.")) - - return company + return @frappe.whitelist() def make_inter_company_purchase_invoice(source_name, target_doc=None): return make_inter_company_invoice("Sales Invoice", source_name, target_doc) def make_inter_company_invoice(doctype, source_name, target_doc=None): + from frappe.model.mapper import get_mapped_doc if doctype == "Sales Invoice": source_doc = frappe.get_doc("Sales Invoice", source_name) @@ -1086,6 +1082,7 @@ def make_inter_company_invoice(doctype, source_name, target_doc=None): source_doc = frappe.get_doc("Purchase Invoice", source_name) target_doctype = "Sales Invoice" + validate_inter_company_invoice(source_doc, doctype) details = get_inter_company_details(source_doc, doctype) def set_missing_values(source, target): @@ -1106,6 +1103,7 @@ def make_inter_company_invoice(doctype, source_name, target_doc=None): target_doc.income_account = "" target_doc.expense_account = "" target_doc.cost_center = "" + target_doc.warehouse = "" doclist = get_mapped_doc(doctype, source_name, { doctype: { From 27e4e244b6dbf4ce242a2c92b380c191c06e827d Mon Sep 17 00:00:00 2001 From: Shreya Date: Wed, 2 May 2018 14:14:14 +0530 Subject: [PATCH 044/154] fix codacy --- .../allowed_to_transact_with/allowed_to_transact_with.py | 1 - erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py index c4ab3b0961..a3e4bbcd09 100644 --- a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py +++ b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.py @@ -3,7 +3,6 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document class AllowedToTransactWith(Document): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 115cf14119..17e45ac971 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe, erpnext, json +import frappe, erpnext import frappe.defaults from frappe.utils import cint, flt from frappe import _, msgprint, throw @@ -1043,7 +1043,7 @@ def get_inter_company_details(doc, doctype): company = frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") return { - "party": party, + "party": party, "company": company } @@ -1073,8 +1073,6 @@ def make_inter_company_purchase_invoice(source_name, target_doc=None): return make_inter_company_invoice("Sales Invoice", source_name, target_doc) def make_inter_company_invoice(doctype, source_name, target_doc=None): - - from frappe.model.mapper import get_mapped_doc if doctype == "Sales Invoice": source_doc = frappe.get_doc("Sales Invoice", source_name) target_doctype = "Purchase Invoice" From 6f3594b2e46d76b6969616da0203d2aaf168c8af Mon Sep 17 00:00:00 2001 From: Zarrar Date: Thu, 3 May 2018 19:00:43 +0530 Subject: [PATCH 045/154] [Enhance] GL Entry - ability to multiselect party (#13769) * change dynamic link to multiselect field and improv * print based fix * refactor changes according to multiselect changes --- .../report/general_ledger/general_ledger.html | 2 +- .../report/general_ledger/general_ledger.js | 63 ++++++++++++++----- .../report/general_ledger/general_ledger.py | 23 ++++--- erpnext/selling/doctype/customer/customer.py | 8 ++- 4 files changed, 66 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 9a2205a579..40469aecc1 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -2,7 +2,7 @@

{% if (filters.party_name) { %} {%= filters.party_name %} - {% } else if (filters.party) { %} + {% } else if (filters.party && filters.show_name) { %} {%= filters.party %} {% } else if (filters.account) { %} {%= filters.account %} diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 6438263c65..5e8f9cfc28 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -72,31 +72,60 @@ frappe.query_reports["General Ledger"] = { { "fieldname":"party", "label": __("Party"), - "fieldtype": "Dynamic Link", - "get_options": function() { + "fieldtype": "MultiSelect", + get_data: function() { + if(!frappe.query_report_filters_by_name) return; + var party_type = frappe.query_report_filters_by_name.party_type.get_value(); - var party = frappe.query_report_filters_by_name.party.get_value(); - if(party && !party_type) { + var parties = frappe.query_report_filters_by_name.party.get_value(); + if(!party_type) { frappe.throw(__("Please select Party Type first")); } - return party_type; + + const values = parties.split(/\s*,\s*/).filter(d => d); + const txt = parties.match(/[^,\s*]*$/)[0] || ''; + let data = []; + + frappe.call({ + type: "GET", + method:'frappe.desk.search.search_link', + async: false, + no_spinner: true, + args: { + doctype: frappe.query_report_filters_by_name.party_type.get_value(), + txt: txt, + filters: { + "name": ["not in", values] + } + }, + callback: function(r) { + data = r.results; + } + }); + return data; }, on_change: function() { var party_type = frappe.query_report_filters_by_name.party_type.get_value(); - var party = frappe.query_report_filters_by_name.party.get_value(); - if(!party_type || !party) { - frappe.query_report_filters_by_name.party_name.set_value(""); - return; - } - var fieldname = erpnext.utils.get_party_name(party_type) || "name"; - frappe.db.get_value(party_type, party, fieldname, function(value) { - frappe.query_report_filters_by_name.party_name.set_value(value[fieldname]); - }); + var parties = frappe.query_report_filters_by_name.party.get_value(); + const values = parties.split(/\s*,\s*/).filter(d => d); - if (party_type === "Customer" || party_type === "Supplier") { - frappe.db.get_value(party_type, party, "tax_id", function(value) { - frappe.query_report_filters_by_name.tax_id.set_value(value["tax_id"]); + if(!party_type || !parties || values.length>1) { + frappe.query_report_filters_by_name.party_name.set_value(""); + frappe.query_report_filters_by_name.tax_id.set_value(""); + return; + } else { + var party = values[0]; + frappe.query_report_filters_by_name.show_name = true; + var fieldname = erpnext.utils.get_party_name(party_type) || "name"; + frappe.db.get_value(party_type, party, fieldname, function(value) { + frappe.query_report_filters_by_name.party_name.set_value(value[fieldname]); }); + + if (party_type === "Customer" || party_type === "Supplier") { + frappe.db.get_value(party_type, party, "tax_id", function(value) { + frappe.query_report_filters_by_name.tax_id.set_value(value["tax_id"]); + }); + } } } }, diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index d6972b937a..7fd653e39b 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -20,6 +20,10 @@ def execute(filters=None): for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1): account_details.setdefault(acc.name, acc) + if filters.get('party'): + parties = str(filters.get("party")).strip() + filters.party = [d.strip() for d in parties.split(',') if d] + validate_filters(filters, account_details) validate_party(filters) @@ -57,14 +61,13 @@ def validate_party(filters): if party: if not party_type: frappe.throw(_("To filter based on Party, select Party Type first")) - elif not frappe.db.exists(party_type, party): - frappe.throw(_("Invalid {0}: {1}").format(party_type, party)) - + else: + for d in party: + if not frappe.db.exists(party_type, d): + frappe.throw(_("Invalid {0}: {1}").format(party_type, d)) def set_account_currency(filters): - if not (filters.get("account") or filters.get("party")): - return filters - else: + if filters.get("account") or (filters.get('party') and len(filters.party) == 1): filters["company_currency"] = frappe.db.get_value("Company", filters.company, "default_currency") account_currency = None @@ -73,7 +76,7 @@ def set_account_currency(filters): elif filters.get("party"): gle_currency = frappe.db.get_value( "GL Entry", { - "party_type": filters.party_type, "party": filters.party, "company": filters.company + "party_type": filters.party_type, "party": filters.party[0], "company": filters.company }, "account_currency" ) @@ -82,14 +85,14 @@ def set_account_currency(filters): account_currency = gle_currency else: account_currency = None if filters.party_type in ["Employee", "Student", "Shareholder"] else \ - frappe.db.get_value(filters.party_type, filters.party, "default_currency") + frappe.db.get_value(filters.party_type, filters.party[0], "default_currency") filters["account_currency"] = account_currency or filters.company_currency if filters.account_currency != filters.company_currency: filters["show_in_account_currency"] = 1 - return filters + return filters def get_result(filters, account_details): gl_entries = get_gl_entries(filters) @@ -151,7 +154,7 @@ def get_conditions(filters): conditions.append("party_type=%(party_type)s") if filters.get("party"): - conditions.append("party=%(party)s") + conditions.append("party in %(party)s") if not (filters.get("account") or filters.get("party") or filters.get("group_by") in ["Group by Account", "Group by Party"]): diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 78f892b990..239b5320ac 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -7,7 +7,7 @@ from frappe.model.naming import set_name_by_naming_series from frappe import _, msgprint, throw import frappe.defaults from frappe.utils import flt, cint, cstr -from frappe.desk.reportview import build_match_conditions +from frappe.desk.reportview import build_match_conditions, get_filters_cond from erpnext.utilities.transaction_base import TransactionBase from erpnext.accounts.party import validate_party_accounts, get_dashboard_info, get_timeline_data # keep this from frappe.contacts.address_and_contact import load_address_and_contact, delete_contact_and_address @@ -179,7 +179,7 @@ class Customer(TransactionBase): frappe.db.set(self, "customer_name", newdn) -def get_customer_list(doctype, txt, searchfield, start, page_len, filters): +def get_customer_list(doctype, txt, searchfield, start, page_len, filters=None): if frappe.db.get_default("cust_master_name") == "Customer Name": fields = ["name", "customer_group", "territory"] else: @@ -188,6 +188,10 @@ def get_customer_list(doctype, txt, searchfield, start, page_len, filters): match_conditions = build_match_conditions("Customer") match_conditions = "and {}".format(match_conditions) if match_conditions else "" + if filters: + filter_conditions = get_filters_cond(doctype, filters, []) + match_conditions += "{}".format(filter_conditions) + return frappe.db.sql("""select %s from `tabCustomer` where docstatus < 2 and (%s like %s or customer_name like %s) {match_conditions} From ecb9315ea1694f39301adab8a5db5257160218fd Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Thu, 3 May 2018 19:04:36 +0530 Subject: [PATCH 046/154] Inter Company Journal Entry (#13683) * rebase with enterprise_sprint * Add Inter company account checkbox in Account master * Add Inter Company Journal Entry Voucher Type in Journal Entry * Make Inter Company Journal Entry button * Dialog to select company for Inter Company Journal Entry * Map relevant fields in the Inter Company Journal Entry and reference links * Rebase * Add Documentation --- erpnext/accounts/doctype/account/account.json | 1343 +++++++++-------- .../doctype/journal_entry/journal_entry.js | 57 +- .../doctype/journal_entry/journal_entry.json | 39 +- .../doctype/journal_entry/journal_entry.py | 39 +- .../img/accounts/inter-company-jv-submit.png | Bin 0 -> 238736 bytes .../assets/img/accounts/inter-company-jv.png | Bin 0 -> 111947 bytes .../assets/img/accounts/internal-account.png | Bin 0 -> 221552 bytes .../docs/assets/img/accounts/linked-jv.png | Bin 0 -> 190552 bytes .../assets/img/accounts/select-company-jv.png | Bin 0 -> 189336 bytes .../docs/user/manual/en/accounts/index.txt | 1 + .../accounts/inter-company-journal-entry.md | 45 + 11 files changed, 859 insertions(+), 665 deletions(-) create mode 100644 erpnext/docs/assets/img/accounts/inter-company-jv-submit.png create mode 100644 erpnext/docs/assets/img/accounts/inter-company-jv.png create mode 100644 erpnext/docs/assets/img/accounts/internal-account.png create mode 100644 erpnext/docs/assets/img/accounts/linked-jv.png create mode 100644 erpnext/docs/assets/img/accounts/select-company-jv.png create mode 100644 erpnext/docs/user/manual/en/accounts/inter-company-journal-entry.md diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 7e118f0b3d..668164ca64 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -1,711 +1,738 @@ { - "allow_copy": 1, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "beta": 0, - "creation": "2013-01-30 12:49:46", - "custom": 0, - "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, + "allow_copy": 1, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "beta": 0, + "creation": "2013-01-30 12:49:46", + "custom": 0, + "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "properties", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "properties", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "account_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Account Name", - "length": 0, - "no_copy": 1, - "oldfieldname": "account_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Account Name", + "length": 0, + "no_copy": 1, + "oldfieldname": "account_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "account_number", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Account Number", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account_number", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Account Number", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "is_group", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "is_group", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Group", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "root_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Root Type", - "length": 0, - "no_copy": 0, - "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "root_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Root Type", + "length": 0, + "no_copy": 0, + "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "report_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Report Type", - "length": 0, - "no_copy": 0, - "options": "\nBalance Sheet\nProfit and Loss", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "report_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Report Type", + "length": 0, + "no_copy": 0, + "options": "\nBalance Sheet\nProfit and Loss", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.is_group==0", - "fieldname": "account_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.is_group==0", + "fieldname": "account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "inter_company_account", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inter Company Account", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "parent_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Parent Account", - "length": 0, - "no_copy": 0, - "oldfieldname": "parent_account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "parent_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Parent Account", + "length": 0, + "no_copy": 0, + "oldfieldname": "parent_account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Setting Account Type helps in selecting this Account in transactions.", - "fieldname": "account_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Account Type", - "length": 0, - "no_copy": 0, - "oldfieldname": "account_type", - "oldfieldtype": "Select", - "options": "\nAccumulated Depreciation\nBank\nCash\nChargeable\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Setting Account Type helps in selecting this Account in transactions.", + "fieldname": "account_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Account Type", + "length": 0, + "no_copy": 0, + "oldfieldname": "account_type", + "oldfieldtype": "Select", + "options": "\nAccumulated Depreciation\nBank\nCash\nChargeable\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Rate at which this tax is applied", - "fieldname": "tax_rate", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "tax_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Rate at which this tax is applied", + "fieldname": "tax_rate", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "tax_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "If the account is frozen, entries are allowed to restricted users.", - "fieldname": "freeze_account", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Frozen", - "length": 0, - "no_copy": 0, - "oldfieldname": "freeze_account", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "If the account is frozen, entries are allowed to restricted users.", + "fieldname": "freeze_account", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Frozen", + "length": 0, + "no_copy": 0, + "oldfieldname": "freeze_account", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "balance_must_be", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Balance must be", - "length": 0, - "no_copy": 0, - "options": "\nDebit\nCredit", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_must_be", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Balance must be", + "length": 0, + "no_copy": 0, + "options": "\nDebit\nCredit", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lft", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lft", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rgt", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rgt", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Old Parent", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Old Parent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-money", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-04 03:23:20.011949", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Account", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-money", + "idx": 1, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-02 11:00:34.108490", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Account", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Auditor", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Auditor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 1, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 1, + "share": 1, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "account_number", - "show_name_in_global_search": 1, - "sort_order": "ASC", - "track_changes": 1, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "account_number", + "show_name_in_global_search": 1, + "sort_order": "ASC", + "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 98f68d581a..9aa8de1f0c 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -37,6 +37,55 @@ frappe.ui.form.on("Journal Entry", { // hide /unhide fields based on currency erpnext.journal_entry.toggle_fields_based_on_currency(frm); + + if ((frm.doc.voucher_type == "Inter Company Journal Entry") && (frm.doc.docstatus == 1) && (!frm.doc.inter_company_journal_entry_reference)) { + frm.add_custom_button(__("Make Inter Company Journal Entry"), + function() { + frm.trigger("make_inter_company_journal_entry"); + } + ); + } + }, + + make_inter_company_journal_entry: function(frm) { + var d = new frappe.ui.Dialog({ + title: __("Select Company"), + fields: [ + { + 'fieldname': 'company', + 'fieldtype': 'Link', + 'label': __('Company'), + 'options': 'Company', + "get_query": function () { + return { + filters: [ + ["Company", "name", "!=", frm.doc.company] + ] + }; + }, + 'reqd': 1 + } + ], + }); + d.set_primary_action(__("Make"), function() { + d.hide(); + var args = d.get_values(); + frappe.call({ + args: { + "name": frm.doc.name, + "voucher_type": frm.doc.voucher_type, + "company": args.company + }, + method: "erpnext.accounts.doctype.journal_entry.journal_entry.make_inter_company_journal_entry", + callback: function (r) { + if (r.message) { + var doc = frappe.model.sync(r.message)[0]; + frappe.set_route("Form", doc.doctype, doc.name); + } + } + }); + }); + d.show(); }, multi_currency: function(frm) { @@ -549,9 +598,15 @@ $.extend(erpnext.journal_entry, { }, account_query: function(frm) { + var inter_company = 0; + if (frm.doc.voucher_type == "Inter Company Journal Entry") { + inter_company = 1; + } + var filters = { company: frm.doc.company, - is_group: 0 + is_group: 0, + inter_company_account: inter_company }; if(!frm.doc.multi_currency) { $.extend(filters, { diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 2ae085d8dd..886b5f1a79 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -96,7 +96,7 @@ "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", - "options": "Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry", + "options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -830,7 +830,7 @@ "no_copy": 0, "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -841,6 +841,39 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.voucher_type== \"Inter Company Journal Entry\"", + "fieldname": "inter_company_journal_entry_reference", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inter Company Journal Entry Reference", + "length": 0, + "no_copy": 0, + "options": "Journal Entry", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1520,7 +1553,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-04-16 17:34:38.429196", + "modified": "2018-05-02 11:12:55.090374", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 2e4dd832d1..91eea22464 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe, erpnext, json -from frappe.utils import cstr, flt, fmt_money, formatdate, getdate +from frappe.utils import cstr, flt, fmt_money, formatdate, getdate, nowdate from frappe import msgprint, _, scrub from erpnext.controllers.accounts_controller import AccountsController from erpnext.accounts.utils import get_balance_on, get_account_currency @@ -40,15 +40,17 @@ class JournalEntry(AccountsController): self.validate_credit_debit_note() self.validate_empty_accounts_table() self.set_account_and_party_balance() + self.validate_inter_company_accounts() if not self.title: self.title = self.get_title() def on_submit(self): self.check_credit_limit() self.make_gl_entries() - self.update_loan() self.update_advance_paid() self.update_expense_claim() + self.update_loan() + self.update_inter_company_jv() def get_title(self): return self.pay_to_recd_from or self.accounts[0].account @@ -64,6 +66,20 @@ class JournalEntry(AccountsController): for voucher_no in list(set(order_list)): frappe.get_doc(voucher_type, voucher_no).set_total_advance_paid() + def validate_inter_company_accounts(self): + if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference: + doc = frappe.get_doc("Journal Entry", self.inter_company_journal_entry_reference) + account_currency = frappe.db.get_value("Company", self.company, "default_currency") + previous_account_currency = frappe.db.get_value("Company", doc.company, "default_currency") + if account_currency == previous_account_currency: + if self.total_credit != doc.total_debit or self.total_debit != doc.total_credit: + frappe.throw(_("Total Credit/ Debit Amount should be same as linked Journal Entry")) + + def update_inter_company_jv(self): + if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference: + frappe.db.set_value("Journal Entry", self.inter_company_journal_entry_reference,\ + "inter_company_journal_entry_reference", self.name) + def on_cancel(self): from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries from erpnext.hr.doctype.salary_slip.salary_slip import unlink_ref_doc_from_salary_slip @@ -75,6 +91,7 @@ class JournalEntry(AccountsController): self.update_loan() self.unlink_advance_entry_reference() self.unlink_asset_reference() + self.unlink_inter_company_jv() def unlink_advance_entry_reference(self): for d in self.get("accounts"): @@ -97,6 +114,13 @@ class JournalEntry(AccountsController): asset.db_set("value_after_depreciation", asset.value_after_depreciation) asset.set_status() + def unlink_inter_company_jv(self): + if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference: + frappe.db.set_value("Journal Entry", self.inter_company_journal_entry_reference,\ + "inter_company_journal_entry_reference", "") + frappe.db.set_value("Journal Entry", self.name,\ + "inter_company_journal_entry_reference", "") + def validate_party(self): for d in self.get("accounts"): account_type = frappe.db.get_value("Account", d.account, "account_type") @@ -907,4 +931,13 @@ def get_average_exchange_rate(account): bank_balance_in_company_currency = get_balance_on(account, in_account_currency=False) exchange_rate = bank_balance_in_company_currency / bank_balance_in_account_currency - return exchange_rate \ No newline at end of file + return exchange_rate + +@frappe.whitelist() +def make_inter_company_journal_entry(name, voucher_type, company): + journal_entry = frappe.new_doc('Journal Entry') + journal_entry.voucher_type = voucher_type + journal_entry.company = company + journal_entry.posting_date = nowdate() + journal_entry.inter_company_journal_entry_reference = name + return journal_entry.as_dict() \ No newline at end of file diff --git a/erpnext/docs/assets/img/accounts/inter-company-jv-submit.png b/erpnext/docs/assets/img/accounts/inter-company-jv-submit.png new file mode 100644 index 0000000000000000000000000000000000000000..bde53dad701331d37ed058f8bba9afff136847da GIT binary patch literal 238736 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≶@C&K3N}yG^=Evx1z3x8&WrLdlg_@1ALM53%NTZ7yQ&_~R;j>@!fN zEo-%jOp&<_y(+szZ}}fJnN8?!FZFB7H0YbS82#07+#EQZmHYsp$Qz^+N`_M_;UC}% zdn3?AQOVj}Er%0E$5yKFv65gK-UvD-9=pz+4|DVmt3ia$8#+Guj~QAw)}R(X?!;Rm z*U3^PJv&bEYI(99;L{skJvmfJdd39NGQH)-Ps<|&-TrZJ)%pUTa(vQ}gQ*o1;kh@H z4RgPTD!aL=bq5X8ufRc#1c5gI>^1Rt-iZ7BRcq^POYd<8$ITqI z)$|D$@1$oxsy`&JK5}8Yxx8jK7R4H{yIL*K%UXnyj4_tOj0GplH;liF!%+p3}hNr}>=E@?tYvx(k zQ1)3<((1G3OuH2s^;DMXwe}o0xx{!x**%M;*KwvH_z*kK=|sn=l<#I59W;j^P8xN6 zg@*aJ21~b6@z=`|i;5I27A5VHTp8Y7>UlxDvWI(l4@(VZ^mE1`DehCVTV1?+zFMei z&ezZtp0(tfq=~n5?ov)oPoS#DC_kB>I0S9J9 zHbd9S6pB3)OuRn}A>NQ%6um5}C0QTGK1PSMX@ZfFto1iN%bzLj>S``I6K{2Gc_6A< z@}mcSS$%OsJ3^V@RuQj=sRz88q8*{#hHvon10==-UmSKt{fIYYuI34K zMQF7RsOtD%ETwoJQLCU}JwLTq5M^G$99zo`{DB1ktOmX~uE5xUX9ay2)Qec78zR-9 zztOY-J-8HrqN*FqjJWD2Tv1Nrg-#zf^NVoDySpnfhEDDFMQkZhJ&CNJT@I4OiLqS_ z+$Ci9L*21-N&M7wzR8w#bA-I))%_tNAVs?V{04VCTj&W?{8WdIdtS$DtmApl`QCS;Rf?J4m;+*W zPr5puB}`}vSBwbzXyS$lRH2ZfCNw1Uw+NmL(ARAT%$yS8$a}sHwBhfUYw~Zc8{I(Qm>vO`)cZ@!hLr0zRWt~vwf%Pbe9T_}JgR*uth6HxuM}Ut(R9Lg915#T zZNw%aG%!F`^h{w+eur;z;A?(sN7*W6bw3B6AJ0_l0!YW*eQyv@!J~2DcG#FQ=ONHG zX!l2(pieA$c{3P-YB>)T>`dXf4W`twu!Y;ZSxq7#+QYX$o3aQ+<(A5vC54MWCYh;O zpP}iF0imm;fXy4-OKrujxkPIT1Sq%gg6rp|w8;Kc-}_NQk#=kSFcpR&mQ+HU3g}i$ zuQB-rv!HPB+3SXAhQenksI-5yVRVpABsckbZ!!;S>>LxNk!=wgbOV0AG^23_Wikqm; zgB&6*yBh;N!ZsDmcsn(8bTFx16TcmRCoz&KwLG_^8WY0G7A9WL4B;+YIwq5oG^&hN z54X}vL>suI4PRYxB+X9Qsgj3^enprb&3|%)^Y`M^4Q4tLaY#}1pqa5Fd1s*$0z7b6 z)Hd>6;UyL~8H>MklC0uF?m7-tOn2Va0H#~`y{zSeUVEss-V9Ko72$uaD0aNtX2*u& zr3kuqBeJlQSP25*q_fZ*8_ zsrO>zei}t_md?woqkgrsvoXtiZ)3h%JB<*tf&E*AeBj_@%p~~0ZW~HtBlC4L@Dm9y zeOzfEqu!g5-W@tMIg4Rl6MpqP8j`iWc9IQ@*@eDTWnk}tv5zu_!B=+b8otBB_Kb9s z%YI;H`f$x)BYD80fduokWnbi|Xi&8Lma_F$il(}t)8XBk%2acu84qHzTDQQpFtQm` zVH9SXa+sroEik(bt7c*1b}b6Hl9~G)Eiu9#aUz9#!rnm{x<+u+`ruLDtoqz~wN`N2 z8iZg`v0C|bTo}zQS}4)3SMUbUu9?}&{r;G+-O_-#%YhUI69*7t#XVm*Qqn|>s}*X! zmc^DucColACY!G2SmRV2Gi+v1Nq&Z`C*9uMIi>(biejB_U&}I;*-)`ku7E|eoKy&7 zPLCLIxkQWr1JFeV4|zSp4e;)2=5*Q+zk4}&w^?)>&MR{6(8!tyD)q8p6&gKq1`LCS zo-@1m=|cBb8WzxiPZjk#Imqn5*ey*u(k9;?r4C;5)mdeA^wvG;a|5QRc`!_1gMYnLFI&gfiKMX~rlnq2jT-M(5o} zV9=Ss`?;H|jMNoDvKghTBV_c$3r?eYU;n(1kuvXevvQ?lldkKvi~UDyZTkU|iY91a zC7R7=T4BGTwAf^;gpv|E_%WOZQOF5S77SHNG)b%^)z_#r1bbkK*;`e1i2NuG0R!gm zX=!-EPU#FN6tLTsXNyFK*f*WU7CwTSy4_2UMDFqu%^3(Ijefu?iAAutM4``l`W3v) zaU(SJg7VLX&bi=wxLDm{MCuf|3ho7>ltkrFT&_g69Ou_Z<^@KF!+c zBfH0&A**9r=QE}~>9Wiyd~ZkX{+_T(m=e@{H6Y-086FTcu7Ua}#)%$l*&ByrbIyq0 z{j>7pDN2U)OC&cvf6!nTPxtf?mCbeLg0$*dJ~AvG8AQSjVpi4aTc$!Jo(;OnMd$(5 z0}sB_Q^%IwHQYVXvIb!$nz!(rNphB3vH8nKZbfu!Dks3aFv6aPouh(!(v@)BW@Y6^ zB~>~lSD2iVfbj`7(`Wi_6lnG&@kia;O~6Vu~%hMZzr#eDi zU1D!wHc0(q#bb^*6d)btpE6oXV4rr}OH+p5BgCimAs%9xECfKgCZ^QR6yUUqA4MUL z4;#w-&}};|ra%6T#w&SDe2ZNClR7kLpc_xw(bMx?zp%6j{E^p#LFrl02W4Y=%BHeF zJ?HKps?LI$sb4s%b|+A*8YNiT9PXNAv!>C|jP0~+Hfev$6^AA%JE}G?7C84b-cWRV z)GbsO%+ky>>(a8ZnVzh^f4^Ox`~8Pwua>h+`SG@>P5yKP!P>x(ubL=cUfgR%uUCA6HygJEp4^sHLdQ6sKq30 zsqJsBui;k)Yg%a9?&PLCa;DJjSf-79OLsaS2=1mf4Ev=1#>f8+9xR#5fH0=^={;wO zc4Lq)5IrDtlk_&6A!Do2u#c7UmTI!0pI&Lx;xU2uTrliux=j@`4rNxNn~VKb9@rK( zg<-u!Loe@Xx*~N9L^7CiE^#picA{B+VMVnPn^+>>&Xg|jA0i}^p|t2+t~-twzChqQ zUsj$tM)?FVON}tIYC~TnF&)WPNbsMozq~0&WQmPC?M8M#&3hizUtaBI?$gjs?0Q%{ zJ)0X-1}ZEZ0E062&<4z|O&V8_s)6sd*4YfONn}J=O;GmZ9>kZR=)W zH-4ZjBFe5hFiWWEe&o3sc7Szc%HSYEIom!d(G^?!UU-*{CcN1g{~Kn1Z9i;wQyYh# ze;fNC2939i^q__67n|6TQC^Xx(gzV}`7p{I*juo%7*&kp_qjt9EybTz{s-NrnCs_B ze^4Vf#e#>}oohxRdX1hYhU98&&nLSMZjot+^X_gr#09DMn@pVn3?`wC3&i?U8_uLJ zS7Hn@@Bqxx6mg@hLSWxBaom>lE&Ky<4LXl7Fb?L9JAOV$2T_;NNj&<#iZ>uog@Cjj z(nT%&gu2`!K&lX~Qa-m`uKliz&qG(Z(-yPfeCm@UETCE~d@{3;&X}r>qLLgk8(wsn zTP*y06obr4g+RWUhtZfe-+iK(Jt^55(z95I2cJ~1m=~e++-j))L{rb_E14-vXpEzp z7ljo{V)D&p_xm58e+CY=`t+}*2o>Ra(8U`p34(j56k#r^sFYi=GrFSE`ae3G8Pb^! zF$C`jC7ZPy)+&CWVoEM1$x*?E#q9}u4kh)NhA-M7ff2hiE+O=IS{9RTrb&h57xy8> z_7tft&-F4@wZTFABsy?-y)o-`truF^4Lpdq1q*N2M&uBI$2A;0#i$K+ z{^)7CK~TlxQcDuo6?0ZnkTX+mkH^p{0R>n=G3zc%m z05nn1T|0xlTg?B;g|@Fb!3=@sg*$JYzd?>^cX-KW_)rCSw7ztO!CFQe7fOgc)D!1_ z1cfvNZ^L{U!jtI6r9Z;mdq{H7=%#6#!Os7kFpz-fORZ3s(LSzQSrfbNxf-*ow^`=J z`N{z*6omU8ZfN~`lv$bBl81eV{ z(d`)|y!>j9s=GaCtr~XsZWWg)CE-}PL4pn18L;SYaSkQVF?(P{eV@b4md9mw-ghG{HdhAG!wa(PnYQCd zBSom~$zS2+OSd?w|BxBgid>KV1I`pi;j)9Az}G!hq!m2Kd6qbBnkuBjw)7_BE z9OlR;hxhz1MDGjD%0!~w2uOWkswxdAESoRBjc#Wt^1M z_7Q~mXyCr%uVimFBLvf9(FZ)X55#-7DvrleTqiL)1c}@d&5iJMb zc6)T@Q?t$t_4v=`DsgxFz65uAvxQ)_(%=(ZYRlDNOq;zLf;U&SN^G_v<+m3@*5XxN zk=2cQ^))UB^*digOI;)mt&i`4tK$R#l;Z}ZsL|V24+Xq8{)kPhLi9pB9Nm6v^10Cb z8mz@9O^|7>I2|i&=iO1!SS;!9(KX2zR-5vmtX`^zP+sS3de5G^WH*Jjg!`7Y6zy-< zossQVr`kfv5;%KM!p`^T4nu!kjk_EtKJx za>>;lhf28lZe+Wfew;Up8+fA5p8s=N{t;}59(Y=wdXrUR1cll$7kZ#sF)lZ&fL|k* z@95{`aMcf1W=2HSbPXFiR8cZ&(zrUi>YFwpZgyKg$T38sghdU@_=Al+^q|tW#)jr# z+FML*Z-k+!=f?CFHavu`G~wCT`0z566=e7O6ba{Sk?Db4f$;lfw!O}8*3=heHEX4@ z9gWzhLI++-2ZR+jI{x1tFoB(DIiI!AD=;6cF4%OOqVL+J&#f=*7;13`M#4Az5=_`W zljb2c)lQ4hQO<*fo10V9wNK6YeXxvC=zh>uHE2;$3rd?yBG?ywjI8goaX|NVsyPcc z;$HbUi_|#gs593y60ICo*oovCD@Gb{h$)J)5U=pyjclRx;Ffpgw5=<`TWKe!sc2OH zRKY-D%J!J1c9eOWH@H)h&nhJ3c(=!+y(&phH*a4NHWp2`7Bs=;*2K|69V*{^dXAw} zRXy!3>u71Xn`PkE0>^iI*FuZ z-?0q*B@+&l2zvHUbl!BnU|dOUalzjAc%T=WbLAz2k;103RDZ;xYplFyp%$7EAFJyst|1-s9wZ1OVS5ES46 z+psCt_TpE2*Mr(e)INW;V2%@ams$&Z;_=U-HLuVEwrB8gU8f4}F$S7{v=evS7i=lp zXf@(Ef{lwcQXM+wpuRLN>BY+w?KU_t`rIJY^z;J;&*LV0`^N1Noo#KwV*P$b$j&jG z{k>?SIvB$IoO8Unxk54&{=Tq!GgdMzCVM;v8~1?O$IHPE1g_VkWB?PT7s<$afnr_v z)_~zMrD?kZV5QxnzL#_7FoVZyFk*g;2d5Si`1APZd)ATFtg<4`E`)AdwmK&Jr z7-O$4jI~1H-F;W0wItEm9+krk*L{URf(rM$;kGtfNO%(6b~G4eddoRp=Sv4&6M9#c zd?7rmbS`*<3_TKj`Pb{&Z>5&&My(;uu-)9!VOVyR1pBX5R=vyFtughEj=NcRb-dJZ zjN2iiD?M$mtWqyat;vJfbk^AdH1M6JvEF*Nwgg^R!XD@>>{vxqYbs{vBDO-GpwMwp zFWX!DBZBL_kj_O0z`hOk1wK?W9Y_F=tf5p-a3y572-&sapBK)Q98Pvw6OgRcq6v1G$KR zdPw`Gt-6Nro|r44)7~<%`WEa9R>>*`MsUIYx0)(X-5JWgc#XU?^LuJ)-RTJzl{W${ zWt%TX3)TFgCpdjDy{LaCffR|$iNO%6js}H0>Y->WTh4}M^gd7^l97>7hNNLK>-q5- zQLHD!h2C>lo@wePJUT&EwE1_FK9No>H1x@ro9kWdw*!cU`AX|lmO|&)OYi27!lt|y zoJC=Rp>pc88GAbqE@E|+E>KVXHyX&;I0(IX!*9cI41L((+xR0MxONTGf6orqmwGJ+Gnm#i1pntpryP z`anT?WH0vIuTLVopeX?_ zksjT-X?XKDY1rYuyt&>CsxJSf>UxvTshD~RbCsk!#-1Z=E@|lTjlseX!^O>0_wIUF z@lF*+X>RjTPW!ni>K^mL{pWzb%6aD2W%ZpU%Jm>ht(~nFdQPCEmyX+d8>Tah$gv2f!CKZ()m@hpQq#M2V(V2)CPo8WBas z0<85T@5;0k5GKuF9f$}PV;NEtYFs1P_ap{l>~?L^JjEW&*WR#*kjqIS@H@;Mu$T)K zjD~tmB^rlma+`>e26hH2d{gRHPT#4lK75XG1j#zc0jz67Jj}XT2#iLsz4imj z5d7faRs+)~R=R?0Lv#bZ@_Dfu_s3KvWE(EO#QE|9h;11%bV*=j1Hz9)rD4thu^`)p z`HDMvuYK9ZY05C(F~L=AUYOY^b|;0?kham2fEuuFHbw9l!w7c|k+6dm zzyiKWvMmdKY>zsj+oIOu0__Vkw@FHb5B;zs)U5OQ?9;^9a-wgOSB~}sF#_32{izoD z`Kb6LLNb;E+H=6Wt$qxCQ5lTp2AP}$)uU+?>$^U1fJ@`@aNGub=o{IYFMP7AM2$UC zaU7H@DxnzKX|TxF2^G~~p%GKJzz+*!p&oiL#UB`B9Z*1aI&ioO4rDT~6%cc)d$E>D7_PhkFp!Q^xJZ1qNfY6tOEP4M?@eR)+=|D>CxQA5m|?Y4 zsLqy1h>PBbG`_A^#ius#?rcb9vkF3?tK38vti({)GlfBLgOp$zNL>I zD;6W-&!8|z`NkgfZ4Yj!nFDZZ*he?1YalHJSz{6*MZ@zQcrXK84nnbY)9x)jEhtIS zecIg#a+zK_dnKO-a-aVM8R)Txpv#j;8hf*U za(PJwb7`{weg;7bfzk;U%tUn!r0}}&Q~VpH*ml3wi0|gigVeMlsw!^p}S9_3>5r6rh0R94RSy?)QkVyf)ZP<)O4NKhq02=}ff0<*3?!Km%K} zL)b9JzJZ1JR1IY(0I?_Ux_A?X8L_^-&T3X8m#xPpbkPWebGeAW4#s2H=HoHM_GqjI zy`*D^hEyo|f;?`T${7-bzWe@Uju7JIy8X7LycQ>KtUfMoOc+VOVVpZK;7!KD#b zaG2DC(uEY5E=7+aEj%EV7(dOS9059oXVPa^(;cG8>A3qPbR}8=o@xzP0b3B>$@edV z84}@x2BdL3p)BXp`cMLK&Aj9JKfc#&KTjNkWQJlp<9)4V%o-f({5wQz`)44kp-O?j({tEn9 zTqI(HLT{v$$=?Sa4XplRh%0I_E-q0GrcL-0xsV2UhvK50FttP=*5y;(DooHPfaUX# zg8=7G9jmYKz^Pd=tDN!o+y4P+Y$6HlSgf|d!3g`^u9(x>MKGJ>U{ghzx>Ce*I_lk9Q=8#Y(|N(RPRYTT9k<8+?aHmOv4$Jd7c|%(CUZ&s2R` z%)6}6dmM!Gd=CZ!EB*)g%paygLe|oeWYb zj;-)RynJ(oPY46xV`Eu&&n%~ zyN%^VwK%N?vn%fPJ0*-!<#1*;jAV)ZH(XZ6|ZNXrcbdkpBr@3I-Ga zb4IL+$RE}y_0x+Cn<}RMGz)JOn_;f2_Qsm-3|cE7MDQp)aP$7`whRSOFp#MkU4P|b z4?Q_ymy#X}{-mOz@hs@qP1!#t;^Fb(WoVk<=ow<{0P_p`-{S*cz)vgb!j0^q_`Ro* zg&cU)i^GNx`ae(_jG#7o%s|NGfCRnLCfEdVS;4ok%A_d7v!O>1kb>1wb|VhBqZT2f zCK}LytB~`Q|BXZogoGuk0)o*-%^&yu_#MEPkK^ZKQ`G_u{wI9+eEsRdUl(tR+5aw| zY*wH5MomaCBRWPy7|wS4am*#Sp?}&n95GT#Vh0e^)tPI4ZecExpUmjvpDpRYin19_ zpmb;4V5>a;6z1=P$c#4+kb#Um$b7;sR0oCB%+(mQAO3haUnBA!Hdg0&KV?WL%t!eF zCXvP(#G${SpW-G0XD-}^YgMOzvo1Zb$qu5?n=5QG1>*3KO6ltEsNUnA%-;de_!?2= z;@AS*^#Ys)V{0l(A%XDVjhM;X|04_F)Xeu29-Qy%Na4S!EEoBAc<{-Pk&8dS&1U}{ z9$ez`Q>F7?ImP`6-;G<+qx#1j@TV8_GlC7G1X>M83=~lL3D{vPxnjisp*$iDD4;xn zCL}tai}HCzEM7#1{m=3|-~bOupY_@r=HGe$^XC6?pyKf}MDp0}i2Xe({FUN=A0q(& z2CzPZ{X;o_c+TIW-v7Q{%mdWCQaZcc-vaf2B<(L3-va-J2e|Y9Ll%Fa8vm95e;+IT zgkdilOZhh^``<+Uon&uc;NKAN{s*M%k2v}7QuynYB3YofOdE~j{nga}ov6QGY3C<0 z1J2JYHvU?F|LUK(REqt{Ur2J|pSXR0XXQUK%E#hU?82VOa0&C@DKE0!^yk{8M(jP| ze`jMsfhE4{52{8K$!%A2gLt(Caqobb1(HdI}!1}GqCP=z?lw@v03UDLeZJmd=qAU{@|0> zTDml!s+1u02)goYlSyN**6VnZ$v~rjw$8diOHS#xIAD2+KrKsIPC!O-G3KD8IA-=m zU}A&CLltj>u7OEI{l*3z8M?sRir3rW;Y4=e3o>B=MB_%945{yTQ+91v#<06xS}#2) z`9NXhyur}E^BF)hdS_K;&m%zmc@5+rhSntQAP8)XOVYpJnmTbiF zmml)o8y6JPy548q@?V7h!b2$KRKeiZ@@Y+K1%I8gB`8MkE_gU6`JdAGm51>845Da* zh#H7j;r}{iYa&4YEw$^DfAt}tFbZ)X-~ejLq~qW8^h=b1vH|(G2Jc$_MNWWH`d;}4 ztNo+u5A(oZr>q`X8zc}H>m>Kri25m|Sh9BDTSLDYa{fAH?O%cXFST2<{ew0BMQQo8 zK$B63V_D4jb;>M({I5d>G*SKG5&!tt|KDZ)3zuQl`hK;*sv;p_Q*(vm`EtLT#H0t>n${hB`%vCL>av~TBi}&tM+NhHGELX7O*@fmMCtEs7&j%R@jVTd zK!L8|a4LHf_6xp|PXtPK8Su@=H{yWdyZ)LSvyHPG<7Nn3MxotPe3Gg^D4yajfxhf7 z#6KSil=`bl^rxrGvDhh`)2GZ`21?Gwl}XE4${RU1vAk*#j5F6Sol%gxe2X0>3Z~Ov!=D z?9CSYTz{AtJ1O_w*YLVJo02r; z?bcafEVk+*`6WT1ulae7;HX%kKL0O4yb^-}Xfb6-c-au|^JFr{H@cx5!gHXcLG@f-d$hxnpXRIYfR=G)lqBKdx;yzd)U_h$e0LXiv>Pc7M--^ArX$u}$NfO z907c1y@rCLfi8(Cie!q?u4Z!@G3944F*9#Vb}P|BbzPr#IoaY zL_OH;{|>%s37->?DEvTb$s46mUE6IvB+4%-hLRELSAI9NbkA1(Ghy$#~&8EW!xoQ5=Mo z8A8t5FaeF97xQ@dhu6peMgV}LCXR?uz~|ef6~TbZmR7hEKTJ&79*<)S2UqU&e+pDS zrqu1w&!!yKmW{_hsXm4*4LQB}P^#GcXmFzW6?P3!Y4ahVY=G*$Un?I)v6m6S=h@lQ zl78jf=+ioJ$Z)#h_K#5~JkuHpzEl-e6@AvW>blgqH^#lhYjR@?2H8h+`D_D4V{~4L@jlhv z2t-sBn`ZBc*c=x*;=b>CI`BHte|Z1nLn?V0%x$T_>3kx&s5kOAe!XID-++DSo7DNx zfQ^A;hzI#3gjh1i4SdNoAjuCX2Cj;=WSWBttg`?23S$kEsN6{F!;cTG{zJ;8&Mgb8 zEUn;(*A0YG8YInWhh?aMj8lez!jBPk!Jgqx(^z?xH=T?1aW$=lo}MGnYu3rzeAr)z z!mysvUgnBWaaJ)*Q_pJAFo|BR5nhZ&V2U}-neg-SGbGFH_0=ZzURF#v?ngloyxzw* zwd$!E>5Uf!4AY}*RSAA^Z>ICn#c|g;4YuMZf>5~~mn;523ysG5`DCnP^l|cv;M2)- zhTz1LVOP#uh>gKuug&OX)j2)&1!22`;uyNUMRK94z~p}j6zyz2{3NK>N4zersph<9 zV(xh4Vfd=K%-h_Fs1Mt*MM>MgDXeIx-sLd1&gNRFwGqFJ2^23E^@tfqCpA#_`HQn3 zL<3=xotAmWnTZKt*H!{BGlYU((lRpM6hrffFgf4^X&r-K`9(s-c9lQkV?n@zhbq`M zixMvj%pqI{=4eP})cv`9+WVGzXqlwgi`qBJ04wuJHz>MtlRjIPqHXhu`dBX_RLOMB z?Mk7rYc9b!L_O8k|67UPU?*=LcsPb#jThB$mr`|?U%MJE<;D~p;XI3Z)9}~^^{~D0 zw)|Ro(TZg7SI8gOR}_tk2Y;YiZGMhxEbMAv1-@FxJs9?lD9Q74-uPT#6yRTepgx-N ztr-G*LD?M=>^H{h!}{PCKPCmeXw(Hk=)?~z8$KeBzxOO^F^y(5bUWzpMrKlTx>f) z#i&zu_n47EHB%u$<@>t61D*Yd8~SOj7bc~DwDZ;73)-hXWNp>4Co5{i$~BhO(5(-CNZ}7n4ovN+1nlSiJ=s z*%HBoW3aG&c#KDNf??{N3L9wz5@8}44f!HW8-Xf_@ z87BF!$!8x*U#!l1XH*2i0K-*ySE*@VR6RO9(C9mR@0^=$mAqV+-cuzkEY@+*`d=7U z_b*n&=?hcF?tUklDmh$C{$YR75(bJ_dz14zc#3zy;1)?6jjS-6n8EL5VBnQAW##cE zP{nI4rX}D&V)P8zEyiN5$ZOu|+frV|$!P^i z8M*e|43|g7sI1PZ&?Qx8&gvi_?d6$p1w^5SkxV4*0%7jGsEvH0v zH1wJc=)M$){BEx;_?B}HE~a<=D~RP(hjuAdZHoB20ZTq76B8+Sj@}AAUx)fXx8S&W z75i$di=5NpGkKUZ%4FjVuuvG0bx+>{$b9rCw|Y^H|YHKmC=A&B>4;>BEo zw&wj$TFa;PxzsuqdUyd-FHwBUP56~x?LOs3Vuh!`FHTl?FJIWcVA02>buqTtJ#$DtDRMgx6$oK@$- zY0p)RH8gAx83uiv6M1T!cNdD>(?vJZY#G&CIGp5BNcudrs{=y;P`FwbI8kCIl#G9ezH-<6Vb2HhVvlgCkKdWP$J-q1Rs{VvR zW0buS?y~e{&Zmp%ZsG*0 zB3zZXB3;Qf9H&4fe zaJ9=lyg2piy2&b$RO)$@7YXE;WXD>6KtK{J1H;yOblqwPu3FVu?By!j2y{l!399cq zaJ})yf=ApL`-|m3knqkWJaex@>EgvSy|nFj06da_?kuY#591?8ssv*9N@Jed)Nf=) zU$$`{DLWc2;m@}&@<_V`L2t~(I-aVzlOD*5x(+wXjRunYV^4) z5cfjsn-91UnzTZE?#GUZ&GC^Va{8`whQClton|nNLdvJ;4N8f_9h5BX+6;CE7kib1YV%H=5;as6QYWNPAro6!O;y6k`t%a~S#x zJ#Ms|4xKtW=PL+SoqDu#^m+prJoZ|>Jn7NA9zhMCp6wRL{EIR!sth+AUW?B&F1h^w z)AB$8*QbnkDFokT<}@>FHxhJaOr~_p<4X+Urj1u{tZbDuL5^s}I|ss1HN|*mztflq)xem8<>tfEu zO&&5mPeLt4$0>%lFVN2m4?N0-ns)cM4>;`^)n`3EzIS)gUKD6;NkXv4$#M?MV8>Hg%3m`s^{sm3Sco9-xzJq^gbvS+q?*#29p35o4*m zySUb}E5QIOt2XG5m6B1nt7i4oQB#8?d?)^At4n^C$TeqjR$98D7TYmx4$-YIFl*y7 zq(g5W1roKDH(OHZly8(Wq@EaTWS-p2G@-c?HH5)ro3F1i9iEt1zJY|xvI2Lzn=g&$ zzTe##9?x27UOotdQQtg{pL3v?GhH_N(p??jQ&4sXj$Weur@gD3#hccVg^=Su+8?V# zS8*WWoF#T{dFLk!sQ^R7V&lhllD$jL*&Kn8*2Umi$JAO4Gci3~3ejB&EN5*s9E!|>`4sKMvf4s4>y=C3UV1EHDhvdH z%+6ap4$R-U`)V6&G0)$t8m}fLZd*yDfwpb~aAYG$e)wL$a)oi-isSx--g|S3APk#p zm25Mp&v4o|RaCq-@Fl>DGNfGkY3Hz#%a5c{`duZ0894lu1gW>+7mRRjqi-6SU#HS_ zi?!(Tc#>=0I;({X(Rpm9jl>@${P5Q7jyrBprcH7C>$wnEk2>TY)O`Y*Md-et9n21 zN1oo9h*q1avXr^TQ)j6?&*ajuiw*S`C%^@vxPdV@igy6r=dA1F079j~3bS~dlP^iO zlt?-mwxj;h{r4x?*RF@+2OTnWDc6|k13gijM#p_ghvBNp-`c7n+e!&T){?V%`|NB= zNkNoDVLvi7qbE%{oqA`2;SI)KGR(Vbo$f4-H#^uJ&J|kZk1f;|uT<&}M3vdv)M(l=tPXQLRzc$1Y5NUT6U1BS@^JJITSe> ztE|@8TC{=tZt={%1WkmmOS28JvRgQ87oQ@UT;|UW!egtHAurIJ!dtjB6qVe1+l~=F zcQl$$nB3=OJ!>2z?X1U-+x2aGa+2I8+g=Viu$be8&yW{n+MjOQzOiO$qrhoN3f!Ow zbsZ~I>Zq@hypvO>GyR06L8X14HZXQ9=P2C=n3Rec zs+fF5eHa}uS0nLprZ+%6G1)NwRQJ(Y8+;>8v5O5P0u(Qf7;WJ_*VMGfT2axb*UaiS zaYGm?TNYb(*dFlH2h(4n)&SR^9wJL89VRMq<0CysQ>AEdUM6`CUQIqI+3&l# zhC*`k`#F^O9R!fJ)-N3_z$LILdC5I!^%^KG`uF*3z96CLelW`^!7slVXrzI1kREgT z87syYV{aAVq1Qmdo0GiP)h?y*I~RoXPO_bas!fbtn~OPbNx8pJHN~nmr65L=y_cd` zl?De~ls{y=DSkgH7@I*eAxkUz1H?iulD51H6nisbUTGaU)UNUOTfN>vq{ zs6`(~!tgzZOmpPd_2=DgFkbC8vKC;AeAd_h&}0+F9nL% z``A9?;N&r>KIdS;bGw0F)`4pZE`ijim0m&Dm~~=zTbz6~4PmX`8=wjsX_34usy!KQ z>~)R1g%w8#ZI0uwikeyC!%Wu4+Z(gxRc{7^+?A`Fu$kKy(z1V8VUj*SmL=EC#RD^8 z!D4MU`nN9gp%J3SYW{|@Q%a!yq@Z9<z$oWsYoj2D28N@7ALQbd z)xlllAijoU{Mo%EyVnq6-1(Y%AOs$U2#u0qg7X9`-~buICy=t{mxj%i@tM`FQcbMe zT{l+AQmhlZE{|+N!SAzv?0d5c&>Q3Nf+}__ZAqc(4zyq#8~*n;P*ZgBpWY(hvWSiv zJ@CD|w?JMF{MwU+e}zR+$=hC7x6N^M%75(e-IFHFRTqlGBxG-8Xd7xR$lV^2 ze{aFAd0eZGffv)74wGR_ok21=-76ZNn;(DvZ6v=;{nYz+_aCK^19?rm{ zeze)kkmxy*&Q18(Ff|gX1kv64MzU3GwiTD))z@MryK*SwDu@;}+Cq&yS4NN&u1PE1 zAo~ipIqresp8CC<8W;dY3Jg%XbINbK!;~B{b#ARs*IY-l`j7;Q_W{GnOW7Ud?f6B9 zs!HN`Pc|&s-1QX^?YO(>B#Zav268rox?dZ;fo5olLD;1j;WLh=cXs`Oy0_5lkeJ@t#TnI11kvO_ zWv@(9&>nAfSINa_bqa5UFJZ2Z!~#LI-Mi?HhhlhON|YQF?;gAIs=pF%mc#1MFI!v? zd74L^IM-X!sI9LQzNp;ZDebT!(tx*isFF}3CE!|z$EJ)xF-@&5xSg=6HqvT-S7%le zHaBN9_F`2xgjPeZxfA)Dfv!2?Zg+Gofx+Wa_S{_esZqRzX-3)3XAm zCC}i%O)n{gBYicA`XbZ9_l#HEt`w~TS)12AE1 z0JGNL^-U96Y?duBL|s5w^@G9X;z8XgJbaT2`&krUdYt@(^aBnUz+O_Z-b8d>LzY}y zD-wEcqfB2s0RALi-x@fRix^&@K&vn&CpvyWJ2!&9s~>uit>4Ba9huifp)}ysI`*xq zHk2G3jjA*)e+#zo&c?G@(h)3!di+|OPA4CezQnvFP+#FL2y!v}Zl zVc8rJrkAf-RFNXdd2O)&eZB(a|B?5WQF(0Hx-b?bXn;Tn?hqunTX44!Ttcwm?(XjH z4oPr#cX#*T?)oCP$nO1})7{zK`}=vv{lj>vQMJ}w(`v0LPYoaMGmzeq3WXfjPns{i z3hRRx&aC5Z6}i@AsZEGwtzI(*^Pe6l)U-|SkcVL05~5E`y_r^#hG~l` zW9ZfCwfRsc>*_A*dPk7Sfl9(uf%Adi59y5bw;>u5aDxmVdf0WM>Xyhr^TYHata!P) zv*T3J+nvgy_?kEI?5E4OIDN}y18Gei$~E$L;>+Zsw{$D2a;=AlbeSv1MGLVS(zlXk zAitW^B3smI4339g?F$5Zeeg#&duRsa1qeBQ-C}*o@abtcj;D8gTl2`LO%K^u(htzt z&Y6;p^M_`FU_EpA!)r^X_+O582bNAo_xUxYuP z5xK4O`A6w-=Kh3WgBZIkCcC-MID1{XRc_M#Wk!#2*d@p_J5G)KP(ZI2eglsV+Co|S zpmW0q-Q{?zT$P6ok&4`|0-uIoxZR?V$xUZW*6zOXGN5UIN5tqBHTq|iu6zqzoT;Xt zo!|F~b#uv%grPdx2L=TdJxxU?Fp)N%5d7*{4xTcZmY`E^<~Dlh*TK3}yh&OC5#22U zA5}EFuGqY#!g)MxlL!!8%hXC`y*N1*whgHLS;fHoEy-lGAf$dqq%nvxZmW8Y#FMYi zg;#>}-7%D*#cSU~O5t!;VF}=HGGlw|Q+EXLe%ogB5D-|8A4)=NCB(U1*d{iMB&2Ia z`)EONcU6mgZQBB4Z)*}Mc631vpKw6h3yHZJh#-s2FXBo zkm^gYM3INii4vu^FFTI;F;2x>A<8t+HlZ>*)#;W+fJOdzq!?^Vn4R<6G}cu~IV`6R zv%8lXo`B}B)eoWXQnV%zx?m$fUwT3hyfbJP%wr)I;iDQ%dw=;3bJNU< zH3P}3L{m6}J3z3>ZOQtPmrif4Cu~y=XXR!lHODbiBe$D_{V1sol5lMY&k`HSwOY%3 ztQJ#IvVKN2(b7wO4hsi^cAzh%GZ3DGZ~yl4?SMQPrj;c>qE+dUDQ$JfrV_tnE&W%b zInk5!V}#8VELw4rfY1Fa%%05RE5x~jiRLG}ZPC+;h3w7I^30K^26fW%l*r%uNbXz zPe_%;?qYERmc@PFnYPu-dlH5O9~Z2YlolylM%e9?5MZUBrM$N9#Wx=caA%Zu6rJ*o$i3@*?|K@Wut%8 zdVqi<@YG&9=9v)qm)E#(Kx1E4 z@O{!CVKP2)_ZUuxHa0~WZb&p~kJ)pc&eN)$Na(>>#KgsAt+YnotSvf% zG4HeT1A9Ooj7M9fqlb>CsiXQM(}(TH8I4qh)s(@s`+I7fSjjh7R`^$uaA$oS1k9`d_JqN9xJGD`JovTd?-Ou(DOlU za(E+tCR;{A53gsgTHbv}!%~@K?oCoZx3&6F^e+5_DHdK5LVI-#+d^X&lm!p)u|DyMKg8X_`FjXj|VZzy1}4Gx@cdB z)tH40b)<898fo@P>sysPgN7n1sk_g5;{=s4mm@N+56FcnsYE&@T=kzH8Y)b%lxdH8 zZV1m!KM2&=b+p&%j5dqGQrA5NZ}df-b~rV&Q1m&j&_nva-mZW8AqS2V)Lj;G`=-)F zrtY(r3$~iOq~qmOIaElWg`2b5Tz=}H zl4i1WGd3g}H7eI=&l@fj60|$>Wa%BM%XhBJ6s~Svqub=99y+BnU}3Vs;df&*5hE;rTm3?%YsO=}_B`oA0mlZmPrmtrd zE1-Zc35fdN4cpzP&j6vI@ z*;D`F?f_h5Jf7Gw{UQEqpJ1s1!>d^`_gHv3NihG)j)P7IwFo~Pnz+?4tfbX2(ZmeA z97)**$)o8H7wbB&CZ^rqQ+&YOlP4BuO!B8^6eU-&(~i-fdolDqFPU`3jQ|{_+C8a= zTsfZGakLttr;3YYM6BzT?YMGW#~UW+JlkEAc(^k>0XmJuZ*e_61zN2QBDlVz-=7>p zf*Pg5-c&??HPJxW%Ua11+nJiJ&Jmg3)9d9jdO)0-7j7~WIN?uWpilE3G)-TRvPC!h zV6)g1c0laU^1kiI!(L}SS+;i>jmofIHTCwmEIn<63B`M(@=P{{*xp%Mbq^WbYhT8j zjf?z!dh_J^0Aa8%WJ4cpbc|UCZsJcLBPB6WDKZy#{g>6kKBdncb2{Qq)8GYK9-3U@ z#}lOK8lWIox~7r4Hh<*1CIEFvT@UVfRPj$M)RoOT<`$6NgPO<_jt7udUc2*e2a-xfbHR%O2ck zR*_fSX=89=`Ld=!hf@Qt5A6yzFUKqO8@D%_bg%Gc!YdXfK5lBtyV0i3c~eT1<9Kom zJuzWKJ1=J%di*xEonZtIyo&k8W<(u{VU!BvWsy(a13eF;!*ynFYPi{Smb5VGv%ieV z^I%^+5YBM}Y2LW0_JrFG&EQRAxYgcB6?Dhma$+6b-6#~e)o+Vd!&LnXplYZuY`ieG zcx9$b+GBszie0tdo{zowscDqmrCqofQE)FV&%PtlT=~QS&5Q2A9!_lB|)w zt~brX>AUS`=?E98p9j<#7#*pc9u=Lzqw2JCbj@x)Krq)!cWxOp41CxY7$R_e)jp0#n0`n&(_HzUa87G$sZ|?v_Mr--Bw)*Yd!2n9{ z)ckf8ZJzl<_qE%;nJHLLfWgdXS*4+I@^YLBFSl}>u#{bdoKfnDkK1mA?o{CQyR&Eu zr#(K*)Aa^q=26bnC_O9Dde+kv62~@e#;B8H3ZM$5Xv2Ohp@SJ*HI^5K3$r;cJNofB5gqowpb|#ST zeA-;6Qym1Gc(BF6z;UkB5b-x~)q!%#G`yZ^>CTMG?D~%`aI3KU^zey+a`jfl?+4?T zMrV$x_3EL-CNj%iL>ol}3=mn}1_l|O3?dN+a7gy$(pT zv|D=KVp;3erI_>>>vbg52|14*@Obwi;9#I{xp{{u#jVCd&Np)yAJW+b>INC^FRpDD zWx{oB{-CGnatFt$H+eaZy`)=4d(vScNfs3=302*vwaM_Z>_Z%7pPlZjZ{A19y*_qj zsDmg3E4{qIGR$+RMELPwNPY9#2&-RdqASo`Qc{?uvp6d#C>~B9>GTnHdF+tzOf#XR zX7Tc`n>`(md%rkd`Kz`xYp7`IT`3rU_P3g^JD?GD`l#`NMuDt?oP(_55^eGblCAv+ zi&ll2$#_>I0^!Yh3Km^R8?1Ok*9!w66@zbabViDfsns3${?YTmg*l?rRc-hHMV!V@ z%mrjc*uRvAJPDRXJ|q+ZW#p1V4NkQe#a>S;8FSZvMpsz`r_dYuIYvQ*t{?Z!b-Qxq z3>2(Oy%YGd6;$oFnI9!1U-R$<_;A&-KYae!$IsAqxdQHb3wGhGkL2|I)F3L6$Z!}t zOwTjKRP7UWyye}bSjt^lYtmfajSJqR!8L0b!3$HYC1?5dpVCSzto8a>mm%Jk}|p5fME8eCR!sAG5i^sSm*hYjW4b#oo-v=ZJ`_ zvhh5pHk5ko(*-@;Hv+n>TrDShKFqK*)?~=$rk`}ddbHw9_!n_O^cKBejJJaO-kV2B zVpW&;V%#&nfW$nCIkN4%GYu?Fp#Jm|wpO;B()ocN751LaBX;WdmISuVikblmW9 zROKM*(q3yZF+wC$Rj(E|n|2OOqt?)hrY&X4fwRiV!Pj3Qfv=gMWAq)MvJNEab<|1* z%@^nPvXs3>M~k$=S847wv0S$QQ1!CZa+1j;O1UBqnf%M#eu2%!=z;F_dH=BV^!~4$3ANR=-JL()KOZlP1V62kwi-Ru+eh;w~dM+-x=f)fAPM^cK;OLg9) zFSdE&BV9o_2;}f($BhI>mY>(%MCIrsIkxGE1Pa7fZ{2N!s%|Z zov;OI(8lf?E^EGt_0_Ms%}+7J-mT;n_-%~Nwrd<`QqC%Oc}-`Klb70ft%N$S3PHPv z6b{A8S~cq)I>ZpWoLgCCcMTajEl(^z_`yWD`}9w|l7{$b4}U6^BLwA8R&ZZLm*J5| z1(SI5MKOANu#)!3WBT=JhDHe#JJ-q#3;Kk&Nj2*@I`6pYn@(mSF0} zHIw$?Zo;q(HqQDKU&~~$oz+usu}$IQiNs+^5t&i}mWYm;5gEEOWojUcaw}c4lv7A- zA#v-#gpxq2sy!SR{ca#g^~|)ZK_b6Z-0b-Lbojd~rt746-gWMLX!GwqxFdc9 zrQO&47{0lTSWWR3AR)D7lZ6$uJN@XL27TmK zFYh}^EG%Mwo!riYN*7tOHZ+cQlkccN{=UT)Gzh__Yvr0~YqjKOX9AbCpbmpHxGY)*Y53}E4@$XROceE7)ajeH*m4_u7&Wg4qqTX$c`<}D85CD}o#Y*@omagD9 zY-xeLuL>$j%5i-!!VNOZ?92`EwyvdHSq^yuF{zJHaW|1x>1d_0_rsCjQ;S5-8W5G+ zaKV4t6Gc@zHtTTVePxAv^&yHTpOr0(D!SK|fK7i&~1< zv=)9IeyE?c;a(pKmW|uWM3>bE>aGjcYkO(+)xW|)^(au9 z)M{X+Q!3$4B&eqK)=pUbqu-Gi*BQRJzq90m zy!N$Umu;7QImzHVTd_B$e7;SkmVvLU%+o@+a3^jJ7p&QTOc%l0pZ8y|;&9}#ceSoJr zK9(B2d_(B{zC2ghUVmvOa_uOzMPshY%PuAlftt=Br=q*N5G>M*^$kJ~0W{IfrZ=vR zRZ^D-t_yn(;0Ag)N*vvC+zSVDD&5TIq4kv^D(rgc&E_8T6(Nr7_O8{bMI|5Io6^Em zB%JHEDL?R-1bV900YJOKC%{TS>1fvyP4D@t8X#!Ul z(Ib`lhNT|f?%tH#Bt7bD{HHPv9qH+XSzF2GM^kkt)wrjoCRZqEHAah=pXV1vv)09v zsyjys4mPYVYNtP_HIna-=+$yj!RS9g5I~R+i*Ck2Ha|H~F|^bS5&AOi`_PYxg9Tk# zs(LBfad;`3%*cD;nm2})OofbUBU;wv#MaQNXcl15-hp6eziP((k_V_`O$(---LU50$l9g!pQi0HpzGzJ=!p*883} zio#$bscNIljm3*PcM`QKnwnAgZA&6U{EPT8Vy|YLHMM@;X*pug?3-sAO`Qb8t<>om3?d&Qt zyk3H)R|s`pm@`eGprn3OR9a80Ob0#Vw?uDuTrJ#?{g4w%29VZ!g{{QB_@MW_`9_5c zktBxft{DVYk)cg$Zjx*T;;^>Wj;e2QNiYuuH(*=MY3iW`;cH1>WGvQo(^ zDeIgRGBt%YiWGRh&J3=3R|wg5s8eR)a|RzBFM>s8uVGXl=f9Eoz22F^YE}VZ9EwDF zK-8iSp%3Zj4eK;sf=3AhosRc8rgs3Z1YL*5@Mk|DZICEw_ZSiwVe(r1voATZOplG* zJU#szsFl~@zV2q*jp{0@KPgpI`CVtpu9F2YX9=iuuCPI{^{g$3o@e+q0_6w2?|RCK zli=(H)Qn_%oxp9N)mbaXjZ-_zrGQki{M0I?6LgJCNTP@g`qIUZhA4@F2Ui3Jy6s# ze|qmGoYp59=2=0oU0nO=!t9}jTDmr5X_pEvs!zcX-vXiPCi5!dwfds#@#>P4g5w4w zlL8_4LL?x!N>*Pm&_|K)P`7PTHTy&xvFW9$5D)*74`eoUnyRx)YN!-PwWk2bn{4a) z6aIG_;Z<*sD9WGvX#M_b47anHXm8o_p-(RT)yjxv;ACO>f%Y7W{J#4w%wLsDF`t7~ zzfO~(_aI3aK{!svdH6xadqD3KmbkmNfJ}Aq;#7nkCyiGS!=EyJizSzr5pvuOL5nmw zo5%Ed@rR6k{j}Q%7Lg_hU+=tnBDz1)4)effMuShfXfqb`9=)*JM(+K1OsakJ z_7+ErQ8SGGg59G7g!=BzjpLZmzz^{OtGFaZ4=0gVU8cU6d%63v{#}WeuX`Cd&U_i0 zJpmeHx~6YQCFhiBvSNlrqg3u4wT!z?&OYsr^52KU2hky<}eYec{W~^{a2m(#kKN94mwHKUWLO~PKyU{ zoVA3rK|zF_B}Fw;U$d5$^>-{SMd5EQr&n7=AWmh?NxQtZ{mqCpv8h)}z>p?Cw1_c| z4ZJFKd3{Xl0*=o~RL_69GkLn>*3eX9a7FBR*uzG8en2Xu^orgD70;BaB_LkUYGxzq za%EOY8kTQEC!3DqC(`~LX83WBUlkTx7BqCPrtNp+byRBDuVHW%{@GP$AkPa{Loq)x zzM;C#Ah-7U3Ek?)gayEgDR9GGOd8cYOn*lEPj-Fpt;;y5;!e7FLpu<^sI9D;Llq}} z^=g05Q>acftp-nIG6DMV27CUU1Q-nU3L$XNe2Z2k5`{A~pT9MXo2TYSfVivFQno%? zAf%BpJlxvIn%c%RN*x;sYSz`8Ez;MEc!H>jIKbCAuF_X!PfexWO!0hUp{qRxLqc&a zbgiv(`W1#gR!>qsdS+iT73t2Zn-BW3oNEcv;vA2P1qwlkhX=-cetsEWq2KBlpUYyJql1PvmF;P?M4>Xlp6_(k5~JB&;dBA;hSu5-2QLDJ zb@?1sU#C|!#yd-!c3c%+&)`lhqSZgR{C=nG(K>@~7D<4pRvpY)zZ8BWjd<9^;TLLr zwHk6+kw|b61BSFM-#8qmb!$d0Z#NfrZ*la3Lu@M~&2JEEem$+aWJ|&?bWrE&;~tT| zAhqfbPtt!>*)D|J-AxehV41V1N&5c7E= z`fkvN4C>0weRNIU=#I>O#%R^P<-v6&H!nvGi63dyIku8MqT+;ac|v_U4sa=cJBf46 zH7W(>RC<7qE5EL+yQn ziPvzwhx;;bIV3G{gjc8$?JMzN&s;sp`-p`GV{zV;K)6%WAfo-0T7^a5w>Y*G&pI-3 z7UkS|H$IR)tg3nxXrv>76~dlGC6pK$6nf0cbg*jRVIwuvAj?WNlGv}2Iwrh5#b?dn zO?t6EQq@%6Dv#rnoa~b=m2CHQN%+Bc{$Md^K`D+Jr&)hR)~Ns}k&<53>JdC7?DHw@ zkA!P8Lq!R4LnBj#WDh~B>&KFsuMwDy#gDX}WCusi<=tc59bl?6Hvb4BQDM^rMj8HY z4r=q@U}$s4>Ix%(u9BtbCY2U+-si3D&OqD5QMt=?0}Fb;<9?1D6G9|$h$VC}vuntp z=013s@CIQr4cc!q@-wC@Z=qdalrKSNX-**e%R>AhKlv@2N3q*jLD1+$$7md*MVno7 zaX48U1U`9-hy5WIQwq&ZvrGT-4Cd#F59`eA#_}~uTyz){*@qv%^gW3gnlFvCx`g1M z$9d*?SzfIZnY6eiu9TqC5lY;=!Iy?{1@mNy;8*LO;9jNm=pg+pdQ?@~T|-#ALoKa7 z3Vd0wxQ2f0N@8yMddNWmRF5P~I$Y`gdG)sb($?sRJeOPGb5M~ln9UyN%j_6Fr1#e; z)gt{@e}uE*?U_`s@x$RFQ9U|fep_zf1wnqT_gNw=Nl3B$tBnafsh`f%a!I68j$JL@ z&qq{Z_=03^645nt)SL`%bO$Ote5^y#{i13QOHdY1FJUR3)6?mbDD4V<>3%lO#&`UQ z7c4P$M>CZl>o$w;L1;NHF~>VDy@zWKtIN``CHOuSPq!}{9vz_!CY#0IuXo9wUlNM2 z9}17v0J%M06L9)pVK0GA*TD#w+?^~%o1ey&4ZCy#N{V!A0=+1BJcIN5=UAB~c*3Jg&2soKvv?74qp}zL!2au${ej|>~jy0G+)SXK+wB?9-{ME+TJB$+Uf=aXi zp!X`U$U3@o7iN=Bq%kfnAWu9Uo~Nr-d!T5by*KAw9E}UaVSA2N{K#r+9y%8&jRvI; z%L9mt+gvxw7p3C?QE{0eg+wDGX)u4(3E6?8A5e~Q+R|FMp+GmttD3LjcjJ#ZVKWT! zpEV*^fAwS*s1@^Z*9qt%2zLu+sboWc!^I(S-y;&8PJ0=(>eUYUedpnVbMO1K!Fo>f z?nVQlNA^kZryXvZk4oWpS>^{6f-ClzZzVL#=RepMxymlsBcg)c0}(D>-E!2Qkq*j- zk!J_$icmd_q^sJoR|M@&gHay-6idx}=S0X7B(lUB3)*m3Vp=F+wQ_f@VU&Gpbge9E z#oP<^rtFO`xKYP#K+*E@7N>Pk)Z7J2xTK!A6{E@x1Er=;$eAx#4wb|7_nbRq^WHUb zSzj5Dl$1GWhzr3jC(v=g)~sAnrPmiFUob;im?YJJIUi!-R-$!@ccqaTNrbtFQ1(4p z7_PA2BD&n&p*GseK7ECrHjeQUjc*H^Rn)zhU9^)!%J!bipYD4-VkRAbS-|G_qn zy2@(sCxvQ>6cpa^*!*cd7q-&K6MTv31GLg2MzQZVH^>dO?K|W#s)j|(M72}H=JWX_ zTUPb*c zbM;XVj~2^x;R-BifX?_0J+OC_HjYd-FAiQ=%=F{Bkq^GMen;d%OsvhO*ze!k-FE;9 z57TEwQZ05{oQ=7D>z}HUIt0n4`}kx5eJ6dXo1f^Q1Oahi3c_h66dVqLKWZA>vv$7< z<@^ck@SoOA8x#kw7wApS-l~myKb#5Zy~|rI2fj~VdYf?j?R;*y#HFsmGg*Yy?%E7VmM>fb#{&0Zd@=B+wOMOoanSQbpp=k zKN??R6oZ4~M8y(`mCGMYKXpvoJH6Duqz_-WVMWr9-i=U}Wd_<`T8UxB`V0f?7(bL$ z>amn*rh$cV1F>avovYAQ3X^#@_@TXqhIfB;R zEKs;AXCHUO#FLb^rM(rOsWUnw;@o}3^}XS^ojywhW%_VhGe4f1I4X~(>{?LQu$cXa z2ovqm@Hoxxx+RQ;%tZSz1QRuS3`nYc!+yigP&}ZcSM@yH6)BxFlpJ??< zQ}LDwmOe1FWa%uBO9(EbDGcVh$#e$I7{8w9&aqDvtsqAC;cTK zo2jE)_O1_!{iV7Hj5`yYyuwFjhKY=`3wIr4F|&^-aHg}UpdW5OESynQQl80hWj z?fGeWuB6gCewmL%1VV1h=(TXpHjaGOGKz?tIe!gF0mtBQnb*xI7s;&@SoD|SDNK{OmxW{p~AIUq)3WKW$ zBd-;K=m5yol!eSF|6t_KdDKGo`V1+=S(|zuhLV$8tEMI$zJJza_J#*(6O*I7#m5%g ztFu;d8Z5lLxrZ@+C^lU#X_%!MQ-b``3VQo1l4bPoJca@m_<)>lp20du;tJUT7q`GS z?$xV+-SPIa9ut8Un?NWWX^i7p^u5 zRej|^UI>dVZqOO&TF|bj)C}a#uSGVH9^ZF1BEgi1aj^6>A}yIz3Z1`KDfGpNXx`9I z2yu1i9oqefG1*OQR2&-UbiT2xmo2j;(3yu0fmpaZD>54|vDMuP*ky)yFCa>GmJ^CA zB5ij>Hf4(8ROcd$yI?j$!7M9>U?pE_5gjm^ymk7*sc&+F+70JsQ1r=oU_r3usYlKF z0W+Myb&cr$a5X$B^=e41VYMz%W;KnarWObE=#4%oHuoL=ap(4gDP+g(ZAa`X?vMk} z%2dwrk(4}`+8_8PF2vj2FC!`7IQkMtE>CT54GkKKaVHJK5+}&A3}(n^A2>)=G%>i2 z2XVe|u3;d&y@G<~nitY1oAf_VOTRrMyD-_kN&4>8Zp#b6kL;Ue1bvc)gkbY9iQXg| z)kn9>znHl{Ii*c+aV^$e?VV2lro!Jv9WAuaV_oLv>kHvxZ zC8|+QF>EL8@vh7t**YV<6HN%DXi=Ml=`AI@O@A9J=$G`Or$F^kYP z%BjUfDcW@nqh7kBzg`tRqC}^X$b?dl-LC(Niigx^w)vn<*%^pWE2g!dp&YjbYfLhr zMgflT`hgD0LJ%Q2P#c$opxX)yGdNhziU#G9f8Qykv6%v#+4H4&1~sluYD7tf^!9OE zh@Q&NA3S@jV+Q(J4dzeg^6)C@!SK>V*DbvLmwf}ty6llFOd`>;$Je5Lz7=dVhUDJf zq&kvfU`dNdO{dmY@81pVLP4*D_ZZBnr*8Tn=n9lsqQS6If2)jGOQ)M0a6_R@l%mpNnq?A;7Upsrd=Ijq2YCj-{Q0=JrA z4!gROoZzRz%_X^qGr~U@@S1jjSV0gPX|r9u!l$y8s_&u9sU1~AIB>e`ywpveocyEh zVtuJd++?D8eNLDYd$X<={eXH_Tn)GX&)6aWnFQ5v5Dcm5t=1=E@OZGW@2IVEFT4<# zd_>BZTl3sgJL{~I24D4`<~5amX>UqmtP}G*gNwm=c=O);5p|mu{VRk|OnuTo6i0`x z#9mCvi@2=cV>I? zcf=?~gQ{}7SqEA@Sx#po85E+)gcm}IbV)-6ewxkb!S$m75dlwPqa7}4++8x1tP_g3 zP8l0GJUJ(2pwur8*!!PeaH>L09Og{cyjp4`Y9TY9FHE<`_^fj;+xW$5W%ljME_t}d zfHPDF&vR5*hE@TB05bTHe0TtFjT{%RU>rhd<+JoSMo$#utMU-ZPXL5WOfyu$6_yvP zEQ~h^2pWx8VYi`R-e!1d{Cz53a)8_`JP783q1WYq1;_Nw=^0kXNymzt`|KG2sTpqx zTWNZscDXj~ljHz1v4?=k)vum08nc*o`l~>P#hEI!x2*E=FJH9DtNY-GxqEY)=W6dB zWt;U^wdNfTj1A%$tkQnuSKf9Y83`1rfFAbnY430@{aJTAyQOc{asZBVR6_5xLoJDo z>RWGgo-4$5H6lqumRmQ3BnL2wVyNSO8E$qaOeR#67%BF%p;T$C-LTD!2>dkkmv^!lzGW8KcpnZ&y7K0ww?4$i@;_p1i zGal7R1sM6o1A>!x!TB$CwLvNjZvp1VUQkrtWh4m(BOWfk+A28W38{zUM~<1VeX^8f z-lW;vo$zRFE8+RI0Ks@3!X5^)Ck(&qRYw%%{CSM&dQRi+2FUbuwn^_Bv9stJ=Jy@$ zAy>O#p!OpJkDASeZA7mRT?h0Uqm>ZRwaSE|TenspR}O^2>;xBwWLD5zI6V>vX&7ax z8@$W>rf2qo1T;)+O#a0o$&nz^t#EPXixV;-&OW33XuVO9@Y*AhgAc@~PZ{4(@`GdW z55QrYNzpGSJ?ehUYh4xG!KpWdSo5lTb=G0Je6=Jz zXzl(Be~TORX(}7Q@cMDp(D?9!9Vl*Xy)}`-eXambivSo52^;bLu1JJKt8sJ^T08xIpmf5MQJ%h57fogs z)0aM17;fR*y?N_q*!J;IbK)P7)-qMg*-)8h%5BP@>w5TcgujDhYA-H4q7o`|kF?3p4RV>CJnnvqRDtv(Zm z0g{TqfxxM+J!M4|^gEwi`DBzgKK7nGd=6@bVL&25iuk*wmia(s@Pf8)$j!j)E z3K5*KD*Sc2lJG4nvi||?Oo!DP)0wr5SQDabjbbF1f5xeKzm}E?r<}t(FoG$$ob+WtoMhv77e?LZ~R^8u%y>D#Pos_VOrlE!51X>c2}I{xfprjTRus zN7klDW~bzxZHJZKF-rFZz$)*Vm4>2PJix+!z-eVWZ+ZUQ!*x_tJbqvh`x z|G%#Cz*+FGkmng$NB!bO6_&V$NKXSr?~bDp7hC?D4wa zjb?fu|B|nN4y|DR3^{gu%6PT>3{bZ~p~$WIjN@ndy7@W^9H&|BRMH+Iw;D3;=LFl0 z;>$G20XuHSU+)J0`eKpVzX4ntOA7$8iIbO%LjUqpR52~>@2**jUr(PP{zw4FVTEn( zW-?|E>f}L-+}!l)9+v0`=#_nMa7y>P@a{kB$U6~$+p+8FDn$;@+*XjX*|04{+&jU}CH%YEs(#$=ER34K++Dy8A>xmx1AB4C7Q74UU87_~YOMfT%i`sonD<$3u7Z4J{U1 z*c*5M6 z1}Jh#MjQEyt?Iwe&>BKDWpLs$R4DIS+*^~z;L*WKo+k9W#r^y0r_?>Llztq6#gSKt zPcE+|J_miX_%|50BY_{Xw+-Dzw&_pOOk*51or3vYP5?P_1`4&`Kfy{ z05!TruAJzK{%!2j?-mIt6RW+XKC-&yc){(qI`hPe5KM6T`hONC9?hE?!!asY6-(BUqeMVj8Vg0Mq%)h9}FY?{c zfK$KozKw1BGxBOpm=-=mQH3uN1Pq0a;{+{ywqHGhOOyqV^Iq1JTfD2 zo6HA?8Ycw!!+}l-`S%vAj0j#YtAfadAp}UvN+qMPktm)u-Bjd1%I+JP=lhn2vAD(W z0u4s00*BN9zS(@8*0OW|tXFUz@%+hj;3GVZ_d`ZAWqKp(>gnu!`A9E`MBeS9Wp}L~{fHIJjCcOTS zydlsA9zo6fBK(I?1z}fLDgFalz*ygqfG2(k#4`LMf3FbGAzQnda_zrd{WJN(0QtQX zyi~tf-OB=uP;MG7r}dvSiGUNZ#NMz6L7HC^83h6pRq2YzBL1g`GQt3Rl{*ZbzKwLBQ z@qdyipsl39JoO}$Fu$fDe_meT(xC8vR2^no;F-|q3jSwmJWVhF_mO;!XZs&j)~Mu} zRrV{gjK3aI1q3QWvq-4`_dM@k>H0TFU_q0fsl8;sw0JTF7=zhhDCw`C0O(Oi1?Y*t zVp#}!=62~kFhn5>;fsH<0|$s$DkX78$6STtLiF=ELPUtmy}*sBfoLx;u5%+Eg^pIY z0%(OG!3^jZY%-GsECtWrv0OHTtQc)f89*W;>u~ska3WZg)>q)Za{r=glyC|P3gU*2 zLgEAEvR@#CUff2dr^n9@!VP!1NuUJHq4c7H52LA+XMZCDsEi==+^d!DoJWUX`?5=i z_=_i=9>8kBQF#7E6gearSUBS110Pl6e524PXy1vdks)2FSzQf=@>RoHr1i#e3vmN7 z_Z)=HIp=s~4i6AZ-f8m(v0Q)}aUm@K>yXs4s)~fKV`C}bk9Y;bZ)|Uh$!WX&gzrp< ze!zhA7lYL;1KSRyUUme4y#ZST_q5R@|M>|B#5?dy{vq^M;1$x*u}brY;{C}AzJ3TQ z@qtc~wa?$c!4Eqc-Q=`Yr#syw;E8l; znl0c4$2s*$2>UgH2RR>@zki$BKdYN(%nMj3(L~zZ7ZbJ}sSk0eyzqn(ub+qd!YU{B zJe1C_p%%a(*nYy%Kd&FqRv8a4BxLWJKiByW3Mt`HU?Uhb#NqSy{Ww81q;44e1XRE( zb-T>6qMjX2H`KUoYCsJ*V5DeYIR4;O8X#mmX!CzDQh5vl6au~a7!1i7MEff>@q20? zKE-F@1}zDaJ_|PlE@vMQF67@4E*}A3zYQf#LNWHyK~2n!3an=#$|_gn>xMw_XGOq5 z6P>XoT80MHSSDcik2N^}M&t0N@%feXzidrZ#e>fyW>;R7PJ?xE&YbeJ0thS-wmK3~ z*`dV>0{1eIMHD}a5ir32Dn>q*7ZB7c^$N{5KPA4eWO&-_)z(cGD81i29G>*rtzS!% z0?~Y&F08qN9ZbEh7zEv78dgjvmABpPPo)J-jVEo)JMxblrn}tLnN+sjjaQo{tJW)( zH>eIM6-JzuTRATkYPB?@qi+~oL(73U$XjiR>NJv`sjEW$8w({!=eAQxtS|3DI700gLtibm27s>A4|1a z+;AK{x8n955!>&$W_(=UaK19|pnL+U{5)*IK<~4pu)R@AtULWa6&B~I9s9v5WX?H{ zb9Z8cnY7zMU%uYOteDl}n8s!dT6lO}Sa#R#*-AQAG(LEP>6~AFh zMBuqk+DcF2`o)Zvdo*!9&X^VrG*2y?BRj#hk7W$&<~-HH8;l1Qb~;a`ye4 z89-7+RdOz?tJ-JtgRDB^#(q9>9WW9TWKv&-dpbK`;JKe+VKLifrP#EWS+$ofp=y;P z4c!h}zwa-Ntm*Gt3Xfe64>XO~DN71FA1x?p(e^gxuwCS*Z8}+0wU+MdbZk#uxh$O^ zsDsn-TWAgW>aQILch8Zlq;q%7azn2LsG>miH%P@q>+r|=Nd9Ri^%?Ul^RO(KZ z?SYsK$CWt}p`WI9#rviTs#8BQSf*KQD;c;1!$mDLcH|xD#Lgh|-U-qkx)7`vxeJY+?}%~V^?Lcj>+NLh>q<-vDUtaH)<{Ld;JHmIW_s>2Z0=Ff#$938 zpbc@HT{Rrfg|HR7>6l@C$*&t}oNn~s#4x_&ls#8_>l%9GlJYep{fQNECUB>?fYTQ& zZ0fbHnN|R zO!7iMk)3xaR?~GjIMGw5D+rbH{rj2$=C7j!%kTInqKlGgzaeUqF%T)V$ZFFs>t<;y z7Ob-dUGKUk*|1+^l&bDsaON*lT`xXmxF$Ug2iAxW#L={GjUfZy5zp$L|5~iEQz*Ue z7~4J+U~>$!B(kZud37VU;V^ouq*z?}$#|CTbe(*>y4Es~N&J(dV*hyVzyXm^myo== z!Ul#6X#Z?;z%=o4$ewQeaiadKj*XCz9zSRn%b4};*dQvs1@_xxW!v*E=P8{}BQLf_ z!_-Oy8F@P^f|c?G^9_D-tqmU+hs`gIyx6`9bqLwv+2dV>cD#N-K0GKZhC6b2_r3(> z0co#}i>=l+f83#oW1FOAS^3i5cFGms82f_LTKu@eL^vwbyCj~bW_FN9b(1-kgHwct zdb!S|c^7(nBhB@|i8*4!&lse{o`3(?gKu@Gvb}IFO>KYuAbpjBf7tM|nt1Fy*vw~| zkoUcoV$u^TJ8L~h4+psl&T+cnFy``sq5FPVmokX|uvWS-YnwxR7_!UPkQa&gwJ4Yf z$?NVv4g)Acz(${fE=2fW-XP)`WB_Ee+qEkemyO`JwGULaJx2{<=@T;1TSG~oz8{mP zyAsZ*^HMOiu(V%rT?&qwAr0@@TXupWnU-R)p4vIy&0+FynvOT8ntA}eXi6I&&Pl9t z$otWXlJk0w9lP0CsJe17)5s@|Qt^x$8*jUfP02h)gLE4I;hYtF%nt&tZ1&rQf;T6Z zU5lJg;Lb=T;)8g`4naoQ+d>b+aZeA|ymrC1xH{cZ7>7M>Ew0y5=Oeoxb5E}Ury5Jx zA>0oRIwamswH5yARDa!pSa>Ut2Rb!_&$+D#BqqC+ znAby@@D*)`CDH|LvHJ2!+q$hJY})jK(R|=?ff)l!M(myAYteo($@N;ZPeHsh)|;D~ zCR4s#ribzZUqYUMdV7uGT|%g$pwB@`YECzKcuFC!%bX6_hKZMh(J^wc(1?)%JIrKVJM8<`&p+^;ce0QubYk&&>Wp-_<3lLv zgUPBLvXyn8nBk}CA1mqOZrQ*0y3h&A4};*;b~=T=rn z+W4xAW_G@XH6L>JxJaE3R?~y^Kv>tnIq0nm=y)X}c^x04cq=4s@t~MLh;iI-tp9=R z@W9)O3=H+VJs&TC_ZECC3o3!4q>xE{lM+o+F0u zOfB&1In+3TQ;dB!A7B0qDP?I0S#8*D;(tV8vMi*2Cd8)&oDxo6Mfu#RkJC zh~9-MFjmtHmFRLlM03B?iVY;pZ!y(y5Myu+(~0MOp=&AXzJGD_8E$9QsS?`}&6oQk zS3p58^r)LmXR5wQgF&PM6k6EjDIlsgvhYmF&tna>zJq?gwa@&rIedA(XB`QM`pyDs zuUpCgQ5pyqUw-GfX5A-Dpr`uw_dNdsX zJQYbY;k>f{?%g>N{gIV1oAFnqTZ>;!x>eee_>NcfZs(}fL4@O6C!d3<_NUJKAH}RF z5G^N%8gR5WP#v`1!;HAkv*<^K@_3m(yhO-SWG?_YZa9fVtOg;-|0^M|luZ#Q5v@8Kwurg&>3o44|CI)N3<+h2jf-Zf;#D7Y5%6FdXkp#!N2<-m z;j@QjxL0?YY~(8?$YQv4FWvFI)$a~CfZR&6pb`5(thEU3Sk)>sop`9(Be7D{Cw2kl zM+e72x)rA&$ZUPv^33yywOivC^DzVITB1X=pFq(ZjN@HqoBP;G%-o@zyy>nBMyKrq z^(REOR=(wg|3C2Feg8RtD09oA(-O(vdv5X3lqpvDN4z`?;ZROovt;t z6!&@y&XjeW?z-ui+vc4n$5g3x#b%+ez_ctr)YTb=@HTQ{UaEKSr?}p4JYUc@^Fi8~ z5N3{-Mu>4RL-}XVUlIL^fD*k-(n6|Z6f9P z^5M&%@BKu9M)N0@Asg{?N6hoD66pj<21`skGJ3@5bYs-I+)OGVF2#`j#XE7TiD(z4 z+=88&iWAe4q)+l*jv>&Ast1ug{ODlUBlFeXnMd94O zj>7ITHHZ&Df1BAIAKUAGAOnR6%>=A%>9Ui2SW`w}1G{}f+VWCSot2YrIt4WwW;L}w zuTs%RO&}*HDCARO(SCCk6@n^i60rS8HSxj!%*{V*q#%HP z^Ld1`N^0<(v733px7REn=#N?&vJJ0eAg16f$V@f`OD|ccqg^_ocj>Fyt=;p^^M(k&& z1IMN!9uD{>CMTOS&~vGu+ZU0ir}4xbAo1)Rd#lEk-K3BzjUoQRszdkjR)o(&T_$GK ze9UXLf6r?8U2b8OXc-35lt7`{OZM3$G~D$_u2Qk|HIzvCw$<0PZ$WeEp)yhMVMBdk zSY;~ue9WOCcx=7i_{G!83*NMT&(aeG?#&L_RATOZ;yl(`8bS%<6~&V#_T)QUf?vYM zAAzRcM4tU3!~0T~$_c$DvBXThoTJrG_p#x%P35TSISLB6wuI+NQ)u%E@%Rs!on3q3 z2!G8tCPkKSKc5`JKa1~R?u-e2l3;G^s zSCc*QV(#iDrKoPWn20h;_C~qyiRvnI2$=vue1(ob+{r^r0%z^vdEu&SxpnE2?EAPK zgH&`Jl&CkOm^EWh7pLAF?&JT?=}1NdlEf_(8?IMrNpo0WaZ0?)H1`Mc5ez+M8enGI zM})lB2-Z`&wZI19?VlP30}~lqFv8xEd3^{t)E?#aUURGT{6R}fGLHhCdS>_9$l#88 zE&LUfMdiA`5v5C)nu(YQ;6|0loY6kKK_8esml(_6Kif@gN%mAy3QmNQNUX*3t1yTh zitH=Y%(*u>+0Og$p`ERC8`l#Hj5^%Ee=@hZA1PtZ;i0)1d`ZfvY9$Vd)>B@{)Rl9R zvG}2L%U@u-r`&)eO>Mb&3UU9fbj%3vdjQM4^iC$2_wje|9r9m5*EJxPxqG=*?jIiH z;!}{{@;RVZeAPW+0&+ph)u+#1d@*9=u&hM*cxeDP);ee()Mb*>R z)}{^FJHD<*vmA+bd0m3jSvR(p8Q5@2s;D!o<`NqngNQ_zzPSo;P#8)^_t|l?gHP~tv$gS8XvXCfm zr?W~uYHbL=s;o+oE(c8@^-LI_v%dWgH2OXd@eobJbhdq{j=jcK{gdpF`A=&xSo=%Ut#?`xd62X>pg!y zt~{+Or#1MTkX@jXg4>LU_!7dvj2P=KD_~!>_Q*-5nqw^2O2+d?UyFn8$;ubY&wiJH zq$8-UyI0Xk0^aM6Fy^(MKf`?7Jbxy_IK%<;!J8;h0#@GW*luHN(|itj(Z{EHZsN`r zYfrbmfmHE0@|&KoQst0g)xA%AR94);gE*Y4ay%yBCJR6D=^N@OHZvJ-c}H{=JqI zF1{-Kl(~-=jNZq<4u3Bhw`F;o`d-EX&K@szXA=Ij%fQ!AP?=|3BdClC2F4jT22+?J z>~@^GE7W58noR28sNx79)vD&dj^*O%9BM3#83T+`$JH616OK?Yr_FfY+~?SBD>e=h z0K9ynSwIbx+oW#wO8{MC+wKn;0I3KQ0PyYE&H^*}f8g$ZmNYrQFghC+dq})>{b<%h zWYyDKw{G1Xf7s)cT--0%UT~8$ii=mwXjsoN_`dk6D@fT}J`B@9#n%6(j>lWH zI7wU|961~;+l2*C>vsJ14W-rUS2D zrfo<)#lxgNe+o_O(~C7kSXU>wPCO_X2pK<$xa7^e#OZia)m1@sp zG&pGtXis{b$d5l`&X=38y$GVY=t_-!3hJcYy)(Htz|_*XQ?r2=`$n_6`@l|r!pUn0 zfnZ_rB0d3-;`65Px6W6$VnTPNsTa;x)^*<{;h3mcI=G8%ejm>kD!oxwwR*lAO=)(Y z8no6|aAzVVHe8TMp$1|vCxfrITXEj1LDgsP6=kiJ)+4;4SH;@+n(ACuKx@X87tE*0 z{S?N`czS|EFJGQ&SIg>##omM4?SyVGyRgoImE%N2yJeEnnUK6;{KlskPn={jPcc@8 zRH+D0Jo5tIkM0!X9Ik&zZO**yh;FQ!`VeF21|g$ly4Gf*8r$6vKQujF+_`-_efC-YL;QXBXm!Y5n>cMYXzufylwT+KBk>l z0{e{41wzH<{(kZ9r&V%n|99{}d7!ZLiJ(hT*VU9yd+~xWM)7%Vj;4T8yG9-mgP>h{ z-ckMx$GDO$W>~1xf)$!k;N#?TWBheH#06tpQ~RbO=^h&NRh-v})j$e|TW7daz7|(( zO1+insC&s9hZO-=(EwsmsDFm@2fJY+ap`#IMo178R0697`p!Hnv5hwN1L)k2s#Mbn zR~w%t`)08c*S1TgMvr{1%lwpy`fu3)fJbNO90j#Q@raY6oQsXSCJ2ZgZhQ&qxGXQGVo-7j#M{!8dz41I# z#6~z!{{G~cC%!*^(X$Z4?9%=Aa^yl!p&W?_h?!@lU_iTD;z*tImLO)y2f-iY%!L2S zNKJ=xR6kvF|E%~jBB9vFpjy1jW;>Kr1crtWSLoUZE`DR45W*Pglq_UCJyJ!@El&Zd zd(BE*fqo?#6Gh$OVLbaYOXvtjq+1gO zAU6roE2rs2zl6To_PI`?e5k=m1tiL?XMvc<;e|+P_^+zk?-I0ZIYkCTgMCk=O8+PsbgF^@8 zwR_3JYeNeL2L~|+X)E+jxFO*=ByV=d1boknA3I5IedlNB{>|!#{m%QnID+$vKz21M zaV82+m~`CtDR+S+EIJevt7DW^TM7q+MALFo?&C{WG*ihqdA62U$VQvod)qrWjTere9ma)pm zJa%IwV%OlZSTIK>-D(Rjf4Wn54p&bnkWA1T*&79$|$CN6vtcqh*DyoXvvsAcE6=Uvv*xLV^wV};R;rKHF^Un z(8maug6XlTRR-hT8iNN+ciamgOZ!a<)D!8W5JAyzq+wO2m!vqVy{>SMD52)sw^lM| za4T_$`X8IQ4=oT{?;;gd7AP;of!g6}PBBa3xlcNxQ+3xork+=0yDgrdVl?2mEBR#7 zE|JAIy(l4A0_w4g|eSdG5QxGmGlH{*||uD1{%)W zL_$Z3{Hi$M@MxUGI!~QP0{7Vc0(vSSDu5We&k2q9N|^RPwdhN$h8nlqbL^Geux!Wq zkrYJkp!9VFpCHJt)E?~CIO`P^V}vRezwTm%KO|)*vVBujpbtKFsvhVO#|VG1@Skirh0A=@ z(xpg3CU|rD0~gui^?y}SE7#F7yaIklj7x9VfVz&%6o4RyMy_S80E7?XzU(C6U5HcF zCw|JScXEQu$B3%z`d%z~TiS90;CM^-6CDG#eEo9%WVJc^0c^*}*~-yn%3pb%t9;rx zuh&lHlNvA4MPHoyMdc*P!~I7ND>A01ll$uz@PV@-HER{$wuM_(uaRSIR}M!PN@v?o zk=P^-3!^m&sTzH@ct zkdBAwTKiVJSR8t<;^xWIH)Sx?NWOrTh&DB>?pqQ{XCYy>qOlIKL$+5eVfd03VUS@{ zG1DcMp50cT22oygW_IZe@6UPO6xowrygaqcjC~SpK$O^>4$)2QTe<9EGra!6Y_b;y zE9+ooD$@_-&C=&&I(AHx=z;Ft>xd}~Yje?z;z;)H?p`o|^lm;!0AUf%jTSy^c?r($ zuq2uk(lNX~Zc|zw85PqeA1cZFC<~n%@rC&N#GTJaeWs-E;F=Ccw?}~i!-YNts2=>z zLzxx^12W3QY@pg6=jHGj^a{5h(KGv?=a}a97Dgy06k==Rmgb-wEMsqC`V~Yf#KnfM@cY-8i~Lx8K9Kl z(6MO$3ygp1Bn8x#Dzr|>7ckJKow;=+-55tbjwpnXbVzgTEI!Iim^%FK)eXdu!zz_7 zzw6^oNuGNv9t(pWHevoDV1e)K;NFz=@?x#hWCidsM=H+kIKY5O#$l0VsmQ{^hgQGP zB;+TwG64TJqn**xuqV@L&)meo1)t?A?1}`dH#w9&Utp@Fv&lOz-MH3Mc#6j|Blg*K zP~6+^1X$WPAih9LC;9nH<20W1;273G&^atQq#OQis{PIOvPb};`H{`YVD^yE${U%l z61)?ec$aR<4;vku7-g%Adn*J;es5(ql(JqYxn@0qr7K>jG{G9R0qUSs7DiTHI5OOn3tH$EFzZsH-sz;8SMr5T zA(AgG{|LYZqdN)_-L&a)XJQ~uNuUvxorKGIq58IV%r(A5Csi&ThvTc}*j}u2?E8t@ zv3ov^)n3?Y)=}}6&;DF8!?|Sn7CIb+%7dUjQ2w<}F@e5vo2fx;6xQPd>I|!T8c|+* zlTEOgj?Xk*4`Lh#uInlt8Y1i);fKjPp5msP`B~r(PtZ?pcxb+JVX}w+2z^kApMrOt z)O_ip#tKck$oI%ZXbi_yu-o;33^)=L_PJ1JiGRljzO1;c$TxtEoqYw6f5eL8NB%4g|RGJtr)FyKR~(y(KVd z#CaxEdeaW*cnuP?LVV6WFEUw&=sdkrP+IYxSxPbz-JpR&0VcMKcx#bbE8c1QQB#PR zSKKip_3g4I=kdp9n|rOVqb}68ku6psEYjDOq%@09DK#2*bRW&R^S`O1-Qb+IJ zab?3l&0yw}+2$1y_m5rAE^^y0zPYmrfJe%bfQ&ZgiD10<{LeevPD%DnI$cr=*D0 zFDJ({!&U;G@9BBJef#Fz9+>4(sCHz;)o6W2yw7H9)3l>0#6FQ$lKiwk?FT}Lyok6& z?}X9tfd;788(T(=!hH+|*R4mrDj~TEl<@gNWGs(-K=8Sv5G&utgN5yIuiZnV5&rHw z{Vv}$#%(cmt0mqn2^5z%1bnO3KjUreUWrYTUASslr~)G?W5ixkDs?-M=U>Pe5;Iy9 z7s~zM9CexVc2D7>jJ@!Buy``8Ck#y9nuQf9D7k`qdyDP4&%oov!}Ti#)F*lwhie_S zK4n49%e}lq*GmYmgOoT_KCl21E|x7IBRBD8zEARx>??)$3>$SrvG{myFl|uRqcQQz zvvl`nnuA}^F7#lE=opS4EIl)4h$2Ctjb#$_;FuSm03(Wqw-Vz!?yOWRdj&zl8pEI1d+B>3A0C z^U@^c#`3b3ON+m=?rc)PUbgvwhmcTq(8q;1==cn|Of^v$bc>x|dc21k1|D)+Dly&l z>>E7ombvNWV5;Z=Z+Qk!h)By9m~@qjdGh%27%XyIf`QQz(H$3Tj6XKYEGoM1lnkXa zw<;)Bx_czw^Om9W(F5J*h$Cpiu%macqD&3Z1&}wr*tU|svQ+5GVbHlCYcwm*LbKTT zvN*>Q<}#f@KgRhQEvI~7u5v93;61djXVoO~N7Q|)Kg+0Ri-vz+qb#7_c%19w4yo1r z`sjb5W6Elf+GQ9tic(k_zf;pM)Y8+e-J!J@D#?VXf+g1KZ4prBO<|#fs__1bE>LLbW^5~XXYkBPQmMSQuV$Gd7QJq2+%~&w zCHu^DPBkKb@kacqHoOMa;u>4TjxoAiC#AxO<9i#`|3c>*ClPgO5`w!YJMx{Ucbf1N zu$Zik?eyHj_Er)29u5cJaNnh;8T3-(CVOw|YZP4$k_Ayfe~b*FK<8HY7uwbMiXad3 zU{6G~@(Nfw%yWGyrg~wOf-D2@xrimK+i{z@N#xlX#7DGeIk`&^(>dJO4f zBB132YUzp9OEs*MbWCc~(yvb7=vPvaJCmU(i(DAHQdoEzmhoE9{M;uj>aDB9%m0NW z2j}r+HGRXN7Zxze@X}1^KS{^{-R{Z%M7IM{9QBxf0;#myTkUP~>x-@D2;A%9_#8F@ z74lK9a}cV$=Cf-<;-9%$3tY!?YB45dfL5%U`>}#m+1O#DG0Ai zEfXlmkCC$Ch146CYDCJC*Rp<+{n>7$c=bo=JXTelQ~h+iup${DdgJ5K%?~j#90v#U zC$;VmpBb(!4HeN|0BG-D67NR+Rcj|CXxx`?^5ot|CUTV)&5!ELc{=u_=G>Oyp)p5h zz7D^8F$WItmMzh|sdov5!u(73764jrz~9v4?Ab+)?2=7YP982TDBe|ohKBaub3Zbt z*>CaXO4-y657H;{&i^yAEhUbcKlSEA|Mqb}LFqk6?Gv<=4x-Q^BSkYMEJUJh2{p{Y7#Qn*Buq1kvs3Z36i7Uz-|aSrh?S=;5o}{2(5q z`Y)0o?!%=ecLT};k49pNttu*clNC*Xd>>;RVolSV2afY%9i0ZU zuhw3Ghl1XdInRTbXUI1tFy(MN!=PZb`Czl@UTa1nDWHF6;CmkBpRTnP1e{EXs|?@M zs(T1V$9Iv@`0(|@s<4~JZcrs$Cx@H$@?9TnB4 zgYo2212~&AaUVHmL@Y3x=O{i)PuII{T;eQzy0h)&PX@~Hwl6*wH7_{cJz{?NY#x(= zQ|hnk`^>Q-B=Bu@-TPvGZglw)JNE9tMEd|FiA%>wh^raM`NCC?z9L)2ttzA7V-*|b z#p^MAM%TDhwMX_24i5SOSgvMu-RGFoEz7T}Ur^5l;9|@U<`QuEZ#jg@CO9}ig*uc04(ZBwO-ML)BtmM zxG~3TONZ7|NA0F`iC|ij6o{wO%A~;Muc@OVW)m*im+1=6@%9#+Px4;7QSIDYbYE;O zn2g`R@!)mIx?xStgNhaZ`UN9)X7A%zCYNUmbsEO7*xDbPR;g~=!DeaDzO>kF(JfEi z5+{q1GW`Gp4vF=me5ULbEps=RBEulR`!SXuH{CLk)4KwzS-q)a;8{=xos<+@Yoym| z?P6^n>#?eYs9g{%Dpjwtv4kS(`!)~|fKzYE6cEh7M=81KIwHB&G|wa)u3{W8Hbn`V z|LCyi6zkd|C?dA{gv1hY)j16N@VYfI^Tixf;zKV;Z64bvy{H(Sk*VNhpIAP3&FZz~ z4vpwIo;iSqH2YGmFcLu3Rs0WkObNBZsmBjr$H&GCau;l@UpU3swsvFwkF8i2?GReXiVp_M48`*qB8{AbGaNhv9rZ?N3n>8%pib3k+OK;?CErD4MzIvn)pMI`F1<8)|FtOi3!@?Mxb1VMMHLJ+-~INV3^_ zuj~hlJ*g}9(juGhf_kVy4bNp$gejm?Up7Cq>Iwpn2L|aHsUU+2iz3QvBAF`2*#%b! z9Mn*O?&4%V(Mo`&x^9?i@wVRLz5%r4XjYrkRQ+GG064@w^yY!Uhv)s}UmVMSK%IXx zb{8)K0!Z|Mhgm3BzOa-xk`I|=le?5Nh;T62{y`kHq?GbxKASN-0He~?8SnC74b&4`{3wN6I2rY}r zUKz~0BCi}WQ0d(J9;^(P>Lke=uC1>x(B?-?v~N%M6=PpVvB$DVdOmV zo(4UiRi&<4^T&qw^jebC(a%jHf<-==ml)WReUOhYVcIqIhZ|C8SOi4y>_=(SeUj_CM;2kx(li3D%T`tx04x^7zE zyCzq$R`#0b#k~G{`|B9WGc*e&cBf;kCUU|hpYi)ZQQS!UZXl!A!}a?YTg>7sV&10P zMg!pN0OU(gf8By^szse9mNz@m)fx!;hIsf!OgqmiyF`_Ci}I8)HCnTUPWoi$6COxf zpI7u3Bm*(g+%jH$(^#UB9kS~fdp2XqeZnG@*RpIpG9=#ROcyw>hbAisj7?GuMB)uu z3XvNXd4lUG-J0OlBJ8lUH)rM zzfS|G0vz?pLSyvuI)+orj~`QBN8Tq07|U* z*Y&&KNSzlY^~{iJ1s^IgNB3pgb+eOi0mSPJFXrX9p`FnWDlleTqgChtLXliqfY5bJ%LjQ*5^^aYs-p5XVK67WEDJn+^+ZxPuKj3pm(_TU%ejeUU)Qqwu?1@}Cr_zXHWpVnPV%}tz3mjPQ}-+0S9~y9V+#3b93tp@vZNqb_yL0#fVdMjo7E?&HAI~ zAqjS4$WeZPMrHvHfYnsA>RNeuYCF9z34OCqBSVgo( z_h;bOX0obLJ1B^97Fw7+a;GVHfyQr)?LN~f#?ty@z3!St;2|5!fsicTe-ttQ!*0?O zszwbvCJxM5k`Hlkvk z@y~i+I;T2xs??dT)f%lj#YCl5m`|NC>$oBf^#xkycAdd5a1jMWA^K!SToUV5kijQB zPmAt*f82`j+;1~?Xc;_`KgEPFGMn(I5wxA;UM^9WWf>rDa|Yf8J#Y}qMCqP&N&TQo zb^&p}ZTmsv;h(kfcR#ei{cgT3pQwVCy)*iyWcG~X`9aX#H{XI{S`%HgVhG+T&O8uX z5ltlm;Tv0Yo9TT3R3&=?vUZRe$&6(u(z{zEKs5p|>=YV~^y2-AcUaMLQIV0Vm1|P+ zkaFl$+YdREs=a+U8YreF-=Kyi-=d+R*<48W>3G#AqE?!v!3F`cc4x7tyrK)|`(){u zyzz57^a9hu5xVL3%Ou`*@JhB6Xk~kuycF%0Tz}|gRYG~O;rX@wY;6i|h~X`um-j5{ z0TP2FpI}+9KS?!kpRO)JU9Hj4-TjyEq!-Pa6gG?#veGk6ddj-lRbBAF{|RRO=~kwr zp6;vn(o5XQC4aK@0MUw&Z*XJQfw&+V;M$8?a{=9krZdjqb`-`FENm#FUJw6hT|AoQ ze4J3dr5+tT&@?}4G81e90AIpC8Z>&RULIwuhm{Xo+X%QDz;PD`ZnRoCZ!SB#eOM#9 zkRQqXJ~g=@w2x5vo5pK0+0Zw>XLimwSa@X| z5?NoT6%Kf6p6tZYo?zhss}V$GWOVy}n@ih=Of_s-b1*|2>mHgnm_hh_R|ojCWqiZC zeg{H2T%~u2yDDv&C%H8d#4gaa%b#+RnL5R;(;8{9*H-3{-H{bv76VZJpZWJplqnbn zoukO`ejsm={ZN5s0kfb%5$w}IDnl!Yd(uU^qJl-% zUp`KktchC%Mx%(bu4X42*F0TvTYl>RG_w2-n{K`)J$T!l6n!9#TdpaKl)v`p?VVA$ zv^baw$>@VS8%PcOs4wBQL3b3^UDKhg)m7Cn3!F+pzcKJMG#a(@-+39ax}a<1#YzHW zyd~2e3l@fy+8e+}N&6>Fw(R6@KWl{Nrwzd4k`tSfX**v`BdkG_eW1200pVzzLE>gSM zvDX59xG$c6zU5D6XDuZjCw4T1kFA+=0?9dxnBTj0Rb51_Wmd9lrsw7;ox`^wR4ljP zG^FTf&0#N@H|~2BRl;PBTsSaQfK*xMXu+V)PFsST>o2eOe|+U&z@jsr3XG!IAW800 zCh{931qL2uX5>jO5x2LutLtdUr~nDELXEb?cvf(iLWGl?ncr{tz_f43kX?r_As3{4 z>d)J`L+Vh@^o}UxV<0Itp{0I=IPSH4slCaIU&z2C`2s^xfw`_fPed`GY8`UE39x+T z&X`M3$)@O?7IZa^J^THsE>EU1Us+P@;B9$Gc9q`T^6LQ`nZiG>Xoxi|7keLIEB0(C zd;)+;d14`^uMfa4MV$8LmtPA6Ua%4VC7s;Z4C&*L`In)V(YrG&kmk zCKKN|#{+?y?6%Or&uwA5|L6w&5WK%uGPuJUkCi9#W1zXo$rJOTWYbdD-2S=WWjdP2 zYNMYn$K}#>KhAqf_8&3r-yH{wy`O)3D35 zvqSIlz|yk7fqRim{zTXQt2NCq`Xw6oPKp)Y0>|k~^R(I_Gg9Yq9PEj<>T9=rK|dz0 znUO((fi3mDn+FFBMGv&jbz0TAi&yM|s@d8zbAI<*O|>Op6W3pY$BH{3^<=5xbe@1=l^;}fZ$b+T~H)aUY&Uf z+&b`!4^BJme4&5s-}h&6vAFb0_WGTO9-Jot*;d5B20P1fox6Vo3Wa!nU+#8z^C56k zK-NZBsCdcI$oW4(ZYjg(00VFt7~`@Vmhl2un=F>Lb%??oJIOV8;lFMV_=i^S-x6>X z3aKCjzXU-AlYsu!KgQo11UL=mj|h_EbZ!>VgT#Qy*Z&cI{{5)#Kly!w?%cP3 z$|lPxKfvs;%QkWU{m1@w;eUNE_u8+M$!nHtN+WELmxAztF?(X;zlMnXmyaEM^-J*{ zP%G1|5bW7<3SomQQw1gwe^-Tn5Bv#pPkw6r;OC~WcEZ(<0w#d2dv#QP@bVu|RP*B7D9f*Pnl$yPFcAbz z?U>F5!t7I`4DmVmC`%Fo@Beu0s>Py|4NtoPZtpu|6Ao@SJ$nD zfS&}W6alJhU?Y0&|L}%?lb|=8zZUvclKUfpLBeuTgK+PCl2=0i+ZumLL)g{d@*>qj znMn{3F%H586UO`gtxMwHWaoa_{j6#K`OTIT-N2>sA|%LHv5 zbRekU@Fx21&foU)AODA6-tVg~!S|Yy5Jau>3_%42#`6B``j~!i&?Usaf}lG0fCU(e z4!pbf#~ENm#7}J}i`jp-1)m{PpXkim zYY&h*2at3h6dh2-Yv~e>#){i$V|VVEk!nevAUwCwj5V!3&J%jhV-?2yK|15LYSFwA zfk~b!w}_GPgAYwI^F|Sw)>hmon;Nt7A-|V@v&5}8{1B5DXl#stNjVw;8$WgR4k=+9 zu`!d8x)@L90a=c<`i_bcoOXOmBH!3~4E{Ds8WNqH%-6zPj4ZS6;~vW!680WOVLAl( zkg;|LhintE94@&I)S}bGAOBGvvs8H2U#6@;Liqy36DJb2rhN5rx(@~^xFvO9J#1|; zQI(qDw0-S)4V-m2kK$S+WqM-Qg)l z{dlk`!?V<$CkOI%?$>LqQ7S+g3)iPocQPiayPM(mB`=9{^%W~+N4clC+3@9W z%sv~zv$%){@&Z=J7R_EV=1Dx>O*><%E80Ar5oS@lTMYSe=3c|$PE`-c{$>`+A+jVy zw7hyRd~8<{P1+Cjw9Wi)I3?g|Kjj(hh~V8<%EDPGCu^F8TX2)NcyE1}c=8$$$lR9#&wCeVS>LIiwAw!&7 zzy7Wuk@8;Ovb1QJCDYTt`D;J*bAvn1InWBAoEGt1lCVHobw7mnw3Eo?@|rM1bWPk8 z8Fha6Y|1H0pfO(r67g6y$V}rpZ~iAgAw}SEql6J`N)^56_EI%rq?*?wzPeOhh(DQa zr|Th&e&N*?mrv2&*=nk)*ow#~oqN<JIK;<)mTp#UpgH)nI%P;Na$Lyc z6`8Q$TYlt;N3QuE>lc2z(;Y#(z_T#=_!0z@Tb3pPK|@xxCP(&q0K8%(`Z`WYuLxQ! z`D274^*sl;pt6F|dn$>l!&&JtOtuX3?r_|^1B6`$AbL-E>Q^ZyWO`%5uMb}PfW7kyyl<7x6Boi2Ca6LyCIL+ z$E4nYx92l=F{=puK5(4704(#M$F!o?Z5zis?ox76<5qUw>$~c}89qqG1ns9}Iv&GY zKw?;a`Qs`}oO6{$#E1bT^?P>(*XcN(%yK4*BL7q z8UrYX%L9G_Np3f+z3VJKbG{Oax=r#o`8}gRYX?lL;J0414N&gFjEMsWXqYy-H}T_8 zg1PO8xu>KN3`;O$o-mHVX3Us9sS%2`@+OhmYu6W^35+*7fnn0*B}R{s5@VPf3=Q~M z3IVJM=v<$i5BZS530#O?b{JNwv{>nnR}vjP?zY$E{%}xdN`YTsMmL*l#DoLnxwl}w zIGC~E&ATgUkjT?MTU7_gsHe#A2~UR00tah>UF#JzRQ}t@{X>b^gYK483>=Zb0EZ&| zRx4WyQpw4k^mkms$bjKWN_xBQD|t5{l!qdZ-Z4nyC#;?$rQrA-4W%ev@>PqNfu8d} zjo`08Owwf`wt?>|w18s&?=gS?{{W8rvP3K@NTQsk^$P9Wa~}MdiULOI7-2WA8Q=E( zMu)YKTI`AzYLB5RrSZa^W`)5@xDd0G`{3z+C~1-591b`z6WS-ccmo_mF9 zo6Ix=JG>FNR#~GGQ47n_cBkHNY%zKxitHXV>(X{uojwYjUjY668jray@&Q$otfmu< zY5e3#WyTK|2K9V7dRXt8yi+XHAMY%d)#1&*62GqKW2MM|H%7RQTGa5!Bbm1M{4iZ6 z{K!g!gVK886@f-@aln*&S{Ha-xJe@s_8F z@=PB~$S9^KTxasQA=*ByO}4nAx;WOB-*VB@yWJr1d9XH*_3c;EJHyUhPhxLPi0_=` z?<$!l!*aN-GEv^sb*olTjai)!+GSXu&xkMRU`Ak0OlCkQAcX4-I@G4(Vjb0T|Lvo# z6@GWeP2W1_sOtj@JL+2|nCw!s6=)5b_nA@`$HY#U1~Sjo!t6u71kBRbMA|ed@@Omh z{MBD>E$8rb3Qw5N--4vp=co2OuIZ6o=vv(C@7%Kv+j$VUW_6-@vRGO;HzzV#Y6;+( zVI*Daal%$*k+wn+ug})^=3PA8t0psn%9dZ)liJKX-W+EZmPj#M9Kf(J_@>bF3RcN4 z$Q*o>&rnHMdiYT97GFKS;DBd4qD$2N`-8xb$KdP13_?W^pDN4+#QS9WCYzuFK7ui| zy$(?#S#m+AMsN#^-Vw~1i7`6q?W=&{-B(-BoG9e#*lBlVh*~T+4O^H~hn3`>RqtD+ zH(vh;^GUWKQxt;upoN7y0*-8E-p7g9yui|ekxQY{w$b^Kn(>t}X!Tz2PX}HLh+_Lw zM+onoVHO|I57+5(m%My1^Qt(8DJiMLd>i_%g#{X< z2s&IeJ+vQQg1O>{TxLu8%++oiE9S-fdJ`#^sZ-nf{D`eRnB>^aN~ehKg(Dufx>NU} z-@xH2vqIW+PHrb=&?AtB<O70NB8Cro2;QawbHyA;fuZDe&HSnn>`@eDQ^`xpvz4 ziU@#u(;=@_4{ccjbzcD6KEtfYcw2sd_CpoQKKZxIENq5&O++;#W$gfo2nC#bCnmo>K3N6=TMjv zRp1e~XzWCya@dq=UrU{H4IEJ>4& zfi;~A6CNTWZS~9RH*r##0O#A~28Hs+3(S8>YKdY>L8ZLnIOV@b66$QetXJMo!}@Ki zCdaZ)7Nwewx0m>_@guyB4|T>*O1r0Ex5#WYmjzD((1z?%8^i1x_IAD8R}qGwoF9*_ z)?^o#VHO{SN^qCePi^)|w|tJ#Z>C=o-dXmp0zKWR(dvtAkJHm7M@rVE*1*PvAa{0$ zFxuE4cZn^h1PXV1xtnorUrq1!!KHEi;0HDKXSosx6sUh?OtU$@N5N_FNX>YmOb64< zsHgR{3bfpMj1T+HQy#6>M|62Flqg#p6O-)<`jIp?!VA-MZ)=Lp-v_g$KqT;oN6F6G zkRE4!8?#b3g_ZiI6P~{DBd-k7eI(Oy=M|X#C0yOyFjc-$;7#k{NvM<7yXv(^FGW;v zo5$+c@QB3Z8n@M5KN+ozz2QMg`j5%UbQb(Ge@Vc_R^3y3BF@~tAxvW`3sTO-rO@7n z42#eaq7A6r?Ap51$+{hAvI^yt{++l0eJJQFU%G;=7!Xcf1&j0Ky=Nm4y$&az@wVMZ zR!)dtH$CVTuPV^Ir7`u2`DWU{br6iH*qe39f#KsFd;xi8ZSCD-j4^>VC5JndxV1Pt zyl}D>1T+gSe~%8@RsHKIeqObS|1Ymi`R`tve%;K7jnTzXun+uBFQ8_Fc8UF29@rUw zD6~^FtOIoIc+wry~oHYoQwt#}`U=^H=+M$dlh~ zbx7=tG^r;K1smK+)mg|EaV-ba{6D_lJF2N~c^_6$P!UlPk&X>Sn$mj_k=_-gt4N2? zYbXLDiV8~aNC&CX3B8E)&|83j)DS{|03n1V??FF>dw=)+{=>>ztmK@t&+OUHJTvo5 zHMJXg-))^2LsWSAM(;AUpG83A#pFC-O1%9aWasP4P66gf$B=MlVd0iD7B}L^sn&Y* z*fEcRjKIT%!xQ1ptC>OUSWgIRbNaBL?0k&KY#i%KUtDCQj!2zfWx~lm^a(mQX1&ME zfLMK(JtFcBK*+sQy;t1i|lmFIV-O7>E_71NE;h|9R`FcjE13RvquNmFlQ)xqR0lK`us5M$GR@u zbb({fikZJrHjF+%>^~Mp*6k#gF`Muh`JUYPC*xsLPc_`u6(*(VlmNuD+RMEuj=_bR z62+>|EU83F$XyRNhxxYqL({ri6;#))v7U|o?{>jGB-9+~nlmhN6$}VuFKyouAboU{&Du~)TLiCF8WT(^8oLHogErhvQI;;) zlCzPL~;f&-i=eF1@WHT=_us({)HQNn9&qJxMVZPjr&S?-hlh~x0?aNDhHZ8 zBuZk2OVr?mkwnW<19+d1QhCH1{Vel``l>E0Q_-`XqQ%@#(xgJTbJ(@2jmf zdl83QW#_mDVedP5<4jEf1%KDFh;T6 z!eKV$oY-hEEQ%+HD^A6t{gdq+&m)H|e8>d(N=%<6_#UHS*v8MiBs_j^xeza!P#yTUSu}qmIYda2T6|wG*{;+ zIDqZze+Eo#JZ9aPle|3-vg}FOc5T}NgUQ40C1Vw?DY7qS8B+lD4 zsRL?(BK{2-7UI5#ljE=UsAVSa5MKKPObTdjSe851{4!yC@4xry8lQosK%R9o090oN z$^C0A4rP;`@5!gE08y3wW|+r98S-L^ed#BoSpB0||1aX?|Mz49V%!hvhA=YhWZ(4H z!ftKt+Hd&qoKO1h6p`yx3Os|Ph$F0$=0hK4Q9j*6T|Wf&T#jodcgWX=e=9le)OQQAN~1 zm~=_ToVi2doYjFhkt=KCOZfySv$2_CfNfi-vWLe0PeLkhdqP+iv8ZiQO|2I z%@661?Ms?sJ4@veKw2Ei%MDlgo^ zA51SwtiuRLrp58G`il1)7USAuGm$%Fq9g9x6^ezK(sK zf+b2My1^5!y{$ImFF2{4>hmJUL?hTy@Oitt$wKVXG5#;m{?hM_v_xZy-f|*O`(gQy9Mr2O zDbMdGnWB2BB>aALH+@-I#+dDPr1ux(hq=FdLJ>gpLKBjrIGDV@qQdV?@e^sxTNqbT1$dr0e~Hrp zM(tDAs@3klHgC!J!M_{Gp&t7=0QpPro5?rpf%=PEL1XSL0LWvtyUR~~(oNzOt3kPY z&w#!E{m0g?-iWlo{dCo;X!>&I-(F)syVMS%fW0OF9Y9^o?2H-c^<~$RgE}27?eX}2 z^6np+jOM@bwXH{}r}Uv@PN2q)<2##s^G$tyl}eoUGkuLpGaq^n4#3`9yPoozuYUv8 ztlIgN+#fUMbZ=Li$dwW)H$?)t>}ZEgFj~AAVN=Y?ey_+IIifCSE4j+6x9zG)V!(-Rccb zx>YO_WJrc=M*+p`1$PmX;GVjq6o%&cgAZejafyMCe%g=*w#ZSAb-mXShka`ItWf?T z|H(dUe$B`jdiDC5HHmz@@;2TR+_T(wlU!h5i1&fqS%#ZO92;v&EOu&i@z;-@N5M)# zGw*6ZcXzQ0^@YJU`MokB*7x6%m)mW=C2!{7uYrf1Sr+-sOUEQQF=Iia{ga*KhM`Z6 zfF6VAucH3SYO5=9x*xq-+b>7dzTF`2*{2GQ%YFw-)ft+lh_9M$s7lzybj0ZHoBSJ+Y+L(drfE06G5;ji?_HRh}*NB${K{damq z9WM*$K#Rz94)Zl!{-#&R7B-+}<0D`*bu0Zzqv4{kkw>YG&n;Rsh11C5u)~+NR?%Z; z)um1_w2iy=kuP+t(&aVo}|4*3vSpe zc!{R{!u#&!QpU?4VGaJ*?DO(o-yH%^wu+$V+LI@frRvss*V#$a@TJAuQC*A5W48s+ z30(pwnTxB>n>6<66)iS5c(^O?A0sqR1oGefJaUxC=vX!DO#*B*r(?~m?Mz?mbF?7x(-|A8jIL5gsxtj;?UBGqqqC%7I49pjzPq@~1D$_}9_z9)XJ3E3?|#W1%eBoy!I7jyR| z3G$~I*py@`sKx@hun(_LQ@Q zya6;Dq)-L~ZTW`TWs8f;-InSiJey4I48g(jUzyI`-t905*SM_kA1BE1y?ON7y0ed7 z)=RqP2k_HmAHjPTjL!$NoXNztI>~PFbtWe>dE@%17vtcTOGfY)$gwgwi$pHBS*g=^ zH6Mc1AapbOX@2B-EiAljM%W?fM^vsaH=MZnfogMg9CJ4R+4qN~ps5{tejF;|Hf&u+ z^67&XO1vBLrct#6J-2DCZRN-7SedTAo~RVhRkpf~3cu3+zWRf)&~1WdlS)BfQrBe) zlm#8>)!tSHryWE&`0+uiS3DJyH$E7;)RQmsnB8IIIStUf9|dIT1YH`8uJh&^UE9sa zqg>Z-=mbPTJSxc@BuQ%$WzPpAeY+&89J#>g**kC-V9Jl|=F`6V~{0Fmx+_$2{goaV&Ytt z=h?WgI@w{7Nl7b>Q_sn$#0R?0JbhB6qo9Fyt*|ysnI$c9;dXi)QNEA>kF^m~4-q*U z@uK@uZXdnuGZqt0T$GBX2^WG+tHHXb zo)5k1d3pNM#Mx8I4bGs`wjTeU0{;+6|8BF}D!*6Y{M^6`^|#XEa(W4=T+<_?JI3FW z#$A5^)v!zN-A0*UH>LPWLyait z+NfO+i|ih1R$+}nzAm6#qoI$Ee!EjZj_)?g(D4S|1AT9bva5H}bunZ-r!!Fq8Dt~w zZq4CyK@F&%*gGBRv%n3u3cB)t7LsgT0ld|d!c(G_y$7o7^*cFKjd@SYA>1ZaH(jpN zP^oz>6;a!ZGylr+C}Le8Yj&|idK%Y%~!UQ<&=uYM2k9AuGh9o~VHO55JA@>8u3uw9mUEk9mqGx^Ym zX~4t^wRq}&hR@ttiu9TtVlHf!Jak96m9JPG^P<<+ndmJ~IlILt6c(zuJWeyua#`xdQ=x-_ zVzIk^fi-YZ%=TC!>Ecotu9U>g?Weu>A7+-#`E~cUc(;Rv?)W8^jVeKG?RU&_gQa=e z$-QHhAhKQOZzCGmH&9xL;*ZbHI7vGCw8azg+>`C6P1c7UIK20MxVJD72X4VhI|ZoP zhuVe?vuYP-bCXbn8_bax6*EpUiMt~ziV&YN%pqAGwUl8_Qcm%ZlQ4mIduoG)%D2Rb zn}l1{q-A`X!vH{2sap&`rqTi01x5>R^u(5w!kFtFMFvf|++6S~bj^dLtXuX@@70;M zB4D#ILQKu+UAewHA--F?)WVzXRCQOrsCVC_^8zkfEb_%EC^t2YyPTA07xeI6&j}jA zE3{X)C-vc7;2ixcga|EY=Edj^Dr9K+b0B};{aQBJFR#(VWpV5T{Ea2 zf2%&}9g6C`&#VbEWtys-Y$dl5J#ke1xlTGPNuWYzrIj(3gn1f zK&3nkxRW8Dzgo%%GSfcE1fiz7p6?JOGaYTmaA)^f9eQYz*9DeKIrj`udgR1YR;`1R zQu)ObSp@ji=Uo(mK1~KvGB8ic*s#i)U6G|;|CPrSI80!;Y@>!C`~~q0s1{<>WGfcY zAcRbP6B1*jj+Hu&ubRm(=jq+ys*-ZvG%c6oz2R}p!8bpqdxrt58^hB1O$5K6n~Oha zZ=cW02)NshM`lt_8m)~MImGSDU7o^pbpB*l0hy*!B|Ej8WpD%f zE-@apJpv*k`cqX?#uulos=rcP6uJ5ymHpTTrj8KeuJ%4t9uA{ka@CPUqL>$NQ6eEV)k?bK<<#kCqv zz!m+wyDr%Usw`9RKUKe^$iy*g_sdI9jQtn{*rsg9HLw?>v~bXuYmtDl04~=82cCV% z*!(??UOGDiamRdlU5p@4=F{8puZf$GXu@Xb~!r#Im51G1r)*-LLhPkX%K7#C0wz0^u& zmLYfB%uk|^9bTlWNVE7|r!iTa=g#$qq2R$6W^T5_-$F+6pX#=%e*qTwg3rmVo;3>K zms%&x$C+ONEh|;HYde}X(?}RuXb%uO24xw9Hh0jzLw<5yT4Qp?27Th{ojt}|$bJ<( zQ?ZfjGwMa|v}vlFsDIJ>nB8c3oc?uaN;B?}r>3t7l+(1f`DRJX0mny-xzBnM$i4LN zlc&sOl!H76)#ueIZ`kt`nR4GBDhYx(6P#dgMRF)%?DjSOy%y77E%UMGcU3EZRy*5H-RUoehA+#5PI^M0NY+SZ*WUOqPItUSy-H)!@8Fs*itJuYi29J*>EL-Nq;V ztmeFIu-i!{hO6n`y+pfW9>srr;CH#}=4t+edmZ0(f9{px`%`q@YMsNrN^f{6`SR_J z!CB7fXx`Tg(KJ3v4dTeR9?mvxX}qu7$aSx$Ih_dIuOUi z!>7xC#>w~a#}nLUd5OaVh&$@8iFh`7*Q#jIEml$*m1Vv)M1Xk!Z_T)VnO6h@R4{Ix z`Q@{amEpQzW)%H5?Fu0MK&m^J#=|sb?Sw~Y+x?G)1{3?Ioc&7P+etjh;mVn&aIzM` zW~$#020AVZ%`|;j!Aji^>;~SDYpyPy;x`@$;zioOJ&kB|wHlNS1R!>Tg(@4Eib%{+M36N;TiL=qrTd2Rk~2>K2tvx>tQoI9z(h1HPSU|E zU^Y`u(&BGEfXV?NdZ#(_tL!^;F5zBDBO$#{lk^?{ZcE~BAIU$wN-}rV)yq~XQ*IF7 zE8r?1x3<=#gJ_V+`|l$}aEC~A@Qc%sjR83im<>2iAu#PsjFCuhfB!k3+k;u0s#E4;2S0=pt%$P(^r5^7ZuiD=ANR>aLmD|=&}{lrqqu|FF%!^ zJ!WOmJpWkPsO|=tsG#fug3h!$kepZcmhS+=+=HFLb7i)pwu}`{-CI(xvJ+Tw6OUl! zZ&VAUv{qe25T&>Lz$~C(KL12%c~f74RCPD+@axb~J0i-mNxkRV(8B8t;ZKxdr6-yE z)J`a7hk4+P(0=#K{II$z(l31|yM*KmYm~`UjQLm@&OT_3){SV{-IyOjW}(vC`vLBY}4p7>s1$yVk zZ20I)l4iwP9 zFx}p)1IMIgfqMgZm49aZoiiy)lBRhO+uoL?fii@M#tW93kL<5lYLz^!+JCnGP<4P_9#wlCy65{{ zdbm)A6dRKhN|howkcr5l8s|uQW}n%X!);vA&Z4TP7i&LO;T*Wac8#J>j_ndzV9l&( z{_4k;A6++&9j01Jfi-$=0OIPTeEsU!J-5rU6{Cfm9YVX^y6#B7zD08h`TNc@{&*3A z1K;vv1@M8Q=i4hYqOgggrbSH0E2{_pe!?AtLr+eiRL}7KZ_Y>S^qt?y)P~JoA@jc1B${1SX@M4K_IXZ(u9spP!j8IjM83OG9h+%rC>iF0i_H z6F;ZSvEL7&dx!jky;2N-3C-ue|0!41If8Qc#BXVeP#$~Z@3Q|q()*>QZnk`vT#FR9bYPXT=!w|`&%5i%_vQagOVmAatGhp3TJu5v@;k18NL`96BF|)b%GV&YY+g$i<6{e@RwL4 zdtO>Dy^jRvxRI06A_$9GQu+%ykCkNaL?-wB^cJj}0EUh`TH(Xk8UHNRg;+aDC5)wd zw(aOQ(B-s0X4kH9775ZVa1+KphMeD*pXG1>w>swKO?Iyqof$$m;)^CrBl# z6>oax;r#~*qsTo#=UF-b5wHD;hiYfT{I2sg?Y*7$MhDAD`)Num`=ogpZ%WO4WZnP5 zn_}c|o0dA1yRx-m_g$uP&~o+=C!97tEjihH`rV}wJ$pU=-$3i`+auFeJ!t5-%x6&c z1klOxN!Y{ifwa4=V(!H(^&63QRl)32%BKA|*UCHFu<)m=Y-H6DdC*_6Mr0T?B%rh& zki*oTgjpQ0c%WiPoL|1u_?h~zO|HC}$a`Re%^edt#HuigM)7`$#dg3pRH_Yu-dnTU z&FR1lv>77D4ejWYD&aZJ3%7J#>5l?aP*=7v;`H8LGj<_Px_q9LL4$8xwfuXp1@2z` zXIonS52HUsVd;kg=5T>8lqsB6OG-5)ae@YozB7D@6~9pV&Y4-JGvY1MJwv@KBy7y# z$~WYBldRx9xIV8msqhM=7w1m6^0RNJ3~%@?IC%EJbcsbL_<*I(zgEa((b#yBiRh7V zvGz7p^~szDB#flC^it}NA>28_TK$p!CEAWu?IUwLtvk!^NGehcuY^axXJXg^w+k92 z(&fQCwbGM&mom&~W7KY}GoP&gOVdh!UyTvfx9bvzH*8+{bUlMBrzLC%oV*0+kJ_e} zDOnMENvUx++7zvNGZ#Ey-6#=x*@z3o%_mhR*u=Ov6ePAaxADsQ$UGzUV$&~Qs*>Aq$$U`w&DeJq%dH_`KXhF6n zDX@zFsb;j^b!jn=R|$s-b&i)COBqJsw?*G>x}@Y<}s1G$E4K)^Ef+;@dvo6U*CwJlNMarvVphFoYKJVQrcl;<8xtl*#I>hUcVI z@XOCP>~}9lFCCcjgGRIlR}MD?4+ei)Oz-EmeK?=Y2P(Bvj>dm+URWCZnWn;Nwea}U zE3}kn9MFF(U?$rGs&k8x8#iv8l~P@G;-oY2aPKCLU<+3m* z@VfzgoLZDCAB6i(3OODtx_`oZrGa`orq&a>kmZ;b6|^&D-sRv4PaFF1xWUI=x9WpW zI3sD~H2qd*rku3+a5`bk=*ZO2YciSx%WrJJ`2C+qHo9_mg=q2BOE5hz3${NG% zeobABL9AbC{-XSD_qP-La>}{EIo3@fm$hOJ+njE)RV+ku)pZvzt?;-}&~#<^L9qMh z`ND34A%i(@*#sxA`Q~$Gxk+Kh{j$ zk&{cm@Z*kYrEN^_{RI=Gk84oY(lwqeP|9ILa#s0}Sq6`wxu)G23k{8Mdr(JL|H#wL zvZWr2y|jQLST1L&DMgZyTop*5d09r;`#3{h63{&=uO*ukx#~x zOL%&nADeLbvvnMhJ24F|JQpLb-g*>Zz#wE3EZas-wSJEv(Iq@yl2mrjV)E+))X7y( zjAy*V_5dl>CP5@Wj?^UQ^D!7ytD6)5m`r5G9m$5M@UtC&S2%cj_E5F67*(Ogp7p-z5u!#s@Y8P2Q(bHO~!M0+MG%_oND(}`e(~SAh zd&zsg3vJR8aBbq7x?Szo6c-93?^U;1KZ~aHfu7C%l*k9F-ECNmK53P^(>RD;G<6v| z_j6)l%$z~o<)ft3eC>1W!J#1W%X~(fLW*Eh-3BA~LE%b{31s6gAas!6w=rY^s8f6~ z_8fKqRT3^x3oS_4o$||N*c$NLYvAGF&@YB;JjShm;0u=A@y5Of=4R>jC3+Y@(m}0q zOn|7##yIu1*mkMBy=)^mb#(sOL8>>X8=sn{sdd-#-%#^B&tK@rLi{@*GJEBZx0KD2 zHFiwCV=`!_VDGTUBnFPWz!0kOp*V1SR=5(zwoDi zC%)X6VsxZBCEW@`#P{hFR&K)f*J2f8wz^5icL9Mho9=yRf;yMWIob}2ISgn@x&Y37{1}Q zB-rye_>CHc5hZ4VY?#B8!yPQ#UA4PZNZaH_#Qmn|VKbv*=+#Pi-igyx(_YpSc@@{l zD0X5pBUZoY=)p5IQl_@s}hs<-khPA!MJ>Wzn{HZT;JMw5Q zn4TcoZ5YGX__7Y;fuz_$nUe{DnpRF$-`!sy#(0UQRY9+e{1>E&SOL z-hb@~hNhJZek?=aYVth@Vv8dUke_35HFGF=tr@|{e3}9eJ$=Ak3~dMS=!GgyM8dCF ziM2_7Uo}HhKM{$p3yfDTeq)ufZ1zWvfsq`+L81FUjBs0)!gEWP4e{SS?N~!{hCHs zo{QK_Izk8=(VogOtZ}iL|AZUAql!Nmyr27j9IBQ_O9{R8U7m7gzas=l0fkjL{g`j3 zGmWHpdx3iCniP2EX`C_^R5uahf5&d;+RcP}Gp)3*6GP3aoEo)be10adoa&cEJxNj< zhkJ|@IAcQRQEeCodq7D2EHHi7PeB_K2Z=Md8cZ2rtqqyz!k+i?~Rv5 z+#ZQN0(#&M0&2?kg1wYsnHjDH|!>cxSJQCo#BOWkE5h$4`mPl*%W zJ?)M*h^L&K$C}zM5x&P>GfsU4OU9m&Dr1sx9)kn0e!}b(^%DD>6&dEB$8fsVz}y4h z1sSps_|I9=ra2BxRZU)}qZ;szwyzD1kOx~zc+Q=u;~OUnC2utKZJErFipQag=l$0D z1vO>%7t22MN0IHpB<_Cjv7IE{Z_BUgg8t_5PwdTWKzX#`p!&7e*sWBU zqhL$|>_DLuo_UX=68lM2P2qXXP5%1td-bKoLoPEz;+1w3v`xekL>o+@FBBZM2~~V@ zkik7{DxAtBF{F1NA4nF`rC1#>eZf1k;Za@`e4xV$zaih4dQfD%pEk19C-jMYtS0^8PMwAi(|r1yL$=UT zID{vIv|Ek&DG@PiJEIc-3mRGz2i_!ugHB1Yu`f<2W1*H#uohW-A3w+B1)FrP8*_d(?0#q_wq5X|HZ?mPe#TkY8B6 zN_)SkEqX_ixcYLpe;%!gt(0CGLk+1P7)!Xd-`aM|qfj7u-=3*L)*S- z(;Qm^@x=0I^4HeXOvJjlG+tv6RmWf|VsE{%n65o<1)JCWp&IUI2D&f59Fp6^CuRm& zA25h5dG-RVFnoem#Kx&>csZp~v~97b{@+rdNbbK6Pl(>Rxz5||KEG)UfYt%ZKFTt5 z=MOvPoU)%ixf2geC-^3=w>gyEqlPWRW?cxJzqhiM*s+>WZrSr~v|urkinvO`l#hgb zw_>_npk(qvexW6IWUO26483?R?!L}e-dpK1x+{`x%mD%yb&jSQw9>BpWOdC-9wc2& z`m_Nfg~0thr@4Vyk{zg=&NS`ur~8TT&JWeD)|W4SCc~D~Hesn*Vxiihvf5nmhfrTWn`c{DaUO;@hu?Z7D3#+nY;HOP{7jbatgbo zh%$MSU90+m=XmbQxvHcsAkvF*<*nzwhNN784bHHxeJ;-_f4^$ljpCyn>p9@Qdt{5g`|27>nLh3p5K$>kMLio-~u zTKSdmy(R;IR{bu22`A5sz+I$(tTyg6If7goa-%KvQ6Mwl-=tGC^${f)y9oY7@?Da- zRU=RY^&)~5YrX{RCJGJxybyDpHhF#fY`_|3jo>-UaG~XjseU{z@}8$0-Ul~2zSNH= z&%N#3z@Ed+ozAB%ue&EcxT9iu%5-{BMinPjTkGckIY17otPMrayCSzo+{Bqy+t~B& z3}>~qPP@XWh8ELU4EeLI{tB6axJcILZ}NnYU|bDM2~>Mn_@}=R2=YIb-{umh?Wex( z^l5p@>-y7kIVK~fez+ekC7C<=`y6S)_p`NSrmv&)gKRCt|N4YI&6l5&=l|XXQb^uE7Yve%*>`xHw8VzV4%5%$>71IZ9>GbTV+ZG za#aG<*iVEw4gR{ru=SF$ZCBqqu_>v-{wH>W&X{uk{8*kJe#S815V2DAaAt{ab{2i^ zVdx$D-A%HpGT)79ZkQ$7wz#zO4)b(+g#b15MW>j{@T3j;>Fgci_^QQ z#S|B*Sj2X|5@wcLa?>J;uWt=B41HU=CYP9g>u0AfRO3Qpoy%Gf&<8%*d?uwN`l+(* z__yrxmYvlF&8}Mu9Tf1km_`2|zM_DT+B^Dyx_7r*Zo>QFW9V=rXbS5(4X^8ncfi~R zEQ>H^bOt{{A0Tt!xj)cQ4SQY?{bpHpWcLaY{Q(_-2w8bYzHt8!!#VdmtdB$sg?KmW zK=Z(U`v%R_^@UbG2*V2N?|yruE4hG(?uLfyCW33=Mq)-r&l2!Q-9a z1nfl<7M8c|*~3=SJk{i5iW=+#b-S@VedV5di?-EH%Y`zFJFdJJW+~iokd-~WZq;sD z_K+0E0kmx1>SeViHUTjWaXYBB$GJ#ced!e+z3C$oFfV4MLQTWg_vW9fHZ9-3?QEEy z=_tHI9Z!i`cLLQvjNn%?;yhK6jY85~~{Y zYXrp~wRhgY!c-p1yl&gQK0jo6FtPx!kC*wkLgIq5{GH@VZ?=7uF>Y<4Sm&ZkOB28P zf%VO0V#wD3>1k)ngbvpfUuYir+Gff5wv{%x9){5uiYjxjs}g5a^S`9>L?NGe&pBL- zV~X-<_MJt-x!C~=fDBU6dcio`53i2xp|&5Kmp({!25E%{RgIHl6yHi&`#9O$BwnAI zpA`%04HKntN7aQ{G!@wK^Z+-SFl(BayZ!^6-S%`t(V&KnF)lEG`3=vZyAM?s<+H6} zTWRWP_X3AEPWYh*!;TFYY3$Q!XL8D3H4l%fLmQvGc)|)3pwRrj@cxQ1cn)^}L+khy zoE3R}wd$pGJ!=ZK8Z#c+gmizRWSCj4?u zCuX>@E4nLwv}GnoI*Ojm+4jUVx7l1-G3y9dt1G=LO@l- z#kXCQ8X%Y0w;63DjG=;90uLS9erCWPr;Ix#2o!nZu~?d2&yArqt0#O9XgVUkc;{H9 zo8}~Wh}7D>nb%D|`zIxE?>AZMTe6h~-NAKJU(-{S@zRM4Nju~A?k85};E_w2t6R)S ziJ9gOktr4EJ9?S61n2_3phGrRSk>fM#(&DQdcRpE&gw7CdE`gD2z{Q5u@Y!?gTl7g z7g&8GfJDEPMXmo<8a?5(Hnd<~a0>j>h73y02k0WmZ`A1;g1&oqyAXZ>$Cg|*h)hNc z79it<*b(TK_5}%jy4W{aM@ryq6JEnCs*juSI2cuzH9*yY;d=D=iKs-$_}?1QuCnks z34!0_-tRvO|E7yx{6D;O;p!97rZQe*PQ7@Q(mWMKy8B;oR)(xk$xUKyrj8gMY=2UA z7`^2WU{)vB8vjx@lGWR-UQ(Qx&t@}mchyZ=Fr}%;OoNmh!evBoXhRA*ie%%nVPzIQn5SM4hYaa93$ETq0p>ax z@~S-_Cm^w)q$%JV#+Y0Gb@pyXcRVNoorf^C0A_2zoO`V9UlM{ywMt9cDVrt@l(KyYIu%DL&c{neqSr`U_?gJ^ z5J&|>?|e@q3OGTqInkf?|E<5$`uZ1_`*f~Lkn4Y9@bk8FJZg91;qfSa5DuBiP)9f~ zU(`JOg5^*d(6DXGf0Nr9{UBL-rrs4friz=|cyhCZ~l;|8dS4z8O;?sR!1Mbf6&@GiOA|P_cs@P(=N$ z(719)?_G&Olta{;o@KOzF>jn%j`_H3f;0hI)>gGD?5>998aMMx0Ai~GlWRlBcJpj_ zS3?jQVL4(05bO%j5L2DWW&PM(tjwK#g$#5auIBmcys*8?mSTEZ z)#s6%CXKuf5a7J1N-n|)_tpCwR?Fs24dER{@5_ab?*j=C2lQnIw>p5- zd4;)_bOz!67%Q|ID`C+MWY0~AE4FxI~~1uxLc{}s7} zA4%nGd?3Go(BjnA1ybwl12*6-@Hth$f~IzqGNk;ol8&Y>h@pRR1&wM${%UM4jwmQF#O`C5;bEOx)8e=U-fj=27n{j}|{z`uyog)98OO9zi5DS1t z8KM1~iIH9_yb_&vR#I$C^@f`!Vw!ooP94?vyZ;^NX+D&rst?IOjbY5Jbm5vNQ+#5M zT}`J>3>#Q(5h{H?e-kl^b#ta7Rh@ENY^zeFj8p32cOA0_(u?^fSuyVpRQXf*pN>pE zq9<+z-xI9eTfXnoNx*g36IY|4OW%+nwXUsLxpAfO6pzm(x&BF4w7$lCjko~TN)&Rq zl7$VHtT;*98f>$deJHmgFRFLFmA5<$hLR+xYyhhb_NshHm zvL!t8V;x<0$z^EPj*6qa@NHHas0q#|2m zh>7oIjMXN}?rRjYg(xHSU)6;=vA;Lp>sbNT;Cb{Lm*c+I|3mE|v$DJ)1vz?{~ zK7F;Mew@v9=^u3S5=TkD*EB%=ft7O8_&(MOukpY(PcX0Pef9{x9)2q}fV2zteRsYi z+;*Bz$q;g|FSqKG|1=bjzI^Ara)OMjxe-zep%p5U*l z4oh?T=5#6mjA1|9>o}Uw`BBpGL^2lFs;woOMS?yeCRa?OCD4pl)_pn~suRh>F1C0c zQTBn`M@242iNI?k%|`Jm_nWr+9OK6&42)TY#EvqDT~zV7IKjG zb8X!*1&ayqp|BSk)0KHA*%*w|rHrB|P*U%*^N!Jh9N~+Fvol$M>w_ znW@(ntvBjZwcFGCHYeVa7g;xlqSN2I5lpIQ+4>R%zfkwaPgTP)vZY1+Zx~6G;;e~d zP?_n{5+uR(nlvl1D$$gKN)jk--W~%)MzGWm+Qik&s(+;glr(JXOqye7wx4=!RH^FM z?jM$CS0UcdgE4j;T-t37Q>gR!)muIjX2zxg7-r6JA7D1?ajiO? zgiY^hvlv7Bf7U|s7i}BlHJkpQQu} zNXoO|c86b`gho8W>Uy>A9VCldPSbdJ)s&*Xk^p`CUV);d!y9K%ipl&wDwa7?)r<_bCrq zuFeR9-C$24NhGA}E3cu{9Y7bK6PECTW9I7ahWntmRhK`0om0T7Khl-2Q8IfPnXH&( zMOZa`cpj6yBEw~CAgG017dTJ_!g+_m3W_5_O4tH^kcu72yp?TOXgK8dRk>0tmc~wO&`e0`4P^YJ9XOusT-P$0r+5W|9`+ zdzYkY_kR72+9lbq#z$3f21B$dXM{Gdn%6xP#49S2(A;7uD{x^U(vK04F&;6OZ5E}|U>kPv;O}X|A`yI#| zW~t`(R3;&T6btK)^gOGk9Bd8Z^f}z0RoK?Pk&VhE6?ER{T1VHCE`Z(@swf}7TMKDl zO4<-$y6}Y;?goP_5j{ZO5a^~iw%YyYuc}>=w3~NL@4*aIKCZTls$em93%f9cPa~Fy z&G-<&cl-G~O{D*px&B^&yPxe)QZ`8rCs#5ym{IRwMxcDvJ7Z||&Ay;KI}UXn`h#YZp`6`V&Vow( zdO2^6VD|Wz=+h+M$!uh}3t?10OYoxgXDzh9Rn}n{Uwx6sF7w6P=Z#)L9=GDIvKPr@ zX^LLIVbUyj6y0qGu#Smzw!nFl14evn>WNkJ?vSEX*QS;m#+K>=o*R;4-pvMIRywl# zDp>nCYz-my3G}>cAAQF^GUh0OufF_K;n7U@*IAgCG>c@t&Ts5?H#&%&N{7Yjt^J58 z^PzHDi-ycfYv*HsnWDXyo=3TA?3Dl$?MAxXX>I6!$YeFRm{V=aiGim8PWJL>PmyZX zhH+35qH2`oGMLHbIb_tMHkNC+u7I6;U3#W}$H0F;NdI);^nbuC1)9IDC1qyfjMJec zK?LDCC58*HQ;E5^y>5Oh>qYPZZmjkUgY{NVNmCcVuVk0er)k%5JHCK?F43#}rW(0z zFtG!$yhruCu+p!e1P(q}H=Xj{ip*wjUf@d#kQ!cUAnH7;Gd3=B%Qw-JyEjq1Ipe|5 z*En{l$$_%eDagzvNSb`pFR+DNNaHiAn!33VAMdg7kSKpb@kYARTiKw$3=e1r(FQWp zDvy}DJroV}o& zHj7?7RmVK$oP@5&wsgLxKz+kj=;BYCyVPy>CGUn7-8U^~hw-k}%v5DGe5!FSsI;HI zVRPtQ=k8bY@F^Oh`H}er855z~#6-k$U*58Qz1kt-Qt<`g_;e=xyudM3Z!o<15}7{3 zjF5jL$Ol*X@Tre|C8WyO0^0{Up)O!W%Boe~zKLQX5Y` zTvRFHp?`^#IJ$&{xmQYzSI_u0^++%2M$DIefNFwMcMXt;bI`8%pQ%cd8co)p!$5Vp z^!^=EtRXZuUz>|OXBhTDJ)=2NIEmeqZ+x3EV? z96|DY)9#|uy{ggkTh{Z$slRI=7wXqBDc+3@eUerR>I@f(+sYB;h7jenA8B4b4;KYe zL78p8Ok8n4hWwK}5M_6_w|9A}NgvH7m=(|5rL#2RvD){`ybrTx@bg%A-aLtmL`pRG zRl}pu3D0QO#2~wG?fN46__0?rmLQIsTHY;(vg#ZtK=L8jQ?-CcxEkI@vK}D5c^@^D zYNlS$wu*2cs$KB-0^OcJ{DTyJR|IzclX())1f1@5Vy8L3?fQP_LgR878sWN zqpsukhXLkCJuX>BD_r{U^IS+q9wOjiNgt!y=ISuUptL^d@6685-Mx9e>+=7{*joowxdrRPhyp4CA_6L@ARS6KC?ZIUN{7!rK4EG6S| zDMz#-P8`(R1P|uv8FZ-X#!TK|JkCab#PU@|Mf$t!{WoI7s-Cm0uMja9u!X4~hJ*`O zg)!@XA#TBDkx9xrst`@YNPH6i0Hn#p_p{9zzrsgSQLmq3K2lezL)E=N7ZTD*5o z?Wl){iCJ$jp(pC2aNKYrj5%1j%`psNaH0H&4z1O;@98FCp?gY*K7>6~4nLGbv`6{1 z39>^@PW(Zpalxf#X5H5XbFcuLZDCWH=|2?jr2iZ$D(k46NQRg^@cV4}ZZ;V2ru8+V z5ZRNpfB9+@$pKp;#u&9QD+|Fwi?Uj3)I!ZI{>h6gO+Bo#y#^bwz*c7aq{L}`v&`h7s*ebbBc)?wN`ilu==>zTY>Ms*61{yYUyy#6K zqL-FC`7bA_*jQvk-7zSy?o*F%wsCN4+*LVCPdW{WL0_gUeLv(-N-)pek3 z)9z$SqRVLf5 z-7`wwe_!I*c8Z|V)ayp{R*S5hT3o%SzcT!x1mM5zTosJ&8N;r1&<*)H6h`+T+HR*P za3&Oy&HTuZ8{OYMK>4v3o!)zcJQVb0_xQr{NxwA42ILooF|H?yR{8iA{guwm zpze6Oe>54XR8G-iVNbKA;b?guNponI=a+16m=Wl==?7GTX(SYvwp0_Ue)`cj7QAR! z*1aNfa<`+PV2inuV(_3D`M+yHZ5fO4Qp}f<)}&zq6zTZS(XQz zK2^eI7A;8ob+k1T7mlUi8K1+Lu0F5V?n_6Hb}+YkeJe$(D7)v|8%9$Ckc?0403}&U zb>1!4v*0J_1Zm(iH31Tg)kWVk;WQHbte}18jRoGdL%Y`;ggdmXhcFlP3IB|nG<-1# zm(a%Vm^Vi<%z%{8#NvhGR1JV+%qp}Yo+bKJL3snyrDS%&p%=;(h)4hAaHKwF0lC4M z4`5%$y+&ZmRPrgd+c63=t+3Go90$H?4{T~NgnFl#WHhl{d$*k~gFd=!wdCbQaMP72 z|Kppp+RN@mS5SIt(b6Aj@0kzD)Bh9wZJp zD~D(_pOw2<6>axV)sV72B3s#^&A0hSM20`r9Ud3k7DQ?ojLP2y-lj710SCYi;*pzY zX<2e!O+*DX;lbLO4dBN54%2?ZP`Y8{ z;3P`wjnWfKJoCxxJQI5%)84j3*(yg)*db&;0}#9^umQx#$8lDtA_@b%6MrrWo%jx+ zJ55jxa+v-`kAe zFAyF_gmwzZ*NwBUWP)c4g+iQ{Cm6oWU5zwTG_HatDN{B7)OmU_nq=Y!`D{qha+ z1J%6QnEt2U2a%k~|J0fhN1iRhi+@k?cj?w!P&pds%1k+5!Kyd7 z@R(*x;0YtQ4Hv^o3ULhoWr`?U)!d#`8CH#esstZUr5D9i#h>tO`-bUeO+I;SP z&{`S2BpI1-4C<$Xf^=+qObxt_1EJ{%B#Ap3;;N!dX zyL?BqPaCRh<$g1NY0UH}s4L%sS}q{cz^7a{=-b9TR(k`;qC@AZ^RkkZHyV)AJYg3^ z#=z5f&rSslRO*a}NE;SfdIu#JjVGww&N6-D*QHk>SPYej9*feIO>)5LkCNrO#b(mO zGXkD_-RsZhVKX<+1pSYl-roiLh2(s{Jg0l)ae)Y?0{P}y)e+wK7puIOf=aWDExL>G*7LsSOvmjr#IyT00b!Pd-S@kc)plh~T{xfzO`4ix9fG zJN))!LG$Xk5P7vJAjptC8*))rI>pWfnxzU?=x_!KrSOjBRedfDS)b<5kS(OZka1|0 zRb7Y`V+1m$e1gr|mO@qwkKRc$bxakJ*MEt9LDl@j#W09<%$j$MWdbQg$=n-%V2ZfY z$uBOUkINzIIDCtJ89zL7v9TJh7VxYwPWLd^J$$96ze;?Z zb)#sNWg&MYzcPtqsYwhrtW|E*ou2mjj$H_7YV=sPoQLs7Y&MUsz6)Q;d0E24b zMJC_L^-hczo1otxr~!&{TwpGOt*zNP-{!d8EHD=tdW-mF&lZQMNPF33gVA(yjOEa3 zF+EWuq7%kyc**Vrc{Yntn*M+;D*OH#KPf%Egv~ZDCq)K8D55yU8TMNDrzGGj69qowl&>p9zjO+am}jU8ZTWLEDhkx7m^{(hVBB1?)}H0hu}czufirrTVt9+;9!en+cC<6jLs$iSO)Z5 z&8;QsxYzYF)1e4y2QP!tQsUkdSAhtSVxFNs5hnmj&mP*YcBXw&2*3v%OpwKxYx==% zS@@kTiqZSpKZY2@LD*m4I!L}M)$J`uRb{HT75gks=JwB}ofF?BL=%V8^5#p)-RYqF zRe&UAdLJQII-z;$wO%XUDP_XDHqp6yLmX-xr&s)VK&Gs1KlDsV`)+8}{*yHVv}zsa z>+7uduhVX|BcKC90{dlC^9$O>=FCM_XJNKCz@X z(zn;?q;f%2!BZp+isqww40wLf-P3sizVimn&0SFXS-_8NJ_4wrHBiK}*fz7WlXY+F}EMXUd-Zy2pjsul+8b`_~Xpm$O#{qD%tZD}6In&rgK~h?Y!e z|N9|fnX`uiS1bfpz(aic(91qAUz@4;tv>(T+x{lx9EgNY|7<;e59wbj%GY?la{lGP4N!|7 zp%2je+}VooN&i!$F_BI=;p(54%=bgOFBx^Z;_Y*vv;R}WW}cico?B`F1C$!7AqkP} zF<4Pi{AbrKXvaV#dzh)sUtAz}#S(F<(c)jYFVsB$TcaCqpJ{Ys$tXM29W16FT00y( z?;HQ6E0?ZZKYtEM8Rz?{?hBDa+;ton!T&kEtAU@-cV6hCn(&fT|_}>q* zIGqWm9|0E^4#{B>&^zL3aSrj6{pJF|Z+}?-m(Oj)l+CqD`3_2yva_jPEXy+on2qC8 zUfc(P=W6&eo$l3jDAEliIOSe!yBkCL*Zlb=t}wk-+u$Su2>?gBF08}SP;tFv0~qyK+cvE8DgJUUq;CL8Um}A;6?L|an58@- z+BBPa`ADKzDvnNf<^>lDHgmu4*5s%dDW7g{u^5(TWv0LCdR{du8YoO248qnTP zH@NIJg*?ZlkuT{%FPEZB^#|NWj0|4ok62kHq`xcb;K=w6=IJJUS1z^j0+~qiRMOvM z=MOfFRz^`R+1`_vsW)r?u>5tlD2nX~Cb-;fY;enRWIowApC!Wwrw4k#L%nmo8%0nHaZ zAe_osM2Rx}{+i(lwxP{x0R7BnMp*%9h$M#{Fct-0A|5gv8KljQ&XCxXO#<|f1RjZ& zt@k!&3cBAfGdWFu<==T+3HV8?M2wKQ9p_#1LYeGi4c$H)RGl$H5$ip# zU5%h?`^K*V>d=6!cCst)8iqRPhBdC*k#;+tkn|VO_1Oce?ewm=fu#K(;=E$f_dzj4 zR8QI~5zE!VM*ZEa?~TW>uc6P;Sp3w`N9tEVM96Y?{nswSdvMpj(qeGZK#k#64&xqGAiWK}o^=5jDM=<$Hu{Op-wWu)lQrORaWy`Um zS5F4AFZ4*ebcNySSy*!e7diDbCW$+ZGzl@v$oJGc=lb~*j>#-MUoT}PvAQF92KT>v)Ap!T>~;F#>KgUL zDEDBl?tSi^Rl`loC%6u8-O}-SRvfbdSJ;q3osK43h%lKIKRLnAnOMQ7{8Cf%vBaDu zKx_x-;Y7-xZEH`sQg_-%_AUzHsmJlhwS>Yef-U97`%0B)`88}I(=Y}_kx zW|hB>ZC6QyS@KOnDj<63j`EkwY5M4dDlQw1;2orS)gO~={Hg7L5bL1_p7=A{Ft+Uv z)uKlCu-_B1EoG9#5~Cs69{-?ZINFuFwQ{NYiMPX~wOon1+)awuW+enS^ZPiRMv6>wz9xYvQjo|dutP$4>*?W zcJ?6&VYs$!egDu6qPXgiUje9@S5clN&~Wa}$AqAb^rq=`mbl}a&GS$WVBe;A321m1 z0GBNu@vTvzX11=tmoB1J)uD%DJw!8rQ{C@JYTt(dl+FB-lR#Sh3QUdLZ_>+;qv$1g zcEbp~YnS`bqW$UmN&DF^q&0(}Qv2Mi%!_>Za5|fJkh)bP|BumYym`B$Vm5Qej5Shh z=}#9qh+F&>WaDwehF)^Ov_p&(aDB6~0H#;^0YBS_b>JK5pLR^H(v+;?fE)P6O(#Vv zG5e@|XD#-X$z`_QbS3J0{aJwA+N8R^aN<>*4eqt;)qe@~_KP#MxV^w||CB`93F3V2 zCg8o0c?oHY9FA;2ByDw_xG!L#e$nUok@`eo)sd{*VNdBE>vwuVg6x71E+m%24tSio z?jnmkhq1wmeDgw94+`x?{HE^kXF&1%BdqqtI6sI{Z{)e!#O zRl0Cy1AP6B9hB(CkXOmroKF0V=G=zbkAxtixGafsZCmP>a9S3s`bM_wnZ^TroO{KVB;J5xo}EVNl1#+_lqy6yDWL@2V){m@2Y z74oT)P=P>?T#E=gOa0lT6!eI69mMqX?KptLLJV-9!va7M*7yxvC@ro!`1|mj)PXw0 zYdb8L2nobu+{B|Dk4j4pI!^}nK-p^J1j@?&?VmmVye%Cx^x_T@xo#MdAaZfk=}qv9 zq)$UYZ&kd^R{Z58gJq`os3n5CekDgBM{MQ`;lbcr4?iDX+^q_enkTj|fX7xpelM`m zg}2&#_|el~e-b@bmGSXOA;PU)d$_@1L)i$tIODItkni!?NlWlCJw6K*jQB&-(~@du zt%rI*|Jmm=uioyj<^aCk(Y#COD_5!Be4{8TT71tjoXwIZDsfM<-*1iS*fFCaq6oFh zQ)>1oicZmoh(#!_y)*8>Bmi|q``vpXh&s8T-@*HgRdg8rM;w3t{B+k4z0PrptclVp zUY_2MTuO6_FBxT#!DQRTwV?T-4S`uEVDF>XQ0PN_v8%-4NgX2cXxmL?dYh7HC}R*+ zC|V5zf`u$n0iD@DOX9404sEC^v*|;(Af#`gXg49s$Q$pUZ-L`Xh7-E=#-ZLT^-A7S z$qzmW!a+^h^>my9^p8zEe~SbG&GtN{JvWYYfj&xTI2o6p?r zuSu-htrgknyl1P@VIBMKo@)e8EZOKqq2!M|RCf)r?!3Vm5cK8+h&vLLaNC-ZjF*ZQ z(YvhSY1OF^SGgHhEq)pbLJ zBp_TOoifoeB0$BV#aY&QN?xAq@%ip|K}2x7%dHtUrio{@GI=q~nNeAl-;6d7DR=>dhgHE%<@P>ne9MQ&aUHKbbcGHL|F0gA|@D zXvtUav7=t~*IDZ!I8Q^Z2837cJs<}=mG~ueFem#-YL@wrQiGo=p5FouM*+1m!&;zP zA~4gK6^|#g+`$!v2VdeVH_PlkLr&ze(2IviXaDoQ0T0cNd{Mz3@nwUifCYY4w93O-Y4WnK&ale1fQtEPEyLjfA`4-ND%dVoR2B?k1r&8!_mc^Te zPkdop|BpWiI5+)%BQIrZ{ZKutr1B~9k}>CL`kx5HjKG=83JjqRG(AOLL{E_y%X<{) z|Mf!9m*@<6fs2G*h7bl80C4~;@p(w;ALH|{QGz)(VxJ=~rL*kdj)*Tt_7r(R_44{} zc#q-SFnkU{zILi?aS&hl=j^w4|7(;^e2wSb2K?c!4G?NC6bKE|oud)|A0n!Y2J?K( znV9F;?DN9@{)gZdH^EVMlx@m*g$?;HWw~IyAOjUca}JisjtS2fu)y$J>ZF3BL^rCKCM@c(`YD4EOH9qxKs87n&Fhr$^Z(m2|Ne}x2*QqEFCntc(#w)gMcEIq{AAS`<`d`Is2E2) z)Y-oQ8U*b^6+pjD#;D!uE3oxcx*nni7wC72f;NR2;|Cy!X#@y?X8CGQR_RiiSu&sx z-W(hvYJ_zs9e6_Inu+ztBft=NR2Dy$5cB`&87u_vRcNR@utW`p--X#hI7=BhAsNWb zx>X?BoiHTcm)6)8{LTl&U=fNY^(rZI$!4-XD#VhY1C;&%(lps-L=!Hy$@A&KZNp==l zhpO|n+>RHvu78?EC~M{ReX19YY2?B(2IWP39>?Sa_vHyApL;oq1I}SO&{Q2d*^`fH zc8fYSiI8PJ@qwQoO>1boYvf&>lksr};PqN6_T;Pfhl#B@fcDDNCOY0=O~~rNj*|(s zYguITPRBt*%#xu3U~#t(Y0IA48R~bshsMyz#IA;?&Cq)#YX#=#DyOjC>qm_js62suD3F{>O7i>-9KNgZ=qtUZTzXG)(G0x3d|i9!I}4{w+qb}s zBkRjJYA#DuP(KN9-5>KQHVM}qkPM*UiuDn2G#GLk7?saWPd7xH%??$=9C>KPBkqN~+ zlyb0)8DkI^^PPN(vx)yhC2PPWIRz+OZ!JGo@0?6zF`mvSpBu7J2pwfX-%Bn)!#$Mz zg5b?lPxt`PqlMq9h`npMIQXL2T-RvR^5pAKLw$6BMzc)60E^Rxz z_S^SQZv+m##*ma}8tQStNIr7hS-C9kv2i^0%V%o7RA#{=?vw0If!la2G@m?#UcS7o z7k5nim@EsX*7NnrCG6KX5U)SLxt+ z{{(HhoF8aEM@)(M4tQatfJn$g{NCFLh}Uo$EF6}yNwiim-rg#)wY+d2j)0g*BUz>> z*SNDaE7?^0;@3p=K0cM?C2w%vZ!CQAN>n>eH%K_!q&xTv?b~^5bvW+2hJBeXDzkwBz zE`@GcES%+%=7MJ2zqgb3NX_8gGoN^k5>vj6PwE3F4u@}ePG(We+E5fbs;@{cIamt- z+#dA^MKk@-Fh9x3)vz8ziy%-!ZIEL??Jv#PR zg!(JVNUrRgxG!jvnLlF{{6en2OAwcrSbDxoxP_D)tM7+!L9egaX1h0T9q&g%OQp~>Nu$hNPB@@xNhO?Nm_GQy3 z7gt5@*vOJt^sFc{A>7i-T+|IAlb1oun70hs#y8CLp=Lk}O@I_q%Pj3K%O$D35! zNVQ^(H<*P@et%i|P5TZ%%3?}=m!XQjkicbTTuxfmdC4vWHv^5@rItOxMftvk-b9`F z{kV}Xx!VV8O5D`jPj$PPlwEDoL1($37*5Jyx}$<>~Xf0ulzFx$*8xK z3>9iKmCCf|tLS!Z`m+b^4^&E(O8PA6w+iAfLc=@XfAmiLK7dnB%_=!-*i&h6Q6KoLOhSWJRN^ zmoT>(-3axLrA}^zvl7m7UJOFLo>3Wjv-Ecy1A=%HmtxFtdgWp%=v*w_`qOkBiCeUf zsJ)D>4ip~>u+f_RswOcK4bw%$zL#FO@4p#IESTSqP|qVyU>j-jwC1sSRc~?(f?yO@ zf|X$n8`jrM&W>Pan~32bBRtYhQ-wgtPv&4dyvo_OPTxZh>#bWT;| zr-_BokJ=xvZ4xEvVW;t4LeID{b(K`m2|>_Qao`V~^Qp;{lmc^qh^>Cnurfg3oQ+70 z3uKzQj1RY5W~f9))9Fc5dbJ-3vw2n;LZd*r-=Tuys7)+APOOR&9v+JY6Vl^sC$bZSiJS5 zB`DwEAB0Zm16bl`6xkRTK4jnrQ`d}0jtgc0Q@__?b(Dtj%mu&m=_L-wh6a=D)`h0( ze5ZFN*RSLETa;vERUwVy@a=P6@(1^WR;&RQi>yr|@#J9)`Mfb+5&d}qcZt^bhq8Nh z?$@AeG;6+49u?=*slpCXwn}=PA^oETk4LveM=XJY*0>*s;=#}Uu?4a^_PU?Ui_CJ^=#~otj3UR7n=V#eVZv@`Qc3aXL3f$C!qA#w zU&2d!_T>-piMl~eEBa{8psvBvdXlc6QFSqXJGT;pvt6YgmSjhkDxDEP7s(+6+-xi1 zQn5`7@J1{extoXe+1+p-i{MuoREC9B@KPlSmA>yvM(;@mr5e}k@$VB1E-xzS*QwpL zm5Jas^0OO{@Jth@sOQv{;{YA!>MePCIKzQe5b_6#Kw6ota6u8k@%jU>g~C@GW-nL; zbzkt!8ys>16uNaNY#x&Jxhfh5-UQjk>!vA^Wf9Zt6UfU+r1Cc(E>rtYBI=4f(2ML9 z%eCtoZ=Q1_1_sNl(^t;nwp|t2psuRpl>qoC*XfU5R{S~fZ(K?c3`Vl^49mB8dvWW4_d+`uBc4>DhxziFA(mwvyRa*I_$M7S-v>o=_+qW zS~1TStdp=41XbtkyN~+N%M@**EL=GW^lB7VWf#B7x$JKPmop%n`pD78$ufw`=ok@% z4zX|(z#iwNR*llCJ{CIg~yXz9}i*i(82GzWNxe#UbzRJ)`FA;6y zItmQ@K`AZQWqll+rZ7`=DFk%QRS&YwG+Cy;EfJaip2yTw>Dvx}X@ZOCK!PSuKGtId9 zx)dQsV`U?XB7@oP=$+{WvX34PNbeS@&IlJZ74??Vw$*S1xAjRjinMbZD5J{zX#5@{ zUp5r!D6r)nkXQK08+p5egXWdzz|g-He~A4Tj_Y)dl%WEXHe$Vpm&o7pV0G?WYbd7# zvXYq#XBr7h#LMRguS}2)5~p??hpAO0PI^Tbc}IO+=}ra~o+gS)-%XK>eV?oIqf3b% zo8*}I`AY@R$z3KeJ8Eo`<}TNKSKRk|#TIcNALRxG$K_VMj5B~O`5s?J@kH~snpo^f z$F?X-?=I?oXWBkyl>7#p{?63-1bj`w#-${e_<8A?F=P}Wo7dTOyteC*TFC8d5n}TIOK2E z47CaaB6F;b4rUkzK)wAVOX1--O2Gl)dblqv2lTrcTr6`QJ5D@kG$AZoH9hVt8Q=je zP{m-S+9Y_a1_1R44(EFTQXCSV9PQ7tfoYpu#vhU3P);x1FzsYmTq|F7e591K)SqQ5 zKc|y=izLeNIZ(ya08AI;s~`=3GSDb_sbz@r%{OU39Pv`7o=Jj3vYF-}Sm~0Dt|5w^ zW-@GLm~tqhmu^WiMO7f{9UiAd`w{4Jtqy>eq*UMG5-y$om@+1v;fC~E>)%Fv=B+bb zMw0XOvmB0|YZ1w5DmW@F?eELS-FzO{%jt3N_>%=1?{SBHSMeKEv(lC@ZW+S;xd5mv z-^g#q8Gb?*iO$QUN{IDGd8mN$BuH`Y)jz24vs3eiY{L~PpghD9)IonGH6vUF$`gx! zY|LMft~3pKExTU@q5= zQRaPk?K1G~I-E7_PqLqc?65xZawBqV8i^)Y7@I=`wPdg|9L(H^`1&%+b~K`QGRzqo z&A~wjD~GB2qa|{nHu^D44hUZ6Mv1IVG|U@LMBv{0w6UD9Ok$9zr%g%11+Sfpl`9VK zE-aSOG^ks(zDR4=c#(NIpnaN_280BYGu|O;%lA!m&E}s#T1NIX$ z_A5rZviJ{1@C5b>m=N*rnHSX*v6QA6&2R4winNQ&GzF0ehb~@mM@BDG2CQd4+j!yi zI#4}-VfW`hD1QnLaBRBk(}X@Ca2jX-WeMI+$SKG-rGDx=G*I+%6N}o=l;MXAd?6s!{FKf z03XKVvffO4vC)&$4sTZV8s6(uNYo2y)6D8!A9Xvv%jl%KJHee{8MT`S#I`w0@7tWd zA5d^dO0uJdC@MuR$MqV?fU#(e_m@9`tQ0YD!blC2Tvvd(RyBkA0}%@WANAgxB?Y>S z`s2;6yZ}=2UKYoF7;>XnI+yweLGBNakSIs_d(8U8NFOoK*$Yd#Oiv<{ez@JQR%W1m zE30J?IZ{LCJ z?cwOip>*$(H%77p%`Wdop#r|+ojRpVEp-q=Fldb;c0c^wMimlCORK;Hs}?%m4*kTQa0bw-5m^<>N$t`bpt zA-J93@595_L;Ox-Q)oL9j{r0#VdyTUob^@Xz!sl0fVew%Tn8b;a!T^#1x+OOokes< zH`cZQ>?72B2izFN%zY@kAzO=B>lG)5QCgvNuju9-L*Y^ROC520Jf;&)%_Guepo1c5 z^~q+Sx>krq-zM*~f=eh$mF1$BQQ`&B13=wr*mC?wrlpN&(s>B!@#JOtQkOnu@RcQXIP$2#+Qy^r!bdBpSTTF&`*nLnY zwXb5CH?;5GmaB0vksLi!r?A>z8mDy(+WM09jcwt=$_N&Q7mPc{TV1{IBJGuDf*adZ z;D)8$_ZqO%T{wK~w*@F=(j!Jbf_%}z2ocU|SAwQM%76@1Y`hzteR1duH^&QO`q)ip zG;neA8ovL5w*w)BLW&pZ8ZG$$2h(guNUU5yJFCpnQ~tUXRuAT50EX4HaBcDl-G_Wb zlfE&-AWsyfseI+w2?Vsu^Ch5VVVK4C6RYHEj3CI0z|)Yqkui#UB6~3%Z&o2cilfa* z?2<912NT&-~7`5SB1+*uFdtkcEJ zF*qvFAJKh(dog1C1NtCCW2RQLv3#obt*o;0Aa819Wt!4SB4;Y;xxbMJBhZvVX!{+`IQ9AqLRrn+KL@oScF4UqkljS zXMfy%G=nVl{em(0B9lQ^KjmgX5+~*fdq*&9akO~}-063q(!nn_>nRuY!opuJ~h)uN9cazH?GA+7CE9 zT0yz-nP7P! z{C(^6n{L#T*Nn}z9b>Re3l+eDro=4-gz}9pK0Fg`n?%)0<9O>Ktp#jj36_kT=W(qk z@AtRx2#`7{Ut@W!rY$+;cd*KI$%S{!4&L%>hBc=QO?!BATy0~fuUm|GIvQh?L;~Y3 znPW?sL2u`ZjAmOH31t0jKgWt|CunSHPGZ0dsc%1uo3rl`;ZJmZrRnIzub`q+aN>ZZ zAL-~f_H6fL470k%$lp<|cPYORV0VKX^IU&WnKzwcf zr$rC3kodlJi)s8NJ{L%Q9Y1Yd?mD2a@~;wU9n!E4XBX&UtQL>PxWUSJ6MVlTxS{d> zB5F&1P+KzB{yA7fs|4lG#Qm@;vD(@>oWeR*`1fM zh-8Ok0%-5%={(`f1!G6VtS8&z1+Q&H(Gq*UzZ{92BNzbI&W`!WQ7Y@HKsU#W9Q!b# z@ZPkN)JK1+qZ3|(2v4{uz~K=h{tNP1s9u5Z5eNjYY?eq-gDv^zzP-WDSsjV(5Tm$M zDqjI3vcRO9Y{7ORDBF4yXO&8G7;kHhPE^`St!)^xzNI7Ywcoz$@oWz_cHu6|A7Ags zk_eCa5GgZ^!zRwX_l$k<^Q(uf^nFWItmHD^q|>Ox!kIkg^96AC;gX%!`OG&63aY<$ zPN~m(k}M}!r8%CTxK^?a>j_D^d5(KT^fFp3ZIN$xpxuDmYcf07ns)km$*C4V(O=Fvx(W9^9L@%xVq z#%tT7N{#0}1oLsb_%DT}4ny@^4J=2BhV=G7SfZ~!2+JCA#Fvk+87K6H$3vUV8Q=hz zUtYZsxF9Y*;+9H!fQ0_Y06%TBs)qJ{nrln_a9v96B+{u;V@&vRkaZ z{+yJ$BFl7!>h7cYpPv{Gh}s18tRG0TA7O8V4B@4(Wh_QZlN;eu6dx`TCcEeNymQmO zkFokVj<#UvcyF*WsTPA7vW=FOHH*B4<#OKKv)YVCt%DZgYqQt;nsS2~mUuy@Km!;a z?It)*MEJHnXQb!kRLI3fC-Cn?bjugs*l(u)REEO>^h#iaWzf1qjT`dZwE0$UAoy;^ z?i;y-DPDYT#cgHOKsD#tRE1K2@eVX4KYDwG&0oCb68O~lE#wAgtrMY~-ai+ezI%`~ zYHT{v(&RrAvWrql4a-oFF=Ua@A-T?^xs5_+v1&v=v{- z$W8%V1K34yO*ZaS)^${4$Y8dEUo=-KIMVT6snPKU=h%t7?7-pTLGsbi;>NK(ov&H@ z%6$mtfv-3|(`47k)5iy7;1Y!fcGky zwYVoZxbA%XY&BDU{NNL7Nubev#^3tmd>g_rFPUD)c;ZCzu^<0BkoQ#xyCaSi`+1=% z76I|eEg@+qey_Tc$4{c{k3U{bH&lW*5EP8u?o6u#y-%mRs53leB@~`nZGW6gu-Vqd z+_b17QWtvd#J{T~*+*Z@HR$^dT=!Ny&E4p?KE~lNFB=n|+v8{EcP%9aN3ayn;V1Cp zJIB%F0xtNLYp_Puxq2IW(5fL(&22|Y@)KEae&=lcVr<%nemZI4?6lyMiTY^&UEVME z(qtdcMV`X}Uz+9qXhOnMU~i}bU%_sGn~0oQsDyalZx+csBfr5oMybawsyK z$$PwG{IM*Fsv;Ii4lwj69?gZ56wiE;u4s!y4}h=y@>JJaMN{lwrYAHPt05DFt&qY_ zmRVR|Z~kCCVH_E>lJWSlT|Z6PJzXgny_SB@La~~(Pl>q!pG01Sc+~8s1q3LF#Y!*9TrWHJdn39oG4CBsMi@G>CM6F z=GhZnF)2pOaw$-_ev*A2kkqH^Dytl=-nqNeMZHpT!nOBhX(%ZO;30!Zb(ej(2s@R8 zK{3$GEUyZ+NC>?Tn?tVJvnBoZ50*-CBN6?vUxx;^ms2ezHuekGH-G{S$gQN_8?)(- zo(5p4<>k98PqozRz41E{+*oPMHqrW;Qpls{)AMaw7;+3{{KZ8A7aa#{v+tv4K*b~vLHb_?9?9B;3v?3-I$ zdDxpjSlhg&73~Y+Gocsx+bbt-L|P3a;sqRwy=l8`mh}n+y7&9g2yef1gxx3kZE5%@ z!M>qD+9D+cISjW<2B7M$o9e(|KjDG*p#3&lkWXWf10wbowd~BEo0(}W-o|?dH|t#2 zeUqB>CWz^Cmgx_wWDWNX@qSgeg;9X_*t~SXOQHC+kA^4ed!LhY2p_bT*Of|>w+VgN z{I0P}Bgq2X7f?61MOtU;&C%%$7y1F#WO6w-_3}SMJG;N7HDCqkN`5k#O(m$R(%8@I z;SFmF#AM(7&e%c}(b*^7HoWTadm1zy+K+A}({jnvG>G%%5`8INp519>zPX2)p*ZSw4Z*tuc zX?csijogm#H@dGgg4eZ-W|xW>-ga0d5r)+eoeZK%LbJv`reCEEoZ zuLOVx=J!p!288;rePe;-(FFHQl2#7tRi-~o6+dgq!CDoMqJnX+ed&Si{~Ru`5V8I> zT0W!4uG&_D)CC*=p&98F&eDh%uS^ld_ledmSm`o8*7Ne$ai*WcAH5*l>thUlFuQok zU^ggMf>#p}pLNW{#||VxXe!ZG52-!($S?Gp&#t8ry^osP-s%})mRLPOz}X z0diE$fqDxRsEYk1apEAb5K<|vSr;Zip#;8}xEMVjk3v`RSg(z1!ErBdFCsVbQ&z@} zpkfQ%IR%#4R`-qmfRo3Y%oUHP8{Jy1K(`1Tlc(ekNA^iKN`4|Us_bs>H_SyC3hI8D zDUO2m7h8n4C}c{q=nt!F%4A5tkJBJ^ z>=*p3C|=UoG?mw&Y58nRq!A)^aW-KpNRq=GstsF1X3JHE9c`aP;BbHQbR{m~Kg}_? zJQ%h=J3TD~(h|UtI0(3F&~4ja?uSagY?=#=Y@tvvor+F=r+u#Bz*F7cuPfY&?seCU z13&qAVNzrR-GA^Z>%j%(1Bwb=22;+=zWu#DL7)=&4SZ8-M&eiHW!!PA<60T@U!PvS zj6JqoL^Iu|Brk4;(*H{Lm1o5d1f%RH?_+NAzLbhY z&@0Q6MA_)1d@-?Jha4Vz6TX&eR2HOgY?(2?b3C!1N*6L(+GYwjUw0*CN-#MA=M^~7 zVe)tRQZm(U_-dhmIL}1?C+kkK!%OHx1j4x%%OzP;W5I&aR=uJ&3bSj$V%5aQ2=yD- zsncx-gnp}z`vWUY_NBRFA5Hfj;udY2yy6Z3Cm?^@iYUR%|zpCZge~8MX(mQ zS6`0;i=&g;MBGEuN+;@_71E|JFqM}$xYju5>-rF!)m}c}Vfh1lo$96sD>#qS6(CVH~w!VzP+n6T4h{F*`tI%s6-xcG)%~<-jQ#D!Olc3lx zg=Srp1-g!73{(ueVqT1;^CPb4a626ZwAd=oO8p|Eqy_I*tsCGL56Wq06PRsNA;wj* z$%D6*r6~xPquRRXZ#-82B?K$8>}1$ls2BaDz8#il3dqX^a!WclTe=fo1U%muUJD_a zEoWHL=}z=uC4C2zFIQG#-}uBYP)$5K;qOp7)8u?qnzP|$TYcwV@g43-fJvr4e}+p1 zLLYG$r7hfj-Eb<+r$B!c!3~+paKBk;qqeVmWNLSLM8unI>87>Gv>qm{DVOQk*vyxB zj-o|uEub4FJ^jeezraDS#;ESB#`O1A;G=>}+S5?A3mW4~2pRS%F4Aweov#}o9`IJr z1a(e*77J+;Y^WB$^LBaA0`tDRf??rvCejIlQHR~jMY|J@p>j#spB#CJ>2 zj|C&kpNUm`BImM<&o0;=7Cp8$OBw#Sn~)V|Z+j7$Y22k!~%S+HbpI)s^qO@A)oQ4fo(I zGdx1>_JVFP)j@!>(W#|UoTjFoS!sAMmNhk_BEf3}Am^F{6MB&%)0yETZO;b^5zEZC zyV92(q(J-LPp0!8?I#B>*}sk)YvQG)7T|@%eYjs@0mE3rTMw4QwJun<+4s_i(STON zewSnvS68;*o3%5fxocZDb8i0#X4mgy6rju*>11X-767dg$T{!sE=Fe*J+;~8pk7(- z2eY;W&Tm}!Z%K5$0+O(a!WI6*E(xM}2B1EU0iKP&xd2G{^R{;Gf&{!>-ZtOVW4mzb z6r~9K?irzhJhKq4lSyhr80jEYU21i7u;u}iMV}Y8kg<&MbJdSnC5zgu)CFUEPPR0w z44j4vNne%Iz75;ea|7~6mGJ+My|<34a_jnrDFqBdK}0$P1OWvkm5}Zb6r_}Hq`O5L z5d=g)Lb|(4Y3c6nmd?F-*R}PW<2mPk{N87L|9s;c_ZVlKfv~TAtu^yE=bCdaVd1Mx zM{V~v2VR2NNQ{+E+ixCM&0Mm(Fy&jiStGoe#ApR(Yqme!VxQDLYSRPwVA55V)PDVr zo!f;VgAm=XYs})w{`i-lcig3_lc&RFAP-RlPCD{_$e4z1^lyG5xz8Ke9{cjK#ZZk6K6!KN-P)${kh_({I_GI>1P=wj<< zp!UB){p0dOqBq@0qE*?t%Lm@!R8PwumjuP{~ZrACjH+rm+IDZvk=#zJ5X=l1YMclIB`R>V8e+&sc zoq-~8D#HD*g`u&rrcZY-UI7!_DRXPS2O3C{OnxDYfeezNTy2g@G%Se`@sFC@@TTRg6y*!7))$xACqU0fRF8D<~Tg|EPh1#qan zj0B~VYff#8nq52_6HQKm%DT~9PB~X@TE~tE%L`IY&NcGnEX{#gact2fW66aNt-DCJ zH$C@p`QtHwk@9zMp#MAne#8XUSbl#dBi#A#Kt&_BkElu5agc+};fK{~Zo88{d*I5f zO2dVhqB6lRGv#VL1D#C+t5(qNtbgC>c9UFt%GjR75fYE=^-eJE+Eq(?baPIDrK!WW zwcu8EoBNptFQ&n1~cXd^u z0KdimMvVH4Puzom0O=Bid~(YXk`HfIEo8TG+!GDjZkPuV-dQ*(%6XZfceWFKrQ+ax zJ?TnCQtlPv?q(?`R7_j%i~DP>VQ(kbE^_I0MA5>SYX_Owb4MkbtKDjqf_WCfyu&hL zXE~lem*yf_-bfN2+p;kSRN}D`^T^%U2*Ib>8gooTa!~8$!klca_0oz3oJY%-&9MI- z6)Le~aMeVkL1Ph7c$f_5Q#NN-*cjP(g=1F$4{Ikb3bBP}J~v7u9&r6qoa}$^3JSfO zXXBK!d`JZfhyTnwkmHyj!@f8tU#fJ9#dt0a71D#cx6wx5H{|T5lO{Q>H3TsXLs+CA zwodl!3KIq1ZlAk|(<{<3OGYq7YPc|iBF;kDhtxhreBJF`tsM`V0an*-a2);EPzNWF zC~_BV@OPrALdJ^SpTK67x=hkDSiEaiwJE_>yR^w9PzA~$50lrN>ggs2@2}UK5du^YQ&MZpzyAiREU(+7?r{T0Y7oaCFaX=r#@SJUeZ7WdL2W=7El1 zitx0slaNCJbbVTLq8 zd^G8u_Kr!-pyasM7GckzfEnzxT5q+%OnqUqc0#MdO3hI%_X|H9wtb;%=E#$G%6`s|B8DFw*o@#3U1xVH66U5LA`ZVd*9r>T{4Waob1&PL+^cX5?L1B&l}- z-YwPXfSE z13f2Isc?rGdX5HqE(MdX@mHSzWeI=&gu?J+b0|*YPws=gfeuutZRc5d_3yWbco|lX z3#4}*S`Z;s?%rkpwQS~JufhTS^#}&g?cDwfLU~}TG@v$z>WhKDe-{|x{ezT0XMgh3 zp+Tf+z=V*SiK&p)U4i)s=8w4q5{yBl@ zpR9{V`+7p`k0ct;q)qPy{+J{K=|ex}-%Ql65{i%}@)#7*;v?)%6*I(B3wpwNYPaw4_HUmHB>3?hq1%cA^iA>B(Dv?To5I?;Z{UI!`mu{t| z0J88uM!b%WlIQPU^Plf-q5YuwhyaiT}qslcr~9q2^tF9E5$CEl-m9t#ESx)N|{KOLq_*=>iC$?!J?l z_S@$~ekwy?mD(Lh8RSl&=OStz-u|t9@ce1~JYCeEfDzpMyJR_4%m37fqC(&v`^%0HfuB`XdZAVVl?Ar!4*J#eTRyw&z#wIt|5UK;&R?uBUm;NH90%R%+fL9qb%o*-7brMHg%{ODge75ub9|3me9_x+R9AXWH? z=$Kqg^`3>k<$n}wLgpXOvA}zip-+K92#_D*9wmmRApA=Bzx@;A?GItW=z1U{4GGI@ zpc+k4azeIH{qX<1(hz_~A&)*^iT44KN0h^Z$P%Dc&;6UHzy=zBTC&DkJw(?YMlr(R z@~$ZUa%;oimWWupn8#0{{?gb;0k-2o4y}{0!Ad;#f8HGUm^IKfgu%7OSGWNQrx#>6 z+vA@I$^TZU1Ai(5p+mU>qzv(UkWk-sagg{O6EM(Je~<<3v?9e8;zBRLAV&c`3mwG=Ug??64*hLq5AAHP4j@*8E~C(ru{Kk_2k@F5o&3J@WYzNHePD))cp z{EwGSk0J~+T?8c2jbF8>e)lTS=JL~5Qfg9WA(~pI0XPWiGp_sftnA-B1f$Y^7{J-w z+lVge*N+iCHb#y9mn_G>N%B7N$13R>1A+x1e-(v*Ry1*}-~KEJ`cL|<M<8u*#Cc0;$3(LKR}~iT)NCf4%d=j(v5geqszMUIW54-wY=C zPmBBOcX(h`P+)SY>aH?^nmCdWS(HiJ{~x?%;E(NzweQz!K&sFU;djD{>(bu8H4u0| zxre7|KnzVc#6Tb<0WP=xUotHJ)>yG;Kixvk&%v_2YS1#-_!#l9|NZH|w6Def=X2YU zO!&~RB>=SJ=FGwoUb5;}X7&jAgp)^6Sk9WFMGtjv=4s?bwAchK%ti~?gMcqZaCOjr7L744pjKFxYg zl^g6d)ZS+3%Ey?sHOPue@M1n5OmYwj-g<_5=j%L%| zyc%eNl|s3KuuAF6&w+0GAE5^7EH{fSQiVdtV&A#@kOS8VMQp-4nC{PVxBq1CLj3;N z#CfA$rQ)_-)U3L!YCWQTw;>I*_k)CW>uY+ZEvI0`bhTFXfj1A?s(R+;a}pW#LDH0g z^w#>aqmJmY>Ec5NyVWHP=9g`u{5C zSDZ#6c57E5592-R2W9qEYWJtr?nD>fEh$P{BKCj3^FgY7gmdV^IS>FzsEe$*?Zku zpfe%?sij))snqrL;WER3s_&y{eZt=?M9FAKu#HrcjBUq2ANbw?$88RdE_F@S<8B)rb>>fk5VzbAv^aJWWZijQ1d|DXSqm|J72s;xSzQL5gDT+y`;|*7`9|58LCcqPzrBC=v-Mgus|%{W3IVDK z@=Cp2iCO=4xPQ4)ei|rlR7?ZMKC5ruFavXTYxh>RTuqf)&$-(5?wc%@Su2+s$vTIN z90D-4-?w!}ywjevJt&nvFzl6c1Rd|~uvJfNzT@YvCpHl(OUqQ;VyVICH_CXSfW*W4 z1{5H~c46xNHaPbrha6qPrB`=VN)$w7KbYhUz1d#_N2UuC#&&Ik8!`-p#_iT`H`SA+ z16GoWoIcJOsRYb<4%I~-BSm0{#MZx0)Xt+l+7j@CWO zoa=aKUV0ao;fGQ1dldYY|b{@ATt=9$Xh66^mo5&VXibRroUl<1#@RumhH zE%@V06w-=YXHlkcna-W+3X5GASQ5@)C`ReR$vRb*xkZ`4t!(!u*bO2GwgCOsK z$kyS~)DJdn4L#MW`dlxjBJ`eDia40B5)@F;(o#+*?7GHs4Q2J^!{EL9Ey0WS<>lop z$8)*!hbp@r1%0yXl&8gJW=+TFz@4@Td5}+W4sjz_3(L5_MgE*Jg2}VqVDhYfo_LXQI#+9G1ab+zWVf@SyLv(^(5%* zdz+NqK!J)1rLNG*8`Swb3|exlTps{2lGt&v=OipndM)L{zae2eQ?8kUc!y(1AbgFLQJ*Wi{tk?@8f zN)pDaTCqzEJi?%au!;|DmQ4W@EtInER8T>g)iu>oy~u2mI*-u;4an+C0u5jiS(omH zl=2-Zvawk>)P6D(`#ScqDQe^?%Z*a$FIgLa>#W-^!x``sYu zJwuU_-#)6R6YeI4G7lKONQXi0F=82zBcxVwKNSx37&pNjZ>@j9wIJ_=l6)8P3_I;d>Ph^B4`*aQS)f62r84(maB;ZcF;(mN0EsX1{3Yb>bIt;xM zZ06$=l4rsjHn{!nUO!hq^6%B#ztEgs!R~l`iu_@Xf-N=1AJT){*QRU!DCK!fRR^PF zOa16iiBpQSg>4a*j|{yM20qN4<3GAanTCvhT1At#A7E2}`Klolnw|s*;PHd}+jTW{ zePkcK4^Zz72^z?7;X?xlB&h3LJ_|XU1OgVn76B|aka>VFOl}6~K1-vGiUwYJ3O;P3 zhF?4+EQgA9;2Fb>O zRT~86Inzc6w;u~?Iy`|KmWxv?jg9e8VEHHY?`!SlJCps)Nnlu-Z2u zkOhr$!n(r+aajU*;Gg5K_!lp|s%;s!5(W29mjJ`rdPDCVLnjCP6y>xTs$%)eV)Ao> z_|bpN)uU<>H`Dl}dOjD-E5%LPKNx%PcDZ70(ENRYZkq(ajqS6b6S@K}lbRVJfzR;a zyvzFew0-4G##bhzRl=5*mb#Hv{i6>uPXnG#?^QnGi=5Ky4D&=G9*Z^8DKQzLap19& z2r^OvhMZ4wf9o1{O|->S+J1XIuE!9*_I z(WSnCac_Uy-JQuIW}V%LY+H`R=E3;Zd{L6s&H#2O$aMh2rgS2&lW${9ZmJeJ-=b5g za1OV_H(a#dwme9mh{=<9+He-<8hiT*Uo;a>Y`hQ2Xo;bjh+EtP&0wo<{Q&mc;)0R| z9EBf9=o+j}V=84ROV#|bx30f^$1)GNS~WI1;p?r=>I7e+g6Ch+*3qYhG_f%m$axT% zM==H<35GV@bkNlUAteBe^&a%g<+)=lzoq6oTE4t=YPuASzf}1i3}ce$c*Hk&H_N|b zBIY3E(x~8@!@n8AD-BDd_XaV{NxX z(5?RPP9KuHU{d=xVmb*3YrO_@Fb)GktQ25u1a#}Wfj2bW@Em-1y}p1rm?nw+#H;C9 z(>iPu-cmo>mVjQ$U_Dha(UvP~U7I;X)_ZDo%`pKH_khNG8EhRa%y z^Y;KfKXV_X)pwlo*LWx2t3QWZ?BV)|p)WNLo@lUJ?x}8K=kJRSFU7g| z_isNkmePCY;3k%0wzxU=EB0bw&O^o`%IoGB*zJ1Q>YT1y`IxK0p>Si-I#~o8H+djXtGXGj>J$~0ZDq^?j zdS#1i_Qxn;P52gV&$-iDvL+Jm>Fmwc)()FsRhdq!@xA)Ok}E8ZUv*S!UxtlDAo&a| z;CsBfi~ywJY3K(hq!sof{;$>V`q4l8dI|4439zlL)r9Dvbq~3WD}doLrs;)Sg_!;P~N4oI4hALr{)z`7q4TP zYLz|_%M)?+%VWCZZ4L>!J@Q;L5`uv&a{*LP-X(YHhacWA`f%K-8%GEXB&%k zYVcRe>^RNKiB7Y`w^fVSx&a({*h-D{vBd70QLO_QO}Fs=dc~1G>jv(JM?;veq)x}% zd%BF!I3IEbQo8e}V^E*e%$)D!#Y?Q5PM7P)P@h~b(ZMF;b`w0m@AQc)@cfHN!P^cv zUchrl0cx6rR?8?9ZFCfb01*R97M)gJ)UJp+(>HLZ*YsBabIF}_;%Doe<%GCa^; za^UEl_I)Gl-;3g77P(erzde^*7_*aYN4jH*@1k64*mq+j&(La|@m0g6XJ@=lHFs4i zzKWxpSsm2YKa^4{H1oPs0u5ER7i6AvG+d*!BDkA!8K3#m9L8&91j5M`dXzWh`edK< z{l?i$F7|u?>#~dK!I^i8w}()8Cg%di9Qy(4E0&33%+{z*mr*{0yuDuDN0-lfjT$o^ z6ujzDu&9`1^D2qaJzdz_>XKQjR^z+A63^)T02~%{>(NJYX1Cn6fr}M48_qhv>D3fD zM!%Y3X62c~y&S0y=Y8`mSDm>NovshvBKG-%iH^^vsWz$$?^)X%$kVf5Z`7J+I?vF; zv^G9>rAEV+z1pl~_`Vd?C8%F|-!@6qVuRg)$m;8O2u*REX_Bs1&-7mpzRyR~z35XL zw;g@jrjY&d4F{OS%9R*#LRwi@{tR?-j1EY&=}EWO<8JvobS{DMdK{ad7S2ler&9Nk z8?~0U#7OqG7QlSDj~1pdF}If~UKcq}xEWuqlQJ{oo?7S`xeuIbqo|u#_uWpn703|W zH&UW<6?&<+1Lf;+UV)`BqjU=Iv#8abJBU=S4{lEF`FNky*K5K*m{#B&J}oqjzG3-z zh^o4k7(DT}gpf@~++Ds7*oNh^+e3 z){=pG$+A8TOjX4VDLwbVD$v!|VI#;+=ksoCHP)@^Ws7eXi{%~>RPv}>*nXipe94SB z*^Mf&oHXMl!Q|v!k`@2(%-AJ^sfq+T#$0%dN+n|fUx96{sAa@JhD!a}2J6sq&V%M- zbLCppzH=w^b32U_5|s^<3eFyVU8^N#_ASv9J83|>jw#l9O_zEYPa6?Z-#)lZBz9}H zpu?&5k2kG6?@Y*UJL_XsXktrt z@L-Zj5p=b=__ECImriK9jlo8rnYU50*ClYYW-@b4jlW)ZJURK&tl0+UHG^R#iT8r} zeSaifB>GXEu4>FLY_NG$Ez0bEY$V)sIE=Xv&`yQ}T$05%+$K{1^K{CM@kx>>p@7}{c`JN?us4X4v zVp8{HVK51s*H+bio2d`oQa{EytKZ`Jc7fNS$0uH$y#xF#%{+(GYi4}~Q8D8ibcN}5 zJTUE=cYRy=B^q-i*6@*3Qs%2MH@+5Ot)|SR83Y|o|s z{JTJ{`yTs1_Mu15+>}+VT0b)hbIo_+zT#HfRO6h|*u(DzFe&4x{bnp$(yP!H>GOx5)!!~pg-*_Fw30>FrN^dD$!a>v%l6coZ+xF)c57MEbR*k$ zvWDS1KTD0a;yHTja72Ob53kb;f~VE78f5k_anC&4i0H#QDNQlU^}6`b@smX&*CsaK zx!E&6`+=>YF1}Md+Oy|WTCNtf_HJ}J#AC_P?zL-pFpbo%@>KES3?)i`Zlm#}Y5`0A z)^u7@ZIq=RxLG$D^~zgk>%4Q9)uY~p%z1E1P{Bvv>tJipAD`3rpl=)ZJa(;MW$OIy zlru+tj-JMTtv;-BDH;qbo~mD!GIy^(g@wZ=CELO>w$eaKj8k1|9XIdSJl)H<%hPa%vUVZI8Fj3DutMT;#kqfa3E;5DfIuagB26M$S(5>!Vf` zrp>QxKTcc+C&RwWC@JwL!`xs}2D^2_*ydP9RFS2tVRHIRRjdQcHcVE^&80-6wj+ji zi@P?7CE*?2L`l`^-gc?hz;hJh3$Yjx6gZSWqn7+6&*dN=(GLY)V|7kLVW3)_eL!%WhzUuscP!_YpbgnB|2W6)D3Emj?Cm?Z6x(2 zY-~_NCFY<|`I<{D#)Vtq?aCgB&Y%1aBwb*EiE&ES-P0mjNZ#JtaFS)d6m{BBV_=?R ze7@+ri-E=)i)?MJ-3pmr)B&On$DW&!y?tfZAQqAFziLn-w@?11<66Ss0+9?={I#v?e z+L;^Z3OBVCN~`xY3^Ot3@xXzR>j7kk{A#(){KE}SEV~*L?!^|t_0`3JH!PRd9yeCT zvBqjvmzd=r5|r?ro%u+?OdQA6(}gGyT6-CU zUGhU-nsc$(eBll^L_SML9b9fn<+Wf?a;@5?YO_d;d&Hn zmtjV4VNl6r&tVm7J5!Zg%Vtg&S0mP|W!HVHSkqfW5%OMlMuk$~v*WhtFCq=aY$6MT zE^5kfo7t_A+7cp!gB}RS)OSATJWYksiX$@H;rOvC?*L&p51V1T{W~TjeZ?^oaU6HAG1eu_^zrF+u*UhVv!7^R zfL%#a&op2lDUKPezJ4Es_!zBjOyjx}d{^j-D7@6RTEkIW?7QnRlb+0{%Q z;!Q9;b+3mr7S|t-(LtgNkJo?wh51)N>&Clb4UYawh;Ur$tIO=L(^aZJW@nxnsfHRX zvwd-y;Y$7BL(TlwrMc?9aiQT-oI~gepZS+WT^10G(xfGv77CzG^ni;-V)P~=qKLXM z!KCR8Yy<6s-0bJ=qkROgUV=InxD&WcWKr-F$BP6Td%JH-iz3&|K>)-5S+?uRA=wDiYB+i}pjz zWAHv7Alv#`krv6`BQc4*&z;i=pnqS_hux0Ha4_P#=tmBWK^}V@OkrABP@R7af>FN; z(kk@9S6}a?hBJ>{^|cL8R8Ki_yD$x-Y&~zzoNRvZ@MUz|-noTyejm!4$>yoJl0yoO zj#~rCrMt(X=hFi$2DP6`RPl*UxtfzoZb}P?@>7n%1>BDHhhKbVa=k zJtOcR{6j|iNAMrtVw{T64JvUqKNVu>CZX9a1mrw6djxDuw7Eu-c5_D0xM>-W|dG) zYD^KV^0(2swc}=}tR+@VWaLQ580&^8rp;HUw#c{*6V>5%wiFRn^Y2IE3($*5XLD=! zyfgj3c#Gb6s0}-7)=S%eTi{bwgAvQ)<^iVYC<$NRj=jbpGKP%9=OOqMJFMZd1M(^v z_M;QU{ED#mhwTq5Q~J=uS@?p*6q+6MyXZEXC%8@cqH!o|qES(B-1*JWMuQ2;w*@D^ z2*>X|)Gn>6%Ft?STR4cVh<49#sr4b#G>E9#GomPZSlM#GursNSC4OY5U$aIZ0k`{B zzH^tdi`ufq#3iab-lrsND)SoW-ow&P)6e^+XAOKs0`H8kprI55<;bvw)-+~wX!Naw zSzEcmr}EEWamJ+*y|vmZ+ebFhF*yul-yS>=7vznhen+@ur>z3$IL1!K5S5BnzR@ZB?x-fGsac6i+TDG7kD#;+85Qr$PHKA z!J3$4E6e(Xa%eqdu{D{*H;+C^pA4I!Tb~K)A-9qDr6+yoUk|f zqZ-h5VeXB_6Yq#cJbDYS_#X{toCi9F}<3;CTYrd*9BQWYmunb&TVv3+KnA&2EW#r zZFM=iGB$3foYRGjjKLqzxE;qHm<8h!*qUn^vM%bkfXJCJ*_>kPXx1cT{)+ z1^-9vn<$%8l1gzepK+|7lgM(-+>EZf|5=vRt?fnB^xf-`4SX%i(NadCN*D{>Xu$-L zj2v&dRJl7JT2(|Htjuu_?U!21Yf{r5!N^Dam1&vEdD}PiZJ5TtqMr#~#<^bgdQ>1Op4w^P~#e`Ifje?6Nj~nvoXe1Vn2Xfgu4oh&@+=64RigOB>}@&``G?=7mKPwsQEEOVPfahyw_?wFIFs6r zYkRzD%p5&Yt}%d)NzIo(79o}rPa3*yx2ckPL!9RG!D!nifyv=wK`TkVU_@s1>7+wr z02f!6G^xXppRk_aM5wT4sGpktC+>l&ik%=W8!#EV;v0?N6jCP=5>=+Skbq+TdQ5gj zhsK&~C5kUo7gM2Q7oWb!{d$Q|P22D~iYex?+7|YEjq9q>)SsCNBgY7<4>XS-6O3=s8lR@3`IxUd=gj}JLto6+Fu{ge&=u@7i z(RceilbdZh$~ah|A z7e1l#;CG_?U0&r`J5n4nKV@KAS%4{1=9_F=Nd`EDTFqCE@CqAlUq``d3F05yrsQyK z;VHv7>S8t1><({;bB=f6v%?vFRJ&T3Mene?{|v8iY3XcwQfok*t4n=BeyrT@*5-79 z>gJSjmQ3#09xXiKj=(539!f#BZ(u^}%mGhDHQ$t-Vl`?QKBlHdjn%;5aPb0Zjb*)( zZSiqqY|_0uyHjDuQ<*hlIV5Z711qwPo2*ZL+bQuLKbMk>u|3X z$dum=qV^*xXwNb^@9Ch(v}n=TDc}|ciO4mx{KC|dVHa=RrYt6}&A7gftx%zzch$k` z$e@z6X4?zf)OM$PdjGb?+)x)Y!^L13_+Eap@$vzE{`}2Dp5rUX7)jEzBzGBYbaF{IFl<+eD|XQgcy8_LK$W7&C>;E*nsoFS(M1;+J?=eOx|PGmprsP z$dC)W2)Qsqa=``xsXDh$7N?#$%2Venuvn$9NovnL_pWn_1mAr5?CsDplvcQ!8u=81^*n=+u&BhAh%sR=`uU@z4C^NAZ!Z(7+@SR2_DZhmibg>k?ub@tA ziC|^W(0n3SzPYo@!=SI@i}{WM$wLDr{h~~GW;U|ZHO`BNae=%@rMlP>^;3yLZGwE* zF|XW@&y)xvxxq|W_Et65o-CO{o2?uU$xr8|J;)@LhXz)Ifnlbp*2&Vd_61hKQ!gV_ zWXy9M#%Nw0WKG{5D>yPeyL}vI@93v)XsojIQGYDFE6HoaRtKhoTZ_70Q)D%EOfs$P zGqFXy#?BT?G=~Z?@{v^hM%m0M|4OP~?wC>7L89Oa;TGe$SL4Qo+|oy z%mSiU$jrd#ofjGo+4`q)hu+CsPhj(p4kguU86~ez+3wmT!?G4GtdLCArVg(PkCHlf zqwQ{3hC5GJnvIs7kB7;WDafUX;oGmQ;6K zsrqpjN$i_yva_xJjq$yQwQd;Zj@|p1;ZyGJRS=qftN7! z$#N&yyQP?(>DV7SO}K`f!@q6G?l<$$pLrSi#W5il2Pj@AwyvU4I#yG!h!dZFW%zxh z)7LRwY!D+Mll1;w42Xy{)ou)f#D9h!UczZ*4C(dMm#>W(Afzv{Fy-i&w2wyk6PmumTEBmkc$oC zwg;JdO5$AT2*D6W2u7WmzGDTelGD?cvZkgG3h$}Nk!;nCEJdycALGO~YfmP2=xuYR zBCMFJU!-vDd~Z#Dvcy-@E!LapCPw6EtlboNka=Edr8&_3yq6Nb1F@ z?+NNQF6-Z@9bO^J4B2Gusy}deOhdYS-(}QKm@@5*DN}Xwu+F*AVh-I_DVSujTl{(e zZ`ygR*=aj)Xwt;2EEDrO z|Biiiy2qLyH>9@9e9A_4J4e!7YLZ9Yq18ceyhb}9{Ciy9Sk&3U!cbAga@;a|0D!j9 zVhLBDR>2|o8ipNZkW*t_@-$lW(Ls@lVb?qD*Xq?vi)+lR<~7A7T|CSy(P|E@<%4d- zCWBSgo#Uqg$FX)Ay`3Ihw-N82V?bs0Y-qu58v4xFDIek-lyM zlZ@I)IyI_7@hC8H;4@wP-BI7n^ySCI(Cx!qwv#PXzfB~sOc2N^(8fL)DKG`_a(<|D z#+C`TV7x%>aR2t<7HI{y@B8CerAM+gUDX_S>@;748efE!(7Yp5Yd-pZuDzZ0gz0Uj z&Dm?Pj_x?XMWPyPYZrYfEW27mF4>YZVlGRaJ5PPx%s$p798$EpMh+)E2G_T4R2;U; zy7K1Yp^o27-Z;htuAQ6~xb}dUVT!eBs%gHibqN#)UW@CGGDq9|2~Pt_RIik*&ZCs) z97Jc1id9Sbht#A`@r5HV)YFjNO%=M%IZiz?t8*Gh-8N}Gp__f%a+>V@UA`ye)45+0 zSX!UbavO@b%`eHbM@fX%FMK}_o)Ge%eLZ=82EvaGKU>Njo-MPyq2X~Zn;i=Dk@?`= zfLb^4yCYS)#;G#AuQyv^lf$Q(kG6v^op+1sp7l!p#ip7Nim*CdNKa*#6gF_nWBBpr z)+V`57Ao;t-sONX(^S=GI6Z5ptV~5QaX3IePNMn8Eb0$ECQdl`-n^c-o%4=kGEuhn>Dv;vJ6)l@!%Xsf^M=1knu;5H$okywyMa@`Yb`T}XBpExB?~LzVsMOLOD6v)0JgnpEzuk0<8e8|U zGJC7d)@e$eWM^_sr1GSa`g!Y&xeeZ`p!II2BwWV)_zb^Mho=0%*tRV~b2wYIf@^$h ze@b)0v9CCm@#R4SFuH;qx7xOd|1!FdZ%Cqu`d(Rpwn&b1JH%*Ov3&Gao@ULC4NqCs z=i!ps7C~C!s5kT*!#)l+1FKpg71^hkTnH9iFqctZMUPLwoU~DOdbh)r?j_aJ`%p_d z?=Ko}gubm0m|6m!EF#ywn$61K>k%w~uzT)c&jA z1e!0-$F%gR&c2qsTeuAq)T33moyn3BRa#qc0)Xa>5?QECsFPLZQEOF&WwDBWnE3pw z$Oaot&;7gmZZ=CAX9VU21#hzQ5`3)t$sG6Y6wbh;NpAe~@pm72BRF_)6A`1KPK1Zr z-tM=O)MUAQgLjM;*L>DvuHy^3^u4Z{vMhtmCJMXbm!%K)9!Y`_r$DnhT8^`gNs@Pf zNp_Po=WV2Ac?nPE;G@Vch+>u$-L_RN-b9vIGAQs}sc^i4lil~=1TaL8<$K1t`R}!0WS$I50n3LgqZQ45%_OFJT@NQ1SqdJcXGt+O zrv`IZ4VUyknt2D#gbJQ%u#T1Nn+T6~ScQ$bJ_Deul2Qovg8F;!4!#K7c3wTwtwq8$ zRq9cVz4`oLYx(AlyYN%;!|`DrW(PN$FI@WXOU&`&SPo}s1H$zdNOdejjwp{w#kqT0 zA1}G;iOj^!pN`iAMYE+G_D*f3eaDvg_@BKpB+p1_6*PZ{NaPnBm1}a`d!i)lBUi|H zvy7V@6Ys7Zo>`{oj04H6!Tf8}_8vB?R#LGA>fpz?W1X1Zo z7U=hpH;nx;px{p`&t=pMdqq%kCq0XeOK)#k{lK`g+AMl$hHNycwfN#K#HCj{B z6Ec8cR}N#Pj?lm!kx*WuGz5{dhdQ6koi5&B7AQ4?rD5kuGCyo4wmF*T)jdOjD8Yf! z5HQXbT!pjz2??Iy^fU(3V;p0e%(BnkZYM)M>Em?#+=KLQ1idVn#1t&=1p!su`QP(r zcsyA!GOp9O#;oJlX=)oG+NVA5i@PXR`2el?6IDEvPpSV@X;p)X*b6Tvw31bL!9qrW zAdSquAr03A_%~T-jU(5{HFPo^(R}KdFsI3E{d}*JhcF_a36^BMy_EA8X~fDQFfRx3 z4hcp62TJcib{aVWlO#(wdflTxO9_S-Tx*`xZu%g89s5e`V+TH55L2;lB*dA8w>^fI zU57-@KfWyQnMHaqQRz0QA|O=~$}=-pwk%9O(eUIDN$u}GwCO7#g!LbQ+Ig>1LQoG_9kkKsL zv^c)k#2&oLP`ffLIuIwF%!{OrJ(5N&Kmpt;8zuj^!Rxn8kRBIM@K?2n3}9UH7)ASz zUHq;GFcPPZPv`UMbI)IdMuGibLZem3n*leW-$%ab)FQHgfygJ|BF~CYIkUY1J|yHS z@~kj>hKL+SKaIOvT2SCcoR&98a0()&p=*kN!m^r>f`4fW0qTMLzW$SR?7Cq=c6w1c zXg5I^I2^ZTKHrD9V1j|eTp<6z^Km>o5HC|5Hi$gm!R{&|;{Qr)dcT+cmqWXm_cnts zTEYdXiL^kT%M+3%10naa9t^S|h%P#U?)LA3GH~%wih+9&*P^5TIK)WS!MZ|bSPZ`xfb9zfPeb; zkErhaf1dgDQTz*{{J;H%6#8e1QHmEaUtkNcDIylZe*plI3wZvBrNj%l+si+Gj0_wc z0AucVz$Ykxv&4z2YI{-|(7$k5h4~-ghE=IN@mms$7?Kl4Vgd?cQ}h6U(8tUDfaAA; zJHK}A5^(<-C`ag0Af=9hTgUghWnTSLg?bW`W{cxLK~4HMd?lK20hD1uoU8ZS>UMAiBpT05~qu;XyzY^vxn|C%%4-0?v3Mk>JQ+tTozWfRQLz93oTA2-4dK3N-!! zV)QdCg~P>lLy!(|gaj`jn5c+DZl=hefPo-@1VEs-sqp~us=*h1Kml0-N_RJmcdeBV zZ7RjoYeM!z|B<+P63&nzMel`{=RaN_l>Ak66bWFp%eUR#>hJ(H zaR4Urm6}{g9}`~P@y?3;2WW}PP?OhHAf$GGgw`Vmowg#O-~&XCFGuGINu9?vfH*NR zFM!=MBcGwB0BXJlSm?3N4wLKzlR_l3PW3;)N~hw2KYiFYa^!Ui-#3>KoJa$aMVk9# zTm%8$1EeV-MhA%J2mm3tMU0f)PHk@P(evrh40!jv(tBT6^#tjk%DA8 z()*ULN1WPkp1+@f!#0YyKAe)-cV8*BWwTwMTwHBqzAxy5HL-HUi6CSEo&Znn!}=5wISP)T{`{(K95~nAnHAuukABZW)VinZIU*U@8Uzq zVK$XBW$e7yBf98?&Bq4L{a)6;iE=q096OriFg>YrHaTyt7MoH&X_+9E9<@CsaU_Kc zh<^tK4BvriccwgJLR0tw2JZg@3>5OsJL8!(~>>>vOe@xGGLw)XA_#|-h`Ehli3qSZo^(qR$aWc{by@#u44}mzbcdt6I<=Q zTYOt{a+}q7F-pC5desVf>Ho0z-d{~_TN|h%N>QmQ8>tF{bP?%Q5fNzu3L+3xKtOsg zp@;~mD7{zdASFs~Ar$Gow}jpUp%YrjT@lauzVD9n2i!Zx`Nfg#cD!%0)?8~o^O^IR zGdemN@wR4b*XG(SHpQTO_#@nSr`ORphpxxiwBt_H35q4gL;#^#y)U`iqqM+ai2p&q z!Y(fjH~SU44X+BMbA7&xfNWJCB#XPmZq8EPL5o`6ncN@C2TXG?-$@c4hggicnhOz4 z+q*tUlFB~&wfM7`X@}ULzSt3?ko&XALmAHPi-57Y;&T$jpj7wZAA%>Orv=PH-mx@m z<&N()KCdpR&4CBo`yc$?4z7q=;*HZQ=IXaQOa&6G)Z%6Gon^HO4$`1rZ^1aOH;;mu z4R*fO95j2s3c?Na-ugU;bVIoRK5mf31%lZD7Fk|1_etUqxLljqes#$Vtp)FpZG^*c zaECX_&NTVQGN-z*_jdH;-2gS2bagjT#PQqF_Jwu)W^!lS^IXX+WzCjk{OEA!?y!Du zmiLHw3RXV6^rWN`$As_UJ&udG9N^%VI5=7yQ6;%2 zJ9g^Q+!D!H_oZK)bG?E_DA)?NBZeg7dHX`)o5m;N1uouT*x)Zwi@7R(p)Jgf!slgt zH?y>WZrhn`?g#3p^5?NXLf0M$)wv3q7e8%7cO;MA#0t42+0lBBSu@bzb^U(t-HTFm zy|}|-`~2|4ZG=ipOkvkiBAU@aXCq_yg>S&bEf`|g`ls0Zc7^F)B!rVOTr<-U45#AA zO0e^4@?^1V=G$77wTdpy%b5aC2-EXNS;X-|F*SjgD(t=wWNWZlC0RzP>gkG;i^)cu z3)H249CKzd;3LzQ!fs={x|rjh zT$ummFX=|{QJQe~-Mfm7KL!!)U&Xgg{KE6T3yjmeZM#Gr2kP!==Z=+0+O}rict7C} zqn!yNu`wkK!mgP6fri5{RTFo{(si|BC2hQ(9OS^EE$?eMvmzoFmBVPo2A2Jz4Wq{~ zmEE_rX0sH7Bb=?q%O{8P40xI)mHw%Vj}Ml%Epr@yBji$f63eJ^rkDL|fd3?B0;yL5 z<}a;+(Ss;AAza$8gJW7s5W}SL1w*tylJ$>w&BxRA;*=$;5l+^D@`$UPEyz0rA8X;g{yYR|FT!c}pv? z*@9tp+N>5Jxldre@~%ZY-l@&(U0k-Ps@Jj8mpns65-|mdlDC-bOu3Bpmj6UY#p@}P zyK_O*n$>R#n zdlxphiqbM5s7lQ7glr(4K!Q}Y3<>24tGrcjJFjP%ez|77&I}TS z+tJ|PvpcN}>><#9M$C>mS)dC2FJCtvY=bN(S|`jd zGJ@`IXDtT=b~CUxvv_{gyM{4I!{@-$ZIY8P#kNF>ip}Vt8@>No zUT3PuZ35YU)p`3~>k+<3YlQp8n7jwVzFodpIaFsMi;CjlSgq_2vTtpEA>k#?F^C^_>(vHT#T3XBrq+K*>Q$6TvBej*qZrE@oW$-^7dX}X*9-D*1 z_S5sjhk@wb{_r%+Hne7cl5%$b>o)&(7P>~pev+xn_s->q;SZQycal$vlbTs>Ehalv z;-y#Q#pn$e=^Z;W?5Dg?pt5e%eubVceKl*iKea2mv#`>mRG^D;l)O-iXpbD2Otq1u zQPU+|v=r&JVP%$$)t(f2-rOQ-eoI&~7ipgIRE)HX53e3%_2f)np1G0v5IZh_g!aOz zHJQ-;ESdgV1({9!9az#uS?QF>^0RCSS+iQ}Bfh&(2aK!|ok9{MOCwe~{+6fWBu*Jj zA9c4^>8>dpsL;KF-C(tA_GKQjg;BcCzRT<9d3a~D9-She{Oo0^N5xkL$u^d~hgC49 znM+LD2hoP-Q;la8;rB&6MpRQpCU{(F)w4*x-7B5gABNtY>!RjT7j|oBh7L@Fb|<)W z?fjS48v7TLCd8oIYm~7&+7u|{rxnNBoV0Oo+(YXr;Adqy_1F!RSdEw6eZa7m#jJyB!rP2s^oAwf(c6Y^x(E^6lM{f4in z8uCURkj6Byr44zC5Kxj`d&G@DSQoWFF*%1@AJ+FuVf5NK!C)<;c6DMJNxCR?r+(cg zin>U!i*x#`J4Dj2>xr>-`IguREK}ni+npI2X|7&~(o^$D%2S%!H|cxkwmvJ6m}QS& z(p2R^efJ7wbgnhb_$H)XfxV9F$nEOf$>{5Jqd5%0?d^QQVad8GA<#uyQL?#W+F;wJ zbCy%;{gmion-Ik$#zm>+sy5FzjWdcBurfj?+->tw#3gNplF#_$tYyy5$#Qx>{0Zs-Bq`p`+bE6 zEGTzxeE&nY#WVqZUoCe=e%0$ZL5>-31cLwz{>Wld(R;vcf77n8%Z*5eG{EY+=>2ID_77g?+@W)f1L@|z5W1cHe7B6lR z%p^+Hz31b5=B!J%V~8o>2aZGMby{2|@k=vinvI>qhPR-rr4CPM6eALJhHax^({9PG z#vdI=9gTto>f&9ei7D33&t;BdCO1t-Jy?f9f?ksAMZx*k7xRzI;p#iuvoa-Dkp+7{?|O`MvfJ)I@Q|xj^C`y%{nYyW z@&@o5q<J|Da(j_NOckiAht|Y3V4*u1!vV1ncbr>`ARIXt%$7Ju zxn{ocQO0yXkeF7?F|h&TS*u>(9V_%4aa{5i%FTxOu!y4iL>@-ua2W#LcXXa)puC9g38wLk? zwjP9Ly^tuj;A>_sg&`8KH)2M5&?EBcZbcju>{!pf2>PupJ(fcglGUQB@Zz3EJjQdQ zbk>s+p#y`cs;xT}kE>Rw@mQUd=IgbPdCS%ssG4uTOT>;_(2Y8`cQ(ZDA_O3X9jafR zW+7G!eOD`IMNW$CUnxP{NI4XioG>QmY$DWU@qLM+D~Fs3_ofZxW7|+yBag$)$LkKNyX!0#vyEv`lRl!z z6&c3Vc4Dk(ya{~Gbi3=|27`2zLajBxNs-+vlau>d@#1v4kf~!5Nw~vO zb)C*^)8z~e-*2+EuG=C`ZN+q|}I^}5|P zB;hxU142no4yqBJ0<90C2hAyEPCgv5eH&(L0rLJiYE$X4a{U2Uf)mU+YtY60u}1PMBE^V`uGK;Dav0{xK4_)Ftx!AUFNARqtqnce*ztNS z5J60FHCDpYe`iUEl`V)v=8~g(jabXF`NMHXPxHb$Nfr;@lEewvJ@XkGsLiSpuSbze zl^48inOPg!NjkCA$Djkb>(9U4b;Kf0#;BZt&`5w3@1e#GvaC(FB67NDpPHf-T~uZS zDJN$4mZo)~WQ>(Hp)QnmHqOh{?!M~SqcX1k^sN4i0obj|uFEc-xn#FrD#E-bj_X_u zvQEBffuYi`ehFdbBuw`cD(RzluaQD!7aXtVN#`x^cO3Tpj>SN63I*lPKaV`+Cc`s= zg&0*R7nkpPwy78%?u>0JvP^podDma7{7TWCDu7y~gLoNWY?I`+A?^*1OH&rgYbK5H z$u7WJRsLA3%K5$Pgb4Hdy|ZJ1eIH{W)Mw#M44bvL-DYCx?(!E%+a=h&glR&jNMY=* zRyqCkWQ^D#kB3b%N2ygWo>6|Bwzw_e)9{QL>6K|kvbZf15Pqi`{mQ2D<$0(|M?|eg zk_mkG{~GA?*?n#H&ulua4BT&^`Xdlot!H|nwbQ#DJ-y2svoTMDuM5Brd{hzz^+eW2 z)F@pk(tdM^_;*CeFFE7XRgbxdi*MBFz7h$8v^wka^C{jzbScH;(E1vP#P&5zEl469c1v`48~^0W(bwP5(DOOl9m zgo_G0N$t$7!9!px&W>Gt!>U8%p1Q{)`3{*PF*x>4Zf1TQzFlAbJ7$Dh8`$=cG`(!)c<6xIk zGgn&`yR4mv-DlgQQ@yac0^7#A_^Wf-CwcIx69t%i`;sx@)Fk?r+h8r@3V3+2#F5Yz zXu7<0^M6c6%w5!noX@8rJXXT0QYA)A_vC2TWvfvK&pEbcwJ+>Efa|N!BEe>kgm(uy z1c;G!(;h>Hh$&EegTB_gw6Y)2q+Wa09d1JqqGtI9n`o=DiMwLCc<~t56#4Y(lloaT zTuoGaK}B7nVtbSHu2~KWdm%YtO9!%b<3;yI@stZZ_8-RJgC#Z!J3d24Ys(dMPV=KD zBw0MK1(qK|_sWm!9gKVU8j#DCFacS~F?yMTf+GVwnchA?r)D%=;$1QQhge$Bkm{!% zD+a-~I+Xfn%8UJZGl4MZ>h^O7)tzLq1JQ%2wC=Cc_WIC9g;e;>sNLr;i4<)ghh;O1 z6`MBBx+n8b>>A(kVH2xftmrBU-=m@NI1l|iV84D{SWJDxVM9U_w%+uOXVc7oDr7L;(d)(Jv57!7PuF-^B3X%4`-E92|`g2G@H_@caDBrpVo! zK5W>{B><|j$rxYXQ2p_b`=aO8q>ad4W=20eUMnrxwQ0?qty*Otdgs>-*Kod(bImii zl;>NRvod$DP(z}1;A;(Mhjhvzd=I z_crebF!vg}u3u#y>to2gn=q0BXQO~GS4N;=E{Q1*Nha?6){6vFz?lknqYQBC)08&w zZ67fAcFoJKTu}k_HdyOIc|*jCiuHPsD1{@8uSj=j^3^pKFPG*s8l*|0WPpmP}R?1Kz67pSHewYq92njB++^sa; z50T#+*Q&G{Qu0caQiXUP8HsA7HiwdY;c#|^O*vOH-*QxORE^t!C^D9pSq@dekA%e# zqSE^(bXftx28rwxo^IQ5Ve}uQU+zfkQMqJCO;vtKhNoXyJCMgN)@XEp;rN>1*im=a zZAGP*Sv*dhjKMSEV{2inXG(~eEDiukv8xAB6 zLNw5jJDE~R79yH-376i^!Oy_ zdQ*a_K@>3s)1&#kiv=O;HTYfw_2lrNXmvb}1yL4UNWql~X^#@XVsGuIWM|)==lU^K zykUx3G=e53Mg62vVL$jwEL{}f)=@OS;bLk_4*n|1g6*gbF%S>>P5%zq5H|c7{U~u#`3EVd_mVG(fVA+FxO?V#MHO() z3sCH*Clq$3myT)Gu8HSkKd0{QLdGt>O+Hz4Gi+4m=>6~?D2q4}G49W7hW{HXh1aHB z9oU={PMIk)FEVb*tFV6Kqq8{`d;;0>J(2sRI?Qif2+#wETZfasNbh_D86$xUI9PX? zMd`XsnoEj?yGDk8-8|4?NDe{$Kxf)N#Y$H{KTx{nb$`mY;OHj~A9ok2Y>OzJd>0sj z>zj~pc66^Z>vJ{Iv6-l@b3d;wAgj8sI^lsYDwZH#+?0Xt_OXZK_QnS3WfsnD`a^oN z99UfZp}mvLYEmn&+zuPdkT{7hdd&>a_$Unb4B!SIhJnU}?H6oFlqbAx-LLlkrqN22 zFWLq(*z9@#?FH>vC33NU;Chg4_m#1d)t~V&7kt4}KDb+kC@RV0Z9;ICXeo$x(d@Q6 z*k(QoXP#Wq7&RH3l&p9PU|$6gdr`={s}L84I)+!3I1)u^{$S~oVg&9ByX{iFO*JkF zY1__p;$BUuAs^=2Z@*hWc58x)tIi5(hu-y~q>tmZe~^5(=2ur%E1$a5-3Jm*$QWBR zAG$Fyx`RfFc|xk1?Y-ODefHAZ~FNf!lP@t9)Dz@jdY1MbjV8fo>(wjfy9a(DL4w}QH zL>~cEHrvI55wyc2)^7P0RCKIS&o+QD(LAuKRzn!Y(cO)$i>RXs1ZV;I)pbJ!_!CTp&J>ZGPVIcIXY!Q z2@^+V2pte3X5z@LhxN+1Vy8!SChWqW)*oHb55VdMJa#+G@UA!lLGi^{5u;L}V--E| zttkv9`0+~{)xI9wq1BiQHsC9OpI2beT+nCO_^4~K-7K~JFOPJ5DH{e?2)>$8!b;L)19xJUxw}ddubv& zJk#soOTzch0P7(Id^@r5K4Wz4elq9d$s&I4{*`+v)60UCkE=xT+wUQ|p1mXrfT*7j z(C9VUiL(&p{53P%UDE?Q;Tf6ryS5_ylcS#m=2GQ|x!oBj90@yF*Yg&~P3{1;uNZsqg?;^?)OHL8@Q*s#}`EVge(hy-a(YXK&BFpjJBu7R;clB{;M}oA# zU7v=CV=6|k-wY2FhEvde(G=mDWolO5lAr-cRK+%39xsg{rszga%C(Zfx-w_4B_*$eYhCX&J*PmVXg&LMxTapI zU?7R>i%ywU9TCAcA0+BL>KswWx zk&>OtQ=|g3k@4E!MK|~>-i3Ia%?DrSZ;FB>`Le<)X* ze@mM0?N}(o1qcVpYL$AXZeM0(RBg(|CE;16F585lb?Gz%IWlQs?; z+Ly7fKKOf4Qnu4n^Y^2BL2gjJ3BKjub^V|(N$y@~hHgIxSAUVNh>610{rZCxA~W6( zat}aM^$d3|KaJ~|%Om%e#rD(u=8Io9eP&adn?Ii@Y9O+cj&a}N8P5Y%k%wxrGRg$5 zo730j+dcbAHAxU1b$N>o9zP`0x+(XJC?NXx_x5C`woT34p{5B=NBPRNBWCCj)4Ei7 zSN6wqxY=%Wt2{Jb3dMvJpP9d3sFsANv~e>Uo4b&s(%$KnnjSCx9RXRS<9+Z>~%E9_blPdpCi1_q;(1d0-q#F_2=WqNh) z2;LC$f>A`$-0S1F4nPV@-Ku-jjdBT{;AG~}G4#%rjc9493TUGkx8k#4v|#f8%^)<& zgLUDUkuT2*Zu>{3aXjCoJxV!Pt7`{+wdNpe+b^KJVl5Lr2kX*$Ijtk+Gn?tHf6JXM zj1Dw!*JF)ddsJwWBMp$stLQUpeg@4&KL+1|jM&{F`Y@1Df+&v)ueoi6oWlZ`DS3Nd zLdYcZl3_jBwM_K=HPzX!Y09=hSWRrH2)s$UV$rUNrEKT=ZdfiX8qgBTy4o;k0Mho` z_{B%I4>sI&+7%@mf}K%sguJi8{k>X8gKxM5ZM0WYf}B%3Jc{4mOY4)nNs;BiVcW~5 zgOohYjsV~g#bnvnW1=&fPMrwT><9I!o-c5GtM}YE3+KMm4h`i!y9OxJ&u;5N)v|Bi z)zT7sw{$D>M(EG|EMbI>)J*W6K=1gZ4gU)GMB!tPH|nmCeHjzgdqc-@De~2pues#J zp_6ajgn0DK+WsHB_*JWjtLX?Hgv zh{`_=q7F^A?s49*`8F=&h${9S;HLNbA*HAYjgJ#^%9P9-bVgN1m})F^YO-QnKaC|u zs!9G39nmg8imB-3zbr{tMQhX3YTUEaO1A8af8msv{&hvI@2v=IzC94fV3rxLb5$2H zvC+pKNy3cFLb!I%28V5TOQ7&wB!Ek)x`TMdiRufhb^TX&Y7(P9TxvA5!I|a5$_MH7DcdE+>i{#_A+;3PiUp zbWxfIu>91qb;cI$y-JaGF{8YemFW5rH1pL@@?Mj68KWk_@Wne>Czp1B0NMn}uwErw zz*ISz)aO*BMqifJP(w(8P5SRq&8+E+wJDPWN>DpUs=Vr`^PbJ+EQ=&(E4{WFZc>k$+QTnVoSw zfr-u!4c&vRkw0smIZW&Zto1?0D3&RAl@rqCZMcPy*$Z}=89=8cc4WWSHJhxnx#&?n+6k!0=7Ra%Nnr;x=sI7B(Y$I5V zi&Q0*X*okb=nR5Qc)A-*4gDl%LI$##yazwv27j|d?Qz5uun$EE)b9u-t%UqCj$^E*LihdvMrNII+!R&*H9z(z3l+* z&Ao+z329>xTfEQg zeDr_IH)1nwqXwo8f>!N*jH~8joWNZ@|3kSe{2X>YY1dZ3FReBSw9lqFZzdY%I*>yc zBl*+|e3`BIU&KU8)KkYH5p1f`)VC3!RA(#x)@!oUwRr>h{{K@dVwJDctyE%Gm2^te4c_|5PoKnBwVGi-RkrU zg5v!De!>5);D2rKzlY?%*UWz}>i;i!k`itoBi!L`;j2we-NL*VBI^Tc9IEkLjXc^J zgK*^l5s=zVGQ==>AimEv0Gz$A0RE2zI)2_8D>ESQgU3Lkc(W)ho3r0NormDzW0t`9^_n zRgn;ZcY{C7e>gzeh6@Zh9TFY}`Kbl7mLz)iex&)IH$&i-650dj2}yne(exkwSiSNy zKg)6bwi{x2o9mVPQWH= zgxDJHK2Q8Dk}#d}577Bfe+ZI~#7#}%AVwBAl^d_XkI*h~o#)Omgcal@ou0IP66_`7yZqfp87>D+2uU;{jEa<;_9T zimb!n!S;L|ht#+A0R!s?UA3=RJcZDWkLoyWueAB_MBwh7CnuDq%Dt!^+K$WLC1;VX ziB^5@dOM!h;SZX$yz(8zO7mx1+irqKU%Rz%pEZ{7mEDjz!bBzj89%+2G1qByT5It; ztoC)-=L)Huv)6>!azS35oBb8qt#iozc}fpgw!sZ%@)g@(MT8e-Txf zp!yEK{i)%%+Rdk2;Mv@MiQjHMr2?PGXYR~NSB-Y#ZD2~_KVP$J`Jkp?mO z1MulSV`lYw`l9zg6g4uusCWFS5CA)2h_{@4-gI!xE0nO$&`#`#9fHe(-L|OT}ZLW7>&91OAf4!&j z=TLs4`i}Yp^s$6P%Bl*&j&C0cRb^lUh>Kh@vw)z=t3`9}3g87!@SSRTpQBXG@u z0q?Wfp{HvsCvv5Nd|*(U1en z2O;3O6tMOjz>qm&jibj;OV5BpHpci#n`yTJEBB`JuYnyY~tf zPr?&Y$UXvuO5RSoB;LWmG83S*GoB^9c zCf4$d+J~G_AJ3XFA2@otKS}?8du&7tD1+keGh0}7+gcfCsp{Vwaf6Op=XSC!0>y-A zVZsBjeYM)Bt7BrpxKIiCEnncLD+>-Pfid+rXb%6QFsh&dzCMx{tpNNmSnCtP^b4eO zPr$(_Fun+d|2<=dU`JKrMEdjfqA9FYop`kl3@BxEGY?dR3|yO(GL`-~FKzOXG25}1 z0zAHVC?jt&Z@ur}Al$}*z^m{|#5^N7-j)=w#}szD!bIl@sg+tv)~aAR3WD)cmA%)o zIyK%UV7vi2Z|3m)m%vz8?Gy{{b?2VmxuM)c!ba<|>cz*1$KoN3r>+ zz6j7h*w^5&6T*c^9$v^VyH8Pv3YSV|VmE*>`4NiPfJ-Kq9OJfG{~XX(WZF)6;SJ!+ zuFPl{B@_JfF-Tg>O(yW&e0rPU3+5mHN+z8%1YhK&^Wy8kzrO4rg1Zd+_fhm3Hw~6; z4;r`9ZKLT855NAZ_j<(5_wO$gl_m{a=0{%^)S-7`W#*Pov?5qBaFc#4+-ty?+|HYAoVXdH4y^lNfIq?NuT7huPp%bosk>Qb%_nO9?uU`~JiD!NV{<() zfM2HL_t8aqc)|F3qN(>h$tdES;hiv-g|=uEdW5xa<%|AN^!+ zo_0~4-M+w7w~KV`K%UfQP%eu+#g~9= zxL!^5$md{T&9q0CvH0D(Eb1)+iemh@ zLb{#P?)Z&Z5bou(SHHtqDZn`ZS5zIlyc?3pVyGZeJ{WVWGfpJ*SDNAiE-Bc>&<0nz z+xPvxXU;Mb&x_`XH%Tk~Wk1iY3wJMpCjSDm7J#P{vqx{X7wU@G`_Yq&%No}zZLpt$ zpa;=_S5r{}HLw|H1nJKb(-8R4*g*GA!{Uc;yY+6z{nqH!*LmgU z&#V-^yEke%Ol_rf7sxn*c!$bU zjtSUH&w3}Z`dZU-Xl1Hlv(Pg7u4>-m3oQ+IC!nowb-j&zD7Wc&BdXS+E%4!gZbumf zOXznkd;ic%uB@Ah=pN;bFHE)fm_B|=kw@J5?(`DLCcrx`E^vihVdVfR#y5Y}afLHi z@0uK1a{5XhMLQdpTb1#T!m{OtzsvSfGP_4tpA1zsUH|GeWxZV4__k?zK9LF}#mW#v zZhfyuq}k>hbtW%e%krGC3$U8si$A%cps?GQIbS$6C^``pZ(TKx`mK#B4GB=Zlv_+3 z)TkWQ2AbL(DM`ltbZDq;$Nj$M`R-v>cdTSLYEl|I^4y=IW(culxc<9~ei5?5*=qKn zEj$h50F{WnV^_Gd>o=E&y?QI89_g$dqsmG(RQ=X#7L z8}SUy)G<{wJDTj`l4o|jO_kz=>k)i|9S;TEG3rS6@TrC_1c5)PBGgB?E%-%iyt zEyE;mfouNoR=i2SwssIv7v+5Ilb*c4&Y%1Ak}IbX1L5m(!7t^2(hSQ`;Huxty(R?? zqR9Z(+W)q7>nab*ckJi=P)E!DLVei}u$Q>1ju;_BZ83v`Ws53ePTS)}#AM4s^kqk; zAg8-q>az3fqDA;^0Yq5tiCvLifi!pZ&d$<^|Fh4M%*aGA8^<^T$N{+5J@<2TA~rp< zWUU0SNSSi|U*UFsCNVD}X~YK5g+8KfSzY}%4*O=0+Z^x_FK?kNx)OvHgVqMSVUZAH z#Bqn2`BOxVUZ#NsvxBCr?Af{E3C=cpPiR#?2TtTUp)AW#q(9)*jAG_N3;->yS6iM} zh3ad(BY=((a4ElDw9C*Y{e1(#UkZgG>RWdXKbsoQu^FXuWJLI_=cKD#@`&9)vjeeb z?lF|lM+qZM2glNQn8R{R4INE>K8~~LQz_;QoKjvtFmSKa1($d8;1_;i-(doW-+`!1 z?W(HWCa9KbsdUPbH$>yIbP|u$>!u9~b%(~a6()gp=2;hJ{%?e?Mup?v9Bo|fMSdGG3z&0(%WFWlj8 z4%_THC*OcdgX`}^PI}@CwxK#tp9xgRCtq=W+u_^wlzVw}^J-nNBy+Xrzg3JimFwpY zlXw;JxTj?h!xOAU#q^M*7C*bqVe@k}mndi^ZyH?`LN%7-A|2ngHIQXf(qEd|;qOiV zb+CSwDc)gbZZdsDiMNmVlYf_38k0n^GQ*@0pU-TKByv-(Bv9Ev5#;jH7np>rV!x1d*A={H{*AGqt zlIIr2*X#deq7WlKQw zhhKSJrwJ6++xx^p;@fl;PM}$~&Y#~%)slRg%e}tN4#{)!GKT48m0I>zc=}O*+SucJ zc0a0;()VgpEn@~>V1V#gup=2n!uT>>umI#qANu*NNkY?@(G)mNAN7SEgRD$|!e z6L`=pbzs?czCsjHgYLiFEJnsY_+$B%^vybA3e`CAnVxg=ZD?!zEH`{anT4uN#h2;; zY0Pzd-__FgWP|S4SedDylI!~a7I5;B4=G>|GO`{ig>!sEnNRP^+&gw2bw=~yp8JJc zsi58;Ufck|8x3Dbpfg+V_h-xm(DMw0gMH_eOQ=5G2YBt$r@Wi0tge$PoD?+}@`LdS zXeIn9LCuV*vHF>STxZ1IpiA^>Y+P*92w=%$VKa0$Y=ibZfy%;{4|(Pf^h5QB^__jNgWh-AdCHqA)SX>hJqtmB;}D(4@R5X_E2!JFBNAGr;x01y4UH!*>4!_pG%wj zoRu6LHz;rs!WwPDQ28B_9SmL3@GhtEHWBoGv37~mQGdN3S0D_3_(izO4+~siJE-o{ zEM2-RnMSAZw=F?|q-QfzY2Jh$4ybZLq;@n}|@}mCD zM2X^PsJ}Snsu(uq-u?TA8rTUW*)9B%G|!q(8mL3CZ&X-(EW8MLo(bh-@!Ybhn5nEg z;jYI*>W{LNXhp@8Xx-HT5X4=+AoDR``tsyrZ{_&_>7gSCC`fEts}PAdIal>`Iv5Z@ zDs=51?AYyoCswCi{j04OQ~E=q$hg!sB|Ug){XqSOV1FUt#j@G|U3`T(_bh;7*=0y! zt6u=|g^NBl6-wV0l^;k zGTK|Clj->m+3&m3uW8H@veZD#*F{TPc0jiQz=B=V9^)*B=)+sKmWZ{XzRKsygfI&=*jC2!yTfR0YbgFzUb&rf}RV!%e|&@V?zT9Xv1gE1a8&MBF|lkDU-m&PLMld7VJ7-s0T|hTpi?++zjEJKSTr9j^fT-JnJ7^j zeXUcJjQ{O%9@Z>VHTeb;5RiHZ!>6P<;D)qb``iilUb}zFscx^7 zq&>_kK9ZBDGWQ0RTEz@k58Dn>9$5b3k5HviGDf>Ekla5vefp6s+3+zB%eXq2yf}PCSdPI2(?31P$jGH&C(u!{N2e5K=Oq2 zz*}l%p6L1ap4g~`_f(v!f^!Cg|b|lo#St|$ie8plqwQ;M} z)Uf5kq63&|X|l-VV%zRZm-~{65f21ai0C4L%DzN(Jegt45iJo*F-hbuT2xHFn3y~< z7?j^Qg!5`Dry<}+bF9*(<8=n?R@I6rWGii-P?_!ET|t;&mv{pz#!$GwXC?b`&7ij*9jAJT&4Zg74; zUl9<{jo2~foF}Rv@aY$y59JUgdu~PwrLXVO3-0(N^9YD{Bf2B(7HWTQaoD<2GP>pV zKn;Mj^ko#6PnuM_JDRd4VEvpQ^jxo-FZOpe$;X|uIhIkEG4cwse>_oj`}0#h+e@Lp z^%zAU668=F7gKu%Rjk&y43(01f;n%tkFP#M$DeZ>*Pr@5YizX@C_Jj zU(@0a9d~m8@HCCP+*u2J|W6osIOzbXqxs++}lGM z(eZV_P81L;iQT;;d@?0F~ zhqefTRM9NNPUm1%mc_p5P9hhb!2u<q{kDJ$Lh&+|Mus`=Qh$o4UYSeS zrmVVc^!7<_;2vF)$3qeGN5Sus$OxsC+yt-UbP;H@2*=_+a4Y_4kD0(ACy>ZMmKP3v zBRZ7p^3%~@#FFP`9G-dl6RQKqreO8PO3k0Y6`>J3`A$BmevvcbSkUx9*3RoTLbo95 zwmPu(aM5C~zZ8NQAYwf5?Z&2N1(ypA%J?%Sv_IQlzJm*P950C1{)~IgNuVPwPlFwB z1V$glxg7xIhv5a(-HycRblM>2X3RjTNS6+B^ZU^?wFjh>%NkL*WFWB8U)zxo>|O3; z>u*<{>On*@U*G-s)%}=jcJ(l#Q8?O=RpRTHnh$gdb(}1YaRuvPxffa&4ZSi9mDhaa z7b#_wrunbzXB87u*=REbmMof^iYr}bpmi1AoE;RM3^n9XxuV+Tit}qWF>ejwB*Y>F zRZC%mvtE0PVpDnUh(oY}36N!?1fRj3{AtC2%*MsQ8HQNBCj6NI$7-*F77SS1=Q1EX{FNb*Se^X%cs5!i{vPH^P|0CKiV;jYi(tu*Zt>!FcxC1CzUyFm5G7J*z_W!*Ox-rV?zJ8W^~+EG zx?Uu&P855PKBtXY=U-&q1*-Y>o!TzxE`Ob@8GM_V@N3c{W<@t=eoT0O|Fc#)1SL`E zmgO8-DPTz;Rz4~JOM6SL^E;zpvELi7$Paf9(Q|F_IjS^r(uP5#oihKa0mZkK%F`1( z#Ux*$)-1dlNBBJ`%V!RYC6*%s)j^1RqxcOt6!*l0w}>S5O$2=8+jrl*2!PN_?O4wi zGL4sob22kcAFDnWy5(c^FaL@a^muLXlE}ZyyQ@*>v&=H}?#kcbPb0jq&0kWKuKI?< z2U@4cF}VWLlT73bUmXM@S(@;S39DX1H?%2aUGWiH8;ve)zrzGx;@btJ6eV0%sDxwx zYzrOOmT6c5<)15N2wX8Q9B${368!=U?x)0vtJjH##3)-C`-@*gD}gOv?_T(|P7#^GmpPKZn+S~FKmV?m6(rU( zyE^HKPm^W$-@87&mmT6ecNt{~4iI_(!tS2zRUnD{>@_?L%3CX?6)cZSHw~Hg9?}X& z(a}|%pJ?1h+rW85QO;$0nJE2|&LYP^UNLw#fNKZmcb z7dd@$c#Xg&RaH3z(;wv_@jXjDVK>#KMKmRxER!{v)uzgiQyq*E7;mSbeu=V+y{W10 zAfJ5Og#J(A9fyy8F+--61|f+34_Ta6eZ<63`D)z#uAcJC#*JUD-hDS`fN78fXpJ*p zuOvhf17`fz6V6%TYcemD#1kYJ z=UDFP&XrGOF@!&_Z=kB8gj}v_UF#J7U#Kd&|9o1Q*jD8KLRA3U5;Ejl+v(a6>ds_}es4;LHN15k07as3C zKG6Sb=(v{?AH`F^uOrG6J`* zaAwLeGGFOG6ZdR$D!V!H!&Xg zYH_N8uM!MZFlGMRmat&A&Cc@s zw`$#&$Fv@7WJq(ExiP}ZXY0l}*ZkzscRibUVJ)6E1lXe|eG7Oq;{4k`G89=^Wpz_+`TVw-r{k)m+NC%3U+B90qsS-0LXYsdWF zZs9v&RHo@BYdX`c1ceTZDm%EYmd&&+5K@QhHU~wDhjeLTL^zbvVePTp5=p}E)(hnf z&Qo*O{BS`pQ!~98RFwkg9vYd&xlKjzk9whYDF zvJ>fnXB+Q4;sq%v5#})5w?nXcEymGGn!)@Xf|!`?JwN}B@FaA;e)_yjKs_7Kwks^m z%lv)pgk^vGmYefe7b7<$j7kaHFZio^WqTlvOZgRa<$t{!)M9@x;7FJF)J`c0fJCM- z5z;oiS0)w6L($y9<=&<~v<%EpZn$Ijh5MD5lXGYvkZgeAVxo+tb(t+xM*q`BV$@@f zQ79AWM7ms??MFv=CxYVecL(>X2VLLj`)FD0(R`%UN+~cDE6Xzfd7yz6iyvZMO2nKp#SVNA$5-Z5Ll?I`E?+QxZ<#&UaM zJHGkKOy3EG!#l^u)o)+b9sS$b!~Hw>6po8V*tLQyw%U=bkJ?Jg$F`_nK`}fde_g{p zX&VnDX4g{~@J5=8)M`p)zGrY>~j6WEm>^=}}ByR30F3k|62S} zEwS3uvF4J6##=Oiv*YmzGe0!W`)bZH?9e*05bh3@awL^bk+_`xpYD2)OD1;^N zEUy)8tOxRv1?Po2Pz?=)o<==v!%uzoZirB!Pl{VKCz`Fr4O2N+jUFeh-4+MOY-ufd z__mW4s4jo7TxH*tuKBHNMDVHq3b5vAl{bo=tPz38| zq%*avspub(SKJsoMRS_(2j$r(nYz?#oY6-K&?oZ_{`PgRW~d;3uYr`>^mBW$UQYdI%;#DkZJz&+Rqt&xjXtLT{u@O9h?_zWp{ zWJNYm0h4Jj*iQny{Ex<<`%kfLs!r>!EH0?YQ1ng;igD}IQCj5Y(dxu8(jl?|^+8rK z>y?q`0nv33{^OtFUCigULaKMys9RCB++I_-qd+oSp*+Hn@lM4$B}nB=TXYOypW046 zWKh`P!!;xbSPvCcge3kBz;}7eUj-gIEfKv;D(eX4aaZ5Z=mwrAkFox%cDz-nlJ$-5 z`lc$Foj4VQi?4IIi)}__igg`rjnkZ1_M$;Fc0~OeL zLj_7yB7R4Lq$l7x>lW>|Kv6uf;ojEC>*euhXA}DGvkj`{y+sOrBMdiLD_W0micup2 z;vwJkgL0h+-JoQvTa*g;uGrw4UV+J#@4;!_KM&D7FTL4>a$^5)mfnE*{(lhve>Vus z;QyuKrT?Yi|I_lX|E1vnQt*n`|LVa@Yb5_aFC=rj+G&l0c1zF8%{7^S#=mL8{KVEC zYPFe80la}A4`4+PKNJc8ma}RpdN@F!RUq^c#Q5x9o$o&?f+cw zo5ob4RXt*NzL^B=-4FusO2a4k?TVH18|aXV;6rJ3SgN z3p^tnyXU?Bx|p zq~U&scZH1TM*Q87*!5E0f0rHnmp1{Lfr<1KX#kGqoYC3G)B``$rIl zS2UZk=ux6`cZI61iOcA3BC`|X<}8EVScHI2$mh;5c~GxUp(L#JbPm%0^fjk{lhyG` zK1K(#4!i|?u0d3Jex3aDgygnd+V=m?b1!@e|H`$HeeRneffPtz4E_BHHF#W4^GmUm zQ~Lbn2dIP%>K#iE9Z!G!s4*8hm-p#5g95M)KymNipLjEoU*5x)%qs~qDclW;g)%+) zn>rVE2~A2M-*N!c;j+<9Xner~rlmTzr(?iEcx$Ur3*X z7c+xp?ds_4Tza|}=XZY7bzUAK9_R-N8MIUmU{^m)8UJmYA@|OSDg9PK0W2d`hPIhc zR&ZL6^VeJOVm;rc8Wq$_3?S^&8OhZk`ANj!3Wuue z{(8c7(sODGSmvXEkJSi6+ho5Zv3RLAQl$8YntqSBA;64^6k2!9_I1C~-ya5uM|!S} zuHonYVug;k2i*d#b{x;&2zk2oU$@Q#ub;TD7j%hWHby~$7voj%?6Rj_fm1n?^I8w6 z>;hEJV~ZNstKOx%b*UU+QWZjSR{)yW)(U0{o*U(7Klv=4sgiYHXlqeCR2VHq=g67b z>r?Gs@zXABRjrD;D2LCznW_qYi$8;B+Xy5;3%tVY%ymd3@E1WFHAEBt|D#y2q4R-} zzNY=39_hD6G5SZ)`M>pz_`n*j-1ecY2iO`)1%vi*Q0d(>o1;}3U1Txxn1I7Hi2dEE zaC#|1R|V2kg*j$SRrlGM&S(gaeToN}qXjVMnn!Jo>d(1Tvn<;57~Td6BqKX?ig-P?be9 zyK)$pan{F7$nK`6Zq$6iCa1)PFD@ScRHq06F0=l1xq7jtg(L{P zC8P5}7kR)!yCsc(Btyq-wjY^FILl5+Vo8YjbGl>@rTEJr%GsibUv>|02$MHY^%bbB z@nW)Bfmi)x_-2P~2EeSwz}KfWdQwf562o{(EImjvRoRJWFXcDP^z_s7a)GPRsRDD` zhQy}(F<-w`18o&)_Bl`uf|oomB%jD(B9PK>dix&l60-&@%^~EKH18vzqj~FnqkX>E zS_*1_ovE!u*ntM3XEXUpX7N5*_D_Y?$N&otD3Xe*In!!{pe zA0IiWesYW|GU}3q+DEnmZ@57Grf3C+4a?kxdv>{F0gp%Om2}!QbjlYba3GIogl6Dw z3xc#u_za}!fS8BBzXJ;)9PB;qqI(D3*|1@O@@0~E1y1J77)}UX0Tn)glryK+kbzwP zQhy7Rssy?k;L#5!)SYdN1_*0t66j_6AGdkP=duIGsN^)~ap*u>i3cZy88jM9Cgk@R z0qf=``0eO|f#)12ZRR0T&#)DKKG*fj^&?J_d&CbXmn?>d6?R|hkt~8y$(53I4|j~X zsi;z$x%NtjmEkDP_`-QziXykd^0_Lu3Uh-%lV1Udgz> zmtL|MF;ZPUtzP<@HJlWz$y-f8w*1ZJ<_#O@y- zgDvkX495?cEQb{7nYVE)SC!uDZ&XtOhIgz*iZf`xpv%-a`5H zHqXoSwb$+QTev-D7z25`qPO6xd10Y5`%LJUT_35|wZr{8epf^)MuRt@5a+cGv~KFK zpp)m)bra|7>c+}$K*vkJ1Fg#v`A~SOasR`K|HY@rfbStDJ1%X&hsNw;DnZMV{6uyC z>x2LGD+R*YHs7dwoncAA$bc;PZ_p0@_N22fP}DdRJjKJf2~lvMnm$Mv_V*K694|c{ z;+mms)>jsVU#1@6tA(RQ)f~mHD7b8*8vvt8i zCA6`p2#7YcZZR?q>Awi^$FKa>=eIsxm4{CZ$SJFLD(m=EXpltx@!3CqeRB4=+LNoN z974a!IRzQz)M%%qqVo5RG&Z%T_~se2{BZ2CG6vKm4F*g%E;(%?e1?Mkg`Qr5m}l$WSUPlzK9!36T z$?4sAC1anh6SE^^xecwehmQAM`aR2OruJ`?IX>U!am5%u8*~Xq5Kq&hiCn#mm{;I+ z&PAwy=*7F!Po_Ykt{RQBbQx7Zm(IO2)skp)(g~UUac<~&ZVn0f4=%etOx^Qam?C`F z10AS|3{sq+`Rx0pD9G2WGY$B|5AlKn_ovKp`yg-19%yv zy0h&9ro&Xa;YmcUtIYNaAJquALy(tSdBez;`HO6}2GlpCC@0s`hf>tCUIw?4@%bZcRRP@yiHp5bybp zRv*Vexf9l^^-0ms&kuf^mVwvAJwAL^icli{PVCH!h_*4uk?gj_!C;_mneVeS37_BY@;@uZ<2BDM`n+ z+jL}3cw&?+haA3uhsLtlntCK;XvmqCn8bY4&SQ{Iv!{1B5v>N4)@W*O5C1t=64a#f z&TsQm&_Or{X}-;>J8*7O%(B|9(VKmH_gLYb0Ii0r`~2&pc$-9mRO}{Ag}m^$Z*2{f zO8Hub_~sDQsHdlR4w8MN9)DBE5~`;pc$^U&MZF^#uejj(#)g;of*^<@o*gClh6AH6 zq>?iqK`PSt<80WUhfzd`b2o~MX>AS$@2_fN(-nDTrXYZ%#`9QSK3VRibIQt6k*cz% zKs{NSbUd%hn>xjq#s@ub5Ey6BL}73NH+vemE#eGmH5`W?28YwtXOa#`BKlwW$8b(&5Gt@~O5L_8}iS=wrGeZA79 zlR5ixQCCEa6moCk#fMX#tVK`9ap@LNQB$PqcP;3HE?LcijRh~yV@*REKgkMfL4Kth z7ALuPY@)K=PVR9Y{$SdH<>WHy?~*Q9%9%LCx;w4RaI~_rs4}N(V;u0YY5i`eDG!X( z#>*iHd3J0OlJTrNQ;4NJfbXLG6rRh^hGs`UBtPPifUBY~qyOnLXDWTnzS5An^+702 zi`vX+@Jqt*L!<2E)YL{-7P~iySdZxyCkuOIj%fqx5^y(%U#O&#Tn@a=V-1|`Pu^cmrtgo+Ewv~;2_9z*F z)xMH9?zfXZ@$>7D;+a~xy{XsRdCdNMGTS~is_W_ZEgaz?BZZ=U;dH&<6g*(o|4IUT zKIB_L+z0*82KpL!zUbN`vp1k&Hm~C#@4O2q85$jO{u#)O6vI!z6E(=_4~b(D6nBc_ zMq(^6#&Q>h=LN)uc}pk{WT+IC5HNHGdHLK~zm7UR3$Ix_M8};C)fZ ztytfG#<}}VXJ|ACt}e&YVX zM}}r;$QF#xqK$*5b%XV&x_47M(#c=Banx;&#=`K&jhqJ|(a|)k73Es?9_vvfB7K1* zJgx2y`*R2|)=ul0^ji56d-{PdGrFqPR{kS0R~dH3oMWFqkNI%_e!pg#NtcmIQTLlT zk)3$=5l0h+H0hk6o|1l_y{i`}L~>3cl9A~fkOTBO^^`)a$@$?9S?e>k*B|SABoMR^!;4lqW3r)8GR3w-%!_p5@vTZ;tQq4Ku9f9@P}H zIPdZkKItM^DQzpF3vIhe-JYlfD_-6ITI?2?A^0pU!HRwTLd4_Qac16qJ1ks%AnmKD z2tQc4Ot|NbzcDP?7_ag8t9yrsYU(OuV`pRp&P5`&j=abu%sWNYgU&ZuzRz6P?IwSigzW|L!V zm#P+qWm-2ETXbYg0NK|sCv8x)ZGLW)%uD>iWL}~FwwLw5@#=j97!mbFgOyHjX0YVg zc5reaS4NBx@|(J~pCJB$FpAM)GStZZyh%gIZV?*3#4hyETim{#T0K@E4cDlv;>}wY zg@E2XmA=nz?UDo5t&#)S{#P2V7v5?PPHHe4%OmEHXJA$0tH2d9FLkeAHI^-i_8A(; ztA@d$$37NH6X`ONuaK}>Q&nFONb}c0#mzgfr#zECs_HZ4Om$LOhjmIraKjkV47?Za z8~~8%kOuQt$&Q4?GpHU7r=h>on?*YI`1$wiHsm|KMqS3Z4l*CeGcu^{ZH&UXD|CFb z8Z_=N4{43FQc@Na%#=pX`TKAu;*L}0kbNfv4I$-xN3C(?MpHh_X3emJqs^#?QA`_b zT@QrQjdWQx3Y?atxtE($A~%D|?2OBCVVm#2qb>O(@>Te+RNMYQEH|F+Jnqg~`nK(2 zw9hDpK(mDPymkoHvBOV158BaSM*J z2Fth^GfjZRY>b}vr)k)Wy2l3LN56h%RKC5#``~Hpapxy*AIzdjZw9r6XN%MMi9O*r zquFPxN{2^gO;`J}{BOQTCHhdZjQYMR`Qt~~J1*`KH*s-AC~6XV;%t|Cr4hH6C#3hD zaWCvmNorNKYJQQdf*pn%ve3Oo20W~&%BOFBaVYUTE@jj{sxoCxz_;tw>;K5xoo9e|5c_|}vBDM} zr)5bI&&(*2d!DH<-%GA1wVaUP56_}0rsk~n#%)7Vl&nQEBXI&9&Hn3Dh|6M8ESb=O za-nc)Z@Np~U&}%UB)tY} z0 z`s4mtbeXvvG4&PvAOAB5zKiNtc{h3~Lb3*Q^=VXkGMelQt@SI z3z@&KPX(=`JB1!nnC33cWgMOd!H13|Ec%ekhze0f*el?4g4o{)QwLmW2z!0NaqYt? z^~CW2Sqg2jivL4_|02lQuYv++c3g03B>@e5eT^^ly#3$uEYJV`FtDxE^IJ$Q!KZ|x z-w+WI$d);* zkX}8ocj#+amjFnD>7k|X&3GPKw=xH2x7O_5h0m2c>}H|BAV>r<5R)039JI?k-}1po z5!$%VY~PD1CMES|9%c{T6g@vVWCdgkM ze~N$&AW8rcR-4+M!u9{f`2YF!wF^W;@!c!F$}x^BGkf>L;9&n{kYAe=MhyR zatBG(i&rDc>`Yqd`vOZ2RKmZ3w@Xip;e6~wCF)6g8~XhnL6}pfcH@@_)YFaN4y zL={iz>j&sN=C~Q9lJfCW=ctF8_f%O{9wwT#V_KV~dAn64MsUFL5R7j*&4(}`zOi7e zr>8qvbLe`qRsBBP!F(VNW#Pz1Z+0;C*5XgA9cnrnRKp~>*Ha_00>kTKfnM>ecwF9Zv_eH`Enh9gbJSQZp-n-BB_WZKjCQJ^1$3U!Qa~*i}Ef7orKkmIgm_Y7dr_ z@{ele=L&jGl}3&Q>E8c%hBlx%(>WT1^C))Y`6E7(Z#|JJGY&(m?hl_03}51CI`~k6 z6qEJns0>2bjD98u7k)T!`rWDHG?n9^NjdUS=RNS^P5SVnYNS-*0z~)cKy*xH@WbVU zS=ujJA>Y311Bm6Pa>Ih=sFOqG$gJZ$JMmoO-J=w4(X_(Yw68cgts zTA3~;q(o4B@uX~>XQ0ANC4FSXt`-;c%vt4TtOT39#OJD%wCw-N)9H%uDkg*9SyHaa z=5mZZ;PE@iq3}SHCl86J#gf^>HFPSa6*5y~b0LnK|&jC6@_9}3y_I|#WFe~puw`^4}s@pu!n0bee_nH029R?<&48<;E%yPcH);NVe zlh4;R1MYC&Wig;HI_h~^J5#?8X1C?cyjHEQk&K;GL_$HggdN#GrsUF;&~mS$W75Io z3A|sFs?9OlJBFE|kQNaepw|*GlKSkMvx`>FN2V3O1o;ld&z-*;qtQqPc@4w;fzmY$ z?DP1sHeZa%Uc-uvnGkNJND+Jk zKt2cEb^#jG4y6^Ew*IV_n$+Y!A#95}v^jCRKYAd3^6y1}jPWEq8%s}UF}5#Al2a&o z3Ro=TNq(7V?3$ujSsxd_!PVBN%o6TXIPdS0)1S~{5br^)=2VB`;F!e*dxSjFfg&*P zpxLbMb+7s({~ZtW;+wZ{#nRBtp8ra}J4dj;-!X7qa?2keE+;)BJZ2#|bqQXmXv*`B zFS4{9hiGYQCSn>zd!@7|7A%pN8Co1iFahN9Ntj1;(z`tM2)oV@ZJ%@ z{jb4qufqk9mu9NXJW8v#tix;n1R+nEN;fRsn_U%h9&5KRSu+eShyVXP@e4^_WSmZ3@iw6HSde{#Fi~$`SRv=lF0i7iXM`9haGiWOXm* z*s+1gxB>}-I6`GM_PS-d%UE3O%%nY@c;Wqb6>V$8a0o9z5_bH?v+;|75J0jW;L|ox zB@RpSzbugxUvzUpu6*95PmK-PQjvf;fIzeimB@H0HbT%NEiJ97vWHSa_&WzjoAJ`EHBdul8qbm!9ne+`L;Tk46y!tiZ1PJbhI@I zv6h*!j@-#TS*#X=Pkb;|DCwg)*32hCgY<1Uc%os%KixxD)EF)W%y{A?m5YDJwDTHd zyLuw$)+-|`g|@%NqbQFEla6VjbVfoa1fUEmy2@WZdK@0K+gHEa<7cMezEIQFnM^kG|>PdOn@{ zQB`@Hx?CNKER4|3`5kX6bN!oaQ>U#h2Xc@^EEIbj+c#oZw`}fB-0b3u6 z#lX-|+ofSGwGuAIr>Ie0sf$f1kCbGzq6K}P+j0Ab zfPfzD>B#`4E98Jd%tSHx#ce5itEx~Owe2R&!oq^}NsfZ4BmY%Qf>)gsBa&cnaC&X` zMB>l&ANe@U1{2I2{MbZgmUXvBjc*Qq2k9%wM6xR~85?>mxLT<N9@^W1gKhJ$A#Si6~%xZ(~~KbFU%6 z^WGw@nV9nL=)C9?ljcJ5u{D!mb5TB&fP5%&W>qqcA;J{3US21_L@qJZ3;00!&Q5!n zgzeFrD1GPfLW2$;?pAYuaxmC~JI-mrjxpaO0*>_6LI?EKa8{XD03M$Y@Ob0dtm~$*ujL~Lm7xO`*#l#$tjGyouPyx% zVX4x0XpPl>V&{4caHa{qq;{rHJ3+|TEU4G9b8pW(UDQyJUi>sJgD~y3e z;nz~Ty_G|MGY~L$X2>xdlo7mi7;;x2o_bd@7Jm4`g2rzCIv9*ZND30t4{#~lbNa;5 z)w&Y0XCOd~?FS10#FT1s)wXnAMI{Q+nj$c&;ZK1O0|`N_-J)w)xzllOWXrxRe8?jD zY1Yg6{6aiBtYwGv47G?43(wfiMiz>3i5@z+>~Reg+vJsN4z;lMyxU~wefcs~tjmmx zqDj5w=U|4$W(h<46IR#6M{my4v)m>5Z}}vav_YxB!|g*l5ZR*>j{goA0IEraiqrlu znU2+s+j`TH-(vB--@V0zA97ECjsz_fA|H{eFGvkYSvmscg2kxv!uOBPzVJFWxNwt^?r}a}kxEm17W+DoVX!CG&HZchPZ^hmc z#9J1rEVHY-lZZrnEIJs=B6<-Iamc&M$edTkzqv5PK1YQTr!?X z2q?6tWFmv8^9K9BO0n|sz+YW#+AnN}-wp+HJe^@LlamoHAk!)Z>iZyF076H8M4|6_ zLFh<>KEmgtTF&>DmZsT?PeuduJL037?S=AZudhIYgZuj!zw7`$721VBep1X}u)Ejq z`~R%bdR@w&4Nr8!F@^7>x2>_a1P0w`ayz`;gK^%y!1&0oF~>!7%K;6oHD!dMs`;;y z;Fs2P&eM16{RcaeW$?;Gw~T>BQE1=crSsTtNh)yZ&??<&SJ!)b;%@Dpr5v97RZdZn z{9xPTe(D$B@*-GXDH!TLbVPhO)4zsO@O%Ju;IK>CL80Z=T+_VVz3EBxd4BA}n69JimI%2KaVwvsb$dX%(;a8FPN)C)&V!1Wx zl0?uW_1mH&oGMl@-?5W%VR8QpP?Cp1w^gR0XCHAzBuentDFTKm4vs~I`}5zAK}`LF zQC0~qfX9U|obTl5R^9-rwqb(>-o*%Y2(d zNXasJci@&{NWlAn!n9A01KT^W<8>P}82ENaj}qNz%?2uWaP}rV4i&9!WW0w{1P<)i z#~Izpq@r2TOL>OHWA%k;!z=a&E9AjgrD|98+%jw1jG?41;f!~Mr!N^fRam4G5QiL6 z+_()+a|QiO1_dD|mZ#qSvj*oGtt>8Fz~`m0$oRv_J}k87ou2ONH66z+riOJxL5Mda z=sZ;J9M+#WtCWwO9Quxl2Cit1jJ4yT2|e8Z+SA@4&*!o=f8S%bjZr`usVkG1V3f+F zskJp|PX8ed7@1FPqT)~9%9jbfbCkBC$ohQC|WZD?E%&$=4W zXGRe8#cjWB|A%IQjrH@z<(-K13Z_}VVC!G~YuL5^(!|`2W5=5=057#0Lf+B)83QKD zG{mF!3%w*&(c~1?`oO{WwDK5P$%vf5EDVNqCgi7*9s==>yr%TsnqZB-&@Si%OgKQy zS&XIsEWQnsfKF5rNf$cCv-xSr7xW7?S&-~zJUpo5)AL4=INb3#7PTb^@i^R2a){qh z{~VTfyqb46OX~}F6r;`96DkjWOPeIB|jwhgCL#~n~#Y1^dGK&ns>Sm zp_rH!GyZCyjhiJp+CZLg5$4-iv1id-@8QvUl%wsgn<|daI*whw5i97=hxknjd8|dPf^xE zU>>@ zfCLL5=F_1u7{-ysn(pH}VJx+M>M@7em3f!oV`Cf7Ozy#+$B`%lAy@zLPs~Q*9XFY6 z5Bts$_oHc(=}~SAJC7yav4e>~y@Lks5j&iQz;KVfZJw3Y?kdy6r-g^}l+~6TL)1^= z90h@yTFgDLY*F5;Jvq?dzs2UV{ia$1XsH3W#4aBf=Bj@gmOKZLV7jbG5va_iCPQ#+ zulGQ;zs6^yycht2sYVpCKi~prMYI`Cj`PNX`Hp9>RKFPJKRo2a5Z^J^oKBCjPyRUm z!AQB?WKuz$S`flfPW{_Y#@~$!89Ip%VQ>Kz6|S6i`)`v|(!`F+##&8Oi6hMy zns=VB9>46av_Zn}FLAN6^|FCjUx^GTF7YQuH!ngVnCV6QMOTT`RCNc5cMv62v4@+s zmj|0WC6JmLCj?TquFWA?1nia|;x!YFf0+wVpYfsY3xhQ@l-swIRG-{)aLcBlP1g=}hyiEI@c~^vig(MsJio zT;Ek#*&nhfRZSgnj776V;0`N6E0Md%qn}TCv_cGbyuZ|;nhs=BLGjzN7KPNPgYlTK zaNuonqgh6Sd<~!^XEN~S2C6Mn{!;|nzkN4iY6gs&8fOG|d|WpA7Ao-i4=-Sg0QH7W zyx080WM;1V*i8_*Po_$ErOK@=#}=y#E-v=5H_3}MS(M!DiC1?Xw)N-L-bJ&x7GOD4 zu{=F96J;d5QqogDzwd_#d(ki+lT?&1I4P@4*lvHJek4Twl-dnH=`nyiWMT{QuLK!UN5nu&2(oHP)(`6Mk z=oXBOm~EeuEDSD?aoRtW7}cs$4!FZ-l&5x%A2LFouMNJIM{(RS-&)%&sKyc(VYB}ZF< z)hs`3dWMg-S`rvBT6%|8?fR4e@OtuaS7KqPJZ&hzy(^#hxYuTVJ)3i7-x4lhy?BDX z8G3*F*?zo|As<#Fl7kwaXvo2h%s(PGUuAaC>Rt+{pB>3c_P}!fwKrh>T`|cJR6|OB zU~V6|wGf$@_>9v|Elp1>*xAkmi6{c(e$*Doen`HPuQreMG@IE=c!ZJDE0-jkYWO+G zkd9#7u^SZh^;-|5xTRPGwx_UXO?4i%@%aY{qlw4Y_ZZdSmq?>1L;?ZNSS!11=-~M<7)E7^ijM|7yK8GN9$riPJa?*M^YX z^-tis7)cIa0*Cg?joRAl4g&8PN9|)rUJONXoJcwCt_E^`_(s@jsS^DkOYaa~()>NH zGQOE-?8vKJ>Loto!=o>tE~Zm6O`CW0vwGFh5lQJ1C}=#~jKpXj+#(#Fdh9J}n|-pi zq202NMmTa*0TutYCvEI$nT`9GV4$Bh82#)}*)=P0N zduW{YWD)?Q(K$&Yw2!K4<#02Wt=#Zph&6AxN7i-r|x zIaN{w`_kTH`bw81_T(Zk0xZZhD|+4ve86G3S6UctS-Wm@fO6MnsJ*hl_(;Et->1-! zTa7}m^|yqC#yzyB=_MucY^~baBIpZ@B&K^$KtfkhIC^6THTu4APGq)ghmUE+9JQHi zJFhEv$@%~k0kS{)v#Y52L!J*|Db%r~OUs>rmF(U2@QCA`9AHmB{e zsa>EqgzgZF6VQpPI$KRCUB1EF#CFowr0TwtbrNxWv=8#Gb6I(9p(62)gPJO8Pri;! zEHTzLXj;0{I_>9Imj#rm+e-)JtV}Gw?4u(vL)h^j`(iiu0~L=*ixU@F{UW_>suea>aur0 z3pGq9A5MG}T%M|B(vft)>1I5#_%Q0>@w%r#Y=-Ynb8(lsWBd*RK|Ma8dkRebfqnli*0jdR=7Mzj} zgYe&QA7~pdW1QFeo&r}1dsYvNiFmEQ5(g>|-?kLfcAD?-z=>_2wm3O(Sr}e><}_Y{ z(c~ANHF9*kTaJ|M&~ayFRkTVFd%Urwg~hE*+m;5;043KFi)g*`=y*SEOro!yc=>KZ zJI=#*eu#AD<#XlMlV3SbelJv&n};slm$Dt|ubjhaY7{N09&%3g-?JTaFWop^9olLq zsf7z3_Y}@iW1C5t(-$4#n#(*CPC}a-25k3FY($=SYQc-e@WAssIFtwq$a#3$lpCH@ zIVa_qCnQ`)!!x8x$o_^RG4CEdUhUkfm#D;~oIOCL##yJzYG^qlnsY0d=K82A1%YMf zH*U=)kSi?=f1nmWR;T=^4h}* z$#8j)V(4kR$pjiSK25wc#Tj?h8-1o;S0ECJ&YbMQ*u>$n@H0belQARkLxvvfcp|&n z-DH)LfNhusi7*BU)d<(;lC=G~n38G#dhLM)iCiMKer2kzpw}$+W^+FYzf08br^wVM zD)HZOo5iJmaMWoe`(2AykfGwEH=A`k;c$SB*7B+!d{dqB=g>!nyuM&`WJj%A|R4#1p(a;DZu*|`nn6iakB{aOF@ zLq08g_rVU5q+s4b$dp9 z4H``HRW_@!i9N^1n|Rg1vE@5ohU_F+;+++vIZX6Vh6Z(Icxm%mQ5C!WNvC5-Ws;+0r1(yHWzj~!0PwBJAA>{4Xki?kS<%Jml}G}i@h zPx;5d(!uF1|Ql%XaeoQ3rlW(6qwYec{ryq1T)Hw0M6|75(g0f$Aqu*bb06~9N) z`)yu}$Spj)mV5W#e^lbEc=Q4!IIc>0j?2q<@~6o=9hMFx;tEtO!`%E>YZ9*7ydV}z zwWvqh3FRH(E}a_j7!QgHdH&`o=dPdh^3azd*5_-}e6}$LP=$!S+O3h@?ieBK`QLIV zx$ucPZ$A_A7ARDK1_cUJq3cH~giCz=#tnV>njbv*-zkU*(zCJlR4re#zo8~2*mq53 zwv#vKNx2-myJPOn)IO6nzb$=&m=X30tC1fn{knD@nzpWI74wclX_ci@sc&=+Tvw=$ z1+REL1w^PNJN&aaZ&H9X8klXlba70*cbjD6WbU7g z?N6IE42+=|JJMRtvl~<*!Ya%bipM=)9#hDjyvUY#*DC2`vtX<)Cs;kk;uaEXJ#$`| zFz5y_XpQ~tU#2gy78SdMXdQ3fyeS?RC8Lxk-eqOX7jx{KW4rhs)P!Nc!tWdahg%%M zAkGaKe0Q=IX-bwhMG6$HpJu~kChV?;SMQXJ!5%I4ajQf#JMy`M_wFqK3o2fs^GDSr zscbAfC`Xuo0zf44leHdgVOF}FXKSltCjon_Vn$fYt0Q73<+8sO=@Mux=b2o#-D!4Q zcaTQw1>8?+9aclvrmAqQ)uqjIhmV#?5G1j1j2p1(eHvwsr+kaC^UV8bYI;_`Fg_)S zd~}ro3(ardW5Xt*WK@-=`eaHwCjKtpj|E1IBV{fJE|oVNj%kKPSi|?L|Fst(A|UWs z*N`9<>%Io7h!n|s;`+M_UG-?xm;L5P4=2BAy-J*jPZQqil8zHgG=zi2h4hL+WQxD* zROd#<2*oW^AFgc=aehZ(3bWIqOqYwh;>&`*>LlQ{g9u}-SPO{~{)XZVJ23G~GHI}9 ze$K!8nno4GW%L#mN4Yt(Si=!LsVv(C*|sOLTEOo1NsILq+tHTl|3Xev-LdH#J!1A) z6Fl0K#9b6LiSXH;Bn{p_g7iDVFASL zQVoQk1YYrNR^##`>ZFnVOChC>|5@jhYb$3z!poV~+Q8$dY;CXuy@&ByMZ9A%AN zQ(Us#Ug)ffg|LPer?wBAS&!X?limfP6=MIRsrdf|I{D?1U@^g5j7wW3I5#Ydz4vYF z(B5E=!^~3QqjXa3GYmZi(y*wRb?{abJve{bfePyglZJP;97em(_7->a#%cxZ8Dt$^ z?j!+FSafw3 z2+u&e=pK7}%pZjhm{fWEN`NJRk$UB^UGuWQy+mLikoPt8qU+!%Am+&U-8|UyvdXi7mI60B>Y$>!sVX)_1|8dXFB#lSmHXLi?ctZVmjew~PO-*K7&p_YIl}Nll)6i54YZ5SV-QhNTzjT&IM%4A1j5yKu25Gf|Tu=@}?z? z%`1YPA=;l!KZ#v_*;4NyDB)WXHSa5K$nYIJ{^{{aNLqiUe}u8TC~tGQtF%|31ho1n zGj$O=N1L#jJ|%&ingbI)61RQau4Za!&w6f(_W6mIpf$@L&g{G?K*Fk%l}S%3p#Z9I zD>cVaNJlVSzv{IPpfaj>JeQ04S}>0Q`?U~gOGL1!E|f%fb9#~+>lh9SusM|Lryl<6 z#R5bEWLqX`MPKBBLpwT+4z2Gc+&k|MND;h-Y=QhS+tW*{#}VD~RVHcyXqFfNrIu*- z9Iq0A#Nn?^G6M74Y(>>*lCYiZzURB+?%ioFlm?+k!{w`i*zeQzd>zq#Nv5VGfJX`3_#69^Iq3;~;#n53mRmSfs-`a}%3#Ze-vXcp)%`p! z+sp{4gEFtsrj>T%R!gmb@6~`VlJn*f^-#k50Vwl%$4EXPXwOd|G22)%3MGr)|Herf zk4$PQ?Rf>s;m`SqnDOxWAT2xBxNtE~d3)8b!hSb57OQ;tg0?*8wMoIuPyAw zT63;3#~g9r_vAA2%Z$$x2gQ|VQ`5DRMI+me2t=IkJ0hrZQ*r27EYjLoa@{x81q^P? z_35i)VTdkULQI8vZmxu#P^41F2?iNCRi*a^R3lGs(~l3|Q#dHOtPx#K#KvZT52X3 zaX3}spTH0*!hC~zrjJ#Sj{nIyK)7sz2+XbZk%GP$00V2SNSw0+Y+lIWI<01oW^gC+ ze$-}?L^1j-w*iFHD)mOD&6dJnnw(egS{{Fw1h_5K8WUZLc%z}7_SNCP$c2*oz6w^| zqgZzC_c+3mll8I@t6CMxzq4g(-omgzZvZZ4rEhF9bD-H^9|hwHM?kQt=!M$O<~XLw zhq(j7Vm8kJ^F<9Ie&?dpf`2EnXhf<-d&ho) zBxPvGMkLh~0)v@-n#v<93%=1704Y#CVX^Pq@mR$tKt3A&EMZC+MJ^H&bGznFgXRF+ zQLp^f`_y#h1Gy@_`Bf?pO;SM<5`A#o`yY*#GiV~$@fp-a*r54bX zlm8k_{wHvN63u+jZkCCvF28KY{+v`k7pOB(ye2a?MIq(Uj14W9(`?2SOXMsc7{veo4Fee7i!WP=q$}wui1>p0vyZC z`637@@lpwFHU;UI9n^+SS-e-_6xRPbk_8t0z5A*=3A@;aPm#{t1lRLa^`id;#m5F- zU*wZ26DLepl+PQouUG~KOo~RVm>BO%+RZk!;hz^{abGIx{I15kgNDZUC0qT$KTmoN z%n)=alm5S(`QUjLzG>;hjtA=V@T=EjC*1?|($~M`W`F?*zHx<_Qt)y|(Gq)TBLViO z^}IO|5_kRmNQhcAq2b|V?~O9s_7dN5#$Ad{`3(`bIzo$t;!=62oq@aw)*E?J-1^+f z7@4jGPbB7Gh<|xZ!!HwrgE!2(FH0VAMdXV3s|zr+8NAROS%#-M3q`;Gwz1LoPZwbL!@$S zktdpA%O*7XUzoDQwbX>1VBAC_JN*6o_tTNsnfeF9D|URCl`jA4>{qy-6`@E#AHnRg zy8G_G#eMmzelkBrs?2e&U%rlKkkCTa@n0kRYcP;~KmR4ylz&j4ZVTQcsUgJMk{n0t zX#De1|L3Pm9WO}F$kGa-A0kqb_CXj~$?`QpNahRHBL2GgQa22`?u}hezdCfCG<03y zO}Fa*)MBCdrCTOCt{m?P0XU%NzN$Zz-_QA%1^ijDKR^8>`OZxJqJBbe8|TwEQW%5% z>+vq1+tcsYOg2}da9tMV9H2SbBlr%W!2k2>|NM;f_!mj+_z;^Ox(<@Q@EX9wi+S>= zv^!l=;Xmsd}GB0_*<{l>hZ6-vH((MAgHd-OLPut|Pjn>iNdJ zV)z^4@~`W}F8MB?iNDIG_W-(X{qhwgJ<$KVh5fIgp5Fg?yHm#oW=NC>pnCz?Oo1R6 z`CniB*MC2Or-G<@C6!1&i?ia87bs)F9RAPIp$Gzs9V9s?xOAR|1Mb&o58dy0lb>1R zKi@*@ueZ?3PLOj+)w`rY=~TG|!U{C}k3Zq3_=~DnY)^3pO~kiLdKyOqoekzculRp4 zY*B}w*M)trWI%u{KmU>%xZ1Z^_^)~Y>%SiEVA6s9n6LY$r7$ECF8CZ;=DB43xBt_i z`A~n}PUf3}1`_m5J_=}BgteOfQ_U5~`2vC@wD52m^f{o+`}=!nG1S*DqeF*b|GzF- z$U{PcfqoymTkeCedFlYsCog9FVoL4*w3csTKi^*SfT}2jCGbQ98dF}(o(x#3u;}Ig zacgYASBKs@#r%eN4)7$NtCz&ixcu4 z2+g4MbE0zl=_g00o#YTqcx7~x-}xHx?pO903818a&+{Qg#YVFrpM%vD#sh^~{FV@Y`um8DXE{is$#sPzjJP?#IR9&)Tynqg}fOX#w=V*REkYeA_|%8$ci@ zneXdE)qD{EA?P;^FZWsVAA6HiYLS zA9P&>=^lJ=XTFNLX=~`#vve4 zU4IamZTdVopaN#E%f0q%W#ZW1yqs>HOZR^@Ci*Vy6Z2uC0Hv^kIB|+E#9~TD`7Q?h z*Fnh!=$xpojGprYux`Z!YkzOCB3>Riz^cYQQypTcy>*(!pcHg6`R;}TU=eQSWrY_S z1ry*HhmB18Luozas9R(8yEl(CI@-@w!>TU>&@pg61hMMW)~DotoDAi zV-K_n4phKTF5G}IxP0JyAhVQTGi_^!7G3kDDyU`gZSKFwQw?a3e{ycgfAru<*GJ|TKWeP8 zb%-jluc#XdZew-t!MKR2vHrH%mcz_* zLs{ile61zF>t|McY=gq~-zNkh;N7I}++eZM> zPwD;~H=JB=jqpEtC+-<2%D z)Pob&JCd$7xObW?n0dEDzSd)zQhEFd|@?=^o*B-U0qk;Ww222W;ooKl%Z-1p+fJq zo4-`2ST$cq0M%+5#U-cgNpf6K`X66VPaj6a{DIVE+`-cgfNHEGx3dHOHdoheGD?r!$*?DmrWggEi|#gj9q(PzHNPiakv&Z^1UmS+(* zK9mPxBviI{*e2{1pAega>Nwa$`d!-VRoa? z-^!G4%#D05g>thl_dP@LiNE$ezUS9oqggDo+*7t&uh2x(r@_o&1f<=C?YOdqz_`tf z-#Sx6Xp@`eW4{^?OE*rcwlj#?BKt;Pa{=8Fyb`GbX@lG8pg=}N$JA(M&5zSUwfq3` zq$Zy*XK|OlPVotTIIEjTv^Ml0{}Ar8S$WZT7t;0M2GvOc$%SCH&Dm8jUuw*9MTuC% z6A<%$g5`?!x?pr3bvV_bbczYBE63H1N&9Duad|Inwhu-oFz+?a63qoNM!qe>1clPy zK{E=)FLg%IVXk<~%Z%VsMi-~7|M6de0#F8(CT%1H71o17R1zZgS%f4i-FVceh>UA& zW?`&^Jmqj96XuDe`)fn*YF--;O!z27^_IL+Sf+ju#f8i8($w9#K%Ya?=fzcy+UIGv%6&QoVGtM5fHX5FkD94N9v4+jufDoby7=3^eQRM` z6zs_K$z?JVNGt{a9P8HGH~Uv8dGK2pq` zdA(T!lp7|tX69bGa{(0OsY_ozSqqgP7R`8EwRH)V>`{y z*gt$fSPx(WJ@{~-6y;@0A%=^(!S}f7yQOKPLVUxc9^U3HP;K&#cp zhp>wH&kfB9?D_w|!i@$MdlQNMfH!cgU{pR60(n{WRQ(bs=iFjnQ;=*Oj&@ z*Q?;i3kR{!a9GRhpjJ^ic3X+3YoYI4L0U*njw(6e#7X1L?+S>_1LrxBr^6rgNZuoZ zMfopqD(U|ZkHrCpVD8cQX!=(hfK4M+F3BLvAMoDAr8f;7&)(vIh(@et4QQ!!08g9L zBza>_g))dhPbm^K1;ewY2>kDCVJI3PUB|E-%u|&(aBfBx3-6y`pLOS`o(}yL6GE+VO=1GA~4Ya zO6nC)ZcgGFb)_B4#J{chcq!NR)2s27{!%s8X(+>oPWpZ(1f>TGSogaB-s7G#0Oho_ zd+OCjUM5pcX5!(`k_-n^lYwMazQ>AS?Lh4EL#4R6qP&rD@!O2Ce4jz2BEY&(wCjTp z80F>P+J3QwH{E9IYk!O<>@0+7&)U7ai*BAkFar^A3G-1{z5UrLIuQjH6Ffu#HcZ&8 z!SWTV@!-1}gN7jvTCU1+f%W5O+QTcVuTHRf*w#@;VcAaDztnjsJ~-k-J*{WNm*end zUHYqjiI{$O29aaD!i;hxkQl49Jp>4{0JR74Cz_g#2Vj+Tg3S?Ocm)%KzAL#wkmux7 z0!V^jTq4ZwU6UfTo>tj38z8oE2BC9iBTy0%$DOJ-cpm_@rQ6E=4-dkQb+jZ;9d&<(BHqhn}1K^Dv zI58NZRN0?=>}5i#%o)lC3LHib*PY%$6xfO+=PZGVVJ5e(2Q@EgU6*5bcXlN9$P?dI zn!=`lp@F|rE&MILRw$)x=7XHl?Ov;Ee>?bbq5c_;ir7 z;=Yu1y(cR1uP^@VziGe1xZD~~+sj|+LPe{WROnoPw)X$+lf3w^6lJwy7OMX=Hb5qI zeCW??_18@P$)PVlk+S`I0c?kO`cTn1{Bl>wtO-R&`RPqBzD&6`ipgZU61k5eiU-5% zl~R*Y`%#Ar3dvweq9AvTF(=jQbF>hBDU5v<$xKR}OZ|%4FO^6yG|(d#C47#`;pBc{ zg}xozm(3oVvtynI+{F0>^+Rgzb|+6^+qN*%KoRRva9QFQ4HC5luH91y%L1gfbY}wG zFzF;rHQ?u%Jaup^E(>Wob=rB*=KSmSl=L!93IdGUW=5Lr`^bow)HbFXwxQsN!mYi}uFrzaA0}(Vu>16{<6})IaCA?EUZ| zf$RED{`+RSv_G%Xbyk;gB0|JvJbUhTq8-JOt0e(Zx`8OvcuKNFg= zm6erFmqVHiL3mUlvh=vJ|4XM^6lz36I8eqKt9SKXm(40o>^rjRyZUTd=n-gt z+<@LQqN)JSe@!6($AcFp-+z^3*mRV-Y5KSkP1l5-T_a08N=M^jO14<~tskM)D519Q znUBS#n&Del(tu9kd+ptocVVS*;6}6^zw8i>IimY7w`x zAtv4g55A%zGVq_3*VIJtrZJ=T;I7v_x3`N>yKk`~%Ix*;-g)`;N}G#$d9dYFF0r?_qraRz@rv&L z_8-6)4QTzGmcY-*~7W;!9`@I#J19ht5$q|L{GWl zl;?dCCzF_wk$5wA*z~rE2q`+`7n*wQ%m41Z{>!6?>cA;Z3wV(Iz!~R*N}(BL?dQO?OCR-{IljwG&iHqf;p$XdAzRzkVS(x?P39IYh?PdWrre@ z@g|w!Dw3pKo@|SlLoIbEX9or78-Z|SsjxN8{E>)+3F($H1Q(N(u> zEC_c+D#rkxf*@)7;sqry0BeDi;aS!+sxn#R(IyCkHd7vu%5V{xIH z*j1o1$*sT7jZ~{+&wM_CWC_=SP@(5@DB9J19Dv2qQa@iiPOf2(Ja0SfeO@-2$F+W# zF4>osp=uDP7kSNDYj6owgv1b@uzD<57|YhrfSZxCCIuDUWxty)j%U|*S>SZ*YUSk9 zYNGL;3m&Jh6yUfl?+b1xAps&^Vyo1#Lb;q5b2FCrr)*eaFnPKWsaOUdte!m;JfRp) z_l#sdzB9MgKPMb`{Onw%tY;e6m~x!!_%?=9?cQ;0?8xL>H&w>ovfcQPJb?^NZoJjX z_Y5b~-y9JnG6@Ti5KnBFSFDxOmwd3OlC=_v z^_d1>4&3J~ZB|nY70glYyD$D~qaTYUcynCrU@9Yw?!?x683m8CJ0O|;N8rs&;eDgh zaWtvg;{y)4ieTyVk4VHv+DBUjI$!U}QPR?KkrAcO1_e!}glXS%A~!c-Cx1?~=}k~t zyJBo}jJ5BwIn<{YiLKmFaZ>pp4YTfiwLy4(d1(LHSi?e37@wZoMTF$pDwo{VB+kVj zAl_Bmh-dmjC^XM(zISUvq;G2Rb#4Po^Skd$x=dqeOUqVYWkf`^8AZcZg9_7h*Ra={ zj)BtQ!%57Dc-DN!Mc#IF#?y3(_xUv)jtJ7>k&)t5D%v@Ls6JLxE{EDjt_vyY8FoYy z8D%UJ_D=_TEY-MJzou>QF75Hi76{MEwZ#VP;K7Sg&8&Jcw^zSeh23mDn&3H&j4Ig2 z^ABe)+*&lR$HT}I^Yx=GpNMSjXMqlS{9&xvbSgXn^g5pbwL^DX3g71iBa17mNon3U z>w5X0mzlp}$7we)r@^jSuTj)y*79|`Sg7RH*}EEXN@CKzjH~aMp$v{l`T0_Tm;Bt( z6P;EZh@BKq?qr1b))&Zr%QYEHGTt6l%-^gI;Dz@!<2w4VNmZNHHZGJCaO8Gy3N}C< z4CC6xBLmX(Zny4C{g_}q|A?1UdlY&1^Q`>XnS6aj)|u>Qv5yS;S$0V-kPx0mtJ>#j z*{%59V(U#E2rB1F&EjqeoKGWnTE^z~4m|IlX}PE;PpC9uz8h9{aV=}PoX&XI^t=qrIoM zL*4a`iTQ)Z?bez(-Ik7_QvJEfO!t)J3Y0B8@<%%hT_jSui!%s^XlECW#~Au8kD$=5 z$Cd>H7VqwvdF%6bc4T+QxpV&4OcTVYzkcb0#MCcW=WdW3zICoMJqxWZBo2l1Dq%Hu z{aTXx683Biy3s8X$wV5oTC6)ZWB8k+kI1|yFAkh<*2z#S9G_f0*fQnEJy>Yi^t*m* zbjE|8{731u8JZh%6RNATeT?gY$*r%Z!|Z0`>#hpnt3!6I(;Fy6obk;_UeauG*@#a| zHBm5<(3kB4mv7PA^~q3A5$(Ry(bHQ%B_7q@bBdeFC3Knsk&BQ>+cT00H*SUoKCjIL z4qczF_?q5C>s3^dH^J~)BE7wwhJ5@YIVEYgG2YdFALpWKw$fNz?4R?yt|ZyK6VJ}? zCtZxaL2UVKCSb$&6FiZx{bNy1qCrlJY=;c{Q?jk6KOSohhMkTV9FCC`C?xFKn~(C1 zlZ=WJuorHH>|x0~P``na2BOQJ8+MdZu&qzeP}F7K^s(su!>!l+!;jeIft@u>z%Nj!^-}{Qq2q>^5$BLkm~}YsjoLNk>Os!15rdY@x6e8cAxjWhIk;+_^0OjT7+}}&3t~f_C6iVPf2eW zdCG68>gX~yW3{$`q#+I6qENX(Mr}KLp@eamtAdx0lf+7+*_9AotC^ttlMnJJ4qsJ@N(lXetuEa=!m8`jnZIW;| z>1dreap?u{Ch*?i&h%EBPL)2VdU~Q1eO~=3&?J3gJ$-}3rS*;8DsfHFQ^ZeTTlQj> zbQM*Gt+|mV!YeadpH2sOmwA^%C$j$&O3Cw0&uz+rlSX1UeVzeQbJ~@SLUK%F#*K+` z|K-XMDyfJnw3t{^C+({_D1AZX!miW>3dQ?}DYhM!ApDj>MdnBsxK*~qz@&*_9e${& z2^X9$nU<~@FxdE2h>aA>)zn!^xnTx{&`!PZi{+F&69I*cSF$SSXSlcVN4{q}6C_Mv zU-rkDDbWl#U0uRE9}zDpzRsDNWwYjDv3GZ8x{suzgLkCW^;*=6Gi?FZkH=TnZm$t3 zYhqZ_9WB_$ZEw)IvqZc&Oy*90iWsg6@L#2eq<;w}dX`)>8H*+!&hBG?8TJi7?9un) zPJ_`FF1GvJkvHLjUocMcCa}rXC$LU8INP!W!JP%O%7weI8z;Lg2IXtS%%Bjnk!l`} z$&f=?jd{c28Y+9X~xzLsR~a$x9!~tMC?(fsMqu7zedF3tnc# znQD;JYIysClDrO!--aSIJh1WMukHOK&5yf@FAjxd5QrW}hYjMJ$t9}!1Hn*Ys;4mDAd4dXQ40a{faq*+m*q89-K~X%v)B--PLQUu<{0tK zj&3Gpi7%kXahr#sh8c+R=X~QZZxo|i*C-|-x=ZFTIb=NCZalSom%!ok_iX-0v&-aJ zVR#JSW}UR=*>p;!Ux}uECa&&pSmE2)zUcMiG3%bEXDyB{-lN5*qH zFcgF>gg2997up`7buT#Ca?2l>j}5BDKSkt+IPUV3Vz6LOK2kw2k^F;kEHL~H zPkw+3y#*hsQv=iz40u;WaX7Vvo&+GH_NhL4z+nb=O9{(1UO95kYh>-xC`H z3Wu+Klbm8}xKdqIgdZNj1(zKQNfv8;IkH*3kbLpUE#w>>nV+S1d#X(?9rMkPJ3#X; zscG6teYkL9hD5PO0prnHCJa7e*n9E+XO%E(C=aLDi z6H~^;y>vXbSqoTBuvNYp1jD_L_rtiTXndv_cAF9_q0JvKe z?c#na7>}q0sSa+07b*+j&rpl$7fzJO*kmFl)e9mZ1lbiR8ayO`|9rqt^t|>yi_LLh zKSSKhm*>>CqUxLmb1ST0`}aqlZ-8TcyNc8xv$hA)9U8ot6C{pB(yD;GY z)8VDK2NR9YYK+xc&dG)}hb1J?O2nLzP0idn@3*K#mVLikbbh!T#cDj#p7|yF^C54~ zfjz6yhlIV=J}JNo{$@^V08&R~o)k9KZ0QqmQ1$Fedv81xNzQ2>e*J1?gm@GUj*U~= ziJMxrBv0~>Ji3d0cI(3Ek$he2m7%(V!D98|-raoEzMI5k8{-vkM)ew8I34r9+Fmpr7$<+35;=@CE~=F;H#?$7 z!@HmxnQ{m)nX08+ybI*T!ko<-0N3U1O>6fjgtqbc#Ch`@_N|M~qwf_}soF>;Xs6G% zsmZ55js3w0hwg!=4X;NdCji#;%Il}TiVzNH3(MaRhUssB+Ifd!DjhtLde09fv--0l zGS*DFHZR@JZ!Z)z49H#pZ8R#WbCpfU8QzcG=f@eCU+GP+8*I2&(h~SPEFNhd7}uwm zPOLLxesvY;>U&}{cpbz1Rt3PfbbiN64g<$!;o9Xks884qycN({WS>5o*ii=BTk?N1(D)#@vg!K3E;eGsvBEZ+JM5x zd|(;ljU>Iy+)hfoMB1DKuDsqRc9T)+L*AVaE|0Xc-A(AtSHo@BhEJxokvQDqxzvkl z4}>pntMl9L65ZlV4N#vW)HN_jKI= zy`6cm0K~=p)rFtXW=y$0O?KPN@)KY|u{wPx(#fUG>o;1Yt`)?B9m2Gu;)n4k{!fF} zZvN&iFtF99N>KI_nE;%NRmLL!pD%$=pn>p>cqaD23Uk#~TH7fnORl>5Cb3mOEz>ut zxNqK+W+x4Vf;o4Owi3)w+SaE&gw^h?-+U-i_Z@Rbp|$oR?eY1Z^+zc^?%Ut|0EIaB zmcXX#XO)TM+>d^E$!?N+)nF6QD-WIdj90TRD>QZc{FQux(oiy)Ht!G7JI+SApuW3# zkS)G4xP7C{6s&i>IAqkl*VA2u!Lsd z$M?CX^JyX}dj%GYD>F9v?Q$mk4l;$_a{K^j&FL>{dQCy*MAi zu$sq8>bA%5Otf#0DqW9JKRe6W-=c*a(uHbB)y{Z=PEYO8c}2wWUUUIN&F72c=??a3 zH%9iaE;S7kk{@?Y2V@)ExZNi(%k(-~FHW5yS+s?t96(*0?0UFO-PCZK_Rrwbz{0~S zD$+#^w%EV-7V5Kg0Igz?DjDm$Fnc6$>M!7RiDx(}6rWa|lf-m3h49jo1gC)0IUGWW zN-o?=#}n)*xK6eV73_?ksna~qm)DpC#e&IdB8Cx1-A&mnf8b8Ycg7;~&K>*Uf*G^j zDJv%(QyLnKhE%0qWcu3|sj|3if7gEc23c@DeKvrWv95Q}u*IKOXT~vRRCRIJJBK97 z^>B)| z)lPr`l3x zn^Xq)M2fsAO#Ou_ldt73)tp=lk34CC3Md2j(k(G5`f1Kcedj7%c$5zy>u7p=p8fuh z?SoU|9z)|c=**Emkv(@EITPaNcYCJy@oz8Jf!DsTzA3!wU2fzw@UEnTo zbLPit!b>LCMa-jv9){;Mok#k~6a<;n#gtrJB0lw;P>hfj&wlz1)OB~s*G*ZC6|IWx+O5$;OQ$Ye;vVttpM$q>nCu*r^1(Ir?Q@!%t5%| zwmY>V*GJuX8yM_#KV^QIulK!ErrzQsqxI-kC3?fN%VXYu`UieU6isE4(Emys=*`UQ zGUkTXxYhu( zKTt(ms9I)WVhnUptZ-&f<$NFEh1qo?pyfF1YYZg3K0sMh0k7d-rz5=I8C25i z`zl(<6cr52={S=68$7#L&1f>I<(gj{EGRp8&_d&73Sb`)ceCHi9CkT)@TH?bK5qga zUFj>=yuvP~-{yxUxb}{Y1N?L^yz^jqg;xvXP3fKZCm%(2M&$%H%utb;PlKj9Vh?#E z+fv+mrf(7HYWIDkwCckd`EkM$3v@B9p(B{x6N*93#6cgY>!bt7XV#45U^V z`le!E{i0q%uj{mxm*MsdwJE+^TH&9( zvHK+EsHCHg0%F91R)^-l4m_o{A&7V*S0Db;8c(du^)PaEYVh84ce1$~^$FHsV zp8QSjFAPpDYtd4fZCJ!RqZ8WcyzcQ0FY05r>kLSn7?gs8!>w#ans)ZWkRJ?kz4+2G zg*iNlxkWnN6MxUWP>FuBZmlv1(nY%`b(VrUhFBb-ezN`$(nXsEyWTbSZzzB7>ST!D zE_KnI=XiG96w7uGO+kIkN-Je5JS>^Pe)7W4g-thqG>`j^)B61*i&Mdd_P&p3?jmrs zLZ}v9$;^sH)teWmvMlo3;}QZ{0QhyzM!!VDek!4N#xgRk*MwEA>2-M0{A5X;ETL}t z(bz&gmw5z8f6COmmnOCXqx6$W7R@^u>AsPC9}(YkbY7o&;e+A&$$qej&1_sp_z-3I zt^sZcQ~Fwq{Xfs``5lDaD2gdQWQ{VvE?nvS4=zG#UNy@^^`gs7MnVBkESU!L#{Sp7#>gmMtr!o!O?O zjt^JxE%TFTgxntxk2X}|8w%z~_w@?wrSqDo^Za0uEAn|LTzBz?MEVU+g{D`vmGHFo zX*X1P1ijH2_YgJ1a%JvEXPFrp>`O;HyC*3+tBTVLV`l7#Z*3BgZPZ-X5O@Q%LITbM zlc|Ie$SzLI?DjOz?TNz{y4>n^UkjZgym)fO6CUgvw>~#X|1)qXyG#9a`NA4oUoNRr z(JH>(naChFvw56Z_jqqPB7Gq4@lnbN5Pe%@nxFF3=@>LTw}gV0>zpM)7j@LoO9TBG zC);Xypo&%_7-9iztamQiVcyMfGT-|V<*;pfj!d6NOBJ5#-L>JfGt3l*su`6>@2ADw z@X_$j=vGz?7f*ORSG1z(RH>HKo!*a`UHD)36THe|H+|qp__!kOQ}=K<@HGUG>CPpn=H+bcn@v5- z5~vxbTHa1m>;WCvrd}+1n@ki{lcZM*vBXpAcKMMTY94cR=Kisq?~UWXw+b^hJ_K+X z=GVFjXYuW`#N*=8hXR$-`{}%yJWEpa8E|;-`>^=OH>W=(;uQ)M7x{La(j*gi+&ig+QZV3 zAci(IMcTBD5zdu{ogZ4Q_B(Tl-q~iyiVqs!*_{b9Uwcy_*SR*9RmiQumcI+M^zqUoEK{>qtDnoWuPTg(8)^WeVe5`nJ zcf5chBE!ihO5N=xgQA+fT(b=WYwfgRkc(;TQBoTBN`iSq453;5q#J9B2+5EtL&Fc3 zK0|l&sxz~=28%F|PVbFNd=d3J-tXQT_No8jA4tUAI_=)Xs`&X`o!xm8t!W!l%$Weo zYfZc}?m2tTyh3BXL%J0>w7YuU$riKq>eDym*5b619_J5 zA%d>lb#MZLFA_W=XH*9$-v$KV#-?i<&dY_nZW@bWHxFXT@gogGdp?PVy3Xk0@7WY_ zI`zhW>AC}TXRZXL4%-dmJ*Kib3K-1v0h=y!liQ_Q3r275APF|zR_{6OlRUEe?sN{ZhxKRN**_lXS3H3wICa#Zr>~Hb4&wLiI}AS#Sc-pFNT^ z^fvr9x`jc2RuH1h3yG)PM}k%JpFVmMN9((T-FA)LB$T_s^hlY6X`+CN5ZW|$OP!3 zeP2rHx#{pm1Ro3U+n*vf-|}UICLw?~^8&(laJg9}tMxx<1-1Bgx9-F4GDdI|uY{m4 z%if1~b2*>CWp!#xw`nyId?fXp#6?#d#o|a8i7(kNSwif5XL~JLJEZbS&F)zRO6_@%!;$uok#*N52BGK)f^wY3 zYtAT}KCH*3W!4k}374{Hc1GMLu3ie9wq19E2n1EczYrg<=05%yr#J;_|3woT*%A2j zLE_kTzkoJZZ+^cGdW*6d$31EHGeYLTY|leV4(@~pFtZMp9?pGG?eVS91r?7gB?<+^d=^qvx%rrT@t9Rnh0HaWi)yi6 zDuKPzJ4W^9Lm|mRgc{pNDrWWDO3c{BnK( zo_;tZ*p*AV#|iYy^~B==oPZ9%3d&lJQ_yf3BQU9?S$Usfu1`-Oa-SxFc#kg(n9!{^ zZ@m7_!maSA0{{zBYi-z+NwZ&n=YUIlVPx7Z#307!2FnM_Z`*C+0eW0Hb3q)be(HPn zLLuC&@>7KDQ;BH{*Ijq8pfo@$y2PnlscOmd;(3xmVW7=4s{f=i5m1FQ<6v z`tQGdCD(`;GGZuIuKH2KXH(G^icCnH4ma2Xd^pl$#;g}ROzo%e9xC~AXTKbvf(i{f zmB{-W*|8~5P3fb_A9%c|6PS0gX>TkH6kCs`ioyEAkuA2{8iy^%<+DCIs1_#s+3=1Z z6UMVL!Exup6eDOgh6tRACA^`Q1Gxu{me3Xy&8}{^$L~R|^m+>=G6X7RSuWDR zItmXyOQa5(Myx_#X>ymfP-mUiF7x@RyOrW?0^?WhV@{5@XwO4iB%+-zM00}KY1W+b zR130M%!ivv9%fMEC{?<7b*Yy;vzxS4G&hQ-+YPBMM?XuRPKOI8=BkiTGKwGEDT9dbK2rXOJdkq z4h02-u^O*6SV3Y_*(x16txy7-+P#?*%vy{y&Qhs6aIBlgs7m*we~ zQXIoq^qqS?zq`3GfyOcVAfyUEuhOEo*D;RaDxR|x z(5}+RxdL~66A^a2keo^fd1F{CeU1W*MSg%Zj#XTNph8>uh3i%j{KJX8F0=hL@vY>f zvphDp_=eHiu8|vFJ#vm88|!6lM^vw^w+NzJxUiXK1CT;}-XVaHM^ABIkGW-@AHKru z9$MUxqFrHp@(L_3r3E3z+*EQUgBkuWc`vn>8hm<5TbYXkZviN#qlnF8QGgTbAiTq* zTz_HcnVZKDL^vEXAiYkhG`tIR(Ux-4e1CPa6H0BxqaY}4+u^EHF1xt!`EH_cNTX$Q z+EvFUnd}aB-k$BEBQN&(`Rj7Q7#7QT6C~9|o*@F`6$jZWViD&0-Mb>^y{;dv6^dWp zD-JsDjf`3JeippZ_wrz@EDQiDo==@P_!p|xs6BnCYe)=EbxQpK0v>3&OZ<@MIOUPz+pt>h?aqxA6N<)LaVyrlBZyn%L zyAQ3uHs__23&r*^^sM4NO!vjOxnAWgu(IWS`&FkzamYhk6l7GJOkb&lO408>W~gr= zoE#o3E*9d@wU!IzP@qOKi zzh@TL$LR`J^lG%E$_1ls?ud990Pri( zm=RP`0>E%lb>?)T5>ku|1CNX~&5bP81ch^kBr0K%klq`wRm)9%f!uM5`_Wredvu;T zL`IA4!^8~Z+Au2NkdwjJqI-$U&-|l-I$F1K#W-2Feg^XXd@ebc_++j{`yl?bBe`c6 zvs^slQ-diT#zz&-OMWF17VZ|RYb<)F^L~BIEa+B}hfQ6gGytO1Jz&S}zG%2%08HIKx3;NnJ&( zPxcRL3<`C0L7fOm*lpvt7C;7_?R{9*elutyg}peF86SU5)u?%wsjL)$49-JM)jr=H zLPHwd`-IMkAsUNI{DvQa795oz+es*tPAw6P=k&R~J&MJA6$^xgjG+6ZOz-x)gO$$|1j2pC%b!V)=$+n9E1us6YX3>Ob2jrqIqG)|$L&6_ zV@UdXDYelFcLN?E#R%a;!S2CekUEG1*OFo5mIy=Dgeu_BSvaNPSt>Bj2^(_d-}c1} zjc!$65ixwg!Tu0w9TH1>w2`Tnp5e7zO3y6O>O}6iOifmu=%Qjj<{TodmjsSnOI-(P zdSu;0MHrI=6p1L>NdRpB2c0MSI*ji-!?8b|N&LKcSqmxW98b9gA^u&6m$J z5$+uY8%~2%PS7Ls#y98opvd}v@z?oLU5@rcnC2$N(&e%R8M_nKDckI})}`ViuF|MRbX_| zJpCc9J((R{YgKTN>zp`5#o}9rO8oT!hNLjJL7~V4_omq3$cHgMK2*pVU7`1U3XY>{ zOcEG^9$gSRQsZ--z$9$o+ophVU|AlK5Eg=?_02lSi~naZpv>;Y}O|GpI)%p<;G42_o+qtS=vJekG`1J&Zz zr2kKKM0oIW;BObgSOJ(hREm;GG;@<(exkoYq-LHpY7XQrXqK-nEiZX)52m`yApr~O zs}QPrfv=Mic4)xJK!eLHrf~hMY>WUL?8An}!sD;xg-6GS$3_JRyah}kArJEF?3hB3 zCt|qv;dsX8U9sU`a%vPg9>L9FNfET12_3=2l6m2Yb)s)!Z2E_Cs%(~cI)WJhuKU={ zV@xOk?hMvUiT#zInglJ_fR^- z|Bb2nYg&JP4PyR3$4>%{Ud~U9P;^HVQpufI=q413B#`Zr&iX<2H`YN>6G{zWUl+-npd>&fI0ITSZJpHi>~HVI zQlcd#p3;}17QI!qSTIFiBt)?nDkE(Ir!bh zs|V_H)l8KM@<;bdAYbu1ByZ~B(4bXo6kw3H_Kp+}^(PU#t0c7q9 zWG2lCf0pyN@@W0LWjACF`Qzb_kp3A6MSA|Mf8wn;k0+mo%tda>#hiV*#unTrE8<&^ zZ}u$UR1kebTucbad)@wEkk3{jTcx4>$vn%6%RcqPy<360elzrri=ScNMqg)Jw1*Om zy|0Z9v^o(@9}?+m`##Cg*{on(e(TXT-q*Ui08TT!AaEb$d535bo#i)rDU4J!`>!;gw&Ust*bBZL`Wl|$;;Ybkz5jF=cr5R&|_EjyKtqkEG z!65VG9`LYPldTW+>vo?c z*-LC@dCjT83ueBB_SYO7)Mi*6dm^{GEaiD5_S0>Wgyx!Pxz#9JH4+1SR=f^r z$(6AYo?mPaIKutrYWaIcb^>QP0M!Yvg(ayAR8yqu&KKDrOLg3II~ADW}#I+02gD^ew!DZ}e*-7mJwbGJ*k^s%yx}3qV|@7bq-q zc#_LVwgmN%CZg&om#FZG*+rMP#14oz zcegiQbvOS63Nr^`5ws`ZU(kL4xs|uYke#>mn(+9=&x&(mzqwSN)rrew_(>v3W_lF< z&wkgsYFG%OB2hkUJAqWcKsKDW2bOv-gC%G3TaeChxxAxgi~aKw(!Id8Xcnz(xf9WL zVW*UQ>~%xiQ}FdcySW-ElL2w7z#%zuSfF?eZ>%y`&Y3J}xt%t$B^Yy!2G={gY?7 z`-icWOG8EJikOhr92Ki^1P&WnCqI}(bn4%V0534nvJeYzymLiL`iX5Y=A^_L_gb|t zHvW**Lx8*G=+)r*>5(=S!CP9ROO=B4n0AAY7M{bR$(|&J32eq=R+9}vi_TI{|4@ulY#MvY~|5(6a*hq{2qWVmG3hPy^f-li`-(tYb+X*TBKAAApC!L9| zDtdQB>4mDZgRV8R(G9N6L;zX1{?JAZV&K0LlHVGyCf`<>`z+7 zKl-**zc(CSLUfDCzAs~^Oz82pPndq6X8r(Ulpr-r8ho~Y=R0V+O)3^TAAh67@H$^h zm+;5YOO^x5q!FJQ#+sABg|7Rx?b4VmUG_Fv@lU#qrT9(ew7%IDTxuXjE%!V@J($KA5y2g&}5`&-Ta2l|jQZs-dKtf@f=< z`-`v=)8Afxj_VM6M&&KYO|cs`6pf5ja4oGNZF9DAcOJc9qQze;#i~4O`_^Yl_w=?F zfFClOy$+d-c4AbBy>vgxJ!w6Nxn%m5hqs?ctLyNVejD?kH81P&ww|dq=A;;_tlccj z;2~HAhL_f={bIQ7>kF(^@|TF$PHXAbvGU1eQfuxp8QSyqzo$zvbe$L*t8=ResbA4{ z4N*5Mx#1_2m?WU(57(=6)~}DazqdeI4+Z1s@E07nMk{jbP!SIl_9T-*a(6DiQTeC6 zEpTITxRBgc*4$qCF-5e}h!Cqk!$-hL_qe--WbFz(>UyQ$hz=|a$CLKyC)!SLCyIaS zfYbN5G5jeNJ6I2ajd^OLWU5)`KJERksnL}k(^;z72U+#_o>$`}IW{g-tXe;Kw}&t` z0+sn?VzHpUMSGc4<#Z-9N4ob|u-v*j8N`j+XWG=R6WC@|K5T=@SND17Y`c*!^~@^y zAPc7;>f|4WtkR+@Q{tYJVFYE6)yj)zei!KcMb}HhXshMp&qj)l`-a2>!{J0yKSg+7 zuA<}IA0;tHP%|FI2`Er(pnQk>)9wzCDuG1i9fsElW+v6902j=rkk7N7Ux^8ZSiN$M znJYrp1ZkyK^>6Pgk$Swxq4@an9PKBGmn-<@SV@X4fmiVj2U73Djb=69V8C4N=5>SK zrurTa&#QCJ8kS8WjAlRFjqAp!B_^nn|Hrr!G>{qyRFvRqE&&72y)(dle@MyJdNDea^!g@WLhfWu}8$rb2jbF zl~d-1eRJ(hg1)yF;~h68q9gXV2&S#(lw1Y?=;+^|7$*iD5C5~Ml_(9(zYyAPvyf`A z{S*X3?&bQ$9#C8kJnt!nDA=9daFmk7u-o6+2Og~QN?Cx%8Eg%UWgYTo4*NJ+S7coS zk7)(O70{ViF*Rt_p15`Tg2?q*hs8>TIsiZ8z5B+;(Lk!|?d6JFO=0=sp73qYFs`v0 z<4lgWy6&aQij!1~w!MUo@}SpBB-hmOt7#Z8rQRf)ubE;`MNB9>#?>lCY|Sob5;)ex z&{szX4NZRddUt$6Xn{N4so$pWwq<=e?qy~n^&9qg;oy!UhO)Mw!b8I2=x7V4qEVI@ zu+jZB)bK}*s8i#YJSHKdpLjMlKM$dKL%6!m z9`@}I9JxLJkhD0n;21t}@Mo!23Ic;RuIe47jP|=G{|jACJFWEg)kwFc*)*V%o$R=cyV>D`^$}C zoOe6fe0sORT`KE5t}U@&A=83M(5(P4_+mrIPYm5F9$LJL@wLJZ`-B3yl8%lATTTZt zP~k$V?AY5<=UrzCxRJK?g>z?2B0Cqc?B{)zS`${^TMk9#ORWXE9{>5Mz`>5|d;b?6 zEXWmVqg-LyHzxfPiCY756F>v1u)h zx>))6>Ab)DWNMB2Zs}$#MfIpw4jd5cj2s9T=(1s>o^KXzUx^#<;gI177*^$}dEJS4 zlVYW+t1{>Af;2djEa#xQ3fLUVZ*T%-+Y3|Z@6sFXV zGVDjMg~$#OJA^Qnzwauj!~G1vj?GxgP}n*BY)RtHJT^DITsWRqKDvLfv8x2r3?+$hw%H zTRkS=+Ql?&pLfnq(wyfd*rsv6Kfy}Jz)&k^A4exLB|~C{Ps3Eq_r&mZGkbZK9=Igx zRv_-4qU1;P@mzUB0f*@Hp{cCVu?koW?|V?C&K5R>DdiSYIJj+_tw=6a&3#aNSz9kOV zu~g{Z|8KqjdlOUcShjFGB9L_u*8eWIo#d;G0;`QZZ+Vu9dSc0HjjVnuq52ezSTr~( znu30y$od^Ptj4d9{IH%>J1phK(@&DkJG$dBmOBFk+wp2sdCz<2*t;~HQ#AH7g&tSd z_^vd~R_=cHp!z)8Ns$>i>NlO@wbS55qwr>j+Wt; z=3bk@x7-N1(1}R*q_44UJ3DQKptuOaTMjvvOmOhf-h_gQSZuGq%rj%kkokGjQijs_ z;#J+bV|hr|3@tiL`FUnl`}jBD=A(Zd&OZlk>5Hpb+jS6I#mYgO%6F&eU;LWrw>V$7 ze&a`-Pa7kppsx(bzL*IH@~d+BRi~@x58{5D3&?HfNzsBo0N0QiiR3ndR#yp3wb9V_ zw?*-}eDj;&VAg9T+Z~yzT^g0t#Itu{%XLj(c`v=5=}0~2;PjE}R<_A#&Fwcq5p=;N z`_pTz%a%Bu)p_ZRUH3t-z9zKlMEud-eoD7B+rCXl>EnMJ^ndQ5-RgA*$u<^f{vT0^ z($CD}|2+e(cKK}gg74dapd8J$oXg%5*Q|>I)^gvziEI+UdHX=T@-mcKkc$@7-00P{ z<38>!pH=yvTO)Kia0UDD+qh7ofD4#C(B?3d1j;7;KFvB`8)v$xSa)%Wzb3^DY!A3!k})`=9+i_~{Yu*u=zZMqjk`dpnWw11h?fKZHntZzpj3KWlKv7wVuX<|ZVpo|z0rM8EUl zXHo{-Kd7DDM_l?0MKo`2Ks0K#COr4oyz!d@*?P0)na~RjCk@%?kA`*`zoaIA9tz^$ zKLZX|AGSrmUtIF{gmqZRjN>*Cv-&%^~-&@6e{mZ429ECQyLe3ZLR;CNZyM@bMD^o z?b-xL7al{&?XYjoHwJ#$h5RNfpp!pZ=pPpdrO*Lp1-L=O5r1M%{`rci-$`;2oW?}u zyl^^93d~ z9RTc6$?f>^K94BWT(+Q;;J4=I^MA|?MZ|yqw|o!>ZT5?S!&S#|_@SyxTcKa#pDO+D zE8v6T0tc)U7&6p=ECG%;l$!apMl=7%)PA1xSx~<~-4(R%_dyH#jt3-{a!aP~9sV}W z|Lq3y=b<1H+a1`3D96ZmDBA#)ImuO}PXCmf{3+P`_w_nDv^d+FV)LSehy-ZwNdu*) z{Llf*qZb%Ec2J;OarESdWGV@==z;^&Jil}v`27n|VHwJfGI~XL%R=KlM47Of(hs-) zN)%eaVJJODJMf|%!j{XR)b3`x^u1r}0l!UH<`#N5nfkuqTac?c2WnH#b4JEf{(7|y zq3MA^b%g{p zSz-O+j{2(vqz4k1oqy9+&{qAR&bC|@!UzE!%&!B^B@su-qLBcWdzJUa#($by|!gaqZdEw=Jsz0dUnd-=Y|*9f|T zP|*dI5KstZ{%gI=6qrZAaIXl2P&!oqy#;#QKF?`4C;3S;58;5~f#D;0rv3@F1H32( z(Q?cF)BoinF;VpDh+=lUP>K3U$QuZDweXPrO$`_g4#atq!nXlh&qFBYAb*F9r}~3{ zKTTXb4!t^9++bik6amPXL$f?J$a?SZ7hgFXi1W63$O%Y$&H?Rxp7SWTkO@%srvZMY z%&;HY8x&aix7`6seK7-K!RTw5hktnqe9ay$&UDS`<7ty9@+}z6I6f{jAXquJXAt*@7Z<_tzKV>c- z5CwFYE`la@6V*`cRng1Tzk2eU2brpy_QiLMz;Ll6kOfmI5x(}{w-5R0%R#f{AElW_ zRFFLDqvRRyt;gTB)d$UkB^nfO#Q(pJy66U`LB*HpuR4zNk9h3u2Kq~e(k&4HbvLC# zi3(~62|;Ira-F{#cJYe~0O&L#e+z9eACi1JhTlaU`EX9Q_piqG@*9W^WbSl<3)g3$ z7~pasWs;lCASU#8CD?6KLO zR&t2yE+4cj-yD*C3$@tb2m6KRZLgXV0{`}&IQD@N!ydHOfS~j;`j8R(+HcVQS6eG{ z;y_C1D#URM z=?@V2?8r%CxCDy}T#fvz%p1a{47sbMU`qZmy zc2B}=OUpP-XSVIei}No|V0&=Aip4ui{zVvv%TxUNi9w`oa%HKIK}~oUm?bdYvuj6di>zgI5@# zndKCa&by!bV-^37L=2_^4Reax&=dwJ@Q?@$L-`IdDe&(Tf0E#?GMWN+ZKP&M!I~2b z#8ZeTNnBZrz!#37LFmTugbc}3!=W3JU6^1tI+j?sqWBqLeVRwlZ5-!q5&jjo_(;x$ zo8T#qjN=LNk)yAZIgcPS;F$Y5ngm&cisl~BTyD@o9KArHcl2_wYS_>;$nqz@2F6j$ zE&rqtslejQCbHi;)b=fm8&)!T&A9W!mSf}Xlk;VZFISg!J7zkj2@rc%Oo+ttlJ{%! zNo?|ZpEOv1k8^JA7s#2lY80ED*%O%09mSt6pd&ESx`o)C{*gO3Fg{%;Ng(IgG+ELbep?K+)|O^8C{)2X*q1`(}i1$~F7U8ywEX3oBj!P|T-J`N?uY+mY zJ1Px+c-XItRT}%au`KNRaSI$TnWB)~LJ2(CWOO?RF_PX&WbX7M=gJXA7q#GF*n!41HI}Thugk z>M@J4pZ=1gU>14P#_dMCw=~jquQw#M+5h<& zGjK=Hta+d}n&Ae6G zd|uhSK7?I3jg+O8S<%^k?$u0b{(vSTXOBgR&4U>^I?2~D&o?{1*s@{7;7m(pRVA_2 zenLz&{XtX)e4%T4-fnPSowv7SH!de_I84*A3$~gO&ZfKU;}*Ja)!5v&!>qEgAT%Y5 zr5&_!V5MQ#R}h(h7yu9 zl|E~lws5El+$qvo6luGny{X|mpP;IhmSgv^AvH^yDss6WH?y6bazu3Jo}Q{Ix#UP_ ze(eIh+n@ zD0HgYr5`7t^}g9JmMz8N46bGYec5`1wOUG7CzTiVHDki_U(TJ65!)LRm|(-8Gdui&?|c3c=f>1s+8t@E%T=Lu$0T~Pw&dgG7ZBn8HLXSrR3UyQdM2+d z?fchohYRKj5J_di+s{bS7AdqGRn_!piEAZYo#XJyUK>B$`YhY*oe9@v>4euuY+i{L z;A)g2Y!h`{Ty81LsPJXWMBWy?>$?L-ga+C67i(3?W?QdtT*FySX#AL zb12#<%;0wo+BQ3tNfF1dg|DB$HkT4Ih;n&krtZH<1zRw7%yJ#*@ZX=1-s4sf;-qp} zit}gBE%l{$qf4#grI?Ido+kQiH7xNM&q!34r0B;)wX%3MuFY0Z>QmyFZN@$+)8TZx zcL~O>8?%Dtba_Erlk72KUpPXHU0oJyySk1s>}5v?XOE>=&yG0GG6hCm&Q_^v;V~;q zD=KG1`gG>>w6`_GLo>>z{RGR$`cySrOL#^cZJ(C4^)FJE6S>o6@wt1~_T%k(I>vUGRaMlHC6U=39!xUQgs_lztADyl@SD&F$16+mI}%vk;$>^> zA+txu$T3H3fdAT%-R^LU2r}M}+2_jAJRr^cD_9E;VUB@V$^GLrQqny9!L$v;&&#%gvHgu$)iTKOy zvf?y+w{BfT&-99S(*isOMas-_nD+L1p(ee{q+=c?X|2-1E(9vf*1_-3rmZZ3bUmc&Wb;nqwSZ+?PSu zl%AS*!Xfqa;Qh}}2F^=ZSm>X#CK-KH{KS~*QnKqYm9Z*hr6gJS6$x*mmP43l&gzn|XSsac2UO&e|Xau^1PdhN$(< zOY;U#hg@}C*-Izg*UBYj9XcM#2GmhnKmimImvrsS@vjrcX$Z?XqLWGF>2hSoT_0~- z+4kwd=bt$6rIZ4VS4(P0Qll@Ow7lKNAG4!*vgw}sr`_F}p+wTua!(we!ri#$q(Uow zSXNW%xTtHMgBOg(R!7rT7wH3nm);@89v2D9)l?SBV&xwG5m2?h9c53)Wj-dkbmQF; zXy*MV1>L97M%3&&1}ww}rSKezI^7ISlqAb3qkhSlJSyp0L3zniTF=Hi*7~Xu%IcOM zHOyLs*)wW4&hN~@4cN_fZlA+j8ez^{&!c+9tFS$$Br>FtIn>FVHB4PWq75I5zLeg9M0cJ^wUywHN8LEcL|()nuS;2F{FH>8VvZ#ij)a-y!%MT~7XR_~T1 z+`tz$JZUbK_!4p@!B=$C*3#2b(*v;di2dDzh3361pXG)#7^mbU(oDJEC7mRotT_IJy8}M z3BYU(^rHSQM5@i(=^!<3vDw1@QWvRJoD^l(U3z-(nE<@ZQg4yXgU^Aa^w7PE&Vy5U zJA(JR8h#57xlc0VUEi!~@k+caX7e;tMoWW+gv5NaVke1PVdq|^ywg|6RgLMqo}hKY zGIN4I_|)ud!oJ~OaC1F=D9)u=ZkO5w1NL_Bhk|SH;Ir8%!Pv{$ekDt-L$h)e^Wwg+ zcf!G@noedzc$7n1KWuEo<#I#(aTLEwFmLsHiiVWs)3VyHOs}dxW^+p`gwzV-Ud##7G z?F`?L5}(D=v7JOKQN;8boJL#wB$5a78ZEBeQ}?rd@m0M1jo-NZMYK#Ttab+GO+VNx zCkD&1^IO4JDRkjl;}-la_#-cu&-N94yuT%pX;VQVa$5V)jSt5>mZvjS>g)@g;i)$k zs6FM0(|9{oVb5u|FG+EfU+w6;>P1;#UNv4)FxdZ&F59+hgPN#4YgJz8o*FkBnG%D` zm_wuVmPWERNA(+q=$m{4wyK(AK`y?ghgkh^uG#L@0_g5Ue)_5BA7y27Mgwj%nv z8gc_M&(4&;U{1rM^ktQecKi{%);gq}mTmIwW1qJiRo2Cr=PKFNH7++ezOpKRuj^YZ zQCBrFrD)|bGd0NJM1(ROqimTZBj98kDVXYSP83Rgdcmw@Yr`Ro*HWhz+KkBaZ!8r# z?b^>q>Dlb5aT_G2=MSbf)nq+cpE=`~(qDdYRztr;tWScnaRb|o=b94~3;m($k24 z&&D>27c$NGz`kk5hjJc|nCQdus`h>co7IF7Lt-U?);(9V{jK5W%2&B8r3k+na+z0c z@MOY~`c#D3JEp~X5#R>Atxr!D#oFpq2lUHMhGlli)V^wQ;7#+#d2D2Ir7csV>%*iv z1_tNMO(}_cJ5jdlj+(Z<+V^^{seCX=#qc3Wt5H$uVGM7koZp`+8fw=f`ezMX@G@tz z+E!xc)VwH|9i#zV`}%m+gZw_~=Ak_gek?Peq)&N=3z`5r0%H1&l3L}a>}~|trypo! zKF7%@%+OL?%r_rYW?$$yCzq91KeZfX?4p$)w$rXP*F3p8X^4qmv>;G7mc-ZpM$2LR zvs2nSm${T%h28$>_S(Vk_YNuJXFS^QNN@6FWImYGAp7Zw@J>`i&*Zr@q%3-{niBY!wm!fR8 zUl}2_tY(>*Q}Ian1}zOT8@nGo9@=v3=*qUo3e;Fmuu8KE%y~3M)D;(_S!*Z~v2H~u z1>E|0?;;PPc*s^r$#q$Tpj~}qEU#BLo&5V*J$$ie`_?rn3~O8#!rS=?)A@FTs*X2e zYxvT9IQmSAZx8g}Pq)(MoixC*sInEsC7lb-qgZOW^rZtleC1R#>%|DVcZ65 zO=q?(`)C#vT zQrp*wdpmKmXV~e%3{UVobgjN}Y6g1`-d8N7UR1e^q%_O+Z6r?c|R+A2d5PZ+>$p&q;H8)4h@~`|Q!Q)ilTnl?@6t?hTfn zF4zQn#i54CmZuC{N>2L>d>@|WWh_%{WN9|y(&z~rbq?7lQMLBO2nozzvy)%7Ufij9 zfMD9bezQ5zvaz~FzW4S(mZ6*k$`nV^?iNWLK}fLK zeSjVZZ$4l{2aMBQ0*w=)syutx(huT3RGOG$16s0<9Q3^ImpezN*2Q(&(TQcUbwZ^8 z$XbL$@7%^5`U}l!w9!N!6?>NprTuB4T(tMILh3h%nj2`c9Ip=Y*Ps(_Cq%L)6v?)t zriG3snIJlWtt;pw?|c~|83{x(kId^Khj9L2`I1-A$>{eNYN$QIbch+C1h&PO1*s#+ z%y<{Q96dif1z<7VZ=VOl^grf5bMVQ-h>ZuP0#!cBAO4_)7GQnqt)PXiJ$h$-*b9IJ zq6d_YS&lykULk>Irq=JhQGWRIP?qTwmnwqtX!8Yi3boeWTq4)xz;k55p zpw%5((<@gzu%5}DSzh3dr1C0A-{d1d2_0Q%tVgRTENpb(E=bGk1VO{_k;`KqH3*n6 zCN{bPXnwx{7`9`_H6ea#QlrxPN36%kA5DT9gI&WH;F)S@X6F%cA{CIPyJ;+{R!rqdHoZR1-;zPz%smcTjNIQI9kVP=Mie8VAfQAiJ zcn@NSoaxqz!;u^%Br`pTSr7#q*5J$CPa)ZkICHP^$YG8hKQLCin2_?jb3!xoJ0*Lx zIlypNLR&=Lc1bA-i0y`_!8^QX4$nt`nS)2jTn`Anf4>#-*{=b3VT5I5+(G7Oxw(9x zbZ1XSsY5nI5En8#lXi)VN3O1oZQ?KNI7+K6~QA#)@H z(~*mW6rt)=G4YW`BvuZ+oVNmlB9Q6jRfC2J`oVKFZ!U6xsX*8ZOs^N-&;q`LV5zES z{0FL7e1zrQJP5*^YW!8eD~iy}3@q4tF`-f?nzFzDKz|=S46*R{en0R?B`qX2EQ`%n zhmQe$B{3CEfy9}Y?d%W*EFhV_ihN)VdiWl}AddM1J38-`aS}|Td<+VYvhDEbRHZ?^#gp>C}5n+$52vTT0(vFdOX$9%c&H}5TOEJ=8b>^ zR3EeBXfNj`&Wf@g`1=?@ZvOwx2;lMmYnu^}ir%VfooroY-xD$U-0^PuEwSJ9qvYmH zEx6zwvb5~OXXCEK=jZ2xCYt-=&9+=imQ{*YqffROXO@NK^;@cJg9NEju}S{TS}J=P z!QFtpolZ67&wE~}^QG}EbyO?5& zTWyuoaD?iIATj%Uz4{U9j(U~T)00}M(e|bWp!LI+?RJ}_Z0n%oylC7v!)<=3Y6IW} za|4-Md8L60e@M2*q`ziNzvI{L!FtIPQVUyY! z^_1V$617DpA#py$yolqVN-XNz)?(LEwEmNP-+f?G*{r8)O;{6|E>elKt*64;}y z9QNQtF(o)OUGgH!-D|Jn@u`&NI;#--0V!%LxH1`$(FCNT0da&|%Ya|E1sDnXH#ou*ZV@qwT~qi^~jM-Xl9r zF{;7pZN=}(p2F8vrdN|<`ooMag?KlE9Pt?&*Ua74LZgigAq3mCsJwJ8E2q&kQr{_8 z5+`8~>{PeV?d@|N>rCdC{m!gg%=Z$sRh*ntH>gf#zUTU7W=Cu*lcbpjh80AquE)_+ zbejL!Oc<%dB1?ueyL{UQB>WaJwI$%jqju@F|JaD3|P$ zNm@K!#Q`^I;KrmikBbqN5FILl<3iGD<=Y6#PI)1F_*-0JbQIpJ03xs;y9rp3-5rw#Al zsB!WGsGDA)XZy}=0tQYFQf&gEI-o4PciZlsdS1!>{QZ>rnGc@Ikv=9*TvogzW-M@Ov0ina0ry=WY>@hM-OM|3;e z7VX9bk}HNEqg0ys*rq_4bxl69L2G`e_VY47fMr#$4Z_Ip+om74m>{SNAVxU4j@Liw zFNvgGqVvOcY&=(`B)fU&R>VC8owc3$Icp06oUo^SzTn8C6k`v@N}J}q@xfo7pOSF0X5JznfKs-2&erAQ5# z_200PJVu#CCEIku5~&t*bB8^0$XM_sG2ZFnDa2Fw3DNDdJq)GVdaf^}H!;t%$xKGs zJSmphb2R!~;9A*e*FGesj{SsEQ&0FS%q4SPJi|t?jW7bcs+x*_K{<$R;eF392*B%_bHbP z{|9=LS5<8;^sGe`?v_M!Zud~ffZ=|Vv~FK$DUfPkXyb#OIXCFeUaRlX!2$(&nh*q{ zM2AL=`%#~tt&Vib5F!l^BMW}>=_FCtsGShU#q-ng$OEhIF!{;w#3QM9e%&KArlg5cVp2K&=v6(cWn3{0E)e5@UCvs3VxdkNbY3X zyje!^vfX;l?rc}-Thqgg9D$ic!ZH#55Q!ZIhDH8QBgiPU?lK0otIW6#W+-7*x4 z&|r6+SSGIEGD#CY-;~akF0~QL*w)k@2=7HS&zsFmu6FRUn>pwD%92pg^a^;YSmL3og0Gr%?2R7k;4>bDW?nRxJ zLnl?^Rks`9?@06P@__Tcq)n$c91$5oTOK>~2+`MZ-Aag9%9PIa#!_vW=8ku6UcKRW zJo!4@>8x|N92%u z(F;|-y9_`(_fepok9dtQb|~e(pDWL*_F-*RWfx6yZg?^q6lPRQ)u~7F%3DEn&uP1Z z)o$ZVqLFH;-ZFf;<%&W_-*b(X7tQNzd^?W!=(u4do3j9g>^kJ4pqaNiTY2!?htvjRw#Y=382}b7ZtPV((i8%U;cz zP{X^VOl_Bk=kQjZLc!kbHiT6I%?G_YhH_LPIp?Vf0@dgVWi@`=v}}tiB6sD${~M+! zg%wrp+5XdRK==^=6jf~0b@0{EJtoZRQM%*&;pBq7 z-oqyS`sLExGPE)NEGHqX4_s5aUGpxsPRVAyG2BE}R2e%wa_wupLnH6(x_n;gw3Uz|$j?!eE_zkNV z7X@^oq=DU?W+a7sl6+^}+B&EVDI6Cy>GXQ<%%&lA=%(q!)j$^}8YGlElI$ z7O&+uu@GHU)y`v!)tSy=PXyPH#ph$!%-ijyGz|w}lE*#euA|E%6IiH|9I+mvJE>u< zH#~LP@?{NFK_+p>Zluc($&*>En+$v&qP=?IWiX0zA{)y9aV#CF z&VcRCF8qsilYQf> zi|J`{4B8nU*0kmE_G1naT-2710&TTL7{R!$8+|4b`YPmiT#&Ov36rTh@4H1OU$aL= zc>8bmw`2HGm}*6W0`eD!u$wpf$Kq)yP7l{DCXy%Tw)qL&3lm_QT3fV>xh>L#KZ4Ws z%%54s<-75Nr5pZVNDngyIC8jXklv|3L~@7nS>W@tQ0)||rhkYTG?#Tqsdo#^kE2IP-7O2;-;wbryTp<5AK?$q-~JK5}hk)!&g@Pifsd* zh|yrr(=swmZ)M5h9O9#QLxoX``(vI(u36GDk56oko0%@+4Zjq10ij-p1m5%QHH)R| z!fn!YT#s{SZLpcf5F`?3PtN6=3Ppw>kq@Z&iA*4Lh%=@ZO4%*^BeQ5r5kkFTuy8$5 z-fkx6*;MZ?>{1?Fr!|p~+0!~Gd3u2?Qug3 zkYD2o((>5VGz~r&4T)u#`NdOJwUl@b`zCrGp2G^IM%Td4|5gM4hPxqfaTK7tReER^ z(w-Btl})Wqdx;fiHGNtZYuZmD@%}NtLcR#=+M|bWY)9C1zLan$$-ftNg*u%}u4=>? zi{WYhJg*J0raKw9Ra3EO(H%C!1^IYEogYOy|2Pc+w9mcy4sy1YYEGvO^<01bqG+MK zph6Hc%?e5LdUr>EV8(<|m2@o_U<&p z`mHe}?`&rJ@rOtRVxK$x0bFqY!TP#!NOTu-Oc{_(L29tQD>?19nK{_WSGc!ffF%*R zlA_z2%i4!se4KwIs;Zcr!ATH#{e2N=KLFKtVipU8QV(jd1|7|0r}oI z$+lZQ2(Vl0>KZ{X_@|s7SGe!0gk0wvyd}21b$dMy>0$5Ku6EIKFGJj?TWd_HOCv-@ zrB7;3k@cPH-U@D;4>`@EM5{7;esNZeruT+sGu8Yg%atvy`Pk>a^SX~;Y%aKJ#6W;s zxb%(3^B_7@ASdR1DEw0LF$Ec57UJV z4>SG7@Gt-u(*B6)7|vI;+&PrQ@J_S~5p|=GGPEV{XRNL zb-~>Wbf@F87#qzE5)1Sb85!O-C|j|3IG{pO_AxK+Ss9yMw}f{qd5pmO5TemcfA(~4 z$Ep##$I_cCFANeyCKpsfe8rx7P+F=4FotkTRw4K;;c7Yh3CyL|rZy9m+fJ(r8s0i@ zTPV>)G|2!^A$%@1xWjE{Z`~(nO&aCrX&1YoAGU@YN@qcn_Y`)u4}j=t5sWV_%a&aoGoJz zbc&nn%JrmhuXxkf3xz?{_2s~Hkv17~5!pHgJq9R=ER3EI2 zaW8)srCqwh5)Ru$u7)(v!eg9F6kS7vm*tA4^NMHU=2_*oJNmkp2`h;97q|B_b}qOx zfc-;EamS9&-QeE{xSuVzX$LmNZ7pDqu>A?HHKR-L*s_(B}c3vWkPr*k)>Pqtzb zu-;6HveppXsFQSs+5I;CouU_O=QCRbaNMDTw%kvuvl_2`HLbg;hR3OFLC?~Px_3B+KQ;>_--J; zj**MCbjO_}V}3LMlQc0$UdX8G9ao{;f?1bi(T1376jI5=sBOVGBme5?k7zNG$dR(5 z`C|)N!Lm=MTg{9kDa$zlfU;FNBszq~7~b6Nc_mMGx_*u5oC{({EYbYw$+B;h}>Bu*L8j9EmD`TKOG$a6pxRis6S^LAu2`Eioib|6se5VBt-Bh3w)(!`i4+kFw zI0Qd=OAJ+9E!nSo9gzS8F`Xo+=0g?0OB8j~UQosts;~$sl`b5*?M98wcyJsv!S7i! z3Vs5C75b%kI}VpZROHBeP-8lShZh1p7Fz~YWn9k~{N7z)rIMh zIIBZ;Z|G0BUphEQOo*rD4`O5YuTX6+63-ZMH1y!@Wi+MV+$c1F@KpRz1<;S~ed3|B zLI>R22Pa~ib9w5phxSq6wal|Vi$-yqO^#2ROf$*RxQ@3PE z3?vdS1}c^;!EY)Y4MGA(ozOMi2cwE+U^*No5POmuaa)y+kZG`H9#E5p;6Xf8pNb&S z`3fPIBA?nJjxI9c6(3X@ogX`jf-gU%hgjNJm7;d!Fc|Ls=-Tm*7?fQ20Hn+-E4lkj zf2oA~0F(|?X^f|)Jq;D(!~w?YRgTf{(P%HX^38*q?r!ay^FWRj|AAzhh`mel=xQE4 zD3L+K1o2PxLj~$KR1s9LjNAEW3do&2;Eq>Iia%rvJRpwVT~eMpd$cV8_6c<~{9a{u zC1m(VAnq{ypZVRGi#z3{LT1?(pZWN1CD1z?PJ*nN&9fY*CBO)5gd_q93!NBH%5T&I zMUEanxU#|0WdudXG3Yvl$HsMAfNL@v!7l5rz9=^X99h_=Dhz;W7`&PMLF2PBP_`BW zS(8{^e0{S57^OWS{c~gL@9s^gi9kE>3A%$n2KDb5fs=vCTtVIu`+Lb2_gr`a6EqPpHlNl7WzimxHHUxb+2Wq1PtbzS z9c%SE)q)l-nSjnAnB%tI1IL&*D3&h=LHu*MXvZrPP_O~lTXq(IdioVd5&*g74%9pE z3g5m2@;BTBB~Wwe6>WHGge*u#_`wb?9g~Gl09Tc1t;StO0YjDcl!y%+?% zy$-li1E@am&Fb$DaKt6hNKQe41BQxc@^Gz61|MsjfUKB+ z0G_P9jj@@f5fG4QaGVO5s=^>@x`w=%sSmg)L~HO=@yrA;xG0LHA5o+%za%)tS4X+d z+Dw8F6fG1vN9u1>%*RG@74u*e6hlp_67AsjQR(8d`tKxIF#Di+olL3#r3% z_ogzr31!F$6sa0C{lK72(*yRQW5pHGj2p<$x_~7knbs!}Tn+d$IT3iJKd?zrMLuwT zv2E-W34SZ{R6yrfQz8DHBJvE zGyGDH_a5mLF86exhkav`fNET*{6Hr`5>X(>%NteyTl_NigD$kgf+@e5ODchh&`Q-6 z0ZQVh3pP79N9dkKcpapRxLe3)K{7ZQ?25OJm`c4-AS9sJzP(Q({FdOANvx#o=DcSK z_>eoi&=wISL6>Y0MU`Ya$!IL=xM?Jj{ylK|Wr`RQdI|*N($LuFjdEn`(2tf>$RtF? zE&vrsL9t2rVgV1C_|Ld(x>qf-1K~I|QA1nEsT(Z)ya7y1(njCawue4lb+z~tNM8em z522Cx75C}KxM&iya0OL^RN2XW=X~&8hgZ^8jp9vZ?ZBms*#_%{S+I%O?txt}kn&BX z^IwJDL{;N^USCM}VEw81u*n;Zo07R1aAaslsIP==%K;C%fQMf34ZF@U60GW5L2h#! z)~mveA23a%uOuE2?8oFzgux*kdXK*E{O4$bz<5}gXgS9y-+&9=7;==jKJx}t)$_6u zU~&4eq6zw9-|LiN6XS%$gWw2+?dR`v4txP)7Fv^GkMGM2N9Tto2|yAEu50*k8u+v> zca8y+!gw0&4s-cvEaSp&O3X>5Nm_$sErW_8=B+yhY{1L0jm{pa^?3JlLwTYY3&-z? z|80V0tOw@X$5Ti`(9Ku6I;=2zeQ17nDr^By@)&kndagS}N z6xs&@v-)s1&xv49&5suw9G4;zmIz;gI6~7p#tfuXxpejVD?S|~eiify-0d^iSw{bX zn!gN}#GD%VULmq1C}St5EVOv1 zeFbL8$CM7`3Z&x?Pkdaaz@!}*wg{RZ<~y}mRoFYBCO)qEaD(uPf`8V-dklim4_+V~ z3nJYN^uv=A#g6vP!A}Z8k0NA@dJrX-4=53+!Aw%`NUrXqoYg$ZehuP=&>CKsO*^3tt!s{s#Mp~X zC-Wn$SGQ306G^YJ0kJBZvj41p*tvvG?_#C(F`;x11}l{Fx2rGMGCi*M$R5mXAUc6( zJxAvX_ew1v&pO)?_dx`FxjIui@P7~*BIY56Ke-l_Na`R)zV~?^qI+ zI6t~~o4}sU743nnG3+^ZS!6OtRlbFs9+}&S-3Y@7D>uqMX-e!M+gz@+ux$p!9MuV@ z)>mDEOR81GGdnNOIBz$XSy?KFS*4WUDr1qY7PdBm$twACm{baH%yj(J*NO0H>*>{r z14l|XAg;J{86ENRyo?;4OmA6}f(XUEf~(oR0+piq!urDYnM_kva}aaMDY6-|dDcuj zwQP+TfLZR~+_w4HT*(Y)iK{}jN@&(j4oY@hajl?5!klZV$s&;zry%w@cI-5&H2E|xc4~I6rp2bRCb6bzM@pxN{W?baJd~L3 z5j`4%QqGu z%N=97C7p`j!#?H1GzA_(-(ielX)}1dopS^fWTok)Za{aJ1|&echy4ia`avXY5hji4 zgvA*4@kjL!6%5=jrwn?D_envL%1PLau47Y1pjGy&C?yIdI0^#OwhE00sMDy^+>930 zg4G1ot;Tnwg}dpy7`w$IDWmRGl2m=FBQ*t;4F+PB*EPuMWtE&35356q6hFI5}pmMoWG>Qs(pIaoNdv~pLB+-Fu-v<=%k+nhl3 z{N}+gf{GAWKAXb&z=Fblf&EOFM3^m%8die)U?1CCFe67Poc8%lo*r_?`ugV}fh~8x0Iix#o!$Xc?B4O(XqsUjwzH#n-3J(+wJ@a;LM) zigVE`)ib+kg?`34hu}RnT3?mOdF*nM@`%;b)rZxm*0)=`^TFGnJ6D!9H>REYR@t}@ z$q)9P_4jp8mCsYp%ulsXDUS{>#m~5(62ZJw+X>QqAruleDO^5U5qUzTyidPB+UaaEHXZ|j`D<& zB|xM1L~1XmT;^<}($&I+_Wr}O(ld=ud8Xt!Q#VUC)s|YG&F;_$O;&q_<^r{T=v=V2 zk-v%6kXy#*m{!7O9#S?F8yYqi>bnY6jZ|vxIFnQs>T)H0TJrcBnTzx)H}ME2`6jJ^ z0g@riOQ&`Gr|4zj*U*;ij`GZ^_3oLRLa;nDDI}R@rWNbQ%>x-I0VwYjpYiok({wX- zht-jAHJ|Fb5ncr;tNm{-3 z8RTL#iBKDwYqbV5gf`Kd0;9^|&DzlR_;U%GSoZk%1TXC_4f_q1d>u-!6P@JB8l$AA zs<7eU;of1Jl5?HPYRTe~isQ*4ddef^O69l`w`RA?!>gULos>D*`GNTw6+tDYl3LYf zkCQ#8E~k0Q?-X}sESl{uFHbPfFjiO}ndht-78RQgri~|eH8i^FW|Y*F;%tbmsTUp% zHKyvS+g)FkTUT`54{m8WdN>xH`%XBOPUN&&hi&JpFl&Uhr)%B2PAT1e@0e!TXRLn? zFKaZx9mkxxzq&7;vD}KB+HkMCX5MD*blwD_2Z|p?HXS%|-E=+P2E+!;bt43(V0mJ~ zz0hAqe3r_SiW6~+pyCkcYFamatL!pp?I-SUmN86snc-}FI32VjElj-VD=VAzij??`^+1{yKJ|;tY9uy^`i0VOzf4w)=7k764cD zYV=gzdUARq!tTpK!}Y`4a=f4C%md$b za$f5>VNT~rXR(Fz-nnBf!L9Gcu`Rmo(7Saz>^0@Hjn*3TUEeLYOTtsxndczb3mgZJ zn-}L3`NQ;dTVaM+24&lVm)SGs!;QALwRgK8hXCPjg58v!S({cNX zPmRU-6z{}{f!`pCPi@5Qz%o(Wko#?K?SO7OjX|+KGxs8J;sa&U&sE#yS17_}G%i-Q?{5PE zak{X-Us@SC>fyOqSz0@=yKoWw;|=!r>tDsR1bF{=#nFO`KvhZ>Pr%0B2=5CG6Ac{! zHzXb&9;dybF}u8=@V~0R-*FL`Iy&02)6zOSJJUEb(%9IW(9*N9vC+~o&@wPkzrR84 z;A-ut=R$4mK={u_{@sqCk%NJ~nXRLljWyn{cJ=gaoE*6b2!3_+`}0pZja(R{%Nj%l)l@G8Mu4>n8_s#s8!v>@P!nw^n( zwX`IjWO5ocNphAFQI@^p*VrbhV$Td)do2rMsl9_7;f$o|tge{D%2XQhMr!d?z3Qg) zBtlm4h9S`S@i+2uNK;|YL=C=|%jbU( z;k_9jCBAR(5^OTq6aJ49$bwhkg*<)uFEsxny)JNZ01y;Fc{F!B;J>%vKilyoJN@`S zIp7;a2_`UAkouQ|XsoXP&Ue2xfC4nY{f~lIn79aYdK_kRhxe+%AG zgx}#?pyWW_i2py@?w8a5f8Y)u_syH&+h8G{@!oDlLj(F38Zd@G;jykyx^CaNJ~+rH zr}sfTv=xm5)|%%(Euf0}%P*+Mnq>c3{?ADB86l-(;fe6cLKqntGxjoS4ERfh0bbxn z9JnIN;i#CjG@sfn3i>}izbo%EEAb2NcZ>GJ|0mq3f_a_SzEK1WjSma$Br{amM@CRp zxpe$TknLmA3B*dKBR2>081xqS*DE6S>4w+DvR`+qS3-VTT=e4KqwD*peeN1P0= zT?`AuZXiK`xwb|>e?gqLSR?3fWja7fGQqPw_S}@@6kXNGo5!0wo*P;JrWv2ml#UP- z!P*S1p5Qv6ntED&4+2ISeKGopsm-oiWi)l>^N^n-4HTMCf7kk#K|}+-S${67Ec?_e z1UhKgY4(>rY$uTt6QKdc^%%((tn@)j=QIRRsfWF8Hg(3tDbQ zX^xv${R7-kg^5AJ2^s&x?Ekpo6^7s6KkOq=`?641nN%uZ)Pu4i{-Rf2p-8fXmYi?F+3OR3pGH7*d4fLqp)*e!amKE}|6y-k zU<|2u>|uDiHrW3bwgZyjJq}SED;tXblnF`bo?eI`u-oqgEZd(JxdtA#J&VguD23r? zy}ly6z3vZH!RFq@%d92%$HN@6%j|Ww|E~N;`^bl1;Cq-4vKaVHZY9v~fhB&-E;T+v zK=;M}YI-^`BZHJ>EI3z&iP@D=@atFR%d5+EYAQkPGSW#ZR_@>Sujqmpc^&4_+b~>$ zwCSBH%BZbHN#}Wv$u)}BD^&S`cX*INy`H9%?>du`7wRw=sMT=wwGJ_kq$QR5cN>4W zD#z!Y^{0U1sttcf42}4^Xd!P^aADzk1auhQzDzw-x2Re6Qfip?yHrX4*2_nd$d>+> zvHQ)dk!$rq9IkXF^kU%cpoP zQ5F*U2sR^nglV221)V!DUpNl7;(4g&DRomdFH(;7_J_&~N$IX;--3JjtgxdWmsO0z z%Zkjmy>@I=jCXR?tMSBvqss(P1#?5G_J)5W@K3xS;Js_-D7(Y?TRfl8sCQTZbevY$ zV>e04i(07MwxN*OSsC)0#tkUt(7;*Iy8qRXZW6fU+obnLROPz*s@Uvdd&0AfH|L>h zt#D{HcqgBNYP>^WpI!aGod0j|;SvAR9Pvjg#9z34mt;RJv$$TyNiG3mF6%n^P#J)X z<`w2t`)KxR^c$nf7(NGYTX)K8q4LwIEpK;Ag@dL^4tjhupiMwjK~21wjp%>5@87D5 zLVS3)0tlhW-yDQ0*t`Gnv({ck1GuI38hFAm3gN9kgmw;O>)NEy&4)RbvQ|2Od-8w7 zBe4UNw8NLoWSc6;emAJ+H$1dyNrG<0q> z;s0XD4p72hQq25Iia|(#*PQ~6q&DW9SXTKKjC1X)RXLHh%7w%g*l^WUfyjkq z98K4R=vjN=sHv%$s@0>e5}*nl%*T4G;P_Nt0C{L}8S=X#yw4k$r;G4Wg-TnF2EG{o z_WC=B20VZtdyt_33~%aoFn{nm@+)Zf=S6UxtMDk;Nn!sWMPBBe>c=G2;CDudtxOpC z;BQ78u2?+`xeJ+T68sBJ+xVcN!_b|KT-mUup@1eN`*}&Svc6H0e3CU1e2YK!H z@Dma#ir`3~2ue;%?YKYoRaccRL(BC)-3RRl*LtA2BAM_S3e**~DBx&^EIqO?sBtUo z#J>;6?UY+Xj{RBlIJ#sv8sC>|EPgN@X9HQ(r$*<4!jHG$jd?=&_?!$DhE)%ksph8` zpEU$FBl?AnhJRtB5K%BJjC!-wxhuOJ#C%D5E(;k-ZqRy|I7psKAdPzowAU)Vt&&Wf zw6mQus)HyvYmuV~UY+ht2AjbMJS-rMqBu6K2b0 zE60|1o_Rb=m*^xweh5^1_m?E9wEJU&gPCu^)&4$u&#`_3i1UZKl43^+no|cfW%w^) zw_E*mRP5w-CdFU0Dg|U`3_dl8=&TONCtKCBM#=arhjl0X+4E{O7{_crTPq5(gwrs`R*NBX z$(zLUXEVbx8@3S_g1jp`Pqs(#Q^b427*w=A^Q&%XXZ25XED5P{Xt}o`r0Jv7qYaN$ zaMU&i@rBphpmIyH_YX1zCK8{k9Qiy=VM7_cM&9O+z`381u54`m>UNedF_1N%@D1bQ zI#9fbr~-UdkKcf*-yT?f133tDB;U;52`Hm7*G~}w5WjglCZ7cY7cT*ys~96B2cb|U?s^|wbO%AMgUL|^sWEa5K3#Q+ff%E1Ty96*_|9km zY^h>p-p2!Y9-kzCos@qQgK%`vSN+ULn7P_aac4( zcof!otQ zFN!=H%m|?XjyRMTcbYOh>D~`+^O zX_uoHdZ~*NCRrt}Goo1sZNTWxJ=zDKIHC|pN1X19SF?#`=o<@`BC&@xY`zC?1kI*~ zWHPw>>{e`ajIrB|{R^7J+w&jrPvMUqVxvWn?z3N$Wm6C*Z1;=fdg5kPlwhM+^8i~XM=WblB-JkpgvlyW$1x#hWr=i^gzLD;l9 z)^I@>eOoU_4SiU?@76vxj)*O@AH32e3e8a337?!CJtjrkamq;6_w-UeP$OlWWR1i7 zpUHg^HS$$n`^^zqCo^WXO`}p4N=GtrC_CY^xY#(I28KdI^M#}8wbnoVz`XBp`Wu4N z4fzxu_1_7E+_%8zl;%evoK|&7YL~rb0Xc&VQG+u+s9dYfEB1J+460tv=yU_pows9* zBlDPm8ho6TZ-M(1Wl)zTNBZNW9Q08a9HO3Qs-UVwyk-vhT27lle=tv!DRZYv2nb#9 zjL%kHOa}<;>%LG8R1Df=k7$+cphElSJDqx`L6q35Fy%mEv_1??c;GW^cepcb3kfx~ zgk#HIVvhP;s`j{Oxh~&=l?;)e`J&J$G9OLY=^p}hd`yAl#gwm|*8=h>+IsD>y59mW z&RTI~%*eyu=Y_GGKhiLu0Q!s}D1_5Oa{U=^^sDI6>T)wdV7EG1Ns+O>_jJ<0#V$sj z;s`=ULlR12ss!R7Sa@wla4Q8Ww7l=OKq6BhaHe7c?25X7`0ROW%i~Z1}!xV zZoTIl3E8$X(JDs8J#zd9}Od?1UD@G#oXR+y$GhV9n`mTg|&Y1R)^uCOsZ7y?k2b)V55 zWO=|iyJ<+f+x$FWz6|ahrLt{t_7F7V8@`0jB>dVjN1a!UJAjs@G{6z*=qo` zj%0^e5iBTA1{_=sX%<$8C@41=P|OkzoK%Y6E*%G&FL{i8R!tKE3~|Wd>}*vUDJ6+# zG71tJ1c15BmQT?Z+-l{+NwRCpLR*=AttOduzmTM^m_9xtN7^B}&t;Iq4suqln!PI{ zW61P%rN^AdM3f%q4#s{T;1OEUPjxr`sI;d~y_l>hfl4(jfLfKc&6!(t+1pO$)G@cWmo z`$Zm4sOf3OhRrFhhQ0bT(SqBEmwSwshg-Srot;ey?@PAW_;{jN?eGy_vZSCJRa|Eh z${@(_>#X7OpW3!j#Eq%`Y9j%-#H)uSGo*!KExNu1S@jnaSKO4y8>Yif^?J^phEdXF z6X7hY7kawUeq7smnVAL1Dc)Q1m-4o#Yj2(O(?;odLGoN*YhwCg(ZVXx1jwuwgQa=4V)stoJ<)yDmb+@&C@tx&RXOvW?OtYDjL7Jy zD5D>u>^CYM-4HtCM~_R=mf?OGN)Nm_ zO39Lxx=Cjbp&{l$dl@G03v{;ZJ%2w@Fh*#e#zlP7utCT%+h8t@&m&#iDiX@`3|>&O zPc@tE>r(4w3Z|BZylP=QIBP)Kd*qF4^N=?hf~=%>M_el_88X9U#b3xIg1XP zpKNiWh=>{+o8{CGTce1Y^5A#p`$B5h;!fbvx?;Lo3$>aR}MQeuMF&0no z)cVoJOG?VR^3+6oZ+JJl_r8hTWWWZ)SgiVAZW38&9xk8@-p~VikBS z15Kxjus7WEwfv32;g!`8Kt|yb;0ImK0fkY-Qv>FF9LbH{D?CQu1ws=L2bx3^62d&N z9eyZ@hhZEH3232iw!NFJ0$yt5t{gKS5(lW>Y}@{|G9%)DUz~`C;!)5A)wK;)?2|+F z#?6}6sG>juj=q18+&A|*=C@SSDJ^4=$$?42nx_adC*X^9>LPWpI907qLP$Nv&JSix zHW;Mjv&gQdBTKvMQVRW1{9NII`fIYlnUV}e?}q+p7JlK8Pl zIyuYu1401Zu%5wajuy%yc`l2F#V*nqXRrxWvSq}S9Qfnj1Y6m7=Et9|+Dt6U{FaNz zYJGg?zN~;Y6{=E&L6%oQo82WnilF8J54r}&sBJPAB#OdEA&ZCF}>fyY&vf>WBFZl6R4uDAQ z^PE+ge+Gyo-%ANzP!)9!4VfUH?a+_n{H(RlEXM+!7do3^URM}apZ3<1muv)zX(I7h zJmGk}_&=i+*=g=HJhinhs?MXv2ZnT+A<`x_Cb|1Byi{sb2;mYfO+h}$10vr*(jOkg zprN2>Mp|mPoQ()i+a4fi^%Gk&X&YDG@33XavT+!zm&JWznO~h2YkT)CWSLItXrrWM#zRAYN?Hlr;Mob#+ z4rZ1NgxWH#t^A!WDg3~NsDl0zw?m;WvnI~fg(^*%ZJQct)7TMa?|*pzgf3=_sYpMzLygg@?@ynCd} zF7Gp4FfXY8tYTi0)G=8v(>2fIgJHCMbemaegjB|)tUl35q>SoUfYbjrY_cnXy^@YS z!@{g5azrwqJdkTlbEHQS3Lt=EC>=o5m_^`MS(3XhI_niDCCi&-*P#Bc;W{g_1$*ec z5l3XNx{ZS0HI(9~a*}ugMMfzr?UWs;ys}?z-uTdaJz0gp!OSc#Q*C|0fTZvfMDFLc zyob!ak;aexinE?1zBm%HZTlyJw2XbY~W?P zrUZ`30h%F8MFh#Q8Qtd-tc?$ZF&`C`#e_gx3}=QGcE6*er-5KJOffq%hltN*D&9}z zf~tbbVTr-VVWkRs5^A;@h>;opxSy#!o=-Wok&FpSr*pyA_)R|II)i! zy_@1^F%B9RO_WjAMriD)h8Cq(N(8Wvk4k5{6LHQ8yD}-F=|zRiCHljI*AK@DJaA}Z zF-kM{UKH6~JFvSaS7*7wfSGLMIUhZMqJ@M|lJQ759fJ*h!N{@z*eWqU9;zxU=_AOP zez1Gx@y6*kP*BH}jW%qQ+ouluxd+&x(J970jF_Fl&9=7J30018J?vMQi6ECwO87P^ ztAmx_mUpeduA-=JeUSZHi6BXVi?y%S9hW9C2Q5zJi(IRHFfeUu3;s&qE(dnwH9*TR z6#TtFs4URla~~%a)@<#vD#%C+I{r#w3mtsqTZ_38TK3uhq;^{Z7-22#g=u)G886jeB-}JA`=SrVhv_A`ILp(3J6LE*jpAMsVIdO_S+@D za_{S0wZuu8QXsWafulB69D>vmfUQOduTy$IMWAPZugA1Iag;SZcTWO@q1|6p+WWS6 z9x%j1TJI0vp3e}rdXavm>0+<#OyqqFe$uD1u^`|uHp#8dd>cyAYgyyT4L%#JH649? z%qi*BLg$;o({?$AZ@Sh?*(5j{`-FX8xPBNeOjGZ5h&m&NZnY+mYrB+179>8g*hWoz zA;?F4+J2;N1smumu|~=l`yNjJNGoJ})}waMG$PU?1$tKD-E@3bF{5%2}98)A!19aW0`X zR{<_UJ--^%dK8K`N*2LrOQ0d>u3G(aP3%i_H3Ya>k=Z=kQuS1U;f^ ztttmBnx8+DC8to*`)GnfcGKmwzfp%0ENQ!8ma{`56H8jCpLdit|9C)a#7*=Z*5)B6 zUCK(DL+v4z7hJEcU+sN5;hq&QO3n46rQY$1y;2On@kr}ZzG@T%kxK__3jh@RwGYIc z={-lh;d8=Hl3NK3wtFF1Z^Vr0^FYMDY9f%GWL1o-cI~D=K?2J-9|q6rq@0JeiHvez zyC*)!5huIisg*GdGiDPt_4^hG22<0&+JggPDR{1yIbm^w4Ukc?J(Ea+Dyk;U_Sr#Qo$MTK8EhL@ClRXwnE>Qq=mZnjc z6u_?*l7rOPXzPdh0MwUT-_)I=JL1PM6}T9V_)ZAEJZzAe+gE{xes;gz93p8>k_s$I z*ip<2`Ng~4iP7q_dMd{jl**FVlaFcG0iu-rRXZqL5G9LpMTm!8J|?Sv<92Z}4P}kJ z3(iYn@$MufjMYhf=_en*?c^>5?KTizk*O*KtruK*o?5MjH}g~}jfzN{jBDzs5$e!B zHXPMN@24Aciku3B?cp1#F1k^3mnDiY*U@lZw6ajs2&Wu?y5Y9+UiJOickxj~{IxbG z2*M;d`fRXR!f!1G!>kNNE6Y!atS1~v@?33yDN7iPnb-Ge;tQvL#VMa??vL7#%C@X7 z65C`9T>d@Tjv6Y0JOC&~E{c*VJhc);**fPo11S?DVXO$M24=DxZrP))P6SC2{1x<> zyQre#nksRSEl4K_H3rp~Mvot!_Efd)9x9-+P+c@XQ1AgJJiFCq2HsCqf67nSOo_S? z7rAXn4y5}A)gR3T6`rYNN>-N%&4uab!W>(c6tgUOJ~?`~>&W8c6v8j)>*dZP{jEy^BCqMH+~H=D8Tr9zCp6u0XF|ryo`hSrs*i zqe}FGBJqw6`v)Xw^sw_{!SPb_4M}B{QcuQ%0_=%d7PFr>)T5qiLr>v~Ou$jUFqG9daC%d)e2 z)il=4Q%Zqc8F1<}+{Mi1<3h#BqUrcnBThpU_7pZ{h!$@k;YlOf=$u}dK6+7 zCAyiTlOi59_WKHv_#)s({Z0*kTXmYqd*+0ji{<8Q0~K+#MsX+e2$_231o057ZkOry z_5(I2hre2A9MO>P;yy9VE%eKmm8VKiQ%4bm5W{I-`($7^SJ7*yd7K)aH-i>>LuCP! zo#;54vrUjiX;=a>=#J%^rHc+H4SI?BH;AIAXDTU2s10!%P$9O&eE({V+vD!IFRuHZ zPkSz>Tv^oSIr^9u$bdb^47&WhSw7^FfwiSt^u@Q3`OBXVoX0QQR;E#!SHTxOFNT8X zXvGu!Te}kx1FQm9$((+QDp4d_mt{d44utV+ymIg;m;@UuSIQe{`Bjh{N1=l^`Yh5n z8fP!c_KmJm3p;tsa3kECvhB8U;ub?uT=e`<3M1@A?p<7D{^xp-;HgIk{a3W@i1ef{ zUgEpjKN877_aB5qt1-I~5d<4;9tgy5ZII|DuAZ=n6y0Q4iPbFR`6Yeiky_sFjkdwp zj8NTS^^R%V2n~4^UbmIU37cj^iG!ktn1-tjQzkw@0T8=tuLs_DdfcA-9qbwxLT9@q zkp;<}#z5p0*JnOFpR0I%)Vm>`*YDp?VO?kBQCF_f_IXKQ!nB)7i-ePjvejL1o4XKI zd9m=pZ@CyzVC6nVpLL4{5x$G*5XJpi*D6_bgj20OH?S#(f9rXP$`ptsjALkOW{4li z+7Q*I ze5odzq|{~&!TVCZF9b)z#gCG@Y%wdLv*GNEx{xDnDZx~J=k{aL$1CuiDYK>B5On5P5cnUmBp`N&s#-Zt%c(Zvs~ykwNYZu@KwsvcvpOw-~8 z5-@Tm1#e%}&1MJ<*IW1{gF2dj@8$s^iH7`2rK9r2>f(ne!hXe<|A7f+y4j+T!5RTS zAE)3qI;xa+FKl~cOjH^6FmR*zu`zuLERSf2P0Sa!S(AUT(~;gN1oB7f35Ow@*|3`y zG!Z!9n4a1M(Vmaxi(d@a2MbRtD-g(Gi%Csu^`&5CZ!~IMQ!9BA)X&VMdHgjk4E9Pw zizGVkxOp=WgH(!4r2=6&_UNYvOv{U=X0d7orpNyLrt=l4gsI_kBwWe;8o^Sv2$EO( zQC;mHS8#R73Yfc~qZXP5h-He|AuNQ08_;rYog_RZhGfJjHQEkN9)YrpL`n6>a;oq* zpw-If=w%>)d&mk)`0TYz?JIozn44Oc9k7ityql&e|j``4FIA%XG(BG=XeYmtJY3pHq%AZIOYBv3sqboS$T*VP7|jbqKa>)Wm9?^z=UHJP*y&aj*n} zowb9NYOoN;MMMXI%1urlY>oAR$|-Ls;4}_vsFXE|T;IjWnu{ZeH;R(gvaPmH@+;B$ z;fcS}6w-Rc_R^jXNx7`=rU{=MuYsE_<56u3u7h~pPshajCxj4ZyQ4@5$A+G0P*4Z8 z9q%qx6i3gX*C1c5$AC@HK;rrJE{LzL<+qILZY((>Z$wMY2oeW7rJuMWMYK>sa%~RJ z_W=qp;7;3_MkxHY$|FH(9%G_Pe?(tdRGuB4^wle`(Ps4d&^V0sTi5mPv7^Qqd(tU2N$wjYRxx(d9fq|e_|(mXO-(#vmh7fI8B zdpKOa+I&nqWtM#}EJtf$pUaYD1D3~QecyLPdqxwi8C22z`x|3|;J5Tq)Dp?k9-}ZY zEo4#|IbWv~w%evW1gKX$$hp0Qs-t>4IC%OQt@3QgrW?{8qw6{}PQi9tLKR*v2R`po z2XKrils_*UEAk<0V4wt5#E5!FRX3nN$xx}dgyeqlmnd;z7*_3fYpdKWtvi38q%PcI z#CqyQ93l^`)3NydH1YNw%xH%lr_K=Sv{F%9-XXsb^pWq>@xXGm5NoBfg!)`gc)#Bs zg|b{MdwtNnp+-uZ8mxzJPCa`>JK{!t8#8b?-cA@Bc~A4sb0&2;$iw(S?C)u|wkNKW zUN^D0{GKF=Ao<1G766$V-9}$rh|Vtl(K;Mxa+mfSN$HHnZE%6IF%riqBlz zU&pb(k@0N;5ntj71ejYMoJ2I2FZA0XDTW=1s?@73VNt>}BQ)9*-y9ipb7F>tZ_TU-e3VGmkRR|IX1J<=W(C&=Eb`D%tDIph(QQ-b`0hd9qw4oH$TUt zZvLj3J+{Db#y#j^h(__Hq5`X#J7eJNeav$K7ER-z-GVNAu4O~~;;b@pCnJnZi)kxO ztg0$r;MSYC#cCt3k_gr0P0Cu%IO4{Q<1x+ zxzTN4#dee(m&x!jPUK26B(?1+6wgUSA&3-=17e@F+tU*D;$p;h3SqGUzGB}FZyYZe znYVt4g5ttHw6|@z_?bNK`+RR9n>V1-`%$b4=et?4z25g!!~XkZ_;5sT)#BATA^@(9agp#GH(LZ9-1p&IBGOW5fQbj zB2@Po?2yV^Sg=w%Mvj@(T8Js-eP~)7bB1m2ikg2;=RRE4TfID0N12=x;kaJa#c4@Hy}!NIvGdhDejxr;iVY`fxR=bBzAUBE;7mkV7MsJ^ zyP`R;#Cj$C^ESJxH*OLxM`*WImnSWiaKe+%&$W}AV!UybC+c*{Phzpo0|Y~i)BTg+ zA&4^GQ4US2@7$ghL!%jjBD0Heq&m)`+%k)r9*Gx%sUtdM8)+=4w zQvnHpe7!yzSdumO_$cdf9%W}TTqg?fa)8p`P4V_yci&A?b$>r;Dn!=1@qR`r?L@Vs z9!ETEfIN!CxC&3)tRFgQ%hLUg3iZGszilUmqjbU(=s)k8L~#2q%iv&eQbswU zURYWscR4;|t(t#?<-J2iHxB*!Eev_APfA)R?fx7R{2)Iebnw`CFECU zVliB2e~#o+`u}s%i_Diua4`i&q|LC#56VD;rsgytgwQBnOj#|hA93?Fi}V<^caR}c zXrEUZQ0G@FC=~`118H~O!c`KkPX&Am1z;m0%*ObqGDxsb zQpap+jal27rjzW*_>=C8K0*S(hsrZOs3D|Eia)xudj>4C) zj;gE3De6Naq%PqhZ?#a`R-I29gvRH9_(Wh*HGovBsv=&__z{m1QB5+=cnK9tz2{)t zYx#nCnA#3Y{%GAfgn+V1_SV+3~Je9X70ecY19Y!)sfUh zk^IOMKJKkU(e@w;5g!aVxafWZ@q{uQ^e=&)#hm_$S;LOA!m$E7p`U1lNg z(;%0Li+`w@Q;;g8Z;d8xaKE__rF2L>J7e0^8=_s(yv*jXo|4Bwq;w0~rY#gHQ*WKc zYCY_ZtR*AorKeS&-B`D>sUMOsw^(RP!FWb4cX``a4k)O-?|hO|^`QCGfn{8--)pQ5 z{Y%42D#*PJurnm)7CdT(z;n9!XY$V)p>S7|T3p^wL{4%fai2;m!haDwwG-*`y3lOY zwzP(S^CFuAYCiax6?bx>tm~_1vn0^AC$ss9CjG@+jsB)0)wlC0!HUW#vNGW z-#LpjFE&C5qjT1kpj9J^Zckv=b|SQ1RK;$Klxve3UW@T(utEj=c))A*CQ7mi+70#6 zO{1N1VDcJ_TaQ0ks%)OE$;tNnxzrf3SSS-tMvr|c7IJ!> z7tzp-!P>Tu<|b$ZaoKEWS*eU?HhUg5jtH;sIeC{n*;SWqFI{ehZI975!d*fo zubNka{FcN&G-r(Yo8}7eARBOq-|TS*irtq}gy4k=FL9nRA!*7(Ia=QnFU>QdadAqr zD3o=GW4;A0WVv*(zm9My42jdfEWLKJfsl;qMI+`mR>E3{=az@bFXrM5Q6h`8#5C7a zGIa_rNo=Q=ttryD4IXc;H2oBD#iI?1xMm-{#qG{w=2>Q0 ziLuGW>rd&C(WI~;lK$ZoW+py_N3DJ8%^TcNhbrSc4Kg8gNIgDJ}0AbIo>@uS9~amVgY^Q_#4t6RJ4OWHj2BO~KYCe11(ol{Xx zytG#nS~7>h#vHI4QH0+gv(AA5Y0=Y5N0bgBZPB7*<(aN%r!S&VD`(NYG=XtC!o;qD ze;s#{Aj*`H%zZydsVq~eIl~h$_|sKAb4yc?Ma{unQ^iUZyD|s{yEG`3G(pibS%L!b z)0e0q^7v){JiLijY3mZxvK0n9njrfsG23b(l;xnCoT`D(sfVpY?}x_oqPQPy~HK0zq(6h1b3UbLvZ(ryE_E8;O>Fo5Zv9}-QC?ixNC5SZ)W*A=j^@qcYob+ z$N9sU@bY$bmvwb@)iX7sL^j?HHht5;&lMv>0GvtWQ8bF~s4WQEiE-?HjY<@xtrSzr zRg*wk+$M99mkU(t9BvG7&nmBk9;xL1!U59LUgDR;mZ}CGY;A<;yZ?$Z+(z! zFpM}@C!+EJ@Y?Lgd@|Ex+XhsI*sa27M4|#CdaADU&m@}Dyr)AgN^oex;=nbwr-SVx@$?l2xMY=5M&P#ZUxAWX9cE-)hKGE*Ep0G7dDp}dGJ0Cvp z6Tc39bf3I$k$;{gr<#pv(+;{ondqF3B}t&odH+78U0RFP8&tR0iG&6u2d~Z88{-iuJw7_M3wmfu z@M7Q6p3zT_gpd{E9Zg9SUjG)ixO~WG-{FXUvieBPXJ>%Ii1IX2w_ae4sE8>j#xZ*- zm%a(AFvG6MJ|zOR|8y}&qMLqSWRH%^QGN#@u{o2MTB8zBFkg!kr?dlzKK6QFl3|e!G6jjNWNcO)4S`iuG2!)m@ap~c?~E*hR5p+(LarjVsb;is zRmll%thWjlTcJ1LD^mQ(2>3ORFhq^OrF2_$iwiQeZhJdVir&>ZgFzztF+~(n3pA5# zkvDoGT}1mDsNKIB4X>e{iHb*Dm=)ghv6>*9nNtgOVB}=|Qc-|${uUh!BbdNC^ga!q z>CDW)`igW*e-))9J|aAK;CVt(R8K>kuUqe$xCw$RA!Fowf)kFISvlR20~L-l#Z?*x z9$%R!%+%#O6&a|an*u~#i&1YfQ}s8hb&+kVP**Hv_HH*NNa9tf5jXFK45YvqB;;PO zr|lVZ_`hk$ROq9`k^DCcj8O&mPwwoWqgM^v`)-nQ=Zx zrA2HvQazTHc|fzV1xm212J7=h$N0NthjD<4QAX||#}R5f$#-|%BuXXBFlBccg>0n0 zT*71?X?-M65MWIa)*`nMfOVgWZd3N|mV*md5sT*X_gm@i8goq8_icE?=B~TSfzxV# za6x>2qn|OXVv8Z$BRp}=q=wFK*#}+i_&(DJ@a2oXfpD`t3B z><+adWWTxg(4vhEY^t!{GD7qHNk9Vs7Qd06CYeXMns}@>t-LU}(paur=*%>Vd9|VHVzDXO1n`lhgCI z^5vBHbIV<07*%jy3bC?VAO;a>z$C0W|4K@nX&SC!AKi;~Tl+Fw`rfH%xq?n84qE6F z__O7+gtY#hy|xDzXOQUU%8LqC7sM(5)i(~Fug$m(V4NyG`dq+0lT)8g)IN^6qc|t^ z8>G5iMENG6Qg!`~1rV1kr$3RL-!P)1GcUbc6DWhW$Mx`Xhd3(#ed9Z*o|U!$xd&9O z8^jB_0(-n40W|3*X9^UHQeSyXs89o$`5qy3M=cpw*sG&@@;TY4a8 z|F~EP^ZYl|+}v1IBKB}42I!3A7__rO+Svn$b8+_v^LbgZIl!Ab31k8CcmgfYyG6Du zJvOOCa9IS%Qky%um!Rj!#ZXdQ9*X+bkQI||cA!2gG3=d|?A!aBD2`z#CHEc*>0cZO z1u~_(f>fya`6fiA*qi}68zEY9n=R=NaWyaeVoV0jeKx~R(m&ddUXzp)f!boGeG!4G z6h$hb2UvWcl+c9s`J(`V(D#xR!Nd_=UZ3zy4U6%P1rRhYp+zMpz*CS(rg2EG1kGsm z-E$RdxC!-9t>-AfD+6W7Qpi~+mT>79n9}Q}{ACp(konLvy9t8D^7=C)>4%Y*Oacf9 zREp$a1FqBBMTh4SeSl-cHQ26!Zt}A*-$xqM;f>JF^E*M2BFr!ps2! z5o`(ZmmK_2QfBRTC-x8LsF+pXWM>hTDn`u+rbK5rlT{C$T#tqrHojpzL~NmD`^Z=o z>;#uhIJTZja~Y*Rq>|)BD^v!#O>{|^W!XD0Sx<`y4@+*(G6_9~S0zbs>O?)CP|(Ab zl?-*o(3!P7CzK539I(Cr01cZdCL*FtO*wP9Jgi+oBgNm5K%O|C+Xiicn42%wclXLg zsCxg^)O}n++GY)!x3l9F((O%OYIj*!3a^PM-7}{OcF0EoN&Ne)sD0yvg^tby1sU(3GXX5(IzmYQClD*4uwLzoOqIJkqkN)u_X3IxHCrT}a2{JI~Ji9Asu~d7B!3!E_4Y`c$6lOEq~s zSpRNFAN)qCRO^-ed2yK0t!%Ks+Sc>f8_v9_ma8$gdbxjqX=Ybw<5k?3DF6Xg#gfGY-nEz>(1E4HSBo?Y>;Y^z@(v#r>L-@d~U zj|Rel3gpQuh5rbq@9qM>Sdbi4@ni2PY%;v`EI^Z18tYTDW)dZIfYSR z^opg`17P-Cj#Zn-OH0y~2aQ{kqu2UEJMvsftYS7kxSS|bdNu!3244yd$|k0j zb)`HfPot7?61kR<&YxH37`;c`)SB-pd1tS%(+khV-^IzUkv`~YTmL_${jV{{#gdo&EB@eXNK1jwS zvYGB7_J+W<`6e$fxW8kslhPt*A^my~rbjXQn$@GSb*4mZRjyOx$JTb%$F$-JL!+)J zNu^R!{|UU>(VE3Ts<$qW2aFfmd7=_Bl*En8gb(0#1B447r92lAa` z{ll9}$QrwoW;q+ndJ-FbVjz4i8*HYKRi&-Q)59mNhdouBy#s=^o3Kr@mrH61>9MsS zamV%4)mFlcx7^p8Mn86zga-!wusokV-EqwZsqnm!2E_x1L5H4xP}X|cJKvdS)aTTi zc(<8=wqe(Fb z*=)X5V>SZZvNgo=)`wI7FuW|;()w+kzEsK|I*EGbu1}KZ?K&Rn3VP7Ckm3(3`#;Rp z>JpKUU2UpA)_4zWyB=)k^^eXAr?=z5E)^7g|U83ioDE$Cj-DUv+O2C5b*y z77qhYAg}Mq0WkgNKU&4rzF6aZz_k$OJ?ff%xt>gp)~&E0Pa+G_rHdA&j|CJ~w4$ zp^pJ4UR~q}SA|^yz)ub`Lb^4;f$!bx`*wpYpy3{MX7Z7Z+hb}AS&T1{&!?f(rShf$ zyFijAFSCYgp(9N=>_>!{B3Kx*lsW^nlh(xN^uwg=Xg>{+4xsB}cNxjR z2hsHxxwur=C!y;xjmBdbx5r5#!ctBsgdWs$UX^$93;}0|2n<{X^jOI<%21Sd+o)t; z&CHXCy{5~wUzkE~U^7uo(s4r@i+P5~{p2ud+N_)t9oL`3_S{Y3$GBXeS~__roEE~} z>*ck6%^#@``0O+JLCd?=%hJRU-muY0m_$|d>}f}6Lmku5ZO6b^a$e|Ru}Bf`inaYslg4%~(9z=+RvT1pWAX7`tCd_Y+>_DMUG0#|fW>A>6lL?~wh zN<1ueQ&D|l-%A|W`z3yk?ZPYWFBiofh62_Q)%Mmq1 z`Hv`R`M_o+ivuKetfS7bf-~9My#0rmp|3%Oh^9^BG%jXk3)A2OeCUcod&=2z1;%Rr znBJ%@w9qEWrEOL?8)yW?sd@d~hSU-r*y!znt)Rx_4IT1;Ttoy|S;dDYH}qNd^sk33 zE;ENb{wIMy98n#)ub$NQowFHPo1t$)Z16s3Jn(vUqu-eO++(au%`qjnAdvFox-jWJ zVcxMeLWjh#W7DjR@xOeFR%@oU6*n75A-oGhsJ*M;PR5+15^-)ODlE1~RD^+ca#Te8 zqwCMS>9?-GH5=93ywAr<8uqPjdy1S7kF?X}pbpke+qN5W^=6jxW;7a#5fu)x{oXia>J9%QxGX+i>TSmo>d<|rh;TLvt35o=<4l0nV0Et@ z$kT~J5xF&?>9U=`tX}JlU;$saDLq}85A`oj@S`!9BucDo?$~KsNoDN?E3ovks(&nj zWuZH|9SG?~6r7@{O&{9o=GT#nrF6UDv|a^w)VfE&LX0}#b`ts*dy{ZU5~_MP22%0) z8h<#@8N!an?b@G9PLt!$(w5G@=AQ{5GEzF$ag#BIv60Om5kJJd!5IdT`4kKTGN81+NKih5Dv^xu>1)%k+P?XF>{KOB z0`c0hq`7=IqjY6HknivWX$StH98hr7 zC@UP>jM)|2Owa~pJh0W=?0FdnU-U{!y6bNh6ga8bx5SB05e-)C*LXzCmO$C$f$bBxB$Sy|&eh$1mblO(pnjUPvHL zkP8?Tq?uGBMl;DQq5+*Pp>*LRD)GV7qe?Xfn*w9EV3SN50y_r|M2k$Xi2OeJObVk_ zKtb#^$qN`CLiL ztTTj~;zM>!qy#g^2RCYOQ$Spo+?@vC3ad2&W3#?xXa>}2CCTMTt>z?RTz8m8s;SO zV&E|%gt?0tk1F(`Qi;z52H!1O3vJKOpiiU-V44rvN_VU$VF4YeUMOfC49LvR?a_t{ zqMFuju9FnEy>t*cp{Wx)q3JQ=U!G%f!|yhVu4?MDPA0gCxJMImOpP0?<7TNY2D58> zhjAnBfY1iJsFyLE{#cWG z?dEtGo0qvQK3Vxy8n>LL9c_vFh()UvlEpmZ=8Zcnc2+~-ROe#=ZaQqxk$t1z!L%uc zk(tS&Ncy#DGZ<4uaH1PL?Re(_jdduw21iSl zmlL?G&=wg-<(g;(e2z+xT(|6CuTle}6R7*~3yF=%jX|(D2Q}%#ONKUA(3wADMhp4@ zNu5g%YMqO2emReT9tZ~uaiq9+o`w`w7A_Grlb7aNC<|2f8j*rHjQVSEl>lncr2@Ji z;_IQu$z0I$!N<_)k`Wj&?4!%-Z}!24;qbnk`$?1#`KV|m65F+;eh~x7UYPIg2pl!hsZ0Wg>Y}x zBF87A_h>K()dRo?%1R>!q3}o)dGIOkv=F?L9nEStI;pYTtz~S|8unG`GHwg8V8IXf001^Y!cuIz&<`$wC_3 z+Fy|>lSHT|(PoBt>Tckb5NYm5EYxKu5#Dl91b9%jm%jgM{N4{_Ct1-`&Qf2tkg#v~ z>7?mLzzH9+TzElr)Oc@n5w_Do{5mBwF_~~dXL*iCKKIE~jfIGz*OIr00zUkAK(q=K z(@)p|-WWY$iaMeggD}hSY43II>=1h+SqC;IBYWNjk>!5{@|j9%kOAs&dz^8%Tv2YA zgs!GjDpqJNC17apf@-p^^p8b?NGs=Te;_04yl>#OlgGorNNTUnjm`Qb&zRj?6VR3K zxs5uxP^p$TYgDR8Z7PNe1FQzqDleVbk48DJUBQcb7ZaKcfT~=?c7mmpX^OG zIFGDKo>MQQqQO7gb^Z}4xqJRL8(+gVBEQUD6I98l%O`wjHe=Sjbxr3ZYE!h6#@v7! zUDk7NGveoY*@~P+3*$|2hAU#9%Ah~8D>0uKHsKg-Q_jlayB_hSLm&gilZ&iU#&f7e zlIC9OGNI@w`k}UwzoMH-IF_jQV+JK;3>XqJ>_`~g+Vq#&S7eb8A92bdqSX6zl%7Ikk9hgb2?0`Es1QQ`XHb_4M^PL_#v$FqK zSDcILo;yY-`9-zcTMYBqxiS~n_@y-(gj21^{|N-j z^m4Yr_jn#Nm!aY*x13T+%)(%Xbug}?omYFVAx+!Z=xSY>2X}$IYVt6Gb+h5uG7t;` zINJu!aOQ#h7$T?`WbNsB;0ME`@5X`9wBQ`GoZ7o|+xQlzRpsKG?vu)-Siiog)_itEH>Ic! zYVK+|RGX1ZI@%~nkKi2$Le52d#$|s6|O$QW#W+OgoBET0<8vY76~8T z2RwE!hA#aXF?b=SsGBJF!x0zCD=w=o#!f%wZ(D<*NsA3eW4P5KO5f#Y`P^FbFoG;6wBG5&T;h3# zWuKZU^_T+LU57@Bx!Aq4|7JLdMff;*KEFZ%A2S}UM zXEj^l>MX3UyJ*_5zeM*rF6SjMntLAavXZGLRCMHd9U8E#`f0}OXzzaNLvVW$`Anzy z-M_S_gu^&T&?)KI87r*yh=DuvaCcjq_AbA5>4$8Ik6e-`(0q2aVGDe+f~+=xxZ6ri z5&u3lmsD#w2EvQM|3}wc%1DJ;VXQa}EDs+IEH!D|EA|#UiRqK8R-Z22U6B+l5hghRe=IKxGbZ*_X%9%8VfS}1jRAQ zoVH})AuZSJ<1Ju?l*O)-(+gMsd9vFLNpkp*^4MQ=da^87ZCIt2E7+JHo+FUp9h>Z@ zaOux>;m& z5d?ew3`F^dj1czsCJ$x%ixapcX$io-1-`CEU+h90ql{t?oC65^K;x@kw)c`gDB(R> zZ>R19=i>%J&1jZoIEAfidx&Q1F{#Yibe!JY|t)@O`nUs&Oaxa?= z)(p@>BxYBO^QOkwfTDsKlemz>51nD(C?Fy2+>J+I%+Ypn^t3vxl`HAr^lR^>h6}S-otXsQ(>yz4K5HK zqn#WGT?UtL+Sroi?U;WWqFopZ^ISey+8(jQ8dbx{6e%)SkD`h;xf-FJR0<7Ww5^Fa z2Ug-$QE(DhkPPWkFjyEHUS)N%vf2SW*fSq^ZZ4Bq$O$JRj&g@9pRDu#GoGS&dE3i6V+DcvYtm)4j`{@`wA zRe0jzi(!gjw`xbtI)7Ax32&^GN$IuU(5#5j>@Mu_@bR6#QR8VM*EAU5s0NzW_-cP9 zjYI*OBqxS@&e>ZjJC}>_uNMb_QQ6`2O-G#tM=Up43a_9dD)}1gNLr9|dUT#BMl zH}J{Zj?i?6QquOs9Cj74_%;Hj{kz86OyuQ%wwGQ{Zg!czWsnjeqOd* zg~nl;44FAld>|tReJ8z^fF`Z0g1Ce-UH8dy2sst0I6tt6TmN+&x?#bSoYHar6`^Bf z8>^0biCl{_rCNXXMUi*9?4<$q+?Yner-GF2Pqn*DoaZ)S+ZxqxEQe^8-R*-h1!<&r z@OMkp3z06Qzl#yjDL)J%5Zi&eo2(7qw>br5JEi?m{UpNm^GM0%O;*y{_2iBY6M*Va zeB7UFZ71o@B$lGJ|8;W@9bHi7%++u~qn}uu-~N3JGbQnxmfepMlx@`H#&;TLiS$&V zVE|rON2-&m{>o|cN~)aV-N0=d6GJzs6oJ=W>@l*$gKg#Y*dsHIjN;Jv%CxN(i14zK z{c7^I;w2@e421f0Mq8Xc#ExF?w`j)qTV~0C%LxL~j(EM^ofO$t#@0`y z5Q8VWb(L^uaz>TV=xzcY80@%QO6CabqBYVK2co_ar5*sz6zW}kW6TEZ)4KSX`QR00 zlmeR*=t2g~Z5m|NWPSbU8{U<~%5Pzo8TnA@sq$=xxAsWRWk;6=?t4(_HeJ4|6td3s z1Y_8+afh+pMa`%r^LdWeE^!?P0DbvXRoD%U73VoR8$+$kDrZ8zK;X|ZFcoG z{nUzJ#cVX4K`DHcJmhhrByQ*AP)?LXOU)Dk{SXL?{}!)vel7lyJf0?gsoC0b%21lRUCB~;+Z2z5Sx{(|ZuX)vq?wYqf> z83hL^Y(wOtTLZW(2B}{qg828q^ftJz&1^X(p6Di7B~i-HIfrWsYLy2j20cCPur&AH|4Iz*4w=NkEXx-b>kaJZz~NqZ)-u_i4r<9*kE?YJ25?0s+TLL_NW5=iiw$K^jNJV z3tOoZ>T7`ZNF+g4C5^=tZK9%eSlDa>%Ale!p?)z|$+@6bBjZF=G)~{M?V{@%Un-}5 zgOww&hVzTuT3T3?=JFw9D2~AhOah<>`Vs&NJsLruAl8QQ3sjViS}Y#1Ro)F( z+R$*OG!hV0ug%HZ-yl_k02IKYABG~YVoV6~MZPI@%i`YO<~`EHfpCXBp`N~W#Zr{2 ztNWikEemr*4yF<&5hwOE~jaOXT48+YmSI0UYQ=v7+FGQrL0 z>!md!=B08IG)r0j5-D_seEKK6wFH3r=glxIet?+x8`h~1qEBks`0H5Eg0(`3K`P*~ zO!_84Jm-d65Zhvc06=|&ok5m|9-;0MeqcCCnpDUu)oTvX*r#X%kIJO(Zu*URiFP8Z zH6BsqD{n<)`v>X=D-guqun65Xs6q!PocrV_;Gz`v;7`~B5jZbsY^O`X+iDa{1s|-r zr@hCXxg#*f=J56J-uU%QJa~$cYL%R8}l4(OtAHg4;)+gTV(Q9%0$Z6)( zZ??MUqe`98{KZ}-1%E~0ZG_U6xQld68r8BXsNogTyYjL?ZNOJYTX+w`Ql!cKP|3c; zE~u30!bmB5;*E&-5>qznV5m~$!tRcqB%8`0Zu=%)XJq3*|CN{a<2h8S`!iZ>;^TAP zY45dp67?e}%gQT;GUa^6pm2^%rk95z%gkS&ux4bLtu)A&Xdu%F zLq<%WK@XcSeK#SQ8tLkQU)r!OR2|FSfFr7NmW=Y3#drRS|7snl!tMnaP2Tq}l!Y=< zl2QA5HBrnR0Vpi7<+o>x6}MjC2b~tccCFT-L*8HNIk|i|IRYy#GvZUYFKfqkX@o?` zZfIWire{>583UWStcwy?p#gj0alOIAQ?%dpe0)#jMdppZ3Fkv*@QuHqoOyewV zMp+*wDtRBwpQos}%_ro-1?Wx=o=G5o zTy!f^Q)Ay)JlAtD$wqCn368_%u$NY=p^bb8;>*%c!-((hZV;>zp%JxiIV&hJkqWq2WPbvMvU~6~) zJPM>jBk<=+d0%-skn;j4&dquB`3;46$|jw69i|{KCLl)$ZWbG}(y&XXjXXIDEq3h` z4H-HuOR!?9ep@480<6z)N0fAI7+Y+)nB74x&VX`b)}4UkL`HLygK&_B>&C6*c@@tT z$popY;(3gzpwWQebof4t@Rz0h<;Mm!Xa*~tmtnun@L2E*ufi6`aar%>To~Le3p-9B z5Ta1vj?`{I5G|Eiv50`u2KiTpfU6N$JsMru9Ypzg`d4o~>T~9GL7)|0w9$wJiF4?I z$$A_=Ja5Mr7D}bc{@69LlY4$r@Mq7mz>E_7b@{&y0}t;-h70!loB+&V;F*aI?-T;h zX=NP;d=t!3`3vEUa5xp(eDG#65?d{+e--hX1X{j(h6?Gk>qUYG23?A0o+o9;^RFL{Nb6 z&!8D(Hf7*sU&sEK^Q7huGci%WtPXT5FetDk;vBY zVZYK%9tBefg!!JLU-)6Wt&o8R9;F^-j7z)dyQ@@T<$3nOffR&8-Tv5g^apm@tgL&D zMcFzD5%Z~rkF0;E`3kHA0RTUP$u;_isQ5ul;YXeLd>2>p(A=oT)EAnt`Z7I$Y!!4k zr2U10m{@RMvvDuEYRsZ)`+mbE!Y=eTjY5EMYjaW{b$lk*P15I?uUL(Xxz55PoiRwQ z@XF6_gw^=X`TWK?kg4P)fDCu)$nPW0Z%VLrSl@AnU`0!sjWfb17eU0;RC@NX* zW#}P4%M%Ad>(8}}pt71gbJc8qmPQa1twh7I^G%-2GUE(7Mj+NT3zF`f1TVsNN*N+ zoq~T~?;ot0Tn+Uo?TYb~cZnN4m}(+b%yc6AeMVk}Ft#swe&#SU8I{*~O%;YDfS^AWe<1PxN>1T@E_NYP`qZjy%te)D#-u(w}j z6la*&FI5fP(Sr_TN?39r|1xeOB}hUIy4AvecMrVjDNxh1Gy7{9U033}HBsU_^uN1$ zuXvc-E*UgKLoy~};@qc6jK59@hzfGH3;w@ul7C@twd?Dbb7#dF?S5tTBKh2n*R+4m z!O{z~J&{o}%_z)q1{<6=C$M_|$v$2UkV^H$#Et$={&xrVhmQTu#XlYZB0$1LEErMw z3;jRj@IU_zUK!+$thaOi#_@km;U}*|vO)3ynlhmNb@~6EOt&J)&ucjEWB)PL|HAbD z{ww0o%_?Fs#P?5*{L?3E6p#p%wb=iwMF0EXzjMwD2m>D=md&h(|NEZ#KXd6XPygQ% zOL|vcjIeZ%J^23*ro9G7Bm&8XZ~WcYf0D?b+&n|uvl?vP;CV;*?=|J`PtVXm67|#* z`u7U?*QZ|K&>)GzGj{!bpg$+_-#_s_{xr1Jc!b}z;-8fi!1vS8z(+p*_tE|pOW-|0 zhIYnc2>z$}|I;UtaFC&a^D+FlE$d%X?bZev+T%Bj*Z;hR->u^RNSOaCmj4yYU(N2{ zs@wls%l|sD|I3`%cy&8$Tj`Wp8&5`?o0FWqy<}aU;01)7TsE!dqU@Y!OO(ZPsB@G) zEtssRgFplJKe_5(ZDCCUIsf)H8YcF(+U#b4!TR3lD7osvLE-s`@v1q$3&ZvObs$ne zW$+K&e`_zlduDiEz&e;S51SUApO|>eD4Y60B#FI9YKT-P7vX!SgJ`>9QgOJG@A$kL9mo51b>Om{?*?5^Iw3J zR!@>lSCX!p=*JkKzZjqJ@VK3q#Fk~6VJ>2Vi~DML~a zQr8y=Vzs(^&Ng{+mC|&0nC4uM0v7XaPELJtSX(jYp|HzFa4%>m9n|W#-T?bQ)86${FpG^ zGl_LG;@v^=4_fw1{-U-8|ECnR3m0<-vUW}4+;P9=np_YP&Q$gT1&o?fld}iRD7svw z@Up&@NueYpTg9rhU6@l(hBwWzHI6(u2j;q6eeUycAS(FMx67e-2^O=$R4#~ieBWRp zE4@y7_Sw%hnftV`W_!RlvBEIvFuLBdlZ|FHtr=PPGk+> zjebL->geRw3K^oFo_Aub3K+by#d*V%I)V=9Z43^pGg+T@cFE~&(mP42doTPCVZ5>U zPhBsdMF3gIOMn+yfj_Rcd~x!H8nfu!8ZZ|c7y~la1mjC1kbhaBC{PDk((Lio-LQ*y ztg;%ZJYiXsfiTD7a+6L22^EF;c@Q*^Nfh|zA2f0i2%z)I4^8~hrQlwoEu6BnV3W`% zz5g|ZwE8}-=6<}giOU>B=&cv!nnn zSjI^kOj*i3Kh!=QS7fGGw#`1;#m0Vq59hz2?`;YFw=C5E%!;*Y!~jP?;Y&W_212b75I5{Hc?@WLXrpdJA$yTPv71T9K||33Tc?bYBeJ zIlBuL2AH;|Yi!%aaa+FjYx_9$qnT}RfF31baZ9m;Nxs)?fO}~zH}kuY{6uMyxnpH( z$zr1vPh*ovQ=+vODCg=WDE|*ULnMP=fQKJPChcAs+{&hvSQOzJ;QqjVpBg=y|3H;1wdZ~YiYytRSXYYXSlx4vr za0la7IJq#>mJ%rWyVQ#5G*A8tBllWC^jJm0?iEE+&SA48TaD6jd>})(O8EgL!I~FS zRD-o!Xv6>p2cDT66u2k=+F>X2?pS}Fqsw8zl`rNe$-C4Y#`P()RWGvDS%UWsu9~cY z+uuVT`M)(82m49TRvwvymc0$of&3@$;LGbPn>zM8769iP*{O@E7+2XY0}JO;A@P@` z?MPvJrL#H?W^7hB{-_fcamWR&hPgb`PY#eN-{+4kA*D?>#qICMCr>8J>?hOTA+@r5 zh^cFHAUIHs4=?T*Op!d!$Zkro9#)3*wvgt)trScRc`{;IyMfGy&_Y4e6`W*wbOfDF zIp=1p5y$4cFkmo-7@q?gNbGZWiPyb(ffL3%O@S0JC{@d=FzaNl#U?sZ^v&^}2lX1m z#a)}stUlFKKbM9>`rK3iFjzY9FeR6MPiVe$7tv~*tZ`FZH2vZoJ!MlU0rRii(9dux zAchyT^tvbUM!(C?@g{e)W(vjyA5aoKg(d5W1$PrEWIZ3srN-J&VE|Wn5xGl3c5;Th zGKXui1*|pZdL^iBlklGtpBa!^2S2kmZf;|8)#K08*ITcSP0h5O-OOwc4ZAroV-L0z zRFS;s38&1U*TbZKVh(k4;^*<~-^DDitTo$b{+Y$>Ip7Ry_ffuah7Dpeu!1Y=(s|HB z3@9v|Ub%5JoqK3fJQK|cor8QkWhb@c+julcyC3xY6g|-rSkJFm^FdkBcSO=eGsb#l zVf{g4MbX_&rqBF=!?8t1GYQ5c`J*0gzRPFxdO8_&^>U{?sn#n-JaFHCiOa#Q*DZEJW%HNF=19f`SD3{ z5Q7smA15lVvISPfcq5O8*%U*MhpU3d1MI2W3(S4Di)EviCtl5~7_#qN+^a@nfI;Ur zJtsV>F}>YtG3qo%VY6@6^ORi5V`$QIY|pMsw+C*icaQ2PC8r`e4J;X(&xShYp+|GE zEOo|n+T3P)_)nbM%dA3N2A)Ds{wZ^FR*^SpQiKd1E^zkd2d)#7IZHP^^BkzgqxD`L zN*3mikWp;#_Erygmwf_#n5|Xv^!86I_XQQ1M&rcg)@$Ew%(*n?Zl6{ZUyS-^4tCDN z3V9!DZ=FB6Has8RoSMw}`zy?`dPR@!=HH+^U4F}0ooU+34`(dqTxxFdQ)aSXx zK}CpMo0uAcm=e+8RnXQ#rx_x32_@llv!YxyOZ%-5QNj#Nwv|i0`u>cdWWI6LmExN) zeWeZ4ZfQZI#kg;&xg!^|Xw;nYV(8Uu;rraoZ^ZMT%m9k!Q(F@k)k7Yi#wA+r`mG*T z%5M~t&`edlUI)|?%v&6dx^lTbvgemo{%jN5u6 zK0NuUr*_{z6wjkcVF;C4c>!NNs=Ur5(MGt{;}aNh1a3vSyp%%W;{rc570ujw`I{3< z8(|6hlTCY7$D7S7*Pn{U54wE3>3DJu`Ly6f=DG}4(ntu8TsWI}MxvtQib^k$G|6#q zGQXo*rP->~rm{0_xtuu`0Vj=TsDi=uB0e?cA-onmQea2-{?Rto!|kbuCeFZeNl^a6 zv(PJ|4N>#ndbP%Ah{XKPEJaTKK%wY@=`yVh)O6!n=j&*vpBKv`n~5Xb>A19Nf5@Y7 zBXO78xBy4g@sP+-$d-93ZC-L`>i_bZPoW1 zKgi`}wz8jZwNgB=bl4gPE+(%^wBB#k_)D2yUDVtkOGO17#AQB^WEXnsG374?A>FUH z-37~M??q^5Q%vzB7vNr94(ly`ZqO6RwVN=XOC-J;J{)hVX>1yQ5pPxCl8w)7FPnOr zNmqLDm)?fVwoLdk14Jr^K^C~R+O+=uBA4%?=q^lm`;}MW9lZLCuka_``hwWVixpk! z<%7uwl%2R^U&)usmK?AA<08EAV`&Zna2f{aC8kf8*iRd!huHXE3hUy`=B35D7VlSw zsi`LNq3}}+O9U|;ZrJ;r-KE~;lye*_rzHuS#mp}n*>oY>NLR2#>sT{tP>c)bgAu*Fj?-h>;q_EE;%K}+<1 z;C%QQL~Oe{#FC($e$bGc;;9lcJ#LehAN%n+aI?9~GH&lA4Vk0MF*J4*NAHwA#!Uzk zjJWsjZi>Q$L(kv}C~ST(+7e%5|T ziksOpkuNytP0(Z<4O#bWP>gAu25;Pf1k)6j-g|b{($!{8_Jr)*z&T+qZBg>6Mlz4!N7@%f6u3+w_AEN3scupVVYrzteTC47G$6|Y` zQb@dc4?0S(Sa^PJw9r1qH6|l-5$$?#%F&>xv3VpaDfbPc_ZwC;@zC{{SkC;>*=qBh z+aRNhoCvXJ7G<-h!b+~*bJOI+76u|B@#y=esy#S8=i>YNO#j+8OSl3Eq4y(Q?x}AS zt(JTTJsYX4`2RolzB(+*uG{+&#Q-T0QCg8MX=xM`>6)P%>Fx$cB}4&1h8Rk~fnn$v zx+InEhLP@Os3E=^-uJxU^__F{Ip@#wUFQ$I5bquLUTd$t)^D%%yZ0n`TP;n0f;343 zn7|IO`YBNhBd+5s9mT%mCLHme@ZGyy`0C%6vW%egi&l~Q<^FkOJ0D%`UBa8O;^hbE zz1!)xq|GcaL(_id@v;#cC*5o1C2FLHtnQ^DJdUhj8&sAOrhMJ!B}WB$?YprmrcU;E z%Qe36*x1?K#p<;34WY9klR^J2=O%77t~%AE{3O!Cu-&g>a|0uf;3*3nRQX%w@ilhr zS5@5@J&0XBo@jT|n9Lm8sgn3n=ZwH$ z!m3kNs{Fp#9Eswn4vBOK{6S+%$RVCL(oVupWxiSMV3G!S8+aZEyALgIn3bAsh&nuH z602rc6jMB6w4sw5_R!cqpkP%C#7)d;pN}`{e@tq-Q)iEjbtPCHee$Z}mMj_UGw6_w zFI;ypYpayQM}`h*W?v|h{h_{TI;@><=UEx?D_Bg9zib6bOn?i4((CZyg(%rPvRCe6 z{T(YJG~hNB*?Vt9zi!@4i0xMdybodCz;t;TM+boHl* zS|0YfitxhxlF59;*@oww@YD0A?pWo#g~BP4&1|NPNoZCIllq%3Wz3z43F}AmGLs*Yg>m%0-a{V(hf|?BqjPQ6Ld{nf0^D4EdPS&~i zzTg3{0Vrab9hQ!QO*y45U!WAsz?io`gZ0|xalur=1`q^8Xz*%le@g0){cFU zsTZtn`tF!k=Ab5BGoVa8ID0j^ui_&QXN{iJ>FnlFn0ek!F*f#i3$Q8WA0mn@l@%*mVK>KjmLhQr zPkNoL{})TUXkL0gp1-)vFu_VL-|oYnTPdtlT*GZ|o4uP=so|;kKDbN=aQGv3KaZws z;1=ndNNL2(3{A;WYU?l=TV_=&LyM=!ZUeqJbkgt3&SZ?tUN@VV4AGe_(z&kh*Jidb z!b32>|7rwOxbc42FgHWpkN0&AHi+_WmbR_nI>QKyL6RR^mcvg`Ewok?{NA6Oz2VDC zOgAu7=NT-UsX_4diNy#0r93Vm$JYAVZ2?YZ(A_l{}5wVB~ep|CHMZpxPW>N~2 z16R#~_#w>O-QkrihRJJe*x~ET(9$AVh|4 zCCiObp_yB$$e_J9Tf<v2c@*&;nL*fWxg+tO(*udj^qA}DA5~~jV$mn3s(=Gz% z?~hoXKknxkOnE-(<&Y!_&kS(wD0NNo*tLux4hhv@HCRu(rEqwbb3)=Wr@_RkR?vWn zJ*9ylh8M&5QrQ+?nBPtY`1VF(>hT4#hgLskEY}in*8N5O8u?B14l-)SCm;!cQSg#S z3nDXaXx4sPT?4yyd`EV+^X1g9hhEjcJ+Mo8Z>dO<^HIV0$pp5;Rgt-r12x=KWEInI zS~Qxo)sXB)Av$Q^|0HaUgcma));O7M8IM%MXX@%_%X|2Bnst&-9a0ak6Fd-N5GUq0 zYT^?U_W4$M+~~&1b>J055ngEuSqP`RKSnaa(`^dzq7keTjmQWS`<6+HMLCYR#u9f) zilOWw7UhVQbrS-ttgPcePf$DWgU&^ffoCAyyp&Z$*PcD!c-{MnuUo{*4I5IYCBEKf zZHhYO-2$ySvW%|FvBFpNu=@b-En%`LQdD14;w_eTkTt=c z^|abS!a5lew&3$~cC@t2zRM>c+j|d!APqkI20MohB`)6>&p7XQc56Fv-l{nW5}SMN zU=@?sE+{`dC{em!S}HjZ>EU|*7GwPIp^pRPz^|5HTY_e)wc0Hx9>?yjL^t5joh;y{ zxw<>}S)5oB)bJ2{;_WX~I{gX*>+H!P#Gy9n$4TTiI{wMWlo5g&;@`+U-s31fFsyrV zBxpb*>ZYt6NpotqwE1K2EMsQqZa{OcoS1F_NcYkE7M!Hl5yz1mCoh*M+;jAi^9~gO z2iLm_&mI$-4I2H~gn#9@s!EWNr31t&#U~DLA&9$TJ0C%20vhj-xk3PxC6Ofs%>>z% zvayORwcKLCw5~&#G4lOf7VbzQHGcMlOrvuY8Pi^406rOgd~(WE`OGK_^gKg}j0cLS zws&2Z%^h`YShf6kK>CmP`xDQT>2aN$haOddPrg+sM_WdpmwhdbwQ+3VAf89M- zS?2=Lfc)CC>+zuqHVQ8?b}5+VNyH!c7^ce7TxWHD&uP@2CJURsSAxgiYwI#OOEtVs z^Eu=$Rk7=X;?9Nl7oU)0q6S>dgX4 z+Ss*yDtr}i=&g2p|o z{_ovxdyY^u74`lcA0jvTEbuWy#qsumOU?PTdDqx}g9%v;slUIJg}G2g&Q#k*zsza= znyJ4*&R$D^YtZ#KC3o3 zINM38x6i^3dV5YSwU}X6I(Ynd8)LR9Pa0FK8=(5GzxYXOkGr?Fz~}iygRxw%dh^Nz ztaJm-9+}5?(Ms@v{Z3r=*ZII%a<<{-%XP`*2`kzutCE4c$G4;d?TK{%a3%J+8pjD= z8pHD}(~IC)=2#a6_{CJgqBFg8ANZ~AOfU_QLP|{sI1tA>O z6$F-MBj@al0TiAx0N}IW^t06ISUnK~aeLO6fkQ3$xM>}m9sc0-=KMf{sLz4`&fh>~ z{Mq~(W2uCYep&u4u-i=x%oG_V`U@d9Ly_os>pmzaKC@8S9^Y-a9ISE}6=XQAs@>c- zcHsXZ>kMQ&+FxKrBvNDl{P8~g98gC7R9YX&g|8YDPrz*YY_x$v51v>RCLe!?rc$4A zkP^e}kXF#(P0UT@QHtg*y8*y?K59EDI?BSB-zupORUuhe&{ni5$m&DU-9o&M0(vodK8sRrM-mVBmsI@9kff1tYI;1@=r+OmhebvM}(adRj6z2utgVJ;>uDru1NKU%r~!6qd0`p zk;$oalIY65hiZSO$J&stMVP^)tCY--WfR3ttWQn(jG*!N1Oq9?)nrQV)n?pX%u7eB zN=d}e+v-O*Cb7R9UZ1XhJ4c8rVq2OCT%H!Gf4mpH^v3MvG#PXy(XTrt9ir$fbFC^{ zz&I7hLW|jRqNsOq%)w@5#D-md3vAVo&t)@Qc$c)2$M_q~DIex#07GWb@D=rCt4MgC zdJ8J!&VW_`1LD+sFZoemnqrG-a=eR&%MbP}O{16rk%^Ju0ht4KSdKx4Fv#^eF@>qh8ifF3T2$S`Th9JK0MVbEiNY}M|8ouw@)Txb8 zx7@@;8`+m*?Z*zK^l_(m3k2-`4TrBb$7QU3_xyp>LYz^rn{lx-fznf)>;G_b%Yu@u zk=dUvVnLD^WKpR{eo>Uz@s-?4Hl~ptengagjJprNua%&mUPdHothT=~+x$G2%CN;k zpk`VdkBi;|ahU`75e%_^C((FKAdP^lyn7hL#Objme%iZwXuTk-dHQU&)u6!P0 zf5tq*c)GIfeYoHswz)397FjW=IbyX#915hnS3oJx5T4TwR;q>Om(;_^qx!-%jwX zq6)H*6=WSM?q4ij=P!6S1n*jFX)eEM4H*R+>bwl~x{cqM)gkW5;K!IJP`5l|0q3A?CqH_n`C&L|Gd;2x)F&p2tTo) z9dmh}aPIkhFiB*^=FEjhYOx%!q~5Fx9)>JC=XHk=&4SH(fCWBjZ>xw8b9;b^yM5cv zKUYIUJcjesIkeW_O~%bZ)cv(Z(uSV-!o68?2;%-bfhv)Rtq=>N2HtN)kvl

a&ZUW7dC-S2lGy?iI?=1N3Z^JUeB&w#qJ%Y(i!&x}idBu3WD>cTjPfYFjQjtc_ zzIGc7|8V-)_*N-n?!{rBcSb}g0Y1NbB&s38s<>8bQ9?wYw1M@tP&RXgMpdN=On^N6 z6VHTMT}Vt#gg|vq)C!+HuX8@lJsNlC6m?I^vf6i8(PXd;U1NHZ&5L}a#Z&^Iy2Nn1 zHCrxj(Snt)B+g$J2Uukpx$Y0bQY0!1)xO9-$#$aYoFCt{uQ)?j(OM2~oC@pN>HBk5GhwMb zYK|yRE7z#0Lmb2FZmfEts@nN{UMy|)O1}D8`ySm>jm0F@X5d9@@8{LC`;d1;2P*%> z=o?j2+r(NQ=|aB?2$jLwRIgTELt_Q4OB2jak_k9w$)5`5kU0G3_woP8_X3htLM-Uy zc;v@9bOW{=EFHRqz|1O?2K!<4Fw8iJ~snCqqXC; zKMbeuiw-cI-SORj2RX>79O&nbuyXn3cRK*6%zJ45v2q75Li(lxC`V9!LTo{ACeJ?} zk)GEYS#<)y(|NcG2+7Dl-Qs2wvRvSlYXbp4n=+AL54@G|`kY7FYaRnIy z2*X=&e{^a32xy+=7A0Rd`#S-K^4l=we6(Nj#yADd428dDD&ETjLJ_Vh2f*;H`L(>S z4qca5hFkqyiH-JA-79w8lquqzUJ%c`c0KKpX#WtKTZ)AXj_P=`OI&=JT4}g zd@6GIj;DQl&~fQKs~?lA4I)oA@ibzrJ!4EgI^0W+{hMqV)yCQ5$?=4i=V-)^`@t~` z(`)49)~h$A^+gPJTdyM}_!BK0(x2j{HJC4pWW2*3EO|IYFNaa5K2h~cFe1w~W%V;D zY|EL>FHmYgzYqRIXmvDUXesl=!>wY6JPfS;UCNtRC94gT4lCQbH`t2M1(MPE2jMYs zD{A|a14hNsQ`d^4lQCvQNrByiV^Ma0yc_hoHbWV*BjVPVlaj%@sJ7{--rPm%?HsR6 zJEq0dy_WXyR5;FCIVScN)B2%($1%ZdXldO#x%zIMhT8ZhnPw;a+11JojlNk)0) z%qK$Rm}vhP1?r@YO_Q&}J-8-#GMF{Qz9ZycMr+&CMu4N5d(9TJ%yCnCQ1eB+xB)&j znPP`+5o5gBT+6VgR46O)Jhy*#emfc>9|v4p_q$<_xBgPuU&1xFs(}zl!9v0Kip@w( zcG8>IwH3@_M(G#c``vGdo#!3Q3mVJThsS?ykar?r)ykll_#{yM%R6G=;wlpCUQnV@ zpxYf5NAVd<<_dyOSp^F%8hKT08<6fcG*gXCsDsK4QLU<)vieNG& z-h84}MU$j#A|=)nw_k_C)_U2iRNmvre!I*u`?$oc_i^Wl5q`nzaPHL3tW;~y(hbw? z(!m4zdtWTqW)F2gg0bJ*IaataJCuXKhY3^@DJyus)ZnOj22Vi{lJLhiKCMOGVs%*z z9t3tLt%h@6T3DxX@#CK|!W1_d;ECx509u%jys-Z{^}0my7z8-x)%pEQb7Z#$AkP*|Z<*XuC{`33JTmHuVgCoI#DrT@^u=u0*Se$k$dWRt1V6FVFjby8zQs@2lS?$7b zRf#JR?!7^80MIa#uB&w(CgxN`7IdJ;c67Lew%CiQVe7c{VM#mYOU3JNQKoYmL)0iqs7G zHbk<0h~Npo&cjh3JEOe7sWB|43iDap1klWt0~)o+EDaO~@oir0P3ge$k>~$6r}*Fh z1eqgyr3Vzp6X?2_0i}WIg!E? z&t)Gh_nx!}R%3faNZEhDkg<5Jz-Gn+(uejs1?2a%{V_I#fvk_fIo$16#I5uR3-XiE z1)x}dCAdjV*89CU)EzY1odbW;V+;W_O1GKXVgVfw6tZ&tk0ZKbID)XS*?&AB+VX+7l9(`TeE-|eC_RyN4~ z)63%!-~&J#5W(iz@@@2L`wq^8Nk!RO1E$2HIqaa}L1Wub_rY@kMY^^SC# z;Iqd80s@D~zFqu#tDW@UslzB!C8PHulgljv-L(^3H#0>xsj}BxR!Y{Pi=aKM%F+)s z`y#g3brmc|(f!oCF!>w6hGHy!j2}XSb2>?gs86lE!~R1Ppn{2 z0cadYeh$}%hmx@*+TpqUgYSNBtbVq&ZLDuaqQ`bAP7lK!vSZIT)4o7i{j3Aq+-dOz ze$epBd%))HCy{RO{c0VrFTn|(n=;7L#vy#y1e*d~fj_!3-!AHTOUt4z@@^B- zWEkoA8fb`lp1VlrEFAv*+DDxa+*2oFieOQOIn@s# zhPE=?HTU@e-6>f8xeTjjJc->tW4U`b-t6pHIwi!J=;vNf)L?TP!FwV1xcb(l{d$?b zXB21}((CcoMDNP4z1BHWkg-|x%1)y~uY29vix;yj-?4v?*M6*ruutlXj!8!H?e?>O z*EtXM4p;4Bcw)~dF}dlscfbwfKCw#!I9CZ1+}1e=1WcO7t?5GQKa&RB2Eu&XqS_1o<{_k7h|M~O!g7@ir&aI^xV1Q2Bk z-&HEb`#po#!iEwUcBgJ_I9NC4uJq-_YA$_12R{cx#CdAPwT}dYhLO(r0!QN>t5Yuk zvgQ0~6UBs-%ri`YB6xZ9ZS&a7y=uJMme^$hO8kZPKwp6a*@!w#%kPVm^K1BY@(g^SH-j3!~VbOh{ zbfck(hnT@m@JjRe`jzIK?Xha-s9R9SZT&pC0w@ei#|{31%+B0 zm?7$o_S+PuA7)Cjop(3t%7M1BlVbGuOWnpwcDPTygUz%B&*3NLKFpC$r_!uO1weEmkvGeC`YJu4ao0eNxwx_NGh4aFi zGHmXDKxh8Ku_(P1YQUvXF%V|n05q1t{6Xf-QeG2HNR+afM*>nocRiCxb2%eEX5MwJ zRd?H8IqSNzKF!qkukm9~({&mfSc&83ks7dhWKlzcy;sNkfFa#RiAI!rC-HnlF}Sjg zDm{!rT`~7_Ott7+;M2k-M}t|Zp1-X>;E)jvR=^0osHe(%*k!dg;y%p6bROXBz%os#S`{cfqxmNBMAR^kGD^_x7aZudLvVt`s;VOna#Q z*NxKXtR=YfsD?wf#KhuCY9+=84SLxsxw@5d=AwB%EFx@_8y)=*M4W_8nt#t(VZ6;? za0Okv_~5?W`jm{|C+gf(&9R0!CZepp(LvU6<5Q7t_8a5p39!%VnPldp)soOGgN&7a zu~MXRRD03eNky_8uOU{g>0$4Ix=(2Qgp$Qq_2RAo38?1YWP<$@`7^g$>$h#Gk0f8T z%a?H6e)?k6kT!es>{Lc)uW9qGOXuM+@Y(ypc?j>(hd-pA-FytcRHNJrHIiTivVj=Z zyv>39sqvUrmnwnSuWvNV>5o}o40`+ZJ{PkvH-8+LQH%o>cc74NS-!X9=V*pro=o5kUW7SIfiO<*qVa{h&IeG!pQb!biEPb!sbWI5D``Yuc_9=j~Ek07(6(+3`yND!w z*3vu+iI z4Z8Ic{UPUuj`)I=q%g`>TjGKp;$Bs;$-OuP-@`;%&WBXvAblLw;~c#&tsJhP_DJWw zlb{=}+N5=VVRUHh52@wBPxA8Za0ndQ@$LK8I>m=gAxRH1bd<9IX59SHR}fOlfR|Nw z6W2?AjdOfdU_cT~gN06R6w7q*gWo&9TVJCzpy`vGt*D<~u2hJvQ&*ox4uHzr3W$un zHpkU7#xprxDm?lo8e;iY@Y*}Ehi;0=FvUS^HWu5>dj&4o7%+68?!bq4Z9CjyoYQ7Di^ zrB8+Y4@Sj^d@os{#R}yN>s=lKHf9%zk@DfH=TMKpWR+k)#Y4+1df&UkQ+qMRcfd=D z6TL2=C$qwC>vzW%(PLFk6^x=<6t%otUD>ct7IdA7aYB0C=U4^(A+a9WC5yo!x5}f9 zM+ev>e%S=ga3aI8Zc&@Ehyo6_`)geji;rAVup^r;sJ4{E>`|NQ?1*OJYXd94WcX58 zl=0P@vkSBu^9w`{Q+>y3%~S0I`owO}JCNAm2c+!B`p_YP5}F!4O*d3o_`V;quTrPM zWufH##Etg7>gQ4F8*HGdCuMRjXJ1TdLw0UR%fQ}PHf{DEdnLS?eM#zA;&(%flO-b| zx0aSWi6H6km>2-!C!l)dPUxl+P)?7rt30r5pj14#W2`YXlR|AYa-{!oWG^~_1QOK6~BZjZ)?BQ>z>y{Cy?dW zD)Y|0nn8A)RHQUF@ob2jDZA&_a2EG_Mx5xOyKtHvzf!}x0I#GrLfmknfG+Dl8d zT)W5Jtg4vFZ&qvHtSDl~yQ_IqQLuNc0fkx-broo#SF_0#feabK(Jt)yNKHui_1iRA zoBp$MNft5UCu_=^D;4}^oW^C6t3fIM)aF5pHlJIP=U@U_F|b5Ax8|b9LGXKI$-%mF z&7oFdTSpW)(%>T8Z5Jb+A1d;~u60|OY)Dy#N9JXpRaBS8h9}e&@|xWfH%&MZS^lIJB1z!a)^DF(dvMS(fc+Trv$iKy z>{Yskcz-UTzqFV?>K0M>0U?q1(^r0-J8vZh*wh!BCmZbWege_NzD??pLfwpeZ;ap7 zmiT%!^)`X@Pv77v`&y|o-4+6L$KaTv%OJ0>g&rDp>_Rd;+AH*@6XT*Va|EdG8+~yH z3zWl})Fh?HZ?&w`C)Rm(3)JlylAXYTudKV+rj=+aYPXwt(l&3C+iKyK=50 zUhYj|qwiW*zhfD*EY!cJv=~(Tf8UhQQ`w6OI@spYTsR$510b97>rfL~jgi{pE0bq? z_cnieQdgLK8sbbsCP#8LJG-L{4EZz<>_+TH$ve$q=5t(wO%Hp)&13(l&I`+!Jr+n; zXwIz=1g-8HyHGtO0m_f)74Fcy-liE_t#JG_I~dq%(dKs|2PNwOpP3&RCA-`t4brIr z3B?B}g#^0zlIr*ZuF74(gCoaP7T=Uf!NP-7W6oOYRoDKc7bJB)4V$K@A%zF|4A_SJ z<~qKmmMGcKo$Md(&W+>4i<955Q?5kMgSx+C_Tn~efe7&E(-QF?lBF(#>PJAeaOgME zbJJ^SGY(W<*U%~aK220I{F#LZcdffZmKrz=uG)IpR+{IO;fld@LOFZlH@}wV7-lXS zvV*-y$v!&Yi0CDj;`GmVbU6d$VQ~bW}81#u$sZZRvfU zGj{kUNNkDb?I(R);mz%J867`~HR_$etjmEZ+V*Q}`eL*<%g3jJb@q z;2VI;*xdT_@`0aBD!G~+YQFgE^4szFc8YHKb1pNXf5M6`c0;}V8_DQc1rs2`mixq; zei@S{vf!9k)PLt}7m%yL99BM`k6SUW{=1I;g1o|Mtkq1f6kd+P|3*mt2sNjbgR7Jj zb$0wAI_i<#3D`TQ%HhkIa3W8>z=QZ_mo@8Mz7YEH63-dY+*~IExt7lrtexF%G)8~) zmoLlGjYxlBe>$y?`Kdivlv_@+yWvHt34zV_P1nhe`iTIP3}3FM0JK-M4=%}-qU66? z%TySQd#fZ>$)%iiuX_9L+DG6k^uNnC>~kacqB0l!J9|rKMB+I;?54AAo7<-b@1OyF zDC%i)>o-{Sz6Su7j&$*>>tHmO!Kjv(eRfqd|qKk;{_iyFA%Qe8~saFeCKPuBNgJx1cD+Xd^yByo^j#)^tR3lKH<87vV1 zeZ8`V)O2_By*J56s)WTRi>tx&mDFFV$vZmz2i3V;z5n|cu?-|NLOILmL%#oVwbp@R zz!c8elYf$Cyz@xsUAqZE@U8`M>jSFtl>--sCv8TQ{Ov}7fPt6@YM%YUpOXA8HKyzJ z1qWOH>Dl|UooU&@!K9y>&c|J1%{iYA;PN6X$N3&|FteSUv1@5L6tT912AER?aukWzkBjuqgpy#Finh8FM9v&JN(_^1nOhe+}CI59iF``PyVa$bdyM(^dpG1yPMr_j?5`?cGk6Yu!qK+CX>O+kzQXdpNP>Ef>{ge>#(Bz55M9yRB+ot%lZFb)Asy|p>Q!-wE zd-Z1!z4pkqkvsR=YlXyHPG-ul?f2f+BxHqeCnGoVjy1+5kX6~)$W<(B0Tw%ZbmWb9 zOoSFyro;z4fbAI=#TA@uH;L&a-~9E5A0XAYZc5MFHFw7T>8XF~K=OZX-|SBhvJKI; zvq$m&rFFT2BXoy2q^;K^f%V^B{!a@8aVK|tZBUh8a702U`Bf2jO5!}BucP)X_yDzh zTk+$cnqI*PBRL$*mtb)#@g6)4TXqchAqjz*8g-HaqN|^{c~iPGEL-E&p9J|M1@Jr0 zh9*8;JoOb97YK_SRd0Xz)2I+H7CK^nuGr46mu)7m0Unjzi_YLbwlN2Eg8N^txASJHTk-JAq{(3#gL0O3+ccp zzIyzojDKuHb|G~q@TW_uJ2L^YsbUZ`{-Xt0cqK_^9d5)gf4Q_7fIRuBIn4g3X>?Bt zf!Q<(OkJuYB zND>0;;au<|Z1Mcb^5CYpeZ`=X!^^CT$q6s2rh^H zVWHzdzji4No5J=sKPCt=aV#=GeqOWJEug!{SWKM)6sCW+Z56SQVO84M)>>n14faK6` z+Qk?V^lCBxiwW~ecypPc-3*SZV)`)mrK%zTT?e!4T}a?JtI<&-xgA%X+U?NcC*%Di zw?1v0TwwiB6oQ!WUsp)HXryzYyHJfrt=}Ii>s&@2h<(FZ^X`K9Drtb9%m;%}z8o(k-CnLMD4 zM)tr4SQye=Z3I>ebHvDA9xslul4HAEwXaUVFT;w5NdGW__ma^L&*%XiT1jUo2Gh#q zUZ}X_JD^vJ+j%0tm7-)9@PzXju4T_2ZraLKj{gZw7fk7pj?1TqRp*!pr&ih%*&N-2 zdUj1m<~+j+3aP@UF;g|7r+e}Ez~(qc;7Jd*s$MQ*j}h>T>+e>7FNM!8kkK1y*Jm4a zEoQ<5(P8-K&SECoIEr=m{4i&SLqTENxo+8}qYd7V3_pIM^qFO%SF{f}@^sDB5uPQ) zTU2go$-E(lsXJ)cUh=nGu!B+@?WraDZTj9;gyyi`ZtlBL`@lw{tElclcXc5du-vo% z&E+;H4XN}$TR+@Xru|67$iMb!(ZK&9P0|a?tjZ&KC)e4or(!#fr4KW_Z=~TZDmArO z$jE4l?G$=YQ|`BB*=4tiC-3`Bw_&&Iy7fP3d3yNLA zhwD59b{XV4aE$Ta*Yo)8wuL0(ckmIrVQS7sT(=aUQ5iA^@&{jIy)H+LYD{rLnh$t!YXP^=cKV3y9uSW)u zkRSV)VpoUNJlfMYK>?y8ZxfVmNh@OP5bHIPAUh?w3mYK$5is1Sk+=5=f4d<73Ptm~ zA(h9wBPB;Fdenu>TH~aC%5JSYUjs;~&RECgU1>mI}Z@2OM#wY0Nkpdj2UyPRINsjbz$ zX<7`OxD{7goV8XPSwtPN8Ky2mlNUl{@G<*cpjOE@`k2WI#E$RYN{f-+dEGni5=$#r z*Vk`f1b#2~wtI39zSv&WEwc(o2eQ$&a!Dw({(y>qoRK%IlGs?+6L&T|;y0sP>E~;A$(K?==FZ48qZ+L2|mkJudXNoDMtnxJ3TohgEPP*$pw5OcuX0;UM=Y>KK!X5-T zm!FNQoa~JB7jD+fc(aFE5Ym2d@DmJWnF~yluprL%V6x4F>x=sMs)2L%cjn4X>C-U+L+yx91%p%|7_jZT|H-kEa z!dGJ7&Re`Ira+^WO=6PvK5ZMm`UOH+M>FW)&Gcb7HwqBF?l zD`&!n1<-eptcfBdlqq6Kc&;tI>VAdJk4fFQsYwoAZ-!?4>nvUpG6 z`q4!xi{YnsqQX%}@yzw0a!297RHaYvQ~SE)xei(@!RocIIO ze|-FV_hwGnXbghby~^^R}WMAT2$j15bxi&tP%55 zgixq&+TyLRu?4!T(Kk;<8%*3eaQ`Mb@C$l~B@Le8LQ~x$%AF*U7(eJ#Q-+GO8t1Mg zrCJk7kx_P(4r4%uq7|j|c!F~JlRKuPNl=h#sX^hdO2w+#8woTY%&ZP_SIMWs-c^Nv zT5BUKWUI*UE)VFb<8`k!P>A7(c*k^XswjMqi>Jyxj6m8Avk}G-kssRJ?8Kq3Bm5}e z`L>Dm>|mro-)djxXLsCHnkljzdg@3|R_e&7lK|_ZYjX=17cqbB$IJ`s+%p4s2OPDM zK{CH{j)*NURfeguaPBAy;0*?ph5_ejrwP4jq79Gq^qi$Q(=l|F`nx5 z{wR#o3TkQzp_85JxtNvgxtu=J=<14A?(g+u;fp4CWG8V_){B}`upJZdR+!prP-%`S zUMJgRI%8L^GQh-o)U*xhRv0@_P3}8_2OBC%bcc$YCyO4nY>0wyiGpvmzNAD{M=Xu* zY8GM&t7HtJ0py(DddBjmzmAWX?&hVeE4R)ku|TQEJt`n9oY&Ga{z7h}Btc;+p_k_0 z=ED3BdEY1az4@QS&7cga{OnFYW-u0p;9Y+_AXrV=3wjmH`Y;_z*+*hG9@@G#C`b$? zxa$V*>E3sGF2U`|kwjO7uJmGet zvmT!Q!eSZYUfSl5M;jA?(ycmbe!8`Oqs@U0l9`30O4PcYvJvLPQzZkX{J^&T#UVgK z>0ZPlrHie>e0jCZ%pqmfY_c32mVYhHIs;bnRdV2)sKKS7%*F#=ZKdr#`R`v%?Bdnh zHty}!kcZ10NI^}}jCb0C-j{ByMkJ%!)q9Vxr{&dpunSQ8il9WozG|>0QR}*&ta_Y) z*St@LlA?>uTB^EA%W6FWY)|v4x3K}V`ExUeeSRLX5w~&%bV+2CsY7)IrrM}<4}Oti z)AP&jvr?W7P=%~0$dJ-hVJsV*Me^6fnUwEFkabWc2+G!_W2}z=Pv&FafEgev0kyZ6 z?zRfBU2(~qKmXp{wqt)XDG6dICoRO(Z!c-9OVO=Nd~lr@Uyd?ikOl)3wq}dSyUY}? zAZg7g4jp&#L4KNW&FlLuHT_!+!^kYZP&YPA3woY~@fPDCRY)ZpZkoTS z6CEp0D`7ZIg66Gyj?l&Mq)##;G8V!$XdHmY6^1C09FXQozJMqsTAsd@UBG^09&`SrzCQQXY-fKFbA*`wO=&ZJ zbAJwEeisq`OCaO}URaL%DrQ_3MM=V29$$SiG|j_6Zl9O2V*JX~x(OWK}W zg##aff0>u>`)R@xf_QFDjzrZ2&(xE$6)8gV@HNH54bN9GA>+a`M6@gH)S8;N9=-70 zod42WV_jhF&nCDQmOf5X3(x&P143!eM!sz>WyQcAgoKtKccqT(HKt^eci5ktN`eIV)T38F zU6t^DI5Z{b%r`NZ(z@RnJk#(LVIx>~|3>YpNL*Bt?LY}AP+j+))uN=!92~1 zX>M|>4UsRiH^31hUo6n~yOB8RQ#Yj*WkKpd5Ce<5`{=?)*B}La1r!-K@L9g!>@rCo z{Eo-O{O+-cw4P%{ku;0O#%*}?$K!eQUQ4oIFmgI3N4ZK06TU{sf3mWp%heJ?Uw6M& zyGS^B{9y91+fesj9kx@V>D)I}V(Q4Y4P^7kRD=pjE?%bXWSPp5p zA3C!XWPf*t&G7t-)~FEGE~zXiB(CZ~V#ubT#&! zav2rMgQH7yoHDpOtY7*_l|p_@Y~_38WIF4!Z!40ZLQet9yM@Bk<7IWewuTiI+~lMC zE!CCtrKXK%04=iHvKQO{qt_1Q5fKzSY&u(7rOwmz4w#=j?BAqeA?MI%Uk-%~3$zxw z@)l~kL3^tjD!vqMk3xFKM=J9ryoWfs(A{&->8u&8%Z5loDhHb`F{8K}z`O1mMc$75 zt>@VD5{H*iI_$olXSM_(tq|`9iI;YUJ{N5SCcA|(P3?oS#HTL-g>}_F{gz2?l;w_6I65#kT+nZ-S8B$77+Ljco zb?d6cH-3VCY+OUFI#SHGt#F_9MyC(yum_VAK_;&L=K5gqfT0erzj{%4$&huJ}d^RG?G|}N3 zcP%N-6o~g8cD>0$2+=Be8pEki^N}|d9{H&Mg#YevzFye$JG5GYp^_bEqB-eq zp{H;P7fVJ(#_W!{Fj_f)WV~+Igk`RDXS>G9wY9N027nj&jk7MGi>KCs7m}o42h5t0 zAxDeeRX#f;@7*3%5iQE)a<^MbEH4n`pnG!Hg2?`(-=;oW*gUWi zKe-*i9S7MZa8!%0QDt%d_aL7IVPdGu)DiC~Wvt1s3i|DhI)5tK6Zh960VP6HhsK%& zGHU?IBm|KaX3g>ta0;S$E`3zzi;Yxt#B*Z`FWp#e!1+^{zC4!y^ONc86`U0G;iDk&y52X*u92FM7iCuCKqJfp+ z57fVmY$U(x0R4BG=|;K-JVJc8CTjV%n^e#|% zG~pcrND*r5v%kkfNEjukV{K025+s2@LyE|XM~(XVVGj9zqJxaCBXB>82Id6ZN2f~y zNXhz4F#P>j0ZRWCXn>44N}Iog!7!5o#%gt`fPnQMVTytB|5#9=z6=Z|f)`MxS%$hh zun_le{QS{vu;RGI(ScS=73U^G2LLn2@>wq!s<$XAp@^lt+l*ry1e z0u;b8PJvavZ+UmY@I2Xz`+K}#C|3db));N}Rq+2w7@z?6w=uTA-3kn(4%S&6vrVFh zeX6nmkc`5TkavG?o?$Fp0P0_>GeHDQaF}cWMvJjf@*iOakpW~V)3>7F8wkO}0V+j5 z{=O;%X8V|$J`8% zcJ%~Izz>HB1YnZrv&{YxX3!qkO%9Vc!WDCF1J83H{v$JQkBS4LbzO}{K&$|Wo`{#$ z4d2<{${ID0%f-@YU#+nU>+TKc4*VlXWjuhrTXF6b45oz-pmJjFT@&C<-hbFlWikNM z!w`r7FGi36#MrOhT$TA-tYF`)4QnL(6>z}YlPzp0V!(SMMLAr5N8)RBk|Fy7G}Rw8 zCg_FZ&&s5ou^VPywO)bq6Cjj-L=q>j6u{D*zv?RV&3VR57+@YR*g2Be_}3o*Gld$U zmxaU`o2M&-xG)Ua1xJg{%OxIV%T<5WM+rSI&?w^A#m<|9vtCaA+_Qar^kP6qu$y<7cIXE%E6k3{&~% zI;C(z|E=ybo4_G2NpIb{ynIRU4C7z#y!@QQj=>#E`2{8IZNVUTY;x-ip9)I~`NL1< z7Sw0YpMLx0{ufX(@ zhDYV-{SRDiQ4!xjgshNQu>R?RgsUNCWb`Xw@7#n~_+N;1 z$Sg@aiRY5`|9CLX8Raj>%UG|xU)3t+AAyBGXu?203uq`~{b{O{rxLd1`#58tlZgD_ zbG{OkIMvw8hDV0{e;f)QoJM@pa499EY*F)QAO7N-DW3Nicd{Dv`w9PeW*@#mv)flY zHcPgTB7@Cj+w;MIo%r5JeSlH#KV#be`%~RhoN7oZvdD^5Pj)KsQK3%czmB~hmyZZL z{E1KL5AIy8o07MupbVSS_5J|k@dI{)JAa}Uj;WUSmpRX8z=Loz*y3<-t6kQM7>*{74-A;shsH?ge`g|p+lcop?(G?<8e)cR1+kI^fOYx^AZ zBWXCa|4W|#LM26&%<@F{Gll z{nK#uZNDp_#tSl*d}@ahU{ z^f%<$QUJMx7y;!%;>PbMaQMShdAGd7Xs&e0q1RFD%F1ctz{quX%!u_5Y6#$He!b&D zc03j_m=K%F!c9O9o(oLU{#Pb${w*K*%5W*0B)x@yk{FOw!00_p^!XFHgx0T(-XNz2 zEzH_}00fn^^E;pP=s&*41yeL0-)o~sph;{5r_V3ICLm3zy-@u}s{=>zEg%js(^I9; z`u*w^?kPMNxf~rj|2+0Dp?Ae6sms~u`!EGaM}nk-ZV=!m- z7hnXjm%k+AZ~oD}q{v@O_4~IG_u+iWgUKa#{y*~v_^*)LwYl6Li{fI0@v{X5hVq#Y z^CZC^Rk-%n70#Q8gh&l=mr$7oR|xqi@;`}(P|3AFt((ut7li8r3e0v$$|JSGCG8(< zrZ>*Db9rJKqYQhJyi*h=m1{q^v-LX863vCv1DAMgJHrug%-rsaV9 zgo%eyv021DIItFA1Ci<&wz(d{e!VIFDZokaf`wCS?nB8`3}U-tjP2NovjU;O-;T9- zW6@vh=VH6q5Zoz5!Aw85i>z<;sN_*t)36PrX;NK@#`0aHmBb)AiUn=rk1MM@E?e?$ zDqd8O(E7wN-Yd$y_7!O^ifO zTG8s=%KaBkQ;MJm`RiT7pdI4riMP8YX0LjtD$cmiTHm+}<@>3<*!5s>*%u**>65ar z1i9TswY(`(-eJ$KXyM z=CUssHY5HM=Y^=rNq4Ddg|z+vYA*SkTmo09eZslXiRe+K6XlcNL|~8rrO~~!MDvbC zCG}cvq1@aGSj$*a)XhGrx24#-bp^D6R}$4Vbz;=hyc_v|(1LAox4rvFn0GZm72BsC#iB5h&1Kvini@^DEX zXsA=@E;dO#{?g-D!gDaM>hdGjz>&k3Jc^1Zm3N!r_3@LQN^I^nV$)HZT1}4Ta`7-ReUxo?Kl(hvnPa8WEng=2O<$(*RzZ}N zSlfx3k5x6ZF2sWOaPV-n$7jjV9Cu^X93Q{qUuJU!_t|c@cyS-I(7#w)Z!l4(iMqL% zP|~$MdOL2APyQM&Mt%!;_;rj2kM1O%n4(8v^5v z2X5V7x?t+PDTDIe#d~I_Y>C!wgSKaf-=5EjGg)rssWb)oFdlM93)9O+=FnitL>Clb zmaim)mJiei=;e_c%x#hq6y}%737GR0-`QWj&)$jMS+Y@-lRv?B#{c8UZX6HyI7+w8 zuU<_AtGPxmO=gF2-z;-kPm!{{2N+?u*DUgR-saY-6rH-<`JWJau<-K3>(1lLrrFpU3p;@p) zeVvFJZJ7WRWOc~A=UGKsyE{i{##QJ(*=S|E_e?M9D^l^scv2Oqd+&}o)s}GkK>))i z1O@Lf$9jYE6}_5nki0%GUTl|+UCEe7{pFbR5BGfTS+dZF>BmOFOa#=vRhJt(136Pp zoaNT$d67{6FbmL7tmrc&qs|p1{xd?}-%Y`1{HvJw<$_^886XNcaxlR*v5yw(S|o%c?tdYpk;4)&ghVns=F#)3*SSOaA72WUpG)L7GM6pUT5^y+AKYuYb4)u zde2l05^Z`ktkE_l$q4~lh!doXweTdMT{uu%nei@&x8F1J=v&hMOE^t?_kmrS&+<;>(ovo3dTZ#VM z+D$6sJGb++-jF6-^m*+2hr0c|&^zPIvEbHBm1d63bkV-YdRsP2zgwmb)a!bS3e0ox zrmE=DH*D4jGhxNuVT)#oGBmyvD9Qn zT`ZK#isn$z7>~q=F+;Gf)VeT{`_UmHODsikw`(%SwWP6_)6r&lq33vv$SBE#5BNHB`l|I5vq`LAHQ<0 ztIcFWY3ul{+8p8N>O_~N{?y7zlj6lj`*UPb7iX8>)KUY78SIlUMlfHqjWT7sSVS_& z|8g{Sp_$AxuWUTmId=WFI41%5W3ykw55TWN&d4NRyh#l^#U%>s?3NNo1sQ}1bn45* z;@f|4z8uUG=acB3{;Iw^y)dCCedv&4@9$(8Q#FR!KeH~s;4w5-Vo-l#(viBVLo&Rq6m1QtNuZBDHLN>;UbMJe(8VH0;^zD`%qaqy-tIhBUm3 zd(Xazkl}p);my30Eap1Ar%s}Yh1FI5VuB|_{hwUQYEJNMA%do_!d(=mI*Zctl+lyX zc>AD5Z1@|d;v*nRU;6@|oR3aMOU=zR>}A0j^RGWYXz*kjunZ5wRpD^VP*ypN%vt5@ z3SZgA44_@-e`Qq*dWovO1a+c|%h++T)n5~HS?yb2nJs^p*m2t~h@1SAq^s1Jpodm> zh-+4j>2jpu2kJ=j{n>7{l{~y#(biiPaPgnNd}D(THyz~Mu$ z$19~)Mwk7mCPy5ViwaV#;yw^z~5t{0EY*9J@YJ>BqX^pXs>o%2!e6=!P$PzK(xjV$r$b)Pn zQES~NZrey}B5>S{Vue0kN6XAra+^Ltbh{h@3-DQa9Oi?YXdD?w@=*$k@==Q7>-1_A zF;NqLprb~$^MjGCtK9eMT3GjE2&i${WWDO<2)9iEKe6nVfS)8?5`n@QDjO0o`YVUt z^H|3%2zj^6{ft5Q^D-;5GYtzO6u`6Thu*C~qUr=QW#Y z<)QtcLit?~ftzd1tDJ!(8ejIAOmO9%U0H5uuzyJ8OliZg3OJ{=v}eE1KXXg}Y_&o0 z7wSz5gi|Yokjb=;nf}gJpwX_P$bBRM+^9~fm{5Y9ZyGVGi5UgvO6w%OV79L6rqxpSzS2^;Z`epH*?L~nb*~lc2%hqSheIaJpC8T?X7)1J?vq$#71WR zL6EG#^w*;l#(v`D%z>8fI1`R;fvrS`A)%D|*Nt2g*>m_Rxt*bM5h_KuR*%s!S?cF+ zv#|7>=2lr4Hn=~Z(dXJmRa7ziM%701y<)PK8Lx$*((=lNr3N` zZJ4ec$`qf&I-VysuawPd2 zjdCFp93ep!?li*4Pi~hq7wba4 zz3%6b;)=^O`)~Q%#{o+9^@Y(adn1IH1zia~U!4#>MUAIVj%J+8^iQtoEjVj>q)?!IO1-$$LxIoL73 zFu8MB*SIyZyCr5H)Z#EigLvdkSaG=(GX^FY9bm0NV?c93&aRjsAg6(BzCR8)-w2&6 z-<9xX+Z1N&GZ~-+hnHbAL9#X{y6+GtocXPH_8#xd3ly-ke>VxVxXZYdh4&iirpSDd zysnxlZDldS@_Z~teSFWr(H=(msd`V9RU++Pus9Qdb>YBIdEg&b@LEsVSMAs z{nAsEZQK{qcaYY)-b5Y&i4~#6VXnQd4iM6uh2X?u;a%mL*B+P*2{1vXyGAH~sbd>+ z2|APsA;pS?*J*-WT`WJmp?hOcC07Wdve9&~s5p?4;a}Uq<{+7RMx;AWN2*CKgVNXy zVi7ASc`nAt(Y=9rSmwl8-2kra8t(`v7*%5vYwpfVGdcZs;KcL|5-#TTiC6ST3U_Ed zxBGcQ>&!}5ANz6Te&FcEv(o5hy+rC#Zg8|9)g|FXz{o{k(F<6i@4EcrjdNY&ePWrV z46C4bqFhDc{UO0k^TBB}2hWe~bojz{aqT0y>YtB^s?dq*H$V`b`78{+HgfR+hEj5f zh%oukgpMn}LA!K>PT4u_KF6_a)2GIB5ELVLJqCSlg#dGu=kp!k)c0ZWbrxmHeQ7)B zakl$duC}$Bxq;4YsgxP7O42;44)NSGCZ@hZSTFTyMrbIUf3G5H;4y;*UqDlqI|_mY zmm?QWq%>@nKDA`+T_{Eg%q4szw_O~3!)<^1>2V4FGm~TmTXs&9`ggnrnaSSnItC4e z@=2ENjg?>B+eGTzx7bZ70Y+iSMjgx!Bv{DL&T%h}ZASuA25M zph)Me;BgrDik>n(o?2|zGyJ0npTAOv8`jLG&d;&93uc<+0zq{NdPS<3gp0?PY%Rsk zzibj%e%v=R50bN3FRnSd_#x09F!JJ#I=m|UuR6$Qpr#FL2)vvS$%o~^5kyx8q6jb$ zP56RJs|G*U>YX1i(40OktKwb}Rhc-BV><2jpIIq8VppwZIVCd4Hl4uAzYtltN^KZ9 z*nOM0TRo%V7t$0e8bQZ(>wYHggwE{~2ZvoN9S@n9f>_ij~5q5MuS;3(wOpTh{LykNV>hi*9U$+P07!srr7j zrDKEpF%&e5>=rr#ff!R)Lmv3bnDN(uhCrvfg+zDG^jsJQCcoPOXRuIW+rm z86Y5QsnZFPW-`S8hMjY_kG=dIRE~QVC-VHFbvcYCc2za*_X^=%d}c_55uWWt%y+Xj zGl69VzFI}AH0Iu_-8;lDHWDUpO9d{b@SL?CXl)A>_yqSXk8c>vVT0HjX?oJ!Cw2tu z5M4vOh$mdv0$?GgK-V}g#O(D%oC%w0Phx$kmcHw04*87HS$m>-!H(^A=tATW__g%m z7`uX@hjzjrgLf;SNe0VZhG#GpG9mr^Vc6iMA zW>iX2xP`?|_VMOpQ#o%Iw{RG*YvS75(bKT7l$#u$pU5S@D^sh->sb%Fc$&rzsooC$&YFfF6%QB*rR>QL{DE4913*J9Mx#$yc9%6?a-^a~T_= z^2zj*77%@5@5XaU$>jNKp1oWww+k{jss4UUy$-si_Q)b5IPmUtne3*=wgb80D@mub zFUF;f=c{F>%Fd#$Pas%pFRLkXK7Bc9%nO$R?d)d%)Q`l*Zl<$7-*7);c64vDZsSVe zujX^S<#98pzJ;i9A4na&y~XmeM)F3Aio@h8jGxi1Yf(mb=+NM=rNs$bU+TF)g);Ow z50hAp_E%KBLQ&`WioH3HI~AX{8L4$*>Jd>Q1=aV6drr~KEKJh*Z{N$dA6?wa?Kx!X zAgML;&>QEgA|Ds;iT-SGA@}j5S>5%Bh+0%tJ4^vvEsbN!wXo%wPD4*Y9Lqyj9IM1> zIPj2gQatELJPQ;b?*Hlfr5^s=OyRhd`|WdIxwNln9W(cie8jY&V%wb`LX@+NRf!RllRr5PMo>7 zDs7oc^J4ChgYr_q;aRRHBrbFw0&Y^Va^&h_e9AxRf8BWU)q56*RN+n0%sEAAn5Noa zX)5wY+dP%W10sRuY~qH^0PzC@auNdh1XR6Fb}_5rTx09zzFIQ6i^V6Ae03iEeToXp zSir&1etI{Z?hF^k0yO@kMBB@j(EM)FT3-t(-a-L*j2EWoC-*bDHa$fhzjnDPqBt;7 zVD_1O$pTTz4w(&=PJX7`TuG)J%441>lA_-m1;Y=R!4dPf675;I6pAy2wgW=nCmH(x zc*5g4>JT`TNx0yqlKTD`4}(jTjz|z{H?duNup^BDlYzONN$dqZq#ZY(P;)bJzi%wJ zDIK(PZ>koo!i{rxkOiwS*k!oJn)8hL7&mz9)6RzyC$ke$htePAbStYg1{l7ks{R*t zDVEMu_fD62y!P5X1(Z(aifQgHOrKltyIPt%k<(55c+H+>m2hx1HF4$Gy_5fC0t?O* zHDHA0yCQ6F@*G|BMPJG3NCwTx*sT=aLrEnFVugSaI7Gn6^`(;yzaP;+`iqM%u9-i} z7?JgqDV^L;G$#(NOu~LfRWa?dr$))jggdSND%}5Oyru7?ufsRff^rgF+v<>aLBuC~ zgtilBYb2t3HsPQM4Wz6$O^@?zEIfbFz~P>!L{U^4Xoa3vQ6YcsQ|&tcUYOLysE4HW zNn(N8S*+p_!=<04o5d2O+^C0f>SRxYs%LUwN6~RC-e`Y+k62M($L9yV;4P6spY=y<4#pkpp@QGbKl!kHBs5!iRw~#eAJm| zc#ptD^ry*J(d>N{{L<7Otgm5dXY_HNCp)Sub9oMO*Lh?*LdgmZ=$Dj!v-A(G%T<|dICSPwiHnZenG)c7oQlJYx|EiJrbjYMP`dx)pTxqpS2m4bhx#XC0pPk{+ zB5&nsf0>gp+l3|#Lb=D$V#UqugsSf(Noma4x9p{5d2SF1$5j5xvlQ@aJ?Mb2-V!)AW$;I^b|0P2RV1Dr)Yi;sxFm0fb7qX@Gj>;k!|D?1a@awxVjvU)4lSl znV7|YkA-kL6TReCK<|%I*KfU_Rs22dV0oT$S%EjWa8xU`w&fv z>~#~@k|AOr{;x^6R)&rcMhd>YXj1mH*CZtGkGbQ=0)?;|*%0X}3)mU@^PP0RF*D^O zN^?y&?R-?XRKGkT_6;cm9Y{K~43uzI+a)vOZu(R&AqkXC`{f^fLy^J7gqlicI`i`2 zhbvuO;bA@AMY3l|{#`yBvExsfZjwxhtn#{AXqrTe2Meiy*M)%&wM`mBuA^%i zaAw1@THG+Gga{l;!{TC^ADu4i!Lb8r;yWYlc+gRwmo|Gb7Z_#!!<#=TEn4vLI9W-F z`||PGf>Z)Wz-L2;(o-c36TDC3K3W%N^(CWa{^ESo~&{*W6$`+M&4U)u+M6{5O#<^6ah zTQfhw{|`)%xRW(lbnyO0fg8!%ztcA0j+v{`i)str$MCr)*z5|>O zrB494v|+^Yz6<;XZ6D>$mp{+A*dSa<&?pKU zsw2F8ZYl^{xF(H4{ASnq|6E!7x<_T(B&y^ItehSVXE0IjcRQ-+fhFmF!vE6px+jC# z!8!x$&25_u7X3ZE0^*au zQSy=J!KealKI#4LjB9L&o3m?c%XT`B)fx&4A6{l>N)q10_;#ij@xCF7klD&lp}Z2E zEQ|OOaC6Csk(-XC)}t+XSZVY(4s+>U&$hhRLWIDTwXzUqShW7KM@%hRq@ugMnS69G z%YAleFCyo$pPw9-9GR0t>GN6B$B_58GL&u$`p52pfp`)>6x%&fy$Gg5>X;H8c52#( zkB!j8%o4SUX}UMX$Jvvk+U4bYrUoiWH%P3w4!3>Le`iXV*BH~!c?P{8(4eqXu-i0L z+(e7<0^=$~F2hqY0k%tq4CjG^RC4ghalk7=WPlUwoN3Y1OAf=oBn=95reG7K{}Gbq zMxi}X(cxzK{N)vm7Yb#UcJ|=LW@27Os!bwWknF90l_Rb|knbGQ(!?{s!Ux_0C6Rlhx;p6pJJ{m5*8f%pxq8)=by%=F`%y6v->*H|fxU!2J^XO2x+$6cM!)_dvyY$^`Ef4$+ zbDeJ!m&N%{?7v>bd;TUX!1&=QA5U!U(W}6VOO27W{Wm%yxgRYaT4d!R#2*HsiLMNf zy7YIxQWe~nMv^-GoM=@y!It;@CKt#eUM?Oc3@n$5Z*5-~l!W2p!H0~pO@CR!)porW z&Q;2{VOV4KB^rcBX1W&k)LSa!H4#vFTMhc1fq&+ zASjg4bPRYn%3*mvavz=`d{!WlcHFm{m^-qzA^dFI_nE35?YB~SdGTdvGf9~R*Qs>V zosZ~ybvfq$ViHVlY~CQMz8dvz_OLXuZHq_k#&^ZlRsWb`xqCG>8_g~h1aFbzz-Q*l z56tzx)i5pt@|Uw}%nkk=hUHM8;2M7zF`PR0lPalUdW7FTR0sITDpgPD(anXtglbVL zAz7s&LNV;aJKWpSV<})6ff7N6HhzbgJWvybUT*(ZVlMWlWg(#$R-PDkS=~zke7^>S zSHC+)pk{3z?x`=I79X4`awV|%r#&q@@U^z#)da(!q1?pcjs3*z{Co{8;*v2M(!^zH zXz)?~JfE6SOsx21nx)+8H`kluCDd~73s_;ihu}$p22zGxnps@)ILCU-(iux$QSv>_((JU5-bP&G=jLI!%hQ#2h~tPw8+D@E`BoYhWu z>XS99n!8s_kkO!&y|3#u;k_fpy|6Y12%1e;BX%~O*8aVO>C z{@o*HB)31J4;%c3+H$?u16(5%5sk~;Lhd)w@9WNk!CsP}bS5u-_7d2)m6)bPHo7chEB+Ic}J=KHxQo!a6< z9zdGzMA}^;dNT9L^!XC6ymY9>ZxzUl z9Us|dK@VgSL80H?|X?6G?rfa+2aoxmi{R1MLk&4*&E}+z>Z&ib294|V)YeB;T4Eb!<}zT>nujP zdAW|JHK^_0H&-OXMMM?>roVzd%KR4g0e5HK4tPpdAWQTZ?J68-!38k8m(hFN@_V}v z2fzduLE*)=kHha20WR#!xE&xhCNO#B$%G2gad1R|LuMSzEH~o@?^n0sf2Ss7iTw`` zfzXfx4^9h?w>FP4t~@@#SAfX>|Df>tZZZ#L1JmXUp|1XMDR?OB+L zx@{S*V@7&JCt7LOFmG;mtJZyo+uDg$>eYg-rP_98iT4P+6TYy}BSyLteqo)(n7pTP zG2UT2ATce@(f`hH;b7A(DRKq`c4IV)@;CXcYd*bfr5uIAc5r3Kmv740gKAiGLO4t{mEN8UY=3 zvu0(ykSK@t&zf|3EnFhw53%2#Cuj>8NQ#{?%zY7mD9bcpN_yX4zJ>G)d3ib5Ac6B~ zNmu?G`fmtw{e61G=Luc-oPS=-7nx#$ut-suPGosUxPwxx@l{^igJh^(Sr3x5`U7(fjS~N9B$O(zbc? zgm-Fnw`>zaApUzSc3=tu!*GmQ+cOGVnR(|k_Nn9ULfiG2=nH*V9v8)}FzVzs z1HE+@2XiavVOaNcW^S0wTyyrtD-o=w;!M`&M&VH^U*ZgUI)kW>+CvNLDZHQm6*6BS(Lsk}Kw*>n7Sl=@gEW;te*8^9u5l_8w-JAsg91T<9hfZdtOjo@o^xU}R7h%*~%eX=95(#Eyu>#2jP6;Me4K^Z*6>j2sl2`N!IbPXO zLt#L4IBo|7{fzey66*`xBf5wCi`FwV;AM6rmgr+6%_{L z=WXchN4ZJMZIIHt)cPXh3_lrE!ci>IwN*Y-&LGJmM(1iLv>BLeG-|fV5*Wt)c)X*@ zttB>B_rxf4jtIZ!D=T&<8F<#};rxGWfFV6x3W^XT^u1Y?Pm6PFKYTEBF5M9lE42$0k&M1Frj#$L$(KarR#T)>7bo+ntLo{C#w_kpx;&10T$RhP&U8|AS|`)QcEk*I^W@bkN!)6BREU3g zSuRHDe8OL)M*?z*;j3(;kvv?>h{x(4wl?Q)Dpl$*oB^*bt6hSNidZ)}9mcg2z;nw- z!SBBar@9`$rJ)}x-{Ovx?&#rjSFAhk!z@3))OnWl(@yb;l8FwL-3}PkOR~$?_Bc|9 z=~7OWXsxfjQG8&g(VEBXzTa%ap39V~ohJHrtB9djDkQ;m=YbMc@~9d4rqM3i(+428 z+}?v^h=^R-vqF%o0Otnxq@&PG-^|caY_y5Qn3GjpLWME10QU}W8bQ_9fX2NUm2y_a zM|W)kB}6`UC!bBrHKA0dez=G~vYjsYa-=vjTv*j_z-ak_$+JbSz$@U*Y1i7>SurRKBDfHBI-kN0TexfjxwA<#Te$TJOS8oR69b~G*j$FTURJv&du z>f-mR#|1Gd(oLxoo{4m=Sz_Z**g4%LD9?>h;myQ!^;285||2knwhTEKwbj7bgXsVfoHGEoMANJ%MqQb{EhF z6p=pdD)DiT(phTt%{Ig4@S_I3Xg&U>m*b%NC#v!22{p?C8nug*YP#YuXD(pz z{4u+s)NR2k60K{q1l+2Sp~*|OnZ?KcHof=c&`mL|&yC%5<(}tYH)t)p=huwl?&jR| zU+XXDm-FYv=f}N@h7wQ=8MGV3i@xF)m$8ESsSX?%q-ia#It^9d6R^xwiLc1lboE0z>c_X; zUHr7!yNJnFrCv8DP!uk>Y8t!c%+3_b_v#u6Jm=k7+y8+%#4T%nMo_HHzX<~VB{ zdhIHmICrKYtfIx#yB59|(Bi13(;Bga=>?tk^xP4Xl6e{n>pisKx)T{_Kk1hTk8$v( zP7pdWN-R$W`|FH3TIcIZC3X2J(MZ5g!;Uip;zk;+m+$l~&_toLQUS z)}&$)KF}qP{UP6cp6y_3Kis=aj?z2fSpAo!i9*A)np)Rrpi^#g#y2SqmxYn?ZH1Ey zkA=G!0h*uJ-g|)8W=(ju-c5nA32*Umy13~TE1B^$PY_&&_OA0mHIG&6EOxt6AScO+7v{qc&ffle$uVHu2iP& zRJQyD@yq+yVT?H7iyYAdq}KFvPGX2!7tnMD4=HQr2iSaYHjilL zhA~oyb##jHBgMJ!BS#u<6?VuFOd8^CB4Jw9_Y%)iM3cskF!hIqau`0_2OVaBO`Gzp zP)P_#R5xXEZ>blM%P_EreUh3O)hdshAJESBCR?yWd@<}~zqXYI{yqpsTiGvI{`zDG zDjH|S|1`Lr_l4D(23Bk1#aP;gY}~VwR{B|+S8=jV;nOREOq%fqJfWhb6D0)AduTsT zXLNJqbJQ58vR+sPQl&#XZeyYER}r_;n08k$cDL{MFEAb473)&^8W>e_gpz=Qe2;QY zgHr_Q{650Rjd6bF0WY)7*=96vw>nj@jE+`xQ$nGVnShmicEZlZUUMXZ5te||As^EVgecD zPv$r$dr_ReI1XBQFT#$!GbyrYoB!9Ykg;-R=r+p1W+`!pBC(+6ftF?NrR zd}@lD4;D24H8FAjtDfrqLr9ibs&}vkpQB@cVe_SGJ~_g!>(^gRJ&FIi3*dor90ggo z-p56uT%8`{?mW^2Y~41JX&c77$oggQ(>#nDUMNc2+ShY z(B=4@B-CS$6W}gW1YB|lG}cEw^x~FviX&VjV|AQNahZMC684K(4<8@Rs%_St2z<9( zUcrO zu!LbC+cNT9l5v=bH@oW5XqYyqK-43RgaODNl48w@i3j;ywc^ZfqdMe>l)TT2x+2UB zZTg#7n)wqlS{GhBL51DsjnALL0ojEQk5ktr(y7w9wJ!a6B+%oxzihe2r3L)sq~!)G#=O zinyzgf2O&$UH(e_rWFD8Q^f$Xh$kbi@-`@!6mF)5NvQW_50US?h>Prd#A||<0^|y< zkX5VnTldh$YMTu@u-(tu3C64o8g>l?)EDpm!X_zJLG+2&hWeZ$u&Q^CmsL3G&Otd% zkY6u2c~p?*I4%4*}^w0(`iu z$h^k8QVhDGiuaA0B#CTtB*(~ApYR>Y3DsXYoBJytB`u;$X&mdJ8GUBYeyJpagpqL% zwTg);5+T}S)m%W@p}<>oBqcJqh^+7#q2Y>Tg^IWWp>^o#66ltNai!@Pr3SNm7F5I* zx)%@=b5fDZ#60q;=fbR0q!IsD-{A&5gz?v=oKk#IbQQL2P#Djcy^II@nytoSg8u8( zplzPecvQ9Z9=DMeUG9B^sk34I{L!J1C|QLk(MOHNVW~BXY^$QnhGBvE%=BA2%{osr z-z)hNkkgHUD0M(wV~iOG1Dob4jPwG1Z-9t8nM@@-;RU%_40$U@t=XGM8Mj^aW2i zUQHCu;XK8QnW8m{4|8UO!&R>zn8&*YDU)!J@8AWRZlg7-a`;i!K{1 z%N!G3$2yakw^M&*-$6G{ysQjcwu`2-ro&mIX>#WGl-769H}~@jE>7%qy2oB-F`V7h zoWh{iH@7&w!&G5mx5*g^yh@?%rYuk2SV^6GW5pKW1tX9e+-u8?{YZ8f{TzntAvAnQv^b7j<#ku2{&WHcFMtPPB^TPL1HUZC+JQa`lO5N~Wo;E+p& zhdqt^ulO^!PgZje(AyPX5r_172d|pmN^CJH*y_{oPD7JZt8$15d7Sdm($EQvUz zm`pWS#y{iPI7@%kpBjWwx=L3l<`mSBwD6Xns!lgIYHK@H%Bnyv_TtC;wKwrzyWomd zsg=8hvzgD^DvBdwwJv2>r?CI}rk1+)arE5b@DM>)}F{-B0?|2~FZBRW=_88XvxXdo0{ru<7&za@5c~BPnh^?w_<8 zvcVJyb}t8~PVKMHtjdj7ZuKK6?i}5mEhPgUpa5!<-C0c$*ABY~s7;Q&K+NF#dh1wH zZcWUC$IJ&YBkN^cX{{1DWl==pdJmzD`CN*iz5EDH8Y08G{??MMrugu?A56*bHNh?t zX>v`o2lnQ#yGJZo4aLF6+9i^^&v5_==t*JVL-9cE_(IjqnA3`$1FWhSDXqbF^YLi7-CgVe(uE~iktcj+plcU#iz%`#S)T8f=@jM8Y*|>Wtmg-en#}}^PFN64G4-r6zN=z7 zIANZvPZAAcLK}SoVwidvOfG_QE`WOemUSl0JJCKF~>-+2Q(Aky6Y)pSfteScN)8cl`Dy^1Y+65W<=Rv0Za zU~IGnAt}bDs`WWnBH?}QY9%XZT@@DM+JiDqzVfa(bc2|;VQow+&+EYQSh%r^J!0oO zw^Ns})_rn+muQOlts|fK@lO5)dif&}78AHXWsUU>(WJU_20&@Fy#Yg4 za=F^hc`f{JXEHF+j5h2o(A)2No~49(<$2knq2g(@-8K!EBL8U>-6+s3jzeBA$jYjj34UhZNQRI=j5qpp-)q|L6&DzGg@ z=s9AN)!Xo#$345M-((ZaZ+pC7V{oz?kaL$hSVNvFH{Bl8_#^Pa-R-f92hUz#5z4z7 zW)hDOGtM*Da~^51FG51M+=4x@J=L521#u_YD7$*Qs>&IesoMoJ%$HA}bK5rxFjJWr zz3DPy$@45?!vFQ9do;}|9)DN<{eazZg-6aw%D`-^h5(Jl&SPpjRi0e~K_sxrcpMlB zvXUnt5w)q}x`DG{Enl2M8(YNyH84491P85LGSV9hev8*#9xS9=-VYSSnEau^zV(i~ z-n@h>cdR0|=0<11@T%WH!2alJc#N^k-?9cKg3j0+F?Cjc^afv-DluD}Q{#6IzEfvr~phFcY9yM#*wU?*cNdfVC}w2HRKzLZ^Is_yAW zVK|g5ew~LA*2I~#Hl}8H>GVAdL1EhSd@Q-geQhQ_+oY|VSln>_Q!u~9%~?<(<13G? z5&VSxYF8S73e%z?W-Nc=;{n^&Ei^_H%fH___beHI?fosr#k;S-q)r*Dn$gSHri`7L z++gKh3VKPJ8!gw?kE5a0w&4YdRb4)s@KwwhNMEenpd=J4VcgAU3-M&Q7|m$N`BFmU z;_fi(vX5ARZTIUKI=~)B7)0fx9f^s>&UdPtEN{zvuR57(SSjFMwRcv{kSt%%WnC_i zmd?rwm)e2&$w0hal-e*>@6dLP@SyyV-J!ujvZ_AykwnaCQ_sQgUmLv;LG3*?$^b4F z8JDB5VH)$W=~Y*thB7(m1)T5_At;RFKFmbxM$GJMu->64$3oAu+gum?C^s{HT8nXj zVZ7Q9X;2+}OLzjaP(&dE5SWwrKCWi8)Obc=tAkbg1CR3nnNulGnx9khQif?V$=^MA zX7g*R47$(Vftk514YUE>k{W>#EJB=T#iJKGj~cH|45j-5EjO5nKJwIllC39wG1ohW zta)DIpvb|X^`zk`_*S5Yb?9iIw%tS%%XdXJ#%cVbp?f<1J*}(e2X2(5 zkY;}>%;6y@6iT?nTO8fIwI=Bzg%q_4@%ex3eN{k|ThyomiV6aPlu9T9(jwhhpro|4 zI?^RILx)JG(v5T@-3&@MGIR<a_0q97_-xP1?1AgF}akI ztR~U;{;_>()fcKb?_%B`cPh6X>U=+aex zJGwyrc0ts1dqd3V4~46rEH8Koz^aYfZLsb;J-m~D^Wyi0gT4wZ0jyh1VmzMVN^8yZ zH(typ5OCaBv@H}3&y_chtnI43T_D_eDEIxZeOxsrDBAWF}53th(HmklQK(`*RNl<$=CRTUvVBb z3Sc5jK)-btWHK8gdNC`ab2h;xfs@j;#0&U3h9ni z6Bo!+88JsaCulJK<#K8RF6SVg&z9>Rv3fos6_fMzMKCVzV|5|iK#lNL?z&lFCt}@c4Sp!7eBJ(P5rJJReNt^} ztK_!u)J>rtU%z$d-G|OUo9!~2M#D^>z#Gk3|IJmu%&Mo8MH%^hWlWwT=er4r)4YI>wsd+++D#gc7`iS5PK#^~xoizS7C* zlf8W1J8CMG*a4mOS!nhlFTsBA<7A{ozJq-$uf6lI@|L!MS84^_w5P?aNDAj z>F1jtON@23Z(}o5CC)=G;OXBm4ApmV9U)#Anu<7~`?97Xswq(^LBu6Fd_^$B_n0j$ ztiVlBW`OCLj;ZC9PfzlZf;d!DQ$fyr*x2pF+k6i)^NzNpuJ@GAijn7c9WoT}ZcN1P zogUXVz@3}Pqr9}tBac}h63XQ|tpJ(R2b=*$PmZiM)m&^+Gxr@qw+%lq7~p8LjNBX* z(^}pp3_KzBzs7WOMAO=S6kq3qI*Q)WZcR|sq~U*8YjdOA`wIJBzze;LYSCGt7w%55 zY{WS|@v=woLQ2#9s~6ZufKES7zOjyFp6SHI5JxNt%CbY%ukJ6|XoMCWXFTK7AeGp; z*oQU`*YqmOA{_&EiF^27Z7ZowF(ias_$U5(9;ffL3}agpkLfhY&{_o4RKyF@GPl9< z5fQ@dB<+r^NjXrqA^br+XzAhgP4Wr(YyLqpB~A?_iabToI8harF)XiE`GDon$)>^W z*bF&%WCjfAJH2m}&x%TfrztOhhj%T+!ZNfTigXhkJ~1g4{eHtSmbKpayC09>1##d0 zx|&Dxth^b){_7N1@B6W5kho1(CsDooIugkc?{=^H64%?2D_2Xh3O-&C+rlwdAKPJ? ztSVn0V9eRk8qbn9E(nMiJAi!mlYOwT!koNdwG*#2H(egj)-BJKbhisZNhI^;B9(xE zzg)+DNP_&3%}w9HJBXd zB`!ailTCQhPp{9!-$635aKiT3a);pDnlxdD)w@bP>T@p-#F*2N(8TZ~8ra7|31h2b zVg2e$_hl#nb~{vF>vRRNXl$fS)oNTp&=s9Lk0)qgE?>|~7*jrQ1S6nVGd;vULIQ=J zam7!yB#Fx=npL^dVYjb#bZE}*AF-CB?CO5Io`vWvGCD?KWVdG2)U#MJlYdPPyRJo( zt{Z9Q=%m4g+N-$Y%>UZ)N5kbYo05LtdBd#y?+M)nCj;hAy&|?{`o-@W9;)+Bh-jF; z-9z-Hd=u%iP7_@$gzY4Gt9T&@p9w;5L^*2zDD=Pz$X%N0f!D;O`LW}cTqvd?9{Vb0 zR&(_55~S|@l!>;|ohl{7nF=Czo6|6QJowSC0#}WvfKrvCCL*ZFi$9@wcqw0J5&ZNh>A)lRe(cA&m2C zscm=0GWRrx2JAzNj<=1*T89YCI5uT+v<>V1VFvOMLOrClMM@2|i%=9Cr3#ttU;&Q@ zxWtX#hOsC7pj=ax^c5^)=kzRgk#x*_Rk7iI1>qjP$Qg=rcd6fH<9G=B0c%r|JY~4R zeM@jqd?{j?1?1qoeJF-hl!ERiId0s2C|6p5RFs77q;@?Di97mn#{X{x#>$}G|59Fg zXN-6Y0+(|uQ1R0;zj{l;_3EpUL@5VK=Az72unouz68z3eagZ(Mj!J$OB2KGDjInJH znj3m~Gbv@8z0ASdX!B qb=>Rdd9xc@P3^FB~4*LRmp48 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/internal-account.png b/erpnext/docs/assets/img/accounts/internal-account.png new file mode 100644 index 0000000000000000000000000000000000000000..eb990ac85580cd8edca1a390651443f6412d48a9 GIT binary patch literal 221552 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

8eD1T)ZpoC#h>40|4E2mg!=_?n$eH!T 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

m=EVvcF@O%Vx%E= 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 Human Resource > Employee Promotion > New Employee Promotion + +Select Employee and add all details to be updated to Promotion Details table. + +Employee Promotion + +Promotion document can be submitted on or after Promotion Date. Once submitted all the changes added to Promotion Details table will applied to Employee. + +Employee Promotion diff --git a/erpnext/docs/user/manual/en/human-resources/employee_transfer.md b/erpnext/docs/user/manual/en/human-resources/employee_transfer.md new file mode 100644 index 0000000000..307f9b9fed --- /dev/null +++ b/erpnext/docs/user/manual/en/human-resources/employee_transfer.md @@ -0,0 +1,17 @@ +# Employee Transfer + +You can transfer Employees to different Company or Department by using Employee Transfer. + +To reocord an Employee Transfer go to + +> Human Resource > Employee Transfer > New Employee Transfer + +Select Employee and add all details to be updated to Transfer Details table. + +Employee Transfer + +Transfer document can be submitted on or after Transfer Date. Once submitted all the changes added to Transfer Details table will applied to Employee. + +Employee Transfer + +> Note : If Create New Employee ID is checked, a new Employee will be created with property changes in Transfer Details table and old Employee will be marked as releived. Leave allocations for the new Employee has to be manually created from Leave Period. diff --git a/erpnext/docs/user/manual/en/human-resources/index.txt b/erpnext/docs/user/manual/en/human-resources/index.txt index 479e2ddef6..758cdaac4c 100644 --- a/erpnext/docs/user/manual/en/human-resources/index.txt +++ b/erpnext/docs/user/manual/en/human-resources/index.txt @@ -18,4 +18,6 @@ human-resource-setup daily-work-summary fleet-management loan-management +employee-promotion +employee-transfer articles From 9505ea93cffbe67dbbc62846c4d6c67447f0c446 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 14:32:42 +0530 Subject: [PATCH 052/154] codacy fixes --- erpnext/hr/employee_property_update.js | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/erpnext/hr/employee_property_update.js b/erpnext/hr/employee_property_update.js index d49c1abb9e..91b6c97048 100644 --- a/erpnext/hr/employee_property_update.js +++ b/erpnext/hr/employee_property_update.js @@ -1,33 +1,33 @@ frappe.ui.form.on(cur_frm.doctype, { - setup: function(frm) { - frm.set_query("employee", function() { - return { + setup: function(frm) { + frm.set_query("employee", function() { + return { filters: { "status": "Active" } }; - }) - }, - onload: function(frm){ + }); + }, + onload: function(frm){ if(frm.doc.__islocal){ - if(frm.doctype == "Employee Promotion"){ - frm.doc.promotion_details = []; - }else if (frm.doctype == "Employee Transfer") { - frm.doc.transfer_details = []; - } + if(frm.doctype == "Employee Promotion"){ + frm.doc.promotion_details = []; + }else if (frm.doctype == "Employee Transfer") { + frm.doc.transfer_details = []; + } } }, - employee: function(frm) { + employee: function(frm) { frm.add_fetch("employee", "company", "company"); - }, + }, refresh: function(frm) { - var table; - if(frm.doctype == "Employee Promotion"){ - table = "promotion_details"; - }else if (frm.doctype == "Employee Transfer") { - table = "transfer_details" - } - if(!table){return} + var table; + if(frm.doctype == "Employee Promotion"){ + table = "promotion_details"; + }else if (frm.doctype == "Employee Transfer") { + table = "transfer_details" + } + if(!table){return}; cur_frm.fields_dict[table].grid.wrapper.find('.grid-add-row').hide(); cur_frm.fields_dict[table].grid.add_custom_button(__('Add Row'), () => { if(!frm.doc.employee){ @@ -84,7 +84,7 @@ var show_dialog = function(frm, table, field_labels) { d.get_primary_btn().attr('disabled', true); d.data = {}; d.show(); -} +}; var render_dynamic_field = function(d, fieldtype, options, fieldname) { d.data.new = null; @@ -104,7 +104,7 @@ var render_dynamic_field = function(d, fieldtype, options, fieldname) { }).on("awesomplete-close", function(e) { d.data.new = e.target.value; }); -} +}; var add_to_details = function(frm, d, table) { let data = d.data; @@ -133,7 +133,7 @@ var add_to_details = function(frm, d, table) { }else { frappe.show_alert({message:__("Value missing"),indicator:'red'}); } -} +}; var validate_duplicate = function(frm, table, fieldname){ let duplicate = false; @@ -144,4 +144,4 @@ var validate_duplicate = function(frm, table, fieldname){ } }); return duplicate; -} +}; From 86b81e99e54b0ba67b08bda0d8e47f7b756da0a5 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 16:49:51 +0530 Subject: [PATCH 053/154] codacy fixes --- erpnext/hr/employee_property_update.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/employee_property_update.js b/erpnext/hr/employee_property_update.js index 91b6c97048..473916ca42 100644 --- a/erpnext/hr/employee_property_update.js +++ b/erpnext/hr/employee_property_update.js @@ -25,9 +25,9 @@ frappe.ui.form.on(cur_frm.doctype, { if(frm.doctype == "Employee Promotion"){ table = "promotion_details"; }else if (frm.doctype == "Employee Transfer") { - table = "transfer_details" + table = "transfer_details"; } - if(!table){return}; + if(!table){return;} cur_frm.fields_dict[table].grid.wrapper.find('.grid-add-row').hide(); cur_frm.fields_dict[table].grid.add_custom_button(__('Add Row'), () => { if(!frm.doc.employee){ From ba70ff09046551858d0d154f904becc783693554 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 5 May 2018 18:22:56 +0530 Subject: [PATCH 054/154] Exchange rate revaluation (#13932) * Added account data on child table * Added Journal Entry button and functionality * Add docs * Refactoring and cleanup of Exchange Rate Revaluation --- .../exchange_rate_revaluation.js | 91 ++++++++ .../exchange_rate_revaluation.json | 7 +- .../exchange_rate_revaluation.py | 164 +++++++++++++- .../exchange_rate_revaluation_account.json | 207 +++++++++++++++++- .../doctype/journal_entry/journal_entry.json | 4 +- .../doctype/journal_entry/journal_entry.py | 2 +- .../journal_entry_account.json | 64 +++++- .../exchange-rate-revaluation-submit.png | Bin 0 -> 63451 bytes .../exchange-rate-revaluation.png | Bin 0 -> 65694 bytes .../field_set_company.png | Bin 0 -> 60475 bytes .../journal-entry.png | Bin 0 -> 67372 bytes .../en/accounts/exchange-rate-revaluation.md | 35 +++ erpnext/setup/doctype/company/company.js | 1 + erpnext/setup/doctype/company/company.json | 115 +++++++++- 14 files changed, 661 insertions(+), 29 deletions(-) create mode 100644 erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png create mode 100644 erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png create mode 100644 erpnext/docs/assets/img/accounts/exchange-rate-revaluation/field_set_company.png create mode 100644 erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png create mode 100644 erpnext/docs/user/manual/en/accounts/exchange-rate-revaluation.md diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js index 9302a24108..dd44450ea1 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js @@ -3,6 +3,97 @@ frappe.ui.form.on('Exchange Rate Revaluation', { refresh: function(frm) { + if(frm.doc.docstatus==1) { + frm.add_custom_button(__('Make Journal Entry'), function() { + return frm.events.make_jv(frm); + }); + } + }, + get_entries: function(frm) { + frappe.call({ + method: "get_accounts_data", + doc: cur_frm.doc, + callback: function(r){ + frappe.model.clear_table(frm.doc, "accounts"); + if(r.message) { + r.message.forEach((d) => { + cur_frm.add_child("accounts",d); + }); + frm.events.get_total_gain_loss(frm); + refresh_field("accounts"); + } + } + }); + }, + + get_total_gain_loss: function(frm) { + if(!(frm.doc.accounts && frm.doc.accounts.length)) return; + + let total_gain_loss = 0; + frm.doc.accounts.forEach((d) => { + d.gain_loss = flt(d.new_balance_in_base_currency, precision("new_balance_in_base_currency", d)) - flt(d.balance_in_base_currency, precision("balance_in_base_currency", d)); + total_gain_loss += flt(d.gain_loss, precision("gain_loss", d)); + }); + + frm.set_value("total_gain_loss", flt(total_gain_loss, precision("total_gain_loss"))); + frm.refresh_fields(); + }, + + make_jv : function(frm) { + frappe.call({ + method: "make_jv_entry", + doc: frm.doc, + callback: function(r){ + if (r.message) + var doc = frappe.model.sync(r.message)[0]; + frappe.set_route("Form", doc.doctype, doc.name); + } + }); } }); + +frappe.ui.form.on("Exchange Rate Revaluation Account", { + new_exchange_rate: function(frm, cdt, cdn) { + var row = frappe.get_doc(cdt, cdn); + row.new_balance_in_base_currency = flt(row.new_exchange_rate * flt(row.balance_in_account_currency), + precision("new_balance_in_base_currency", row)); + row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency); + refresh_field("accounts"); + frm.events.get_total_gain_loss(frm); + }, + + account: function(frm, cdt, cdn) { + get_account_details(frm, cdt, cdn); + }, + + party: function(frm, cdt, cdn) { + get_account_details(frm, cdt, cdn); + }, + + accounts_remove: function(frm) { + frm.events.get_total_gain_loss(frm); + } +}); + +var get_account_details = function(frm, cdt, cdn) { + var row = frappe.get_doc(cdt, cdn); + if(!frm.doc.company || !frm.doc.posting_date) { + frappe.throw(__("Please select Company and Posting Date to getting entries")); + } + frappe.call({ + method: "erpnext.accounts.doctype.exchange_rate_revaluation.exchange_rate_revaluation.get_account_details", + args:{ + account: row.account, + company: frm.doc.company, + posting_date: frm.doc.posting_date, + party_type: row.party_type, + party: row.party + }, + callback: function(r){ + $.extend(row, r.message); + refresh_field("accounts"); + frm.events.get_total_gain_loss(frm); + } + }); +}; \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json index 3d302929ae..b37c67edc6 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json @@ -19,6 +19,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", "hidden": 0, @@ -173,7 +174,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "exchange_rate_revaluation_account", + "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, @@ -184,7 +185,7 @@ "in_standard_filter": 0, "label": "Exchange Rate Revaluation Account", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Exchange Rate Revaluation Account", "permlevel": 0, "precision": "", @@ -302,7 +303,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:19:01.029331", + "modified": "2018-05-05 17:50:56.352167", "modified_by": "Administrator", "module": "Accounts", "name": "Exchange Rate Revaluation", diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py index 46abddc3f9..aa19a9eb48 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py @@ -3,8 +3,168 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext +from frappe import _ +from frappe.utils import flt from frappe.model.document import Document +from frappe.model.meta import get_field_precision +from erpnext.setup.utils import get_exchange_rate +from erpnext.accounts.doctype.journal_entry.journal_entry import get_balance_on class ExchangeRateRevaluation(Document): - pass + def validate(self): + self.set_total_gain_loss() + + def set_total_gain_loss(self): + total_gain_loss = 0 + for d in self.accounts: + d.gain_loss = flt(d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")) \ + - flt(d.balance_in_base_currency, d.precision("balance_in_base_currency")) + total_gain_loss += flt(d.gain_loss, d.precision("gain_loss")) + self.total_gain_loss = flt(total_gain_loss, self.precision("total_gain_loss")) + + def validate_mandatory(self): + if not (self.company and self.posting_date): + frappe.throw(_("Please select Company and Posting Date to getting entries")) + + def get_accounts_data(self, account=None): + accounts = [] + self.validate_mandatory() + company_currency = erpnext.get_company_currency(self.company) + precision = get_field_precision(frappe.get_meta("Exchange Rate Revaluation Account") + .get_field("new_balance_in_base_currency"), company_currency) + for d in self.get_accounts_from_gle(): + + current_exchange_rate = d.balance / d.balance_in_account_currency \ + if d.balance_in_account_currency else 0 + new_exchange_rate = get_exchange_rate(d.account_currency, company_currency, self.posting_date) + new_balance_in_base_currency = flt(d.balance_in_account_currency * new_exchange_rate) + gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision) + if gain_loss: + accounts.append({ + "account": d.account, + "party_type": d.party_type, + "party": d.party, + "account_currency": d.account_currency, + "balance_in_base_currency": d.balance, + "balance_in_account_currency": d.balance_in_account_currency, + "current_exchange_rate": current_exchange_rate, + "new_exchange_rate": new_exchange_rate, + "new_balance_in_base_currency": new_balance_in_base_currency + }) + return accounts + + def get_accounts_from_gle(self): + company_currency = erpnext.get_company_currency(self.company) + accounts = frappe.db.sql_list(""" + select name + from tabAccount + where is_group = 0 + and report_type = 'Balance Sheet' + and root_type in ('Asset', 'Liability', 'Equity') + and account_type != 'Stock' + and company=%s + and account_currency != %s + order by name""",(self.company, company_currency)) + + account_details = frappe.db.sql(""" + select + account, party_type, party, account_currency, + sum(debit_in_account_currency) - sum(credit_in_account_currency) as balance_in_account_currency, + sum(debit) - sum(credit) as balance + from `tabGL Entry` + where account in (%s) + group by account, party_type, party + having sum(debit) != sum(credit) + order by account + """ % ', '.join(['%s']*len(accounts)), tuple(accounts), as_dict=1) + + return account_details + + def make_jv_entry(self): + if self.total_gain_loss == 0: + return + + unrealized_exchange_gain_loss_account = frappe.db.get_value("Company", self.company, + "unrealized_exchange_gain_loss_account") + if not unrealized_exchange_gain_loss_account: + frappe.throw(_("Please set Unrealized Exchange Gain/Loss Account in Company {0}") + .format(self.company)) + + journal_entry = frappe.new_doc('Journal Entry') + journal_entry.voucher_type = 'Exchange Rate Revaluation' + journal_entry.company = self.company + journal_entry.posting_date = self.posting_date + journal_entry.multi_currency = 1 + + journal_entry_accounts = [] + for d in self.accounts: + dr_or_cr = "debit_in_account_currency" \ + if d.get("balance_in_account_currency") > 0 else "credit_in_account_currency" + + reverse_dr_or_cr = "debit_in_account_currency" \ + if dr_or_cr=="credit_in_account_currency" else "credit_in_account_currency" + + journal_entry_accounts.append({ + "account": d.get("account"), + "party_type": d.get("party_type"), + "party": d.get("party"), + "account_currency": d.get("account_currency"), + "balance": d.get("balance_in_account_currency"), + dr_or_cr: abs(d.get("balance_in_account_currency")), + "exchange_rate":d.get("new_exchange_rate"), + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name, + }) + journal_entry_accounts.append({ + "account": d.get("account"), + "party_type": d.get("party_type"), + "party": d.get("party"), + "account_currency": d.get("account_currency"), + "balance": d.get("balance_in_account_currency"), + reverse_dr_or_cr: abs(d.get("balance_in_account_currency")), + "exchange_rate": d.get("current_exchange_rate"), + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name + }) + + journal_entry_accounts.append({ + "account": unrealized_exchange_gain_loss_account, + "balance": get_balance_on(unrealized_exchange_gain_loss_account), + "debit_in_account_currency": abs(self.total_gain_loss) if self.total_gain_loss < 0 else 0, + "credit_in_account_currency": self.total_gain_loss if self.total_gain_loss > 0 else 0, + "exchange_rate": 1, + "reference_type": "Exchange Rate Revaluation", + "reference_name": self.name, + }) + + journal_entry.set("accounts", journal_entry_accounts) + journal_entry.set_amounts_in_company_currency() + journal_entry.set_total_debit_credit() + return journal_entry.as_dict() + +@frappe.whitelist() +def get_account_details(account, company, posting_date, party_type=None, party=None): + account_currency, account_type = frappe.db.get_value("Account", account, + ["account_currency", "account_type"]) + if account_type in ["Receivable", "Payable"] and not (party_type and party): + frappe.throw(_("Party Type and Party is mandatory for {0} account").format(account_type)) + + account_details = {} + company_currency = erpnext.get_company_currency(company) + balance = get_balance_on(account, party_type=party_type, party=party, in_account_currency=False) + if balance: + balance_in_account_currency = get_balance_on(account, party_type=party_type, party=party) + current_exchange_rate = balance / balance_in_account_currency if balance_in_account_currency else 0 + new_exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date) + new_balance_in_base_currency = balance_in_account_currency * new_exchange_rate + account_details = { + "account_currency": account_currency, + "balance_in_base_currency": balance, + "balance_in_account_currency": balance_in_account_currency, + "current_exchange_rate": current_exchange_rate, + "new_exchange_rate": new_exchange_rate, + "new_balance_in_base_currency": new_balance_in_base_currency + } + + return account_details \ No newline at end of file diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json index 66561a0718..e834266e19 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json +++ b/erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json @@ -50,16 +50,142 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "balance_in_base_currency", + "fieldname": "party_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party Type", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "party", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party", + "length": 0, + "no_copy": 0, + "options": "party_type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Account Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_account_currency", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, - "label": "Balance In Base Currency", + "label": "Balance In Account Currency", "length": 0, "no_copy": 0, "permlevel": 0, @@ -81,8 +207,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "balance_in_alternate_currency", - "fieldtype": "Currency", + "fieldname": "balances", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -90,14 +216,14 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Balance In Alternate Currency", + "label": "", "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -137,6 +263,67 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "balance_in_base_currency", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Balance In Base Currency", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_9", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -205,7 +392,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "difference", + "fieldname": "gain_loss", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, @@ -214,7 +401,7 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Difference", + "label": "Gain/Loss", "length": 0, "no_copy": 0, "permlevel": 0, @@ -241,7 +428,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 18:30:57.531401", + "modified": "2018-05-05 17:03:03.512559", "modified_by": "Administrator", "module": "Accounts", "name": "Exchange Rate Revaluation Account", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 886b5f1a79..916c71f20f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -96,7 +96,7 @@ "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", - "options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry", + "options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry\nExchange Rate Revaluation", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1553,7 +1553,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-05-02 11:12:55.090374", + "modified": "2018-05-05 13:11:33.696498", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 91eea22464..f9ffbcdbd7 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -151,7 +151,7 @@ class JournalEntry(AccountsController): if (d.party_type == 'Customer' and flt(d.credit) > 0) or \ (d.party_type == 'Supplier' and flt(d.debit) > 0): if d.is_advance=="No": - msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.").format(d.idx, d.account)) + msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.").format(d.idx, d.account), alert=True) elif d.reference_type in ("Sales Order", "Purchase Order") and d.is_advance != "Yes": frappe.throw(_("Row {0}: Payment against Sales/Purchase Order should always be marked as advance").format(d.idx)) diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index 98a2a2947f..eddcd5ecd3 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -44,6 +44,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "250px" }, @@ -75,6 +76,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -107,6 +109,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -142,6 +145,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "180px" }, @@ -171,6 +175,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -201,6 +206,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -231,6 +237,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -262,6 +269,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -294,6 +302,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -325,6 +334,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -354,6 +364,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -384,6 +395,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -413,6 +425,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -444,6 +457,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -477,6 +491,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -505,6 +520,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -536,6 +552,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -569,6 +586,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -598,6 +616,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -618,7 +637,7 @@ "label": "Reference Type", "length": 0, "no_copy": 0, - "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance", + "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance\nExchange Rate Revaluation", "permlevel": 0, "precision": "", "print_hide": 0, @@ -629,6 +648,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -660,8 +680,42 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan', 'Employee Advance'])", + "fieldname": "reference_due_date", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reference Due Date", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -691,6 +745,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -719,6 +774,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -751,6 +807,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -782,6 +839,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -795,7 +853,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-12-07 19:54:19.851534", + "modified": "2018-05-05 17:50:25.961397", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation-submit.png new file mode 100644 index 0000000000000000000000000000000000000000..98f629f9b9fc3d93f689d7f9bee8f23b41bd74e0 GIT binary patch literal 63451 zcmd43WmH_v_a+)AArL$`ghm=CxI=)(T^sKNg1b9}V2!77C%8j!hXi*B?gV#hXrzH= z$ou~OGqcvrU3bl$FL!@Ab!4Btcb#*p>OA|Y3RO{(#zZGUfAr`PrmPG|?a`y>_>Uev z$$R}Xtt@{eEhUs-Kcn*%vxM-@_cTeh5Jy~Q#f{QE1cq5w*vPVT(zTC#r+Ji2?-!TE3T z121;Q<9~}y{wEm!mc}r3AcPM^Po037nX%bfn!uZ;caIWbd|GcSrh2RrA> z)kMa>sHi9kRhH-O=P$1qd}2@h>a-n0X`NUPl?_3pd&zbF131V1RQz80a0eF|Oi3HsL=?Eb3URqOwS6V}1TeKR=1Z zYYvNtqnELdlyAYN`;|_IG9eVNdQ|!stK(tES^oyvgn;N}i0Oi$=&o##Q*ZiW;6LHp ztD=W=MvAo0Q2u$IwGhvrFjW|*TPsJmk9FDf$n5J}6&N*ZCA{LT%zpMqK8u&4UFhsg z_ArLC)~0=ll9fJQ+KWo)azN>CMShii^~u3i?0r64O1Ys)~DVRw!scR}Rmf;P+= z6zq@f4uaBKDh1p_jEV)?)4;f{ZeKNBo$2y? z2@iC(b6`8zaPMwB&ZX=W8vUzcuX=`jsvEgyT|ZtNFLJMQdHbxPG~LH+cTldq%p(JV z=Q@s1C}2A@q_(|PzHBvV!m+T#kg3@lbQjV~`}_PG-nonI{Gxf{7$q3{X59WaUaEW8 zx z8)L?O+ohC%E-cUqvyW{rid{-4XZIdyZom&p(~R$xA7nDfYGZwMPIb9l3u!rBRr0E5 z3PU_E5%qC8gdtfCv9!NVOuG2A6|LytpZ0^wF^=rGn z4#|sbK+{3|lw#PVSpVs^2Kz3XezU1p`lNfeOL(xGH6^QOKo+N`JIxCr%qOD_PXVfC zo39#30*rnxVFUJ5V9P4En_D@C6B~kbz)XuGuOG52R*TJ^OK-p(HF{=|8rU$u<2`Oc z{a5O?8Ql33qX~VPH#zOE`wSXf2QQjN76k2Oa|nk?UGvE=y~Ko;T!2g5VMEMwHs|w> z$m|sQ3<{qww*C2h{!vGH1uJw+x@KGp?SA*WU?M?RYf-FG?&-p^ofeINz8Z$k@m=WD z;gPB*#={kE5|Sz~*Sle`E~_?moMCIn#T7=N&9$9PU40XV+{Bq}N~$lNnHa{iyOzR3 zSqHB^Kj*V8Z?7+ep+s6{?@gk~IhPkbGE2T7ZbsdvXqDQ0N0M))$ZtdzEfLS2!*bKa zt!gmRg{Xv2(^7thE8gavw?9Y5?Kn+qHAyG}WQn!XlhVqY8;}qXNpZN)K&jX%A-IzD zhf@BRKUVwVjsZGiAR4YoesauT--zPhmkNkDsKj)AD#M9I)75A_8xzCenco+}%(4&6 z{(hm2h*s@j_qRh?vJe2)g8_H3jo3<@hM9v zMOZ6)Z&sPB?KGximnXYhKdc4r)@zHWyx>poX;q#;qFCaeR@l}8-%EC7kK;8y6 zt$Yf8zm9IJ9e00|!85*#C-i(C=e$%wQ8HXoH2HB&Wq!|LHeioO&3_0NX;OK!f0{I!eU>;ib!$>Zx!dgq=iZNzh9 z4MHcaig9IIgrySl{J(e-o6h8K-BV*H~WJ_$|!OhZmYk;{8g37jqvfkmI*k)N_FBz1$kW6GD40aHpD_`xuzZA@AKVDxB;@)(;q-9p=N`8_9L3B1

HJmDs;S$U)VX<8+!$bWwBlhhWz^ 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 G&;A$Y-3b%` literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/exchange-rate-revaluation.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd584b7a9143693928c2e51a37220a34dec1c55 GIT binary patch literal 65694 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png b/erpnext/docs/assets/img/accounts/exchange-rate-revaluation/journal-entry.png new file mode 100644 index 0000000000000000000000000000000000000000..cf204bb2b69532f6c3968120f7410c49b6545a2d GIT binary patch literal 67372 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 z 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 + +You can also assign / modify the currency by opening specific Account record for existing Accounts. + +Modify Account Currency + +### Exchange Rate Revaluation + +Exchange Rate Revaluation feature is for dealing the situation when you have a multiple currency accounts in one company's chart of accounts + +Steps : + +1. Set the 'Unrealized Exchange / Gain Loss Account' field in Company DocType. This aacount is to balance the difference of total credit and total debit. + +Field Set for Comapny + +2. Select the Company. + +3. Click the Get Entries button. It shows the accounts which having different currency as compare to 'Default Currency' in Company DocType. It will fetch the new exchange rate automatically if not set in Currency Exchange DocType for that currency else it will fetch the 'Exchange Rate' from Currency Exchange DocType + +Exchange Rate Revaluation + +4. On Submitting, 'Make Journal Entry' button will appear. This will create a journal entry for the Exchange Rate Revaluation. + +Exchange Rate Revaluation Submitting + +Journal Entry \ No newline at end of file diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 7c060d852d..e164d6949f 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -197,6 +197,7 @@ erpnext.company.setup_queries = function(frm) { ["round_off_account", {"root_type": "Expense"}], ["write_off_account", {"root_type": "Expense"}], ["exchange_gain_loss_account", {"root_type": "Expense"}], + ["unrealized_exchange_gain_loss_account", {"root_type": "Expense"}], ["accumulated_depreciation_account", {"root_type": "Asset", "account_type": "Accumulated Depreciation"}], ["depreciation_expense_account", {"root_type": "Expense", "account_type": "Depreciation"}], diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 1a21887f2e..66b1433eb1 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -42,6 +42,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -105,6 +107,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -135,6 +138,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -165,6 +169,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +198,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -223,6 +229,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -254,6 +261,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -284,6 +292,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -314,6 +323,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -345,6 +355,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -374,6 +385,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -405,6 +417,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -434,6 +447,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -465,6 +479,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -496,6 +511,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -526,6 +542,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -556,6 +573,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -585,6 +603,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -615,6 +634,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -646,6 +666,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -678,6 +699,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -710,6 +732,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -740,6 +763,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -770,6 +794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -800,6 +825,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -833,6 +859,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -864,6 +891,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -897,6 +925,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -928,6 +957,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -959,6 +989,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -990,6 +1021,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "unrealized_exchange_gain_loss_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Unrealized Exchange Gain/Loss Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1019,6 +1083,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1053,6 +1118,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1084,6 +1150,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1115,6 +1182,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1146,6 +1214,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1178,6 +1247,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1209,6 +1279,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1238,6 +1309,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1269,6 +1341,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1298,6 +1371,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1331,6 +1405,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1363,6 +1438,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1393,6 +1469,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1424,6 +1501,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1455,6 +1533,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1485,6 +1564,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1514,6 +1594,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1544,6 +1625,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1574,6 +1656,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1604,6 +1687,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1635,6 +1719,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1666,6 +1751,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1696,6 +1782,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1725,6 +1812,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1756,6 +1844,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1787,6 +1876,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1817,6 +1907,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1847,6 +1938,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1876,6 +1968,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1905,6 +1998,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1937,6 +2031,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1969,6 +2064,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2001,6 +2097,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2033,6 +2130,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2064,6 +2162,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2095,6 +2194,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -2128,6 +2228,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2158,6 +2259,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2188,6 +2290,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2218,6 +2321,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2248,6 +2352,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -2278,6 +2383,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -2294,7 +2400,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-04-18 19:45:22.357643", + "modified": "2018-05-05 13:08:07.351655", "modified_by": "Administrator", "module": "Setup", "name": "Company", @@ -2302,7 +2408,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -2322,7 +2427,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2342,7 +2446,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2362,7 +2465,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2382,7 +2484,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2402,7 +2503,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -2422,7 +2522,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From d5220c0ff47759a344a81e67f0dc8da399046bda Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 7 May 2018 12:22:57 +0530 Subject: [PATCH 055/154] minor fix --- erpnext/hr/doctype/employee/employee_dashboard.py | 4 ++++ erpnext/hr/doctype/employee_transfer/employee_transfer.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/erpnext/hr/doctype/employee/employee_dashboard.py b/erpnext/hr/doctype/employee/employee_dashboard.py index 0f95020306..e1e1fcedcd 100644 --- a/erpnext/hr/doctype/employee/employee_dashboard.py +++ b/erpnext/hr/doctype/employee/employee_dashboard.py @@ -25,6 +25,10 @@ def get_data(): { 'label': _('Evaluation'), 'items': ['Appraisal'] + }, + { + 'label': _('Employee Lifecycle'), + 'items': ['Employee Transfer', 'Employee Promotion'] } ] } \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py index d80e293bbb..b58d334d29 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.py +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py @@ -13,6 +13,8 @@ class EmployeeTransfer(Document): def validate(self): if frappe.get_value("Employee", self.employee, "status") == "Left": frappe.throw(_("Cannot transfer Employee with status Left")) + if self.new_company and self.company == self.new_company: + frappe.throw_("New Company must be different from current company") def before_submit(self): if getdate(self.transfer_date) > getdate(): @@ -23,6 +25,8 @@ class EmployeeTransfer(Document): employee = frappe.get_doc("Employee", self.employee) if self.create_new_employee_id: new_employee = frappe.copy_doc(employee) + new_employee.name = None + new_employee.employee_number = None new_employee = update_employee(new_employee, self.transfer_details) if self.new_company: new_employee.company = self.new_company From 95c5c055f890a20a2ee0a97194ea002345c95526 Mon Sep 17 00:00:00 2001 From: Ranjith Kurungadam Date: Mon, 7 May 2018 12:43:08 +0530 Subject: [PATCH 056/154] Optional leave (#13931) * Optional Holiday - move holiday list from leave type to leave period * Optional Leave - validate on Leave Application * test Optional Leaves --- .../leave_application/leave_application.py | 20 ++- .../test_leave_application.py | 60 +++---- .../hr/doctype/leave_period/leave_period.json | 50 ++++-- erpnext/hr/doctype/leave_type/leave_type.json | 149 ++++-------------- 4 files changed, 117 insertions(+), 162 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index b33bd5444e..23514e16e2 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.utils import cint, cstr, date_diff, flt, formatdate, getdate, get_link_to_form, \ - comma_or, get_fullname -from erpnext.hr.utils import set_employee_name + comma_or, get_fullname, add_days +from erpnext.hr.utils import set_employee_name, get_leave_period from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee @@ -15,6 +15,7 @@ class OverlapError(frappe.ValidationError): pass class InvalidLeaveApproverError(frappe.ValidationError): pass class LeaveApproverIdentityError(frappe.ValidationError): pass class AttendanceAlreadyMarkedError(frappe.ValidationError): pass +class NotAnOptionalHoliday(frappe.ValidationError): pass from frappe.model.document import Document class LeaveApplication(Document): @@ -31,6 +32,8 @@ class LeaveApplication(Document): self.validate_block_days() self.validate_salary_processed_days() self.validate_attendance() + if frappe.db.get_value("Leave Type", self.leave_type, 'is_optional_leave'): + self.validate_optional_leave() def on_update(self): if self.status == "Open" and self.docstatus < 1: @@ -207,6 +210,19 @@ class LeaveApplication(Document): frappe.throw(_("Attendance for employee {0} is already marked for this day").format(self.employee), AttendanceAlreadyMarkedError) + def validate_optional_leave(self): + leave_period = get_leave_period(self.from_date, self.to_date, self.company) + if not leave_period: + frappe.throw(_("Cannot find active Leave Period")) + optional_holiday_list = frappe.db.get_value("Leave Period", leave_period[0]["name"], "optional_holiday_list") + if not optional_holiday_list: + frappe.throw(_("Optional Holiday List not set for leave period {0}").format(leave_period[0]["name"])) + day = getdate(self.from_date) + while day <= getdate(self.to_date): + if not frappe.db.exists({"doctype": "Holiday", "parent": optional_holiday_list, "holiday_date": day}): + frappe.throw(_("{0} is not in Optional Holiday List").format(formatdate(day)), NotAnOptionalHoliday) + day = add_days(day, 1) + def notify_employee(self): employee = frappe.get_doc("Employee", self.employee) if not employee.user_id: diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index 424da90791..e71357c2ed 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -5,8 +5,9 @@ from __future__ import unicode_literals import frappe import unittest -from erpnext.hr.doctype.leave_application.leave_application import LeaveDayBlockedError, OverlapError +from erpnext.hr.doctype.leave_application.leave_application import LeaveDayBlockedError, OverlapError, NotAnOptionalHoliday, get_leave_balance_on from frappe.permissions import clear_user_permissions_for_doctype +from frappe.utils import add_days, nowdate test_dependencies = ["Leave Allocation", "Leave Block List"] @@ -225,55 +226,54 @@ class TestLeaveApplication(unittest.TestCase): frappe.db.set_value("Leave Block List", "_Test Leave Block List", "applies_to_all_departments", 0) - + def test_optional_leave(self): - '''''' leave_period = get_leave_period() - today = get_today() - + today = nowdate() + from datetime import date holiday_list = frappe.get_doc(dict( doctype = 'Holiday List', - name = 'test holiday list for optional holiday', - from_date = year_start_date(), - to_date = year_end_date(), + holiday_list_name = 'test holiday list for optional holiday', + from_date = date(date.today().year, 1, 1), + to_date = date(date.today().year, 12, 31), holidays = [ dict(holiday_date = today, description = 'test') ] - )) + )).insert() employee = get_employee() - - frappe.db.set_value('Employee', employee, 'holiday_list', holiday_list) - + + frappe.db.set_value('Leave Period', leave_period.name, 'optional_holiday_list', holiday_list.name) + leave_type = frappe.get_doc(dict( leave_type_name = 'Test Optional Type', doctype = 'Leave Type', - is_optional_leave = 1, - holiday_list = holiday_list + is_optional_leave = 1 )).insert() - + allocate_leaves(employee, leave_period, leave_type.name, 10) - - date = get_today() - 1 - + + date = add_days(today, - 1) + leave_application = frappe.get_doc(dict( doctype = 'Leave Application', - employee = employee, + employee = employee.name, leave_type = leave_type.name, from_date = date, to_date = date, )) - + # can only apply on optional holidays self.assertTrue(NotAnOptionalHoliday, leave_application.insert) - + leave_application.from_date = today leave_application.to_date = today + leave_application.status = "Approved" leave_application.insert() leave_application.submit() - + # check leave balance is reduced - self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 9) - + self.assertEqual(get_leave_balance_on(employee.name, leave_type.name, today), 9) + def test_leaves_allowed(self): # TODO: test cannot allocate more than max leaves pass @@ -285,7 +285,7 @@ class TestLeaveApplication(unittest.TestCase): def test_max_continuous_leaves(self): # TODO: test cannot take continuous leaves more than pass - + def test_earned_leave(self): leave_period = get_leave_period() employee = get_employee() @@ -297,14 +297,14 @@ class TestLeaveApplication(unittest.TestCase): earned_leave_frequency = 'Monthly', rounding = 0.5 )).insert() - + allocate_leaves(employee, leave_period, leave_type.name, 0, eligible_leaves = 12) - + # this method will be called by scheduler allocate_earned_leaves(leave_type.name, leave_period, as_on = half_of_leave_period) - + self.assertEqual(get_leave_balance(employee, leave_period, leave_type.name), 6) - + def make_allocation_record(employee=None, leave_type=None): frappe.db.sql("delete from `tabLeave Allocation`") @@ -319,4 +319,4 @@ def make_allocation_record(employee=None, leave_type=None): }) allocation.insert(ignore_permissions=True) - allocation.submit() \ No newline at end of file + allocation.submit() diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json index 946ceec238..516d52d975 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.json +++ b/erpnext/hr/doctype/leave_period/leave_period.json @@ -41,7 +41,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -72,7 +71,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -102,7 +100,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -134,7 +131,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -165,7 +161,37 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "optional_holiday_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Holiday List for Optional Leave", + "length": 0, + "no_copy": 0, + "options": "Holiday List", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -196,7 +222,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -227,7 +252,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -259,7 +283,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -291,7 +314,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -323,7 +345,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -355,7 +376,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -386,7 +406,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -416,7 +435,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -447,7 +465,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -461,7 +478,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 13:29:57.066314", + "modified": "2018-05-04 18:25:06.719932", "modified_by": "Administrator", "module": "HR", "name": "Leave Period", @@ -470,6 +487,7 @@ "permissions": [ { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -489,6 +507,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -508,6 +527,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 1d1aef2045..aad7e7b9c5 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -41,7 +41,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -73,7 +72,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -104,7 +102,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -136,7 +133,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -166,7 +162,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -198,7 +193,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -228,7 +222,36 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_optional_leave", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Optional Leave", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -258,7 +281,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -288,7 +310,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -319,7 +340,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -350,7 +370,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -382,7 +401,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -413,7 +431,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -445,7 +462,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -478,102 +494,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "section_break_13", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Optional Leave", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_optional_leave", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Optional Leave", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_optional_leave", - "fieldname": "holiday_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Holiday List", - "length": 0, - "no_copy": 0, - "options": "Holiday List", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -604,7 +524,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -635,7 +554,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -668,7 +586,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -701,7 +618,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -716,7 +632,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 14:36:46.824289", + "modified": "2018-05-03 19:42:23.852331", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", @@ -724,6 +640,7 @@ "permissions": [ { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -743,6 +660,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -762,6 +680,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From e4cda0380aa5dd07f33752b49a3dba15c2e2cf15 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Mon, 7 May 2018 13:54:49 +0530 Subject: [PATCH 057/154] Staffing Plan - validations, get employee count on designation change, calc estimated cost --- .../hr/doctype/staffing_plan/staffing_plan.js | 88 +++++++++- .../doctype/staffing_plan/staffing_plan.json | 5 +- .../hr/doctype/staffing_plan/staffing_plan.py | 47 +++++- .../staffing_plan_detail.json | 156 +++++++++++------- 4 files changed, 228 insertions(+), 68 deletions(-) diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.js b/erpnext/hr/doctype/staffing_plan/staffing_plan.js index 3cadfc56c5..17f03e67bf 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.js +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.js @@ -2,7 +2,91 @@ // For license information, please see license.txt frappe.ui.form.on('Staffing Plan', { - refresh: function(frm) { - + setup: function(frm) { + frm.set_query("designation", "staffing_details", function() { + let designations = []; + $.each(frm.doc.staffing_details, function(index, staff_detail) { + if(staff_detail.designation){ + designations.push(staff_detail.designation) + } + }) + // Filter out designations already selected in Staffing Plan Detail + return { + filters: [ + ['Designation', 'name', 'not in', designations], + ] + } + }); } }); + +frappe.ui.form.on('Staffing Plan Detail', { + designation: function(frm, cdt, cdn) { + let child = locals[cdt][cdn] + if(child.designation){ + frappe.call({ + "method": "erpnext.hr.doctype.staffing_plan.staffing_plan.get_current_employee_count", + args: { + designation: child.designation + }, + callback: function (data) { + if(data.message){ + frappe.model.set_value(cdt, cdn, 'current_count', data.message); + } + else{ // No employees for this designation + frappe.model.set_value(cdt, cdn, 'current_count', 0); + } + } + }); + } + }, + + number_of_positions: function(frm, cdt, cdn) { + set_vacancies(frm, cdt, cdn); + }, + + current_count: function(frm, cdt, cdn) { + set_vacancies(frm, cdt, cdn); + }, + + estimated_cost_per_position: function(frm, cdt, cdn) { + let child = locals[cdt][cdn]; + set_total_estimated_cost(frm, cdt, cdn); + } + +}); + +var set_vacancies = function(frm, cdt, cdn) { + let child = locals[cdt][cdn] + if(child.number_of_positions) { + frappe.model.set_value(cdt, cdn, 'vacancies', child.number_of_positions - child.current_count); + } + else{ + frappe.model.set_value(cdt, cdn, 'vacancies', 0); + } + set_total_estimated_cost(frm, cdt, cdn); +} + +// Note: Estimated Cost is calculated on number of Vacancies +var set_total_estimated_cost = function(frm, cdt, cdn) { + let child = locals[cdt][cdn] + if(child.number_of_positions && child.estimated_cost_per_position) { + frappe.model.set_value(cdt, cdn, 'total_estimated_cost', child.vacancies * child.estimated_cost_per_position); + } + else { + frappe.model.set_value(cdt, cdn, 'total_estimated_cost', 0); + } + set_total_estimated_budget(frm); +}; + +var set_total_estimated_budget = function(frm) { + let estimated_budget = 0.0 + if(frm.doc.staffing_details) { + $.each(frm.doc.staffing_details, function(index, staff_detail) { + if(staff_detail.total_estimated_cost){ + estimated_budget += staff_detail.total_estimated_cost + } + }) + frm.set_value('total_estimated_budget', estimated_budget); + } +} diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.json b/erpnext/hr/doctype/staffing_plan/staffing_plan.json index a5d26e6d4f..229cc05ddd 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.json +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.json @@ -268,6 +268,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "default": "0.00", "fieldname": "total_estimated_budget", "fieldtype": "Currency", "hidden": 0, @@ -284,7 +285,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -335,7 +336,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:45:16.729979", + "modified": "2018-04-18 19:10:34.394249", "modified_by": "Administrator", "module": "HR", "name": "Staffing Plan", diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.py b/erpnext/hr/doctype/staffing_plan/staffing_plan.py index 510d2dcc49..588e536b42 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.py +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.py @@ -5,6 +5,51 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document +from frappe import _ +from frappe.utils import getdate, nowdate class StaffingPlan(Document): - pass + def validate(self): + # Validate Dates + if self.from_date and self.to_date and self.from_date > self.to_date: + frappe.throw(_("From Date cannot be greater than To Date")) + + # Validate if any submitted Staffing Plan exist for Designations in this plan + # and spd.vacancies>0 ? + for detail in self.get("staffing_details"): + overlap = (frappe.db.sql("""select spd.parent \ + from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name \ + where spd.designation='{0}' and sp.docstatus=1 \ + and sp.to_date >= '{1}' and sp.from_date <='{2}'""".format(detail.designation, self.from_date, self.to_date))) + + if overlap and overlap [0][0]: + frappe.throw(_("Staffing Plan {0} already exist for designation {1}".format(overlap[0][0], detail.designation))) + +@frappe.whitelist() +def get_current_employee_count(designation): + if not designation: + return False + employee_count = frappe.db.sql("""select count(*) from `tabEmployee` where \ + designation = '{0}' and status='Active'""".format(designation))[0][0] + return employee_count + +@frappe.whitelist() +def get_active_staffing_plan_and_vacancies(company, designation, department=None, date=getdate(nowdate())): + if not company or not designation: + frappe.throw(_("Please select Company and Designation")) + + conditions = "spd.designation='{0}' and sp.docstatus=1 and \ + sp.company='{1}'".format(designation, company) + + if(department): #Department is an optional field + conditions += " and sp.department='{0}'".format(department) + + if(date): #ToDo: Date should be mandatory? + conditions += " and '{0}' between sp.from_date and sp.to_date".format(date) + + staffing_plan = frappe.db.sql("""select spd.parent, spd.vacancies \ + from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name + where {0}""".format(conditions)) + + # Only a signle staffing plan can be active for a designation on given date + return staffing_plan[0] if staffing_plan else False diff --git a/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json index 7c395647be..eb77b43914 100644 --- a/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json +++ b/erpnext/hr/doctype/staffing_plan_detail/staffing_plan_detail.json @@ -75,68 +75,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "current_count", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Current Count", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "vacancies", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Vacancies", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -190,6 +128,36 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, @@ -198,6 +166,68 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "current_count", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Current Count", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "vacancies", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Vacancies", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -210,7 +240,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-13 18:39:52.783341", + "modified": "2018-04-15 16:09:12.622186", "modified_by": "Administrator", "module": "HR", "name": "Staffing Plan Detail", From f220e89d9f9848c318a58543b468a487a9f2d7bb Mon Sep 17 00:00:00 2001 From: Ranjith Date: Mon, 7 May 2018 13:58:54 +0530 Subject: [PATCH 058/154] Job Opening - get planned opening, validate vacancies by Staffing Plan --- erpnext/hr/doctype/job_opening/job_opening.js | 39 +++++++++++++++++++ .../hr/doctype/job_opening/job_opening.json | 35 ++++++++++++++++- erpnext/hr/doctype/job_opening/job_opening.py | 15 +++++++ 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/job_opening/job_opening.js b/erpnext/hr/doctype/job_opening/job_opening.js index e69de29bb2..b024310339 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.js +++ b/erpnext/hr/doctype/job_opening/job_opening.js @@ -0,0 +1,39 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Job Opening', { + designation: function(frm) { + if(frm.doc.designation && frm.doc.company){ + frappe.call({ + "method": "erpnext.hr.doctype.staffing_plan.staffing_plan.get_active_staffing_plan_and_vacancies", + args: { + company: frm.doc.company, + designation: frm.doc.designation, + department: frm.doc.department, + date: frappe.datetime.now_date() // ToDo - Date in Job Opening? + }, + callback: function (data) { + if(data.message){ + frm.set_value('staffing_plan', data.message[0]); + frm.set_value('planned_vacancies', data.message[1]); + } + else{ + frm.set_value('staffing_plan', ""); + frm.set_value('planned_vacancies', 0); + frappe.show_alert({ + indicator: 'orange', + message: __('No Staffing Plans found for this Designation') + }); + } + } + }); + } + else{ + frm.set_value('staffing_plan', ""); + frm.set_value('planned_vacancies', 0); + } + }, + company: function(frm) { + frm.set_value('designation', ""); + } +}); diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json index de15114a43..a877119809 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.json +++ b/erpnext/hr/doctype/job_opening/job_opening.json @@ -224,7 +224,38 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "planned_vacancies", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Planned number of Positions", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -369,7 +400,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 18:52:56.109392", + "modified": "2018-04-18 19:27:15.004385", "modified_by": "Administrator", "module": "HR", "name": "Job Opening", diff --git a/erpnext/hr/doctype/job_opening/job_opening.py b/erpnext/hr/doctype/job_opening/job_opening.py index 60c911a016..d3d662a743 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.py +++ b/erpnext/hr/doctype/job_opening/job_opening.py @@ -8,6 +8,7 @@ import frappe from frappe.website.website_generator import WebsiteGenerator from frappe import _ +from erpnext.hr.doctype.staffing_plan.staffing_plan import get_current_employee_count, get_active_staffing_plan_and_vacancies class JobOpening(WebsiteGenerator): website = frappe._dict( @@ -20,6 +21,20 @@ class JobOpening(WebsiteGenerator): if not self.route: self.route = frappe.scrub(self.job_title).replace('_', '-') + if self.staffing_plan: + self.validate_current_vacancies() + + def validate_current_vacancies(self): + current_count = get_current_employee_count(self.designation) + current_count+= frappe.db.sql("""select count(*) from `tabJob Opening` \ + where designation = '{0}' and status='Open'""".format(self.designation))[0][0] + + vacancies = get_active_staffing_plan_and_vacancies(self.company, self.designation, self.department)[1] + # set staffing_plan too? + if vacancies and vacancies <= current_count: + frappe.throw(_("Job Openings for designation {0} already opened or hiring \ + completed as per Staffing Plan {1}".format(self.designation, self.staffing_plan))) + def get_context(self, context): context.parents = [{'route': 'jobs', 'title': _('All Jobs') }] From c36578e8d34cc3b3f534c2d5071d3560b8f0980d Mon Sep 17 00:00:00 2001 From: Ranjith Date: Mon, 7 May 2018 14:19:40 +0530 Subject: [PATCH 059/154] Job Opening - display vacancies only on staffing plan --- erpnext/hr/doctype/job_opening/job_opening.json | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json index a877119809..79064390d1 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.json +++ b/erpnext/hr/doctype/job_opening/job_opening.json @@ -41,7 +41,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -73,7 +72,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -104,7 +102,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -134,7 +131,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -166,7 +162,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -198,7 +193,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -230,7 +224,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -239,6 +232,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "staffing_plan", "fieldname": "planned_vacancies", "fieldtype": "Int", "hidden": 0, @@ -261,7 +255,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -291,7 +284,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -322,7 +314,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -354,7 +345,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 1 }, { @@ -385,7 +375,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -400,7 +389,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-18 19:27:15.004385", + "modified": "2018-05-07 14:16:50.300247", "modified_by": "Administrator", "module": "HR", "name": "Job Opening", @@ -408,6 +397,7 @@ "permissions": [ { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -427,6 +417,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From 330fae8652ecafa1f5a88d0826d3b6e1057a01a3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 7 May 2018 16:11:35 +0530 Subject: [PATCH 060/154] minor fixes --- .../doctype/sales_invoice/sales_invoice.py | 18 +- erpnext/config/hr.py | 16 - .../employee_benefit_claim.json | 2 + .../employee_lifecycle_activity/__init__.py | 0 .../employee_lifecycle_activity.js | 8 - .../employee_lifecycle_activity.json | 227 ------------- .../employee_lifecycle_activity.py | 10 - .../test_employee_lifecycle_activity.js | 23 -- .../test_employee_lifecycle_activity.py | 10 - .../__init__.py | 0 .../employee_lifecycle_activity_type.js | 8 - .../employee_lifecycle_activity_type.json | 163 --------- .../employee_lifecycle_activity_type.py | 10 - .../test_employee_lifecycle_activity_type.js | 23 -- .../test_employee_lifecycle_activity_type.py | 10 - .../employee_lifecycle_process/__init__.py | 0 .../employee_lifecycle_process.js | 8 - .../employee_lifecycle_process.json | 320 ------------------ .../employee_lifecycle_process.py | 10 - .../test_employee_lifecycle_process.js | 23 -- .../test_employee_lifecycle_process.py | 10 - .../__init__.py | 0 .../employee_lifecycle_process_template.js | 8 - .../employee_lifecycle_process_template.json | 194 ----------- .../employee_lifecycle_process_template.py | 10 - ...est_employee_lifecycle_process_template.js | 23 -- ...est_employee_lifecycle_process_template.py | 10 - .../__init__.py | 0 ...e_lifecycle_process_template_activity.json | 137 -------- ...plate_activity.py~Added links in HR module | 10 - ...ifecycle_process_template_activity.py~HEAD | 10 - ...y.py~HEAD => employee_property_history.py} | 0 ...se] Patch and child table changes (#13656) | 10 - .../shift_assignment/shift_assignment.json | 4 - .../create_salary_structure_assignments.py | 6 - 35 files changed, 12 insertions(+), 1309 deletions(-) delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/__init__.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/__init__.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template_activity/__init__.py delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module delete mode 100644 erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD rename erpnext/hr/doctype/employee_property_history/{employee_property_history.py~HEAD => employee_property_history.py} (100%) delete mode 100644 erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 17e45ac971..f27d3775b7 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1097,20 +1097,22 @@ def make_inter_company_invoice(doctype, source_name, target_doc=None): target_doc.customer = details.get("party") target_doc.selling_price_list = source_doc.buying_price_list - def update_item(source_doc, target_doc, source_parent): - target_doc.income_account = "" - target_doc.expense_account = "" - target_doc.cost_center = "" - target_doc.warehouse = "" - doclist = get_mapped_doc(doctype, source_name, { doctype: { "doctype": target_doctype, - "postprocess": update_details + "postprocess": update_details, + "field_no_map": [ + "taxes_and_charges" + ] }, doctype +" Item": { "doctype": target_doctype + " Item", - "postprocess": update_item + "field_no_map": [ + "income_account", + "expense_account", + "cost_center", + "warehouse" + ] } }, target_doc, set_missing_values) diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index cdb7180756..4e9e91ef3b 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -196,22 +196,6 @@ def get_data(): { "type": "doctype", "name": "Employee Promotion", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Activity", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Activity Type", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Process Template", - }, - { - "type": "doctype", - "name": "Employee Lifecycle Process", } ] }, diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json index fed15edf84..00d5159c51 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -459,3 +459,5 @@ "sort_order": "DESC", "title_field": "employee_name", "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/__init__.py b/erpnext/hr/doctype/employee_lifecycle_activity/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js deleted file mode 100644 index 4cd5f0f06d..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Lifecycle Activity', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json deleted file mode 100644 index 28b22fd318..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "prompt", - "beta": 0, - "creation": "2018-04-13 17:58:34.106717", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "activity_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Activity Type", - "length": 0, - "no_copy": 0, - "options": "Activity Type", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee_lifecycle_process", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Lifecycle Process", - "length": 0, - "no_copy": 0, - "options": "Employee Lifecycle Process", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Pending\nCompleted", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Lifecycle Activity", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 18:48:06.800183", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Lifecycle Activity", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py b/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py deleted file mode 100644 index a8770310aa..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity/employee_lifecycle_activity.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleActivity(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js deleted file mode 100644 index 64a28d9d68..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Lifecycle Activity", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Lifecycle Activity - () => frappe.tests.make('Employee Lifecycle Activity', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py b/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py deleted file mode 100644 index e90de0f6f9..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity/test_employee_lifecycle_activity.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeLifecycleActivity(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js deleted file mode 100644 index 7935e4fd34..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Lifecycle Activity Type', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json deleted file mode 100644 index 793b79a71b..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "ELAT.#####", - "beta": 0, - "creation": "2018-04-13 17:34:21.728815", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "activity_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Activity Type", - "length": 0, - "no_copy": 0, - "options": "Activity Type", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "before_employee_creation", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Before Employee Creation", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 19:02:22.731902", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Lifecycle Activity Type", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py deleted file mode 100644 index aca6bd495b..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity_type/employee_lifecycle_activity_type.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleActivityType(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js deleted file mode 100644 index b775086ee5..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Lifecycle Activity Type", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Lifecycle Activity Type - () => frappe.tests.make('Employee Lifecycle Activity Type', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py b/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py deleted file mode 100644 index ff3e2c7aa3..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_activity_type/test_employee_lifecycle_activity_type.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeLifecycleActivityType(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js deleted file mode 100644 index 406436e05c..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Lifecycle Process', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json deleted file mode 100644 index 86b01582f1..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.json +++ /dev/null @@ -1,320 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "ELP.#####", - "beta": 0, - "creation": "2018-04-13 17:55:47.341454", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "job_applicant", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Job Applicant", - "length": 0, - "no_copy": 0, - "options": "Job Applicant", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Pending\nComplated", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lifecycle_process_details", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lifecycle Process Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "process_section", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Lifecycle Process Template Detail", - "length": 0, - "no_copy": 0, - "options": "Employee Lifecycle Process Template Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Lifecycle Process", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-13 19:00:17.008613", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Lifecycle Process", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py b/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py deleted file mode 100644 index 8f051184b7..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process/employee_lifecycle_process.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleProcess(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js deleted file mode 100644 index cd892d9a0f..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Lifecycle Process", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Lifecycle Process - () => frappe.tests.make('Employee Lifecycle Process', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py b/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py deleted file mode 100644 index f680311d51..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process/test_employee_lifecycle_process.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeLifecycleProcess(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process_template/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js deleted file mode 100644 index c9ce3d10c7..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Employee Lifecycle Process Template', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json deleted file mode 100644 index 582a94f4ac..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "ELCP.#####", - "beta": 0, - "creation": "2018-04-13 17:40:38.806266", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "process_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lifecycle Process Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "process_details", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Lifecycle Process Template Detail", - "length": 0, - "no_copy": 0, - "options": "Employee Lifecycle Process Template Activity", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Lifecycle Process Template", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-04-14 11:35:19.465613", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Lifecycle Process Template", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py b/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py deleted file mode 100644 index b6f3a438a0..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/employee_lifecycle_process_template.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleProcessTemplate(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js deleted file mode 100644 index 607ccd52fa..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Employee Lifecycle Process Template", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Employee Lifecycle Process Template - () => frappe.tests.make('Employee Lifecycle Process Template', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py b/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py deleted file mode 100644 index 916cfe1fd1..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template/test_employee_lifecycle_process_template.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestEmployeeLifecycleProcessTemplate(unittest.TestCase): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/__init__.py b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json deleted file mode 100644 index 6d3c96cf4b..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-14 11:34:30.508196", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee_lifecycle_activity_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee Lifecycle Activity Type ", - "length": 0, - "no_copy": 0, - "options": "Employee Lifecycle Activity Type", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "role", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Role", - "length": 0, - "no_copy": 0, - "options": "Role", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "user", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "User", - "length": 0, - "no_copy": 0, - "options": "User", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-04-14 11:34:30.508196", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Lifecycle Process Template Activity", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module deleted file mode 100644 index eeea2366b1..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~Added links in HR module +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleProcessTemplateActivity(Document): - pass diff --git a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD b/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD deleted file mode 100644 index eeea2366b1..0000000000 --- a/erpnext/hr/doctype/employee_lifecycle_process_template_activity/employee_lifecycle_process_template_activity.py~HEAD +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeeLifecycleProcessTemplateActivity(Document): - pass diff --git a/erpnext/hr/doctype/employee_property_history/employee_property_history.py~HEAD b/erpnext/hr/doctype/employee_property_history/employee_property_history.py similarity index 100% rename from erpnext/hr/doctype/employee_property_history/employee_property_history.py~HEAD rename to erpnext/hr/doctype/employee_property_history/employee_property_history.py diff --git a/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) b/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) deleted file mode 100644 index fb67852d16..0000000000 --- a/erpnext/hr/doctype/employee_property_history/employee_property_history.py~[Enterprise] Patch and child table changes (#13656) +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class EmployeePropertyHistory(Document): - pass diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.json b/erpnext/hr/doctype/shift_assignment/shift_assignment.json index 86c1708f5f..897cfed68a 100644 --- a/erpnext/hr/doctype/shift_assignment/shift_assignment.json +++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.json @@ -307,11 +307,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, -<<<<<<< HEAD "modified": "2018-04-17 14:50:09.125737", -======= - "modified": "2018-04-14 15:42:12.617715", ->>>>>>> Removed employee table from Salary Structure and added employee name in all forms "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py index cf7646bcf5..289554ee1a 100644 --- a/erpnext/patches/v11_0/create_salary_structure_assignments.py +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -7,14 +7,8 @@ import frappe def execute(): frappe.reload_doc("hr", "doctype", "salary_structure_assignment") for d in frappe.db.sql(""" -<<<<<<< HEAD select sse.*, ss.company from `tabSalary Structure Employee` sse, `tabSalary Structure` ss where ss.name = sse.parent""", as_dict=1): -======= - select * from `tabSalary Structure Employee` sse, `tabSalary Structure` ss - where ss.name = sse.parent""", as_dict=1): - ->>>>>>> Removed employee table from Salary Structure and added employee name in all forms s = frappe.new_doc("Salary Structure Assignment") s.employee = d.employee s.employee_name = d.employee_name From a9c82b6464af4c75f4c25aad36b9b0adcc2021c2 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:45:17 +0530 Subject: [PATCH 061/154] Attendance - link to attendance request --- erpnext/hr/doctype/attendance/attendance.json | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/attendance/attendance.json b/erpnext/hr/doctype/attendance/attendance.json index 2078eabc66..2d9c23f45a 100644 --- a/erpnext/hr/doctype/attendance/attendance.json +++ b/erpnext/hr/doctype/attendance/attendance.json @@ -295,6 +295,39 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "attendance_request", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Attendance Request", + "length": 0, + "no_copy": 0, + "options": "Attendance Request", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -339,7 +372,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-13 14:29:11.771376", + "modified": "2018-05-07 16:56:32.314683", "modified_by": "Administrator", "module": "HR", "name": "Attendance", From b41baa228c06ad204d3d32757c982204cb76442d Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:46:48 +0530 Subject: [PATCH 062/154] Attendance Request - link to company --- .../attendance_request.json | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.json b/erpnext/hr/doctype/attendance_request/attendance_request.json index e33acf35fe..e1a34c9c43 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.json +++ b/erpnext/hr/doctype/attendance_request/attendance_request.json @@ -232,6 +232,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -274,7 +306,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 15:38:14.344570", + "modified": "2018-04-19 16:56:23.758754", "modified_by": "Administrator", "module": "HR", "name": "Attendance Request", From 9d857579af6c88daa1f8ea294b9e67aa21ef060c Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:47:47 +0530 Subject: [PATCH 063/154] Attendance Request - validate and create attendance --- .../attendance_request/attendance_request.js | 1 + .../attendance_request/attendance_request.py | 46 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.js b/erpnext/hr/doctype/attendance_request/attendance_request.js index 76a28a056e..caf955aed1 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.js +++ b/erpnext/hr/doctype/attendance_request/attendance_request.js @@ -1,5 +1,6 @@ // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt +cur_frm.add_fetch('employee', 'company', 'company'); frappe.ui.form.on('Attendance Request', { refresh: function(frm) { diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.py b/erpnext/hr/doctype/attendance_request/attendance_request.py index 0114b99de3..eb0b3689c3 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.py +++ b/erpnext/hr/doctype/attendance_request/attendance_request.py @@ -5,6 +5,50 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document +from frappe.utils import date_diff, add_days +from erpnext.hr.doctype.employee.employee import is_holiday +from erpnext.hr.utils import validate_dates class AttendanceRequest(Document): - pass + def validate(self): + validate_dates(self, self.from_date, self.to_date) + + def on_submit(self): + self.create_attendance() + + def on_cancel(self): + attendance_list = frappe.get_list("Attendance", {'employee': self.employee, 'attendance_request': self.name}) + if attendance_list: + for attendance in attendance_list: + attendance_obj = frappe.get_doc("Attendance", attendance['name']) + attendance_obj.cancel() + + def create_attendance(self): + request_days = date_diff(self.to_date, self.from_date) + 1 + for number in range(request_days): + attendance_date = add_days(self.from_date, number) + skip_attendance = self.validate_if_attendance_not_applicable(attendance_date) + if not skip_attendance: + attendance = frappe.new_doc("Attendance") + attendance.employee = self.employee + attendance.employee_name = self.employee_name + attendance.status = "Present" + attendance.attendance_date = attendance_date + attendance.company = self.company + attendance.attendance_request = self.name + attendance.save(ignore_permissions=True) + attendance.submit() + + def validate_if_attendance_not_applicable(self, attendance_date): + # Check if attendance_date is a Holiday + if is_holiday(self.employee, attendance_date): + return True + + # Check if employee on Leave + leave_record = frappe.db.sql("""select half_day from `tabLeave Application` + where employee = %s and %s between from_date and to_date + and docstatus = 1""", (self.employee, attendance_date), as_dict=True) + if leave_record: + return True + + return False From 0e2cc5574dcbd59b1892ab7f711d25f5401879a6 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:48:25 +0530 Subject: [PATCH 064/154] HR Util methods --- erpnext/hr/utils.py | 89 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index 057f406e80..42bfacc191 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -4,8 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import formatdate, format_datetime -from frappe.utils import getdate, get_datetime +from frappe.utils import formatdate, format_datetime, getdate, get_datetime, nowdate def set_employee_name(doc): if doc.employee and not doc.employee_name: @@ -49,3 +48,89 @@ def update_employee(employee, details, cancel=False): new_data = get_datetime(new_data) setattr(employee, item.fieldname, new_data) return employee + +def validate_dates(doc, from_date, to_date): + date_of_joining, relieving_date = frappe.db.get_value("Employee", doc.employee, ["date_of_joining", "relieving_date"]) + if getdate(from_date) > getdate(to_date): + frappe.throw(_("To date can not be less than from date")) + elif getdate(from_date) > getdate(nowdate()): + frappe.throw(_("Future dates not allowed")) + elif date_of_joining and getdate(from_date) < getdate(date_of_joining): + frappe.throw(_("From date can not be less than employee's joining date")) + elif relieving_date and getdate(to_date) > getdate(relieving_date): + frappe.throw(_("To date can not greater than employee's relieving date")) + +def validate_overlap(doc, from_date, to_date, company = None): + query = """ + select name + from `tab{0}` + where name != %(name)s + """ + query += get_doc_condition(doc.doctype) + + if not doc.name: + # hack! if name is null, it could cause problems with != + doc.name = "New "+doc.doctype + + overlap_doc = frappe.db.sql(query.format(doc.doctype),{ + "employee": doc.employee, + "from_date": from_date, + "to_date": to_date, + "name": doc.name, + "company": company + }, as_dict = 1) + + if overlap_doc: + exists_for = doc.employee + if company: + exists_for = company + throw_overlap_error(doc, exists_for, overlap_doc[0].name, from_date, to_date) + +def get_doc_condition(doctype): + if doctype == "Compensatory Leave Request": + return "and employee = %(employee)s and docstatus < 2 \ + and (work_from_date between %(from_date)s and %(to_date)s \ + or work_end_date between %(from_date)s and %(to_date)s \ + or (work_from_date < %(from_date)s and work_end_date > %(to_date)s))" + elif doctype == "Leave Period": + return "and company = %(company)s and (from_date between %(from_date)s and %(to_date)s \ + or to_date between %(from_date)s and %(to_date)s \ + or (from_date < %(from_date)s and to_date > %(to_date)s))" + +def throw_overlap_error(doc, exists_for, overlap_doc, from_date, to_date): + msg = _("A {0} exists between {1} and {2} (").format(doc.doctype, + formatdate(from_date), formatdate(to_date)) \ + + """ {1}""".format(doc.doctype, overlap_doc) \ + + _(") for {0}").format(exists_for) + frappe.throw(msg) + +def get_employee_leave_policy(employee): + leave_policy = frappe.db.get_value("Employee", employee, "leave_policy") + if not leave_policy: + employee_grade = frappe.db.get_value("Employee", employee, "grade") + if employee_grade: + leave_policy = frappe.db.get_value("Employee Grade", employee_grade, "default_leave_policy") + if not leave_policy: + frappe.throw(_("Employee {0} of grade {1} have no default leave policy").format(employee, employee_grade)) + else: + frappe.throw(_("Employee {0} has no grade to get default leave policy").format(employee)) + if leave_policy: + return frappe.get_doc("Leave Policy", leave_policy) + +def get_leave_period(from_date, to_date, company): + leave_period = frappe.db.sql(""" + select name, from_date, to_date + from `tabLeave Period` + where company=%(company)s and is_active=1 + and (from_date between %(from_date)s and %(to_date)s + or to_date between %(from_date)s and %(to_date)s + or (from_date < %(from_date)s and to_date > %(to_date)s)) + """, { + "from_date": from_date, + "to_date": to_date, + "company": company + }, as_dict=1) + + if leave_period: + return leave_period + From c7aaf0ba67270968530a7921d0d755e6c2b5b468 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:53:31 +0530 Subject: [PATCH 065/154] Leave Period - Validate and Create Leave Allocation --- .../hr/doctype/leave_period/leave_period.js | 23 +++++- .../hr/doctype/leave_period/leave_period.json | 2 +- .../hr/doctype/leave_period/leave_period.py | 73 ++++++++++++++++++- 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/doctype/leave_period/leave_period.js b/erpnext/hr/doctype/leave_period/leave_period.js index 2a6010e44f..9229f0b89c 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.js +++ b/erpnext/hr/doctype/leave_period/leave_period.js @@ -2,7 +2,26 @@ // For license information, please see license.txt frappe.ui.form.on('Leave Period', { - refresh: function(frm) { - + refresh: (frm)=>{ + frm.set_df_property("grant_leaves", "hidden", frm.doc.__islocal ? 1:0); + }, + from_date: (frm)=>{ + if (frm.doc.from_date && !frm.doc.to_date) { + var a_year_from_start = frappe.datetime.add_months(frm.doc.from_date, 12); + frm.set_value("to_date", frappe.datetime.add_days(a_year_from_start, -1)); + } + }, + grant: (frm)=>{ + frappe.call({ + doc: frm.doc, + method: "grant_leave_allocation", + callback: function(r) { + if(!r.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: __("Grant allocations......") + }); } }); diff --git a/erpnext/hr/doctype/leave_period/leave_period.json b/erpnext/hr/doctype/leave_period/leave_period.json index 516d52d975..0f3cad4970 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.json +++ b/erpnext/hr/doctype/leave_period/leave_period.json @@ -478,7 +478,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-04 18:25:06.719932", + "modified": "2018-05-07 18:25:06.719932", "modified_by": "Administrator", "module": "HR", "name": "Leave Period", diff --git a/erpnext/hr/doctype/leave_period/leave_period.py b/erpnext/hr/doctype/leave_period/leave_period.py index 619336a8a9..1ef6f196d4 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.py +++ b/erpnext/hr/doctype/leave_period/leave_period.py @@ -4,7 +4,78 @@ from __future__ import unicode_literals import frappe +from frappe import _ +from frappe.utils import getdate, cstr from frappe.model.document import Document +from erpnext.hr.utils import validate_overlap, get_employee_leave_policy class LeavePeriod(Document): - pass + def get_employees(self): + conditions, values = [], [] + for field in ["grade", "designation", "department"]: + if self.get(field): + conditions.append("{0}=%s".format(field)) + values.append(self.get(field)) + + condition_str = " and " + " and ".join(conditions) if len(conditions) else "" + + e = frappe.db.sql("select name from tabEmployee where status='Active' {condition}" + .format(condition=condition_str), tuple(values)) + + return e + + def validate(self): + self.validate_dates() + validate_overlap(self, self.from_date, self.to_date, self.company) + + def grant_leave_allocation(self): + if self.employee: + self.grant_leave_alloc(self.employee) + else: + self.grant_leave_alloc_for_employees() + + def grant_leave_alloc_for_employees(self): + employees = self.get_employees() + if employees: + for employee in employees: + self.grant_leave_alloc(cstr(employee[0])) + else: + frappe.msgprint(_("No employee found")) + + def grant_leave_alloc(self, employee): + self.validate_allocation_exists(employee) + leave_policy = get_employee_leave_policy(employee) + if leave_policy: + for leave_policy_detail in leave_policy.leave_policy_details: + if not frappe.db.get_value("Leave Type", leave_policy_detail.leave_type, "is_lwp"): + self.create_leave_allocation(employee, leave_policy_detail.leave_type, leave_policy_detail.annual_allocation) + + def validate_allocation_exists(self, employee): + leave_alloc = frappe.db.exists({ + "doctype": "Leave Allocation", + "employee": employee, + "leave_period": self.name, + "docstatus": 1}) + if leave_alloc: + frappe.throw(_("Employee {0} already have Leave Allocation {1} for this period").format(employee, leave_alloc[0][0])\ + + """ {0}""".format(leave_alloc[0][0])) + + + def validate_dates(self): + if getdate(self.from_date) >= getdate(self.to_date): + frappe.throw(_("To date can not be equal or less than from date")) + + def create_leave_allocation(self, employee, leave_type, new_leaves_allocated): + allocation = frappe.new_doc("Leave Allocation") + allocation.employee = employee + allocation.employee_name = frappe.db.get_value("Employee", employee, "employee_name") + allocation.leave_type = leave_type + allocation.from_date = self.from_date + allocation.to_date = self.to_date + allocation.new_leaves_allocated = new_leaves_allocated + allocation.leave_period = self.name + if self.carry_forward_leaves: + if frappe.db.get_value("Leave Type", leave_type, "is_carry_forward"): + allocation.carry_forward = self.carry_forward_leaves + allocation.save(ignore_permissions = True) + allocation.submit() From 8c4386f0164759c7c4f0f0b3f3541bc4ee465290 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:54:40 +0530 Subject: [PATCH 066/154] Leave Type - new field is_compensatory --- erpnext/hr/doctype/leave_type/leave_type.json | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index aad7e7b9c5..4b002088ad 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -342,6 +342,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_compensatory", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Compensatory", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, From b408b158dd81f0c608fb464aad3196c37fd1ba82 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:18:21 +0530 Subject: [PATCH 067/154] Leave allocation - link to leave period and compensatory leave request --- .../leave_allocation/leave_allocation.json | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json index 9b4a26e7d6..c1758aa3dd 100644 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.json +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.json @@ -432,6 +432,71 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "compensatory_request", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Compensatory Leave Request", + "length": 0, + "no_copy": 0, + "options": "Compensatory Leave Request", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "leave_period", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Leave Period", + "length": 0, + "no_copy": 0, + "options": "Leave Period", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -478,7 +543,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-11-10 18:41:38.845159", + "modified": "2018-04-19 19:34:59.248428", "modified_by": "Administrator", "module": "HR", "name": "Leave Allocation", From b42f3d41ab468d3f7d2979900087555b28a101c9 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:19:55 +0530 Subject: [PATCH 068/154] Compensatory Leave Request - Validate and Create leave allocation for compnsatory leave type --- .../compensatory_leave_request.js | 8 +++- .../compensatory_leave_request.py | 37 ++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js index 28553e35fc..bb57562988 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.js @@ -3,6 +3,12 @@ frappe.ui.form.on('Compensatory Leave Request', { refresh: function(frm) { - + frm.set_query("leave_type", function() { + return { + filters: { + "is_compensatory": true + } + }; + }); } }); diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index b51b46c80f..ec522281c3 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -4,9 +4,42 @@ from __future__ import unicode_literals import frappe +from frappe import _ +from frappe.utils import date_diff from frappe.model.document import Document +from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period class CompensatoryLeaveRequest(Document): - def validate_present(self): - pass + def validate(self): + validate_dates(self, self.work_from_date, self.work_end_date) + validate_overlap(self, self.work_from_date, self.work_end_date) + + def on_submit(self): + if not self.leave_type: + frappe.throw(_("Please select a leave type to submit the request")) + else: + company = frappe.db.get_value("Employee", self.employee, "company") + leave_period = get_leave_period(self.work_from_date, self.work_end_date, company) + if leave_period: + self.create_leave_allocation(leave_period) + else: + frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date)) + + def create_leave_allocation(self, leave_period): + date_difference = date_diff(self.work_end_date, self.work_from_date) + 1 + is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") + allocation = frappe.new_doc("Leave Allocation") + allocation.employee = self.employee + allocation.employee_name = self.employee_name + allocation.leave_type = self.leave_type + allocation.from_date = self.work_from_date + allocation.to_date = self.work_end_date + allocation.new_leaves_allocated = date_difference + allocation.total_leaves_allocated = date_difference + allocation.compensatory_request = self.name + allocation.description = self.reason + if is_carry_forward == 1: + allocation.carry_forward = True + allocation.save(ignore_permissions = True) + allocation.submit() From d7bfa2303f3585c323556770011a9e0403cbfda7 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:22:04 +0530 Subject: [PATCH 069/154] Leave allocation - validate max leave allocation days for a leave type --- .../leave_allocation/leave_allocation.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py index 58a7f30093..8432cfe254 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -6,7 +6,7 @@ import frappe from frappe.utils import flt, date_diff, formatdate from frappe import _ from frappe.model.document import Document -from erpnext.hr.utils import set_employee_name +from erpnext.hr.utils import set_employee_name, get_leave_period from erpnext.hr.doctype.leave_application.leave_application import get_approved_leaves_for_period class OverlapError(frappe.ValidationError): pass @@ -25,6 +25,20 @@ class LeaveAllocation(Document): self.validate_total_leaves_allocated() self.validate_lwp() set_employee_name(self) + self.validate_leave_allocation_days() + + def validate_leave_allocation_days(self): + company = frappe.db.get_value("Employee", self.employee, "company") + leave_period = get_leave_period(self.from_date, self.to_date, company) + max_leaves_allowed = frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed") + if max_leaves_allowed > 0: + leave_allocated = 0 + if leave_period: + leave_allocated = get_leave_allocation_for_period(self.employee, self.leave_type, leave_period[0].from_date, leave_period[0].to_date) + leave_allocated += self.new_leaves_allocated + if leave_allocated > max_leaves_allowed: + frappe.throw(_("Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period")\ + .format(self.leave_type, self.employee)) def on_update_after_submit(self): self.validate_new_leaves_allocated_value() @@ -97,6 +111,29 @@ class LeaveAllocation(Document): else: frappe.throw(_("Total allocated leaves {0} cannot be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError) +def get_leave_allocation_for_period(employee, leave_type, from_date, to_date): + leave_allocated = 0 + leave_allocations = frappe.db.sql(""" + select employee, leave_type, from_date, to_date, total_leaves_allocated + from `tabLeave Allocation` + where employee=%(employee)s and leave_type=%(leave_type)s + and docstatus=1 + and (from_date between %(from_date)s and %(to_date)s + or to_date between %(from_date)s and %(to_date)s + or (from_date < %(from_date)s and to_date > %(to_date)s)) + """, { + "from_date": from_date, + "to_date": to_date, + "employee": employee, + "leave_type": leave_type + }, as_dict=1) + + if leave_allocations: + for leave_alloc in leave_allocations: + leave_allocated += leave_alloc.total_leaves_allocated + + return leave_allocated + @frappe.whitelist() def get_carry_forwarded_leaves(employee, leave_type, date, carry_forward=None): carry_forwarded_leaves = 0 From 62a93533fc3be605138951f234803a2f5880d168 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:24:39 +0530 Subject: [PATCH 070/154] Leave Policy - Validate Annual alloction for leave type --- .../hr/doctype/leave_policy/leave_policy.js | 25 ++++++++++++++++++- .../hr/doctype/leave_policy/leave_policy.py | 8 +++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.js b/erpnext/hr/doctype/leave_policy/leave_policy.js index 309215e778..fdf8e0cdbb 100644 --- a/erpnext/hr/doctype/leave_policy/leave_policy.js +++ b/erpnext/hr/doctype/leave_policy/leave_policy.js @@ -2,7 +2,30 @@ // For license information, please see license.txt frappe.ui.form.on('Leave Policy', { - refresh: function(frm) { +}); +frappe.ui.form.on('Leave Policy Detail',{ + leave_type: function(frm, cdt, cdn) { + var child = locals[cdt][cdn]; + if(child.leave_type){ + frappe.call({ + method: "frappe.client.get_value", + args: { + doctype: "Leave Type", + fieldname: "max_leaves_allowed", + filters: { name: child.leave_type } + }, + callback: function(r) { + if (r.message) { + child.annual_allocation = r.message.max_leaves_allowed; + refresh_field("leave_policy_details"); + } + } + }); + } + else{ + child.annual_allocation = ""; + refresh_field("leave_policy_details"); + } } }); diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.py b/erpnext/hr/doctype/leave_policy/leave_policy.py index 1da84c2e43..964a5de83e 100644 --- a/erpnext/hr/doctype/leave_policy/leave_policy.py +++ b/erpnext/hr/doctype/leave_policy/leave_policy.py @@ -4,7 +4,13 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document class LeavePolicy(Document): - pass + def validate(self): + if self.leave_policy_details: + for lp_detail in self.leave_policy_details: + max_leaves_allowed = frappe.db.get_value("Leave Type", lp_detail.leave_type, "max_leaves_allowed") + if max_leaves_allowed > 0 and lp_detail.annual_allocation > max_leaves_allowed: + frappe.throw(_("Maximum leave allowed in the leave type {0} is {1}").format(lp_detail.leave_type, max_leaves_allowed)) From 3153734e7e82182c425dc3c58fa5ef237c420c19 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:30:42 +0530 Subject: [PATCH 071/154] Leave Application - validate applicable after for leave type --- .../leave_application/leave_application.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index 23514e16e2..a46d6fe4d0 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -34,6 +34,7 @@ class LeaveApplication(Document): self.validate_attendance() if frappe.db.get_value("Leave Type", self.leave_type, 'is_optional_leave'): self.validate_optional_leave() + self.validate_applicable_after() def on_update(self): if self.status == "Open" and self.docstatus < 1: @@ -55,6 +56,21 @@ class LeaveApplication(Document): # notify leave applier about cancellation self.notify_employee() + def validate_applicable_after(self): + if self.leave_type: + leave_type = frappe.get_doc("Leave Type", self.leave_type) + if leave_type.applicable_after > 0: + date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining") + leave_days = get_approved_leaves_for_period(self.employee, False, date_of_joining, self.from_date) + number_of_days = date_diff(getdate(self.from_date), date_of_joining) + if number_of_days >= 0: + holidays = 0 + if not frappe.db.get_value("Leave Type", self.leave_type, "include_holiday"): + holidays = get_holidays(self.employee, date_of_joining, self.from_date) + number_of_days = number_of_days - leave_days - holidays + if number_of_days < leave_type.applicable_after: + frappe.throw(_("{0} applicable after {1} working days").format(self.leave_type, leave_type.applicable_after)) + def validate_dates(self): if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)): frappe.throw(_("To date cannot be before from date")) From fe882bc68a89ebefc6e427376f744201ba15940d Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:31:55 +0530 Subject: [PATCH 072/154] Leave Application - Test - Leave allowed, applicable after, maximum continuos days --- .../test_leave_application.py | 150 +++++++++++++++++- 1 file changed, 143 insertions(+), 7 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index e71357c2ed..9b9e964e3b 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -7,7 +7,7 @@ import unittest from erpnext.hr.doctype.leave_application.leave_application import LeaveDayBlockedError, OverlapError, NotAnOptionalHoliday, get_leave_balance_on from frappe.permissions import clear_user_permissions_for_doctype -from frappe.utils import add_days, nowdate +from frappe.utils import add_days, nowdate, now_datetime test_dependencies = ["Leave Allocation", "Leave Block List"] @@ -275,16 +275,119 @@ class TestLeaveApplication(unittest.TestCase): self.assertEqual(get_leave_balance_on(employee.name, leave_type.name, today), 9) def test_leaves_allowed(self): - # TODO: test cannot allocate more than max leaves - pass + employee = get_employee() + leave_period = get_leave_period() + frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1) + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type', + doctype = 'Leave Type', + max_leaves_allowed = 5 + )).insert() + + date = add_days(nowdate(), -7) + + allocate_leaves(employee, leave_period, leave_type.name, 5) + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee.name, + leave_type = leave_type.name, + from_date = date, + to_date = add_days(date, 2), + company = "_Test Company", + docstatus = 1, + status = "Approved" + )) + + self.assertTrue(leave_application.insert()) + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee.name, + leave_type = leave_type.name, + from_date = add_days(date, 4), + to_date = add_days(date, 7), + company = "_Test Company", + docstatus = 1, + status = "Approved" + )) + self.assertRaises(frappe.ValidationError, leave_application.insert) def test_applicable_after(self): - # TODO: test not applicable until applicable working days - pass + employee = get_employee() + leave_period = get_leave_period() + frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1) + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type', + doctype = 'Leave Type', + applicable_after = 15 + )).insert() + + date = add_days(nowdate(), -7) + + allocate_leaves(employee, leave_period, leave_type.name, 10) + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee.name, + leave_type = leave_type.name, + from_date = date, + to_date = add_days(date, 4), + company = "_Test Company", + docstatus = 1, + status = "Approved" + )) + + self.assertRaises(frappe.ValidationError, leave_application.insert) + + frappe.delete_doc_if_exists("Leave Type", "Test Leave Type 1", force=1) + leave_type_1 = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type 1', + doctype = 'Leave Type' + )).insert() + + allocate_leaves(employee, leave_period, leave_type_1.name, 10) + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee.name, + leave_type = leave_type_1.name, + from_date = date, + to_date = add_days(date, 4), + company = "_Test Company", + docstatus = 1, + status = "Approved" + )) + + self.assertTrue(leave_application.insert()) def test_max_continuous_leaves(self): - # TODO: test cannot take continuous leaves more than - pass + employee = get_employee() + leave_period = get_leave_period() + frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1) + leave_type = frappe.get_doc(dict( + leave_type_name = 'Test Leave Type', + doctype = 'Leave Type', + max_leaves_allowed = 15, + max_days_allowed = 3 + )).insert() + + date = add_days(nowdate(), -7) + + allocate_leaves(employee, leave_period, leave_type.name, 10) + + leave_application = frappe.get_doc(dict( + doctype = 'Leave Application', + employee = employee.name, + leave_type = leave_type.name, + from_date = date, + to_date = add_days(date, 4), + company = "_Test Company", + docstatus = 1, + status = "Approved" + )) + + self.assertRaises(frappe.ValidationError, leave_application.insert) def test_earned_leave(self): leave_period = get_leave_period() @@ -320,3 +423,36 @@ def make_allocation_record(employee=None, leave_type=None): allocation.insert(ignore_permissions=True) allocation.submit() + +def get_employee(): + return frappe.get_doc("Employee", "_T-Employee-00001") + +def get_leave_period(): + leave_period_name = frappe.db.exists({ + "doctype": "Leave Period", + "name": "Test Leave Period" + }) + if leave_period_name: + return frappe.get_doc("Leave Period", leave_period_name[0][0]) + else: + return frappe.get_doc(dict( + name = 'Test Leave Period', + doctype = 'Leave Period', + from_date = "{0}-01-01".format(now_datetime().year), + to_date = "{0}-12-31".format(now_datetime().year), + company = "_Test Company", + is_active = 1 + )).insert() + +def allocate_leaves(employee, leave_period, leave_type, new_leaves_allocated, eligible_leaves=0): + frappe.get_doc({ + "doctype": "Leave Allocation", + "__islocal": 1, + "employee": employee.name, + "employee_name": employee.employee_name, + "leave_type": leave_type, + "from_date": leave_period.from_date, + "to_date": leave_period.to_date, + "new_leaves_allocated": new_leaves_allocated, + "docstatus": 1 + }).insert() From bec950428c800540174878510e48540477c78b9e Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 12:50:14 +0530 Subject: [PATCH 073/154] HR Utils - Trailing whitespace --- erpnext/hr/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index 42bfacc191..826e09b1b9 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -133,4 +133,3 @@ def get_leave_period(from_date, to_date, company): if leave_period: return leave_period - From 3e47fbb2f0b1019c3eb8ee1edf48e7b828837015 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 8 May 2018 16:05:04 +0530 Subject: [PATCH 074/154] assign salary structure custom button --- .../doctype/salary_structure/salary_structure.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js index 8e5f8e651f..3de01cd303 100755 --- a/erpnext/hr/doctype/salary_structure/salary_structure.js +++ b/erpnext/hr/doctype/salary_structure/salary_structure.js @@ -47,8 +47,18 @@ frappe.ui.form.on('Salary Structure', { frm.fields_dict['earnings'].grid.set_column_disp("default_amount", false); frm.fields_dict['deductions'].grid.set_column_disp("default_amount", false); - frm.add_custom_button(__("Preview Salary Slip"), - function() { frm.trigger('preview_salary_slip'); }, "fa fa-sitemap", "btn-default"); + frm.add_custom_button(__("Preview Salary Slip"), function() { + frm.trigger('preview_salary_slip'); + }); + + if(frm.doc.docstatus==1) { + frm.add_custom_button(__("Assign Salary Structure"), function() { + var doc = frappe.model.get_new_doc('Salary Structure Assignment'); + doc.salary_structure = frm.doc.name; + doc.company = frm.doc.company; + frappe.set_route('Form', 'Salary Structure Assignment', doc.name); + }); + } }, salary_slip_based_on_timesheet: function(frm) { From 4573e6609f80d0097e92c1a3010256932dde71c4 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 18:33:49 +0530 Subject: [PATCH 075/154] Leave Type - remove field is_parental_leave --- erpnext/hr/doctype/leave_type/leave_type.json | 54 +++++++------------ 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/erpnext/hr/doctype/leave_type/leave_type.json b/erpnext/hr/doctype/leave_type/leave_type.json index 4b002088ad..48284296e8 100644 --- a/erpnext/hr/doctype/leave_type/leave_type.json +++ b/erpnext/hr/doctype/leave_type/leave_type.json @@ -41,6 +41,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -72,6 +73,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -102,6 +104,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -133,6 +136,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -162,6 +166,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +198,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -222,6 +228,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -252,6 +259,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -281,6 +289,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -310,36 +319,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_parental_leave", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Parental Leave", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -401,6 +381,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -432,6 +413,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -462,6 +444,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -493,6 +476,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -525,6 +509,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -555,6 +540,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -585,6 +571,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -617,6 +604,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -649,6 +637,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -663,7 +652,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-03 19:42:23.852331", + "modified": "2018-05-08 18:32:51.803472", "modified_by": "Administrator", "module": "HR", "name": "Leave Type", @@ -671,7 +660,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -691,7 +679,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -711,7 +698,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, From 3881e98000cdf69f72f5d0c2e190b51b3a7ad06c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 8 May 2018 18:36:14 +0530 Subject: [PATCH 076/154] Staffing plan for group company --- erpnext/hr/doctype/job_opening/job_opening.js | 45 +++++++++---------- erpnext/hr/doctype/job_opening/job_opening.py | 35 ++++++++++----- .../hr/doctype/staffing_plan/staffing_plan.js | 5 ++- .../hr/doctype/staffing_plan/staffing_plan.py | 37 +++++++++------ 4 files changed, 73 insertions(+), 49 deletions(-) diff --git a/erpnext/hr/doctype/job_opening/job_opening.js b/erpnext/hr/doctype/job_opening/job_opening.js index b024310339..960f5b3c65 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.js +++ b/erpnext/hr/doctype/job_opening/job_opening.js @@ -2,38 +2,37 @@ // For license information, please see license.txt frappe.ui.form.on('Job Opening', { - designation: function(frm) { - if(frm.doc.designation && frm.doc.company){ + designation: function(frm) { + if(frm.doc.designation && frm.doc.company){ frappe.call({ "method": "erpnext.hr.doctype.staffing_plan.staffing_plan.get_active_staffing_plan_and_vacancies", args: { - company: frm.doc.company, - designation: frm.doc.designation, - department: frm.doc.department, - date: frappe.datetime.now_date() // ToDo - Date in Job Opening? + company: frm.doc.company, + designation: frm.doc.designation, + department: frm.doc.department, + date: frappe.datetime.now_date() // ToDo - Date in Job Opening? }, callback: function (data) { if(data.message){ frm.set_value('staffing_plan', data.message[0]); - frm.set_value('planned_vacancies', data.message[1]); + frm.set_value('planned_vacancies', data.message[1]); + } else { + frm.set_value('staffing_plan', ""); + frm.set_value('planned_vacancies', 0); + frappe.show_alert({ + indicator: 'orange', + message: __('No Staffing Plans found for this Designation') + }); } - else{ - frm.set_value('staffing_plan', ""); - frm.set_value('planned_vacancies', 0); - frappe.show_alert({ - indicator: 'orange', - message: __('No Staffing Plans found for this Designation') - }); - } } }); } - else{ - frm.set_value('staffing_plan', ""); - frm.set_value('planned_vacancies', 0); - } - }, - company: function(frm) { - frm.set_value('designation', ""); - } + else{ + frm.set_value('staffing_plan', ""); + frm.set_value('planned_vacancies', 0); + } + }, + company: function(frm) { + frm.set_value('designation', ""); + } }); diff --git a/erpnext/hr/doctype/job_opening/job_opening.py b/erpnext/hr/doctype/job_opening/job_opening.py index d3d662a743..b579d6f24a 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.py +++ b/erpnext/hr/doctype/job_opening/job_opening.py @@ -20,20 +20,33 @@ class JobOpening(WebsiteGenerator): def validate(self): if not self.route: self.route = frappe.scrub(self.job_title).replace('_', '-') - - if self.staffing_plan: - self.validate_current_vacancies() + self.validate_current_vacancies() def validate_current_vacancies(self): - current_count = get_current_employee_count(self.designation) - current_count+= frappe.db.sql("""select count(*) from `tabJob Opening` \ - where designation = '{0}' and status='Open'""".format(self.designation))[0][0] + if not self.staffing_plan: + vacancies = get_active_staffing_plan_and_vacancies(self.company, + self.designation, self.department) + if vacancies: + self.staffing_plan = vacancies[0] + self.planned_vacancies = vacancies[1] + elif not self.planned_vacancies: + planned_vacancies = frappe.db.sql(""" + select vacancies from `tabStaffing Plan Detail` + where parent=%s and designation=%s""", (self.staffing_plan, self.designation)) + self.planned_vacancies = planned_vacancies[0][0] if planned_vacancies else None - vacancies = get_active_staffing_plan_and_vacancies(self.company, self.designation, self.department)[1] - # set staffing_plan too? - if vacancies and vacancies <= current_count: - frappe.throw(_("Job Openings for designation {0} already opened or hiring \ - completed as per Staffing Plan {1}".format(self.designation, self.staffing_plan))) + if self.staffing_plan and self.planned_vacancies: + staffing_plan_company = frappe.db.get_value("Staffing Plan", self.staffing_plan, "company") + lft, rgt = frappe.db.get_value("Company", staffing_plan_company, ["lft", "rgt"]) + + current_count = get_current_employee_count(self.designation, staffing_plan_company) + current_count+= frappe.db.sql("""select count(*) from `tabJob Opening` \ + where designation=%s and status='Open' + and company in (select name from tabCompany where lft>=%s and rgt<=%s) + """, (self.designation, lft, rgt))[0][0] + + if self.planned_vacancies <= current_count: + frappe.throw(_("Job Openings for designation {0} and company {1} already opened or hiring completed as per Staffing Plan {2}".format(self.designation, staffing_plan_company, self.staffing_plan))) def get_context(self, context): context.parents = [{'route': 'jobs', 'title': _('All Jobs') }] diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.js b/erpnext/hr/doctype/staffing_plan/staffing_plan.js index 17f03e67bf..1c1a720088 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.js +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.js @@ -23,11 +23,12 @@ frappe.ui.form.on('Staffing Plan', { frappe.ui.form.on('Staffing Plan Detail', { designation: function(frm, cdt, cdn) { let child = locals[cdt][cdn] - if(child.designation){ + if(frm.doc.company && child.designation){ frappe.call({ "method": "erpnext.hr.doctype.staffing_plan.staffing_plan.get_current_employee_count", args: { - designation: child.designation + designation: child.designation, + company: frm.doc.company }, callback: function (data) { if(data.message){ diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.py b/erpnext/hr/doctype/staffing_plan/staffing_plan.py index 588e536b42..37ff5cbc90 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.py +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.py @@ -20,36 +20,47 @@ class StaffingPlan(Document): overlap = (frappe.db.sql("""select spd.parent \ from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name \ where spd.designation='{0}' and sp.docstatus=1 \ - and sp.to_date >= '{1}' and sp.from_date <='{2}'""".format(detail.designation, self.from_date, self.to_date))) + and sp.to_date >= '{1}' and sp.from_date <='{2}'""" + .format(detail.designation, self.from_date, self.to_date))) if overlap and overlap [0][0]: - frappe.throw(_("Staffing Plan {0} already exist for designation {1}".format(overlap[0][0], detail.designation))) + frappe.throw(_("Staffing Plan {0} already exist for designation {1}" + .format(overlap[0][0], detail.designation))) @frappe.whitelist() -def get_current_employee_count(designation): +def get_current_employee_count(designation, company): if not designation: return False - employee_count = frappe.db.sql("""select count(*) from `tabEmployee` where \ - designation = '{0}' and status='Active'""".format(designation))[0][0] + + lft, rgt = frappe.db.get_value("Company", company, ["lft", "rgt"]) + employee_count = frappe.db.sql("""select count(*) from `tabEmployee` + where designation = %s and status='Active' + and company in (select name from tabCompany where lft>=%s and rgt<=%s) + """, (designation, lft, rgt))[0][0] return employee_count -@frappe.whitelist() def get_active_staffing_plan_and_vacancies(company, designation, department=None, date=getdate(nowdate())): if not company or not designation: frappe.throw(_("Please select Company and Designation")) - conditions = "spd.designation='{0}' and sp.docstatus=1 and \ - sp.company='{1}'".format(designation, company) - + conditions = "" if(department): #Department is an optional field - conditions += " and sp.department='{0}'".format(department) + conditions += " and sp.department='{0}'".format(frappe.db.escape(department)) if(date): #ToDo: Date should be mandatory? conditions += " and '{0}' between sp.from_date and sp.to_date".format(date) - staffing_plan = frappe.db.sql("""select spd.parent, spd.vacancies \ + staffing_plan = frappe.db.sql(""" + select sp.name, spd.vacancies from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name - where {0}""".format(conditions)) + where company=%s and spd.designation=%s and sp.docstatus=1 {0} + """.format(conditions), (company, designation)) + + if not staffing_plan: + parent_company = frappe.db.get_value("Company", company, "parent_company") + if parent_company: + staffing_plan = get_active_staffing_plan_and_vacancies(parent_company, + designation, department, date) # Only a signle staffing plan can be active for a designation on given date - return staffing_plan[0] if staffing_plan else False + return staffing_plan[0] if staffing_plan else None From 63a8f83076fa6a8a9535c61592ce746c8ed489df Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 18:45:41 +0530 Subject: [PATCH 077/154] Leaves - Documentation --- .../img/human-resources/earned-leave.png | Bin 0 -> 21593 bytes .../img/human-resources/employee-grade.png | Bin 0 -> 50483 bytes .../human-resources/employee-leave-policy.png | Bin 0 -> 80853 bytes .../img/human-resources/leave-encashment.png | Bin 0 -> 24553 bytes .../img/human-resources/leave-period-1.png | Bin 0 -> 52815 bytes .../img/human-resources/leave-period-2.png | Bin 0 -> 92074 bytes .../human-resources/leave-period-grant.png | Bin 0 -> 91457 bytes .../img/human-resources/leave-policy.png | Bin 0 -> 66492 bytes .../img/human-resources/new-leave-type.png | Bin 122274 -> 90241 bytes .../user/manual/en/human-resources/index.md | 2 +- .../en/human-resources/leave-application.md | 8 +- .../user/manual/en/human-resources/leave.md | 107 +++++++++++++----- 12 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 erpnext/docs/assets/img/human-resources/earned-leave.png create mode 100644 erpnext/docs/assets/img/human-resources/employee-grade.png create mode 100644 erpnext/docs/assets/img/human-resources/employee-leave-policy.png create mode 100644 erpnext/docs/assets/img/human-resources/leave-encashment.png create mode 100644 erpnext/docs/assets/img/human-resources/leave-period-1.png create mode 100644 erpnext/docs/assets/img/human-resources/leave-period-2.png create mode 100644 erpnext/docs/assets/img/human-resources/leave-period-grant.png create mode 100644 erpnext/docs/assets/img/human-resources/leave-policy.png diff --git a/erpnext/docs/assets/img/human-resources/earned-leave.png b/erpnext/docs/assets/img/human-resources/earned-leave.png new file mode 100644 index 0000000000000000000000000000000000000000..8a365b6b04bce36486695256f3ab5082fb41c411 GIT binary patch literal 21593 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�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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/human-resources/employee-leave-policy.png b/erpnext/docs/assets/img/human-resources/employee-leave-policy.png new file mode 100644 index 0000000000000000000000000000000000000000..10d11b8e22efb9e5591a295db35006bdbd70f517 GIT binary patch literal 80853 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 @@ -75,7 +75,7 @@ cur_frm.cscript.set_options_for_applicable_for = function() { options = $.merge(options, ["Customer", "Customer Group", "Territory", "Sales Partner", "Campaign"]); } if(cur_frm.doc.buying) { - $.merge(options, ["Supplier", "Supplier Type"]); + $.merge(options, ["Supplier", "Supplier Group"]); } set_field_options("applicable_for", options.join("\n")); diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index e047b6d67e..9b73fcd968 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -41,7 +41,7 @@ class PricingRule(Document): throw(_("Selling must be checked, if Applicable For is selected as {0}" .format(self.applicable_for))) - if not self.buying and self.applicable_for in ["Supplier", "Supplier Type"]: + if not self.buying and self.applicable_for in ["Supplier", "Supplier Group"]: throw(_("Buying must be checked, if Applicable For is selected as {0}" .format(self.applicable_for))) @@ -85,7 +85,7 @@ def apply_pricing_rule(args): "customer_group": "something", "territory": "something", "supplier": "something", - "supplier_type": "something", + "supplier_group": "something", "currency": "something", "conversion_rate": "something", "price_list": "something", @@ -165,10 +165,10 @@ def get_pricing_rule_for_item(args): if customer: args.customer_group, args.territory = customer - args.supplier = args.supplier_type = None + args.supplier = args.supplier_group = None - elif args.supplier and not args.supplier_type: - args.supplier_type = frappe.db.get_value("Supplier", args.supplier, "supplier_type") + elif args.supplier and not args.supplier_group: + args.supplier_group = frappe.db.get_value("Supplier", args.supplier, "supplier_group") args.customer = args.customer_group = args.territory = None pricing_rules = get_pricing_rules(args) @@ -258,7 +258,7 @@ def get_pricing_rules(args): conditions = item_variant_condition = "" values = {"item_code": args.get("item_code"), "brand": args.get("brand")} - for field in ["company", "customer", "supplier", "supplier_type", "campaign", "sales_partner"]: + for field in ["company", "customer", "supplier", "supplier_group", "campaign", "sales_partner"]: if args.get(field): conditions += " and ifnull("+field+", '') in (%("+field+")s, '')" values[field] = args.get(field) @@ -324,11 +324,11 @@ def filter_pricing_rules(args, pricing_rules): # apply internal priority all_fields = ["item_code", "item_group", "brand", "customer", "customer_group", "territory", - "supplier", "supplier_type", "campaign", "sales_partner", "variant_of"] + "supplier", "supplier_group", "campaign", "sales_partner", "variant_of"] if len(pricing_rules) > 1: for field_set in [["item_code", "variant_of", "item_group", "brand"], - ["customer", "customer_group", "territory"], ["supplier", "supplier_type"]]: + ["customer", "customer_group", "territory"], ["supplier", "supplier_group"]]: remaining_fields = list(set(all_fields) - set(field_set)) if if_all_rules_same(pricing_rules, remaining_fields): pricing_rules = apply_internal_priority(pricing_rules, field_set, args) diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js index 84c42a3da3..370890e4d8 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.js +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.js @@ -2,7 +2,7 @@ // License: GNU General Public License v3. See license.txt cur_frm.add_fetch("customer", "customer_group", "customer_group" ); -cur_frm.add_fetch("supplier", "supplier_type", "supplier_type" ); +cur_frm.add_fetch("supplier", "supplier_group_name", "supplier_group" ); frappe.ui.form.on("Tax Rule", "tax_type", function(frm) { frm.toggle_reqd("sales_tax_template", frm.doc.tax_type=="Sales"); diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py index ddef65799b..56bd2870ba 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -30,7 +30,7 @@ class TaxRule(Document): def validate_tax_template(self): if self.tax_type== "Sales": - self.purchase_tax_template = self.supplier = self.supplier_type = None + self.purchase_tax_template = self.supplier = self.supplier_group = None if self.customer: self.customer_group = None @@ -38,7 +38,7 @@ class TaxRule(Document): self.sales_tax_template = self.customer = self.customer_group = None if self.supplier: - self.supplier_type = None + self.supplier_group = None if not (self.sales_tax_template or self.purchase_tax_template): frappe.throw(_("Tax Template is mandatory.")) @@ -53,7 +53,7 @@ class TaxRule(Document): "customer": self.customer, "customer_group": self.customer_group, "supplier": self.supplier, - "supplier_type": self.supplier_type, + "supplier_group": self.supplier_group, "billing_city": self.billing_city, "billing_county": self.billing_county, "billing_state": self.billing_state, diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.py b/erpnext/buying/doctype/buying_settings/buying_settings.py index 1f0184b82c..a634a0908b 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.py +++ b/erpnext/buying/doctype/buying_settings/buying_settings.py @@ -10,7 +10,7 @@ from frappe.model.document import Document class BuyingSettings(Document): def validate(self): - for key in ["supplier_type", "supp_master_name", "maintain_same_rate", "buying_price_list"]: + for key in ["supplier_group", "supp_master_name", "maintain_same_rate", "buying_price_list"]: frappe.db.set_default(key, self.get(key, "")) from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index de87e04443..2ff80755df 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -61,11 +61,11 @@ frappe.ui.form.on("Request for Quotation",{ fields: [ { "fieldtype": "Select", "label": __("Get Suppliers By"), "fieldname": "search_type", - "options": "Tag\nSupplier Type", "reqd": 1 }, - { "fieldtype": "Link", "label": __("Supplier Type"), - "fieldname": "supplier_type", - "options": "Supplier Type", "reqd": 0, - "depends_on": "eval:doc.search_type == 'Supplier Type'"}, + "options": "Tag\nSupplier Group", "reqd": 1 }, + { "fieldtype": "Link", "label": __("Supplier Group"), + "fieldname": "supplier_group", + "options": "Supplier Group", "reqd": 0, + "depends_on": "eval:doc.search_type == 'Supplier Group'"}, { "fieldtype": "Data", "label": __("Tag"), "fieldname": "tag", "reqd": 0, "depends_on": "eval:doc.search_type == 'Tag'" }, @@ -121,14 +121,14 @@ frappe.ui.form.on("Request for Quotation",{ }, callback: load_suppliers }); - } else if (args.supplier_type) { + } else if (args.supplier_group) { return frappe.call({ method: "frappe.client.get_list", args: { doctype: "Supplier", order_by: "name", fields: ["name"], - filters: [["Supplier", "supplier_type", "=", args.supplier_type]] + filters: [["Supplier", "supplier_group_name", "=", args.supplier_group]] }, callback: load_suppliers diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index 7eb741f06a..dbd9f02278 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -56,7 +56,7 @@ class TestRequestforQuotation(unittest.TestCase): frappe.delete_doc_if_exists("Supplier", "_Test Supplier '1", force=1) supplier = frappe.new_doc("Supplier") supplier.supplier_name = "_Test Supplier '1" - supplier.supplier_type = "_Test Supplier Type" + supplier.supplier_group = "_Test Supplier Group" supplier.insert() rfq = make_request_for_quotation(supplier_wt_appos) diff --git a/erpnext/buying/doctype/supplier/supplier_list.js b/erpnext/buying/doctype/supplier/supplier_list.js index ab25d2c8fc..d99e3f8f0f 100644 --- a/erpnext/buying/doctype/supplier/supplier_list.js +++ b/erpnext/buying/doctype/supplier/supplier_list.js @@ -1,3 +1,3 @@ frappe.listview_settings['Supplier'] = { - add_fields: ["supplier_name", "supplier_type", "image"], + add_fields: ["supplier_name", "supplier_group", "image"], }; diff --git a/erpnext/buying/doctype/supplier/test_supplier.js b/erpnext/buying/doctype/supplier/test_supplier.js index 51e3c09788..bf7c192c91 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.js +++ b/erpnext/buying/doctype/supplier/test_supplier.js @@ -7,7 +7,7 @@ QUnit.test("test: supplier", function(assert) { () => { return frappe.tests.make('Supplier', [ {supplier_name: 'Test Supplier'}, - {supplier_type: 'Hardware'}, + {supplier_group: 'Hardware'}, {country: 'India'}, {default_currency: 'INR'}, {accounts: [ @@ -66,7 +66,7 @@ QUnit.test("test: supplier", function(assert) { () => { assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Name correct"); - assert.ok(cur_frm.doc.supplier_type == 'Hardware', "Type correct"); + assert.ok(cur_frm.doc.supplier_group == 'Hardware', "Type correct"); assert.ok(cur_frm.doc.default_currency == 'INR', "Currency correct"); assert.ok(cur_frm.doc.accounts[0].account == 'Creditors - '+frappe.get_abbr('For Testing'), " Account Head abbr correct"); assert.ok($('.address-box:nth-child(3) p').text().includes('Shipping City 3'), "Address correct"); diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 16dda5c5ff..2211db7e0d 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -36,14 +36,14 @@ class TestSupplier(unittest.TestCase): frappe.db.set_value("Supplier", "_Test Supplier With Template 1", "payment_terms", "") - # Set credit limit for the supplier type instead of supplier and evaluate the due date - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "_Test Payment Term Template 3") + # Set credit limit for the supplier group instead of supplier and evaluate the due date + frappe.db.set_value("Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 3") due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") self.assertEqual(due_date, "2016-02-21") - # Payment terms for Supplier Type instead of supplier and evaluate the due date - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "_Test Payment Term Template 1") + # Payment terms for Supplier Group instead of supplier and evaluate the due date + frappe.db.set_value("Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 1") # Leap year due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") @@ -53,7 +53,7 @@ class TestSupplier(unittest.TestCase): self.assertEqual(due_date, "2017-02-28") # Supplier with no default Payment Terms Template - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "") + frappe.db.set_value("Supplier Group", "_Test Supplier Group", "payment_terms", "") frappe.db.set_value("Supplier", "_Test Supplier", "payment_terms", "") due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier") diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 40c2cf0358..72723eb115 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -755,9 +755,9 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier, target_doc= def get_supplier(doctype, txt, searchfield, start, page_len, filters): supp_master_name = frappe.defaults.get_user_default("supp_master_name") if supp_master_name == "Supplier Name": - fields = ["name", "supplier_type"] + fields = ["name", "supplier_group"] else: - fields = ["name", "supplier_name", "supplier_type"] + fields = ["name", "supplier_name", "supplier_group"] fields = ", ".join(fields) return frappe.db.sql("""select {field} from `tabSupplier` diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index e6029aa4ea..7ee0c5c2d0 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -34,7 +34,7 @@ frappe.ui.form.on("Delivery Note", { frm.set_query('transporter_name', function(doc) { return { - filters: { 'supplier_type': "transporter" } + filters: { 'supplier_group': "transporter" } } }); From 890707854d7efca4a875b33725dd7f96c5ac5e68 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Thu, 19 Apr 2018 18:37:29 +0530 Subject: [PATCH 104/154] config/utility level changes --- erpnext/accounts/party.py | 24 +++++++------- .../accounts_receivable.py | 12 +++---- .../accounts_receivable_summary.py | 6 ++-- .../purchase_register/purchase_register.py | 8 ++--- .../purchase_analytics/purchase_analytics.js | 32 +++++++++---------- erpnext/config/buying.py | 4 +-- erpnext/demo/setup/setup_data.py | 2 +- .../operations/install_fixtures.py | 16 +++++----- erpnext/startup/report_data_map.py | 6 ++-- erpnext/utilities/user_progress_utils.py | 2 +- 10 files changed, 56 insertions(+), 56 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 6f272cf833..652272dbe1 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -47,7 +47,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company= set_contact_details(out, party, party_type) set_other_values(out, party, party_type) set_price_list(out, party, party_type, price_list) - out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_type) + out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_group) out["payment_terms_template"] = get_pyt_term_template(party.name, party_type, company) if not out.get("currency"): @@ -105,7 +105,7 @@ def set_other_values(out, party, party_type): if party_type=="Customer": to_copy = ["customer_name", "customer_group", "territory", "language"] else: - to_copy = ["supplier_name", "supplier_type", "language"] + to_copy = ["supplier_name", "supplier_group", "language"] for f in to_copy: out[f] = party.get(f) @@ -169,7 +169,7 @@ def set_account_and_due_date(party, account, party_type, company, posting_date, def get_party_account(party_type, party, company): """Returns the account for the given `party`. Will first search in party (Customer / Supplier) record, if not found, - will search in group (Customer Group / Supplier Type), + will search in group (Customer Group / Supplier Group), finally will return default.""" if not company: frappe.throw(_("Please select a Company")) @@ -181,7 +181,7 @@ def get_party_account(party_type, party, company): {"parenttype": party_type, "parent": party, "company": company}, "account") if not account and party_type in ['Customer', 'Supplier']: - party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Type" + party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Group" group = frappe.db.get_value(party_type, party, scrub(party_group_doctype)) account = frappe.db.get_value("Party Account", {"parenttype": party_group_doctype, "parent": group, "company": company}, "account") @@ -274,8 +274,8 @@ def get_due_date(posting_date, party_type, party, company=None, bill_date=None): due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d") else: if party_type == "Supplier": - supplier_type = frappe.db.get_value(party_type, party, fieldname="supplier_type") - template_name = frappe.db.get_value("Supplier Type", supplier_type, fieldname="payment_terms") + supplier_group = frappe.db.get_value(party_type, party, fieldname="supplier_group") + template_name = frappe.db.get_value("Supplier Group", supplier_group, fieldname="payment_terms") if template_name: due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d") # If due date is calculated from bill_date, check this condition @@ -321,7 +321,7 @@ def validate_due_date(posting_date, due_date, party_type, party, company=None, b .format(formatdate(default_due_date))) @frappe.whitelist() -def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_type=None, +def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_group=None, billing_address=None, shipping_address=None, use_for_shopping_cart=None): from erpnext.accounts.doctype.tax_rule.tax_rule import get_tax_template, get_party_details args = { @@ -332,8 +332,8 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup if customer_group: args['customer_group'] = customer_group - if supplier_type: - args['supplier_type'] = supplier_type + if supplier_group: + args['supplier_group'] = supplier_group if billing_address or shipping_address: args.update(get_party_details(party, party_type, {"billing_address": billing_address, \ @@ -371,10 +371,10 @@ def get_pyt_term_template(party_name, party_type, company=None): customer.customer_group, fieldname='payment_terms') else: supplier = frappe.db.get_value("Supplier", party_name, - fieldname=['payment_terms', "supplier_type"], as_dict=1) + fieldname=['payment_terms', "supplier_group"], as_dict=1) template = supplier.payment_terms - if not template and supplier.supplier_type: - template = frappe.db.get_value("Supplier Type", supplier.supplier_type, fieldname='payment_terms') + if not template and supplier.supplier_group: + template = frappe.db.get_value("Supplier Group", supplier.supplier_group, fieldname='payment_terms') if not template and company: template = frappe.db.get_value("Company", company, fieldname='payment_terms') diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index fc76be406e..ca806bfc4a 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -112,7 +112,7 @@ class ReceivablePayableReport(object): _("Customer Group") + ":Link/Customer Group:120" ] if args.get("party_type") == "Supplier": - columns += [_("Supplier Type") + ":Link/Supplier Type:80"] + columns += [_("Supplier Group") + ":Link/Supplier Group:80"] columns.append(_("Remarks") + "::200") @@ -194,11 +194,11 @@ class ReceivablePayableReport(object): # Delivery Note row += [voucher_details.get(gle.voucher_no, {}).get("delivery_note")] - # customer territory / supplier type + # customer territory / supplier group if args.get("party_type") == "Customer": row += [self.get_territory(gle.party), self.get_customer_group(gle.party)] if args.get("party_type") == "Supplier": - row += [self.get_supplier_type(gle.party)] + row += [self.get_supplier_group(gle.party)] row.append(gle.remarks) data.append(row) @@ -260,15 +260,15 @@ class ReceivablePayableReport(object): def get_customer_group(self, party_name): return self.get_party_map("Customer").get(party_name, {}).get("customer_group") or "" - def get_supplier_type(self, party_name): - return self.get_party_map("Supplier").get(party_name, {}).get("supplier_type") or "" + def get_supplier_group(self, party_name): + return self.get_party_map("Supplier").get(party_name, {}).get("supplier_group") or "" def get_party_map(self, party_type): if not hasattr(self, "party_map"): if party_type == "Customer": select_fields = "name, customer_name, territory, customer_group" elif party_type == "Supplier": - select_fields = "name, supplier_name, supplier_type" + select_fields = "name, supplier_name, supplier_group" self.party_map = dict(((r.name, r) for r in frappe.db.sql("select {0} from `tab{1}`" .format(select_fields, party_type), as_dict=True))) diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py index 08b24fb147..9b50960f4b 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py @@ -35,7 +35,7 @@ class AccountsReceivableSummary(ReceivablePayableReport): _("Customer Group") + ":Link/Customer Group:120" ] if args.get("party_type") == "Supplier": - columns += [_("Supplier Type") + ":Link/Supplier Type:80"] + columns += [_("Supplier Group") + ":Link/Supplier Group:80"] columns.append({ "fieldname": "currency", @@ -66,7 +66,7 @@ class AccountsReceivableSummary(ReceivablePayableReport): if args.get("party_type") == "Customer": row += [self.get_territory(party), self.get_customer_group(party)] if args.get("party_type") == "Supplier": - row += [self.get_supplier_type(party)] + row += [self.get_supplier_group(party)] row.append(party_dict.currency) data.append(row) @@ -113,7 +113,7 @@ class AccountsReceivableSummary(ReceivablePayableReport): "outstanding_amt", "age", "range1", "range2", "range3", "range4", "currency"] if args.get("party_type") == "Supplier": - cols += ["supplier_type", "remarks"] + cols += ["supplier_group", "remarks"] if args.get("party_type") == "Customer": cols += ["territory", "customer_group", "remarks"] diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index cf599a0ccc..7a298b322f 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -42,7 +42,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum row.append(inv.get(col)) row += [ - supplier_details.get(inv.supplier), # supplier_type + supplier_details.get(inv.supplier), # supplier_group inv.tax_id, inv.credit_to, inv.mode_of_payment, ", ".join(project), inv.bill_no, inv.bill_date, inv.remarks, ", ".join(purchase_order), ", ".join(purchase_receipt), company_currency @@ -83,7 +83,7 @@ def get_columns(invoice_list, additional_table_columns): columns += additional_table_columns columns += [ - _("Supplier Type") + ":Link/Supplier Type:120", _("Tax Id") + "::80", _("Payable Account") + ":Link/Account:120", + _("Supplier Group") + ":Link/Supplier Group:120", _("Tax Id") + "::80", _("Payable Account") + ":Link/Account:120", _("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80", _("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150", _("Purchase Order") + ":Link/Purchase Order:100", @@ -229,8 +229,8 @@ def get_account_details(invoice_list): def get_supplier_details(suppliers): supplier_details = {} - for supp in frappe.db.sql("""select name, supplier_type from `tabSupplier` + for supp in frappe.db.sql("""select name, supplier_group from `tabSupplier` where name in (%s)""" % ", ".join(["%s"]*len(suppliers)), tuple(suppliers), as_dict=1): - supplier_details.setdefault(supp.name, supp.supplier_type) + supplier_details.setdefault(supp.name, supp.supplier_group) return supplier_details diff --git a/erpnext/buying/page/purchase_analytics/purchase_analytics.js b/erpnext/buying/page/purchase_analytics/purchase_analytics.js index 442a8bbd3e..df5790e826 100644 --- a/erpnext/buying/page/purchase_analytics/purchase_analytics.js +++ b/erpnext/buying/page/purchase_analytics/purchase_analytics.js @@ -19,7 +19,7 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ title: __("Purchase Analytics"), parent: $(wrapper).find('.layout-main'), page: wrapper.page, - doctypes: ["Item", "Item Group", "Supplier", "Supplier Type", "Company", "Fiscal Year", + doctypes: ["Item", "Item Group", "Supplier", "Supplier Group", "Company", "Fiscal Year", "Purchase Invoice", "Purchase Invoice Item", "Purchase Order", "Purchase Order Item[Purchase Analytics]", "Purchase Receipt", "Purchase Receipt Item[Purchase Analytics]"], @@ -27,11 +27,11 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ }); this.tree_grids = { - "Supplier Type": { - label: __("Supplier Type / Supplier"), + "Supplier Group": { + label: __("Supplier Group / Supplier"), show: true, item_key: "supplier", - parent_field: "parent_supplier_type", + parent_field: "parent_supplier_group", formatter: function(item) { return item.supplier_name ? item.supplier_name + " (" + item.name + ")" : item.name; } @@ -77,7 +77,7 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ }, filters: [ {fieldtype:"Select", label: __("Tree Type"), fieldname: "tree_type", - options:["Supplier Type", "Supplier", "Item Group", "Item"], + options:["Supplier Group", "Supplier", "Item Group", "Item"], filter: function(val, item, opts, me) { return me.apply_zero_filter(val, item, opts, me); }}, @@ -110,22 +110,22 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ var me = this; if (!this.tl) { // add 'Not Set' Supplier & Item - // Add 'All Supplier Types' Supplier Type + // Add 'All Supplier Groups' Supplier Group // (Supplier / Item are not mandatory!!) - // Set parent supplier type for tree view + // Set parent supplier group for tree view - $.each(frappe.report_dump.data["Supplier Type"], function(i, v) { - v['parent_supplier_type'] = __("All Supplier Types") + $.each(frappe.report_dump.data["Supplier Group"], function(i, v) { + v['parent_supplier_group'] = __("All Supplier Groups") }) - frappe.report_dump.data["Supplier Type"] = [{ - name: __("All Supplier Types"), - id: "All Supplier Types", - }].concat(frappe.report_dump.data["Supplier Type"]); + frappe.report_dump.data["Supplier Group"] = [{ + name: __("All Supplier Groups"), + id: "All Supplier Groups", + }].concat(frappe.report_dump.data["Supplier Group"]); frappe.report_dump.data["Supplier"].push({ name: __("Not Set"), - parent_supplier_type: __("All Supplier Types"), + parent_supplier_group: __("All Supplier Groups"), id: "Not Set", }); @@ -144,8 +144,8 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ if(!this.data || me.item_type != me.tree_type) { if(me.tree_type=='Supplier') { var items = frappe.report_dump.data["Supplier"]; - } if(me.tree_type=='Supplier Type') { - var items = this.prepare_tree("Supplier", "Supplier Type"); + } if(me.tree_type=='Supplier Group') { + var items = this.prepare_tree("Supplier", "Supplier Group"); } else if(me.tree_type=="Item Group") { var items = this.prepare_tree("Item", "Item Group"); } else if(me.tree_type=="Item") { diff --git a/erpnext/config/buying.py b/erpnext/config/buying.py index ba29125ca0..e20d514a23 100644 --- a/erpnext/config/buying.py +++ b/erpnext/config/buying.py @@ -39,8 +39,8 @@ def get_data(): }, { "type": "doctype", - "name": "Supplier Type", - "description": _("Supplier Type master.") + "name": "Supplier Group", + "description": _("Supplier Group master.") }, { "type": "doctype", diff --git a/erpnext/demo/setup/setup_data.py b/erpnext/demo/setup/setup_data.py index 4ed4df9176..42d079db34 100644 --- a/erpnext/demo/setup/setup_data.py +++ b/erpnext/demo/setup/setup_data.py @@ -275,7 +275,7 @@ def setup_supplier(): frappe.get_doc({ "doctype": "Supplier", "supplier_name": s, - "supplier_type": random.choice(["Services", "Raw Material"]), + "supplier_group": random.choice(["Services", "Raw Material"]), }).insert() def setup_warehouse(): diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py index 8f761e5946..2c294af2a1 100644 --- a/erpnext/setup/setup_wizard/operations/install_fixtures.py +++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py @@ -147,14 +147,14 @@ def install(country=None): {'doctype': 'Customer Group', 'customer_group_name': _('Non Profit'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')}, {'doctype': 'Customer Group', 'customer_group_name': _('Government'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')}, - # supplier type - {'doctype': 'Supplier Type', 'supplier_type': _('Services')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Local')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Raw Material')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Electrical')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Hardware')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Pharmaceutical')}, - {'doctype': 'Supplier Type', 'supplier_type': _('Distributor')}, + # supplier group + {'doctype': 'Supplier Group', 'supplier_group_name': _('Services')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Local')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Raw Material')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Electrical')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Hardware')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Pharmaceutical')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Distributor')}, # Sales Person {'doctype': 'Sales Person', 'sales_person_name': _('Sales Team'), 'is_group': 1, "parent_sales_person": ""}, diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py index daf6fdd3bd..3720017804 100644 --- a/erpnext/startup/report_data_map.py +++ b/erpnext/startup/report_data_map.py @@ -208,14 +208,14 @@ data_map = { }, "Supplier": { "columns": ["name", "if(supplier_name=name, '', supplier_name) as supplier_name", - "supplier_type as parent_supplier_type"], + "supplier_group as parent_supplier_group"], "conditions": ["docstatus < 2"], "order_by": "name", "links": { - "parent_supplier_type": ["Supplier Type", "name"], + "parent_supplier_group": ["Supplier Group", "name"], } }, - "Supplier Type": { + "Supplier Group": { "columns": ["name"], "conditions": ["docstatus < 2"], "order_by": "name" diff --git a/erpnext/utilities/user_progress_utils.py b/erpnext/utilities/user_progress_utils.py index 5bd855f719..20e533e91a 100644 --- a/erpnext/utilities/user_progress_utils.py +++ b/erpnext/utilities/user_progress_utils.py @@ -63,7 +63,7 @@ def create_suppliers(args_data): doc = frappe.get_doc({ "doctype":"Supplier", "supplier_name": supplier, - "supplier_type": _("Local"), + "supplier_group": _("Local"), "company": defaults.get("company") }).insert() From 2e0809801d35812d197ffe669aa580071bfeb36c Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Thu, 19 Apr 2018 18:37:53 +0530 Subject: [PATCH 105/154] controller and other changes --- erpnext/controllers/queries.py | 4 ++-- erpnext/controllers/trends.py | 12 ++++++------ erpnext/hub_node/__init__.py | 2 +- erpnext/public/js/conf.js | 2 +- erpnext/public/js/controllers/transaction.js | 2 +- erpnext/public/js/hub/hub_form.js | 4 ++-- erpnext/public/js/purchase_trends_filters.js | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index fd13c1353e..3bf720fd5d 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -102,9 +102,9 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters): def supplier_query(doctype, txt, searchfield, start, page_len, filters): supp_master_name = frappe.defaults.get_user_default("supp_master_name") if supp_master_name == "Supplier Name": - fields = ["name", "supplier_type"] + fields = ["name", "supplier_group"] else: - fields = ["name", "supplier_name", "supplier_type"] + fields = ["name", "supplier_name", "supplier_group"] fields = ", ".join(fields) return frappe.db.sql("""select {field} from `tabSupplier` diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py index ef698c2a16..28a8fddfac 100644 --- a/erpnext/controllers/trends.py +++ b/erpnext/controllers/trends.py @@ -235,16 +235,16 @@ def based_wise_columns_query(based_on, trans): based_on_details["addl_tables"] = '' elif based_on == 'Supplier': - based_on_details["based_on_cols"] = ["Supplier:Link/Supplier:120", "Supplier Type:Link/Supplier Type:140"] - based_on_details["based_on_select"] = "t1.supplier, t3.supplier_type," + based_on_details["based_on_cols"] = ["Supplier:Link/Supplier:120", "Supplier Group:Link/Supplier Group:140"] + based_on_details["based_on_select"] = "t1.supplier, t3.supplier_group," based_on_details["based_on_group_by"] = 't1.supplier' based_on_details["addl_tables"] = ',`tabSupplier` t3' based_on_details["addl_tables_relational_cond"] = " and t1.supplier = t3.name" - elif based_on == 'Supplier Type': - based_on_details["based_on_cols"] = ["Supplier Type:Link/Supplier Type:140"] - based_on_details["based_on_select"] = "t3.supplier_type," - based_on_details["based_on_group_by"] = 't3.supplier_type' + elif based_on == 'Supplier Group': + based_on_details["based_on_cols"] = ["Supplier Group:Link/Supplier Group:140"] + based_on_details["based_on_select"] = "t3.supplier_group," + based_on_details["based_on_group_by"] = 't3.supplier_group' based_on_details["addl_tables"] = ',`tabSupplier` t3' based_on_details["addl_tables_relational_cond"] = " and t1.supplier = t3.name" diff --git a/erpnext/hub_node/__init__.py b/erpnext/hub_node/__init__.py index 89ee926d55..65b1386466 100644 --- a/erpnext/hub_node/__init__.py +++ b/erpnext/hub_node/__init__.py @@ -187,7 +187,7 @@ def make_supplier(supplier): supplier_doc = frappe.get_doc({ 'doctype': 'Supplier', 'supplier_name': supplier.supplier_name, - 'supplier_type': supplier.supplier_type, + 'supplier_group': supplier.supplier_group, 'supplier_email': supplier.supplier_email }).insert() else: diff --git a/erpnext/public/js/conf.js b/erpnext/public/js/conf.js index d256c08e13..08f8d43e50 100644 --- a/erpnext/public/js/conf.js +++ b/erpnext/public/js/conf.js @@ -49,7 +49,7 @@ $.extend(frappe.create_routes, { $.extend(frappe.breadcrumbs.preferred, { "Item Group": "Stock", "Customer Group": "Selling", - "Supplier Type": "Buying", + "Supplier Group": "Buying", "Territory": "Selling", "Sales Person": "Selling", "Sales Partner": "Selling", diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 1551b1dfc3..eb4a7001f3 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -980,7 +980,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ "customer_group": me.frm.doc.customer_group, "territory": me.frm.doc.territory, "supplier": me.frm.doc.supplier, - "supplier_type": me.frm.doc.supplier_type, + "supplier_group": me.frm.doc.supplier_group, "currency": me.frm.doc.currency, "conversion_rate": me.frm.doc.conversion_rate, "price_list": me.frm.doc.selling_price_list || me.frm.doc.buying_price_list, diff --git a/erpnext/public/js/hub/hub_form.js b/erpnext/public/js/hub/hub_form.js index 62c44fcb33..4a8c4eb3ec 100644 --- a/erpnext/public/js/hub/hub_form.js +++ b/erpnext/public/js/hub/hub_form.js @@ -444,8 +444,8 @@ erpnext.hub.ItemPage = class ItemPage extends erpnext.hub.HubDetailsPage { { label: __('Supplier Name'), fieldtype: 'Data', fieldname: 'supplier_name', default: item.company_name }, { label: __('Supplier Email'), fieldtype: 'Data', fieldname: 'supplier_email', default: item.seller }, { fieldtype: 'Column Break' }, - { label: __('Supplier Type'), fieldname: 'supplier_type', - fieldtype: 'Link', options: 'Supplier Type' } + { label: __('Supplier Group'), fieldname: 'supplier_group', + fieldtype: 'Link', options: 'Supplier Group' } ]; fields = fields.map(f => { f.reqd = 1; return f; }); diff --git a/erpnext/public/js/purchase_trends_filters.js b/erpnext/public/js/purchase_trends_filters.js index 117d4eb08c..595a138f12 100644 --- a/erpnext/public/js/purchase_trends_filters.js +++ b/erpnext/public/js/purchase_trends_filters.js @@ -23,7 +23,7 @@ erpnext.get_purchase_trends_filters = function() { { "value": "Item", "label": __("Item") }, { "value": "Item Group", "label": __("Item Group") }, { "value": "Supplier", "label": __("Supplier") }, - { "value": "Supplier Type", "label": __("Supplier Type") }, + { "value": "Supplier Group", "label": __("Supplier Group") }, { "value": "Project", "label": __("Project") } ], "default": "Item" From 540d7aa635080677e2678ab70712e0310646b747 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 20 Apr 2018 09:39:29 +0530 Subject: [PATCH 106/154] patch to reload_doc and rename field --- erpnext/patches.txt | 1 + .../rename_supplier_type_to_supplier_group.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 3fffade9bb..a8696fa24b 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -527,3 +527,4 @@ erpnext.patches.v11_0.rename_field_max_days_allowed erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance erpnext.patches.v11_0.rebuild_tree_for_company +erpnext.patches.v11_0.rename_supplier_type_to_supplier_group diff --git a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py new file mode 100644 index 0000000000..b5b1bf4090 --- /dev/null +++ b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py @@ -0,0 +1,17 @@ +import frappe +from frappe.model.rename_doc import rename_doc +from frappe.model.utils.rename_field import rename_field + +def execute(): + if frappe.db.table_exists("Supplier Type") and not frappe.db.table_exists("Supplier Group"): + rename_doc("DocType", "Supplier Type", "Supplier Group", force=True) + frappe.reload_doc('setup', 'doctype', 'supplier_group') + frappe.reload_doc("accounts", "doctype", "pricing_rule") + frappe.reload_doc("accounts", "doctype", "tax_rule") + frappe.reload_doc("buying", "doctype", "buying_settings") + frappe.reload_doc("buying", "doctype", "supplier") + rename_field("Supplier Group", "supplier_type", "supplier_group_name") + rename_field("Supplier", "supplier_type", "supplier_group") + rename_field("Buying Settings", "supplier_type", "supplier_group") + rename_field("Pricing Rule", "supplier_type", "supplier_group") + rename_field("Tax Rule", "supplier_type", "supplier_group") From c88ce364cef3450b81eb8ed00adfad50378a474f Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 20 Apr 2018 11:06:15 +0530 Subject: [PATCH 107/154] treeview implemented for supplier group --- .../rename_supplier_type_to_supplier_group.py | 17 ++ .../supplier_group/supplier_group.json | 161 +++++++++++++++++- .../supplier_group/supplier_group_tree.js | 3 + 3 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 erpnext/setup/doctype/supplier_group/supplier_group_tree.js diff --git a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py index b5b1bf4090..4db5704ad6 100644 --- a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py +++ b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py @@ -1,6 +1,8 @@ import frappe from frappe.model.rename_doc import rename_doc from frappe.model.utils.rename_field import rename_field +from frappe import _ +from frappe.utils.nestedset import rebuild_tree def execute(): if frappe.db.table_exists("Supplier Type") and not frappe.db.table_exists("Supplier Group"): @@ -15,3 +17,18 @@ def execute(): rename_field("Buying Settings", "supplier_type", "supplier_group") rename_field("Pricing Rule", "supplier_type", "supplier_group") rename_field("Tax Rule", "supplier_type", "supplier_group") + + build_tree() + +def build_tree(): + if not frappe.db.exists("Supplier Group", _('All Supplier Groups')): + frappe.get_doc({ + 'doctype': 'Supplier Group', + 'supplier_group_name': _('All Supplier Groups'), + 'is_group': 1 + }).insert(ignore_permissions=True) + + frappe.db.sql("""update `tabSupplier Group` set parent_supplier_group = '{0}' + where is_group = 0""".format(_('All Supplier Groups'))) + + rebuild_tree("Supplier Group", "parent_supplier_group") diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.json b/erpnext/setup/doctype/supplier_group/supplier_group.json index 35fafac4ff..dc8b2631f1 100644 --- a/erpnext/setup/doctype/supplier_group/supplier_group.json +++ b/erpnext/setup/doctype/supplier_group/supplier_group.json @@ -25,7 +25,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, "label": "Supplier Group Name", "length": 0, @@ -44,6 +44,69 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "parent_supplier_group", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Parent Supplier Group", + "length": 0, + "no_copy": 0, + "options": "Supplier Group", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "is_group", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Is Group", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -169,6 +232,100 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "lft", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "rgt", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "old_parent", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Old Parent", + "length": 0, + "no_copy": 1, + "options": "Supplier Group", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -182,7 +339,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-19 07:45:03.495577", + "modified": "2018-04-20 00:54:48.724120", "modified_by": "Administrator", "module": "Setup", "name": "Supplier Group", diff --git a/erpnext/setup/doctype/supplier_group/supplier_group_tree.js b/erpnext/setup/doctype/supplier_group/supplier_group_tree.js new file mode 100644 index 0000000000..24328bdd5a --- /dev/null +++ b/erpnext/setup/doctype/supplier_group/supplier_group_tree.js @@ -0,0 +1,3 @@ +frappe.treeview_settings["Supplier Group"] = { + ignore_fields:["parent_supplier_group"] +} \ No newline at end of file From 93d6b555d78170b522f43720727c593a09677fa6 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 20 Apr 2018 11:07:19 +0530 Subject: [PATCH 108/154] added fixtures for supplier-group, changed analytics report accordingly --- .../page/purchase_analytics/purchase_analytics.js | 12 ------------ .../setup_wizard/operations/install_fixtures.py | 15 ++++++++------- erpnext/startup/report_data_map.py | 2 +- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/erpnext/buying/page/purchase_analytics/purchase_analytics.js b/erpnext/buying/page/purchase_analytics/purchase_analytics.js index df5790e826..b503113837 100644 --- a/erpnext/buying/page/purchase_analytics/purchase_analytics.js +++ b/erpnext/buying/page/purchase_analytics/purchase_analytics.js @@ -110,19 +110,7 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ var me = this; if (!this.tl) { // add 'Not Set' Supplier & Item - // Add 'All Supplier Groups' Supplier Group // (Supplier / Item are not mandatory!!) - // Set parent supplier group for tree view - - $.each(frappe.report_dump.data["Supplier Group"], function(i, v) { - v['parent_supplier_group'] = __("All Supplier Groups") - }) - - frappe.report_dump.data["Supplier Group"] = [{ - name: __("All Supplier Groups"), - id: "All Supplier Groups", - }].concat(frappe.report_dump.data["Supplier Group"]); - frappe.report_dump.data["Supplier"].push({ name: __("Not Set"), parent_supplier_group: __("All Supplier Groups"), diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py index 2c294af2a1..c686ed3080 100644 --- a/erpnext/setup/setup_wizard/operations/install_fixtures.py +++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py @@ -148,13 +148,14 @@ def install(country=None): {'doctype': 'Customer Group', 'customer_group_name': _('Government'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')}, # supplier group - {'doctype': 'Supplier Group', 'supplier_group_name': _('Services')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Local')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Raw Material')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Electrical')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Hardware')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Pharmaceutical')}, - {'doctype': 'Supplier Group', 'supplier_group_name': _('Distributor')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('All Supplier Groups'), 'is_group': 1, 'name': _('All Supplier Groups'), 'parent_supplier_group': ''}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Services'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Local'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Raw Material'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Electrical'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Hardware'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Pharmaceutical'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, + {'doctype': 'Supplier Group', 'supplier_group_name': _('Distributor'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')}, # Sales Person {'doctype': 'Sales Person', 'sales_person_name': _('Sales Team'), 'is_group': 1, "parent_sales_person": ""}, diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py index 3720017804..5de7998c7d 100644 --- a/erpnext/startup/report_data_map.py +++ b/erpnext/startup/report_data_map.py @@ -216,7 +216,7 @@ data_map = { } }, "Supplier Group": { - "columns": ["name"], + "columns": ["name", "parent_supplier_group"], "conditions": ["docstatus < 2"], "order_by": "name" }, From f665189ab3e8b209dfefdc9578d5065df7323e72 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 20 Apr 2018 16:00:55 +0530 Subject: [PATCH 109/154] tree based changes --- .../doctype/supplier_group/supplier_group.js | 22 ++++++++++++++++++- .../doctype/supplier_group/supplier_group.py | 16 +++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.js b/erpnext/setup/doctype/supplier_group/supplier_group.js index 10e5c04dcc..ea92726e2a 100644 --- a/erpnext/setup/doctype/supplier_group/supplier_group.js +++ b/erpnext/setup/doctype/supplier_group/supplier_group.js @@ -2,7 +2,27 @@ // For license information, please see license.txt cur_frm.cscript.refresh = function(doc) { - cur_frm.set_intro(doc.__islocal ? "" : __("There is nothing to edit.")) + cur_frm.set_intro(doc.__islocal ? "" : __("There is nothing to edit.")); + cur_frm.cscript.set_root_readonly(doc); +} + +cur_frm.cscript.set_root_readonly = function(doc) { + // read-only for root customer group + if(!doc.parent_supplier_group) { + cur_frm.set_read_only(); + cur_frm.set_intro(__("This is a root supplier group and cannot be edited.")); + } else { + cur_frm.set_intro(null); + } +} + +//get query select Customer Group +cur_frm.fields_dict['parent_supplier_group'].get_query = function(doc,cdt,cdn) { + return { + filters: { + 'is_group': 1 + } + } } cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(doc, cdt, cdn) { diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.py b/erpnext/setup/doctype/supplier_group/supplier_group.py index 53ab215190..747560a533 100644 --- a/erpnext/setup/doctype/supplier_group/supplier_group.py +++ b/erpnext/setup/doctype/supplier_group/supplier_group.py @@ -4,7 +4,17 @@ from __future__ import unicode_literals import frappe -from frappe.model.document import Document +from frappe.utils.nestedset import NestedSet -class SupplierGroup(Document): - pass +class SupplierGroup(NestedSet): + nsm_parent_field = 'parent_supplier_group'; + + def update_nsm_model(self): + frappe.utils.nestedset.update_nsm(self) + + def on_update(self): + self.update_nsm_model() + self.validate_one_root() + + def on_trash(self): + self.update_nsm_model() From 4bd7cdb018201db7835e19e0d736a340dae485d7 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Wed, 9 May 2018 15:55:33 +0530 Subject: [PATCH 110/154] Salary Structure Assignment - filters applied --- .../salary_structure_assignment.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js index af4ca3a3b5..56a05e0495 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js +++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js @@ -15,8 +15,8 @@ frappe.ui.form.on('Salary Structure Assignment', { return { filters: { company: frm.doc.company, - is_active: "Yes", - docstatus: 1 + docstatus: 1, + is_active: "Yes" } } }); From b5c5c471b461ddc8a329a5fd462ae4ecd0f8070b Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Wed, 9 May 2018 17:23:06 +0530 Subject: [PATCH 111/154] Formula on Salary Component Master --- .../salary_component/salary_component.json | 223 +++++++++++++++++- 1 file changed, 222 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index 5f875a9948..f1f5946342 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -108,6 +108,131 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "condition", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Condition", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ", + "fieldname": "statistical_component", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Statistical Component", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depends_on_lwp", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Depends on Leave Without Pay", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "do_not_include_in_total", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Do not include in total", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -138,6 +263,102 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fieldname": "amount_based_on_formula", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount based on formula", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.amount_based_on_formula!==0", + "fieldname": "formula", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Formula", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.amount_based_on_formula!==1", + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -972,4 +1193,4 @@ "sort_order": "DESC", "track_changes": 0, "track_seen": 0 -} \ No newline at end of file +} From a5028c8e54c5bc4fc1fc66fd8538c38d99dc9870 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Wed, 9 May 2018 17:40:27 +0530 Subject: [PATCH 112/154] Salary Structure - filter updated, Salary Component - fields re-arranged --- .../salary_component/salary_component.json | 535 ++++++++++-------- 1 file changed, 314 insertions(+), 221 deletions(-) diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index f1f5946342..f08b1d7a0b 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -108,131 +108,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "condition", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Condition", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ", - "fieldname": "statistical_component", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Statistical Component", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "depends_on_lwp", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Depends on Leave Without Pay", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "do_not_include_in_total", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Do not include in total", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -263,102 +138,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "amount_based_on_formula", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amount based on formula", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.amount_based_on_formula!==0", - "fieldname": "formula", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Formula", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.amount_based_on_formula!==1", - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1114,6 +893,320 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "help", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Help", + "length": 0, + "no_copy": 0, + "options": "

Help

\n\n

Notes:

\n\n
    \n
  1. Use field base for using base salary of the Employee
  2. \n
  3. Use Salary Component abbreviations in conditions and formulas. BS = Basic Salary
  4. \n
  5. Use field name for employee details in conditions and formulas. Employment Type = employment_typeBranch = branch
  6. \n
  7. Use field name from Salary Slip in conditions and formulas. Payment Days = payment_daysLeave without pay = leave_without_pay
  8. \n
  9. Direct Amount can also be entered based on Condtion. See example 3
\n\n

Examples

\n
    \n
  1. Calculating Basic Salary based on base\n
    Condition: base < 10000
    \n
    Formula: base * .2
  2. \n
  3. Calculating HRA based on Basic SalaryBS \n
    Condition: BS > 2000
    \n
    Formula: BS * .1
  4. \n
  5. Calculating TDS based on Employment Typeemployment_type \n
    Condition: employment_type==\"Intern\"
    \n
    Amount: 1000
  6. \n
", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "condition_and_formula", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Condition and Formula", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "condition", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Condition", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ", + "fieldname": "statistical_component", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Statistical Component", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depends_on_lwp", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Depends on Leave Without Pay", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "do_not_include_in_total", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Do not include in total", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fieldname": "amount_based_on_formula", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount based on formula", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.amount_based_on_formula!==0", + "fieldname": "formula", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Formula", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.amount_based_on_formula!==1", + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_28", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, From 08b60a1a62fb8cc98248f540c2c03da6117f6b13 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Thu, 10 May 2018 13:16:24 +0530 Subject: [PATCH 113/154] New Doctype - Additional Salary Component --- erpnext/config/hr.py | 4 + .../additional_salary_component/__init__.py | 0 .../additional_salary_component.js | 21 + .../additional_salary_component.json | 364 ++++++++++++++++++ .../additional_salary_component.py | 26 ++ .../test_additional_salary_component.js | 23 ++ .../test_additional_salary_component.py | 10 + 7 files changed, 448 insertions(+) create mode 100644 erpnext/hr/doctype/additional_salary_component/__init__.py create mode 100644 erpnext/hr/doctype/additional_salary_component/additional_salary_component.js create mode 100644 erpnext/hr/doctype/additional_salary_component/additional_salary_component.json create mode 100644 erpnext/hr/doctype/additional_salary_component/additional_salary_component.py create mode 100644 erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.js create mode 100644 erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py diff --git a/erpnext/config/hr.py b/erpnext/config/hr.py index 4e9e91ef3b..e1c589fe09 100644 --- a/erpnext/config/hr.py +++ b/erpnext/config/hr.py @@ -123,6 +123,10 @@ def get_data(): "type": "doctype", "name": "Salary Component", }, + { + "type": "doctype", + "name": "Additional Salary Component", + }, { "type": "doctype", "name": "Salary Structure", diff --git a/erpnext/hr/doctype/additional_salary_component/__init__.py b/erpnext/hr/doctype/additional_salary_component/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js new file mode 100644 index 0000000000..36bfdf2a08 --- /dev/null +++ b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js @@ -0,0 +1,21 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Additional Salary Component', { + setup: function(frm) { + frm.set_query("salary_component", function() { + return { + filters: { + type: "earning" + } + } + }); + frm.set_query("employee", function() { + return { + filters: { + company: frm.doc.company + } + } + }); + } +}); diff --git a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.json b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.json new file mode 100644 index 0000000000..47b090469e --- /dev/null +++ b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.json @@ -0,0 +1,364 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:salary_component", + "beta": 0, + "creation": "2018-05-10 12:04:08.396461", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "salary_component", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Salary Component", + "length": 0, + "no_copy": 0, + "options": "Salary Component", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "From Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "To Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Additional Salary Component", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-10 12:54:06.155708", + "modified_by": "Administrator", + "module": "HR", + "name": "Additional Salary Component", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "employee", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py new file mode 100644 index 0000000000..0591082b4a --- /dev/null +++ b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document +from frappe.utils import formatdate, format_datetime, getdate, get_datetime, nowdate +from erpnext.hr.utils import validate_dates + +class AdditionalSalaryComponent(Document): + def validate(self): + # self.validate_dates() + validate_dates(self, self.from_date, self.to_date) + + # def validate_dates(self): + # date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee, + # ["date_of_joining", "relieving_date"]) + # if getdate(self.from_date) > getdate(to_date): + # frappe.throw(_("To date can not be less than from date")) + # elif getdate(self.from_date) > getdate(nowdate()): + # frappe.throw(_("Future dates not allowed")) + # elif date_of_joining and getdate(self.from_date) < getdate(date_of_joining): + # frappe.throw(_("From date can not be less than employee's joining date")) + # elif relieving_date and getdate(to_date) > getdate(relieving_date): + # frappe.throw(_("To date can not greater than employee's relieving date")) diff --git a/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.js b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.js new file mode 100644 index 0000000000..118290bcfa --- /dev/null +++ b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Additional Salary Component", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Additional Salary Component + () => frappe.tests.make('Additional Salary Component', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py new file mode 100644 index 0000000000..6859da1c0b --- /dev/null +++ b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAdditionalSalaryComponent(unittest.TestCase): + pass From d0b0c87f4034261d3431e83eb0fdab24b50e2289 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Fri, 11 May 2018 11:33:07 +0530 Subject: [PATCH 114/154] get additional salary component in salary slip --- .../additional_salary_component.py | 80 +++++++++++++++---- erpnext/hr/doctype/salary_slip/salary_slip.py | 7 ++ 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py index 0591082b4a..216dea0403 100644 --- a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py +++ b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.py @@ -5,22 +5,72 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -from frappe.utils import formatdate, format_datetime, getdate, get_datetime, nowdate -from erpnext.hr.utils import validate_dates +from frappe import _ +from frappe.utils import getdate, date_diff class AdditionalSalaryComponent(Document): def validate(self): - # self.validate_dates() - validate_dates(self, self.from_date, self.to_date) + self.validate_dates() + if self.amount <= 0: + frappe.throw(_("Amount should be greater than zero.")) - # def validate_dates(self): - # date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee, - # ["date_of_joining", "relieving_date"]) - # if getdate(self.from_date) > getdate(to_date): - # frappe.throw(_("To date can not be less than from date")) - # elif getdate(self.from_date) > getdate(nowdate()): - # frappe.throw(_("Future dates not allowed")) - # elif date_of_joining and getdate(self.from_date) < getdate(date_of_joining): - # frappe.throw(_("From date can not be less than employee's joining date")) - # elif relieving_date and getdate(to_date) > getdate(relieving_date): - # frappe.throw(_("To date can not greater than employee's relieving date")) + def validate_dates(self): + date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee, + ["date_of_joining", "relieving_date"]) + if getdate(self.from_date) > getdate(self.to_date): + frappe.throw(_("To date can not be less than from date")) + elif date_of_joining and getdate(self.from_date) < getdate(date_of_joining): + frappe.throw(_("From date can not be less than employee's joining date")) + elif relieving_date and getdate(self.to_date) > getdate(relieving_date): + frappe.throw(_("To date can not greater than employee's relieving date")) + + def get_amount(self, sal_start_date, sal_end_date): + start_date = getdate(sal_start_date) + end_date = getdate(sal_end_date) + total_days = date_diff(getdate(self.to_date), getdate(self.from_date)) + 1 + amount_per_day = self.amount / total_days + if getdate(sal_start_date) <= getdate(self.from_date): + start_date = getdate(self.from_date) + if getdate(sal_end_date) > getdate(self.to_date): + end_date = getdate(self.end_date) + no_of_days = date_diff(getdate(end_date), getdate(start_date)) + return amount_per_day * no_of_days + + + + +@frappe.whitelist() +def get_additional_salary_component(employee, start_date, end_date): + additional_components = frappe.db.sql(""" + select name from `tabAdditional Salary Component` + where employee=%(employee)s + and docstatus = 1 + and ( + (%(from_date)s between from_date and to_date) + or (%(to_date)s between from_date and to_date) + or (from_date between %(from_date)s and %(to_date)s) + )""", { + 'employee': employee, + 'from_date': start_date, + 'to_date': end_date + }) + + if additional_components: + additional_components_array = [] + for additional_component in additional_components: + struct_row = {} + additional_components_dict = {} + additional_component_obj = frappe.get_doc("Additional Salary Component", additional_component[0]) + amount = additional_component_obj.get_amount(start_date, end_date) + salary_component = frappe.get_doc("Salary Component", additional_component_obj.salary_component) + struct_row['depends_on_lwp'] = salary_component.depends_on_lwp + struct_row['salary_component'] = salary_component.name + struct_row['abbr'] = salary_component.salary_component_abbr + struct_row['do_not_include_in_total'] = salary_component.do_not_include_in_total + additional_components_dict['amount'] = amount + additional_components_dict['struct_row'] = struct_row + additional_components_array.append(additional_components_dict) + + if len(additional_components_array) > 0: + return additional_components_array + return False diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 99de580a3f..984a78c75f 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -12,6 +12,7 @@ from erpnext.hr.doctype.payroll_entry.payroll_entry import get_start_end_dates from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee from erpnext.utilities.transaction_base import TransactionBase from frappe.utils.background_jobs import enqueue +from erpnext.hr.doctype.additional_salary_component.additional_salary_component import get_additional_salary_component class SalarySlip(TransactionBase): def autoname(self): @@ -58,6 +59,12 @@ class SalarySlip(TransactionBase): if amount and struct_row.statistical_component == 0: self.update_component_row(struct_row, amount, key) + additional_components = get_additional_salary_component(self.employee, self.start_date, self.end_date) + if additional_components: + for additional_component in additional_components: + additional_component = frappe._dict(additional_component) + self.update_component_row(frappe._dict(additional_component.struct_row), additional_component.amount, "earnings") + def update_component_row(self, struct_row, amount, key): component_row = None for d in self.get(key): From 236be226484abc538b79fca4f03d4aac26dd6f8b Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 13:32:50 +0530 Subject: [PATCH 115/154] Payroll entry - get employee fix --- erpnext/hr/doctype/payroll_entry/payroll_entry.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.py b/erpnext/hr/doctype/payroll_entry/payroll_entry.py index e1b841f9b9..0dd2b4cb07 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.py +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.py @@ -38,19 +38,19 @@ class PayrollEntry(Document): ifnull(salary_slip_based_on_timesheet,0) = %(salary_slip_based_on_timesheet)s {condition}""".format(condition=condition), {"company": self.company, "salary_slip_based_on_timesheet":self.salary_slip_based_on_timesheet}) - if sal_struct: cond += "and t2.salary_structure IN %(sal_struct)s " + cond += "and ((%(from_date)s between t2.from_date and ifnull(t2.to_date, '2199-12-31')) or (%(to_date)s between t2.from_date and ifnull(t2.to_date, '2199-12-31')) or (t2.from_date between %(from_date)s and %(to_date)s))" emp_list = frappe.db.sql(""" select - t1.name as employee, t1.employee_name, t1.department, t1.designation + t1.name as employee, t1.employee_name, t1.department, t1.designation, t2.name from `tabEmployee` t1, `tabSalary Structure Assignment` t2 where t1.docstatus!=2 and t1.name = t2.employee and t2.docstatus = 1 - %s """% cond, {"sal_struct": sal_struct}, as_dict=True) + %s """% cond, {"sal_struct": sal_struct, "from_date": self.start_date, "to_date": self.end_date}, as_dict=True) return emp_list def fill_employee_details(self): From 39097c7fbe963c5df9c5df4a1166266993efad61 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Mon, 7 May 2018 14:54:25 +0530 Subject: [PATCH 116/154] codacy fix --- .../purchase_analytics/purchase_analytics.js | 11 ++++++----- .../doctype/supplier_group/supplier_group.js | 16 ++++++++-------- .../supplier_group/supplier_group_tree.js | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/erpnext/buying/page/purchase_analytics/purchase_analytics.js b/erpnext/buying/page/purchase_analytics/purchase_analytics.js index b503113837..06764a3c60 100644 --- a/erpnext/buying/page/purchase_analytics/purchase_analytics.js +++ b/erpnext/buying/page/purchase_analytics/purchase_analytics.js @@ -130,14 +130,15 @@ erpnext.PurchaseAnalytics = frappe.views.TreeGridReport.extend({ if(!this.data || me.item_type != me.tree_type) { + var items; if(me.tree_type=='Supplier') { - var items = frappe.report_dump.data["Supplier"]; - } if(me.tree_type=='Supplier Group') { - var items = this.prepare_tree("Supplier", "Supplier Group"); + items = frappe.report_dump.data["Supplier"]; + } else if(me.tree_type=='Supplier Group') { + items = this.prepare_tree("Supplier", "Supplier Group"); } else if(me.tree_type=="Item Group") { - var items = this.prepare_tree("Item", "Item Group"); + items = this.prepare_tree("Item", "Item Group"); } else if(me.tree_type=="Item") { - var items = frappe.report_dump.data["Item"]; + items = frappe.report_dump.data["Item"]; } me.item_type = me.tree_type diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.js b/erpnext/setup/doctype/supplier_group/supplier_group.js index ea92726e2a..ac5bda6e2c 100644 --- a/erpnext/setup/doctype/supplier_group/supplier_group.js +++ b/erpnext/setup/doctype/supplier_group/supplier_group.js @@ -4,7 +4,7 @@ cur_frm.cscript.refresh = function(doc) { cur_frm.set_intro(doc.__islocal ? "" : __("There is nothing to edit.")); cur_frm.cscript.set_root_readonly(doc); -} +}; cur_frm.cscript.set_root_readonly = function(doc) { // read-only for root customer group @@ -14,16 +14,16 @@ cur_frm.cscript.set_root_readonly = function(doc) { } else { cur_frm.set_intro(null); } -} +}; -//get query select Customer Group -cur_frm.fields_dict['parent_supplier_group'].get_query = function(doc,cdt,cdn) { +// get query select Customer Group +cur_frm.fields_dict['parent_supplier_group'].get_query = function() { return { filters: { 'is_group': 1 } - } -} + }; +}; cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(doc, cdt, cdn) { var d = locals[cdt][cdn]; @@ -33,5 +33,5 @@ cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(d 'company': d.company, "is_group": 0 } - } -} + }; +}; diff --git a/erpnext/setup/doctype/supplier_group/supplier_group_tree.js b/erpnext/setup/doctype/supplier_group/supplier_group_tree.js index 24328bdd5a..73926992e8 100644 --- a/erpnext/setup/doctype/supplier_group/supplier_group_tree.js +++ b/erpnext/setup/doctype/supplier_group/supplier_group_tree.js @@ -1,3 +1,3 @@ frappe.treeview_settings["Supplier Group"] = { ignore_fields:["parent_supplier_group"] -} \ No newline at end of file +}; \ No newline at end of file From 513f13df272de2ceb190d898204753eafbeedf47 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Mon, 14 May 2018 16:05:16 +0530 Subject: [PATCH 117/154] patch fix --- .../patches/v11_0/rename_supplier_type_to_supplier_group.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py index 4db5704ad6..f0907af333 100644 --- a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py +++ b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py @@ -21,6 +21,9 @@ def execute(): build_tree() def build_tree(): + frappe.db.sql("""update `tabSupplier Group` set parent_supplier_group = '{0}' + where is_group = 0""".format(_('All Supplier Groups'))) + if not frappe.db.exists("Supplier Group", _('All Supplier Groups')): frappe.get_doc({ 'doctype': 'Supplier Group', @@ -28,7 +31,4 @@ def build_tree(): 'is_group': 1 }).insert(ignore_permissions=True) - frappe.db.sql("""update `tabSupplier Group` set parent_supplier_group = '{0}' - where is_group = 0""".format(_('All Supplier Groups'))) - rebuild_tree("Supplier Group", "parent_supplier_group") From 366ca92ba75b21cb3e986b9bb46f60dd114bb3f6 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Wed, 18 Apr 2018 16:11:38 +0530 Subject: [PATCH 118/154] move default_currency on top --- erpnext/setup/doctype/company/company.json | 86 +++++++++++----------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 66b1433eb1..d236dda873 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -456,7 +456,38 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "default_letter_head", + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "default_letter_head", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -465,10 +496,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Letter Head", + "label": "Default Letter Head", "length": 0, "no_copy": 0, - "options": "Letter Head", + "options": "Letter Head", "permlevel": 0, "precision": "", "print_hide": 0, @@ -488,7 +519,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "default_holiday_list", + "fieldname": "default_holiday_list", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -497,12 +528,12 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Holiday List", + "label": "Default Holiday List", "length": 0, "no_copy": 0, - "options": "Holiday List", + "options": "Holiday List", "permlevel": 0, - "precision": "", + "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, @@ -520,57 +551,26 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "default_terms", + "fieldname": "default_terms", "fieldtype": "Link", "hidden": 0, - "ignore_user_permissions": 0, + "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Terms", + "label": "Default Terms", "length": 0, "no_copy": 0, - "options": "Terms and Conditions", + "options": "Terms and Conditions", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 0, "set_only_once": 0, "translatable": 0, From 39668609ce0df12132a622ca274d36f596d3a8cc Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Wed, 18 Apr 2018 18:13:24 +0530 Subject: [PATCH 119/154] improv department tree --- erpnext/hr/doctype/department/department.py | 21 ++++++++++++++- .../hr/doctype/department/department_tree.js | 26 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/department/department.py b/erpnext/hr/doctype/department/department.py index fda1b69de2..f1e0aeed8e 100644 --- a/erpnext/hr/doctype/department/department.py +++ b/erpnext/hr/doctype/department/department.py @@ -21,4 +21,23 @@ class Department(NestedSet): delete_events(self.doctype, self.name) def on_doctype_update(): - frappe.db.add_index("Department", ["lft", "rgt"]) \ No newline at end of file + frappe.db.add_index("Department", ["lft", "rgt"]) + +@frappe.whitelist() +def get_children(doctype, parent=None, company=None, is_root=False): + condition = '' + if company == parent: + condition = 'name="All Departments"' + elif company: + condition = "parent_department='{0}' and company='{1}'".format(parent, company) + else: + condition = "parent_department = '{0}'".format(parent) + + return frappe.db.sql(""" + select + name as value, + is_group as expandable + from `tab{doctype}` + where + {condition} + order by name""".format(doctype=doctype, condition=condition), as_dict=1) diff --git a/erpnext/hr/doctype/department/department_tree.js b/erpnext/hr/doctype/department/department_tree.js index 5652ad61a0..1f891fd1e5 100644 --- a/erpnext/hr/doctype/department/department_tree.js +++ b/erpnext/hr/doctype/department/department_tree.js @@ -1,3 +1,27 @@ frappe.treeview_settings["Department"] = { - ignore_fields:["parent_department"] + ignore_fields:["parent_department"], + get_tree_nodes: 'erpnext.hr.doctype.department.department.get_children', + filters: [ + { + fieldname: "company", + fieldtype:"Link", + options: "Company", + label: __("Company"), + }, + ], + breadcrumb: "HR", + root_label: "All Departments", + get_tree_root: true, + menu_items: [ + { + label: __("New Department"), + action: function() { + frappe.new_doc("Department", true); + }, + condition: 'frappe.boot.user.can_create.indexOf("Department") !== -1' + } + ], + onload: function(treeview) { + treeview.make_tree(); + } }; \ No newline at end of file From 9a8f5bd6c73b58b77a2ca8a18a882cc0c60723e5 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 11 May 2018 12:36:54 +0530 Subject: [PATCH 120/154] set department name with company abbr --- erpnext/hr/doctype/department/department.json | 4 ++-- erpnext/hr/doctype/department/department.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/department/department.json b/erpnext/hr/doctype/department/department.json index a1c8dc16ff..664679d3f1 100644 --- a/erpnext/hr/doctype/department/department.json +++ b/erpnext/hr/doctype/department/department.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, - "autoname": "field:department_name", + "autoname": "", "beta": 0, "creation": "2013-02-05 11:48:26", "custom": 0, @@ -434,7 +434,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-18 12:02:42.572599", + "modified": "2018-05-11 12:18:18.839182", "modified_by": "Administrator", "module": "HR", "name": "Department", diff --git a/erpnext/hr/doctype/department/department.py b/erpnext/hr/doctype/department/department.py index f1e0aeed8e..19994ae5ef 100644 --- a/erpnext/hr/doctype/department/department.py +++ b/erpnext/hr/doctype/department/department.py @@ -10,6 +10,10 @@ from frappe.model.document import Document class Department(NestedSet): nsm_parent_field = 'parent_department' + def autoname(self): + abbr = frappe.db.get_value('Company', self.company, 'abbr') + self.name = '{0} - {1}'.format(self.department_name, abbr) + def update_nsm_model(self): frappe.utils.nestedset.update_nsm(self) From 03ad0f2f4a0a73a715de65b7900ec8ffa1f00b90 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Fri, 11 May 2018 16:57:44 +0530 Subject: [PATCH 121/154] set query for department based on company --- erpnext/assets/doctype/asset/asset.js | 8 +++ .../doctype/instructor/instructor.js | 72 ++++++++++++------- erpnext/hr/doctype/employee/employee.js | 9 +++ erpnext/hr/doctype/job_opening/job_opening.js | 9 +++ .../leave_control_panel.js | 17 ++++- .../hr/doctype/leave_period/leave_period.js | 10 ++- .../hr/doctype/payroll_entry/payroll_entry.js | 8 +++ .../hr/doctype/staffing_plan/staffing_plan.js | 8 +++ 8 files changed, 112 insertions(+), 29 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 236c4f9f9b..f4a01aefca 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -23,6 +23,14 @@ frappe.ui.form.on('Asset', { } }; }); + + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); }, refresh: function(frm) { diff --git a/erpnext/education/doctype/instructor/instructor.js b/erpnext/education/doctype/instructor/instructor.js index 62d73b32ee..f9c7a2a13d 100644 --- a/erpnext/education/doctype/instructor/instructor.js +++ b/erpnext/education/doctype/instructor/instructor.js @@ -1,31 +1,53 @@ cur_frm.add_fetch("employee", "department", "department"); cur_frm.add_fetch("employee", "image", "image"); -frappe.ui.form.on("Instructor", "refresh", function(frm) { - if(!frm.doc.__islocal) { - frm.add_custom_button(__("Student Group"), function() { - frappe.route_options = { - instructor: frm.doc.name - } - frappe.set_route("List", "Student Group"); +frappe.ui.form.on("Instructor", { + employee: function(frm) { + if(!frm.doc.employee) return; + frappe.db.get_value('Employee', {name: frm.doc.employee}, 'company', (company) => { + frm.set_query("department", function() { + return { + "filters": { + "company": company, + } + }; + }); + + frm.set_query("department", "instructor_log", function() { + return { + "filters": { + "company": company, + } + }; + }); }); - frm.add_custom_button(__("Course Schedule"), function() { - frappe.route_options = { - instructor: frm.doc.name - } - frappe.set_route("List", "Course Schedule"); - }); - frm.add_custom_button(__("As Examiner"), function() { - frappe.route_options = { - examiner: frm.doc.name - } - frappe.set_route("List", "Assessment Plan"); - }, __("Assessment Plan")); - frm.add_custom_button(__("As Supervisor"), function() { - frappe.route_options = { - supervisor: frm.doc.name - } - frappe.set_route("List", "Assessment Plan"); - }, __("Assessment Plan")); + }, + refresh: function(frm) { + if(!frm.doc.__islocal) { + frm.add_custom_button(__("Student Group"), function() { + frappe.route_options = { + instructor: frm.doc.name + } + frappe.set_route("List", "Student Group"); + }); + frm.add_custom_button(__("Course Schedule"), function() { + frappe.route_options = { + instructor: frm.doc.name + } + frappe.set_route("List", "Course Schedule"); + }); + frm.add_custom_button(__("As Examiner"), function() { + frappe.route_options = { + examiner: frm.doc.name + } + frappe.set_route("List", "Assessment Plan"); + }, __("Assessment Plan")); + frm.add_custom_button(__("As Supervisor"), function() { + frappe.route_options = { + supervisor: frm.doc.name + } + frappe.set_route("List", "Assessment Plan"); + }, __("Assessment Plan")); + } } }); diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js index 240411dcfa..6f6873ac1d 100755 --- a/erpnext/hr/doctype/employee/employee.js +++ b/erpnext/hr/doctype/employee/employee.js @@ -37,6 +37,15 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({ }); frappe.ui.form.on('Employee',{ + onload:function(frm) { + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); + }, prefered_contact_email:function(frm){ frm.events.update_contact(frm) }, diff --git a/erpnext/hr/doctype/job_opening/job_opening.js b/erpnext/hr/doctype/job_opening/job_opening.js index 960f5b3c65..7b0e447a9e 100644 --- a/erpnext/hr/doctype/job_opening/job_opening.js +++ b/erpnext/hr/doctype/job_opening/job_opening.js @@ -2,6 +2,15 @@ // For license information, please see license.txt frappe.ui.form.on('Job Opening', { + onload: function(frm) { + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); + }, designation: function(frm) { if(frm.doc.designation && frm.doc.company){ frappe.call({ diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js index 0eb6414406..7aeb8ea65d 100644 --- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js +++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js @@ -26,6 +26,19 @@ cur_frm.cscript.allocation_type = function (doc, cdt, cdn) { refresh_field('no_of_days'); } -frappe.ui.form.on("Leave Control Panel", "refresh", function (frm) { - frm.disable_save(); +frappe.ui.form.on("Leave Control Panel", { + company: function(frm) { + if(frm.doc.company) { + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); + } + }, + refresh: function(frm) { + frm.disable_save(); + } }); \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_period/leave_period.js b/erpnext/hr/doctype/leave_period/leave_period.js index 2a6010e44f..a54147d18a 100644 --- a/erpnext/hr/doctype/leave_period/leave_period.js +++ b/erpnext/hr/doctype/leave_period/leave_period.js @@ -2,7 +2,13 @@ // For license information, please see license.txt frappe.ui.form.on('Leave Period', { - refresh: function(frm) { - + onload: function(frm) { + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); } }); diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.js b/erpnext/hr/doctype/payroll_entry/payroll_entry.js index 1e6dc510b0..d02e1f1dc3 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.js +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.js @@ -9,6 +9,14 @@ frappe.ui.form.on('Payroll Entry', { frm.doc.posting_date = frappe.datetime.nowdate(); } frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet); + + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); }, refresh: function(frm) { diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.js b/erpnext/hr/doctype/staffing_plan/staffing_plan.js index 1c1a720088..ca57d9f19d 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.js +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.js @@ -17,6 +17,14 @@ frappe.ui.form.on('Staffing Plan', { ] } }); + + frm.set_query("department", function() { + return { + "filters": { + "company": frm.doc.company, + } + }; + }); } }); From d25a264e5bd5258cb6dea894e18d1393fd814da1 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Sun, 13 May 2018 14:34:20 +0530 Subject: [PATCH 122/154] create and update department records patch --- erpnext/patches.txt | 1 + ...ate_department_records_for_each_company.py | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 erpnext/patches/v11_0/create_department_records_for_each_company.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 3fffade9bb..4bbb3e9e70 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -527,3 +527,4 @@ erpnext.patches.v11_0.rename_field_max_days_allowed erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance erpnext.patches.v11_0.rebuild_tree_for_company +erpnext.patches.v11_0.create_department_records_for_each_company diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py new file mode 100644 index 0000000000..514c709071 --- /dev/null +++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py @@ -0,0 +1,51 @@ +import frappe +from frappe.utils.nestedset import rebuild_tree + +def execute(): + frappe.reload_doc("hr", "doctype", "department") + companies = frappe.db.get_all("Company", fields=["name", "abbr"]) + departments = frappe.db.get_all("Department") + comp_dict = {} + + # create a blank list for each company + for company in companies: + comp_dict[company.name] = {} + + for department in departments: + # skip root node + if department.name == "All Departments": + continue + + # for each company, create a copy of the doc + department_doc = frappe.get_doc("Department", department) + for company in companies: + copy_doc = frappe.copy_doc(department_doc) + copy_doc.update({"company": company.name}) + copy_doc.insert() + + # append list of new department for each company + comp_dict[company.name][department.name] = copy_doc.name + + rebuild_tree('Department', 'parent_department') + doctypes = ["Asset", "Employee", "Leave Period", "Payroll Entry", "Staffing Plan", "Job Opening"] + + for d in doctypes: + update_records(d, comp_dict) + +def update_records(doctype, comp_dict): + when_then = [] + for company in comp_dict: + records = comp_dict[company] + + for department in records: + when_then.append(''' + WHEN company = "%s" and department = "%s" + THEN "%s" + '''%(company, department, records[department])) + + frappe.db.sql(""" + update + `tab%s` + set + department = CASE %s END + """%(doctype, " ".join(when_then)), debug=1) From 06fd51bf696a0344c6ebc8df77f2ebe307e93871 Mon Sep 17 00:00:00 2001 From: Zlash65 Date: Mon, 14 May 2018 17:16:27 +0530 Subject: [PATCH 123/154] patch fix for instructor --- ...ate_department_records_for_each_company.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py index 514c709071..94071857d7 100644 --- a/erpnext/patches/v11_0/create_department_records_for_each_company.py +++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py @@ -32,6 +32,8 @@ def execute(): for d in doctypes: update_records(d, comp_dict) + update_instructors(comp_dict) + def update_records(doctype, comp_dict): when_then = [] for company in comp_dict: @@ -48,4 +50,24 @@ def update_records(doctype, comp_dict): `tab%s` set department = CASE %s END - """%(doctype, " ".join(when_then)), debug=1) + """%(doctype, " ".join(when_then))) + +def update_instructors(comp_dict): + when_then = [] + emp_details = frappe.get_all("Employee", fields=["name", "company"]) + + for employee in emp_details: + records = comp_dict[employee.company] + + for department in records: + when_then.append(''' + WHEN employee = "%s" and department = "%s" + THEN "%s" + '''%(employee.name, department, records[department])) + + frappe.db.sql(""" + update + `tabInstructor` + set + department = CASE %s END + """%(" ".join(when_then))) From b848c515923386fc119313b0edadc4dd9fb54b44 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 17:56:22 +0530 Subject: [PATCH 124/154] Compensatory Leave Request - leave allocation create and update - fix --- .../compensatory_leave_request.py | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index ec522281c3..414066838a 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import date_diff +from frappe.utils import date_diff, add_days from frappe.model.document import Document from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period @@ -20,21 +20,49 @@ class CompensatoryLeaveRequest(Document): frappe.throw(_("Please select a leave type to submit the request")) else: company = frappe.db.get_value("Employee", self.employee, "company") + date_difference = date_diff(self.work_end_date, self.work_from_date) + 1 leave_period = get_leave_period(self.work_from_date, self.work_end_date, company) if leave_period: - self.create_leave_allocation(leave_period) + leave_allocation_name = self.exists_allocation_for_period(leave_period) + if leave_allocation_name: + leave_allocation = frappe.get_doc("Leave Allocation", leave_allocation_name) + new_leaves_allocated = leave_allocation.new_leaves_allocated + leave_allocation.new_leaves_allocated += date_difference + leave_allocation.submit() + else: + self.create_leave_allocation(leave_period, date_difference) else: frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date)) - def create_leave_allocation(self, leave_period): - date_difference = date_diff(self.work_end_date, self.work_from_date) + 1 + def exists_allocation_for_period(self, leave_period): + leave_allocation = frappe.db.sql(""" + select name + from `tabLeave Allocation` + where employee=%(employee)s and leave_type=%(leave_type)s + and docstatus=1 + and (from_date between %(from_date)s and %(to_date)s + or to_date between %(from_date)s and %(to_date)s + or (from_date < %(from_date)s and to_date > %(to_date)s)) + """, { + "from_date": leave_period[0].from_date, + "to_date": leave_period[0].to_date, + "employee": self.employee, + "leave_type": self.leave_type + }, as_dict=1) + + if leave_allocation: + return leave_allocation[0].name + else: + False + + def create_leave_allocation(self, leave_period, date_difference): is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") allocation = frappe.new_doc("Leave Allocation") allocation.employee = self.employee allocation.employee_name = self.employee_name allocation.leave_type = self.leave_type - allocation.from_date = self.work_from_date - allocation.to_date = self.work_end_date + allocation.from_date = add_days(self.work_end_date, 1) + allocation.to_date = leave_period[0].to_date allocation.new_leaves_allocated = date_difference allocation.total_leaves_allocated = date_difference allocation.compensatory_request = self.name From 32b3aa257c65ac0182b07e79bdc987a258e99564 Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Mon, 14 May 2018 18:02:24 +0530 Subject: [PATCH 125/154] [Fix] Indentation for accounting_period overlap --- .../accounting_period/accounting_period.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py index 306bf9177e..8760d8f35e 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -15,20 +15,20 @@ class AccountingPeriod(Document): self.name = " - ".join([self.period_name, company_abbr]) def validate_overlap(self): - existing_accounting_period = frappe.db.sql("""select name from `tabAccounting Period` - where ( - (%(start_date)s between start_date and end_date) - or (%(end_date)s between start_date and end_date) - or (start_date between %(start_date)s and %(end_date)s) - or (end_date between %(start_date)s and %(end_date)s) - ) and name!=%(name)s and company=%(company)s""", - { - "start_date": self.start_date, - "end_date": self.end_date, - "name": self.name, - "company": self.company - }, as_dict=True) + existing_accounting_period = frappe.db.sql("""select name from `tabAccounting Period` + where ( + (%(start_date)s between start_date and end_date) + or (%(end_date)s between start_date and end_date) + or (start_date between %(start_date)s and %(end_date)s) + or (end_date between %(start_date)s and %(end_date)s) + ) and name!=%(name)s and company=%(company)s""", + { + "start_date": self.start_date, + "end_date": self.end_date, + "name": self.name, + "company": self.company + }, as_dict=True) - if len(existing_accounting_period) > 0: - frappe.throw("Accounting Period overlaps with {0}".format(existing_accounting_period[0].get("name"))) + if len(existing_accounting_period) > 0: + frappe.throw("Accounting Period overlaps with {0}".format(existing_accounting_period[0].get("name"))) From 2fe38c3ff5b89c72e5a15f365e6a005370bc0c8f Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Mon, 14 May 2018 18:06:34 +0530 Subject: [PATCH 126/154] Bootstrap documents for closing --- .../accounting_period/accounting_period.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py index 8760d8f35e..f2ba578965 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -10,6 +10,9 @@ class AccountingPeriod(Document): def validate(self): self.validate_overlap() + def before_insert(self): + self.bootstrap_doctypes_for_closing() + def autoname(self): company_abbr = frappe.db.get_value("Company", self.company, "abbr") self.name = " - ".join([self.period_name, company_abbr]) @@ -32,3 +35,20 @@ class AccountingPeriod(Document): if len(existing_accounting_period) > 0: frappe.throw("Accounting Period overlaps with {0}".format(existing_accounting_period[0].get("name"))) + def get_doctypes_for_closing(self): + docs_for_closing = [] + #if not self.closed_documents or len(self.closed_documents) == 0: + doctypes = ["Sales Invoice", "Purchase Invoice", "Journal Entry", "Payroll Entry", "Bank Reconciliation", "Asset", "Purchase Order", "Sales Order", "Leave Application", "Leave Allocation", "Stock Entry"] + closed_doctypes = [{"document_type": doctype, "closed": 1} for doctype in doctypes] + for closed_doctype in closed_doctypes: + docs_for_closing.append(closed_doctype) + + return docs_for_closing + + def bootstrap_doctypes_for_closing(self): + if self.closed_documents.length == 0: + for doctype_for_closing in self.get_doctypes_for_closing(): + self.append('closed_documents', { + "document_type": doctype_for_closing.document_type, + "closed": doctype_for_closing.closed + }) From 52571a80daef6bba3ffeb10712183347bd69ad41 Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Mon, 14 May 2018 18:06:50 +0530 Subject: [PATCH 127/154] Bootstrap documents for closing (js) --- .../accounting_period/accounting_period.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.js b/erpnext/accounts/doctype/accounting_period/accounting_period.js index 1fb57eabcf..e3d805a168 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.js +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.js @@ -2,7 +2,23 @@ // For license information, please see license.txt frappe.ui.form.on('Accounting Period', { - refresh: function(frm) { - + onload: function(frm) { + if(frm.doc.closed_documents.length === 0 || (frm.doc.closed_documents.length === 1 && frm.doc.closed_documents[0].document_type == undefined)) { + frappe.call({ + method: "get_doctypes_for_closing", + doc:frm.doc, + callback: function(r) { + if(r.message) { + cur_frm.clear_table("closed_documents"); + r.message.forEach(function(element) { + var c = frm.add_child("closed_documents"); + c.document_type = element.document_type; + c.closed = element.closed; + }); + refresh_field("closed_documents"); + } + } + }); + } } }); From ead858b4deddac9e900957c38b36f7e5830ea28d Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 18:08:31 +0530 Subject: [PATCH 128/154] Compensatory Leave Request - fix --- .../compensatory_leave_request.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index 414066838a..2ebe41a0fb 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -23,9 +23,8 @@ class CompensatoryLeaveRequest(Document): date_difference = date_diff(self.work_end_date, self.work_from_date) + 1 leave_period = get_leave_period(self.work_from_date, self.work_end_date, company) if leave_period: - leave_allocation_name = self.exists_allocation_for_period(leave_period) - if leave_allocation_name: - leave_allocation = frappe.get_doc("Leave Allocation", leave_allocation_name) + leave_allocation = self.exists_allocation_for_period(leave_period) + if leave_allocation: new_leaves_allocated = leave_allocation.new_leaves_allocated leave_allocation.new_leaves_allocated += date_difference leave_allocation.submit() @@ -51,7 +50,7 @@ class CompensatoryLeaveRequest(Document): }, as_dict=1) if leave_allocation: - return leave_allocation[0].name + return frappe.get_doc("Leave Allocation", leave_allocation[0].name) else: False From caaebb9d2ac1c3b6cd421a23619e799f80fe7116 Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Mon, 14 May 2018 18:11:09 +0530 Subject: [PATCH 129/154] [WIP] Accounting Period Test cases --- .../test_accounting_period.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py index 99694d2136..cc2e6a9fc6 100644 --- a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py @@ -7,4 +7,21 @@ import frappe import unittest class TestAccountingPeriod(unittest.TestCase): - pass + def test_overlap(self): + ap1 = create_accounting_period({"start_date":"2018-04-01", "end_date":"2018-06-30", "company":"Wind Power LLC"}) + ap1.save() + ap2 = create_accounting_period({"start_date":"2018-06-30", "end_date":"2018-07-10", "company":"Wind Power LLC"}) + self.assertRaises(frappe.OverlapError, accounting_period_2.save()) + + def tearDown(self): + pass + + +def create_accounting_period(**args): + accounting_period = frappe.new_doc("Accounting Period") + accounting_period.start_date = args.start_date or frappe.utils.datetime.date(2018, 4, 1) + accounting_period.end_date = args.end_date or frappe.utils.datetime.date(2018, 6, 30) + accounting_period.company = args.company + accounting_period.period_name = "_Test_Period_Name_1" + + return accounting_period From 21b2df41accea57653f39891ab0bd30b801ed6dc Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Mon, 14 May 2018 18:15:47 +0530 Subject: [PATCH 130/154] [Fix] len() instead of .length --- erpnext/accounts/doctype/accounting_period/accounting_period.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py index f2ba578965..32441db2c1 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -46,7 +46,7 @@ class AccountingPeriod(Document): return docs_for_closing def bootstrap_doctypes_for_closing(self): - if self.closed_documents.length == 0: + if len(self.closed_documents) == 0: for doctype_for_closing in self.get_doctypes_for_closing(): self.append('closed_documents', { "document_type": doctype_for_closing.document_type, From f5e67213fdd96268eabbfb96ecfb794f38f244ef Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 18:34:34 +0530 Subject: [PATCH 131/154] Attendance Request - half day check is enabled --- .../attendance_request/attendance_request.js | 9 ++- .../attendance_request.json | 77 +++++++++++++++++-- .../attendance_request/attendance_request.py | 11 ++- 3 files changed, 86 insertions(+), 11 deletions(-) diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.js b/erpnext/hr/doctype/attendance_request/attendance_request.js index caf955aed1..2d25d14181 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.js +++ b/erpnext/hr/doctype/attendance_request/attendance_request.js @@ -3,7 +3,12 @@ cur_frm.add_fetch('employee', 'company', 'company'); frappe.ui.form.on('Attendance Request', { - refresh: function(frm) { - + half_day: function(frm) { + if(frm.doc.half_day == 1){ + frm.set_df_property('half_day_date', 'reqd', true); + } + else{ + frm.set_df_property('half_day_date', 'reqd', false); + } } }); diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.json b/erpnext/hr/doctype/attendance_request/attendance_request.json index e1a34c9c43..71c28de6ab 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.json +++ b/erpnext/hr/doctype/attendance_request/attendance_request.json @@ -145,19 +145,18 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "reason", - "fieldtype": "Select", + "fieldname": "half_day", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, - "label": "Reason", + "label": "Half Day", "length": 0, "no_copy": 0, - "options": "Work From Home\nOn Duty", "permlevel": 0, "precision": "", "print_hide": 0, @@ -165,7 +164,39 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "half_day", + "fieldname": "half_day_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Half Day Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0, "set_only_once": 0, "translatable": 0, @@ -232,6 +263,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reason", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Reason", + "length": 0, + "no_copy": 0, + "options": "Work From Home\nOn Duty", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -306,7 +369,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-19 16:56:23.758754", + "modified": "2018-05-14 18:18:56.936880", "modified_by": "Administrator", "module": "HR", "name": "Attendance Request", diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.py b/erpnext/hr/doctype/attendance_request/attendance_request.py index eb0b3689c3..4cab11fef5 100644 --- a/erpnext/hr/doctype/attendance_request/attendance_request.py +++ b/erpnext/hr/doctype/attendance_request/attendance_request.py @@ -4,14 +4,18 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document -from frappe.utils import date_diff, add_days +from frappe.utils import date_diff, add_days, getdate from erpnext.hr.doctype.employee.employee import is_holiday from erpnext.hr.utils import validate_dates class AttendanceRequest(Document): def validate(self): validate_dates(self, self.from_date, self.to_date) + if self.half_day: + if not getdate(self.from_date)<=getdate(self.half_day_date)<=getdate(self.to_date): + frappe.throw(_("Half day date should be in between from date and to date")) def on_submit(self): self.create_attendance() @@ -32,7 +36,10 @@ class AttendanceRequest(Document): attendance = frappe.new_doc("Attendance") attendance.employee = self.employee attendance.employee_name = self.employee_name - attendance.status = "Present" + if self.half_day and date_diff(getdate(self.half_day_date), getdate(attendance_date)) == 0: + attendance.status = "Half Day" + else: + attendance.status = "Present" attendance.attendance_date = attendance_date attendance.company = self.company attendance.attendance_request = self.name From 70a998d4288bc838a1352cf93e7642d94d8d31ee Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 18:51:04 +0530 Subject: [PATCH 132/154] Remove unused variable --- .../compensatory_leave_request/compensatory_leave_request.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py index 2ebe41a0fb..b4e71ce96a 100644 --- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py +++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py @@ -25,7 +25,6 @@ class CompensatoryLeaveRequest(Document): if leave_period: leave_allocation = self.exists_allocation_for_period(leave_period) if leave_allocation: - new_leaves_allocated = leave_allocation.new_leaves_allocated leave_allocation.new_leaves_allocated += date_difference leave_allocation.submit() else: @@ -52,7 +51,7 @@ class CompensatoryLeaveRequest(Document): if leave_allocation: return frappe.get_doc("Leave Allocation", leave_allocation[0].name) else: - False + return False def create_leave_allocation(self, leave_period, date_difference): is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") From 47039e801e27a83984c1bcc851bc526c227235e4 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 18:54:10 +0530 Subject: [PATCH 133/154] Remove unused import --- .../test_additional_salary_component.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py index 6859da1c0b..eda2f79dc9 100644 --- a/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py +++ b/erpnext/hr/doctype/additional_salary_component/test_additional_salary_component.py @@ -2,8 +2,6 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt from __future__ import unicode_literals - -import frappe import unittest class TestAdditionalSalaryComponent(unittest.TestCase): From ab842541887cc8c0cda245cef88940e911731b97 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 26 Apr 2018 19:18:29 +0530 Subject: [PATCH 134/154] Asset linked to purchase receipt and serial no --- .../purchase_invoice/purchase_invoice.py | 17 -- .../purchase_invoice_item.json | 2 +- erpnext/assets/doctype/asset/asset.js | 3 +- erpnext/assets/doctype/asset/asset.json | 109 ++++++++++- erpnext/assets/doctype/asset/asset.py | 25 ++- .../assets/doctype/asset/asset_dashboard.py | 7 + .../asset_maintenance/asset_maintenance.json | 49 ++++- .../asset_maintenance/asset_maintenance.py | 3 + .../asset_movement/asset_movement.json | 171 +++++++++++++++++- .../doctype/asset_movement/asset_movement.py | 17 +- erpnext/controllers/accounts_controller.py | 52 +++--- erpnext/controllers/buying_controller.py | 126 +++++++++++++ erpnext/setup/doctype/company/company.js | 8 + erpnext/stock/doctype/item/item.json | 12 +- erpnext/stock/doctype/item/item.py | 2 +- .../purchase_receipt/purchase_receipt.js | 14 ++ .../purchase_receipt/purchase_receipt.py | 2 + .../purchase_receipt_dashboard.py | 3 +- .../purchase_receipt/test_purchase_receipt.py | 42 ++++- .../purchase_receipt_item.json | 66 ++++++- .../stock/doctype/serial_no/serial_no.json | 78 +++++++- erpnext/stock/doctype/serial_no/serial_no.py | 56 +++--- erpnext/stock/get_item_details.py | 4 + 23 files changed, 763 insertions(+), 105 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 67b41a3248..d2cc4eea9f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -305,24 +305,8 @@ class PurchaseInvoice(BuyingController): self.make_gl_entries() self.update_project() - self.update_fixed_asset() update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference) - def update_fixed_asset(self): - for d in self.get("items"): - if d.is_fixed_asset: - asset = frappe.get_doc("Asset", d.asset) - if self.docstatus==1: - asset.purchase_invoice = self.name - asset.purchase_date = self.posting_date - asset.supplier = self.supplier - else: - asset.purchase_invoice = None - asset.supplier = None - - asset.flags.ignore_validate_update_after_submit = True - asset.save() - def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): if not self.grand_total: return @@ -636,7 +620,6 @@ class PurchaseInvoice(BuyingController): self.make_gl_entries_on_cancel() self.update_project() - self.update_fixed_asset() frappe.db.set(self, 'status', 'Cancelled') unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference) diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json index d1f99ab3eb..ef9b2f69b6 100755 --- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json +++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -2258,7 +2258,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-02-22 15:15:25.297672", + "modified": "2018-04-23 14:07:33.576495", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Item", diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index f4a01aefca..edc1e364f5 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -181,7 +181,8 @@ frappe.ui.form.on('Asset', { args: { "asset": frm.doc.name, "item_code": frm.doc.item_code, - "company": frm.doc.company + "company": frm.doc.company, + "serial_no": frm.doc.serial_no }, method: "erpnext.assets.doctype.asset.asset.make_sales_invoice", callback: function(r) { diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 49b574d3b0..63b9167cc6 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -40,6 +40,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -71,6 +72,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -102,6 +104,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -133,6 +136,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -165,6 +169,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -196,6 +201,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -228,6 +234,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -260,6 +267,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -292,6 +300,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -322,6 +331,38 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Serial No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -351,6 +392,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -382,6 +424,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -413,6 +456,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -444,6 +488,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -474,6 +519,39 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_receipt", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Receipt", + "length": 0, + "no_copy": 1, + "options": "Purchase Receipt", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -505,6 +583,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -535,6 +614,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -565,6 +645,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -595,6 +676,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -626,6 +708,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -655,6 +738,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -686,6 +770,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -715,6 +800,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -747,6 +833,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -779,6 +866,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -808,6 +896,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -838,6 +927,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -869,6 +959,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -902,6 +993,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -933,6 +1025,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -963,6 +1056,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -992,6 +1086,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1023,6 +1118,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1053,6 +1149,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1084,6 +1181,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1115,6 +1213,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1146,6 +1245,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1176,6 +1276,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1207,6 +1308,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1237,6 +1339,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -1251,7 +1354,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-01-05 09:53:05.945328", + "modified": "2018-04-19 20:03:13.669957", "modified_by": "Administrator", "module": "Assets", "name": "Asset", @@ -1260,7 +1363,6 @@ "permissions": [ { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -1280,7 +1382,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -1307,4 +1408,4 @@ "sort_order": "DESC", "track_changes": 0, "track_seen": 0 -} +} \ No newline at end of file diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index baffdd757d..a9cc924b8f 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -10,6 +10,7 @@ from frappe.model.document import Document from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_fixed_asset_account from erpnext.assets.doctype.asset.depreciation \ import get_disposal_account_and_cost_center, get_depreciation_accounts +from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos class Asset(Document): def validate(self): @@ -26,12 +27,16 @@ class Asset(Document): def on_submit(self): self.set_status() + self.update_stock_movement() def on_cancel(self): self.validate_cancellation() self.delete_depreciation_entries() self.set_status() + def on_update(self): + self.update_serial_nos() + def validate_item(self): item = frappe.db.get_value("Item", self.item_code, ["is_fixed_asset", "is_stock_item", "disabled"], as_dict=1) @@ -219,6 +224,9 @@ class Asset(Document): if self.purchase_invoice: frappe.throw(_("Please cancel Purchase Invoice {0} first").format(self.purchase_invoice)) + if self.purchase_receipt: + frappe.throw(_("Please cancel Purchase Receipt {0} first").format(self.purchase_receipt)) + def delete_depreciation_entries(self): for d in self.get("schedules"): if d.journal_entry: @@ -250,6 +258,20 @@ class Asset(Document): status = "Cancelled" return status + def update_serial_nos(self): + if self.serial_no: + serial_nos = get_serial_nos(self.serial_no) + frappe.db.sql(""" update `tabSerial No` set asset = '%s' where + name in(%s)"""%(self.name, ','.join(['%s'] * len(serial_nos))), tuple(serial_nos)) + + def update_stock_movement(self): + asset_movement = frappe.db.get_value('Asset Movement', + {'asset': self.name, 'reference_name': self.purchase_receipt, 'docstatus': 0}, 'name') + + if asset_movement: + doc = frappe.get_doc('Asset Movement', asset_movement) + doc.submit() + def update_maintenance_status(): assets = frappe.get_all('Asset', filters = {'docstatus': 1, 'maintenance_required': 1}) @@ -280,7 +302,7 @@ def make_purchase_invoice(asset, item_code, gross_purchase_amount, company, post return pi @frappe.whitelist() -def make_sales_invoice(asset, item_code, company): +def make_sales_invoice(asset, item_code, company, serial_no): si = frappe.new_doc("Sales Invoice") si.company = company si.currency = frappe.db.get_value("Company", company, "default_currency") @@ -290,6 +312,7 @@ def make_sales_invoice(asset, item_code, company): "is_fixed_asset": 1, "asset": asset, "income_account": disposal_account, + "serial_no": serial_no, "cost_center": depreciation_cost_center, "qty": 1 }) diff --git a/erpnext/assets/doctype/asset/asset_dashboard.py b/erpnext/assets/doctype/asset/asset_dashboard.py index 94dad1b311..89699f3edb 100644 --- a/erpnext/assets/doctype/asset/asset_dashboard.py +++ b/erpnext/assets/doctype/asset/asset_dashboard.py @@ -1,6 +1,9 @@ def get_data(): return { 'fieldname': 'asset_name', + 'non_standard_fieldnames': { + 'Asset Movement': 'asset' + }, 'transactions': [ { 'label': ['Maintenance'], @@ -9,6 +12,10 @@ def get_data(): { 'label': ['Repair'], 'items': ['Asset Repair'] + }, + { + 'label': ['Movement'], + 'items': ['Asset Movement'] } ] } \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json index 72d96b0db0..f36fe4e078 100644 --- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json +++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json @@ -42,6 +42,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -104,6 +106,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -135,6 +138,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -164,6 +168,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -195,6 +200,39 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Serial No", + "length": 0, + "no_copy": 0, + "options": "asset_name.serial_no", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -224,6 +262,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -255,6 +294,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -284,6 +324,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -315,6 +356,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -346,6 +388,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -376,6 +419,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -407,6 +451,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -420,7 +465,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-01 15:13:29.816396", + "modified": "2018-04-20 08:39:27.072622", "modified_by": "Administrator", "module": "Assets", "name": "Asset Maintenance", @@ -429,7 +474,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -449,7 +493,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py index 7551eae229..b30685f108 100644 --- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py +++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py @@ -11,6 +11,9 @@ from frappe.utils import add_days, add_months, add_years, getdate, nowdate class AssetMaintenance(Document): def validate(self): + if not self.serial_no: + self.serial_no = frappe.db.get_value("Asset", self.asset_name, 'serial_no') + for task in self.get('asset_maintenance_tasks'): if task.end_date and (getdate(task.start_date) >= getdate(task.end_date)): throw(_("Start date should be less than end date for task {0}").format(task.maintenance_task)) diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json index 0c05552962..3c3a1dc9cd 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.json +++ b/erpnext/assets/doctype/asset_movement/asset_movement.json @@ -12,6 +12,39 @@ "document_type": "", "editable_grid": 0, "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Transfer", + "fieldname": "purpose", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purpose", + "length": 0, + "no_copy": 0, + "options": "Receipt\nTransfer", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -41,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -71,6 +105,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -102,6 +137,38 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Serial No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -131,6 +198,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -162,6 +230,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +262,102 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reference", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_doctype", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reference DocType", + "length": 0, + "no_copy": 1, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reference Name", + "length": 0, + "no_copy": 1, + "options": "reference_doctype", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -223,6 +388,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -236,7 +402,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-10-19 16:08:17.389257", + "modified": "2018-04-20 15:45:54.156501", "modified_by": "Administrator", "module": "Assets", "name": "Asset Movement", @@ -245,7 +411,6 @@ "permissions": [ { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -265,7 +430,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -285,7 +449,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.py b/erpnext/assets/doctype/asset_movement/asset_movement.py index 574c49992b..42ed249959 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.py +++ b/erpnext/assets/doctype/asset_movement/asset_movement.py @@ -11,19 +11,22 @@ class AssetMovement(Document): def validate(self): self.validate_asset() self.validate_warehouses() - + def validate_asset(self): - status, company = frappe.db.get_value("Asset", self.asset, ["status", "company"]) - if status in ("Draft", "Scrapped", "Sold"): + status, company, serial_no = frappe.db.get_value("Asset", self.asset, ["status", "company", "serial_no"]) + if self.purpose == 'Transfer' and status in ("Draft", "Scrapped", "Sold"): frappe.throw(_("{0} asset cannot be transferred").format(status)) - + if company != self.company: frappe.throw(_("Asset {0} does not belong to company {1}").format(self.asset, self.company)) - + + if serial_no and not self.serial_no: + self.serial_no = serial_no + def validate_warehouses(self): - if not self.source_warehouse: + if self.purpose == 'Transfer' and not self.source_warehouse: self.source_warehouse = frappe.db.get_value("Asset", self.asset, "warehouse") - + if self.source_warehouse == self.target_warehouse: frappe.throw(_("Source and Target Warehouse cannot be same")) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c70cfcd811..40028afb01 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -600,40 +600,36 @@ class AccountsController(TransactionBase): if d.qty > 1: frappe.throw(_("Row #{0}: Qty must be 1, as item is a fixed asset. Please use separate row for multiple qty.").format(d.idx)) - if d.meta.get_field("asset"): - if not d.asset: - frappe.throw(_("Row #{0}: Asset is mandatory for fixed asset purchase/sale") - .format(d.idx)) - else: - asset = frappe.get_doc("Asset", d.asset) + if d.meta.get_field("asset") and d.asset: + asset = frappe.get_doc("Asset", d.asset) - if asset.company != self.company: - frappe.throw(_("Row #{0}: Asset {1} does not belong to company {2}") - .format(d.idx, d.asset, self.company)) + if asset.company != self.company: + frappe.throw(_("Row #{0}: Asset {1} does not belong to company {2}") + .format(d.idx, d.asset, self.company)) - elif asset.item_code != d.item_code: - frappe.throw(_("Row #{0}: Asset {1} does not linked to Item {2}") - .format(d.idx, d.asset, d.item_code)) + elif asset.item_code != d.item_code: + frappe.throw(_("Row #{0}: Asset {1} does not linked to Item {2}") + .format(d.idx, d.asset, d.item_code)) - elif asset.docstatus != 1: - frappe.throw(_("Row #{0}: Asset {1} must be submitted").format(d.idx, d.asset)) + elif asset.docstatus != 1: + frappe.throw(_("Row #{0}: Asset {1} must be submitted").format(d.idx, d.asset)) - elif self.doctype == "Purchase Invoice": - if asset.status != "Submitted": - frappe.throw(_("Row #{0}: Asset {1} is already {2}") - .format(d.idx, d.asset, asset.status)) - elif getdate(asset.purchase_date) != getdate(self.posting_date): - frappe.throw(_("Row #{0}: Posting Date must be same as purchase date {1} of asset {2}").format(d.idx, asset.purchase_date, d.asset)) - elif asset.is_existing_asset: - frappe.throw(_("Row #{0}: Purchase Invoice cannot be made against an existing asset {1}").format(d.idx, d.asset)) + elif self.doctype == "Purchase Invoice": + if asset.status != "Submitted": + frappe.throw(_("Row #{0}: Asset {1} is already {2}") + .format(d.idx, d.asset, asset.status)) + elif getdate(asset.purchase_date) != getdate(self.posting_date): + frappe.throw(_("Row #{0}: Posting Date must be same as purchase date {1} of asset {2}").format(d.idx, asset.purchase_date, d.asset)) + elif asset.is_existing_asset: + frappe.throw(_("Row #{0}: Purchase Invoice cannot be made against an existing asset {1}").format(d.idx, d.asset)) - elif self.docstatus=="Sales Invoice" and self.docstatus == 1: - if self.update_stock: - frappe.throw(_("'Update Stock' cannot be checked for fixed asset sale")) + elif self.docstatus=="Sales Invoice" and self.docstatus == 1: + if self.update_stock: + frappe.throw(_("'Update Stock' cannot be checked for fixed asset sale")) - elif asset.status in ("Scrapped", "Cancelled", "Sold"): - frappe.throw(_("Row #{0}: Asset {1} cannot be submitted, it is already {2}") - .format(d.idx, d.asset, asset.status)) + elif asset.status in ("Scrapped", "Cancelled", "Sold"): + frappe.throw(_("Row #{0}: Asset {1} cannot be submitted, it is already {2}") + .format(d.idx, d.asset, asset.status)) def delink_advance_entries(self, linked_doc_name): total_allocated_amount = 0 diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index de6ed79351..c340901e3b 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -11,6 +11,7 @@ from erpnext.stock.get_item_details import get_conversion_factor from erpnext.buying.utils import validate_for_items, update_last_purchase_rate from erpnext.stock.stock_ledger import get_valuation_rate from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items +from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos from erpnext.controllers.stock_controller import StockController @@ -439,6 +440,11 @@ class BuyingController(StockController): if self.get('is_return'): return + if self.doctype in ['Purchase Receipt', 'Purchase Invoice']: + if self.doctype == 'Purchase Receipt': + self.process_fixed_asset() + self.update_fixed_asset() + update_last_purchase_rate(self, is_submit = 1) def on_cancel(self): @@ -446,6 +452,118 @@ class BuyingController(StockController): return update_last_purchase_rate(self, is_submit = 0) + if self.doctype in ['Purchase Receipt', 'Purchase Invoice']: + if self.doctype == 'Purchase Receipt': + self.delete_linked_asset() + self.update_fixed_asset() + + def process_fixed_asset(self): + if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']: + return + + asset_items = [d.item_code for d in self.items if d.is_fixed_asset] + if asset_items: + self.make_serial_nos_for_asset(asset_items) + + def make_serial_nos_for_asset(self, asset_items): + items_data = get_asset_item_details(asset_items) + + for d in self.items: + if d.is_fixed_asset: + item_data = items_data.get(d.item_code) + + if item_data.get('has_serial_no'): + # If item has serial no + if item_data.get('serial_no_series') and not d.serial_no: + serial_nos = get_auto_serial_nos(item_data.get('serial_no_series'), d.qty) + elif d.serial_no: + serial_nos = d.serial_no + elif not d.serial_no: + frappe.throw(_("Serial no is mandatory for the item {0}").format(d.item_code)) + + auto_make_serial_nos({ + 'serial_no': serial_nos, + 'item_code': d.item_code, + 'via_stock_ledger': False, + 'company': self.company, + 'actual_qty': d.qty, + 'purchase_document_type': self.doctype, + 'purchase_document_no': self.name + }) + d.db_set('serial_no', serial_nos) + + if not d.asset: + asset = self.make_asset(d) + d.db_set('asset', asset) + + if d.asset: + self.make_asset_movement(d) + + def make_asset(self, row): + asset = frappe.get_doc({ + 'doctype': 'Asset', + 'item_code': row.item_code, + 'asset_name': '{0} - {1}'.format(self.name, row.item_code), + 'warehouse': row.warehouse, + 'serial_no': row.serial_no, + 'company': self.company, + 'purchase_date': self.posting_date, + 'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None, + 'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None + }) + + asset.flags.ignore_validate = True + asset.flags.ignore_mandatory = True + asset.insert() + + frappe.msgprint(_("Asset {0} created").format(asset.name)) + return asset.name + + def make_asset_movement(self, row): + asset_movement = frappe.get_doc({ + 'doctype': 'Asset Movement', + 'asset': row.asset, + 'source_warehouse': '', + 'target_warehouse': row.warehouse, + 'purpose': 'Receipt', + 'serial_no': row.serial_no, + 'company': self.company, + 'transaction_date': self.posting_date, + 'reference_doctype': self.doctype, + 'reference_name': self.name + }).insert() + + return asset_movement.name + + def update_fixed_asset(self): + field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt' + + for d in self.get("items"): + if d.is_fixed_asset and d.asset: + asset = frappe.get_doc("Asset", d.asset) + if self.docstatus in [0, 1] and not asset.get(field): + asset.set(field, self.name) + asset.purchase_date = self.posting_date + asset.supplier = self.supplier + else: + asset.set(field, None) + asset.supplier = None + + asset.flags.ignore_validate_update_after_submit = True + if asset.docstatus == 0: + asset.flags.ignore_validate = True + + asset.save() + + def delete_linked_asset(self): + if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']: + return + + if self.doctype == 'Purchase Invoice' and self.get('update_stock'): + return + + frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s and docstatus = 0", self.name) + frappe.db.sql("delete from `tabSerial No` where purchase_document_no=%s", self.name) def validate_schedule_date(self): if not self.schedule_date: @@ -480,3 +598,11 @@ def get_items_from_bom(item_code, bom, exploded_item=1): msgprint(_("Specified BOM {0} does not exist for Item {1}").format(bom, item_code), raise_exception=1) return bom_items + +def get_asset_item_details(asset_items): + asset_items_data = {} + for d in frappe.get_all('Item', fields = ["name", "has_serial_no", "serial_no_series"], + filters = {'name': ('in', asset_items)}): + asset_items_data.setdefault(d.name, d) + + return asset_items_data diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index e164d6949f..d4095772cd 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -5,6 +5,14 @@ frappe.provide("erpnext.company"); frappe.ui.form.on("Company", { setup: function(frm) { + frm.fields_dict.fixed_asset_account.get_query = function() { + return { + filters: { + account_type: "Fixed Asset", + company: frm.doc.name + } + } + } erpnext.company.setup_queries(frm); }, diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 21900ad440..251717e127 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -1285,7 +1285,7 @@ "collapsible": 1, "collapsible_depends_on": "eval:doc.has_batch_no || doc.has_serial_no", "columns": 0, - "depends_on": "is_stock_item", + "depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset", "fieldname": "serial_nos_and_batches", "fieldtype": "Section Break", "hidden": 0, @@ -1513,7 +1513,7 @@ "collapsible": 0, "columns": 0, "default": "", - "depends_on": "eval:doc.is_stock_item", + "depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset", "description": "", "fieldname": "has_serial_no", "fieldtype": "Check", @@ -3725,7 +3725,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -3745,7 +3744,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3765,7 +3763,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3785,7 +3782,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3805,7 +3801,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3825,7 +3820,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3845,7 +3839,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -3865,7 +3858,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 123e73f652..fafdaab51f 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -444,7 +444,7 @@ class Item(WebsiteGenerator): _("Conversion factor for default Unit of Measure must be 1 in row {0}").format(d.idx)) def validate_item_type(self): - if self.has_serial_no == 1 and self.is_stock_item == 0: + if self.has_serial_no == 1 and self.is_stock_item == 0 and not self.is_fixed_asset: msgprint(_("'Has Serial No' can not be 'Yes' for non-stock item"), raise_exception=1) if self.has_serial_no == 0 and self.serial_no_series: diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index 791b2532f7..69d2f2a3d7 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -65,6 +65,20 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend if (erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) { this.show_general_ledger(); } + + this.frm.add_custom_button(__('Asset'), function() { + frappe.route_options = { + purchase_receipt: me.frm.doc.name, + }; + frappe.set_route("List", "Asset"); + }, __("View")); + + this.frm.add_custom_button(__('Asset Movement'), function() { + frappe.route_options = { + reference_name: me.frm.doc.name, + }; + frappe.set_route("List", "Asset Movement"); + }, __("View")); } if(!this.frm.doc.is_return && this.frm.doc.status!="Closed") { diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 46eee31e90..c7083be286 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -393,6 +393,8 @@ def make_purchase_invoice(source_name, target_doc=None): "parent": "purchase_receipt", "purchase_order_item": "po_detail", "purchase_order": "purchase_order", + "is_fixed_asset": "is_fixed_asset", + "asset": "asset", }, "postprocess": update_item, "filter": lambda d: abs(d.qty) - abs(invoiced_qty_map.get(d.name, 0))<=0 diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py index 9ade1afd8a..bcedd7179a 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py @@ -5,6 +5,7 @@ def get_data(): 'fieldname': 'purchase_receipt_no', 'non_standard_fieldnames': { 'Purchase Invoice': 'purchase_receipt', + 'Asset': 'purchase_receipt', 'Landed Cost Voucher': 'receipt_document', 'Subscription': 'reference_document' }, @@ -16,7 +17,7 @@ def get_data(): 'transactions': [ { 'label': _('Related'), - 'items': ['Purchase Invoice', 'Landed Cost Voucher'] + 'items': ['Purchase Invoice', 'Landed Cost Voucher', 'Asset'] }, { 'label': _('Reference'), diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index d9f40cca90..ffcc954df1 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -289,13 +289,53 @@ class TestPurchaseReceipt(unittest.TestCase): serial_no=serial_no, basic_rate=100, do_not_submit=True) self.assertRaises(SerialNoDuplicateError, se.submit) + def test_serialized_asset_item(self): + asset_item = "Test Serialized Asset Item" + + if not frappe.db.exists('Item', asset_item): + asset_category = frappe.get_all('Asset Category') + + if asset_category: + asset_category = asset_category[0].name + + if not asset_category: + doc = frappe.get_doc({ + 'doctype': 'Asset Category', + 'asset_category_name': 'Test Asset Category', + 'depreciation_method': 'Straight Line', + 'total_number_of_depreciations': 12, + 'frequency_of_depreciation': 1, + 'accounts': [{ + 'company_name': '_Test Company', + 'fixed_asset_account': '_Test Fixed Asset - _TC', + 'accumulated_depreciation_account': 'Depreciation - _TC', + 'depreciation_expense_account': 'Depreciation - _TC' + }] + }).insert() + + asset_category = doc.name + + asset_item = make_item(asset_item, {'is_stock_item':0, + 'stock_uom': 'Box', 'is_fixed_asset': 1, 'has_serial_no': 1, + 'asset_category': asset_category, 'serial_no_series': 'ABC.###'}) + + pr = make_purchase_receipt(item_code=asset_item, qty=3) + asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name}, 'name') + asset_movement = frappe.db.get_value('Asset Movement', {'reference_name': pr.name}, 'name') + serial_nos = frappe.get_all('Serial No', {'asset': asset}, 'name') + + self.assertEquals(len(serial_nos), 3) + pr.cancel() + serial_nos = frappe.get_all('Serial No', {'asset': asset}, 'name') or [] + self.assertEquals(len(serial_nos), 0) + frappe.db.sql("delete from `tabAsset Category`") + frappe.db.sql("delete from `tabAsset`") def get_gl_entries(voucher_type, voucher_no): return frappe.db.sql("""select account, debit, credit from `tabGL Entry` where voucher_type=%s and voucher_no=%s order by account desc""", (voucher_type, voucher_no), as_dict=1) - def make_purchase_receipt(**args): frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1) pr = frappe.new_doc("Purchase Receipt") diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index 754bd71879..a7b0a03c0a 100755 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -1577,6 +1577,70 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_fixed_asset", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Fixed Asset", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_fixed_asset", + "fieldname": "asset", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset", + "length": 0, + "no_copy": 1, + "options": "Asset", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2395,7 +2459,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-02-22 15:15:38.793425", + "modified": "2018-04-23 14:07:48.438379", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json index b37713be96..fa4fa694c1 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.json +++ b/erpnext/stock/doctype/serial_no/serial_no.json @@ -41,6 +41,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -69,6 +70,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -100,6 +102,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -132,6 +135,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -165,6 +169,39 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset", + "length": 0, + "no_copy": 1, + "options": "Asset", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -193,6 +230,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -222,6 +260,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -253,6 +292,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "300px" }, @@ -287,6 +327,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -319,6 +360,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -348,6 +390,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -376,6 +419,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -407,6 +451,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -437,6 +482,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -468,6 +514,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -497,6 +544,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -529,6 +577,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -557,6 +606,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -588,6 +638,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -617,6 +668,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -647,6 +699,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -677,6 +730,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -707,6 +761,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -738,6 +793,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -767,6 +823,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -799,6 +856,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -827,6 +885,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -860,6 +919,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -891,6 +951,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -921,6 +982,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -952,6 +1014,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -981,6 +1044,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1009,6 +1073,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1042,6 +1107,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "150px" }, @@ -1074,6 +1140,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "150px" }, @@ -1103,6 +1170,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -1135,6 +1203,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "150px" }, @@ -1167,6 +1236,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "150px" }, @@ -1197,6 +1267,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1226,6 +1297,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1256,6 +1328,7 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -1270,7 +1343,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-05-15 18:22:23.685286", + "modified": "2018-04-19 20:25:52.066995", "modified_by": "Administrator", "module": "Stock", "name": "Serial No", @@ -1278,7 +1351,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -1298,7 +1370,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1318,7 +1389,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 98f15a831a..17bf1bb1c3 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe +from frappe.model.naming import make_autoname from frappe.utils import cint, cstr, flt, add_days, nowdate, getdate from frappe import _, ValidationError @@ -276,24 +277,31 @@ def allow_serial_nos_with_different_item(sle_serial_no, sle): def update_serial_nos(sle, item_det): if sle.is_cancelled == "No" and not sle.serial_no and sle.actual_qty > 0 \ and item_det.has_serial_no == 1 and item_det.serial_no_series: - from frappe.model.naming import make_autoname - serial_nos = [] - for i in range(cint(sle.actual_qty)): - serial_nos.append(make_autoname(item_det.serial_no_series, "Serial No")) - frappe.db.set(sle, "serial_no", "\n".join(serial_nos)) + serial_nos = get_auto_serial_nos(item_det.serial_no_series, sle.actual_qty) + frappe.db.set(sle, "serial_no", serial_nos) validate_serial_no(sle, item_det) if sle.serial_no: - serial_nos = get_serial_nos(sle.serial_no) - for serial_no in serial_nos: - if frappe.db.exists("Serial No", serial_no): - sr = frappe.get_doc("Serial No", serial_no) - sr.via_stock_ledger = True - sr.item_code = sle.item_code - sr.warehouse = sle.warehouse if sle.actual_qty > 0 else None - sr.save(ignore_permissions=True) - elif sle.actual_qty > 0: - make_serial_no(serial_no, sle) + auto_make_serial_nos(sle) + +def get_auto_serial_nos(serial_no_series, qty): + serial_nos = [] + for i in range(cint(qty)): + serial_nos.append(make_autoname(serial_no_series, "Serial No")) + + return "\n".join(serial_nos) + +def auto_make_serial_nos(args): + serial_nos = get_serial_nos(args.get('serial_no')) + for serial_no in serial_nos: + if frappe.db.exists("Serial No", serial_no): + sr = frappe.get_doc("Serial No", serial_no) + sr.via_stock_ledger = True + sr.item_code = args.get('item_code') + sr.warehouse = args.get('warehouse') if args.get('actual_qty', 0) > 0 else None + sr.save(ignore_permissions=True) + elif args.get('actual_qty', 0) > 0: + make_serial_no(serial_no, args) def get_item_details(item_code): return frappe.db.sql("""select name, has_batch_no, docstatus, @@ -304,20 +312,26 @@ def get_serial_nos(serial_no): return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n') if s.strip()] -def make_serial_no(serial_no, sle): +def make_serial_no(serial_no, args): sr = frappe.new_doc("Serial No") sr.warehouse = None sr.dont_update_if_missing.append("warehouse") sr.flags.ignore_permissions = True sr.serial_no = serial_no - sr.item_code = sle.item_code - sr.company = sle.company - sr.via_stock_ledger = True + sr.item_code = args.get('item_code') + sr.company = args.get('company') + sr.via_stock_ledger = args.get('via_stock_ledger') or True sr.insert() - sr.warehouse = sle.warehouse - sr.save() + if args.get('purchase_document_type'): + sr.purchase_document_type = args.get('purchase_document_type') + sr.purchase_document_no = args.get('purchase_document_no') + + if args.get('warehouse'): + sr.warehouse = args.get('warehouse') + sr.save() + frappe.msgprint(_("Serial No {0} created").format(sr.name)) return sr.name diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 7e456dd3d3..0d03b4d2ec 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -287,6 +287,10 @@ def get_default_income_account(args, item): or frappe.db.get_value("Item Group", item.item_group, "default_income_account")) def get_default_expense_account(args, item): + if item and item.is_fixed_asset: + return frappe.db.get_value("Company", args.company, "fixed_asset_account") + if account: return account + return (item.expense_account or args.expense_account or frappe.db.get_value("Item Group", item.item_group, "default_expense_account")) From c6deb13fb424817b499b725e429ab0481fe7ac97 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 7 May 2018 15:58:41 +0530 Subject: [PATCH 135/154] Added account fields in the company, fixes in auto creation of the asset from PR --- erpnext/accounts/doctype/account/account.json | 4 +- erpnext/assets/doctype/asset/asset.json | 37 ++- erpnext/assets/doctype/asset/asset.py | 14 +- erpnext/assets/doctype/location/__init__.py | 0 erpnext/assets/doctype/location/location.js | 8 + erpnext/assets/doctype/location/location.json | 213 ++++++++++++++++++ erpnext/assets/doctype/location/location.py | 10 + .../assets/doctype/location/test_location.js | 23 ++ .../assets/doctype/location/test_location.py | 10 + erpnext/config/assets.py | 5 + erpnext/controllers/buying_controller.py | 42 ++-- erpnext/setup/doctype/company/company.js | 11 +- erpnext/setup/doctype/company/company.json | 98 +++++++- erpnext/stock/doctype/item/item.js | 19 +- erpnext/stock/doctype/item/item.json | 36 ++- erpnext/stock/doctype/item/item.py | 9 + .../purchase_receipt_item.json | 35 ++- erpnext/stock/doctype/serial_no/serial_no.py | 1 + erpnext/stock/get_item_details.py | 4 - 19 files changed, 525 insertions(+), 54 deletions(-) create mode 100644 erpnext/assets/doctype/location/__init__.py create mode 100644 erpnext/assets/doctype/location/location.js create mode 100644 erpnext/assets/doctype/location/location.json create mode 100644 erpnext/assets/doctype/location/location.py create mode 100644 erpnext/assets/doctype/location/test_location.js create mode 100644 erpnext/assets/doctype/location/test_location.py diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 668164ca64..de28a59f8c 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -412,7 +412,7 @@ "no_copy": 0, "oldfieldname": "account_type", "oldfieldtype": "Select", - "options": "\nAccumulated Depreciation\nBank\nCash\nChargeable\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary", + "options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -625,7 +625,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-02 11:00:34.108490", + "modified": "2018-05-07 15:37:25.962506", "modified_by": "Administrator", "module": "Accounts", "name": "Account", diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 63b9167cc6..536b4dc522 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, - "autoname": "field:asset_name", + "autoname": "naming_series:", "beta": 0, "creation": "2016-03-01 17:01:27.920130", "custom": 0, @@ -12,6 +12,39 @@ "document_type": "Document", "editable_grid": 0, "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "AST", + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Naming Series", + "length": 0, + "no_copy": 0, + "options": "AST\nAT", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1354,7 +1387,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-19 20:03:13.669957", + "modified": "2018-05-07 15:25:06.456992", "modified_by": "Administrator", "module": "Assets", "name": "Asset", diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index a9cc924b8f..adcc986f66 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -10,7 +10,6 @@ from frappe.model.document import Document from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_fixed_asset_account from erpnext.assets.doctype.asset.depreciation \ import get_disposal_account_and_cost_center, get_depreciation_accounts -from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos class Asset(Document): def validate(self): @@ -34,9 +33,6 @@ class Asset(Document): self.delete_depreciation_entries() self.set_status() - def on_update(self): - self.update_serial_nos() - def validate_item(self): item = frappe.db.get_value("Item", self.item_code, ["is_fixed_asset", "is_stock_item", "disabled"], as_dict=1) @@ -258,12 +254,6 @@ class Asset(Document): status = "Cancelled" return status - def update_serial_nos(self): - if self.serial_no: - serial_nos = get_serial_nos(self.serial_no) - frappe.db.sql(""" update `tabSerial No` set asset = '%s' where - name in(%s)"""%(self.name, ','.join(['%s'] * len(serial_nos))), tuple(serial_nos)) - def update_stock_movement(self): asset_movement = frappe.db.get_value('Asset Movement', {'asset': self.name, 'reference_name': self.purchase_receipt, 'docstatus': 0}, 'name') @@ -282,6 +272,10 @@ def update_maintenance_status(): if frappe.db.exists('Asset Repair', {'asset_name': asset.name, 'repair_status': 'Pending'}): asset.set_status('Out of Order') +def get_asset_naming_series(): + meta = frappe.get_meta('Asset') + return meta.get_field("naming_series").options + @frappe.whitelist() def make_purchase_invoice(asset, item_code, gross_purchase_amount, company, posting_date): pi = frappe.new_doc("Purchase Invoice") diff --git a/erpnext/assets/doctype/location/__init__.py b/erpnext/assets/doctype/location/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/assets/doctype/location/location.js b/erpnext/assets/doctype/location/location.js new file mode 100644 index 0000000000..c3783dfae7 --- /dev/null +++ b/erpnext/assets/doctype/location/location.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Location', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/assets/doctype/location/location.json b/erpnext/assets/doctype/location/location.json new file mode 100644 index 0000000000..13ef66224d --- /dev/null +++ b/erpnext/assets/doctype/location/location.json @@ -0,0 +1,213 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:location_name", + "beta": 0, + "creation": "2018-05-07 12:49:22.595974", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "location_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Location Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_group", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Group", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "parent_location", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Parent Location", + "length": 0, + "no_copy": 0, + "options": "Location", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-07 12:54:49.527782", + "modified_by": "Administrator", + "module": "Assets", + "name": "Location", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/assets/doctype/location/location.py b/erpnext/assets/doctype/location/location.py new file mode 100644 index 0000000000..2483ca1b9d --- /dev/null +++ b/erpnext/assets/doctype/location/location.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class Location(Document): + pass diff --git a/erpnext/assets/doctype/location/test_location.js b/erpnext/assets/doctype/location/test_location.js new file mode 100644 index 0000000000..236b5c65b0 --- /dev/null +++ b/erpnext/assets/doctype/location/test_location.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Location", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Location + () => frappe.tests.make('Location', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/assets/doctype/location/test_location.py b/erpnext/assets/doctype/location/test_location.py new file mode 100644 index 0000000000..9a46fd93ef --- /dev/null +++ b/erpnext/assets/doctype/location/test_location.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestLocation(unittest.TestCase): + pass diff --git a/erpnext/config/assets.py b/erpnext/config/assets.py index 73c1aee87a..be522469e6 100644 --- a/erpnext/config/assets.py +++ b/erpnext/config/assets.py @@ -14,6 +14,11 @@ def get_data(): "type": "doctype", "name": "Asset Category", }, + { + "type": "doctype", + "label": _("Asset Location"), + "name": "Location", + }, { "type": "doctype", "name": "Asset Settings", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index c340901e3b..798eee2b9d 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -441,9 +441,10 @@ class BuyingController(StockController): return if self.doctype in ['Purchase Receipt', 'Purchase Invoice']: - if self.doctype == 'Purchase Receipt': - self.process_fixed_asset() - self.update_fixed_asset() + field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt' + + self.process_fixed_asset() + self.update_fixed_asset(field) update_last_purchase_rate(self, is_submit = 1) @@ -453,12 +454,13 @@ class BuyingController(StockController): update_last_purchase_rate(self, is_submit = 0) if self.doctype in ['Purchase Receipt', 'Purchase Invoice']: - if self.doctype == 'Purchase Receipt': - self.delete_linked_asset() - self.update_fixed_asset() + field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt' + + self.delete_linked_asset(field) + self.update_fixed_asset(field) def process_fixed_asset(self): - if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']: + if self.doctype == 'Purchase Invoice' and not self.update_stock: return asset_items = [d.item_code for d in self.items if d.is_fixed_asset] @@ -471,6 +473,9 @@ class BuyingController(StockController): for d in self.items: if d.is_fixed_asset: item_data = items_data.get(d.item_code) + if not d.asset: + asset = self.make_asset(d) + d.db_set('asset', asset) if item_data.get('has_serial_no'): # If item has serial no @@ -488,14 +493,11 @@ class BuyingController(StockController): 'company': self.company, 'actual_qty': d.qty, 'purchase_document_type': self.doctype, - 'purchase_document_no': self.name + 'purchase_document_no': self.name, + 'asset': d.asset }) d.db_set('serial_no', serial_nos) - if not d.asset: - asset = self.make_asset(d) - d.db_set('asset', asset) - if d.asset: self.make_asset_movement(d) @@ -503,9 +505,9 @@ class BuyingController(StockController): asset = frappe.get_doc({ 'doctype': 'Asset', 'item_code': row.item_code, - 'asset_name': '{0} - {1}'.format(self.name, row.item_code), + 'asset_name': row.item_name, + 'naming_series': frappe.db.get_value('Item', row.item_code, 'asset_naming_series') or 'AST', 'warehouse': row.warehouse, - 'serial_no': row.serial_no, 'company': self.company, 'purchase_date': self.posting_date, 'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None, @@ -535,9 +537,7 @@ class BuyingController(StockController): return asset_movement.name - def update_fixed_asset(self): - field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt' - + def update_fixed_asset(self, field): for d in self.get("items"): if d.is_fixed_asset and d.asset: asset = frappe.get_doc("Asset", d.asset) @@ -555,13 +555,11 @@ class BuyingController(StockController): asset.save() - def delete_linked_asset(self): - if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']: - return - - if self.doctype == 'Purchase Invoice' and self.get('update_stock'): + def delete_linked_asset(self, field): + if self.doctype == 'Purchase Invoice' and not self.get('update_stock'): return + frappe.db.sql("delete from `tabAsset` where {0} = %s and docstatus = 0".format(field), self.name) frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s and docstatus = 0", self.name) frappe.db.sql("delete from `tabSerial No` where purchase_document_no=%s", self.name) diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index d4095772cd..5ca2885547 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -5,14 +5,6 @@ frappe.provide("erpnext.company"); frappe.ui.form.on("Company", { setup: function(frm) { - frm.fields_dict.fixed_asset_account.get_query = function() { - return { - filters: { - account_type: "Fixed Asset", - company: frm.doc.name - } - } - } erpnext.company.setup_queries(frm); }, @@ -215,6 +207,9 @@ erpnext.company.setup_queries = function(frm) { ["round_off_cost_center", {}], ["depreciation_cost_center", {}], ["default_employee_advance_account", {"root_type": "Asset"}], + ["expenses_included_in_asset_valuation", {"account_type": "Expenses Included In Asset Valuation"}], + ["capital_work_in_progress_account", {"account_type": "Capital Work in Progress"}], + ["asset_received_but_not_billed", {"account_type": "Asset Received But Not Billed"}] ], function(i, v) { erpnext.company.set_custom_query(frm, v); }); diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index d236dda873..07051eeba8 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -1785,6 +1785,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "expenses_included_in_asset_valuation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Expenses Included In Asset Valuation", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1879,6 +1911,70 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "capital_work_in_progress_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Capital Work In Progress Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset_received_but_not_billed", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Received But Not Billed", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2400,7 +2496,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-05-05 13:08:07.351655", + "modified": "2018-05-07 15:35:06.736602", "modified_by": "Administrator", "module": "Setup", "name": "Company", diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index f98cbb6268..fbf0deddc7 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -19,7 +19,9 @@ frappe.ui.form.on("Item", { // should never check Private frm.fields_dict["website_image"].df.is_private = 0; - + if (frm.doc.is_fixed_asset) { + frm.trigger("set_asset_naming_series"); + } }, refresh: function(frm) { @@ -124,7 +126,20 @@ frappe.ui.form.on("Item", { }, is_fixed_asset: function(frm) { - frm.set_value("is_stock_item", frm.doc.is_fixed_asset ? 0 : 1); + frm.call({ + method: "set_asset_naming_series", + doc: frm.doc, + callback: function() { + frm.set_value("is_stock_item", frm.doc.is_fixed_asset ? 0 : 1); + frm.trigger("set_asset_naming_series"); + } + }) + }, + + set_asset_naming_series: function(frm) { + if (frm.doc.__onload && frm.doc.__onload.asset_naming_series) { + frm.set_df_property("asset_naming_series", "options", frm.doc.__onload.asset_naming_series); + } }, page_name: frappe.utils.warn_page_name_change, diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 251717e127..b8621719c4 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -395,7 +395,7 @@ "search_index": 0, "set_only_once": 0, "translatable": 0, - "unique": 0 + "unique": 0 }, { "allow_bulk_edit": 0, @@ -559,6 +559,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_fixed_asset", + "fieldname": "asset_naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Naming Series", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -3717,7 +3749,7 @@ "issingle": 0, "istable": 0, "max_attachments": 1, - "modified": "2018-04-30 12:21:48.715529", + "modified": "2018-05-07 14:54:24.479267", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index fafdaab51f..94b907b914 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -16,6 +16,7 @@ from frappe.utils import (cint, cstr, flt, formatdate, get_timestamp, getdate, from frappe.utils.html_utils import clean_html from frappe.website.doctype.website_slideshow.website_slideshow import \ get_slideshow + from frappe.website.render import clear_cache from frappe.website.website_generator import WebsiteGenerator @@ -42,10 +43,18 @@ class Item(WebsiteGenerator): super(Item, self).onload() self.set_onload('stock_exists', self.stock_ledger_created()) + self.set_asset_naming_series() if self.is_fixed_asset: asset = frappe.db.get_all("Asset", filters={"item_code": self.name, "docstatus": 1}, limit=1) self.set_onload("asset_exists", True if asset else False) + def set_asset_naming_series(self): + if not hasattr(self, '_asset_naming_series'): + from erpnext.assets.doctype.asset.asset import get_asset_naming_series + self._asset_naming_series = get_asset_naming_series() + + self.set_onload('asset_naming_series', self._asset_naming_series) + def autoname(self): if frappe.db.get_default("item_naming_by") == "Naming Series": if self.variant_of: diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index a7b0a03c0a..87c9a757bf 100755 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -1641,6 +1641,39 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_fixed_asset", + "fieldname": "asset_location", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Location", + "length": 0, + "no_copy": 0, + "options": "Location", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2459,7 +2492,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-23 14:07:48.438379", + "modified": "2018-05-07 13:42:05.061386", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 17bf1bb1c3..6ee679ab82 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -322,6 +322,7 @@ def make_serial_no(serial_no, args): sr.item_code = args.get('item_code') sr.company = args.get('company') sr.via_stock_ledger = args.get('via_stock_ledger') or True + sr.asset = args.get('asset') sr.insert() if args.get('purchase_document_type'): diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 0d03b4d2ec..7e456dd3d3 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -287,10 +287,6 @@ def get_default_income_account(args, item): or frappe.db.get_value("Item Group", item.item_group, "default_income_account")) def get_default_expense_account(args, item): - if item and item.is_fixed_asset: - return frappe.db.get_value("Company", args.company, "fixed_asset_account") - if account: return account - return (item.expense_account or args.expense_account or frappe.db.get_value("Item Group", item.item_group, "default_expense_account")) From af0599541867c130e51ac14dc13f1e970d296267 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 7 May 2018 18:46:53 +0530 Subject: [PATCH 136/154] Asset accounting --- .../purchase_invoice/purchase_invoice.py | 43 +++++++++++++++++++ erpnext/controllers/buying_controller.py | 24 +++++++---- .../purchase_receipt/purchase_receipt.py | 31 +++++++++++++ erpnext/stock/doctype/serial_no/serial_no.py | 2 +- 4 files changed, 91 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index d2cc4eea9f..fea126945c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -422,6 +422,49 @@ class PurchaseInvoice(BuyingController): "remarks": self.get("remarks") or _("Accounting Entry for Stock"), "credit": flt(item.rm_supp_cost) }, warehouse_account[self.supplier_warehouse]["account_currency"])) + + elif item.is_fixed_asset and not self.update_stock: + asset_accounts = self.get_company_default(["asset_received_but_not_billed", + "expenses_included_in_asset_valuation", "capital_work_in_progress_account"]) + + asset_amount = flt(item.net_amount) + flt(item.item_tax_amount/self.conversion_rate) + base_asset_amount = flt(item.base_net_amount + item.item_tax_amount) + + if not self.update_stock: + asset_rbnb_currency = get_account_currency(asset_accounts[0]) + + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[0], + "against": self.supplier, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "debit": base_asset_amount, + "debit_in_account_currency": (base_asset_amount + if asset_rbnb_currency == self.company_currency else asset_amount) + })) + else: + cwip_account_currency = get_account_currency(asset_accounts[2]) + + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[2], + "against": self.supplier, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "debit": base_asset_amount, + "debit_in_account_currency": (base_asset_amount + if cwip_account_currency == self.company_currency else asset_amount) + })) + + asset_eiiav_currency = get_account_currency(asset_accounts[0]) + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[1], + "against": self.supplier, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "cost_center": item.cost_center, + "credit": item.item_tax_amount, + "credit_in_account_currency": (item.item_tax_amount + if asset_eiiav_currency == self.company_currency else + item.item_tax_amount / self.conversion_rate) + })) + else: gl_entries.append( self.get_gl_dict({ diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 798eee2b9d..a1bc6d7aa7 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -79,7 +79,7 @@ class BuyingController(StockController): break def validate_stock_or_nonstock_items(self): - if self.meta.get_field("taxes") and not self.get_stock_items(): + if self.meta.get_field("taxes") and not self.get_stock_items() and not self.get_asset_items(): tax_for_valuation = [d for d in self.get("taxes") if d.category in ["Valuation", "Valuation and Total"]] @@ -88,6 +88,9 @@ class BuyingController(StockController): d.category = 'Total' msgprint(_('Tax Category has been changed to "Total" because all the Items are non-stock items')) + def get_asset_items(self): + return [d.item_code for d in self.items if d.is_fixed_asset] + def set_landed_cost_voucher_amount(self): for d in self.get("items"): lc_voucher_data = frappe.db.sql("""select sum(applicable_charges), cost_center @@ -112,7 +115,7 @@ class BuyingController(StockController): TODO: rename item_tax_amount to valuation_tax_amount """ - stock_items = self.get_stock_items() + stock_items = self.get_stock_items() + self.get_asset_items() stock_items_qty, stock_items_amount = 0, 0 last_stock_item_idx = 1 @@ -456,14 +459,14 @@ class BuyingController(StockController): if self.doctype in ['Purchase Receipt', 'Purchase Invoice']: field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt' - self.delete_linked_asset(field) - self.update_fixed_asset(field) + self.delete_linked_asset() + self.update_fixed_asset(field, delete_asset=True) def process_fixed_asset(self): if self.doctype == 'Purchase Invoice' and not self.update_stock: return - asset_items = [d.item_code for d in self.items if d.is_fixed_asset] + asset_items = self.get_asset_items() if asset_items: self.make_serial_nos_for_asset(asset_items) @@ -537,10 +540,16 @@ class BuyingController(StockController): return asset_movement.name - def update_fixed_asset(self, field): + def update_fixed_asset(self, field, delete_asset = False): for d in self.get("items"): if d.is_fixed_asset and d.asset: asset = frappe.get_doc("Asset", d.asset) + + if delete_asset and asset.docstatus == 0: + frappe.delete_doc("Asset", asset.name) + d.db_set('asset', None) + continue + if self.docstatus in [0, 1] and not asset.get(field): asset.set(field, self.name) asset.purchase_date = self.posting_date @@ -555,11 +564,10 @@ class BuyingController(StockController): asset.save() - def delete_linked_asset(self, field): + def delete_linked_asset(self): if self.doctype == 'Purchase Invoice' and not self.get('update_stock'): return - frappe.db.sql("delete from `tabAsset` where {0} = %s and docstatus = 0".format(field), self.name) frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s and docstatus = 0", self.name) frappe.db.sql("delete from `tabSerial No` where purchase_document_no=%s", self.name) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index c7083be286..984bf33b4b 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -253,6 +253,37 @@ class PurchaseReceipt(BuyingController): d.rejected_warehouse not in warehouse_with_no_account: warehouse_with_no_account.append(d.warehouse) + elif d.is_fixed_asset: + asset_accounts = self.get_company_default(["capital_work_in_progress_account", + "asset_received_but_not_billed"]) + + # CWIP entry + asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate) + base_asset_amount = flt(d.base_net_amount + d.item_tax_amount) + + cwip_account_currency = get_account_currency(asset_accounts[0]) + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[0], + "against": asset_accounts[1], + "cost_center": d.cost_center, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "debit": base_asset_amount, + "debit_in_account_currency": (base_asset_amount + if cwip_account_currency == self.company_currency else asset_amount) + })) + + # Asset received but not billed + asset_rbnb_currency = get_account_currency(asset_accounts[1]) + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[1], + "against": asset_accounts[0], + "cost_center": d.cost_center, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "credit": base_asset_amount, + "credit_in_account_currency": (base_asset_amount + if asset_rbnb_currency == self.company_currency else asset_amount) + })) + # Cost center-wise amount breakup for other charges included for valuation valuation_tax = {} for tax in self.get("taxes"): diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 6ee679ab82..333963bd66 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -323,12 +323,12 @@ def make_serial_no(serial_no, args): sr.company = args.get('company') sr.via_stock_ledger = args.get('via_stock_ledger') or True sr.asset = args.get('asset') - sr.insert() if args.get('purchase_document_type'): sr.purchase_document_type = args.get('purchase_document_type') sr.purchase_document_no = args.get('purchase_document_no') + sr.insert() if args.get('warehouse'): sr.warehouse = args.get('warehouse') sr.save() From 255cd44abae989f0223721e71c96e6b8a3b04ff9 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 7 May 2018 19:22:15 +0530 Subject: [PATCH 137/154] Treeview for Location --- erpnext/assets/doctype/location/location.json | 99 ++++++++++++++++++- erpnext/assets/doctype/location/location.py | 41 +++++++- .../assets/doctype/location/location_tree.js | 28 ++++++ 3 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 erpnext/assets/doctype/location/location_tree.js diff --git a/erpnext/assets/doctype/location/location.json b/erpnext/assets/doctype/location/location.json index 13ef66224d..d83fdf3667 100644 --- a/erpnext/assets/doctype/location/location.json +++ b/erpnext/assets/doctype/location/location.json @@ -83,7 +83,7 @@ "columns": 0, "fieldname": "parent_location", "fieldtype": "Link", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -98,7 +98,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -106,6 +106,99 @@ "set_only_once": 0, "translatable": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "lft", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "rgt", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Old Parent", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 } ], "has_web_view": 0, @@ -118,7 +211,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-07 12:54:49.527782", + "modified": "2018-05-07 19:21:06.051414", "modified_by": "Administrator", "module": "Assets", "name": "Location", diff --git a/erpnext/assets/doctype/location/location.py b/erpnext/assets/doctype/location/location.py index 2483ca1b9d..9d05720a0d 100644 --- a/erpnext/assets/doctype/location/location.py +++ b/erpnext/assets/doctype/location/location.py @@ -5,6 +5,43 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document +from frappe.utils.nestedset import NestedSet -class Location(Document): - pass +class Location(NestedSet): + def on_update(self): + self.update_nsm_model() + + def on_trash(self): + self.update_nsm_model() + + def update_nsm_model(self): + frappe.utils.nestedset.update_nsm(self) + +@frappe.whitelist() +def get_children(doctype, parent=None, location=None, is_root=False): + if parent == None or parent == "All Locations": + parent = "" + + return frappe.db.sql(""" + select + name as value, + is_group as expandable + from + `tab{doctype}` comp + where + ifnull(parent_location, "")="{parent}" + """.format( + doctype = frappe.db.escape(doctype), + parent=frappe.db.escape(parent) + ), as_dict=1) + +@frappe.whitelist() +def add_node(): + from frappe.desk.treeview import make_tree_args + args = frappe.form_dict + args = make_tree_args(**args) + + if args.parent_location == 'All Locations': + args.parent_location = None + + frappe.get_doc(args).insert() \ No newline at end of file diff --git a/erpnext/assets/doctype/location/location_tree.js b/erpnext/assets/doctype/location/location_tree.js new file mode 100644 index 0000000000..523dd63ced --- /dev/null +++ b/erpnext/assets/doctype/location/location_tree.js @@ -0,0 +1,28 @@ +frappe.treeview_settings["Location"] = { + ignore_fields:["parent_location"], + get_tree_nodes: 'erpnext.assets.doctype.location.location.get_children', + add_tree_node: 'erpnext.assets.doctype.location.location.add_node', + filters: [ + { + fieldname: "location", + fieldtype:"Link", + options: "Location", + label: __("Location") + }, + ], + breadcrumb: "Assets", + root_label: "All Locations", + get_tree_root: false, + menu_items: [ + { + label: __("New Location"), + action: function() { + frappe.new_doc("Location", true); + }, + condition: 'frappe.boot.user.can_create.indexOf("Location") !== -1' + } + ], + onload: function(treeview) { + treeview.make_tree(); + } +}; \ No newline at end of file From f41e1ed191bf383356169549c8571e9ced8251e1 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 8 May 2018 12:38:28 +0530 Subject: [PATCH 138/154] Added default asset accounts in COA, CWIP account in asset category --- .../verified/standard_chart_of_accounts.py | 11 +++++- ...d_chart_of_accounts_with_account_number.py | 12 ++++++ .../purchase_invoice/purchase_invoice.py | 34 ++++++++--------- .../doctype/asset_category/asset_category.js | 11 ++++++ .../doctype/asset_category/asset_category.py | 7 ++++ .../asset_category_account.json | 38 ++++++++++++++++++- erpnext/setup/doctype/company/company.py | 3 ++ .../purchase_receipt/purchase_receipt.py | 7 +++- 8 files changed, 102 insertions(+), 21 deletions(-) diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py index 5452040fb6..6e1637165a 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py @@ -63,7 +63,10 @@ def get(): }, _("Accumulated Depreciation"): { "account_type": "Accumulated Depreciation" - } + }, + _("CWIP Account"): { + "account_type": "Capital Work in Progress", + } }, _("Investments"): { "is_group": 1 @@ -81,6 +84,9 @@ def get(): _("Cost of Goods Sold"): { "account_type": "Cost of Goods Sold" }, + _("Expenses Included In Asset Valuation"): { + "account_type": "Expenses Included In Asset Valuation" + }, _("Expenses Included In Valuation"): { "account_type": "Expenses Included In Valuation" }, @@ -146,6 +152,9 @@ def get(): _("Stock Received But Not Billed"): { "account_type": "Stock Received But Not Billed" }, + _("Asset Received But Not Billed"): { + "account_type": "Asset Received But Not Billed" + } }, _("Duties and Taxes"): { "account_type": "Tax", diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py index bad84533a5..5ed3e45086 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py @@ -85,6 +85,10 @@ def get(): "account_type": "Accumulated Depreciation", "account_number": "1780" }, + _("CWIP Account"): { + "account_type": "Capital Work in Progress", + "account_number": "1790" + }, "account_number": "1700" }, _("Investments"): { @@ -108,6 +112,10 @@ def get(): "account_type": "Cost of Goods Sold", "account_number": "5111" }, + _("Expenses Included In Asset Valuation"): { + "account_type": "Expenses Included In Asset Valuation", + "account_number": "5112" + }, _("Expenses Included In Valuation"): { "account_type": "Expenses Included In Valuation", "account_number": "5118" @@ -228,6 +236,10 @@ def get(): "account_type": "Stock Received But Not Billed", "account_number": "2210" }, + _("Asset Received But Not Billed"): { + "account_type": "Asset Received But Not Billed", + "account_number": "2211" + }, "account_number": "2200" }, _("Duties and Taxes"): { diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index fea126945c..fd0054ace2 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -19,6 +19,7 @@ from erpnext.accounts.general_ledger import get_round_off_account_and_cost_cente from frappe.model.mapper import get_mapped_doc from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\ unlink_inter_company_invoice +from erpnext.assets.doctype.asset_category.asset_category import get_cwip_account form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -423,7 +424,7 @@ class PurchaseInvoice(BuyingController): "credit": flt(item.rm_supp_cost) }, warehouse_account[self.supplier_warehouse]["account_currency"])) - elif item.is_fixed_asset and not self.update_stock: + elif item.is_fixed_asset: asset_accounts = self.get_company_default(["asset_received_but_not_billed", "expenses_included_in_asset_valuation", "capital_work_in_progress_account"]) @@ -432,7 +433,6 @@ class PurchaseInvoice(BuyingController): if not self.update_stock: asset_rbnb_currency = get_account_currency(asset_accounts[0]) - gl_entries.append(self.get_gl_dict({ "account": asset_accounts[0], "against": self.supplier, @@ -442,10 +442,10 @@ class PurchaseInvoice(BuyingController): if asset_rbnb_currency == self.company_currency else asset_amount) })) else: - cwip_account_currency = get_account_currency(asset_accounts[2]) - + cwip_account = get_cwip_account(item.item_code, self.company) or asset_accounts[2] + cwip_account_currency = get_account_currency(cwip_account) gl_entries.append(self.get_gl_dict({ - "account": asset_accounts[2], + "account": cwip_account, "against": self.supplier, "remarks": self.get("remarks") or _("Accounting Entry for Asset"), "debit": base_asset_amount, @@ -453,18 +453,18 @@ class PurchaseInvoice(BuyingController): if cwip_account_currency == self.company_currency else asset_amount) })) - asset_eiiav_currency = get_account_currency(asset_accounts[0]) - gl_entries.append(self.get_gl_dict({ - "account": asset_accounts[1], - "against": self.supplier, - "remarks": self.get("remarks") or _("Accounting Entry for Asset"), - "cost_center": item.cost_center, - "credit": item.item_tax_amount, - "credit_in_account_currency": (item.item_tax_amount - if asset_eiiav_currency == self.company_currency else - item.item_tax_amount / self.conversion_rate) - })) - + if item.item_tax_amount: + asset_eiiav_currency = get_account_currency(asset_accounts[0]) + gl_entries.append(self.get_gl_dict({ + "account": asset_accounts[1], + "against": self.supplier, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "cost_center": item.cost_center, + "credit": item.item_tax_amount, + "credit_in_account_currency": (item.item_tax_amount + if asset_eiiav_currency == self.company_currency else + item.item_tax_amount / self.conversion_rate) + })) else: gl_entries.append( self.get_gl_dict({ diff --git a/erpnext/assets/doctype/asset_category/asset_category.js b/erpnext/assets/doctype/asset_category/asset_category.js index aafe8a69a0..6f0c428c4d 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.js +++ b/erpnext/assets/doctype/asset_category/asset_category.js @@ -40,5 +40,16 @@ frappe.ui.form.on('Asset Category', { }; }); + frm.set_query('capital_work_in_progress_account', 'accounts', function(doc, cdt, cdn) { + var d = locals[cdt][cdn]; + return { + "filters": { + "account_type": "Capital Work in Progress", + "is_group": 0, + "company": d.company_name + } + }; + }); + } }); \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index 542bd12861..4ffd20b159 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -13,3 +13,10 @@ class AssetCategory(Document): for field in ("total_number_of_depreciations", "frequency_of_depreciation"): if cint(self.get(field))<1: frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) + +def get_cwip_account(item_code, company): + asset_category = frappe.db.get_value('Item', item_code, 'asset_category') + cwip_account = frappe.db.get_value('Asset Category Account', + {'parent': asset_category, 'company_name': company}, 'capital_work_in_progress_account') + + return cwip_account or None \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_category_account/asset_category_account.json b/erpnext/assets/doctype/asset_category_account/asset_category_account.json index 679cc5271d..3cace59a4c 100644 --- a/erpnext/assets/doctype/asset_category_account/asset_category_account.json +++ b/erpnext/assets/doctype/asset_category_account/asset_category_account.json @@ -41,6 +41,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -72,6 +73,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -103,6 +105,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -134,6 +137,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "capital_work_in_progress_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Capital Work In Progress Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -147,7 +183,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-11-28 16:54:12.252271", + "modified": "2018-05-08 11:41:09.678234", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category Account", diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 1b68b8a6b6..9040bb7c8f 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -168,6 +168,9 @@ class Company(NestedSet): self._set_default_account("round_off_account", "Round Off") self._set_default_account("accumulated_depreciation_account", "Accumulated Depreciation") self._set_default_account("depreciation_expense_account", "Depreciation") + self._set_default_account("capital_work_in_progress_account", "Capital Work in Progress") + self._set_default_account("asset_received_but_not_billed", "Asset Received But Not Billed") + self._set_default_account("expenses_included_in_asset_valuation", "Expenses Included In Asset Valuation") if self.enable_perpetual_inventory: self._set_default_account("stock_received_but_not_billed", "Stock Received But Not Billed") diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 984bf33b4b..ab86c762cd 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -13,6 +13,7 @@ from erpnext.controllers.buying_controller import BuyingController from erpnext.accounts.utils import get_account_currency from frappe.desk.notifications import clear_doctype_notifications from erpnext.buying.utils import check_for_closed_status +from erpnext.assets.doctype.asset_category.asset_category import get_cwip_account form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -258,12 +259,14 @@ class PurchaseReceipt(BuyingController): "asset_received_but_not_billed"]) # CWIP entry + cwip_account = get_cwip_account(d.item_code, self.company) or asset_accounts[0] + asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate) base_asset_amount = flt(d.base_net_amount + d.item_tax_amount) - cwip_account_currency = get_account_currency(asset_accounts[0]) + cwip_account_currency = get_account_currency(cwip_account) gl_entries.append(self.get_gl_dict({ - "account": asset_accounts[0], + "account": cwip_account, "against": asset_accounts[1], "cost_center": d.cost_center, "remarks": self.get("remarks") or _("Accounting Entry for Asset"), From f2684ae83a8748ca796a4ec5b2407e1a742ef127 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 8 May 2018 13:22:22 +0530 Subject: [PATCH 139/154] Commonify get_asset_category_account and get_fixed_asset_account method --- .../purchase_invoice/purchase_invoice.js | 3 ++- .../purchase_invoice/purchase_invoice.py | 20 ++++--------------- erpnext/assets/doctype/asset/asset.py | 4 ++-- .../doctype/asset_category/asset_category.py | 17 +++++++++++----- erpnext/controllers/buying_controller.py | 6 +++++- .../purchase_receipt/purchase_receipt.py | 5 +++-- 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index e7fdd64a6d..d2c41938fe 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -205,9 +205,10 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ var row = locals[cdt][cdn]; if(row.asset) { frappe.call({ - method: "erpnext.accounts.doctype.purchase_invoice.purchase_invoice.get_fixed_asset_account", + method: "erpnext.assets.doctype.asset_category.asset_category.get_asset_category_account", args: { "asset": row.asset, + "fieldname": "fixed_asset_account", "account": row.expense_account }, callback: function(r, rt) { diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index fd0054ace2..3e375e5051 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -19,7 +19,7 @@ from erpnext.accounts.general_ledger import get_round_off_account_and_cost_cente from frappe.model.mapper import get_mapped_doc from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\ unlink_inter_company_invoice -from erpnext.assets.doctype.asset_category.asset_category import get_cwip_account +from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -442,7 +442,9 @@ class PurchaseInvoice(BuyingController): if asset_rbnb_currency == self.company_currency else asset_amount) })) else: - cwip_account = get_cwip_account(item.item_code, self.company) or asset_accounts[2] + cwip_account = get_asset_category_account(item.asset, + 'capital_work_in_progress_account') or asset_accounts[2] + cwip_account_currency = get_account_currency(cwip_account) gl_entries.append(self.get_gl_dict({ "account": cwip_account, @@ -734,20 +736,6 @@ def make_debit_note(source_name, target_doc=None): from erpnext.controllers.sales_and_purchase_return import make_return_doc return make_return_doc("Purchase Invoice", source_name, target_doc) -@frappe.whitelist() -def get_fixed_asset_account(asset, account=None): - if account: - if frappe.db.get_value("Account", account, "account_type") != "Fixed Asset": - account=None - - if not account: - asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"]) - - account = frappe.db.get_value("Asset Category Account", - filters={"parent": asset_category, "company_name": company}, fieldname="fixed_asset_account") - - return account - @frappe.whitelist() def make_stock_entry(source_name, target_doc=None): doc = get_mapped_doc("Purchase Invoice", source_name, { diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index adcc986f66..ef6e376eae 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -7,7 +7,7 @@ import frappe from frappe import _ from frappe.utils import flt, add_months, cint, nowdate, getdate, today, date_diff from frappe.model.document import Document -from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_fixed_asset_account +from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account from erpnext.assets.doctype.asset.depreciation \ import get_disposal_account_and_cost_center, get_depreciation_accounts @@ -287,7 +287,7 @@ def make_purchase_invoice(asset, item_code, gross_purchase_amount, company, post "item_code": item_code, "is_fixed_asset": 1, "asset": asset, - "expense_account": get_fixed_asset_account(asset), + "expense_account": get_asset_category_account(asset, 'fixed_asset_account'), "qty": 1, "price_list_rate": gross_purchase_amount, "rate": gross_purchase_amount diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index 4ffd20b159..d1dd8ed7e2 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -14,9 +14,16 @@ class AssetCategory(Document): if cint(self.get(field))<1: frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) -def get_cwip_account(item_code, company): - asset_category = frappe.db.get_value('Item', item_code, 'asset_category') - cwip_account = frappe.db.get_value('Asset Category Account', - {'parent': asset_category, 'company_name': company}, 'capital_work_in_progress_account') +@frappe.whitelist() +def get_asset_category_account(asset, fieldname, account=None): + if account: + if frappe.db.get_value("Account", account, "account_type") != "Fixed Asset": + account=None - return cwip_account or None \ No newline at end of file + if not account: + asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"]) + + account = frappe.db.get_value("Asset Category Account", + filters={"parent": asset_category, "company_name": company}, fieldname=fieldname) + + return account \ No newline at end of file diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index a1bc6d7aa7..80bec0e889 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -505,11 +505,15 @@ class BuyingController(StockController): self.make_asset_movement(d) def make_asset(self, row): + item_data = frappe.db.get_value('Item', + row.item_code, ['asset_naming_series', 'asset_category'], as_dict=1) + asset = frappe.get_doc({ 'doctype': 'Asset', 'item_code': row.item_code, 'asset_name': row.item_name, - 'naming_series': frappe.db.get_value('Item', row.item_code, 'asset_naming_series') or 'AST', + 'naming_series': item_data.get('asset_naming_series') or 'AST', + 'asset_category': item_data.get('asset_category'), 'warehouse': row.warehouse, 'company': self.company, 'purchase_date': self.posting_date, diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index ab86c762cd..573f7ed8f3 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -13,7 +13,7 @@ from erpnext.controllers.buying_controller import BuyingController from erpnext.accounts.utils import get_account_currency from frappe.desk.notifications import clear_doctype_notifications from erpnext.buying.utils import check_for_closed_status -from erpnext.assets.doctype.asset_category.asset_category import get_cwip_account +from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -259,7 +259,8 @@ class PurchaseReceipt(BuyingController): "asset_received_but_not_billed"]) # CWIP entry - cwip_account = get_cwip_account(d.item_code, self.company) or asset_accounts[0] + cwip_account = get_asset_category_account(d.asset, + 'capital_work_in_progress_account') or asset_accounts[0] asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate) base_asset_amount = flt(d.base_net_amount + d.item_tax_amount) From 0ea6fe4397051f3d7094dd2059913918f999a3e4 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 8 May 2018 23:31:58 +0530 Subject: [PATCH 140/154] Added new doctype Finance Book Detail in asset, asset category --- erpnext/assets/doctype/asset/asset.js | 4 +- erpnext/assets/doctype/asset/asset.json | 377 ++++++++++++++++-- erpnext/assets/doctype/asset/asset.py | 141 +++---- .../asset_category/asset_category.json | 65 ++- .../doctype/asset_finance_book/__init__.py | 0 .../asset_finance_book.json | 318 +++++++++++++++ .../asset_finance_book/asset_finance_book.py | 10 + .../depreciation_schedule.json | 62 ++- erpnext/controllers/buying_controller.py | 1 + 9 files changed, 859 insertions(+), 119 deletions(-) create mode 100644 erpnext/assets/doctype/asset_finance_book/__init__.py create mode 100644 erpnext/assets/doctype/asset_finance_book/asset_finance_book.json create mode 100644 erpnext/assets/doctype/asset_finance_book/asset_finance_book.py diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index edc1e364f5..b8bcc91d2a 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -131,9 +131,7 @@ frappe.ui.form.on('Asset', { }, callback: function(r, rt) { if(r.message) { - $.each(r.message, function(field, value) { - frm.set_value(field, value); - }) + frm.set_value('finance_books', r.message); } } }) diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 536b4dc522..a47c645359 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -42,7 +42,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -73,7 +72,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -105,7 +103,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -137,7 +134,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -169,7 +165,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -202,7 +197,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -234,7 +228,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -267,7 +260,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -300,7 +292,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -333,7 +324,37 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "custodian", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Custodian", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -364,7 +385,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -395,7 +415,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -425,7 +444,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -457,7 +475,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -489,7 +506,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -521,7 +537,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -552,7 +567,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -584,7 +598,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -616,7 +629,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -647,7 +659,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -678,7 +689,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -709,7 +719,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -741,7 +750,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -771,7 +779,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -803,7 +810,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -833,7 +839,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -866,7 +871,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -899,7 +903,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -929,7 +932,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -960,7 +962,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -992,7 +993,66 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_books", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Finance Books", + "length": 0, + "no_copy": 0, + "options": "Asset Finance Book", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_33", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -1026,7 +1086,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1058,7 +1117,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1089,7 +1147,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1119,7 +1176,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1151,7 +1207,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1182,7 +1237,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1214,7 +1268,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1246,7 +1299,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1278,7 +1330,245 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurance_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Insurance details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "policy_number", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Policy number", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurer", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Insurer", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insured_value", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Insured value", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_48", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurance_start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Insurance Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurance_end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Insurance End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "comprehensive_insurance", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Comprehensive Insurance", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -1309,7 +1599,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1341,7 +1630,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1372,7 +1660,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -1387,7 +1674,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-07 15:25:06.456992", + "modified": "2018-05-09 11:09:56.407423", "modified_by": "Administrator", "module": "Assets", "name": "Asset", @@ -1396,6 +1683,7 @@ "permissions": [ { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -1415,6 +1703,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index ef6e376eae..a6078c4209 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -16,11 +16,11 @@ class Asset(Document): self.status = self.get_status() self.validate_item() self.set_missing_values() - self.validate_asset_values() + # self.validate_asset_values() if self.calculate_depreciation: self.make_depreciation_schedule() self.set_accumulated_depreciation() - get_depreciation_accounts(self) + # get_depreciation_accounts(self) if self.get("schedules"): self.validate_expected_value_after_useful_life() @@ -46,11 +46,9 @@ class Asset(Document): frappe.throw(_("Item {0} must be a non-stock item").format(self.item_code)) def set_missing_values(self): - if self.item_code: - item_details = get_item_details(self.item_code) - for field, value in item_details.items(): - if not self.get(field): - self.set(field, value) + if self.item_code and not self.finance_books: + finance_books = get_item_details(self.item_code) + self.set('finance_books', finance_books) def validate_asset_values(self): if not flt(self.gross_purchase_amount): @@ -65,8 +63,6 @@ class Asset(Document): if not self.is_existing_asset: self.opening_accumulated_depreciation = 0 self.number_of_depreciations_booked = 0 - if not self.next_depreciation_date: - frappe.throw(_("Next Depreciation Date is mandatory for new asset")) else: depreciable_amount = flt(self.gross_purchase_amount) - flt(self.expected_value_after_useful_life) if flt(self.opening_accumulated_depreciation) > depreciable_amount: @@ -94,66 +90,69 @@ class Asset(Document): if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(self.available_for_use_date): frappe.throw(_("Next Depreciation Date cannot be before Available-for-use Date")) - if (flt(self.value_after_depreciation) > flt(self.expected_value_after_useful_life) - and not self.next_depreciation_date and self.calculate_depreciation): - frappe.throw(_("Please set Next Depreciation Date")) - def make_depreciation_schedule(self): if self.depreciation_method != 'Manual': self.schedules = [] - if not self.get("schedules") and self.next_depreciation_date: - value_after_depreciation = flt(self.value_after_depreciation) + if not self.get("schedules"): + total_depreciations = sum([d.total_number_of_depreciations for d in self.get('finance_books')]) - number_of_pending_depreciations = cint(self.total_number_of_depreciations) - \ - cint(self.number_of_depreciations_booked) - if number_of_pending_depreciations: - next_depr_date = getdate(add_months(self.available_for_use_date, - number_of_pending_depreciations * 12)) - if (cint(frappe.db.get_value("Asset Settings", None, "schedule_based_on_fiscal_year")) == 1 - and getdate(self.next_depreciation_date) < next_depr_date): + for d in self.get('finance_books'): + d.value_after_depreciation = ((flt(self.gross_purchase_amount * d.total_number_of_depreciations) / + total_depreciations) - flt(d.opening_accumulated_depreciation)) + value_after_depreciation = flt(d.value_after_depreciation) - number_of_pending_depreciations += 1 - for n in range(number_of_pending_depreciations): - if n == range(number_of_pending_depreciations)[-1]: - schedule_date = add_months(self.available_for_use_date, n * 12) - previous_scheduled_date = add_months(self.next_depreciation_date, (n-1) * 12) - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - previous_scheduled_date, schedule_date) + number_of_pending_depreciations = cint(d.total_number_of_depreciations) - \ + cint(d.number_of_depreciations_booked) + if number_of_pending_depreciations: + next_depr_date = getdate(add_months(self.available_for_use_date, + number_of_pending_depreciations * 12)) + if (cint(frappe.db.get_value("Asset Settings", None, "schedule_based_on_fiscal_year")) == 1 + and getdate(d.start_date) < next_depr_date): - elif n == range(number_of_pending_depreciations)[0]: - schedule_date = self.next_depreciation_date - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - self.available_for_use_date, schedule_date) + number_of_pending_depreciations += 1 + for n in range(number_of_pending_depreciations): + if n == range(number_of_pending_depreciations)[-1]: + schedule_date = add_months(self.available_for_use_date, n * 12) + previous_scheduled_date = add_months(d.start_date, (n-1) * 12) + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, + previous_scheduled_date, schedule_date) - else: - schedule_date = add_months(self.next_depreciation_date, n * 12) - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation) + elif n == range(number_of_pending_depreciations)[0]: + schedule_date = d.start_date + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, + self.available_for_use_date, schedule_date) - if value_after_depreciation != 0: - value_after_depreciation -= flt(depreciation_amount) + else: + schedule_date = add_months(d.start_date, n * 12) + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation) - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount - }) - else: - for n in range(number_of_pending_depreciations): - schedule_date = add_months(self.next_depreciation_date, - n * cint(self.frequency_of_depreciation)) + if value_after_depreciation != 0: + value_after_depreciation -= flt(depreciation_amount) - depreciation_amount = self.get_depreciation_amount(value_after_depreciation) - if depreciation_amount: - value_after_depreciation -= flt(depreciation_amount) + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount, + 'finance_book_id': d.name + }) + else: + for n in range(number_of_pending_depreciations): + schedule_date = add_months(d.start_date, + n * cint(d.frequency_of_depreciation)) - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount - }) + depreciation_amount = self.get_depreciation_amount(value_after_depreciation, d) + if depreciation_amount: + value_after_depreciation -= flt(depreciation_amount) + + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount, + 'finance_book_id': d.name + }) def set_accumulated_depreciation(self): accumulated_depreciation = flt(self.opening_accumulated_depreciation) @@ -171,13 +170,13 @@ class Asset(Document): d.accumulated_depreciation_amount = flt(accumulated_depreciation, d.precision("accumulated_depreciation_amount")) - def get_depreciation_amount(self, depreciable_value): - if self.depreciation_method in ("Straight Line", "Manual"): - depreciation_amount = (flt(self.value_after_depreciation) - - flt(self.expected_value_after_useful_life)) / (cint(self.total_number_of_depreciations) - - cint(self.number_of_depreciations_booked)) + def get_depreciation_amount(self, depreciable_value, row): + if row.depreciation_method in ("Straight Line", "Manual"): + depreciation_amount = (flt(row.value_after_depreciation) - + flt(self.expected_value_after_useful_life)) / (cint(row.total_number_of_depreciations) - + cint(row.number_of_depreciations_booked)) else: - factor = 200.0 / self.total_number_of_depreciations + factor = 200.0 / row.total_number_of_depreciations depreciation_amount = flt(depreciable_value * factor / 100, 0) value_after_depreciation = flt(depreciable_value) - depreciation_amount @@ -345,11 +344,15 @@ def get_item_details(item_code): if not asset_category: frappe.throw(_("Please enter Asset Category in Item {0}").format(item_code)) - ret = frappe.db.get_value("Asset Category", asset_category, - ["depreciation_method", "total_number_of_depreciations", "frequency_of_depreciation"], as_dict=1) + asset_category_doc = frappe.get_doc('Asset Category', asset_category) + books = [] + for d in asset_category_doc.finance_books: + books.append({ + 'finance_book': d.finance_book, + 'depreciation_method': d.depreciation_method, + 'total_number_of_depreciations': d.total_number_of_depreciations, + 'frequency_of_depreciation': d.frequency_of_depreciation, + 'start_date': nowdate() + }) - ret.update({ - "asset_category": asset_category - }) - - return ret + return books diff --git a/erpnext/assets/doctype/asset_category/asset_category.json b/erpnext/assets/doctype/asset_category/asset_category.json index 3331d05e85..d9776b8d91 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.json +++ b/erpnext/assets/doctype/asset_category/asset_category.json @@ -164,6 +164,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_book_detail", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Finance Book Detail", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_books", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Finance Books", + "length": 0, + "no_copy": 0, + "options": "Asset Finance Book", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -236,7 +297,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-01 15:14:25.645077", + "modified": "2018-05-09 11:09:55.806482", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category", @@ -312,4 +373,4 @@ "sort_order": "DESC", "track_changes": 0, "track_seen": 0 -} +} \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_finance_book/__init__.py b/erpnext/assets/doctype/asset_finance_book/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json new file mode 100644 index 0000000000..92991e9c85 --- /dev/null +++ b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json @@ -0,0 +1,318 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-05-08 14:44:37.095570", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "finance_book", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Finance Book", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depreciation_method", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Depreciation Method", + "length": 0, + "no_copy": 0, + "options": "\nStraight Line\nDouble Declining Balance\nManual", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_number_of_depreciations", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Total Number of Depreciations", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "value_after_depreciation", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Value After Depreciation", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "frequency_of_depreciation", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Frequency of Depreciation (Months)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:parent.doctype == 'Asset'", + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:parent.is_existing_asset", + "fieldname": "opening_accumulated_depreciation", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Opening Accumulated Depreciation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: (parent.is_existing_asset && doc.opening_accumulated_depreciation)", + "fieldname": "number_of_depreciations_booked", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Number of Depreciations Booked", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-05-09 11:10:00.923786", + "modified_by": "Administrator", + "module": "Assets", + "name": "Asset Finance Book", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.py b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.py new file mode 100644 index 0000000000..bdc2acfb79 --- /dev/null +++ b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AssetFinanceBook(Document): + pass diff --git a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json index 330347240d..17b4aecc04 100644 --- a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json +++ b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -196,6 +196,66 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_book", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Finance Book", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_book_id", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Finance Book Id", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -208,7 +268,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-10-19 16:30:13.738170", + "modified": "2018-05-08 15:24:57.955533", "modified_by": "Administrator", "module": "Assets", "name": "Depreciation Schedule", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 80bec0e889..d4399ad518 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -517,6 +517,7 @@ class BuyingController(StockController): 'warehouse': row.warehouse, 'company': self.company, 'purchase_date': self.posting_date, + 'calculate_depreciation': 1, 'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None, 'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None }) From aa7b43427004af20002ae2a1d4ae7b13736093ca Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 11 May 2018 01:56:05 +0530 Subject: [PATCH 141/154] Create asset adjustment doctype, post gl entry for the asset --- erpnext/assets/doctype/asset/asset.js | 28 +- erpnext/assets/doctype/asset/asset.json | 693 +++++++++--------- erpnext/assets/doctype/asset/asset.py | 322 +++++--- .../doctype/asset_adjustment/__init__.py | 0 .../asset_adjustment/asset_adjustment.js | 8 + .../asset_adjustment/asset_adjustment.json | 438 +++++++++++ .../asset_adjustment/asset_adjustment.py | 10 + .../asset_adjustment/test_asset_adjustment.js | 23 + .../asset_adjustment/test_asset_adjustment.py | 10 + .../asset_category/asset_category.json | 4 +- .../doctype/asset_category/asset_category.py | 17 +- .../asset_category_account.json | 13 +- .../asset_finance_book.json | 116 ++- .../asset_movement/asset_movement.json | 367 +++++++--- .../doctype/asset_movement/asset_movement.py | 41 +- .../depreciation_schedule.json | 94 ++- erpnext/config/assets.py | 5 +- erpnext/controllers/accounts_controller.py | 7 +- erpnext/controllers/buying_controller.py | 16 +- erpnext/hooks.py | 3 +- .../stock/doctype/serial_no/serial_no.json | 262 +++++-- .../stock/doctype/serial_no/test_serial_no.js | 23 + 22 files changed, 1695 insertions(+), 805 deletions(-) create mode 100644 erpnext/assets/doctype/asset_adjustment/__init__.py create mode 100644 erpnext/assets/doctype/asset_adjustment/asset_adjustment.js create mode 100644 erpnext/assets/doctype/asset_adjustment/asset_adjustment.json create mode 100644 erpnext/assets/doctype/asset_adjustment/asset_adjustment.py create mode 100644 erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.js create mode 100644 erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.py create mode 100644 erpnext/stock/doctype/serial_no/test_serial_no.js diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index b8bcc91d2a..4daeae2880 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -57,6 +57,19 @@ frappe.ui.form.on('Asset', { erpnext.asset.restore_asset(frm); }); } + + if (frm.doc.purchase_receipt) { + frm.add_custom_button("General Ledger", function() { + frappe.route_options = { + "voucher_no": frm.doc.name, + "from_date": frm.doc.available_for_use_date, + "to_date": frm.doc.available_for_use_date, + "company": frm.doc.company + }; + frappe.set_route("query-report", "General Ledger"); + }); + } + if (frm.doc.status=='Submitted' && !frm.doc.is_existing_asset && !frm.doc.purchase_invoice) { frm.add_custom_button(__("Purchase Invoice"), function() { frm.trigger("make_purchase_invoice"); @@ -139,7 +152,7 @@ frappe.ui.form.on('Asset', { }, is_existing_asset: function(frm) { - frm.toggle_reqd("next_depreciation_date", (!frm.doc.is_existing_asset && frm.doc.calculate_depreciation)); + // frm.toggle_reqd("next_depreciation_date", (!frm.doc.is_existing_asset && frm.doc.calculate_depreciation)); }, opening_accumulated_depreciation: function(frm) { @@ -289,15 +302,14 @@ erpnext.asset.transfer_asset = function(frm) { title: __("Transfer Asset"), fields: [ { - "label": __("Target Warehouse"), - "fieldname": "target_warehouse", + "label": __("Target Location"), + "fieldname": "target_location", "fieldtype": "Link", - "options": "Warehouse", + "options": "Location", "get_query": function () { return { filters: [ - ["Warehouse", "company", "in", ["", cstr(frm.doc.company)]], - ["Warehouse", "is_group", "=", 0] + ["Location", "is_group", "=", 0] ] } }, @@ -324,8 +336,8 @@ erpnext.asset.transfer_asset = function(frm) { args: { "asset": frm.doc.name, "transaction_date": args.transfer_date, - "source_warehouse": frm.doc.warehouse, - "target_warehouse": args.target_warehouse, + "source_warehouse": frm.doc.location, + "target_warehouse": args.target_location, "company": frm.doc.company } }, diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index a47c645359..9a05cad65c 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -167,38 +167,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Draft", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Status", - "length": 0, - "no_copy": 1, - "options": "Draft\nSubmitted\nPartially Depreciated\nFully Depreciated\nSold\nScrapped\nIn Maintenance\nOut of Order", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -326,37 +294,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "custodian", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custodian", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 1, @@ -387,36 +324,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "serial_no", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Serial No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -483,7 +390,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "warehouse", + "fieldname": "location", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -491,11 +398,11 @@ "in_filter": 0, "in_global_search": 0, "in_list_view": 0, - "in_standard_filter": 1, - "label": "Warehouse", + "in_standard_filter": 0, + "label": "Location", "length": 0, "no_copy": 0, - "options": "Warehouse", + "options": "Location", "permlevel": 0, "precision": "", "print_hide": 0, @@ -508,6 +415,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "custodian", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Custodian", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -569,128 +507,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "purchase_receipt", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Purchase Receipt", - "length": 0, - "no_copy": 1, - "options": "Purchase Receipt", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "purchase_invoice", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Purchase Invoice", - "length": 0, - "no_copy": 1, - "options": "Purchase Invoice", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "available_for_use_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Available-for-use Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_existing_asset", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Existing Asset", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -812,6 +628,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "available_for_use_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Available-for-use Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -841,99 +687,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "expected_value_after_useful_life", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Expected Value After Useful Life", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "is_existing_asset", - "fieldname": "opening_accumulated_depreciation", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Opening Accumulated Depreciation", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_20", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -968,7 +721,100 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "is_existing_asset", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Existing Asset", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_existing_asset", + "fieldname": "opening_accumulated_depreciation", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Opening Accumulated Depreciation", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:(doc.is_existing_asset && doc.opening_accumulated_depreciation)", + "fieldname": "number_of_depreciations_booked", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Number of Depreciations Booked", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, "columns": 0, "depends_on": "calculate_depreciation", "fieldname": "section_break_23", @@ -1034,7 +880,7 @@ "columns": 0, "fieldname": "section_break_33", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -1178,37 +1024,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:(doc.is_existing_asset && doc.opening_accumulated_depreciation)", - "fieldname": "number_of_depreciations_booked", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Number of Depreciations Booked", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1336,7 +1151,7 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "columns": 0, "fieldname": "insurance_details", "fieldtype": "Section Break", @@ -1632,6 +1447,190 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "other_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Other Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Draft", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 1, + "options": "Draft\nSubmitted\nPartially Depreciated\nFully Depreciated\nSold\nScrapped\nIn Maintenance\nOut of Order\nIssue\nReceipt", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "booked_fixed_asset", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Booked Fixed Asset", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_51", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_receipt", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Receipt", + "length": 0, + "no_copy": 1, + "options": "Purchase Receipt", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_invoice", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Invoice", + "length": 0, + "no_copy": 1, + "options": "Purchase Invoice", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1674,7 +1673,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-09 11:09:56.407423", + "modified": "2018-05-11 01:48:18.711485", "modified_by": "Administrator", "module": "Assets", "name": "Asset", diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index a6078c4209..bf70fbc17d 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -10,17 +10,20 @@ from frappe.model.document import Document from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account from erpnext.assets.doctype.asset.depreciation \ import get_disposal_account_and_cost_center, get_depreciation_accounts +from erpnext.accounts.general_ledger import make_gl_entries +from erpnext.accounts.utils import get_account_currency +from erpnext.controllers.accounts_controller import AccountsController -class Asset(Document): +class Asset(AccountsController): def validate(self): self.status = self.get_status() self.validate_item() self.set_missing_values() - # self.validate_asset_values() + self.validate_asset_values() if self.calculate_depreciation: self.make_depreciation_schedule() self.set_accumulated_depreciation() - # get_depreciation_accounts(self) + get_depreciation_accounts(self) if self.get("schedules"): self.validate_expected_value_after_useful_life() @@ -46,8 +49,11 @@ class Asset(Document): frappe.throw(_("Item {0} must be a non-stock item").format(self.item_code)) def set_missing_values(self): - if self.item_code and not self.finance_books: - finance_books = get_item_details(self.item_code) + if not self.asset_category: + self.asset_category = frappe.db.get_value("Item", self.item_code, "asset_category") + + if self.item_code and not self.get('finance_books'): + finance_books = get_item_details(self.item_code, self.asset_category) self.set('finance_books', finance_books) def validate_asset_values(self): @@ -57,14 +63,105 @@ class Asset(Document): if not self.calculate_depreciation: return - if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): - frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount")) + self.value_after_depreciation = (flt(self.gross_purchase_amount) - + flt(self.opening_accumulated_depreciation)) + + if self.available_for_use_date and getdate(self.available_for_use_date) < getdate(nowdate()): + frappe.throw(_("Available-for-use Date is entered as past date")) + + def make_depreciation_schedule(self): + if self.depreciation_method != 'Manual': + self.schedules = [] + + if not self.get("schedules") and self.available_for_use_date: + total_depreciations = sum([d.total_number_of_depreciations for d in self.get('finance_books')]) + + for d in self.get('finance_books'): + self.validate_asset_finance_books(d) + + value_after_depreciation = flt(self.value_after_depreciation) + d.value_after_depreciation = value_after_depreciation + + no_of_depreciations = cint(d.total_number_of_depreciations - 1) - cint(self.number_of_depreciations_booked) + end_date = add_months(d.depreciation_start_date, + no_of_depreciations * cint(d.frequency_of_depreciation)) + + total_days = date_diff(end_date, self.available_for_use_date) + rate_per_day = value_after_depreciation / total_days + + number_of_pending_depreciations = cint(d.total_number_of_depreciations) - \ + cint(self.number_of_depreciations_booked) + + from_date = self.available_for_use_date + if number_of_pending_depreciations: + next_depr_date = getdate(add_months(self.available_for_use_date, + number_of_pending_depreciations * 12)) + if (cint(frappe.db.get_value("Asset Settings", None, "schedule_based_on_fiscal_year")) == 1 + and getdate(d.depreciation_start_date) < next_depr_date): + + number_of_pending_depreciations += 1 + for n in range(number_of_pending_depreciations): + if n == range(number_of_pending_depreciations)[-1]: + schedule_date = add_months(self.available_for_use_date, n * 12) + previous_scheduled_date = add_months(d.depreciation_start_date, (n-1) * 12) + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, + row, previous_scheduled_date, schedule_date) + + elif n == range(number_of_pending_depreciations)[0]: + schedule_date = d.depreciation_start_date + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, + row, self.available_for_use_date, schedule_date) + + else: + schedule_date = add_months(d.depreciation_start_date, n * 12) + depreciation_amount = \ + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, row) + + if value_after_depreciation != 0: + value_after_depreciation -= flt(depreciation_amount) + + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount, + "depreciation_method": d.depreciation_method, + "finance_book": d.finance_book, + "finance_book_id": d.idx + }) + else: + for n in range(number_of_pending_depreciations): + schedule_date = add_months(d.depreciation_start_date, + n * cint(d.frequency_of_depreciation)) + + if d.depreciation_method in ("Straight Line", "Manual"): + days = date_diff(schedule_date, from_date) + depreciation_amount = days * rate_per_day + from_date = schedule_date + else: + depreciation_amount = self.get_depreciation_amount(value_after_depreciation,d) + + if depreciation_amount: + value_after_depreciation -= flt(depreciation_amount) + + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount, + "depreciation_method": d.depreciation_method, + "finance_book": d.finance_book, + "finance_book_id": d.idx + }) + + def validate_asset_finance_books(self, row): + if flt(row.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): + frappe.throw(_("Row {0}: Expected Value After Useful Life must be less than Gross Purchase Amount") + .format(row.idx)) if not self.is_existing_asset: self.opening_accumulated_depreciation = 0 self.number_of_depreciations_booked = 0 else: - depreciable_amount = flt(self.gross_purchase_amount) - flt(self.expected_value_after_useful_life) + depreciable_amount = flt(self.gross_purchase_amount) - flt(row.expected_value_after_useful_life) if flt(self.opening_accumulated_depreciation) > depreciable_amount: frappe.throw(_("Opening Accumulated Depreciation must be less than equal to {0}") .format(depreciable_amount)) @@ -75,95 +172,38 @@ class Asset(Document): else: self.number_of_depreciations_booked = 0 - if cint(self.number_of_depreciations_booked) > cint(self.total_number_of_depreciations): + if cint(self.number_of_depreciations_booked) > cint(row.total_number_of_depreciations): frappe.throw(_("Number of Depreciations Booked cannot be greater than Total Number of Depreciations")) - self.value_after_depreciation = (flt(self.gross_purchase_amount) - - flt(self.opening_accumulated_depreciation)) + if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(nowdate()): + frappe.msgprint(_("Depreciation Row {0}: Depreciation Start Date is entered as past date") + .format(row.idx), title=_('Warning'), indicator='red') - if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(nowdate()): - frappe.msgprint(_("Next Depreciation Date is entered as past date"), title=_('Warning'), indicator='red') + if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(self.purchase_date): + frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date") + .format(row.idx)) - if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(self.purchase_date): - frappe.throw(_("Next Depreciation Date cannot be before Purchase Date")) - - if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(self.available_for_use_date): - frappe.throw(_("Next Depreciation Date cannot be before Available-for-use Date")) - - def make_depreciation_schedule(self): - - if self.depreciation_method != 'Manual': - self.schedules = [] - - if not self.get("schedules"): - total_depreciations = sum([d.total_number_of_depreciations for d in self.get('finance_books')]) - - for d in self.get('finance_books'): - d.value_after_depreciation = ((flt(self.gross_purchase_amount * d.total_number_of_depreciations) / - total_depreciations) - flt(d.opening_accumulated_depreciation)) - value_after_depreciation = flt(d.value_after_depreciation) - - number_of_pending_depreciations = cint(d.total_number_of_depreciations) - \ - cint(d.number_of_depreciations_booked) - if number_of_pending_depreciations: - next_depr_date = getdate(add_months(self.available_for_use_date, - number_of_pending_depreciations * 12)) - if (cint(frappe.db.get_value("Asset Settings", None, "schedule_based_on_fiscal_year")) == 1 - and getdate(d.start_date) < next_depr_date): - - number_of_pending_depreciations += 1 - for n in range(number_of_pending_depreciations): - if n == range(number_of_pending_depreciations)[-1]: - schedule_date = add_months(self.available_for_use_date, n * 12) - previous_scheduled_date = add_months(d.start_date, (n-1) * 12) - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - previous_scheduled_date, schedule_date) - - elif n == range(number_of_pending_depreciations)[0]: - schedule_date = d.start_date - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - self.available_for_use_date, schedule_date) - - else: - schedule_date = add_months(d.start_date, n * 12) - depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation) - - if value_after_depreciation != 0: - value_after_depreciation -= flt(depreciation_amount) - - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount, - 'finance_book_id': d.name - }) - else: - for n in range(number_of_pending_depreciations): - schedule_date = add_months(d.start_date, - n * cint(d.frequency_of_depreciation)) - - depreciation_amount = self.get_depreciation_amount(value_after_depreciation, d) - if depreciation_amount: - value_after_depreciation -= flt(depreciation_amount) - - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount, - 'finance_book_id': d.name - }) + if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(self.available_for_use_date): + frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Available-for-use Date") + .format(row.idx)) def set_accumulated_depreciation(self): - accumulated_depreciation = flt(self.opening_accumulated_depreciation) value_after_depreciation = flt(self.value_after_depreciation) + straight_line_idx = [d.idx for d in self.get("schedules") if d.depreciation_method == 'Straight Line'] + finance_books = [] + for i, d in enumerate(self.get("schedules")): + if d.finance_book_id not in finance_books: + accumulated_depreciation = flt(self.opening_accumulated_depreciation) + finance_books.append(d.finance_book_id) + depreciation_amount = flt(d.depreciation_amount, d.precision("depreciation_amount")) value_after_depreciation -= flt(depreciation_amount) - if i==len(self.get("schedules"))-1 and self.depreciation_method == "Straight Line": + if straight_line_idx and i == max(straight_line_idx) - 1: + book = self.get('finance_books')[d.finance_book_id - 1] depreciation_amount += flt(value_after_depreciation - - flt(self.expected_value_after_useful_life), d.precision("depreciation_amount")) + flt(book.expected_value_after_useful_life), d.precision("depreciation_amount")) d.depreciation_amount = depreciation_amount accumulated_depreciation += d.depreciation_amount @@ -171,46 +211,44 @@ class Asset(Document): d.precision("accumulated_depreciation_amount")) def get_depreciation_amount(self, depreciable_value, row): - if row.depreciation_method in ("Straight Line", "Manual"): - depreciation_amount = (flt(row.value_after_depreciation) - - flt(self.expected_value_after_useful_life)) / (cint(row.total_number_of_depreciations) - - cint(row.number_of_depreciations_booked)) - else: - factor = 200.0 / row.total_number_of_depreciations - depreciation_amount = flt(depreciable_value * factor / 100, 0) + percentage_value = 100.0 if row.depreciation_method == 'Written Down Value' else 200.0 - value_after_depreciation = flt(depreciable_value) - depreciation_amount - if value_after_depreciation < flt(self.expected_value_after_useful_life): - depreciation_amount = flt(depreciable_value) - flt(self.expected_value_after_useful_life) + factor = percentage_value / row.total_number_of_depreciations + depreciation_amount = flt(depreciable_value * factor / 100, 0) + + value_after_depreciation = flt(depreciable_value) - depreciation_amount + if value_after_depreciation < flt(row.expected_value_after_useful_life): + depreciation_amount = flt(depreciable_value) - flt(row.expected_value_after_useful_life) return depreciation_amount - def get_depreciation_amount_prorata_temporis(self, depreciable_value, start_date=None, end_date=None): + def get_depreciation_amount_prorata_temporis(self, depreciable_value, row, start_date=None, end_date=None): if start_date and end_date: prorata_temporis = min(abs(flt(date_diff(str(end_date), str(start_date)))) / flt(frappe.db.get_value("Asset Settings", None, "number_of_days_in_fiscal_year")), 1) else: prorata_temporis = 1 - if self.depreciation_method in ("Straight Line", "Manual"): + if row.depreciation_method in ("Straight Line", "Manual"): depreciation_amount = (flt(self.value_after_depreciation) - - flt(self.expected_value_after_useful_life)) / (cint(self.total_number_of_depreciations) - + flt(row.expected_value_after_useful_life)) / (cint(row.total_number_of_depreciations) - cint(self.number_of_depreciations_booked)) * prorata_temporis - - return depreciation_amount else: - self.get_depreciation_amount(depreciable_value) + depreciation_amount = self.get_depreciation_amount(depreciable_value, row) + + return depreciation_amount def validate_expected_value_after_useful_life(self): - accumulated_depreciation_after_full_schedule = \ - max([d.accumulated_depreciation_amount for d in self.get("schedules")]) + for row in self.get('finance_books'): + accumulated_depreciation_after_full_schedule = \ + max([d.accumulated_depreciation_amount for d in self.get("schedules") if d.finance_book_id == row.idx]) - asset_value_after_full_schedule = flt(flt(self.gross_purchase_amount) - - flt(accumulated_depreciation_after_full_schedule), - self.precision('expected_value_after_useful_life')) + asset_value_after_full_schedule = flt(flt(self.gross_purchase_amount) - + flt(accumulated_depreciation_after_full_schedule), + self.precision('gross_purchase_amount')) - if self.expected_value_after_useful_life < asset_value_after_full_schedule: - frappe.throw(_("Expected value after useful life must be greater than or equal to {0}") - .format(asset_value_after_full_schedule)) + if row.expected_value_after_useful_life < asset_value_after_full_schedule: + frappe.throw(_("Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}") + .format(row.idx, asset_value_after_full_schedule)) def validate_cancellation(self): if self.status not in ("Submitted", "Partially Depreciated", "Fully Depreciated"): @@ -243,9 +281,15 @@ class Asset(Document): status = "Draft" elif self.docstatus == 1: status = "Submitted" + expected_value_after_useful_life = flt(sum([d.expected_value_after_useful_life + for d in self.get('finance_books')])) + + value_after_depreciation = flt(sum([d.value_after_depreciation + for d in self.get('finance_books')])) + if self.journal_entry_for_scrap: status = "Scrapped" - elif flt(self.value_after_depreciation) <= flt(self.expected_value_after_useful_life): + elif flt(value_after_depreciation) <= expected_value_after_useful_life: status = "Fully Depreciated" elif flt(self.value_after_depreciation) < flt(self.gross_purchase_amount): status = 'Partially Depreciated' @@ -261,6 +305,37 @@ class Asset(Document): doc = frappe.get_doc('Asset Movement', asset_movement) doc.submit() + def make_gl_entries(self): + if self.purchase_receipt: + from erpnext.accounts.general_ledger import make_gl_entries + + gl_entries = [] + + cwip_account = get_cwip_account(self.name, self.asset_category, self.company) + fixed_aseet_account = get_asset_category_account(self.name, 'fixed_asset_account', + asset_category = self.asset_category, company = self.company) + + gl_entries.append(self.get_gl_dict({ + "account": cwip_account, + "against": fixed_aseet_account, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "posting_date": self.available_for_use_date, + "credit": self.gross_purchase_amount, + "credit_in_account_currency": self.gross_purchase_amount + })) + + gl_entries.append(self.get_gl_dict({ + "account": fixed_aseet_account, + "against": cwip_account, + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "posting_date": self.available_for_use_date, + "debit": self.gross_purchase_amount, + "debit_in_account_currency": self.gross_purchase_amount + })) + + make_gl_entries(gl_entries) + self.db_set('booked_fixed_asset', 1) + def update_maintenance_status(): assets = frappe.get_all('Asset', filters = {'docstatus': 1, 'maintenance_required': 1}) @@ -271,6 +346,14 @@ def update_maintenance_status(): if frappe.db.exists('Asset Repair', {'asset_name': asset.name, 'repair_status': 'Pending'}): asset.set_status('Out of Order') +def make_post_gl_entry(): + assets = frappe.db.sql_list(""" select name from `tabAsset` + where ifnull(booked_fixed_asset, 0) = 0 and available_for_use_date = %s""", nowdate()) + + for asset in assets: + doc = frappe.get_doc('Asset', asset) + doc.make_gl_entries() + def get_asset_naming_series(): meta = frappe.get_meta('Asset') return meta.get_field("naming_series").options @@ -295,7 +378,7 @@ def make_purchase_invoice(asset, item_code, gross_purchase_amount, company, post return pi @frappe.whitelist() -def make_sales_invoice(asset, item_code, company, serial_no): +def make_sales_invoice(asset, item_code, company, serial_no=None): si = frappe.new_doc("Sales Invoice") si.company = company si.currency = frappe.db.get_value("Company", company, "default_currency") @@ -338,9 +421,7 @@ def transfer_asset(args): frappe.msgprint(_("Asset Movement record {0} created").format("
{0}".format(movement_entry.name))) @frappe.whitelist() -def get_item_details(item_code): - asset_category = frappe.db.get_value("Item", item_code, "asset_category") - +def get_item_details(item_code, asset_category=None): if not asset_category: frappe.throw(_("Please enter Asset Category in Item {0}").format(item_code)) @@ -356,3 +437,16 @@ def get_item_details(item_code): }) return books + +def get_cwip_account(asset, asset_category=None, company=None): + cwip_account = get_asset_category_account(asset, 'capital_work_in_progress_account', + asset_category = asset_category, company = company) + + if not cwip_account: + cwip_account = frappe.db.get_value('Company', company, 'capital_work_in_progress_account') + + if not cwip_account: + frappe.throw(_("Set Capital Work In Progress Account in asset category {0} or company {1}") + .format(asset_category, company)) + + return cwip_account diff --git a/erpnext/assets/doctype/asset_adjustment/__init__.py b/erpnext/assets/doctype/asset_adjustment/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js new file mode 100644 index 0000000000..0535743703 --- /dev/null +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Asset Adjustment', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json new file mode 100644 index 0000000000..8a0e95775a --- /dev/null +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json @@ -0,0 +1,438 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-05-11 00:22:43.695151", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset", + "length": 0, + "no_copy": 0, + "options": "Asset", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset_category", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Category", + "length": 0, + "no_copy": 0, + "options": "asset.asset_category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_book", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Finance Book", + "length": 0, + "no_copy": 0, + "options": "Finance Book", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "current_asset_value", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Current Asset Value", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "journal_entry", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Journal Entry", + "length": 0, + "no_copy": 0, + "options": "Journal Entry", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new_asset_value", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "New Asset Value", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "accumulated_depreciation_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Accumulated Depreciation Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Asset Adjustment", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-11 00:25:07.222408", + "modified_by": "Administrator", + "module": "Assets", + "name": "Asset Adjustment", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "asset", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py new file mode 100644 index 0000000000..437f9bd902 --- /dev/null +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AssetAdjustment(Document): + pass diff --git a/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.js b/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.js new file mode 100644 index 0000000000..29d070af52 --- /dev/null +++ b/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Asset Adjustment", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Asset Adjustment + () => frappe.tests.make('Asset Adjustment', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.py b/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.py new file mode 100644 index 0000000000..209692e04c --- /dev/null +++ b/erpnext/assets/doctype/asset_adjustment/test_asset_adjustment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAssetAdjustment(unittest.TestCase): + pass diff --git a/erpnext/assets/doctype/asset_category/asset_category.json b/erpnext/assets/doctype/asset_category/asset_category.json index d9776b8d91..b655b40475 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.json +++ b/erpnext/assets/doctype/asset_category/asset_category.json @@ -62,7 +62,7 @@ "label": "Depreciation Method", "length": 0, "no_copy": 0, - "options": "\nStraight Line\nDouble Declining Balance\nManual", + "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual", "permlevel": 0, "precision": "", "print_hide": 0, @@ -297,7 +297,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-09 11:09:55.806482", + "modified": "2018-05-10 15:12:05.954200", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category", diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index d1dd8ed7e2..fa0bd83117 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -15,15 +15,16 @@ class AssetCategory(Document): frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) @frappe.whitelist() -def get_asset_category_account(asset, fieldname, account=None): - if account: - if frappe.db.get_value("Account", account, "account_type") != "Fixed Asset": - account=None +def get_asset_category_account(asset, fieldname, account=None, asset_category = None, company = None): + if not asset_category and company: + if account: + if frappe.db.get_value("Account", account, "account_type") != "Fixed Asset": + account=None - if not account: - asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"]) + if not account: + asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"]) - account = frappe.db.get_value("Asset Category Account", - filters={"parent": asset_category, "company_name": company}, fieldname=fieldname) + account = frappe.db.get_value("Asset Category Account", + filters={"parent": asset_category, "company_name": company}, fieldname=fieldname) return account \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_category_account/asset_category_account.json b/erpnext/assets/doctype/asset_category_account/asset_category_account.json index 3cace59a4c..b7df557552 100644 --- a/erpnext/assets/doctype/asset_category_account/asset_category_account.json +++ b/erpnext/assets/doctype/asset_category_account/asset_category_account.json @@ -17,7 +17,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 3, + "columns": 2, "fieldname": "company_name", "fieldtype": "Link", "hidden": 0, @@ -41,7 +41,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -49,7 +48,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 3, + "columns": 2, "fieldname": "fixed_asset_account", "fieldtype": "Link", "hidden": 0, @@ -73,7 +72,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -105,7 +103,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -137,7 +134,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -145,7 +141,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 0, + "columns": 2, "fieldname": "capital_work_in_progress_account", "fieldtype": "Link", "hidden": 0, @@ -169,7 +165,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -183,7 +178,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-05-08 11:41:09.678234", + "modified": "2018-05-10 17:06:48.839347", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category Account", diff --git a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json index 92991e9c85..351f9d0c66 100644 --- a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json +++ b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json @@ -20,7 +20,7 @@ "columns": 0, "depends_on": "", "fieldname": "finance_book", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -31,6 +31,7 @@ "label": "Finance Book", "length": 0, "no_copy": 0, + "options": "Finance Book", "permlevel": 0, "precision": "", "print_hide": 0, @@ -61,7 +62,7 @@ "label": "Depreciation Method", "length": 0, "no_copy": 0, - "options": "\nStraight Line\nDouble Declining Balance\nManual", + "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual", "permlevel": 0, "precision": "", "print_hide": 0, @@ -104,37 +105,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "value_after_depreciation", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Value After Depreciation", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -202,7 +172,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:parent.doctype == 'Asset'", - "fieldname": "start_date", + "fieldname": "depreciation_start_date", "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, @@ -211,39 +181,7 @@ "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, - "label": "Start Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "depends_on": "eval:parent.is_existing_asset", - "fieldname": "opening_accumulated_depreciation", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Opening Accumulated Depreciation", + "label": "Depreciation Start Date", "length": 0, "no_copy": 0, "permlevel": 0, @@ -264,9 +202,9 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval: (parent.is_existing_asset && doc.opening_accumulated_depreciation)", - "fieldname": "number_of_depreciations_booked", - "fieldtype": "Int", + "default": "0", + "fieldname": "expected_value_after_useful_life", + "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -274,9 +212,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Number of Depreciations Booked", + "label": "Expected Value After Useful Life", "length": 0, - "no_copy": 1, + "no_copy": 0, + "options": "Company:company:default_currency", "permlevel": 0, "precision": "", "print_hide": 0, @@ -288,6 +227,37 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "value_after_depreciation", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Value After Depreciation", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -300,7 +270,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-05-09 11:10:00.923786", + "modified": "2018-05-10 18:05:58.900298", "modified_by": "Administrator", "module": "Assets", "name": "Asset Finance Book", diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json index 3c3a1dc9cd..8adbf57b67 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.json +++ b/erpnext/assets/doctype/asset_movement/asset_movement.json @@ -12,6 +12,37 @@ "document_type": "", "editable_grid": 0, "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -31,7 +62,7 @@ "label": "Purpose", "length": 0, "no_copy": 0, - "options": "Receipt\nTransfer", + "options": "\nIssue\nReceipt\nTransfer", "permlevel": 0, "precision": "", "print_hide": 0, @@ -39,10 +70,9 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -74,7 +104,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -105,70 +134,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "options": "Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "serial_no", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Serial No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -198,7 +163,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -207,51 +171,18 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "source_warehouse", - "fieldtype": "Link", + "fieldname": "quantity", + "fieldtype": "Float", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, "in_list_view": 0, - "in_standard_filter": 1, - "label": "Source Warehouse", + "in_standard_filter": 0, + "label": "Quantity", "length": 0, "no_copy": 0, - "options": "Warehouse", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "target_warehouse", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Target Warehouse", - "length": 0, - "no_copy": 0, - "options": "Warehouse", "permlevel": 0, "precision": "", "print_hide": 0, @@ -259,10 +190,221 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "serial_no", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Serial No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "source_location", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Source Location", + "length": 0, + "no_copy": 0, + "options": "Location", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "target_location", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Target Location", + "length": 0, + "no_copy": 0, + "options": "Location", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_10", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "from_employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "From Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "To Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -293,7 +435,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -325,7 +466,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -357,7 +497,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -388,7 +527,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -402,7 +540,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-20 15:45:54.156501", + "modified": "2018-05-10 23:16:20.791672", "modified_by": "Administrator", "module": "Assets", "name": "Asset Movement", @@ -411,6 +549,7 @@ "permissions": [ { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -430,6 +569,7 @@ }, { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -449,6 +589,7 @@ }, { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.py b/erpnext/assets/doctype/asset_movement/asset_movement.py index 42ed249959..32fc663837 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.py +++ b/erpnext/assets/doctype/asset_movement/asset_movement.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ +from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos from frappe.model.document import Document class AssetMovement(Document): @@ -23,29 +24,41 @@ class AssetMovement(Document): if serial_no and not self.serial_no: self.serial_no = serial_no - def validate_warehouses(self): - if self.purpose == 'Transfer' and not self.source_warehouse: - self.source_warehouse = frappe.db.get_value("Asset", self.asset, "warehouse") + if self.serial_no and len(get_serial_nos(self.serial_no)) != self.quantity: + frappe.throw(_("Number of serial nos and quantity must be the same")) - if self.source_warehouse == self.target_warehouse: - frappe.throw(_("Source and Target Warehouse cannot be same")) + if not(self.source_location or self.target_location or self.from_employee or self.to_employee): + frappe.throw(_("Either location or employee must be required")) + + def validate_warehouses(self): + if self.purpose in ['Transfer', 'Issue']: + self.source_location = frappe.db.get_value("Asset", self.asset, "location") + + if self.source_location == self.target_location: + frappe.throw(_("Source and Target Location cannot be same")) def on_submit(self): - self.set_latest_warehouse_in_asset() + self.set_latest_location_in_asset() def on_cancel(self): - self.set_latest_warehouse_in_asset() - - def set_latest_warehouse_in_asset(self): - latest_movement_entry = frappe.db.sql("""select target_warehouse from `tabAsset Movement` + self.set_latest_location_in_asset() + + def set_latest_location_in_asset(self): + latest_movement_entry = frappe.db.sql("""select target_location from `tabAsset Movement` where asset=%s and docstatus=1 and company=%s order by transaction_date desc limit 1""", (self.asset, self.company)) if latest_movement_entry: - warehouse = latest_movement_entry[0][0] + location = latest_movement_entry[0][0] else: - warehouse = frappe.db.sql("""select source_warehouse from `tabAsset Movement` + location = frappe.db.sql("""select source_location from `tabAsset Movement` where asset=%s and docstatus=2 and company=%s order by transaction_date asc limit 1""", (self.asset, self.company))[0][0] - - frappe.db.set_value("Asset", self.asset, "warehouse", warehouse) \ No newline at end of file + + frappe.db.set_value("Asset", self.asset, "location", location) + + if self.serial_no: + serial_nos = get_serial_nos(self.serial_no) + + frappe.db.sql(""" update `tabSerial No` set location = %s where name in (%s)""" + %('%s', ','.join(['%s'] * len(serial_nos))), (location, tuple(serial_nos))) diff --git a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json index 17b4aecc04..35a2c9dd7f 100644 --- a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json +++ b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -13,6 +13,37 @@ "editable_grid": 1, "engine": "InnoDB", "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "finance_book", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Finance Book", + "length": 0, + "no_copy": 0, + "options": "Finance Book", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -197,36 +228,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "finance_book", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Finance Book", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -256,6 +257,37 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depreciation_method", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Depreciation Method", + "length": 0, + "no_copy": 1, + "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -268,7 +300,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-05-08 15:24:57.955533", + "modified": "2018-05-10 15:12:41.679436", "modified_by": "Administrator", "module": "Assets", "name": "Depreciation Schedule", diff --git a/erpnext/config/assets.py b/erpnext/config/assets.py index be522469e6..99a7a5c744 100644 --- a/erpnext/config/assets.py +++ b/erpnext/config/assets.py @@ -12,12 +12,11 @@ def get_data(): }, { "type": "doctype", - "name": "Asset Category", + "name": "Location", }, { "type": "doctype", - "label": _("Asset Location"), - "name": "Location", + "name": "Asset Category", }, { "type": "doctype", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 40028afb01..186aad3a5a 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -273,15 +273,16 @@ class AccountsController(TransactionBase): def get_gl_dict(self, args, account_currency=None): """this method populates the common properties of a gl entry record""" - fiscal_years = get_fiscal_years(self.posting_date, company=self.company) + posting_date = args.get('posting_date') or self.get('posting_date') + fiscal_years = get_fiscal_years(posting_date, company=self.company) if len(fiscal_years) > 1: - frappe.throw(_("Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year").format(formatdate(self.posting_date))) + frappe.throw(_("Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year").format(formatdate(posting_date))) else: fiscal_year = fiscal_years[0][0] gl_dict = frappe._dict({ 'company': self.company, - 'posting_date': self.posting_date, + 'posting_date': posting_date, 'fiscal_year': fiscal_year, 'voucher_type': self.doctype, 'voucher_no': self.name, diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index d4399ad518..f33ed25a06 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -11,7 +11,7 @@ from erpnext.stock.get_item_details import get_conversion_factor from erpnext.buying.utils import validate_for_items, update_last_purchase_rate from erpnext.stock.stock_ledger import get_valuation_rate from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items -from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos +from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos, get_serial_nos from erpnext.controllers.stock_controller import StockController @@ -505,6 +505,9 @@ class BuyingController(StockController): self.make_asset_movement(d) def make_asset(self, row): + if not row.asset_location: + frappe.throw(_("Row {0}: Enter location for the asset item {1}").format(row.idx, row.item_code)) + item_data = frappe.db.get_value('Item', row.item_code, ['asset_naming_series', 'asset_category'], as_dict=1) @@ -512,18 +515,21 @@ class BuyingController(StockController): 'doctype': 'Asset', 'item_code': row.item_code, 'asset_name': row.item_name, + 'status': 'Receipt', 'naming_series': item_data.get('asset_naming_series') or 'AST', 'asset_category': item_data.get('asset_category'), - 'warehouse': row.warehouse, + 'location': row.asset_location, 'company': self.company, 'purchase_date': self.posting_date, 'calculate_depreciation': 1, + 'gross_purchase_amount': flt(row.base_net_amount + row.item_tax_amount), 'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None, 'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None }) asset.flags.ignore_validate = True asset.flags.ignore_mandatory = True + asset.set_missing_values() asset.insert() frappe.msgprint(_("Asset {0} created").format(asset.name)) @@ -533,10 +539,10 @@ class BuyingController(StockController): asset_movement = frappe.get_doc({ 'doctype': 'Asset Movement', 'asset': row.asset, - 'source_warehouse': '', - 'target_warehouse': row.warehouse, + 'target_location': row.asset_location, 'purpose': 'Receipt', 'serial_no': row.serial_no, + 'quantity': len(get_serial_nos(row.serial_no)), 'company': self.company, 'transaction_date': self.posting_date, 'reference_doctype': self.doctype, @@ -559,7 +565,7 @@ class BuyingController(StockController): asset.set(field, self.name) asset.purchase_date = self.posting_date asset.supplier = self.supplier - else: + elif self.docstatus == 2: asset.set(field, None) asset.supplier = None diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 57e83e63be..627455b021 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -234,7 +234,8 @@ scheduler_events = { "erpnext.buying.doctype.supplier_scorecard.supplier_scorecard.refresh_scorecards", "erpnext.setup.doctype.company.company.cache_companies_monthly_sales_history", "erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms", - "erpnext.assets.doctype.asset.asset.update_maintenance_status" + "erpnext.assets.doctype.asset.asset.update_maintenance_status", + "erpnext.assets.doctype.asset.asset.make_post_gl_entry" ] } diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json index fa4fa694c1..f84cbef2c8 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.json +++ b/erpnext/stock/doctype/serial_no/serial_no.json @@ -41,7 +41,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -70,7 +69,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -102,7 +100,6 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -135,7 +132,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -169,39 +165,6 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "asset", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Asset", - "length": 0, - "no_copy": 1, - "options": "Asset", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -230,7 +193,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -260,7 +222,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -292,7 +253,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "300px" }, @@ -327,7 +287,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -360,7 +319,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -390,7 +348,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -419,7 +376,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "50%" }, @@ -451,7 +407,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -482,7 +437,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -514,7 +468,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -544,7 +497,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -577,7 +529,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -606,7 +557,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "50%" }, @@ -638,7 +588,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -668,7 +617,190 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "asset", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset", + "length": 0, + "no_copy": 1, + "options": "Asset", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "asset", + "fieldname": "asset_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Asset Status", + "length": 0, + "no_copy": 0, + "options": "\nIssue\nReceipt\nTransfer", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_24", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "location", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Location", + "length": 0, + "no_copy": 0, + "options": "Location", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -699,7 +831,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -730,7 +861,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -761,7 +891,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -793,7 +922,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -823,7 +951,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -856,7 +983,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -885,7 +1011,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "50%" }, @@ -919,7 +1044,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -951,7 +1075,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -982,7 +1105,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1014,7 +1136,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1044,7 +1165,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1073,7 +1193,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "50%" }, @@ -1107,7 +1226,6 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "150px" }, @@ -1140,7 +1258,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "150px" }, @@ -1170,7 +1287,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "50%" }, @@ -1203,7 +1319,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "150px" }, @@ -1236,7 +1351,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0, "width": "150px" }, @@ -1267,7 +1381,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1297,7 +1410,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -1328,7 +1440,6 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -1343,7 +1454,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-19 20:25:52.066995", + "modified": "2018-05-10 23:38:20.646770", "modified_by": "Administrator", "module": "Stock", "name": "Serial No", @@ -1351,6 +1462,7 @@ "permissions": [ { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -1370,6 +1482,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1389,6 +1502,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.js b/erpnext/stock/doctype/serial_no/test_serial_no.js new file mode 100644 index 0000000000..bf8293257c --- /dev/null +++ b/erpnext/stock/doctype/serial_no/test_serial_no.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Serial No", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Serial No + () => frappe.tests.make('Serial No', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); From 16bc853f6abe484a0e99ba259bc9859699f54f1c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 12 May 2018 12:06:00 +0530 Subject: [PATCH 142/154] Reschedule for future depreciations and booked difference amount in accumulated depreciation account --- .../doctype/journal_entry/journal_entry.py | 14 ++- erpnext/assets/doctype/asset/asset.js | 6 ++ erpnext/assets/doctype/asset/asset.json | 32 ++++++- erpnext/assets/doctype/asset/asset.py | 38 ++++---- erpnext/assets/doctype/asset/depreciation.py | 10 +- .../asset_adjustment/asset_adjustment.js | 24 ++++- .../asset_adjustment/asset_adjustment.json | 93 +++++++++--------- .../asset_adjustment/asset_adjustment.py | 95 ++++++++++++++++++- erpnext/config/assets.py | 4 + erpnext/controllers/buying_controller.py | 4 +- 10 files changed, 247 insertions(+), 73 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 51308e5008..9bbd137159 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe, erpnext, json -from frappe.utils import cstr, flt, fmt_money, formatdate, getdate, nowdate +from frappe.utils import cstr, flt, fmt_money, formatdate, getdate, nowdate, cint from frappe import msgprint, _, scrub from erpnext.controllers.accounts_controller import AccountsController from erpnext.accounts.utils import get_balance_on, get_account_currency @@ -92,6 +92,7 @@ class JournalEntry(AccountsController): self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv() + self.unlink_asset_adjustment_entry() def unlink_advance_entry_reference(self): for d in self.get("accounts"): @@ -109,9 +110,12 @@ class JournalEntry(AccountsController): for s in asset.get("schedules"): if s.journal_entry == self.name: s.db_set("journal_entry", None) - asset.value_after_depreciation += s.depreciation_amount - asset.db_set("value_after_depreciation", asset.value_after_depreciation) + idx = cint(s.finance_book_id) or 1 + finance_books = asset.get('finance_books')[idx - 1] + finance_books.value_after_depreciation += s.depreciation_amount + finance_books.db_update() + asset.set_status() def unlink_inter_company_jv(self): @@ -121,6 +125,10 @@ class JournalEntry(AccountsController): frappe.db.set_value("Journal Entry", self.name,\ "inter_company_journal_entry_reference", "") + def unlink_asset_adjustment_entry(self): + frappe.db.sql(""" update `tabAsset Adjustment` + set journal_entry = null where journal_entry = %s""", self.name) + def validate_party(self): for d in self.get("accounts"): account_type = frappe.db.get_value("Account", d.account, "account_type") diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 4daeae2880..c05667a767 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -80,6 +80,12 @@ frappe.ui.form.on('Asset', { frm.trigger("create_asset_maintenance"); }, __("Make")); } + if (frm.doc.status != 'Fully Depreciated') { + frm.add_custom_button(__("Asset Adjustment"), function() { + frm.trigger("create_asset_maintenance"); + }, __("Make")); + } + frm.page.set_inner_btn_group_as_primary(__("Make")); frm.trigger("setup_chart"); } diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 9a05cad65c..49a010d7d5 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -1600,6 +1600,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "purchase_receipt_amount", + "fieldtype": "Currency", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Purchase Receipt Amount", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1673,7 +1703,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-11 01:48:18.711485", + "modified": "2018-05-11 10:41:45.972686", "modified_by": "Administrator", "module": "Assets", "name": "Asset", diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index bf70fbc17d..748849ecb2 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -63,9 +63,6 @@ class Asset(AccountsController): if not self.calculate_depreciation: return - self.value_after_depreciation = (flt(self.gross_purchase_amount) - - flt(self.opening_accumulated_depreciation)) - if self.available_for_use_date and getdate(self.available_for_use_date) < getdate(nowdate()): frappe.throw(_("Available-for-use Date is entered as past date")) @@ -79,7 +76,9 @@ class Asset(AccountsController): for d in self.get('finance_books'): self.validate_asset_finance_books(d) - value_after_depreciation = flt(self.value_after_depreciation) + value_after_depreciation = (flt(self.gross_purchase_amount) - + flt(self.opening_accumulated_depreciation)) + d.value_after_depreciation = value_after_depreciation no_of_depreciations = cint(d.total_number_of_depreciations - 1) - cint(self.number_of_depreciations_booked) @@ -139,7 +138,8 @@ class Asset(AccountsController): depreciation_amount = days * rate_per_day from_date = schedule_date else: - depreciation_amount = self.get_depreciation_amount(value_after_depreciation,d) + depreciation_amount = self.get_depreciation_amount(value_after_depreciation, + d.total_number_of_depreciations, d) if depreciation_amount: value_after_depreciation -= flt(depreciation_amount) @@ -187,21 +187,24 @@ class Asset(AccountsController): frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Available-for-use Date") .format(row.idx)) - def set_accumulated_depreciation(self): - value_after_depreciation = flt(self.value_after_depreciation) + def set_accumulated_depreciation(self, ignore_booked_entry = False): straight_line_idx = [d.idx for d in self.get("schedules") if d.depreciation_method == 'Straight Line'] finance_books = [] for i, d in enumerate(self.get("schedules")): + if ignore_booked_entry and d.journal_entry: + continue + if d.finance_book_id not in finance_books: accumulated_depreciation = flt(self.opening_accumulated_depreciation) + value_after_depreciation = flt(self.get_value_after_depreciation(d.finance_book_id)) finance_books.append(d.finance_book_id) depreciation_amount = flt(d.depreciation_amount, d.precision("depreciation_amount")) value_after_depreciation -= flt(depreciation_amount) if straight_line_idx and i == max(straight_line_idx) - 1: - book = self.get('finance_books')[d.finance_book_id - 1] + book = self.get('finance_books')[cint(d.finance_book_id) - 1] depreciation_amount += flt(value_after_depreciation - flt(book.expected_value_after_useful_life), d.precision("depreciation_amount")) @@ -210,10 +213,13 @@ class Asset(AccountsController): d.accumulated_depreciation_amount = flt(accumulated_depreciation, d.precision("accumulated_depreciation_amount")) - def get_depreciation_amount(self, depreciable_value, row): + def get_value_after_depreciation(self, idx): + return flt(self.get('finance_books')[cint(idx)-1].value_after_depreciation) + + def get_depreciation_amount(self, depreciable_value, total_number_of_depreciations, row): percentage_value = 100.0 if row.depreciation_method == 'Written Down Value' else 200.0 - factor = percentage_value / row.total_number_of_depreciations + factor = percentage_value / total_number_of_depreciations depreciation_amount = flt(depreciable_value * factor / 100, 0) value_after_depreciation = flt(depreciable_value) - depreciation_amount @@ -229,7 +235,7 @@ class Asset(AccountsController): prorata_temporis = 1 if row.depreciation_method in ("Straight Line", "Manual"): - depreciation_amount = (flt(self.value_after_depreciation) - + depreciation_amount = (flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)) / (cint(row.total_number_of_depreciations) - cint(self.number_of_depreciations_booked)) * prorata_temporis else: @@ -306,7 +312,7 @@ class Asset(AccountsController): doc.submit() def make_gl_entries(self): - if self.purchase_receipt: + if self.purchase_receipt and self.purchase_receipt_amount: from erpnext.accounts.general_ledger import make_gl_entries gl_entries = [] @@ -320,8 +326,8 @@ class Asset(AccountsController): "against": fixed_aseet_account, "remarks": self.get("remarks") or _("Accounting Entry for Asset"), "posting_date": self.available_for_use_date, - "credit": self.gross_purchase_amount, - "credit_in_account_currency": self.gross_purchase_amount + "credit": self.purchase_receipt_amount, + "credit_in_account_currency": self.purchase_receipt_amount })) gl_entries.append(self.get_gl_dict({ @@ -329,8 +335,8 @@ class Asset(AccountsController): "against": cwip_account, "remarks": self.get("remarks") or _("Accounting Entry for Asset"), "posting_date": self.available_for_use_date, - "debit": self.gross_purchase_amount, - "debit_in_account_currency": self.gross_purchase_amount + "debit": self.purchase_receipt_amount, + "debit_in_account_currency": self.purchase_receipt_amount })) make_gl_entries(gl_entries) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 92a251e4fa..aacaef5414 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import flt, today, getdate +from frappe.utils import flt, today, getdate, cint def post_depreciation_entries(date=None): # Return if automatic booking of asset depreciation is disabled @@ -47,6 +47,7 @@ def make_depreciation_entry(asset_name, date=None): je.naming_series = depreciation_series je.posting_date = d.schedule_date je.company = asset.company + je.finance_book = d.finance_book je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, d.depreciation_amount) je.append("accounts", { @@ -68,9 +69,12 @@ def make_depreciation_entry(asset_name, date=None): je.submit() d.db_set("journal_entry", je.name) - asset.value_after_depreciation -= d.depreciation_amount + + idx = cint(d.finance_book_id) + finance_books = asset.get('finance_books')[idx - 1] + finance_books.value_after_depreciation -= d.depreciation_amount + finance_books.db_update() - asset.db_set("value_after_depreciation", asset.value_after_depreciation) asset.set_status() return asset diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js index 0535743703..11c02e105f 100644 --- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js @@ -2,7 +2,29 @@ // For license information, please see license.txt frappe.ui.form.on('Asset Adjustment', { - refresh: function(frm) { + asset: function(frm) { + frm.trigger("set_current_asset_value"); + }, + finance_book: function(frm) { + frm.trigger("set_current_asset_value"); + }, + + set_current_asset_value: function(frm) { + debugger + if (frm.doc.finance_book && frm.doc.asset) { + frm.call({ + method: "erpnext.assets.doctype.asset_adjustment.asset_adjustment.get_current_asset_value", + args: { + asset: frm.doc.asset, + finance_book: frm.doc.finance_book + }, + callback: function(r) { + if (r.message) { + frm.set_value('current_asset_value', r.message); + } + } + }); + } } }); diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json index 8a0e95775a..faa36efe07 100644 --- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json @@ -12,6 +12,37 @@ "editable_grid": 1, "engine": "InnoDB", "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -38,7 +69,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -100,37 +131,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "current_asset_value", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Current Asset Value", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -231,27 +232,26 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "company", - "fieldtype": "Link", + "fieldname": "current_asset_value", + "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, - "label": "Company", + "label": "Current Asset Value", "length": 0, "no_copy": 0, - "options": "Company", "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -281,7 +281,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -292,8 +292,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "accumulated_depreciation_account", - "fieldtype": "Link", + "fieldname": "difference_amount", + "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -301,15 +301,14 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Accumulated Depreciation Account", + "label": "Difference Amount", "length": 0, - "no_copy": 0, - "options": "Account", + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -358,7 +357,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-11 00:25:07.222408", + "modified": "2018-05-11 21:45:03.459696", "modified_by": "Administrator", "module": "Assets", "name": "Asset Adjustment", diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py index 437f9bd902..6b4b752e7f 100644 --- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py +++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py @@ -4,7 +4,100 @@ from __future__ import unicode_literals import frappe +from frappe import _ +from frappe.utils import flt, getdate, cint, date_diff +from erpnext.assets.doctype.asset.depreciation import get_depreciation_accounts from frappe.model.document import Document class AssetAdjustment(Document): - pass + def validate(self): + self.set_difference_amount() + self.set_current_asset_value() + + def on_submit(self): + self.make_depreciation_entry() + self.reschedule_depreciations() + + def on_cancel(self): + if self.journal_entry: + frappe.throw(_("Cancel the journal entry {0} first").format(self.journal_entry)) + + def set_difference_amount(self): + self.difference_amount = flt(self.current_asset_value - self.new_asset_value) + + def set_current_asset_value(self): + if not self.current_asset_value and self.asset and self.finance_book: + self.current_asset_value = get_current_asset_value(self.asset, self.finance_book) + + def make_depreciation_entry(self): + asset = frappe.get_doc("Asset", self.asset) + fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \ + get_depreciation_accounts(asset) + + depreciation_cost_center, depreciation_series = frappe.db.get_value("Company", asset.company, + ["depreciation_cost_center", "series_for_depreciation_entry"]) + + je = frappe.new_doc("Journal Entry") + je.voucher_type = "Depreciation Entry" + je.naming_series = depreciation_series + je.posting_date = self.date + je.company = self.company + je.remark = "Depreciation Entry against {0} worth {1}".format(self.asset, self.difference_amount) + + je.append("accounts", { + "account": accumulated_depreciation_account, + "credit_in_account_currency": self.difference_amount, + }) + + je.append("accounts", { + "account": depreciation_expense_account, + "debit_in_account_currency": self.difference_amount, + "cost_center": depreciation_cost_center + }) + + je.flags.ignore_permissions = True + je.submit() + + self.db_set("journal_entry", je.name) + + def reschedule_depreciations(self): + asset = frappe.get_doc('Asset', self.asset) + + for d in asset.finance_books: + d.value_after_depreciation = self.new_asset_value + + if d.depreciation_method in ("Straight Line", "Manual"): + end_date = max([s.schedule_date for s in asset.schedules if cint(s.finance_book_id) == d.idx]) + total_days = date_diff(end_date, self.date) + rate_per_day = flt(d.value_after_depreciation) / flt(total_days) + from_date = self.date + else: + no_of_depreciations = len([e.name for e in asset.schedules + if (cint(s.finance_book_id) == d.idx and not e.journal_entry)]) + + value_after_depreciation = d.value_after_depreciation + for data in asset.schedules: + if cint(data.finance_book_id) == d.idx and not data.journal_entry: + if d.depreciation_method in ("Straight Line", "Manual"): + days = date_diff(data.schedule_date, from_date) + depreciation_amount = days * rate_per_day + from_date = data.schedule_date + else: + depreciation_amount = asset.get_depreciation_amount(value_after_depreciation, + no_of_depreciations, d) + + if depreciation_amount: + value_after_depreciation -= flt(depreciation_amount) + data.depreciation_amount = depreciation_amount + + d.db_update() + + asset.set_accumulated_depreciation(ignore_booked_entry=True) + for asset_data in asset.schedules: + if not asset_data.journal_entry: + asset_data.db_update() + +@frappe.whitelist() +def get_current_asset_value(asset, finance_book): + return frappe.db.get_value('Asset Finance Book', + {'parent': asset, 'parenttype': 'Asset', 'finance_book': finance_book}, 'value_after_depreciation', debug=1) diff --git a/erpnext/config/assets.py b/erpnext/config/assets.py index 99a7a5c744..d52f1420cd 100644 --- a/erpnext/config/assets.py +++ b/erpnext/config/assets.py @@ -43,6 +43,10 @@ def get_data(): "type": "doctype", "name": "Asset Maintenance Log", }, + { + "type": "doctype", + "name": "Asset Adjustment", + }, { "type": "doctype", "name": "Asset Repair", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index f33ed25a06..c4e9fdd61e 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -511,6 +511,7 @@ class BuyingController(StockController): item_data = frappe.db.get_value('Item', row.item_code, ['asset_naming_series', 'asset_category'], as_dict=1) + purchase_amount = flt(row.base_net_amount + row.item_tax_amount) asset = frappe.get_doc({ 'doctype': 'Asset', 'item_code': row.item_code, @@ -522,7 +523,8 @@ class BuyingController(StockController): 'company': self.company, 'purchase_date': self.posting_date, 'calculate_depreciation': 1, - 'gross_purchase_amount': flt(row.base_net_amount + row.item_tax_amount), + 'purchase_receipt_amount': purchase_amount, + 'gross_purchase_amount': purchase_amount, 'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None, 'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None }) From 352df959765e8bff3edfdf4f178870fd100cddc7 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 12 May 2018 12:29:04 +0530 Subject: [PATCH 143/154] Patch to make location --- erpnext/patches.txt | 1 + .../v11_0/make_location_from_warehouse.py | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 erpnext/patches/v11_0/make_location_from_warehouse.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 4bbb3e9e70..2828d7788b 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -528,3 +528,4 @@ erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance erpnext.patches.v11_0.rebuild_tree_for_company erpnext.patches.v11_0.create_department_records_for_each_company +erpnext.patches.v11_0.make_location_from_warehouse \ No newline at end of file diff --git a/erpnext/patches/v11_0/make_location_from_warehouse.py b/erpnext/patches/v11_0/make_location_from_warehouse.py new file mode 100644 index 0000000000..a3c66635b2 --- /dev/null +++ b/erpnext/patches/v11_0/make_location_from_warehouse.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc('assets', 'doctype', 'location') + frappe.reload_doc('stock', 'doctype', 'warehouse') + + for d in frappe.get_all('Warehouse', + fields = ['warehouse_name', 'is_group', 'parent_warehouse'], order_by="is_group desc"): + try: + loc = frappe.new_doc('Location') + loc.location_name = d.warehouse_name + loc.is_group = d.is_group + loc.flags.ignore_mandatory = True + if d.parent_warehouse: + loc.parent_location = get_parent_warehouse_name(d.parent_warehouse) + + loc.save(ignore_permissions=True) + except frappe.DuplicateEntryError: + continue + +def get_parent_warehouse_name(warehouse): + return frappe.db.get_value('Warehouse', warehouse, 'warehouse_name') + \ No newline at end of file From 11679884e4b7f629bbb39760c2d9ca67792c8dcc Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 12 May 2018 15:05:09 +0530 Subject: [PATCH 144/154] Patch to move asset fields to Asset Finance Book table --- .../asset_category/asset_category.json | 94 +------------------ .../doctype/asset_category/asset_category.py | 7 +- .../asset_finance_book.json | 9 +- ..._asset_finance_book_against_old_entries.py | 46 +++++++++ .../v11_0/make_location_from_warehouse.py | 3 + 5 files changed, 59 insertions(+), 100 deletions(-) create mode 100644 erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py diff --git a/erpnext/assets/doctype/asset_category/asset_category.json b/erpnext/assets/doctype/asset_category/asset_category.json index b655b40475..882cbe2eaa 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.json +++ b/erpnext/assets/doctype/asset_category/asset_category.json @@ -43,38 +43,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Straight Line", - "fieldname": "depreciation_method", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Depreciation Method", - "length": 0, - "no_copy": 0, - "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -104,66 +72,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "total_number_of_depreciations", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Total Number of Depreciations", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "frequency_of_depreciation", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Frequency of Depreciation (Months)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -297,7 +205,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-10 15:12:05.954200", + "modified": "2018-05-12 14:56:04.116425", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category", diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index fa0bd83117..bbdc6ec2cf 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -10,9 +10,10 @@ from frappe.model.document import Document class AssetCategory(Document): def validate(self): - for field in ("total_number_of_depreciations", "frequency_of_depreciation"): - if cint(self.get(field))<1: - frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) + for d in self.finance_books: + for field in ("Total Number of Depreciations", "Frequency of Depreciation"): + if cint(d.get(frappe.scrub(field)))<1: + frappe.throw(_("Row {0}: {1} must be greater than 0").format(d.idx, field), frappe.MandatoryError) @frappe.whitelist() def get_asset_category_account(asset, fieldname, account=None, asset_category = None, company = None): diff --git a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json index 351f9d0c66..f75c8510dc 100644 --- a/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json +++ b/erpnext/assets/doctype/asset_finance_book/asset_finance_book.json @@ -70,7 +70,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -100,7 +100,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -160,7 +160,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -203,6 +203,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "depends_on": "eval:parent.doctype == 'Asset'", "fieldname": "expected_value_after_useful_life", "fieldtype": "Currency", "hidden": 0, @@ -270,7 +271,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-05-10 18:05:58.900298", + "modified": "2018-05-12 14:56:44.800046", "modified_by": "Administrator", "module": "Assets", "name": "Asset Finance Book", diff --git a/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py new file mode 100644 index 0000000000..75f0ce6450 --- /dev/null +++ b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py @@ -0,0 +1,46 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils.nestedset import rebuild_tree + +def execute(): + frappe.reload_doc('stock', 'doctype', 'asset_finance_book') + frappe.reload_doc('stock', 'doctype', 'depreciation_schedule') + frappe.reload_doc('assets', 'doctype', 'asset_category') + frappe.reload_doc('assets', 'doctype', 'asset') + frappe.reload_doc('assets', 'doctype', 'asset_movement') + + frappe.db.sql(""" update `tabAsset` ast, `tabWarehouse` wh + set ast.location = wh.warehoue_name where ast.warehoue = wh.name""") + + frappe.db.sql(""" update `tabAsset Movement` ast_mv + set ast_mv.source_location = (select warehoue_name from `tabWarehouse` where name = ast_mv.source_warehouse), + ast_mv.target_location = (select warehoue_name from `tabWarehouse` where name = ast_mv.target_warehouse)""") + + for d in frappe.get_all('Asset'): + doc = frappe.get_doc('Asset', d.name) + fb = doc.append('finance_books', { + 'depreciation_method': doc.depreciation_method, + 'total_number_of_depreciations': doc.total_number_of_depreciations, + 'frequency_of_depreciation': doc.frequency_of_depreciation, + 'depreciation_start_date': doc.next_depreciation_date, + 'expected_value_after_useful_life': doc.expected_value_after_useful_life, + 'value_after_depreciation': doc.value_after_depreciation + }) + + fb.db_update() + + frappe.db.sql(""" update `tabDepreciation Schedule` ds, `tabAsset` ast + set ds.depreciation_method = ast.depreciation_method, ds.finance_book_id = 1 where ds.parent = ast.name """) + + for catergory in frappe.get_all('Asset Category'): + asset_category_doc = frappe.get_doc("Asset Category", catergory) + row = asset_category_doc.append('finance_books', { + 'depreciation_method': asset_category_doc.depreciation_method, + 'total_number_of_depreciations': asset_category_doc.total_number_of_depreciations, + 'frequency_of_depreciation': asset_category_doc.frequency_of_depreciation + }) + + row.db_update() \ No newline at end of file diff --git a/erpnext/patches/v11_0/make_location_from_warehouse.py b/erpnext/patches/v11_0/make_location_from_warehouse.py index a3c66635b2..b838ec98bc 100644 --- a/erpnext/patches/v11_0/make_location_from_warehouse.py +++ b/erpnext/patches/v11_0/make_location_from_warehouse.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import frappe +from frappe.utils.nestedset import rebuild_tree def execute(): frappe.reload_doc('assets', 'doctype', 'location') @@ -22,6 +23,8 @@ def execute(): except frappe.DuplicateEntryError: continue + rebuild_tree("Location", "parent_location") + def get_parent_warehouse_name(warehouse): return frappe.db.get_value('Warehouse', warehouse, 'warehouse_name') \ No newline at end of file From d644e6da16979bcd56c05b6fbcaffef0a7d89119 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 12 May 2018 15:27:18 +0530 Subject: [PATCH 145/154] Code cleanup --- erpnext/assets/doctype/asset/asset.py | 6 ++-- erpnext/controllers/buying_controller.py | 3 ++ erpnext/patches.txt | 3 +- ..._asset_finance_book_against_old_entries.py | 29 ++++++++++--------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 748849ecb2..55a29bc0df 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -105,18 +105,18 @@ class Asset(AccountsController): previous_scheduled_date = add_months(d.depreciation_start_date, (n-1) * 12) depreciation_amount = \ self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - row, previous_scheduled_date, schedule_date) + d, previous_scheduled_date, schedule_date) elif n == range(number_of_pending_depreciations)[0]: schedule_date = d.depreciation_start_date depreciation_amount = \ self.get_depreciation_amount_prorata_temporis(value_after_depreciation, - row, self.available_for_use_date, schedule_date) + d, self.available_for_use_date, schedule_date) else: schedule_date = add_months(d.depreciation_start_date, n * 12) depreciation_amount = \ - self.get_depreciation_amount_prorata_temporis(value_after_depreciation, row) + self.get_depreciation_amount_prorata_temporis(value_after_depreciation, d) if value_after_depreciation != 0: value_after_depreciation -= flt(depreciation_amount) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index c4e9fdd61e..85fb3f0a66 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -89,6 +89,9 @@ class BuyingController(StockController): msgprint(_('Tax Category has been changed to "Total" because all the Items are non-stock items')) def get_asset_items(self): + if self.doctype not in ['Purchase Invoice', 'Purchase Receipt']: + return [] + return [d.item_code for d in self.items if d.is_fixed_asset] def set_landed_cost_voucher_amount(self): diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 2828d7788b..69b11d65d3 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -528,4 +528,5 @@ erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance erpnext.patches.v11_0.rebuild_tree_for_company erpnext.patches.v11_0.create_department_records_for_each_company -erpnext.patches.v11_0.make_location_from_warehouse \ No newline at end of file +erpnext.patches.v11_0.make_location_from_warehouse +erpnext.patches.v11_0.make_asset_finance_book_against_old_entries \ No newline at end of file diff --git a/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py index 75f0ce6450..18622f2301 100644 --- a/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py +++ b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py @@ -6,31 +6,32 @@ import frappe from frappe.utils.nestedset import rebuild_tree def execute(): - frappe.reload_doc('stock', 'doctype', 'asset_finance_book') - frappe.reload_doc('stock', 'doctype', 'depreciation_schedule') + frappe.reload_doc('assets', 'doctype', 'asset_finance_book') + frappe.reload_doc('assets', 'doctype', 'depreciation_schedule') frappe.reload_doc('assets', 'doctype', 'asset_category') frappe.reload_doc('assets', 'doctype', 'asset') frappe.reload_doc('assets', 'doctype', 'asset_movement') frappe.db.sql(""" update `tabAsset` ast, `tabWarehouse` wh - set ast.location = wh.warehoue_name where ast.warehoue = wh.name""") + set ast.location = wh.warehouse_name where ast.warehouse = wh.name""") frappe.db.sql(""" update `tabAsset Movement` ast_mv - set ast_mv.source_location = (select warehoue_name from `tabWarehouse` where name = ast_mv.source_warehouse), - ast_mv.target_location = (select warehoue_name from `tabWarehouse` where name = ast_mv.target_warehouse)""") + set ast_mv.source_location = (select warehouse_name from `tabWarehouse` where name = ast_mv.source_warehouse), + ast_mv.target_location = (select warehouse_name from `tabWarehouse` where name = ast_mv.target_warehouse)""") for d in frappe.get_all('Asset'): doc = frappe.get_doc('Asset', d.name) - fb = doc.append('finance_books', { - 'depreciation_method': doc.depreciation_method, - 'total_number_of_depreciations': doc.total_number_of_depreciations, - 'frequency_of_depreciation': doc.frequency_of_depreciation, - 'depreciation_start_date': doc.next_depreciation_date, - 'expected_value_after_useful_life': doc.expected_value_after_useful_life, - 'value_after_depreciation': doc.value_after_depreciation - }) + if doc.calculate_depreciation: + fb = doc.append('finance_books', { + 'depreciation_method': doc.depreciation_method, + 'total_number_of_depreciations': doc.total_number_of_depreciations, + 'frequency_of_depreciation': doc.frequency_of_depreciation, + 'depreciation_start_date': doc.next_depreciation_date, + 'expected_value_after_useful_life': doc.expected_value_after_useful_life, + 'value_after_depreciation': doc.value_after_depreciation + }) - fb.db_update() + fb.db_update() frappe.db.sql(""" update `tabDepreciation Schedule` ds, `tabAsset` ast set ds.depreciation_method = ast.depreciation_method, ds.finance_book_id = 1 where ds.parent = ast.name """) From 75c53e5022ec9b513b4dadabe174560ea3614984 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 14 May 2018 19:17:16 +0530 Subject: [PATCH 146/154] Fix - missing semicolon --- .../additional_salary_component.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js index 36bfdf2a08..13ed239b36 100644 --- a/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js +++ b/erpnext/hr/doctype/additional_salary_component/additional_salary_component.js @@ -8,14 +8,14 @@ frappe.ui.form.on('Additional Salary Component', { filters: { type: "earning" } - } + }; }); frm.set_query("employee", function() { return { filters: { company: frm.doc.company } - } + }; }); } }); From 4bd5583e11608344ec31453ff6e7167eb43c2336 Mon Sep 17 00:00:00 2001 From: Shreya Date: Mon, 14 May 2018 16:14:41 +0530 Subject: [PATCH 147/154] Make Available Leave HTML Table --- .../leave_application/leave_application.js | 30 ++++++++++++++++++- .../leave_application/leave_application.py | 26 ++++++++++++++-- .../leave_application_dashboard.html | 30 +++++++++++++++++++ 3 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 erpnext/hr/doctype/leave_application/leave_application_dashboard.html diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js index 242c987e58..76b5ae54fa 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.js +++ b/erpnext/hr/doctype/leave_application/leave_application.js @@ -18,7 +18,7 @@ frappe.ui.form.on("Leave Application", { doctype: frm.doc.doctype } }; - }); + }); frm.set_query("employee", erpnext.queries.employee); }, @@ -27,6 +27,33 @@ frappe.ui.form.on("Leave Application", { frm.toggle_reqd("half_day_date", frm.doc.half_day == 1); }, + make_dashboard: function(frm) { + var leave_details; + if (frm.doc.employee) { + frappe.call({ + method: "erpnext.hr.doctype.leave_application.leave_application.get_leave_details", + async: false, + args: { + employee: frm.doc.employee, + date: frm.doc.posting_date + }, + callback: function(r) { + if (!r.exc && r.message) { + leave_details = r.message; + } + } + }); + + $("div").remove(".form-dashboard-section"); + let section = frm.dashboard.add_section( + frappe.render_template('leave_application_dashboard', { + data: leave_details + }) + ); + frm.dashboard.show(); + } + }, + refresh: function(frm) { if (frm.is_new()) { frm.trigger("calculate_total_days"); @@ -43,6 +70,7 @@ frappe.ui.form.on("Leave Application", { }, employee: function(frm) { + frm.trigger("make_dashboard"); frm.trigger("get_leave_balance"); }, diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index 23514e16e2..304afdd7ed 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -19,6 +19,7 @@ class NotAnOptionalHoliday(frappe.ValidationError): pass from frappe.model.document import Document class LeaveApplication(Document): + def get_feed(self): return _("{0}: From {0} of type {1}").format(self.employee_name, self.leave_type) @@ -306,6 +307,24 @@ def get_number_of_leave_days(employee, leave_type, from_date, to_date, half_day number_of_days = flt(number_of_days) - flt(get_holidays(employee, from_date, to_date)) return number_of_days +@frappe.whitelist() +def get_leave_details(employee, date): + allocation_records = get_leave_allocation_records(date, employee).get(employee, frappe._dict()) + leave_allocation = {} + for d in allocation_records: + allocation = allocation_records.get(d, frappe._dict()) + date = allocation.to_date + leaves_taken = get_leaves_for_period(employee, d, allocation.from_date, date, status="Approved") + leaves_pending = get_leaves_for_period(employee, d, allocation.from_date, date, status="Open") + remaining_leaves = allocation.total_leaves_allocated - leaves_taken - leaves_pending + leave_allocation[d] = { + "total_leaves": allocation.total_leaves_allocated, + "leaves_taken": leaves_taken, + "pending_leaves": leaves_pending, + "remaining_leaves": remaining_leaves} + + return leave_allocation + @frappe.whitelist() def get_leave_balance_on(employee, leave_type, date, allocation_records=None, consider_all_leaves_in_the_allocation_period=False): @@ -316,16 +335,16 @@ def get_leave_balance_on(employee, leave_type, date, allocation_records=None, if consider_all_leaves_in_the_allocation_period: date = allocation.to_date - leaves_taken = get_approved_leaves_for_period(employee, leave_type, allocation.from_date, date) + leaves_taken = get_leaves_for_period(employee, leave_type, allocation.from_date, date, status=Approved) return flt(allocation.total_leaves_allocated) - flt(leaves_taken) -def get_approved_leaves_for_period(employee, leave_type, from_date, to_date): +def get_leaves_for_period(employee, leave_type, from_date, to_date, status): leave_applications = frappe.db.sql(""" select employee, leave_type, from_date, to_date, total_leave_days from `tabLeave Application` where employee=%(employee)s and leave_type=%(leave_type)s - and docstatus=1 + and status = %(status)s and docstatus=1 and (from_date between %(from_date)s and %(to_date)s or to_date between %(from_date)s and %(to_date)s or (from_date < %(from_date)s and to_date > %(to_date)s)) @@ -333,6 +352,7 @@ def get_approved_leaves_for_period(employee, leave_type, from_date, to_date): "from_date": from_date, "to_date": to_date, "employee": employee, + "status": status, "leave_type": leave_type }, as_dict=1) diff --git a/erpnext/hr/doctype/leave_application/leave_application_dashboard.html b/erpnext/hr/doctype/leave_application/leave_application_dashboard.html new file mode 100644 index 0000000000..95e74a671a --- /dev/null +++ b/erpnext/hr/doctype/leave_application/leave_application_dashboard.html @@ -0,0 +1,30 @@ + +{% if data %} +
{{ __("Allocated Leaves") }}
+ + + + + + + + + + + + + + {% for(const [key, value] of Object.entries(data)) { %} + + + + + + + + {% } %} + +
{{ __("Leave Type") }}{{ __("Total Allocated Leaves") }}{{ __("Used Leaves") }}{{ __("Pending Leaves") }}{{ __("Available Leaves") }}
{%= key %} {%= value["total_leaves"] %} {%= value["leaves_taken"] %} {%= value["pending_leaves"] %} {%= value["remaining_leaves"] %}
+{% } else { %} +

No Leaves have been allocated.

+{% } %} \ No newline at end of file From b698846c300c9f42ea6951d41cbd54f4c19d31cd Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 10 May 2018 18:07:20 +0530 Subject: [PATCH 148/154] [feature] added the employee onboarding and separation doctype --- erpnext/hr/doctype/employee/employee.json | 66 +- erpnext/hr/doctype/employee/employee.py | 10 + .../employee_boarding_activity/__init__.py | 0 .../employee_boarding_activity.json | 291 +++++++++ .../employee_boarding_activity.py | 10 + .../doctype/employee_onboarding/__init__.py | 0 .../employee_onboarding.js | 59 ++ .../employee_onboarding.json | 569 ++++++++++++++++++ .../employee_onboarding.py | 50 ++ .../test_employee_onboarding.js | 23 + .../test_employee_onboarding.py | 10 + .../employee_onboarding_activity/__init__.py | 0 .../employee_onboarding_activity.json | 290 +++++++++ .../employee_onboarding_activity.py | 10 + .../employee_onboarding_template/__init__.py | 0 .../employee_onboarding_template.js | 8 + .../employee_onboarding_template.json | 284 +++++++++ .../employee_onboarding_template.py | 10 + .../test_employee_onboarding_template.js | 23 + .../test_employee_onboarding_template.py | 10 + .../doctype/employee_separation/__init__.py | 0 .../employee_separation.js | 49 ++ .../employee_separation.json | 567 +++++++++++++++++ .../employee_separation.py | 16 + .../test_employee_separation.js | 23 + .../test_employee_separation.py | 10 + .../employee_separation_template/__init__.py | 0 .../employee_separation_template.js | 8 + .../employee_separation_template.json | 284 +++++++++ .../employee_separation_template.py | 10 + .../test_employee_separation_template.js | 23 + .../test_employee_separation_template.py | 10 + erpnext/hr/utils.py | 100 ++- erpnext/projects/doctype/project/project.json | 97 +-- erpnext/projects/doctype/task/task.json | 73 ++- 35 files changed, 2913 insertions(+), 80 deletions(-) create mode 100644 erpnext/hr/doctype/employee_boarding_activity/__init__.py create mode 100644 erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.json create mode 100644 erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.py create mode 100644 erpnext/hr/doctype/employee_onboarding/__init__.py create mode 100644 erpnext/hr/doctype/employee_onboarding/employee_onboarding.js create mode 100644 erpnext/hr/doctype/employee_onboarding/employee_onboarding.json create mode 100644 erpnext/hr/doctype/employee_onboarding/employee_onboarding.py create mode 100644 erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.js create mode 100644 erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py create mode 100644 erpnext/hr/doctype/employee_onboarding_activity/__init__.py create mode 100644 erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.json create mode 100644 erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.py create mode 100644 erpnext/hr/doctype/employee_onboarding_template/__init__.py create mode 100644 erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.js create mode 100644 erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.json create mode 100644 erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.py create mode 100644 erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.js create mode 100644 erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py create mode 100644 erpnext/hr/doctype/employee_separation/__init__.py create mode 100644 erpnext/hr/doctype/employee_separation/employee_separation.js create mode 100644 erpnext/hr/doctype/employee_separation/employee_separation.json create mode 100644 erpnext/hr/doctype/employee_separation/employee_separation.py create mode 100644 erpnext/hr/doctype/employee_separation/test_employee_separation.js create mode 100644 erpnext/hr/doctype/employee_separation/test_employee_separation.py create mode 100644 erpnext/hr/doctype/employee_separation_template/__init__.py create mode 100644 erpnext/hr/doctype/employee_separation_template/employee_separation_template.js create mode 100644 erpnext/hr/doctype/employee_separation_template/employee_separation_template.json create mode 100644 erpnext/hr/doctype/employee_separation_template/employee_separation_template.py create mode 100644 erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.js create mode 100644 erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.py diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index ef2c75dc83..3527197edc 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -393,6 +393,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "job_applicant", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Job Applicant", + "length": 0, + "no_copy": 0, + "options": "Job Applicant", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1262,38 +1294,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "leave_policy", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Leave Policy", - "length": 0, - "no_copy": 0, - "options": "Leave Policy", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2766,7 +2766,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-25 09:08:06.852604", + "modified": "2018-05-10 07:52:24.326361", "modified_by": "Administrator", "module": "HR", "name": "Employee", diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py index 4cf28a16ec..824ddf5aa7 100755 --- a/erpnext/hr/doctype/employee/employee.py +++ b/erpnext/hr/doctype/employee/employee.py @@ -42,6 +42,8 @@ class Employee(NestedSet): self.validate_status() self.validate_reports_to() self.validate_preferred_email() + if self.job_applicant: + self.validate_onboarding_process() if self.user_id: self.validate_for_enabled_user_id() @@ -164,6 +166,14 @@ class Employee(NestedSet): if self.prefered_contact_email and not self.get(scrub(self.prefered_contact_email)): frappe.msgprint(_("Please enter " + self.prefered_contact_email)) + def validate_onboarding_process(self): + employee_onboarding = frappe.get_all("Employee Onboarding", + filters={"job_applicant": self.job_applicant, "docstatus": 1, "status": ("!=", "Completed")}) + if employee_onboarding: + doc = frappe.get_doc("Employee Onboarding", employee_onboarding[0].name) + doc.validate_employee_creation() + doc.db_set("employee", self.name) + def get_timeline_data(doctype, name): '''Return timeline for attendance''' return dict(frappe.db.sql('''select unix_timestamp(attendance_date), count(*) diff --git a/erpnext/hr/doctype/employee_boarding_activity/__init__.py b/erpnext/hr/doctype/employee_boarding_activity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.json b/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.json new file mode 100644 index 0000000000..95d693994e --- /dev/null +++ b/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.json @@ -0,0 +1,291 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-05-09 05:37:18.439763", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activity_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Activity Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "User", + "length": 0, + "no_copy": 0, + "options": "User", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "role", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Role", + "length": 0, + "no_copy": 0, + "options": "Role", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "task", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Task", + "length": 0, + "no_copy": 1, + "options": "Task", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Applicable in the case of Employee Onboarding", + "fieldname": "required_for_employee_creation", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Required for Employee Creation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-05-10 06:54:47.282492", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Boarding Activity", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.py b/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.py new file mode 100644 index 0000000000..496f1653ba --- /dev/null +++ b/erpnext/hr/doctype/employee_boarding_activity/employee_boarding_activity.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeBoardingActivity(Document): + pass diff --git a/erpnext/hr/doctype/employee_onboarding/__init__.py b/erpnext/hr/doctype/employee_onboarding/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_onboarding/employee_onboarding.js b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.js new file mode 100644 index 0000000000..e95e260fa9 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.js @@ -0,0 +1,59 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Onboarding', { + setup: function(frm) { + frm.add_fetch("employee_onboarding_template", "company", "company"); + frm.add_fetch("employee_onboarding_template", "department", "department"); + frm.add_fetch("employee_onboarding_template", "designation", "designation"); + frm.add_fetch("employee_onboarding_template", "employee_grade", "employee_grade"); + }, + + refresh: function(frm) { + if (frm.doc.employee) { + frm.add_custom_button(__('Employee'), function() { + frappe.set_route("Form", "Employee", frm.doc.employee); + },__("View")); + } + if (frm.doc.project) { + frm.add_custom_button(__('Project'), function() { + frappe.set_route("Form", "Project", frm.doc.project); + },__("View")); + frm.add_custom_button(__('Task'), function() { + frappe.set_route('List', 'Task', {project: frm.doc.project}); + },__("View")); + } + if ((!frm.doc.employee) && (frm.doc.docstatus === 1)) { + frm.add_custom_button(__('Employee'), function () { + frappe.model.open_mapped_doc({ + method: "erpnext.hr.doctype.employee_onboarding.employee_onboarding.make_employee", + frm: frm + }); + }, __("Make")); + frm.page.set_inner_btn_group_as_primary(__("Make")); + } + + }, + + employee_onboarding_template: function(frm) { + frm.set_value("activities" ,""); + if (frm.doc.employee_onboarding_template) { + frappe.call({ + method: "erpnext.hr.utils.get_onboarding_details", + args: { + "parent": frm.doc.employee_onboarding_template, + "parenttype": "Employee Onboarding Template" + }, + callback: function(r) { + if (r.message) { + $.each(r.message, function(i, d) { + var row = frappe.model.add_child(frm.doc, "Employee Boarding Activity", "activities"); + $.extend(row, d); + }); + } + refresh_field("activities"); + } + }); + } + } +}); diff --git a/erpnext/hr/doctype/employee_onboarding/employee_onboarding.json b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.json new file mode 100644 index 0000000000..bd2ec4ce9d --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.json @@ -0,0 +1,569 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EOB.#####", + "beta": 0, + "creation": "2018-05-09 04:57:20.016220", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "job_offer", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Job Offer", + "length": 0, + "no_copy": 0, + "options": "Job Offer", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "job_applicant", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Job Applicant", + "length": 0, + "no_copy": 0, + "options": "Job Applicant", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date_of_joining", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Date of Joining", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "boarding_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "\nPending\nIn Process\nCompleted", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_onboarding_template", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Onboarding Template", + "length": 0, + "no_copy": 0, + "options": "Employee Onboarding Template", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Project", + "length": 0, + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "table_for_activity", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activities", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "options": "Employee Boarding Activity", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Onboarding", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-10 06:34:21.103617", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Onboarding", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "employee_name", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py new file mode 100644 index 0000000000..3390e8ffe5 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.hr.utils import EmployeeBoardingController +from frappe.model.mapper import get_mapped_doc + + +class EmployeeOnboarding(EmployeeBoardingController): + def validate(): + super(EmployeeOnboarding, self).validate() + + def validate_employee_creation(self): + if self.docstatus != 1: + frappe.throw(_("Submit this to create the Employee record")) + else: + for activity in self.activities: + if not activity.required_for_employee_creation: + continue + else: + task_status = frappe.db.get_value("Task", activity.task, "status") + if task_status not in ["Closed", "Cancelled"]: + frappe.throw(_("All the mandatory Task for employee creation hasn't been done yet.")) + + def on_submit(self): + super(EmployeeOnboarding, self).on_submit() + + def on_cancel(self): + super(EmployeeOnboarding, self).on_cancel() + + +@frappe.whitelist() +def make_employee(source_name, target_doc=None): + doc = frappe.get_doc("Employee Onboarding", source_name) + doc.validate_employee_creation() + def set_missing_values(source, target): + target.personal_email = frappe.db.get_value("Job Applicant", source.job_applicant, "email_id") + target.status = "Active" + doc = get_mapped_doc("Employee Onboarding", source_name, { + "Employee Onboarding": { + "doctype": "Employee", + "field_map": { + "employee_grade": "grade", + }} + }, target_doc, set_missing_values) + return doc + diff --git a/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.js b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.js new file mode 100644 index 0000000000..d15cef77dc --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Onboarding", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Onboarding + () => frappe.tests.make('Employee Onboarding', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py new file mode 100644 index 0000000000..b37ae883b6 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeOnboarding(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_onboarding_activity/__init__.py b/erpnext/hr/doctype/employee_onboarding_activity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.json b/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.json new file mode 100644 index 0000000000..4e91b72384 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.json @@ -0,0 +1,290 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-05-09 05:37:18.439763", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activity_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Activity Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "User", + "length": 0, + "no_copy": 0, + "options": "User", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "role", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Role", + "length": 0, + "no_copy": 0, + "options": "Role", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.parenttype == \"Employee Onboarding\"", + "fieldname": "completed", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Completed", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "required_for_employee_creation", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Required for Employee Creation", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-05-09 06:15:41.768236", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Onboarding Activity", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.py b/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.py new file mode 100644 index 0000000000..d170631819 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_activity/employee_onboarding_activity.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeOnboardingActivity(Document): + pass diff --git a/erpnext/hr/doctype/employee_onboarding_template/__init__.py b/erpnext/hr/doctype/employee_onboarding_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.js b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.js new file mode 100644 index 0000000000..2a531f31a2 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Onboarding Template', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.json b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.json new file mode 100644 index 0000000000..d0d3a62ba8 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.json @@ -0,0 +1,284 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EOBT.#####", + "beta": 0, + "creation": "2018-05-09 05:27:02.393377", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activities", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "options": "Employee Boarding Activity", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-09 07:05:21.051519", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Onboarding Template", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "designation", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.py b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.py new file mode 100644 index 0000000000..6f1c316731 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeOnboardingTemplate(Document): + pass diff --git a/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.js b/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.js new file mode 100644 index 0000000000..10912edb6a --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Onboarding Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Onboarding Template + () => frappe.tests.make('Employee Onboarding Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py b/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py new file mode 100644 index 0000000000..f4b5b88342 --- /dev/null +++ b/erpnext/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeOnboardingTemplate(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_separation/__init__.py b/erpnext/hr/doctype/employee_separation/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_separation/employee_separation.js b/erpnext/hr/doctype/employee_separation/employee_separation.js new file mode 100644 index 0000000000..33830796b6 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation/employee_separation.js @@ -0,0 +1,49 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Separation', { + setup: function(frm) { + frm.add_fetch("employee_separation_template", "company", "company"); + frm.add_fetch("employee_separation_template", "department", "department"); + frm.add_fetch("employee_separation_template", "designation", "designation"); + frm.add_fetch("employee_separation_template", "employee_grade", "employee_grade"); + }, + + refresh: function(frm) { + if (frm.doc.employee) { + frm.add_custom_button(__('Employee'), function() { + frappe.set_route("Form", "Employee", frm.doc.employee); + },__("View")); + } + if (frm.doc.project) { + frm.add_custom_button(__('Project'), function() { + frappe.set_route("Form", "Project", frm.doc.project); + },__("View")); + frm.add_custom_button(__('Task'), function() { + frappe.set_route('List', 'Task', {project: frm.doc.project}); + },__("View")); + } + }, + + employee_separation_template: function(frm) { + frm.set_value("activities" ,""); + if (frm.doc.employee_separation_template) { + frappe.call({ + method: "erpnext.hr.utils.get_onboarding_details", + args: { + "parent": frm.doc.employee_separation_template, + "parenttype": "Employee Separation Template" + }, + callback: function(r) { + if (r.message) { + $.each(r.message, function(i, d) { + var row = frappe.model.add_child(frm.doc, "Employee Boarding Activity", "activities"); + $.extend(row, d); + }); + } + refresh_field("activities"); + } + }); + } + } +}); diff --git a/erpnext/hr/doctype/employee_separation/employee_separation.json b/erpnext/hr/doctype/employee_separation/employee_separation.json new file mode 100644 index 0000000000..7d9cfb1c59 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation/employee_separation.json @@ -0,0 +1,567 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "ES.#####", + "beta": 0, + "creation": "2018-05-10 02:29:16.740490", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee Name", + "length": 0, + "no_copy": 0, + "options": "employee.employee_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "resignation_letter_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Resignation Letter Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "boarding_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "\nPending\nIn Process\nCompleted", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "project", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Project", + "length": 0, + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_separation_template", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Separation Template", + "length": 0, + "no_copy": 0, + "options": "Employee Separation Template", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "table_for_activity", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activities", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "options": "Employee Boarding Activity", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_14", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "exit_interview", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Exit Interview Summary", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Employee Separation", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-10 06:34:53.649332", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Separation", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "employee_name", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_separation/employee_separation.py b/erpnext/hr/doctype/employee_separation/employee_separation.py new file mode 100644 index 0000000000..b908b632c8 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation/employee_separation.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +from erpnext.hr.utils import EmployeeBoardingController + +class EmployeeSeparation(EmployeeBoardingController): + def validate(self): + super(EmployeeSeparation, self).validate() + + def on_submit(self): + super(EmployeeSeparation, self).on_submit() + + def on_cancel(self): + super(EmployeeSeparation, self).on_cancel() diff --git a/erpnext/hr/doctype/employee_separation/test_employee_separation.js b/erpnext/hr/doctype/employee_separation/test_employee_separation.js new file mode 100644 index 0000000000..d6c635951f --- /dev/null +++ b/erpnext/hr/doctype/employee_separation/test_employee_separation.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Separation", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Separation + () => frappe.tests.make('Employee Separation', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_separation/test_employee_separation.py b/erpnext/hr/doctype/employee_separation/test_employee_separation.py new file mode 100644 index 0000000000..0773fb6ae9 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation/test_employee_separation.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeSeparation(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/employee_separation_template/__init__.py b/erpnext/hr/doctype/employee_separation_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/hr/doctype/employee_separation_template/employee_separation_template.js b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.js new file mode 100644 index 0000000000..172ff9fc5b --- /dev/null +++ b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Employee Separation Template', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/hr/doctype/employee_separation_template/employee_separation_template.json b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.json new file mode 100644 index 0000000000..f1f440a020 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.json @@ -0,0 +1,284 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "EST.#####", + "beta": 0, + "creation": "2018-05-09 06:31:44.498557", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "designation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Designation", + "length": 0, + "no_copy": 0, + "options": "Designation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee_grade", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Employee Grade", + "length": 0, + "no_copy": 0, + "options": "Employee Grade", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "activities", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Activities", + "length": 0, + "no_copy": 0, + "options": "Employee Boarding Activity", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-09 07:05:30.792336", + "modified_by": "Administrator", + "module": "HR", + "name": "Employee Separation Template", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "designation", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_separation_template/employee_separation_template.py b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.py new file mode 100644 index 0000000000..0508fc462e --- /dev/null +++ b/erpnext/hr/doctype/employee_separation_template/employee_separation_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class EmployeeSeparationTemplate(Document): + pass diff --git a/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.js b/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.js new file mode 100644 index 0000000000..66fd450804 --- /dev/null +++ b/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Employee Separation Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Employee Separation Template + () => frappe.tests.make('Employee Separation Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.py b/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.py new file mode 100644 index 0000000000..3fd3d398bd --- /dev/null +++ b/erpnext/hr/doctype/employee_separation_template/test_employee_separation_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEmployeeSeparationTemplate(unittest.TestCase): + pass diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index 686f79170c..076b1452df 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -6,11 +6,100 @@ import frappe from frappe import _ from frappe.utils import formatdate, format_datetime from frappe.utils import getdate, get_datetime +from frappe.model.document import Document +from frappe.desk.form import assign_to + +class EmployeeBoardingController(Document): + ''' + Create the project and the task for the boarding process + Assign to the concerned person and roles as per the onboarding/separation template + ''' + def validate(self): + # remove the task if linked before submitting the form + if self.amended_from: + for activity in self.activities: + activity.task = '' + + def on_submit(self): + # create the project for the given employee onboarding + project_name = self.doctype + " for " + self.employee_name + if self.doctype == "Employee Onboarding": + project_name += " (" + self.job_applicant + ")" + else: + project_name += " (" + self.employee + ")" + project = frappe.get_doc({ + "doctype": "Project", + "project_name": project_name, + "expected_start_date": self.date_of_joining if self.doctype == "Employee Onboarding" else self.resignation_letter_date, + "department": self.department, + "company": self.company + }).insert(ignore_permissions=True) + self.db_set("project", project.name) + + # create the task for the given project and assign to the concerned person + for activity in self.activities: + task = frappe.get_doc({ + "doctype": "Task", + "project": project.name, + "subject": activity.activity_name + " for " + self.employee_name, + "description": activity.description, + "department": self.department, + "company": self.company + }).insert(ignore_permissions=True) + activity.db_set("task", task.name) + users = [activity.user] if activity.user else [] + if activity.role: + user_list = frappe.db.sql_list('''select distinct(parent) from `tabHas Role` + where parenttype='User' and role=%s''', activity.role) + users = users + user_list + + # assign the task the users + if users: + self.assign_task_to_users(task, set(users)) + + def assign_task_to_users(self, task, users): + for user in users: + args = { + 'assign_to' : user, + 'doctype' : task.doctype, + 'name' : task.name, + 'description' : task.description or task.subject, + } + assign_to.add(args) + + def on_cancel(self): + # delete task project + for task in frappe.get_all("Task", filters={"project": self.project}): + frappe.delete_doc("Task", task.name) + frappe.delete_doc("Project", self.project) + self.db_set('project', '') + for activity in self.activities: + activity.db_set("task", "") + + +@frappe.whitelist() +def get_onboarding_details(parent, parenttype): + return frappe.get_list("Employee Boarding Activity", + fields=["activity_name", "role", "user", "required_for_employee_creation", "description"], + filters={"parent": parent, "parenttype": parenttype}, + order_by= "idx") + def set_employee_name(doc): if doc.employee and not doc.employee_name: doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name") +def update_employee(employee, details, cancel=False): + for item in details: + fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype + new_data = item.new if not cancel else item.current + if fieldtype == "Date" and new_data: + new_data = getdate(new_data) + elif fieldtype =="Datetime" and new_data: + new_data = get_datetime(new_data) + setattr(employee, item.fieldname, new_data) + return employee + @frappe.whitelist() def get_employee_fields_label(): fields = [] @@ -39,17 +128,6 @@ def get_employee_field_property(employee, fieldname): else: return False -def update_employee(employee, details, cancel=False): - for item in details: - fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype - new_data = item.new if not cancel else item.current - if fieldtype == "Date" and new_data: - new_data = getdate(new_data) - elif fieldtype =="Datetime" and new_data: - new_data = get_datetime(new_data) - setattr(employee, item.fieldname, new_data) - return employee - def get_leave_period(from_date, to_date, company): leave_period = frappe.db.sql(""" select name, from_date, to_date diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index 43cee681c6..184656bbd0 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -178,6 +178,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "percent_complete", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "% Completed", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -208,6 +238,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -305,36 +367,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "percent_complete", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "% Completed", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1709,7 +1741,7 @@ "issingle": 0, "istable": 0, "max_attachments": 4, - "modified": "2018-03-28 10:19:32.743900", + "modified": "2018-05-10 04:21:25.764015", "modified_by": "Administrator", "module": "Projects", "name": "Project", @@ -1717,7 +1749,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -1737,7 +1768,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -1757,7 +1787,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index 8e72d0339e..c1b7aa1c60 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -40,6 +40,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -72,6 +73,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -103,6 +105,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -133,6 +136,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -166,6 +170,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -198,6 +203,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -229,6 +235,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -260,6 +267,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -292,6 +300,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -326,6 +335,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -357,6 +367,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -386,6 +397,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -418,6 +430,7 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -449,6 +462,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -480,6 +494,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -512,6 +527,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -545,6 +561,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "300px" }, @@ -578,6 +595,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -610,6 +628,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -641,6 +660,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -675,6 +695,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0, "width": "50%" }, @@ -708,6 +729,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -742,6 +764,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -771,6 +794,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -803,6 +827,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -833,6 +858,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -866,6 +892,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -898,6 +925,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -927,6 +955,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -958,6 +987,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -987,6 +1017,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1019,6 +1050,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1051,6 +1083,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1079,6 +1112,39 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "department", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Department", + "length": 0, + "no_copy": 0, + "options": "Department", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1109,6 +1175,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1139,6 +1206,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1169,6 +1237,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -1199,6 +1268,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -1214,7 +1284,7 @@ "istable": 0, "max_attachments": 5, "menu_index": 0, - "modified": "2017-11-10 18:37:19.660293", + "modified": "2018-05-10 03:47:12.256088", "modified_by": "Administrator", "module": "Projects", "name": "Task", @@ -1222,7 +1292,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, From 094e1841e023a4553ffe7bb29d18d9927bc98f12 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Mon, 14 May 2018 20:33:28 +0530 Subject: [PATCH 149/154] minor changes and fixed the conflicts --- erpnext/hr/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index 076b1452df..213d46ea3d 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -22,7 +22,7 @@ class EmployeeBoardingController(Document): def on_submit(self): # create the project for the given employee onboarding - project_name = self.doctype + " for " + self.employee_name + project_name = _(self.doctype) + " : " + self.employee_name if self.doctype == "Employee Onboarding": project_name += " (" + self.job_applicant + ")" else: @@ -41,7 +41,7 @@ class EmployeeBoardingController(Document): task = frappe.get_doc({ "doctype": "Task", "project": project.name, - "subject": activity.activity_name + " for " + self.employee_name, + "subject": activity.activity_name + " : " + self.employee_name, "description": activity.description, "department": self.department, "company": self.company From 2d8a7ee81fb13ec38df7946291b0ab8685febd2a Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 11 May 2018 13:16:16 +0530 Subject: [PATCH 150/154] Bootstrap 'TDS' via fixture --- .../in_standard_chart_of_accounts.json | 3 + erpnext/hr/doctype/employee/employee.json | 2 +- erpnext/regional/india/setup.py | 58 +++++++++++++++---- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index bc7f965956..f2c767f7cd 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -139,6 +139,9 @@ "Creditors": { "account_type": "Payable" }, + "TDS": { + "account_type": "Payable" + }, "Payroll Payable": {} }, "Stock Liabilities": { diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 3527197edc..cc3fb7ff20 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -2766,7 +2766,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-10 07:52:24.326361", + "modified": "2018-05-11 12:48:46.435484", "modified_by": "Administrator", "module": "HR", "name": "Employee", diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index 0073d3311c..f035249aa4 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -16,7 +16,7 @@ def setup(company=None, patch=True): add_print_formats() if not patch: update_address_template() - make_fixtures() + make_fixtures(company) def update_address_template(): with open(os.path.join(os.path.dirname(__file__), 'address_template.html'), 'r') as f: @@ -189,15 +189,13 @@ def make_custom_fields(): create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch) -def make_fixtures(): - docs = [ - {'doctype': 'Salary Component', 'salary_component': 'Professional Tax', 'description': 'Professional Tax', 'type': 'Deduction'}, - {'doctype': 'Salary Component', 'salary_component': 'Provident Fund', 'description': 'Provident fund', 'type': 'Deduction'}, - {'doctype': 'Salary Component', 'salary_component': 'House Rent Allowance', 'description': 'House Rent Allowance', 'type': 'Earning'}, - {'doctype': 'Salary Component', 'salary_component': 'Basic', 'description': 'Basic', 'type': 'Earning'}, - {'doctype': 'Salary Component', 'salary_component': 'Arrear', 'description': 'Arrear', 'type': 'Earning'}, - {'doctype': 'Salary Component', 'salary_component': 'Leave Encashment', 'description': 'Leave Encashment', 'type': 'Earning'} - ] +def make_fixtures(company=None): + docs = [] + company = company.name if company else frappe.db.get_value("Global Defaults", None, "default_company") + + set_salary_components(docs) + set_tds_account(docs, company) + set_tax_withholding_category(docs, company) for d in docs: try: @@ -206,3 +204,43 @@ def make_fixtures(): doc.insert() except frappe.NameError: pass + +def set_salary_components(docs): + docs.extend([ + {'doctype': 'Salary Component', 'salary_component': 'Professional Tax', 'description': 'Professional Tax', 'type': 'Deduction'}, + {'doctype': 'Salary Component', 'salary_component': 'Provident Fund', 'description': 'Provident fund', 'type': 'Deduction'}, + {'doctype': 'Salary Component', 'salary_component': 'House Rent Allowance', 'description': 'House Rent Allowance', 'type': 'Earning'}, + {'doctype': 'Salary Component', 'salary_component': 'Basic', 'description': 'Basic', 'type': 'Earning'}, + {'doctype': 'Salary Component', 'salary_component': 'Arrear', 'description': 'Arrear', 'type': 'Earning'}, + {'doctype': 'Salary Component', 'salary_component': 'Leave Encashment', 'description': 'Leave Encashment', 'type': 'Earning'} + ]) + +def set_tax_withholding_category(docs, company): + accounts = [] + tds_account = frappe.db.get_value("Account", filter={"account_type": "Payable", + "account_name": "TDS", "company": company}) + + if company and tds_account: + accounts = [ + { + 'company': company, + 'account': tds_account + } + ] + + docs.extend([ + { + 'doctype': 'Tax Withholding Category', '__newname': 'TDS', + 'percent_of_tax_withheld': 10,'threshold': 150000, 'book_on_invoice': 1, + 'book_on_advance': 0, "withhold_cumulative_tax_amount": 0, + 'accounts': accounts + } + ]) + +def set_tds_account(docs, company): + docs.extend([ + { + 'doctype': 'Account', 'account_name': 'TDS', 'account_type': 'Payable', + 'parent_account': 'Accounts Payable', 'company': company + } + ]) \ No newline at end of file From 3b4a6be4d029be652903bfba57807789d0bff450 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 11 May 2018 14:02:25 +0530 Subject: [PATCH 151/154] Supplier Tax Withholding Config --- .../party_tax_withholding_config/__init__.py | 0 .../party_tax_withholding_config.json | 166 ++++++++++++++++++ .../party_tax_withholding_config.py | 10 ++ erpnext/buying/doctype/supplier/supplier.json | 65 ++++++- 4 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 erpnext/buying/doctype/party_tax_withholding_config/__init__.py create mode 100644 erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.json create mode 100644 erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.py diff --git a/erpnext/buying/doctype/party_tax_withholding_config/__init__.py b/erpnext/buying/doctype/party_tax_withholding_config/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.json b/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.json new file mode 100644 index 0000000000..320485b318 --- /dev/null +++ b/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.json @@ -0,0 +1,166 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-05-11 13:32:33.825307", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_withholding_category", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Tax Withholding Category", + "length": 0, + "no_copy": 0, + "options": "Tax Withholding Category", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "valid_till", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Valid Till", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "applicable_percent", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Applicable Percent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "certificate_received", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Certificate Received", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-05-11 13:35:44.424855", + "modified_by": "Administrator", + "module": "Buying", + "name": "Party Tax Withholding Config", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.py b/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.py new file mode 100644 index 0000000000..bec7e83f23 --- /dev/null +++ b/erpnext/buying/doctype/party_tax_withholding_config/party_tax_withholding_config.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class PartyTaxWithholdingConfig(Document): + pass diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index d342e115b7..508389f39d 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -960,6 +960,69 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "default_tax_withholding_config", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Default Tax Withholding Config", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tax_withholding_account", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Tax Withholding Account", + "length": 0, + "no_copy": 0, + "options": "Party Tax Withholding Config", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1163,7 +1226,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-11 12:19:52.519026", + "modified": "2018-05-11 14:00:36.204532", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", From b9d3385fec886168cd9a34143a06749a1509b21b Mon Sep 17 00:00:00 2001 From: Saurabh Date: Sat, 12 May 2018 17:42:20 +0530 Subject: [PATCH 152/154] calculate TDS on Sales Invoice Amount --- .../in_standard_chart_of_accounts.json | 8 +-- .../purchase_invoice/purchase_invoice.py | 21 +++++- .../tax_withholding_category.json | 64 ++++++++++++++++++- .../tax_withholding_category.py | 5 +- erpnext/accounts/party.py | 61 +++++++++++++++++- erpnext/buying/doctype/supplier/supplier.json | 38 +---------- erpnext/regional/india/setup.py | 4 +- 7 files changed, 153 insertions(+), 48 deletions(-) diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index f2c767f7cd..2ec0b7f70c 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -139,9 +139,6 @@ "Creditors": { "account_type": "Payable" }, - "TDS": { - "account_type": "Payable" - }, "Payroll Payable": {} }, "Stock Liabilities": { @@ -150,8 +147,9 @@ } }, "Duties and Taxes": { - "account_type": "Tax", - "is_group": 1 + "TDS": { + "account_type": "Tax" + } }, "Loans (Liabilities)": { "Secured Loans": {}, diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 3e375e5051..0b544b13a3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -8,7 +8,7 @@ from frappe import _, throw import frappe.defaults from erpnext.controllers.buying_controller import BuyingController -from erpnext.accounts.party import get_party_account, get_due_date +from erpnext.accounts.party import get_party_account, get_due_date, get_patry_tax_withholding_details from erpnext.accounts.utils import get_account_currency, get_fiscal_year from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_billed_amount_based_on_po from erpnext.stock import get_warehouse_account_map @@ -46,6 +46,7 @@ class PurchaseInvoice(BuyingController): self.is_opening = 'No' self.validate_posting_time() + self.set_tax_withholding() super(PurchaseInvoice, self).validate() if not self.is_return: @@ -53,7 +54,6 @@ class PurchaseInvoice(BuyingController): self.pr_required() self.validate_supplier_invoice() - # validate cash purchase if (self.is_paid == 1): self.validate_cash() @@ -168,7 +168,6 @@ class PurchaseInvoice(BuyingController): super(PurchaseInvoice, self).validate_warehouse() - def validate_item_code(self): for d in self.get('items'): if not d.item_code: @@ -731,6 +730,22 @@ class PurchaseInvoice(BuyingController): def on_recurring(self, reference_doc, subscription_doc): self.due_date = None + def set_tax_withholding(self): + """ + 1. Get TDS Configurations against Supplier or Pull Default One. + 2. Form Purchase Order, identify partial payments + 3. If sum of all invoices grand total is greater than threshold and If TDS not deducted in previos Invoices + then deduct TDS for sum amount else deduct TDS for current Invoice + """ + if not self.get("__islocal"): + return + + tax_withholding_details = get_patry_tax_withholding_details(self) + + if tax_withholding_details and\ + flt(self.get("rounded_total") or self.grand_total) >= flt(tax_withholding_details['threshold']): + self.append('taxes', tax_withholding_details['taxes']) + @frappe.whitelist() def make_debit_note(source_name, target_doc=None): from erpnext.controllers.sales_and_purchase_return import make_return_doc diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json index f02a52043e..a590776e68 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json @@ -13,6 +13,68 @@ "editable_grid": 1, "engine": "InnoDB", "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_default", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Default", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "enabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -271,7 +333,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-13 19:17:12.494050", + "modified": "2018-05-11 14:25:07.474461", "modified_by": "Administrator", "module": "Accounts", "name": "Tax Withholding Category", diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py index 4940c4f3fe..61f4b60c8b 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py @@ -7,4 +7,7 @@ import frappe from frappe.model.document import Document class TaxWithholdingCategory(Document): - pass + def validate(self): + if not frappe.db.get_value("Tax Withholding Category", + {"is_default": 1, "name": ("!=", self.name)}, "name"): + self.is_default = 1 \ No newline at end of file diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 652272dbe1..6c778f99c8 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -448,7 +448,6 @@ def get_dashboard_info(party_type, party): return info - def get_party_shipping_address(doctype, name): """ Returns an Address name (best guess) for the given doctype and name for which `address_type == 'Shipping'` is true. @@ -476,3 +475,63 @@ def get_party_shipping_address(doctype, name): return out[0][0] else: return '' + +def get_patry_tax_withholding_details(ref_doc): + supplier = frappe.get_doc("Supplier", ref_doc.supplier) + tax_withholding_details = {} + + for tax in supplier.tax_withholding_config: + tax_mapper = get_tax_mapper() + + set_tax_withholding_details(tax_mapper, ref_doc, tax_withholding_category=tax.tax_withholding_category) + + if tax.valid_till and date_diff(tax.valid_till, ref_doc.posting_date) > 0: + tax_mapper.update({ + "rate": tax.applicable_percentage + }) + + prepare_tax_withholding_details(tax_mapper, tax_withholding_details) + + if not tax_withholding_details: + tax_mapper = get_tax_mapper() + set_tax_withholding_details(tax_mapper, ref_doc, use_default=1) + prepare_tax_withholding_details(tax_mapper, tax_withholding_details) + + return tax_withholding_details + +def prepare_tax_withholding_details(tax_mapper, tax_withholding_details): + if tax_mapper.get('account_head'): + tax_withholding_details.update({ + "threshold": tax_mapper['threshold'], + "taxes": tax_mapper + }) + del tax_mapper['threshold'] + +def set_tax_withholding_details(tax_mapper, ref_doc, tax_withholding_category=None, use_default=0): + if tax_withholding_category: + tax_withholding = frappe.get_doc("Tax Withholding Category", tax_withholding_category) + else: + tax_withholding = frappe.get_doc("Tax Withholding Category", {'is_default': 1, 'enabled': 1}) + + if tax_withholding.book_on_invoice and ref_doc.doctype=='Purchase Invoice' \ + or tax_withholding.book_on_advance and ref_doc.doctype in ('Payment Entry', 'Journal Entry'): + + for account_detail in tax_withholding.accounts: + if ref_doc.company == account_detail.company: + tax_mapper.update({ + "account_head": account_detail.account, + "rate": tax_withholding.percent_of_tax_withheld, + "threshold": tax_withholding.threshold, + "description": tax_withholding.name + }) + +def get_tax_mapper(): + return { + "category": "Total", + "add_deduct_tax": "Deduct", + "charge_type": "On Net Total", + "rate": 0, + "description": '', + "account_head": '', + "threshold": 0.0 + } \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 508389f39d..eedbac1dff 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -233,7 +233,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 0, "set_only_once": 0, "translatable": 0, @@ -997,7 +997,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "tax_withholding_account", + "fieldname": "tax_withholding_config", "fieldtype": "Table", "hidden": 0, "ignore_user_permissions": 0, @@ -1180,38 +1180,6 @@ "set_only_once": 0, "translatable": 0, "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "tax_withholding_category", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Tax Withholding Category", - "length": 0, - "no_copy": 0, - "options": "Tax Withholding Category", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 } ], "has_web_view": 0, @@ -1226,7 +1194,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-11 14:00:36.204532", + "modified": "2018-05-11 15:15:19.912308", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index f035249aa4..70960d714b 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -240,7 +240,7 @@ def set_tax_withholding_category(docs, company): def set_tds_account(docs, company): docs.extend([ { - 'doctype': 'Account', 'account_name': 'TDS', 'account_type': 'Payable', - 'parent_account': 'Accounts Payable', 'company': company + 'doctype': 'Account', 'account_name': 'TDS', 'account_type': 'Tax', + 'parent_account': 'Duties and Taxes', 'company': company } ]) \ No newline at end of file From f3f438ad183e13ba9ea56fe96dd11941fc6d203f Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 14 May 2018 20:19:39 +0530 Subject: [PATCH 153/154] tds fixed for PI --- .../purchase_invoice/purchase_invoice.py | 18 ++++++++---------- erpnext/accounts/party.py | 17 +++++++---------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 0b544b13a3..c9cf47d114 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -732,19 +732,17 @@ class PurchaseInvoice(BuyingController): def set_tax_withholding(self): """ - 1. Get TDS Configurations against Supplier or Pull Default One. - 2. Form Purchase Order, identify partial payments - 3. If sum of all invoices grand total is greater than threshold and If TDS not deducted in previos Invoices - then deduct TDS for sum amount else deduct TDS for current Invoice + 1. Get TDS Configurations against Supplier """ - if not self.get("__islocal"): - return tax_withholding_details = get_patry_tax_withholding_details(self) - - if tax_withholding_details and\ - flt(self.get("rounded_total") or self.grand_total) >= flt(tax_withholding_details['threshold']): - self.append('taxes', tax_withholding_details['taxes']) + for tax_details in tax_withholding_details: + if flt(self.get("rounded_total") or self.grand_total) >= flt(tax_details['threshold']): + if self.taxes: + if tax_details['tax']['description'] not in [tax.description for tax in self.taxes]: + self.append('taxes', tax_details['tax']) + else: + self.append('taxes', tax_details['tax']) @frappe.whitelist() def make_debit_note(source_name, target_doc=None): diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 6c778f99c8..75089b2ff4 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -478,8 +478,8 @@ def get_party_shipping_address(doctype, name): def get_patry_tax_withholding_details(ref_doc): supplier = frappe.get_doc("Supplier", ref_doc.supplier) - tax_withholding_details = {} - + tax_withholding_details = [] + print(supplier) for tax in supplier.tax_withholding_config: tax_mapper = get_tax_mapper() @@ -492,19 +492,16 @@ def get_patry_tax_withholding_details(ref_doc): prepare_tax_withholding_details(tax_mapper, tax_withholding_details) - if not tax_withholding_details: - tax_mapper = get_tax_mapper() - set_tax_withholding_details(tax_mapper, ref_doc, use_default=1) - prepare_tax_withholding_details(tax_mapper, tax_withholding_details) - return tax_withholding_details def prepare_tax_withholding_details(tax_mapper, tax_withholding_details): if tax_mapper.get('account_head'): - tax_withholding_details.update({ + + tax_withholding_details.append({ "threshold": tax_mapper['threshold'], - "taxes": tax_mapper + "tax": tax_mapper }) + del tax_mapper['threshold'] def set_tax_withholding_details(tax_mapper, ref_doc, tax_withholding_category=None, use_default=0): @@ -534,4 +531,4 @@ def get_tax_mapper(): "description": '', "account_head": '', "threshold": 0.0 - } \ No newline at end of file + } From 4ae089d6a12dd7a096d92b200f529d087c7e8685 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 14 May 2018 20:20:12 +0530 Subject: [PATCH 154/154] Provision to deduct TDS on Advance --- .../doctype/payment_entry/payment_entry.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index f983868a0f..0a22ae0a47 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -7,7 +7,7 @@ import frappe, erpnext, json from frappe import _, scrub, ValidationError from frappe.utils import flt, comma_or, nowdate from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on -from erpnext.accounts.party import get_party_account +from erpnext.accounts.party import get_party_account, get_patry_tax_withholding_details from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account from erpnext.setup.utils import get_exchange_rate from erpnext.accounts.general_ledger import make_gl_entries @@ -43,6 +43,7 @@ class PaymentEntry(AccountsController): def validate(self): self.setup_party_account_field() + self.set_tax_withholding() self.set_missing_values() self.validate_payment_type() self.validate_party_details() @@ -510,6 +511,27 @@ class PaymentEntry(AccountsController): def on_recurring(self, reference_doc, subscription_doc): self.reference_no = reference_doc.name self.reference_date = nowdate() + + def set_tax_withholding(self): + if self.party_type != 'Supplier': + return + + self.supplier = self.party + tax_withholding_details = get_patry_tax_withholding_details(self) + + for tax_details in tax_withholding_details: + if self.deductions: + if tax_details['tax']['account_head'] not in [deduction.account for deduction in self.deductions]: + self.append('deductions', self.calculate_deductions(tax_details)) + else: + self.append('deductions', self.calculate_deductions(tax_details)) + + def calculate_deductions(self, tax_details): + return { + "account": tax_details['tax']['account_head'], + "cost_center": frappe.db.get_value("Company", self.company, "cost_center"), + "amount": self.total_allocated_amount * (tax_details['tax']['rate'] / 100) + } @frappe.whitelist() def get_outstanding_reference_documents(args):

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 Xj~D!%?cSaN{u6yH^(g0omizw$D1vlP literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/linked-jv.png b/erpnext/docs/assets/img/accounts/linked-jv.png new file mode 100644 index 0000000000000000000000000000000000000000..9f444860c9f943e620a87788a5609ff37881b5fb GIT binary patch literal 190552 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 RZ;SzW>1aXE7yM~^_dgnWQ7!-g literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/select-company-jv.png b/erpnext/docs/assets/img/accounts/select-company-jv.png new file mode 100644 index 0000000000000000000000000000000000000000..d0056580c242a9302d54a6a3e8d962244ce6ddca GIT binary patch literal 189336 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 cfY+~jxLd8R-ch9y*beDbRB9t#e6cGlpaDKe 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 Accounts > Company and Accounts > Chart Of Accounts + +Select the Account which you would like to set as an Internal Account for the transaction, and check the **Inter Company Account** checkbox. It can now be used for Inter Company Journal Entry Transactions. + +Internal Account + +You need to do the same for all the Companies' Accounts which you want to use for Inter Company Journal Entry transactions. + +Now, to create an Inter Company Journal Entry go to: + +> Accounts > Company and Accounts > Journal Entry > New + +Inter Company Journal Entry + +In the Journal Entry, you must select, + +* Type of Voucher - **Inter Company Journal Entry**. +* Add rows for the individual accounting entries. In each row, you must specify: + * The Internal account that will be affected. + * The amount to Debit or Credit. + * The Cost Center (If it is an Income or Expense). + +On submitting the Journal Entry, you will find a button on the top right corner, **Make Inter Company Journal Entry**. + +Submitted Inter Company Journal Entry + +Click on the button, you will be asked to select the Company against which you wish to create the linked Journal Entry. + +Select Company + +On selecting the Company, you will be routed to another Journal Entry where the relevant fields will be mapped, i.e. Company, Voucher Type, Inter Company Journal Entry Reference etc. + +Linked Journal Entry + +Select the Internal accounts for the Company selected and submit the Journal Entry, make sure the total Debit and Credit Amounts are same as the previously created Journal Entry's total Credit and Debit Amounts respectively. + +You can also find the reference link at the bottom, which will be added in both the linked Journal Entries and will be removed if any of the Journal Entries are cancelled. + +{next} From ea60225760d6ba5b99cf9251605a236233ddd072 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 13:25:46 +0530 Subject: [PATCH 047/154] Employee Promotion, Transfer - update child table, added fields --- .../employee_promotion.json | 36 ++++++++- .../employee_property_history.json | 41 ++++++++-- .../employee_transfer/employee_transfer.json | 79 ++++++++++++++++--- 3 files changed, 133 insertions(+), 23 deletions(-) diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.json b/erpnext/hr/doctype/employee_promotion/employee_promotion.json index a7d49bcad3..1e3081a30c 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.json +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.json @@ -77,6 +77,36 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -102,7 +132,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "translatable": 0, @@ -189,7 +219,7 @@ "label": "Employee Promotion Detail", "length": 0, "no_copy": 0, - "options": "Employee Promotion Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, @@ -245,7 +275,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 15:42:49.452085", + "modified": "2018-04-27 17:31:26.902394", "modified_by": "Administrator", "module": "HR", "name": "Employee Promotion", diff --git a/erpnext/hr/doctype/employee_property_history/employee_property_history.json b/erpnext/hr/doctype/employee_property_history/employee_property_history.json index 7a416b2ed1..0a51579549 100644 --- a/erpnext/hr/doctype/employee_property_history/employee_property_history.json +++ b/erpnext/hr/doctype/employee_property_history/employee_property_history.json @@ -34,13 +34,12 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -65,13 +64,12 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -96,13 +94,42 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fieldname", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Field Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -116,7 +143,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-04-14 11:44:36.458039", + "modified": "2018-05-02 18:19:54.436391", "modified_by": "Administrator", "module": "HR", "name": "Employee Property History", diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.json b/erpnext/hr/doctype/employee_transfer/employee_transfer.json index 55fa073fa2..ace9f93870 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.json +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.json @@ -42,7 +42,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -74,7 +73,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -102,10 +100,38 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -137,7 +163,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -169,7 +194,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -200,7 +224,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -221,7 +244,7 @@ "label": "Employee Transfer Detail", "length": 0, "no_copy": 0, - "options": "Employee Transfer Detail", + "options": "Employee Property History", "permlevel": 0, "precision": "", "print_hide": 0, @@ -232,7 +255,6 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -243,7 +265,7 @@ "columns": 0, "fieldname": "reallocate_leaves", "fieldtype": "Check", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -263,7 +285,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 }, { @@ -294,7 +315,37 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "new_employee_id", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "New Employee ID", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 }, { @@ -325,7 +376,6 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, "unique": 0 } ], @@ -339,7 +389,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-04-14 15:42:31.098910", + "modified": "2018-05-05 13:10:32.660537", "modified_by": "Administrator", "module": "HR", "name": "Employee Transfer", @@ -348,6 +398,7 @@ "permissions": [ { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 0, "delete": 0, @@ -367,6 +418,7 @@ }, { "amend": 0, + "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -386,6 +438,7 @@ }, { "amend": 1, + "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, From fddfffd3e607ad3d224bf22e52691e37e11c04ea Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 13:27:26 +0530 Subject: [PATCH 048/154] Employee Promotion, Transfer - modal to add details to child table --- .../employee_promotion/employee_promotion.js | 2 + .../employee_transfer/employee_transfer.js | 2 + erpnext/hr/employee_property_update.js | 147 ++++++++++++++++++ erpnext/hr/utils.py | 41 +++++ 4 files changed, 192 insertions(+) create mode 100644 erpnext/hr/employee_property_update.js diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.js b/erpnext/hr/doctype/employee_promotion/employee_promotion.js index c1bb7888e5..54e06f4581 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.js +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.js @@ -1,6 +1,8 @@ // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt +{% include 'erpnext/hr/employee_property_update.js' %} + frappe.ui.form.on('Employee Promotion', { refresh: function(frm) { diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.js b/erpnext/hr/doctype/employee_transfer/employee_transfer.js index 1d694bdc41..af751a7c05 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.js +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.js @@ -1,6 +1,8 @@ // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt +{% include 'erpnext/hr/employee_property_update.js' %} + frappe.ui.form.on('Employee Transfer', { refresh: function(frm) { diff --git a/erpnext/hr/employee_property_update.js b/erpnext/hr/employee_property_update.js new file mode 100644 index 0000000000..d49c1abb9e --- /dev/null +++ b/erpnext/hr/employee_property_update.js @@ -0,0 +1,147 @@ +frappe.ui.form.on(cur_frm.doctype, { + setup: function(frm) { + frm.set_query("employee", function() { + return { + filters: { + "status": "Active" + } + }; + }) + }, + onload: function(frm){ + if(frm.doc.__islocal){ + if(frm.doctype == "Employee Promotion"){ + frm.doc.promotion_details = []; + }else if (frm.doctype == "Employee Transfer") { + frm.doc.transfer_details = []; + } + } + }, + employee: function(frm) { + frm.add_fetch("employee", "company", "company"); + }, + refresh: function(frm) { + var table; + if(frm.doctype == "Employee Promotion"){ + table = "promotion_details"; + }else if (frm.doctype == "Employee Transfer") { + table = "transfer_details" + } + if(!table){return} + cur_frm.fields_dict[table].grid.wrapper.find('.grid-add-row').hide(); + cur_frm.fields_dict[table].grid.add_custom_button(__('Add Row'), () => { + if(!frm.doc.employee){ + frappe.msgprint(__("Please select Employee")); + return; + } + frappe.call({ + method: 'erpnext.hr.utils.get_employee_fields_label', + callback: function(r) { + if(r.message){ + show_dialog(frm, table, r.message); + } + } + }); + }); + } +}); + +var show_dialog = function(frm, table, field_labels) { + var d = new frappe.ui.Dialog({ + title: "Update Property", + fields: [ + {fieldname: "property", label: __('Select Property'), fieldtype:"Select", options: field_labels}, + {fieldname: "current", fieldtype: "Data", label:__('Current'), read_only: true}, + {fieldname: "field_html", fieldtype: "HTML"} + ], + primary_action_label: __('Add to Details'), + primary_action: () => { + d.get_primary_btn().attr('disabled', true); + if(d.data){ + add_to_details(frm, d, table); + } + } + }); + d.fields_dict["property"].df.onchange = () => { + let property = d.get_values().property; + d.data.fieldname = property; + if(!property){return;} + frappe.call({ + method: 'erpnext.hr.utils.get_employee_field_property', + args: {employee: frm.doc.employee, fieldname: property}, + callback: function(r) { + if(r.message){ + d.data.current = r.message.value; + d.data.property = r.message.label; + d.fields_dict.field_html.$wrapper.html(""); + d.set_value('current', r.message.value); + render_dynamic_field(d, r.message.datatype, r.message.options, property); + d.get_primary_btn().attr('disabled', false); + } + } + }); + }; + d.get_primary_btn().attr('disabled', true); + d.data = {}; + d.show(); +} + +var render_dynamic_field = function(d, fieldtype, options, fieldname) { + d.data.new = null; + var dynamic_field = frappe.ui.form.make_control({ + df: { + "fieldtype": fieldtype, + "fieldname": fieldname, + "options": options || '' + }, + parent: d.fields_dict.field_html.wrapper, + only_input: false + }); + dynamic_field.make_input(); + $(dynamic_field.label_area).text(__("New")); + dynamic_field.$input.on("change", function(e) { + d.data.new = e.target.value; + }).on("awesomplete-close", function(e) { + d.data.new = e.target.value; + }); +} + +var add_to_details = function(frm, d, table) { + let data = d.data; + if(data.fieldname){ + if(validate_duplicate(frm, table, data.fieldname)){ + frappe.show_alert({message:__("Property already added"), indicator:'orange'}); + return false; + } + if(data.current == data.new){ + frappe.show_alert({message:__("Nothing to change"), indicator:'orange'}); + d.get_primary_btn().attr('disabled', false); + return false; + } + frm.add_child(table, { + fieldname: data.fieldname, + property: data.property, + current: data.current, + new: data.new + }); + frm.refresh_field(table); + d.fields_dict.field_html.$wrapper.html(""); + d.set_value("property", ""); + d.set_value('current', ""); + frappe.show_alert({message:__("Added to details"),indicator:'green'}); + d.data = {}; + }else { + frappe.show_alert({message:__("Value missing"),indicator:'red'}); + } +} + +var validate_duplicate = function(frm, table, fieldname){ + let duplicate = false; + $.each(frm.doc[table], function(i, detail) { + if(detail.fieldname === fieldname){ + duplicate = true; + return; + } + }); + return duplicate; +} diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index aa456aac60..057f406e80 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -4,7 +4,48 @@ from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import formatdate, format_datetime +from frappe.utils import getdate, get_datetime def set_employee_name(doc): if doc.employee and not doc.employee_name: doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name") + +@frappe.whitelist() +def get_employee_fields_label(): + fields = [] + for df in frappe.get_meta("Employee").get("fields"): + if df.fieldtype in ["Data", "Date", "Datetime", "Float", "Int", + "Link", "Percent", "Select", "Small Text"] and df.fieldname not in ["lft", "rgt", "old_parent"]: + fields.append({"value": df.fieldname, "label": df.label}) + return fields + +@frappe.whitelist() +def get_employee_field_property(employee, fieldname): + if employee and fieldname: + field = frappe.get_meta("Employee").get_field(fieldname) + value = frappe.db.get_value("Employee", employee, fieldname) + options = field.options + if field.fieldtype == "Date": + value = formatdate(value) + elif field.fieldtype == "Datetime": + value = format_datetime(value) + return { + "value" : value, + "datatype" : field.fieldtype, + "label" : field.label, + "options" : options + } + else: + return False + +def update_employee(employee, details, cancel=False): + for item in details: + fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype + new_data = item.new if not cancel else item.current + if fieldtype == "Date" and new_data: + new_data = getdate(new_data) + elif fieldtype =="Datetime" and new_data: + new_data = get_datetime(new_data) + setattr(employee, item.fieldname, new_data) + return employee From 56b58017d171780bc0cc7831512456c006a4c366 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 13:41:48 +0530 Subject: [PATCH 049/154] Employee Promotion, Transfer - validate, submit, cancel workflow --- erpnext/hr/doctype/employee/employee.py | 3 ++ .../employee_promotion/employee_promotion.py | 22 +++++++- .../employee_transfer/employee_transfer.py | 54 ++++++++++++++++++- 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py index 0f116399ae..4cf28a16ec 100755 --- a/erpnext/hr/doctype/employee/employee.py +++ b/erpnext/hr/doctype/employee/employee.py @@ -156,6 +156,9 @@ class Employee(NestedSet): def on_trash(self): self.update_nsm_model() delete_events(self.doctype, self.name) + if frappe.db.exists("Employee Transfer", {'new_employee_id': self.name, 'docstatus': 1}): + emp_transfer = frappe.get_doc("Employee Transfer", {'new_employee_id': self.name, 'docstatus': 1}) + emp_transfer.db_set("new_employee_id", '') def validate_preferred_email(self): if self.prefered_contact_email and not self.get(scrub(self.prefered_contact_email)): diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.py b/erpnext/hr/doctype/employee_promotion/employee_promotion.py index 564f1ad6ac..5fcceedac2 100644 --- a/erpnext/hr/doctype/employee_promotion/employee_promotion.py +++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.py @@ -4,7 +4,27 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document +from frappe.utils import getdate +from erpnext.hr.utils import update_employee class EmployeePromotion(Document): - pass + def validate(self): + if frappe.get_value("Employee", self.employee, "status") == "Left": + frappe.throw(_("Cannot promote Employee with status Left")) + + def before_submit(self): + if getdate(self.promotion_date) > getdate(): + frappe.throw(_("Employee Promotion cannot be submitted before Promotion Date "), + frappe.DocstatusTransitionError) + + def on_submit(self): + employee = frappe.get_doc("Employee", self.employee) + employee = update_employee(employee, self.promotion_details) + employee.save() + + def on_cancel(self): + employee = frappe.get_doc("Employee", self.employee) + employee = update_employee(employee, self.promotion_details, True) + employee.save() diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py index 96645c4d69..d80e293bbb 100644 --- a/erpnext/hr/doctype/employee_transfer/employee_transfer.py +++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py @@ -4,7 +4,59 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document +from frappe.utils import getdate +from erpnext.hr.utils import update_employee class EmployeeTransfer(Document): - pass + def validate(self): + if frappe.get_value("Employee", self.employee, "status") == "Left": + frappe.throw(_("Cannot transfer Employee with status Left")) + + def before_submit(self): + if getdate(self.transfer_date) > getdate(): + frappe.throw(_("Employee Transfer cannot be submitted before Transfer Date "), + frappe.DocstatusTransitionError) + + def on_submit(self): + employee = frappe.get_doc("Employee", self.employee) + if self.create_new_employee_id: + new_employee = frappe.copy_doc(employee) + new_employee = update_employee(new_employee, self.transfer_details) + if self.new_company: + new_employee.company = self.new_company + #move user_id to new employee before insert + if employee.user_id and not self.validate_user_in_details(): + new_employee.user_id = employee.user_id + employee.db_set("user_id", "") + new_employee.insert() + self.db_set("new_employee_id", new_employee.name) + #relieve the old employee + employee.db_set("relieving_date", self.transfer_date) + employee.db_set("status", "Left") + else: + employee = update_employee(employee, self.transfer_details) + if self.new_company: + employee.company = self.new_company + employee.save() + + def on_cancel(self): + employee = frappe.get_doc("Employee", self.employee) + if self.create_new_employee_id: + if self.new_employee_id: + frappe.throw(_("Please delete the Employee {0}\ + to cancel this document").format(self.new_employee_id)) + #mark the employee as active + employee.status = "Active" + employee.relieving_date = '' + employee.save() + else: + employee = update_employee(employee, self.transfer_details, True) + employee.save() + + def validate_user_in_details(self): + for item in self.transfer_details: + if item.fieldname == "user_id" and item.new != item.current: + return True + return False From a68a1082349bc28667e1eb48a5110428bc697df6 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 13:43:15 +0530 Subject: [PATCH 050/154] Employee Promotion, Transfer - test submit before date, create new employee --- .../test_employee_promotion.py | 27 ++++++++++- .../test_employee_transfer.py | 48 ++++++++++++++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py index 8b668e7390..420bbe6b1a 100644 --- a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py +++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py @@ -5,6 +5,31 @@ from __future__ import unicode_literals import frappe import unittest +from frappe.utils import getdate, add_days +from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee class TestEmployeePromotion(unittest.TestCase): - pass + def setUp(self): + self.employee = make_employee("employee@promotions.com") + frappe.db.sql("""delete from `tabEmployee Promotion`""") + + def test_submit_before_promotion_date(self): + promotion_obj = frappe.get_doc({ + "doctype": "Employee Promotion", + "employee": self.employee, + "promotion_details" :[ + { + "property": "Designation", + "current": "Software Developer", + "new": "Project Manager", + "fieldname": "designation" + } + ] + }) + promotion_obj.promotion_date = add_days(getdate(), 1) + promotion_obj.save() + self.assertRaises(frappe.DocstatusTransitionError, promotion_obj.submit) + promotion = frappe.get_doc("Employee Promotion", promotion_obj.name) + promotion.promotion_date = getdate() + promotion.submit() + self.assertEqual(promotion.docstatus, 1) diff --git a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py index 049273e0cf..3dae1a9840 100644 --- a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py +++ b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py @@ -5,6 +5,52 @@ from __future__ import unicode_literals import frappe import unittest +from frappe.utils import getdate, add_days +from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee class TestEmployeeTransfer(unittest.TestCase): - pass + def setUp(self): + make_employee("employee2@transfers.com") + make_employee("employee3@transfers.com") + frappe.db.sql("""delete from `tabEmployee Transfer`""") + + def test_submit_before_transfer_date(self): + transfer_obj = frappe.get_doc({ + "doctype": "Employee Transfer", + "employee": frappe.get_value("Employee", {"user_id":"employee2@transfers.com"}, "name"), + "transfer_details" :[ + { + "property": "Designation", + "current": "Software Developer", + "new": "Project Manager", + "fieldname": "designation" + } + ] + }) + transfer_obj.transfer_date = add_days(getdate(), 1) + transfer_obj.save() + self.assertRaises(frappe.DocstatusTransitionError, transfer_obj.submit) + transfer = frappe.get_doc("Employee Transfer", transfer_obj.name) + transfer.transfer_date = getdate() + transfer.submit() + self.assertEqual(transfer.docstatus, 1) + + def test_new_employee_creation(self): + transfer = frappe.get_doc({ + "doctype": "Employee Transfer", + "employee": frappe.get_value("Employee", {"user_id":"employee3@transfers.com"}, "name"), + "create_new_employee_id": 1, + "transfer_date": getdate(), + "transfer_details" :[ + { + "property": "Designation", + "current": "Software Developer", + "new": "Project Manager", + "fieldname": "designation" + } + ] + }).insert() + transfer.submit() + self.assertTrue(transfer.new_employee_id) + self.assertEqual(frappe.get_value("Employee", transfer.new_employee_id, "status"), "Active") + self.assertEqual(frappe.get_value("Employee", transfer.employee, "status"), "Left") From 715780b78b2d505b966dc3922651e2dcfbdd11a4 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Sat, 5 May 2018 13:51:34 +0530 Subject: [PATCH 051/154] Employee Promotion, Transfer - documentation --- .../img/human-resources/employee_promotion.png | Bin 0 -> 47674 bytes .../human-resources/employee_promotion_1.png | Bin 0 -> 55695 bytes .../img/human-resources/employee_transfer.png | Bin 0 -> 52613 bytes .../human-resources/employee_transfer_1.png | Bin 0 -> 68601 bytes .../en/human-resources/employee_promption.md | 15 +++++++++++++++ .../en/human-resources/employee_transfer.md | 17 +++++++++++++++++ .../user/manual/en/human-resources/index.txt | 2 ++ 7 files changed, 34 insertions(+) create mode 100644 erpnext/docs/assets/img/human-resources/employee_promotion.png create mode 100644 erpnext/docs/assets/img/human-resources/employee_promotion_1.png create mode 100644 erpnext/docs/assets/img/human-resources/employee_transfer.png create mode 100644 erpnext/docs/assets/img/human-resources/employee_transfer_1.png create mode 100644 erpnext/docs/user/manual/en/human-resources/employee_promption.md create mode 100644 erpnext/docs/user/manual/en/human-resources/employee_transfer.md diff --git a/erpnext/docs/assets/img/human-resources/employee_promotion.png b/erpnext/docs/assets/img/human-resources/employee_promotion.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ca321e5aa124e06907b9b995c0cc7fcdbc54fa GIT binary patch literal 47674 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/human-resources/employee_transfer.png b/erpnext/docs/assets/img/human-resources/employee_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..edc641e2765ddc085046d2bfbb7f7267564d69c9 GIT binary patch literal 52613 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 P>>q7)12xza$3Oocf~7b5 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/human-resources/employee_transfer_1.png b/erpnext/docs/assets/img/human-resources/employee_transfer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f87e65f09aea65ed75ec14ff188af87715d6db GIT binary patch literal 68601 zcmeEuRa9I}(=Jhh1$Q6Z-7SH^-5r9v1osI(1b2rpKyY_Yg6rTe!QFMxL*Dm$|NlD| z=i&ceLZv|Ln-+{qlB9L%k3&B$Cl9nHwhJgm&&;5_Elqxw-gS&?5ql>(?vFru9> zI^T|e9N@9yLlZ=GszM71c(@k&J%z@;b5hCKDXJR3g8h;vKq_LgWou(uG|^*f+8M{MkY39E@Z}L7FPB`fa8`90GXAk5I~bl zo>ksa%*@hC%FD@2)k{Im#LLEn&lDgcj40^A|17}H%*BYz!_L;;ncqVQ@RwZv=j%Vk zEC8~;PdzGC?O(bAA<|#J@y5-w6RMU0fXb zSyrxfSlIaZ_*hukS=iZ`o;jGDJ?&kLJecgADgKD~TL#d~*~H1p(Z$Na zp6riIBVz|w7a;)PnNIdE;eQ6;zogqc{|kg?I9UErSlF0ZS^k~f#mfBu!2XBw-|T-X z^D9|-nAvIpt?bO~ou5?@09BH{6Xmde)>-%|09h51J{4x z`X3?iKVtsR?D`K}|04wcN6i13UH^ZE99+ed+JW^(9O%5c1{SKsQo7 zwm0Kpk)NUsv_aFmrtWfbT9u`vVvF#GKtRxV;`s`}O7T;#I98h1@Z#Nm@j>#sLi0Bnr46ywMhd z(DZm@_9$^HI6W?OgG%>iKKuezio6#;)Ll=xYilepuaa4(YY-?>yfxf>`c>Ej1fl}o z!r@too}1<8lV!coGh>h9qQNgMJCw4_WhTIG^Zz1();L-If`~!AL`^4AhTcpm!tsIn zk0=A!d7rna4wPC8D#P=ji$#tC_sP_Q{Hw=XRt<8Lw(ts|pw01t8Uyw&9W{Qh{H~36;Dmufk~tGCjdq8!P5-w!9y-P z<{u~;r#)Z2s8caw-(%s*LXVADmy>AIDLT1*pp|ZPI+eS6%1X{CCn@ug0LD#BofSOF zIyHN_V5Ci@Il=}x={a6Ji}+%bDS|dyoS4i3U#7E5+NNsp<;AQ}OT}nL)8TQ1!rzeN zF}0!*f85tLWRDU%R&8{mF`3|gvnw)E2=?=4>}StN&5w@YLcx7;+=zoN%{lqS z%SYH%u07!~xlMbvs_MC#c(vz5=E@JztFg} zZ+{^P*iCbwOyjuYd2e10xtY#nKQ)&ux{f)cTEJSK?$7TE1fb{FzvrqoA8#MCs09r? zW}6ip?)C*h3=Wc#Q%HC)sapZJm|<>9cL(BNGxm}ciH?@~Eb8r)I;olUFQOKlF7-{# z^Th;opa3^HopFFG{G*1sVp@l}JhS^@l4;lH<_#tJ8ckC*d|6HC;8vyc&&DnH*|haA zRn>%KkrFLN>R3JK!(MPyl12x!38Z|bA`Ne+^!O9CDGfby)vU4Kj5bd?$4}ahjJ&m~ zY?NK6iOCuHCvfHE?-8D>EbGVtPA98A(ogbyNJov%@+2hg+~we-=_EG;qkg$*{b}h> zziX~VX!jE+q5AF2hFmwgfE-p*!k!nDZ-w+B| zCfXAqcVFc?6d$VZN$>~l-ixu>N0TRljkDO0nv_?6TE5G$Agi5@obMM*sgv7Y``!$d~?K1V39XTa1 z=xAg)sc7~u=o=Q$Rdlgty5EEr^E5mbNf`QEcRsN(NlOC*3ieLQL9Mrvck`j#(6Q)K zHjHqDm(cT8+9P}Xo-YQ0(q#0F!fhOh0I5a01g#V#WQMLc`_v(1CF>##*|2fOL zTFju9Tk^QH*SV*HK^$U|ZQnZ^x%nIgd0!F-$}}fBL!N->ABpuhXdTdV1~KhBI`Ax*W9CgW*YLY?%F=L^dFMs2gmhE;Eng(5YZi+ zO8~3jM?iK0{h*$1k0`Y*4**U0JRj9Tf!(n^EgMI5!EGmmQv9o4~-tlAt)&PaV}V)Qq)VE*ZrXXShyHNeO~Y4Ddx2< zRY3xluNxK~H`9JyQr1-M+cTbUwBod^;dzrA|312p9?xG&0f=SIOjl&>^hT6T1y7|~ z9#Yo7x~}be6@iUZ&AGvQ^7u$#zBYgP=5~5rAez(r{v|0z@K1L4pRHCB)LN=n(?-c= zk7-;@5iLi3%ZTY5avAiWkE*FS!oaj@El=G#fO8Z>{j704zYELwUR)e0dxKW5_O*@W zxaJR1WD1EXnre+?Wd-sTP)Vm0=6!#$MAuAo39})l6af)khWrou9WcfL!d_f$Ncrun zO)d+4Bb5u?UXq-xxVVAu<&MuH(o=Z$Lw?yF^4_7CSlJ8524+3st269|LMKX_5}X6h zgnl!I~_ABq^h?YPJgLgJZM7*0FSwt1&!^)=( zs05JsWLtXnxq+1>Wm#B5nL%mG$qPDeVtkib7t&7s7Y1N9dK3GPt7``z54ZM8^BbU2 zdsdNF4g9nmREuh#HykrNJ8N!-?(>nH;_$xmj~oc8O&wr^)y;==s{xwgSoX!dDjMr2 z;0R$RhtmK$oT$Y_@8z4xWObkIuR|YTS4+JQNt=Y*7Q70_LgSzI5zpAd{PrMsTd4tM ziBysVwg$1vsffu;Y2OLAcnl<@Z0a{Gka_YxTh+`kvR;Z1uqd6GRxCa#m-S+z{do+W z2i73cTmHDq@QH~fYl%xJ#y#?=jPmhk)0t1a^QGyJ`BSP`VpB-l6^t8m;*iEMPHYLI8b?`7|6q}QL&t#LV1?51jAD!pTty3wgIt7{1lW3}cyx%dF`pL65WBp4=L zw6$TFL-a`y{i`T$QkE{MV(9@{b=BDg<7*EJ0NdBeAuRmZo#Rqr3JJ_S`Z6{O?WyBJ zTrpxh1xYEeEU%rhO0xkqK4+(MfyZfO$@gjTu2d!`#q>{UDaN0`z?HeT71p9@+?Ebb zA)ag!7#c-fc{C-BIhv~(KljIZA}@5qf!y;`tCr^yLA<%61mp77O+mkouBbJGa7{iV zluXfM{Q77Jq?E9ikyp@=qQ$YbbMv~fWXvK#%Su{B^Mt?57y%@iI48V z)C#6vGFId8wU{j^g}l&BA0&?I!Pg)loP9&Tf!d2Lksm}mIdzmwX+~MlM+F2D6;J{Y zF~hQ^B~W95iGp0}<70a+p~04V5QTaJ20T|H-NKG1EPO?Q^!A-RT$bSyk^loB*&r^@|S)JZ>t*}P$)c(HUjqwv^?cc0@&}{E}rDX23~x9ji@Zq2$hdrnCNUes!7V!^5g7S zw)RdQ9%j|uwAhyfQAT)8Kl9jBf7m;#krWRZh(JXjL;&@qv#zz&Lwmy#PEEz{i730z zy6IkRO*l;1?3GfPNx~=eZe$?vu%x&L^JE=+^mkY{g9w{Pu(j{}+p?!mWMtFm#_cN@ z`AQ8tOm#ZEMoo^9LpGX`G1sl!)kt`y_BN5^)(@=PKLBM0*p)Lw1wR6WsJdG!&SJ!+ zBS{d^@>9W71Z^(}C78a4NIrxt#0GPMocr(Ihk$7hnoa~*oIW^J{|p^&icU!xanqd2 zL3EynwB~pn0`HkEz+k)(3U~Fn@_6Q+Pa{fqX=T|*Yqi%nbR|(4m0o83+L*}3S~*FW zu@%L(Gt#*It~jo<%RWvP2;M7a8961H%;{6a8?{@=t`Qux{pw9Mc|FqAz#3)h;)K0b zzjdh$BrAJeY!sfn)5Amo*$rg$&s)FV@P&jY2(ItD@V|;!ww*pHH{TD-6!c!HF7W*^Fz^0em?V*|momOsUZwXm6P`fO$wY%- zE}c+ThBK_B08g~sTsK*OSnk_VpDEOex|&Nun}fge+y1Qpqr}GS!xrDZ*Gv5LFiK z$MQk;5{%al;lp#~Di^z-X}so%qZ;|0141@i(iQ}Cnri(y4r*c$oYpt845G;WcTYl$ z-_}v$ybs1t4a+S|$KB}BtH}WTtap<%32=#%=ANX_NZR1302H4T3;J`$098Ul}bPy;r6xw za*$If<6Lsh>0Nzc7o&=`!l}0sjGEORv(&Mo)d3Iz*HNz ztSlQ|>X4R0mV}h1#iIp_t{&FODJc<>ZP^YhaiJp}#pe^6z*hx!_+ zpuU@3GG$NQK|;C^@4y|N*!ys=qS zFDyha}uFT5iD)-t=`!3^m-Uf?dX_1fnwNb-kNWQF-&fw$qm*KhH+yj3O#WaIP z`Wg3~!#J7bLFTypV`X_@#z0(rb~YsLD)qcfh$oQ`4922EO2STQdD5sfML`c+O^dsh zwQV0!f-a8uQhL>wGRvj)pYvd)7S`Q6-0AFDFKib$zS^FUG_c1(zeKUpq1AwlY{ZCGReQE#MK6oVyGA_*x~D;yx>$p!2)Cn9 zv}9@b$UhR>CmfIHPvhFLQyh&vi(cX&dTiO^UPKjsxV?VjlKw~U0h`eC zNQ&+v)ys?p^wpL{`x$1w8F z!c{P@$=Blid_Eogn4xFT5j2Q0QIf-KV1^2n>-BLvH6oiaJ_34o5T10NSd!M$R^aO>6Ky*5v2P0pChb?#)S!s9DlI`h z;vGtjOre~H`siNB=de=676Q_fw-^a;^Aj-eBrw)>)3Ws74Z#J2JInDHX3$E!*| ziz{QTCA(${kdqtL;)EFCY0#sD08ErIlq*;O>h9OJ36`#iElbDY#mo=pwUu?tz(4Dq7FCT5T} zW9nuVL3hr6VJvUaOxD7}z?AQm>t-nGRFh~G^nB^ZbdZu3_N&*q)1M{7_duq7G0J6F)w*olQI8EI{evLiCOb^&CD)uyYC21_}h3V95 zP4Rb$H_&!=FkQB&)42S#Fqed*n~5mVhSOwgnj50BwuULPC~iLmxlVhOE9Lq}>6C=h zgi%vbNQ$)D&_1_>KWz~rNXFtb%PJF`K}$sJ!&#Mv9N%TXzqYw6i)&$3D1-(0I)`ez z@cG*|ice52>`jw}NO1`rLs1Fqu)fy>%6CUvV3$=K7BFvoU&|@fw{tI?`RxNbAhX-$ z=vLdqV}-X`;L7Bqq)j9RhGI-=&3IfW532Y`oIH{oMKL0md2Udvkzt|Xuz;F28;6q$ z)@9`ICCVfLxt&CLtmvWGBoeuK-+=K=KDpa85gnhAbBGCNSNSO{id=q>Wymp+Yo@iM z>|?fSrS-=U^B*Bd;^4yei?(GXVo_Gk3tnY7T#+Ib%Zc&2BGGScWfRu2DH;6;#)2D` zMJ^Z9a<&o1=ml*P=xC7Bpx2O}$-V0Vc*z5^IW15ssgxiO&gJVob{V|lNUIaQb~{+gN@RNa)~E2%umze+0hZEEGp`wqh=&>_9Hu#AD$JeRZTaet@`;Q z_qMruuXG3*0X6IiXq>f?J8TbN$u zA>no%2*c9`#4_4lHG5OfSt}$E)e#Gir+BwW=a8Lw^NX2kcx39oj8(`b!|z1v4tPXL zpgZ?;%{>w}4~0d>Ge3Oa(Hb4onZN;4_YKXZrsfK4^^U3=&2C4d_d_qMqQ0^LU@>M? zQ}P27+$0qxrD3stUK$w6riEVqHl)SXjX|=R^_`MB8Hj@rU21FF#A8kOOi*O)MACBB zzO}H9fwH#YXHEu_BIA<~ia`|T?W;VqupX(&V2;;~5%De>iE(&4)xiO5Zw4s~Bk(cr z^cFA{>+36RMKy{g=-s&Myx_Alq*H?mX}c`7u$eohq$4i!zNVmIW9E&YXHHWoiFQ