From c0f2e6dd23ea62c25638f5ddc37f5cb17ee99478 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 16 Jan 2013 07:47:33 +0530 Subject: [PATCH] timesheet fix --- projects/doctype/timesheet/timesheet.py | 132 ++++++++++++------------ 1 file changed, 68 insertions(+), 64 deletions(-) diff --git a/projects/doctype/timesheet/timesheet.py b/projects/doctype/timesheet/timesheet.py index c2b296f371..4f4d824347 100644 --- a/projects/doctype/timesheet/timesheet.py +++ b/projects/doctype/timesheet/timesheet.py @@ -8,14 +8,15 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . from __future__ import unicode_literals import webnotes +import time, datetime from webnotes.utils import cint, cstr, getdate, now, nowdate from webnotes.model import db_exists @@ -23,68 +24,71 @@ from webnotes.model.wrapper import getlist, copy_doclist from webnotes import msgprint sql = webnotes.conn.sql - - class DocType: - def __init__(self,doc,doclist=[]): - self.doc = doc - self.doclist = doclist - - def get_customer_details(self, project_name): - cust = sql("select customer, customer_name from `tabProject` where name = %s", project_name) - if cust: - ret = {'customer': cust and cust[0][0] or '', 'customer_name': cust and cust[0][1] or ''} - return (ret) - - def get_task_details(self, task_sub): - tsk = sql("select name, project, customer, customer_name from `tabTask` where subject = %s", task_sub) - if tsk: - ret = {'task_id': tsk and tsk[0][0] or '', 'project_name': tsk and tsk[0][1] or '', 'customer_name': tsk and tsk[0][3] or ''} - return ret - - def validate(self): - if getdate(self.doc.timesheet_date) > getdate(nowdate()): - msgprint("You can not prepare timesheet for future date") - raise Exception - - chk = sql("select name from `tabTimesheet` where timesheet_date=%s and owner=%s and status!='Cancelled' and name!=%s", (self.doc.timesheet_date, self.doc.owner, self.doc.name)) - if chk: - msgprint("You have already created timesheet "+ cstr(chk and chk[0][0] or '')+" for this date.") - raise Exception + def __init__(self,doc,doclist=[]): + self.doc = doc + self.doclist = doclist + + def get_customer_details(self, project_name): + cust = sql("select customer, customer_name from `tabProject` where name = %s", project_name) + if cust: + ret = {'customer': cust and cust[0][0] or '', 'customer_name': cust and cust[0][1] or ''} + return (ret) + + def get_task_details(self, task_sub): + tsk = sql("select name, project, customer, customer_name from `tabTask` where subject = %s", task_sub) + if tsk: + ret = {'task_id': tsk and tsk[0][0] or '', 'project_name': tsk and tsk[0][1] or '', 'customer_name': tsk and tsk[0][3] or ''} + return ret + + def get_time(self, timestr): + if len(timestr.split(":"))==2: + format = "%H:%M" + else: + format = "%H:%M:%S" + + return time.strptime(timestr, format) + + def validate(self): + if getdate(self.doc.timesheet_date) > getdate(nowdate()): + msgprint("You can not prepare timesheet for future date") + raise Exception + + chk = sql("select name from `tabTimesheet` where timesheet_date=%s and owner=%s and status!='Cancelled' and name!=%s", (self.doc.timesheet_date, self.doc.owner, self.doc.name)) + if chk: + msgprint("You have already created timesheet "+ cstr(chk and chk[0][0] or '')+" for this date.") + raise Exception - import time - for d in getlist(self.doclist, 'timesheet_details'): - if d.act_start_time and d.act_end_time: - d1 = time.strptime(d.act_start_time, "%H:%M") - d2 = time.strptime(d.act_end_time, "%H:%M") - - if d1 > d2: - msgprint("Start time can not be greater than end time. Check for Task Id : "+cstr(d.task_id)) - raise Exception - elif d1 == d2: - msgprint("Start time and end time can not be same. Check for Task Id : "+cstr(d.task_id)) - raise Exception - - def calculate_total_hr(self): - import datetime - import time - for d in getlist(self.doclist, 'timesheet_details'): - x1 = d.act_start_time.split(":") - x2 = d.act_end_time.split(":") - - d1 = datetime.timedelta(minutes=cint(x1[1]), hours=cint(x1[0])) - d2 = datetime.timedelta(minutes=cint(x2[1]), hours=cint(x2[0])) - d3 = (d2 - d1).seconds - d.act_total_hrs = time.strftime("%H:%M", time.gmtime(d3)) - sql("update `tabTimesheet Detail` set act_total_hrs = %s where parent=%s and name=%s", (d.act_total_hrs,self.doc.name,d.name)) - - def on_update(self): - self.calculate_total_hr() - webnotes.conn.set(self.doc, 'status', 'Draft') - - def on_submit(self): - webnotes.conn.set(self.doc, 'status', 'Submitted') - - def on_cancel(self): - webnotes.conn.set(self.doc, 'status', 'Cancelled') \ No newline at end of file + for d in getlist(self.doclist, 'timesheet_details'): + if d.act_start_time and d.act_end_time: + d1 = self.get_time(d.act_start_time) + d2 = self.get_time(d.act_end_time) + + if d1 > d2: + msgprint("Start time can not be greater than end time. Check for Task Id : "+cstr(d.task_id)) + raise Exception + elif d1 == d2: + msgprint("Start time and end time can not be same. Check for Task Id : "+cstr(d.task_id)) + raise Exception + + def calculate_total_hr(self): + for d in getlist(self.doclist, 'timesheet_details'): + x1 = d.act_start_time.split(":") + x2 = d.act_end_time.split(":") + + d1 = datetime.timedelta(minutes=cint(x1[1]), hours=cint(x1[0])) + d2 = datetime.timedelta(minutes=cint(x2[1]), hours=cint(x2[0])) + d3 = (d2 - d1).seconds + d.act_total_hrs = time.strftime("%H:%M:%S", time.gmtime(d3)) + sql("update `tabTimesheet Detail` set act_total_hrs = %s where parent=%s and name=%s", (d.act_total_hrs,self.doc.name,d.name)) + + def on_update(self): + self.calculate_total_hr() + webnotes.conn.set(self.doc, 'status', 'Draft') + + def on_submit(self): + webnotes.conn.set(self.doc, 'status', 'Submitted') + + def on_cancel(self): + webnotes.conn.set(self.doc, 'status', 'Cancelled') \ No newline at end of file