From 885c70984d3f0c4a744a162e0638ea1e59afdb60 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2015 16:48:03 +0530 Subject: [PATCH 1/3] [fix] Always show Sales invoice in Gross profit report --- erpnext/accounts/report/gross_profit/gross_profit.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 716cc3d4f6..9b688109d9 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -175,16 +175,15 @@ class GrossProfitGenerator(object): else: if row.update_stock or row.dn_detail: + parenttype, parent, item_row = row.parenttype, row.parent, row.item_row if row.dn_detail: - row.parenttype = "Delivery Note" - row.parent = row.delivery_note - row.item_row = row.dn_detail + parenttype, parent, item_row = "Delivery Note", row.delivery_note, row.dn_detail my_sle = self.sle.get((item_code, row.warehouse)) for i, sle in enumerate(my_sle): # find the stock valution rate from stock ledger entry - if sle.voucher_type == row.parenttype and row.parent == sle.voucher_no and \ - sle.voucher_detail_no == row.item_row: + if sle.voucher_type == parenttype and parent == sle.voucher_no and \ + sle.voucher_detail_no == item_row: previous_stock_value = len(my_sle) > i+1 and \ flt(my_sle[i+1].stock_value) or 0.0 return previous_stock_value - flt(sle.stock_value) From f92465981c97f2a31aec943bf5aae504f04d489a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2015 16:48:47 +0530 Subject: [PATCH 2/3] datetime issue fixed in maintenance schedule --- .../doctype/maintenance_schedule/maintenance_schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py index 23989507ac..0ecc9c0c94 100644 --- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import add_days, getdate, cint +from frappe.utils import add_days, getdate, cint, cstr from frappe import throw, _ from erpnext.utilities.transaction_base import TransactionBase, delete_events @@ -73,7 +73,7 @@ class MaintenanceSchedule(TransactionBase): "owner": email_map[d.sales_person] or self.owner, "subject": description, "description": description, - "starts_on": key["scheduled_date"] + " 10:00:00", + "starts_on": cstr(key["scheduled_date"]) + " 10:00:00", "event_type": "Private", "ref_type": self.doctype, "ref_name": self.name From fdd0db3459dd0a0cc55833e9d071d67d88cbc4ec Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2015 16:53:19 +0530 Subject: [PATCH 3/3] Update project completion percentage and costing after syncing task --- erpnext/projects/doctype/project/project.py | 18 ++++++++++++++---- erpnext/projects/doctype/task/task.py | 11 ++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 0ba368d5ba..6ebafdba59 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -46,6 +46,8 @@ class Project(Document): """sync tasks and remove table""" if self.flags.dont_sync_tasks: return + + task_added_or_deleted = False task_names = [] for t in self.tasks: if t.task_id: @@ -53,6 +55,7 @@ class Project(Document): else: task = frappe.new_doc("Task") task.project = self.name + task_added_or_deleted = True task.update({ "subject": t.title, @@ -70,15 +73,22 @@ class Project(Document): # delete for t in frappe.get_all("Task", ["name"], {"project": self.name, "name": ("not in", task_names)}): frappe.delete_doc("Task", t.name) + task_added_or_deleted = True + + if task_added_or_deleted: + self.update_project() + + def update_project(self): + self.update_percent_complete() + self.update_costing() def update_percent_complete(self): - total = frappe.db.sql("""select count(*) from tabTask where project=%s""", - self.name)[0][0] + total = frappe.db.sql("""select count(*) from tabTask where project=%s""", self.name)[0][0] if total: completed = frappe.db.sql("""select count(*) from tabTask where project=%s and status in ('Closed', 'Cancelled')""", self.name)[0][0] - frappe.db.set_value("Project", self.name, "percent_complete", - int(float(completed) / total * 100)) + + self.percent_complete = flt(completed) / total * 100 def update_costing(self): total_cost = frappe.db.sql("""select sum(total_costing_amount) as costing_amount, diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index f5541cc0e5..7229203395 100644 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -43,15 +43,8 @@ class Task(Document): def on_update(self): self.check_recursion() self.reschedule_dependent_tasks() - self.update_percentage() self.update_project() - def update_percentage(self): - """update percent complete in project""" - if self.project and not self.flags.from_project: - project = frappe.get_doc("Project", self.project) - project.run_method("update_percent_complete") - def update_total_expense_claim(self): self.total_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) from `tabExpense Claim` where project = %s and task = %s and approval_status = "Approved" and docstatus=1""",(self.project, self.name)) @@ -70,10 +63,10 @@ class Task(Document): self.act_end_date= tl.end_date def update_project(self): - if self.project and frappe.db.exists("Project", self.project): + if self.project and not self.flags.from_project: project = frappe.get_doc("Project", self.project) project.flags.dont_sync_tasks = True - project.update_costing() + project.update_project() project.save() def check_recursion(self):