fix: Missing commits from hotfix branch (#17997)

* fix: merge conflict

* fix: restored missing set_gst_state_and_state_number function

* fix: style linting as per codacy

* fix: Fixes related to customer/lead merging

* fix: merge conflict

* fix: Fixes related to customer/lead merging

* fix: Assign isue/opportunity to user

* fix: Assign isue/opportunity to user

* fix: Replaced Invoice type by GST Category

* fix: merge conflict

* fix: merge conflict

* fix: test cases

* fix: test cases
This commit is contained in:
Nabin Hait
2019-07-03 10:34:31 +05:30
committed by GitHub
parent 7763d0a059
commit 34c551d9a5
194 changed files with 34197 additions and 21884 deletions

View File

@@ -30,13 +30,14 @@ class Project(Document):
self.update_costing()
def __setup__(self):
def before_print(self):
self.onload()
def load_tasks(self):
"""Load `tasks` from the database"""
if frappe.flags.in_import:
return
project_task_custom_fields = frappe.get_all("Custom Field", {"dt": "Project Task"}, "fieldname")
self.tasks = []
for task in self.get_tasks():
@@ -50,7 +51,7 @@ class Project(Document):
"task_weight": task.task_weight
}
self.map_custom_fields(task, task_map)
self.map_custom_fields(task, task_map, project_task_custom_fields)
self.append("tasks", task_map)
@@ -76,7 +77,7 @@ class Project(Document):
self.copy_from_template()
self.validate_dates()
self.send_welcome_email()
self.update_percent_complete()
self.update_percent_complete(from_validate=True)
def copy_from_template(self):
'''
@@ -181,7 +182,7 @@ class Project(Document):
"task_weight": t.task_weight
})
self.map_custom_fields(t, task)
self.map_custom_fields(t, task, custom_fields)
task.flags.ignore_links = True
task.flags.from_project = True
@@ -205,10 +206,6 @@ class Project(Document):
for t in frappe.get_all("Task", ["name"], {"project": self.name, "name": ("not in", task_names)}):
self.deleted_task_list.append(t.name)
def update_costing_and_percentage_complete(self):
self.update_percent_complete()
self.update_costing()
def is_row_updated(self, row, existing_task_data, fields):
if self.get("__islocal") or not existing_task_data: return True
@@ -218,10 +215,8 @@ class Project(Document):
if row.get(field) != d.get(field):
return True
def map_custom_fields(self, source, target):
project_task_custom_fields = frappe.get_all("Custom Field", {"dt": "Project Task"}, "fieldname")
for field in project_task_custom_fields:
def map_custom_fields(self, source, target, custom_fields):
for field in custom_fields:
target.update({
field.fieldname: source.get(field.fieldname)
})
@@ -229,15 +224,13 @@ class Project(Document):
def update_project(self):
self.update_percent_complete()
self.update_costing()
self.flags.dont_sync_tasks = True
self.save(ignore_permissions=True)
def after_insert(self):
self.copy_from_template()
if self.sales_order:
frappe.db.set_value("Sales Order", self.sales_order, "project", self.name)
def update_percent_complete(self):
def update_percent_complete(self, from_validate=False):
if not self.tasks: return
total = frappe.db.sql("""select count(name) from tabTask where project=%s""", self.name)[0][0]
@@ -275,6 +268,9 @@ class Project(Document):
else:
self.status = "Open"
if not from_validate:
self.db_update()
def update_costing(self):
from_time_sheet = frappe.db.sql("""select
sum(costing_amount) as costing_amount,
@@ -301,6 +297,7 @@ class Project(Document):
self.update_sales_amount()
self.update_billed_amount()
self.calculate_gross_margin()
self.db_update()
def calculate_gross_margin(self):
expense_amount = (flt(self.total_costing_amount) + flt(self.total_expense_claim)
@@ -354,7 +351,7 @@ class Project(Document):
def on_update(self):
self.delete_task()
self.load_tasks()
self.update_costing_and_percentage_complete()
self.update_project()
self.update_dependencies_on_duplicated_project()
def delete_task(self):
@@ -658,4 +655,3 @@ def set_project_status(project, status):
project.status = status
project.save()

View File

@@ -32,23 +32,6 @@ class TestProject(unittest.TestCase):
self.assertEqual(task4.title, 'Task 4')
self.assertEqual(getdate(task4.end_date), getdate('2019-01-06'))
def test_bulk_complete_and_cancel(self):
frappe.db.sql('delete from tabTask where project = "Test Project for Bulk Actions"')
frappe.delete_doc('Project', 'Test Project for Bulk Actions')
project = get_project('Test Project for Bulk Actions')
set_project_status(project.name, 'Completed')
# check all tasks are completed
self.assertTrue(all([d.status=='Completed' for d in
frappe.get_all('Task', ['name', 'status'], dict(project = project.name))]))
# check all tasks are cancelled
set_project_status(project.name, 'Cancelled')
self.assertTrue(all([d.status=='Cancelled' for d in
frappe.get_all('Task', ['name', 'status'], dict(project = project.name))]))
def get_project(name):
template = get_project_template()

View File

@@ -19,7 +19,7 @@ frappe.ui.form.on("Task", {
},
refresh: function(frm) {
frm.fields_dict['parent_task'].get_query = function() {
frm.fields_dict['parent_task'].get_query = function () {
return {
filters: {
"is_group": 1,
@@ -27,8 +27,22 @@ frappe.ui.form.on("Task", {
}
}
if(!frm.doc.is_group){
if (!frm.doc.is_group) {
if (!frm.is_new()) {
if (frappe.model.can_read("Timesheet")) {
frm.add_custom_button(__("Timesheet"), () => {
frappe.route_options = { "project": frm.doc.project, "task": frm.doc.name }
frappe.set_route("List", "Timesheet");
}, __("View"), true);
}
if (frappe.model.can_read("Expense Claim")) {
frm.add_custom_button(__("Expense Claims"), () => {
frappe.route_options = { "project": frm.doc.project, "task": frm.doc.name };
frappe.set_route("List", "Expense Claim");
}, __("View"), true);
}
if (frm.perm[0].write) {
if (!["Closed", "Cancelled"].includes(frm.doc.status)) {
frm.add_custom_button(__("Close"), () => {

View File

@@ -1,380 +1,381 @@
{
"allow_import": 1,
"autoname": "TASK-.YYYY.-.#####",
"creation": "2013-01-29 19:25:50",
"doctype": "DocType",
"document_type": "Setup",
"field_order": [
"subject",
"project",
"issue",
"type",
"is_group",
"column_break0",
"status",
"priority",
"task_weight",
"color",
"parent_task",
"sb_timeline",
"exp_start_date",
"expected_time",
"column_break_11",
"exp_end_date",
"progress",
"is_milestone",
"sb_details",
"description",
"sb_depends_on",
"depends_on",
"depends_on_tasks",
"sb_actual",
"act_start_date",
"actual_time",
"column_break_15",
"act_end_date",
"sb_costing",
"total_costing_amount",
"total_expense_claim",
"column_break_20",
"total_billing_amount",
"sb_more_info",
"review_date",
"closing_date",
"column_break_22",
"department",
"company",
"lft",
"rgt",
"old_parent"
],
"fields": [
{
"fieldname": "subject",
"fieldtype": "Data",
"in_global_search": 1,
"label": "Subject",
"reqd": 1,
"search_index": 1
},
{
"bold": 1,
"fieldname": "project",
"fieldtype": "Link",
"in_global_search": 1,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Project",
"oldfieldname": "project",
"oldfieldtype": "Link",
"options": "Project",
"remember_last_selected_value": 1,
"search_index": 1
},
{
"fieldname": "issue",
"fieldtype": "Link",
"label": "Issue",
"options": "Issue"
},
{
"fieldname": "type",
"fieldtype": "Link",
"label": "Type",
"options": "Task Type"
},
{
"bold": 1,
"default": "0",
"fieldname": "is_group",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Is Group"
},
{
"fieldname": "column_break0",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"print_width": "50%",
"width": "50%"
},
{
"bold": 1,
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Status",
"no_copy": 1,
"oldfieldname": "status",
"oldfieldtype": "Select",
"options": "Open\nWorking\nPending Review\nOverdue\nCompleted\nCancelled"
},
{
"fieldname": "priority",
"fieldtype": "Select",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Priority",
"oldfieldname": "priority",
"oldfieldtype": "Select",
"options": "Low\nMedium\nHigh\nUrgent",
"search_index": 1
},
{
"fieldname": "color",
"fieldtype": "Color",
"label": "Color"
},
{
"bold": 1,
"fieldname": "parent_task",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Parent Task",
"options": "Task",
"search_index": 1
},
{
"collapsible": 1,
"collapsible_depends_on": "eval:doc.__islocal",
"fieldname": "sb_timeline",
"fieldtype": "Section Break",
"label": "Timeline"
},
{
"fieldname": "exp_start_date",
"fieldtype": "Date",
"label": "Expected Start Date",
"oldfieldname": "exp_start_date",
"oldfieldtype": "Date"
},
{
"default": "0",
"fieldname": "expected_time",
"fieldtype": "Float",
"label": "Expected Time (in hours)",
"oldfieldname": "exp_total_hrs",
"oldfieldtype": "Data"
},
{
"fetch_from": "type.weight",
"fieldname": "task_weight",
"fieldtype": "Float",
"label": "Weight"
},
{
"fieldname": "column_break_11",
"fieldtype": "Column Break"
},
{
"bold": 1,
"fieldname": "exp_end_date",
"fieldtype": "Date",
"label": "Expected End Date",
"oldfieldname": "exp_end_date",
"oldfieldtype": "Date",
"search_index": 1
},
{
"fieldname": "progress",
"fieldtype": "Percent",
"label": "% Progress"
},
{
"fieldname": "is_milestone",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Is Milestone"
},
{
"fieldname": "sb_details",
"fieldtype": "Section Break",
"label": "Details",
"oldfieldtype": "Section Break"
},
{
"fieldname": "description",
"fieldtype": "Text Editor",
"in_preview": 1,
"label": "Task Description",
"oldfieldname": "description",
"oldfieldtype": "Text Editor",
"print_width": "300px",
"width": "300px"
},
{
"fieldname": "sb_depends_on",
"fieldtype": "Section Break",
"label": "Dependencies",
"oldfieldtype": "Section Break"
},
{
"fieldname": "depends_on",
"fieldtype": "Table",
"label": "Dependent Tasks",
"options": "Task Depends On"
},
{
"fieldname": "depends_on_tasks",
"fieldtype": "Code",
"hidden": 1,
"label": "Depends on Tasks",
"read_only": 1
},
{
"fieldname": "sb_actual",
"fieldtype": "Section Break",
"oldfieldtype": "Column Break",
"print_width": "50%",
"width": "50%"
},
{
"fieldname": "act_start_date",
"fieldtype": "Date",
"label": "Actual Start Date (via Time Sheet)",
"oldfieldname": "act_start_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"fieldname": "actual_time",
"fieldtype": "Float",
"label": "Actual Time (in hours)",
"read_only": 1
},
{
"fieldname": "column_break_15",
"fieldtype": "Column Break"
},
{
"fieldname": "act_end_date",
"fieldtype": "Date",
"label": "Actual End Date (via Time Sheet)",
"oldfieldname": "act_end_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "sb_costing",
"fieldtype": "Section Break",
"label": "Costing"
},
{
"fieldname": "total_costing_amount",
"fieldtype": "Currency",
"label": "Total Costing Amount (via Time Sheet)",
"oldfieldname": "actual_budget",
"oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "total_expense_claim",
"fieldtype": "Currency",
"label": "Total Expense Claim (via Expense Claim)",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "column_break_20",
"fieldtype": "Column Break"
},
{
"fieldname": "total_billing_amount",
"fieldtype": "Currency",
"label": "Total Billing Amount (via Time Sheet)",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "sb_more_info",
"fieldtype": "Section Break",
"label": "More Info"
},
{
"depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"",
"fieldname": "review_date",
"fieldtype": "Date",
"label": "Review Date",
"oldfieldname": "review_date",
"oldfieldtype": "Date"
},
{
"depends_on": "eval:doc.status == \"Closed\"",
"fieldname": "closing_date",
"fieldtype": "Date",
"label": "Closing Date",
"oldfieldname": "closing_date",
"oldfieldtype": "Date"
},
{
"fieldname": "column_break_22",
"fieldtype": "Column Break"
},
{
"fieldname": "department",
"fieldtype": "Link",
"label": "Department",
"options": "Department"
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"remember_last_selected_value": 1
},
{
"fieldname": "lft",
"fieldtype": "Int",
"hidden": 1,
"label": "lft",
"read_only": 1
},
{
"fieldname": "rgt",
"fieldtype": "Int",
"hidden": 1,
"label": "rgt",
"read_only": 1
},
{
"fieldname": "old_parent",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 1,
"label": "Old Parent",
"read_only": 1
}
],
"icon": "fa fa-check",
"idx": 1,
"max_attachments": 5,
"modified": "2019-05-16 09:51:15.599416",
"modified_by": "Administrator",
"module": "Projects",
"name": "Task",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Projects User",
"share": 1,
"write": 1
}
],
"search_fields": "subject",
"show_name_in_global_search": 1,
"show_preview_popup": 1,
"sort_order": "DESC",
"timeline_field": "project",
"title_field": "subject",
"track_seen": 1
}
"allow_import": 1,
"autoname": "TASK-.YYYY.-.#####",
"creation": "2013-01-29 19:25:50",
"doctype": "DocType",
"document_type": "Setup",
"field_order": [
"subject",
"project",
"issue",
"type",
"is_group",
"column_break0",
"status",
"priority",
"task_weight",
"color",
"parent_task",
"sb_timeline",
"exp_start_date",
"expected_time",
"column_break_11",
"exp_end_date",
"progress",
"is_milestone",
"sb_details",
"description",
"sb_depends_on",
"depends_on",
"depends_on_tasks",
"sb_actual",
"act_start_date",
"actual_time",
"column_break_15",
"act_end_date",
"sb_costing",
"total_costing_amount",
"total_expense_claim",
"column_break_20",
"total_billing_amount",
"sb_more_info",
"review_date",
"closing_date",
"column_break_22",
"department",
"company",
"lft",
"rgt",
"old_parent"
],
"fields": [
{
"fieldname": "subject",
"fieldtype": "Data",
"in_global_search": 1,
"label": "Subject",
"reqd": 1,
"search_index": 1,
"in_standard_filter": 1
},
{
"bold": 1,
"fieldname": "project",
"fieldtype": "Link",
"in_global_search": 1,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Project",
"oldfieldname": "project",
"oldfieldtype": "Link",
"options": "Project",
"remember_last_selected_value": 1,
"search_index": 1
},
{
"fieldname": "issue",
"fieldtype": "Link",
"label": "Issue",
"options": "Issue"
},
{
"fieldname": "type",
"fieldtype": "Link",
"label": "Type",
"options": "Task Type"
},
{
"bold": 1,
"default": "0",
"fieldname": "is_group",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Is Group"
},
{
"fieldname": "column_break0",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"print_width": "50%",
"width": "50%"
},
{
"bold": 1,
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Status",
"no_copy": 1,
"oldfieldname": "status",
"oldfieldtype": "Select",
"options": "Open\nWorking\nPending Review\nOverdue\nCompleted\nCancelled"
},
{
"fieldname": "priority",
"fieldtype": "Select",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Priority",
"oldfieldname": "priority",
"oldfieldtype": "Select",
"options": "Low\nMedium\nHigh\nUrgent",
"search_index": 1
},
{
"fieldname": "color",
"fieldtype": "Color",
"label": "Color"
},
{
"bold": 1,
"fieldname": "parent_task",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Parent Task",
"options": "Task",
"search_index": 1
},
{
"collapsible": 1,
"collapsible_depends_on": "eval:doc.__islocal",
"fieldname": "sb_timeline",
"fieldtype": "Section Break",
"label": "Timeline"
},
{
"fieldname": "exp_start_date",
"fieldtype": "Date",
"label": "Expected Start Date",
"oldfieldname": "exp_start_date",
"oldfieldtype": "Date"
},
{
"default": "0",
"fieldname": "expected_time",
"fieldtype": "Float",
"label": "Expected Time (in hours)",
"oldfieldname": "exp_total_hrs",
"oldfieldtype": "Data"
},
{
"fetch_from": "type.weight",
"fieldname": "task_weight",
"fieldtype": "Float",
"label": "Weight"
},
{
"fieldname": "column_break_11",
"fieldtype": "Column Break"
},
{
"bold": 1,
"fieldname": "exp_end_date",
"fieldtype": "Date",
"label": "Expected End Date",
"oldfieldname": "exp_end_date",
"oldfieldtype": "Date",
"search_index": 1
},
{
"fieldname": "progress",
"fieldtype": "Percent",
"label": "% Progress"
},
{
"fieldname": "is_milestone",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Is Milestone"
},
{
"fieldname": "sb_details",
"fieldtype": "Section Break",
"label": "Details",
"oldfieldtype": "Section Break"
},
{
"fieldname": "description",
"fieldtype": "Text Editor",
"in_preview": 1,
"label": "Task Description",
"oldfieldname": "description",
"oldfieldtype": "Text Editor",
"print_width": "300px",
"width": "300px"
},
{
"fieldname": "sb_depends_on",
"fieldtype": "Section Break",
"label": "Dependencies",
"oldfieldtype": "Section Break"
},
{
"fieldname": "depends_on",
"fieldtype": "Table",
"label": "Dependent Tasks",
"options": "Task Depends On"
},
{
"fieldname": "depends_on_tasks",
"fieldtype": "Code",
"hidden": 1,
"label": "Depends on Tasks",
"read_only": 1
},
{
"fieldname": "sb_actual",
"fieldtype": "Section Break",
"oldfieldtype": "Column Break",
"print_width": "50%",
"width": "50%"
},
{
"fieldname": "act_start_date",
"fieldtype": "Date",
"label": "Actual Start Date (via Time Sheet)",
"oldfieldname": "act_start_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"fieldname": "actual_time",
"fieldtype": "Float",
"label": "Actual Time (in hours)",
"read_only": 1
},
{
"fieldname": "column_break_15",
"fieldtype": "Column Break"
},
{
"fieldname": "act_end_date",
"fieldtype": "Date",
"label": "Actual End Date (via Time Sheet)",
"oldfieldname": "act_end_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "sb_costing",
"fieldtype": "Section Break",
"label": "Costing"
},
{
"fieldname": "total_costing_amount",
"fieldtype": "Currency",
"label": "Total Costing Amount (via Time Sheet)",
"oldfieldname": "actual_budget",
"oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "total_expense_claim",
"fieldtype": "Currency",
"label": "Total Expense Claim (via Expense Claim)",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "column_break_20",
"fieldtype": "Column Break"
},
{
"fieldname": "total_billing_amount",
"fieldtype": "Currency",
"label": "Total Billing Amount (via Time Sheet)",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "sb_more_info",
"fieldtype": "Section Break",
"label": "More Info"
},
{
"depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"",
"fieldname": "review_date",
"fieldtype": "Date",
"label": "Review Date",
"oldfieldname": "review_date",
"oldfieldtype": "Date"
},
{
"depends_on": "eval:doc.status == \"Closed\"",
"fieldname": "closing_date",
"fieldtype": "Date",
"label": "Closing Date",
"oldfieldname": "closing_date",
"oldfieldtype": "Date"
},
{
"fieldname": "column_break_22",
"fieldtype": "Column Break"
},
{
"fieldname": "department",
"fieldtype": "Link",
"label": "Department",
"options": "Department"
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"remember_last_selected_value": 1
},
{
"fieldname": "lft",
"fieldtype": "Int",
"hidden": 1,
"label": "lft",
"read_only": 1
},
{
"fieldname": "rgt",
"fieldtype": "Int",
"hidden": 1,
"label": "rgt",
"read_only": 1
},
{
"fieldname": "old_parent",
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 1,
"label": "Old Parent",
"read_only": 1
}
],
"icon": "fa fa-check",
"idx": 1,
"max_attachments": 5,
"modified": "2019-06-19 09:51:15.599416",
"modified_by": "Administrator",
"module": "Projects",
"name": "Task",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Projects User",
"share": 1,
"write": 1
}
],
"search_fields": "subject",
"show_name_in_global_search": 1,
"show_preview_popup": 1,
"sort_order": "DESC",
"timeline_field": "project",
"title_field": "subject",
"track_seen": 1
}

View File

@@ -164,7 +164,6 @@ class Task(NestedSet):
if task.get('task_id') == self.name:
frappe.delete_doc('Project Task', task.name)
self.update_nsm_model()
def update_status(self):