[projects] added ganttview, removed old timesheet
This commit is contained in:
parent
0716e5ce09
commit
f79e3451dd
@ -34,7 +34,7 @@
|
||||
"type": "module",
|
||||
"link": "projects-home",
|
||||
"color": "#8e44ad",
|
||||
"icon": "icon-tasks"
|
||||
"icon": "icon-puzzle-piece"
|
||||
},
|
||||
"Manufacturing": {
|
||||
"type": "module",
|
||||
|
@ -15,20 +15,16 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// show tasks
|
||||
wn.require("public/app/js/gantt_task.js");
|
||||
|
||||
cur_frm.cscript.refresh = function(doc) {
|
||||
if(!doc.__islocal) {
|
||||
// refresh gantt chart
|
||||
wn.require('app/projects/gantt_task.js');
|
||||
if(!cur_frm.gantt_area)
|
||||
cur_frm.gantt_area = $('<div>')
|
||||
.appendTo(cur_frm.fields_dict.project_tasks.wrapper);
|
||||
cur_frm.gantt_area.empty();
|
||||
erpnext.show_task_gantt(cur_frm.gantt_area, cur_frm.docname);
|
||||
} else {
|
||||
if(cur_frm.gantt_area)
|
||||
cur_frm.gantt_area.empty();
|
||||
cur_frm.add_custom_button("Gantt Chart", function() {
|
||||
wn.route_options = {"project": doc.name}
|
||||
wn.set_route("Gantt", "Task");
|
||||
}, "icon-tasks");
|
||||
cur_frm.add_custom_button("Tasks", function() {
|
||||
wn.route_options = {"project": doc.name}
|
||||
wn.set_route("List", "Task");
|
||||
}, "icon-list");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,57 +18,14 @@ from __future__ import unicode_literals
|
||||
import webnotes
|
||||
|
||||
from webnotes.utils import flt, getdate
|
||||
from webnotes.model import db_exists
|
||||
from webnotes.model.doc import Document
|
||||
from webnotes.model.bean import copy_doclist
|
||||
from webnotes import msgprint
|
||||
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
|
||||
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
|
||||
# Get Customer Details along with its primary contact details
|
||||
# ==============================================================
|
||||
def get_customer_details(self):
|
||||
details =sql("select address, territory, customer_group,customer_name from `tabCustomer` where name=%s and docstatus!=2",(self.doc.customer),as_dict=1)
|
||||
if details:
|
||||
ret = {
|
||||
'customer_address' : details and details[0]['address'] or '',
|
||||
'territory' : details and details[0]['territory'] or '',
|
||||
'customer_group' : details and details[0]['customer_group'] or '',
|
||||
'customer_name' : details and details[0]['customer_name'] or ''
|
||||
}
|
||||
#get primary contact details(this is done separately coz. , if join query used & no primary contact thn it would not be able to fetch customer details)
|
||||
contact_det = sql("select contact_name, phone, email_id from `tabContact` where customer_name='%s' and is_customer=1 and is_primary_contact=1 and docstatus!=2" %(self.doc.customer), as_dict = 1)
|
||||
ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
|
||||
ret['contact_no'] = contact_det and contact_det[0]['phone'] or ''
|
||||
ret['email_id'] = contact_det and contact_det[0]['email_id'] or ''
|
||||
return ret
|
||||
else:
|
||||
msgprint("Customer : %s does not exist in system." % (self.doc.customer))
|
||||
raise Exception
|
||||
|
||||
# Get customer's contact person details
|
||||
# ==============================================================
|
||||
def get_contact_details(self):
|
||||
contact = sql("select contact_no, email_id from `tabContact` where contact_name = '%s' and customer_name = '%s' and docstatus != 2" %(self.doc,contact_person,self.doc.customer), as_dict=1)
|
||||
if contact:
|
||||
ret = {
|
||||
'contact_no' : contact and contact[0]['contact_no'] or '',
|
||||
'email_id' : contact and contact[0]['email_id'] or ''
|
||||
}
|
||||
return ret
|
||||
else:
|
||||
msgprint("Contact Person : %s does not exist in the system." % (self.doc,contact_person))
|
||||
raise Exception
|
||||
|
||||
#calculate gross profit
|
||||
#=============================================
|
||||
def get_gross_profit(self):
|
||||
pft, per_pft =0, 0
|
||||
pft = flt(self.doc.project_value) - flt(self.doc.est_material_cost)
|
||||
@ -77,16 +34,15 @@ class DocType:
|
||||
ret = {'gross_margin_value': pft, 'per_gross_margin': per_pft}
|
||||
return ret
|
||||
|
||||
# validate
|
||||
#================================================
|
||||
def validate(self):
|
||||
"""validate start date before end date"""
|
||||
if self.doc.project_start_date and self.doc.completion_date:
|
||||
if getdate(self.doc.completion_date) < getdate(self.doc.project_start_date):
|
||||
msgprint("Expected Completion Date can not be less than Project Start Date")
|
||||
raise Exception
|
||||
|
||||
def on_update(self):
|
||||
# update milestones
|
||||
"""add events for milestones"""
|
||||
webnotes.conn.sql("""delete from tabEvent where ref_type='Project' and ref_name=%s""",
|
||||
self.doc.name)
|
||||
for d in self.doclist:
|
||||
@ -103,3 +59,12 @@ class DocType:
|
||||
event.ref_type = 'Project'
|
||||
event.ref_name = self.doc.name
|
||||
event.save(1)
|
||||
|
||||
def update_percent_complete(self):
|
||||
total = webnotes.conn.sql("""select count(*) from tabTask where project=%s""",
|
||||
self.doc.name)[0][0]
|
||||
completed = webnotes.conn.sql("""select count(*) from tabTask where
|
||||
project=%s and status='Closed'""", self.doc.name)[0][0]
|
||||
webnotes.conn.set_value("Project", self.doc.name, "percent_complete",
|
||||
int(float(completed) / total * 100))
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
"creation": "2013-03-07 11:55:07",
|
||||
"docstatus": 0,
|
||||
"modified": "2013-06-03 17:03:08",
|
||||
"modified": "2013-06-07 12:38:37",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "Administrator"
|
||||
},
|
||||
@ -26,19 +26,14 @@
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 1,
|
||||
"create": 1,
|
||||
"doctype": "DocPerm",
|
||||
"name": "__common__",
|
||||
"parent": "Project",
|
||||
"parentfield": "permissions",
|
||||
"parenttype": "DocType",
|
||||
"permlevel": 0,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Projects User",
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
"submit": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocType",
|
||||
@ -145,19 +140,6 @@
|
||||
"options": "Internal\nExternal\nOther",
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"description": "Tasks belonging to this Project.",
|
||||
"doctype": "DocField",
|
||||
"fieldname": "sb_tasks",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Tasks"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "project_tasks",
|
||||
"fieldtype": "HTML",
|
||||
"label": "Project Tasks"
|
||||
},
|
||||
{
|
||||
"description": "Important dates and commitments in your project life cycle",
|
||||
"doctype": "DocField",
|
||||
@ -196,6 +178,14 @@
|
||||
"oldfieldtype": "Text Editor",
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "percent_complete",
|
||||
"fieldtype": "Percent",
|
||||
"in_list_view": 1,
|
||||
"label": "Percent Complete",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "company",
|
||||
@ -290,6 +280,18 @@
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocPerm"
|
||||
"cancel": 1,
|
||||
"create": 1,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 0,
|
||||
"role": "Projects User",
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 1,
|
||||
"role": "All"
|
||||
}
|
||||
]
|
@ -15,7 +15,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
import webnotes, json
|
||||
|
||||
from webnotes.utils import getdate, today
|
||||
from webnotes.model import db_exists
|
||||
@ -59,4 +59,35 @@ class DocType:
|
||||
|
||||
if self.doc.status=="Closed" and status != "Closed" and not self.doc.act_end_date:
|
||||
self.doc.act_end_date = today()
|
||||
|
||||
|
||||
def on_update(self):
|
||||
"""update percent complete in project"""
|
||||
if self.doc.project:
|
||||
webnotes.bean("Project", self.doc.project).controller.update_percent_complete()
|
||||
|
||||
@webnotes.whitelist()
|
||||
def get_events(start, end, filters=None):
|
||||
from webnotes.widgets.reportview import build_match_conditions
|
||||
if not webnotes.has_permission("Task"):
|
||||
webnotes.msgprint(_("No Permission"), raise_exception=1)
|
||||
|
||||
conditions = build_match_conditions("Task")
|
||||
conditions and (" and " + conditions) or ""
|
||||
|
||||
if filters:
|
||||
filters = json.loads(filters)
|
||||
for key in filters:
|
||||
if filters[key]:
|
||||
conditions += " and " + key + ' = "' + filters[key].replace('"', '\"') + '"'
|
||||
|
||||
data = webnotes.conn.sql("""select name, exp_start_date, exp_end_date,
|
||||
subject, status, project from `tabTask`
|
||||
where ((exp_start_date between '%(start)s' and '%(end)s') \
|
||||
or (exp_end_date between '%(start)s' and '%(end)s'))
|
||||
%(conditions)s""" % {
|
||||
"start": start,
|
||||
"end": end,
|
||||
"conditions": conditions
|
||||
}, as_dict=True, update={"allDay": 0}, debug=1)
|
||||
|
||||
return data
|
||||
|
@ -5,7 +5,6 @@ import webnotes
|
||||
from webnotes import _
|
||||
from webnotes.utils import cstr
|
||||
|
||||
from webnotes.widgets.reportview import build_match_conditions
|
||||
|
||||
class OverlapError(webnotes.ValidationError): pass
|
||||
|
||||
@ -60,6 +59,10 @@ class DocType:
|
||||
|
||||
@webnotes.whitelist()
|
||||
def get_events(start, end):
|
||||
from webnotes.widgets.reportview import build_match_conditions
|
||||
if not webnotes.has_permission("Time Log"):
|
||||
webnotes.msgprint(_("No Permission"), raise_exception=1)
|
||||
|
||||
match = build_match_conditions("Time Log")
|
||||
data = webnotes.conn.sql("""select name, from_time, to_time,
|
||||
activity_type, task, project from `tabTime Log`
|
||||
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,14 +0,0 @@
|
||||
[
|
||||
"Status",
|
||||
"Timesheet By",
|
||||
"Notes",
|
||||
"Timesheet",
|
||||
"Timesheet Date",
|
||||
"Amendment Date",
|
||||
"Cancelled",
|
||||
"Draft",
|
||||
"Submitted",
|
||||
"Timesheet Details",
|
||||
"Amended From",
|
||||
"Projects"
|
||||
]
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "\u0639\u062f\u0644 \u0645\u0646",
|
||||
"Amendment Date": "\u0627\u0644\u062a\u0639\u062f\u064a\u0644 \u062a\u0627\u0631\u064a\u062e",
|
||||
"Cancelled": "\u0625\u0644\u063a\u0627\u0621",
|
||||
"Draft": "\u0645\u0633\u0648\u062f\u0629",
|
||||
"Notes": "\u062a\u0644\u0627\u062d\u0638",
|
||||
"Projects": "\u0645\u0634\u0627\u0631\u064a\u0639",
|
||||
"Status": "\u062d\u0627\u0644\u0629",
|
||||
"Submitted": "\u0627\u0644\u0645\u0642\u062f\u0645\u0629",
|
||||
"Timesheet": "\u0633\u0627\u0639\u0627\u062a \u0627\u0644\u0639\u0645\u0644",
|
||||
"Timesheet By": "\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0632\u0645\u0646\u064a \u0628\u0648\u0627\u0633\u0637\u0629",
|
||||
"Timesheet Date": "\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0632\u0645\u0646\u064a \u062a\u0627\u0631\u064a\u062e",
|
||||
"Timesheet Details": "\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0632\u0645\u0646\u064a \u062a\u0641\u0627\u0635\u064a\u0644"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "Ge\u00e4ndert von",
|
||||
"Amendment Date": "\u00c4nderung Datum",
|
||||
"Cancelled": "Abgesagt",
|
||||
"Draft": "Entwurf",
|
||||
"Notes": "Aufzeichnungen",
|
||||
"Projects": "Projekte",
|
||||
"Status": "Status",
|
||||
"Submitted": "Eingereicht",
|
||||
"Timesheet": "Timesheet",
|
||||
"Timesheet By": "Timesheet By",
|
||||
"Timesheet Date": "Timesheet Datum",
|
||||
"Timesheet Details": "Timesheet Einzelheiten"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "De modificada",
|
||||
"Amendment Date": "Enmienda Fecha",
|
||||
"Cancelled": "Cancelado",
|
||||
"Draft": "Borrador",
|
||||
"Notes": "Notas",
|
||||
"Projects": "Proyectos",
|
||||
"Status": "Estado",
|
||||
"Submitted": "Enviado",
|
||||
"Timesheet": "Parte de horas",
|
||||
"Timesheet By": "Por parte de horas",
|
||||
"Timesheet Date": "Fecha de parte de horas",
|
||||
"Timesheet Details": "Detalles del parte de horas"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "De modifi\u00e9e",
|
||||
"Amendment Date": "Date de la modification",
|
||||
"Cancelled": "Annul\u00e9",
|
||||
"Draft": "Avant-projet",
|
||||
"Notes": "Remarques",
|
||||
"Projects": "Projets",
|
||||
"Status": "Statut",
|
||||
"Submitted": "Soumis",
|
||||
"Timesheet": "Feuille de pr\u00e9sence",
|
||||
"Timesheet By": "Feuille de temps par",
|
||||
"Timesheet Date": "Date de feuille de temps",
|
||||
"Timesheet Details": "D\u00e9tails des feuilles de temps"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "\u0938\u0947 \u0938\u0902\u0936\u094b\u0927\u093f\u0924",
|
||||
"Amendment Date": "\u0938\u0902\u0936\u094b\u0927\u0928 \u0924\u093f\u0925\u093f",
|
||||
"Cancelled": "Cancelled",
|
||||
"Draft": "\u092e\u0938\u094c\u0926\u093e",
|
||||
"Notes": "\u0928\u094b\u091f\u094d\u0938",
|
||||
"Projects": "\u092a\u0930\u093f\u092f\u094b\u091c\u0928\u093e\u0913\u0902",
|
||||
"Status": "\u0939\u0948\u0938\u093f\u092f\u0924",
|
||||
"Submitted": "\u092a\u0947\u0936",
|
||||
"Timesheet": "Timesheet",
|
||||
"Timesheet By": "\u0926\u094d\u0935\u093e\u0930\u093e Timesheet",
|
||||
"Timesheet Date": "Timesheet \u0924\u093f\u0925\u093f",
|
||||
"Timesheet Details": "Timesheet \u0935\u093f\u0935\u0930\u0923"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "Izmijenjena Od",
|
||||
"Amendment Date": "Amandman Datum",
|
||||
"Cancelled": "Otkazan",
|
||||
"Draft": "Skica",
|
||||
"Notes": "Bilje\u0161ke",
|
||||
"Projects": "Projekti",
|
||||
"Status": "Status",
|
||||
"Submitted": "Prijavljen",
|
||||
"Timesheet": "Kontrolna kartica",
|
||||
"Timesheet By": "Timesheet Do",
|
||||
"Timesheet Date": "Timesheet Datum",
|
||||
"Timesheet Details": "Timesheet Detalji"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "Gewijzigd Van",
|
||||
"Amendment Date": "Wijziging Datum",
|
||||
"Cancelled": "Geannuleerd",
|
||||
"Draft": "Ontwerp",
|
||||
"Notes": "Opmerkingen",
|
||||
"Projects": "Projecten",
|
||||
"Status": "Staat",
|
||||
"Submitted": "Ingezonden",
|
||||
"Timesheet": "Rooster",
|
||||
"Timesheet By": "Timesheet Door",
|
||||
"Timesheet Date": "Timesheet Datum",
|
||||
"Timesheet Details": "Timesheet Details"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "Corrigido De",
|
||||
"Amendment Date": "Data da Corre\u00e7\u00e3o",
|
||||
"Cancelled": "Cancelado",
|
||||
"Draft": "Rascunho",
|
||||
"Notes": "Notas",
|
||||
"Projects": "Projetos",
|
||||
"Status": "Estado",
|
||||
"Submitted": "Enviado",
|
||||
"Timesheet": "Quadro de Hor\u00e1rios",
|
||||
"Timesheet By": "Quadro de Hor\u00e1rios Por",
|
||||
"Timesheet Date": "Data do Quadro de Hor\u00e1rios",
|
||||
"Timesheet Details": "Detalhes do Quadro de Hor\u00e1rios"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "Alterado De",
|
||||
"Amendment Date": "Data emenda",
|
||||
"Cancelled": "Cancelado",
|
||||
"Draft": "Rascunho",
|
||||
"Notes": "Notas",
|
||||
"Projects": "Projetos",
|
||||
"Status": "Estado",
|
||||
"Submitted": "Enviado",
|
||||
"Timesheet": "Quadro de Hor\u00e1rios",
|
||||
"Timesheet By": "Por Timesheet",
|
||||
"Timesheet Date": "Data Timesheet",
|
||||
"Timesheet Details": "Detalhes quadro de hor\u00e1rios"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "\u0418\u0437\u043c\u0435\u045a\u0435\u043d\u0430 \u043e\u0434",
|
||||
"Amendment Date": "\u0410\u043c\u0430\u043d\u0434\u043c\u0430\u043d \u0414\u0430\u0442\u0443\u043c",
|
||||
"Cancelled": "\u041e\u0442\u043a\u0430\u0437\u0430\u043d",
|
||||
"Draft": "\u041d\u0430\u0446\u0440\u0442",
|
||||
"Notes": "\u0411\u0435\u043b\u0435\u0448\u043a\u0435",
|
||||
"Projects": "\u041f\u0440\u043e\u0458\u0435\u043a\u0442\u0438",
|
||||
"Status": "\u0421\u0442\u0430\u0442\u0443\u0441",
|
||||
"Submitted": "\u041f\u043e\u0434\u043d\u0435\u0442",
|
||||
"Timesheet": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u0446\u0430",
|
||||
"Timesheet By": "\u041f\u043e \u0422\u0438\u043c\u0435\u0441\u0445\u0435\u0435\u0442",
|
||||
"Timesheet Date": "\u0414\u0430\u0442\u0443\u043c \u0422\u0438\u043c\u0435\u0441\u0445\u0435\u0435\u0442",
|
||||
"Timesheet Details": "\u0422\u0438\u043c\u0435\u0441\u0445\u0435\u0435\u0442 \u0414\u0435\u0442\u0430\u0459\u0438"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "\u0bae\u0bc1\u0ba4\u0bb2\u0bcd \u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f",
|
||||
"Amendment Date": "\u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bc7\u0ba4\u0bbf",
|
||||
"Cancelled": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1",
|
||||
"Draft": "\u0b95\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0bb5\u0bc0\u0b9a\u0bcd\u0b9a\u0bc1",
|
||||
"Notes": "\u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd",
|
||||
"Projects": "\u0ba4\u0bbf\u0b9f\u0bcd\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",
|
||||
"Status": "\u0b85\u0ba8\u0bcd\u0ba4\u0bb8\u0bcd\u0ba4\u0bc1",
|
||||
"Submitted": "\u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
|
||||
"Timesheet": "Timesheet",
|
||||
"Timesheet By": "By Timesheet",
|
||||
"Timesheet Date": "Timesheet \u0ba4\u0bc7\u0ba4\u0bbf",
|
||||
"Timesheet Details": "Timesheet \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd"
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"Amended From": "\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21",
|
||||
"Amendment Date": "\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e41\u0e01\u0e49\u0e44\u0e02",
|
||||
"Cancelled": "\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",
|
||||
"Draft": "\u0e23\u0e48\u0e32\u0e07",
|
||||
"Notes": "\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38",
|
||||
"Projects": "\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
|
||||
"Status": "\u0e2a\u0e16\u0e32\u0e19\u0e30",
|
||||
"Submitted": "Submitted",
|
||||
"Timesheet": "timesheet",
|
||||
"Timesheet By": "timesheet \u0e42\u0e14\u0e22",
|
||||
"Timesheet Date": "\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48 timesheet",
|
||||
"Timesheet Details": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14 Timesheet"
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// 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
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
// ======================= OnLoad =============================================
|
||||
cur_frm.cscript.onload = function(doc,cdt,cdn){
|
||||
if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
|
||||
if(!doc.timesheet_date) set_multiple(cdt,cdn,{timesheet_date:get_today()});
|
||||
}
|
||||
|
||||
cur_frm.cscript.refresh = function(doc,cdt,cdn){
|
||||
cur_frm.set_intro("Timesheets will soon be removed. Please create a new Time Log. To create \
|
||||
a new Time Log, to to Projects > Time Log > New Time Log. This will be removed in a few days.")
|
||||
}
|
||||
|
||||
|
||||
cur_frm.fields_dict['timesheet_details'].grid.get_field("project_name").get_query = function(doc,cdt,cdn){
|
||||
var cond=cond1='';
|
||||
var d = locals[cdt][cdn];
|
||||
//if(d.customer_name) cond = 'ifnull(`tabProject`.customer_name, "") = "'+d.customer_name+'" AND';
|
||||
if(d.task_id) cond1 = 'ifnull(`tabTask`.project, "") = `tabProject`.name AND `tabTask`.name = "'+d.task_id+'" AND';
|
||||
|
||||
return repl('SELECT distinct `tabProject`.`name` FROM `tabProject`, `tabTask` WHERE %(cond1)s `tabProject`.`name` LIKE "%s" ORDER BY `tabProject`.`name` ASC LIMIT 50', {cond1:cond1});
|
||||
}
|
||||
|
||||
cur_frm.cscript.task_name = function(doc, cdt, cdn){
|
||||
var d = locals[cdt][cdn];
|
||||
if(d.task_name) get_server_fields('get_task_details', d.task_name, 'timesheet_details', doc, cdt, cdn, 1);
|
||||
}
|
||||
|
||||
cur_frm.fields_dict['timesheet_details'].grid.get_field("task_name").get_query = function(doc,cdt,cdn){
|
||||
var cond='';
|
||||
var d = locals[cdt][cdn];
|
||||
if(d.project_name) cond = 'ifnull(`tabTask`.project, "") = "'+d.project_name+'" AND';
|
||||
|
||||
return repl('SELECT distinct `tabTask`.`subject` FROM `tabTask` WHERE %(cond)s `tabTask`.`subject` LIKE "%s" ORDER BY `tabTask`.`subject` ASC LIMIT 50', {cond:cond});
|
||||
}
|
||||
|
||||
cur_frm.fields_dict.timesheet_details.grid.get_field("customer_name").get_query =
|
||||
erpnext.utils.customer_query;
|
@ -1,97 +0,0 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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
|
||||
from webnotes.model.bean 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 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):
|
||||
msgprint("Please create a new Time Log", raise_exception=True)
|
||||
|
||||
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
|
||||
|
||||
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')
|
||||
|
@ -1,180 +0,0 @@
|
||||
[
|
||||
{
|
||||
"creation": "2013-01-29 19:25:50",
|
||||
"docstatus": 0,
|
||||
"modified": "2013-02-26 13:44:35",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "ashwini@webnotestech.com"
|
||||
},
|
||||
{
|
||||
"autoname": "TimeSheet.#####",
|
||||
"doctype": "DocType",
|
||||
"is_submittable": 1,
|
||||
"module": "Projects",
|
||||
"name": "__common__",
|
||||
"search_fields": "status, owner, timesheet_date"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"name": "__common__",
|
||||
"parent": "Timesheet",
|
||||
"parentfield": "fields",
|
||||
"parenttype": "DocType",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocPerm",
|
||||
"name": "__common__",
|
||||
"parent": "Timesheet",
|
||||
"parentfield": "permissions",
|
||||
"parenttype": "DocType",
|
||||
"read": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocType",
|
||||
"name": "Timesheet"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "timesheet_details_section_break",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Timesheet Details"
|
||||
},
|
||||
{
|
||||
"default": "Today",
|
||||
"doctype": "DocField",
|
||||
"fieldname": "timesheet_date",
|
||||
"fieldtype": "Date",
|
||||
"in_filter": 1,
|
||||
"label": "Timesheet Date",
|
||||
"oldfieldname": "timesheet_date",
|
||||
"oldfieldtype": "Date",
|
||||
"reqd": 1,
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"default": "Draft",
|
||||
"doctype": "DocField",
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_filter": 0,
|
||||
"in_list_view": 1,
|
||||
"label": "Status",
|
||||
"oldfieldname": "status",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nDraft\nSubmitted\nCancelled",
|
||||
"read_only": 1,
|
||||
"reqd": 1,
|
||||
"search_index": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "section_break0",
|
||||
"fieldtype": "Section Break",
|
||||
"options": "Simple"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "timesheet_details",
|
||||
"fieldtype": "Table",
|
||||
"label": "Timesheet Details",
|
||||
"oldfieldname": "timesheet_details",
|
||||
"oldfieldtype": "Table",
|
||||
"options": "Timesheet Detail"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "section_break_7",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "notes",
|
||||
"fieldtype": "Text",
|
||||
"in_list_view": 1,
|
||||
"label": "Notes"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "owner",
|
||||
"fieldtype": "Link",
|
||||
"in_filter": 1,
|
||||
"label": "Timesheet By",
|
||||
"oldfieldname": "owner",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "Profile",
|
||||
"reqd": 1,
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "amended_from",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Amended From",
|
||||
"oldfieldname": "amended_from",
|
||||
"oldfieldtype": "Data",
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "amendment_date",
|
||||
"fieldtype": "Date",
|
||||
"hidden": 1,
|
||||
"label": "Amendment Date",
|
||||
"oldfieldname": "amendment_date",
|
||||
"oldfieldtype": "Date",
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"amend": 1,
|
||||
"cancel": 1,
|
||||
"create": 1,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 0,
|
||||
"report": 1,
|
||||
"role": "Projects User",
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 1,
|
||||
"report": 0,
|
||||
"role": "Projects User",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 1,
|
||||
"cancel": 1,
|
||||
"create": 1,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 0,
|
||||
"report": 1,
|
||||
"role": "System Manager",
|
||||
"submit": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"cancel": 0,
|
||||
"create": 0,
|
||||
"doctype": "DocPerm",
|
||||
"permlevel": 1,
|
||||
"report": 0,
|
||||
"role": "System Manager",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,13 +0,0 @@
|
||||
[
|
||||
"Task Id",
|
||||
"Activity Type",
|
||||
"Actual End Time",
|
||||
"Actual Start Time",
|
||||
"Project",
|
||||
"Total Hours (Actual)",
|
||||
"Customer Name",
|
||||
"Additional Info",
|
||||
"Timesheet Detail",
|
||||
"Task Name",
|
||||
"Projects"
|
||||
]
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "\u0627\u0644\u0646\u0634\u0627\u0637 \u0646\u0648\u0639",
|
||||
"Actual End Time": "\u0646\u0647\u0627\u064a\u0629 \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0641\u0639\u0644\u064a",
|
||||
"Actual Start Time": "\u0648\u0642\u062a \u0627\u0644\u0628\u062f\u0621 \u0627\u0644\u0641\u0639\u0644\u064a",
|
||||
"Additional Info": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0625\u0636\u0627\u0641\u064a\u0629",
|
||||
"Customer Name": "\u0627\u0633\u0645 \u0627\u0644\u0639\u0645\u064a\u0644",
|
||||
"Project": "\u0645\u0634\u0631\u0648\u0639",
|
||||
"Projects": "\u0645\u0634\u0627\u0631\u064a\u0639",
|
||||
"Task Id": "\u0627\u0644\u0645\u0647\u0645\u0629 \u0631\u0642\u0645",
|
||||
"Task Name": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0647\u0645\u0629",
|
||||
"Timesheet Detail": "\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0632\u0645\u0646\u064a \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644",
|
||||
"Total Hours (Actual)": "\u0645\u062c\u0645\u0648\u0639 \u0633\u0627\u0639\u0627\u062a (\u0627\u0644\u0641\u0639\u0644\u064a\u0629)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Art der T\u00e4tigkeit",
|
||||
"Actual End Time": "Tats\u00e4chliche Endzeit",
|
||||
"Actual Start Time": "Tats\u00e4chliche Startzeit",
|
||||
"Additional Info": "Zus\u00e4tzliche Informationen",
|
||||
"Customer Name": "Name des Kunden",
|
||||
"Project": "Projekt",
|
||||
"Projects": "Projekte",
|
||||
"Task Id": "Task-Id",
|
||||
"Task Name": "Task-Name",
|
||||
"Timesheet Detail": "Timesheet Details",
|
||||
"Total Hours (Actual)": "Total Hours (Actual)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Tipo de actividad",
|
||||
"Actual End Time": "Hora de finalizaci\u00f3n real",
|
||||
"Actual Start Time": "Tiempo real de inicio",
|
||||
"Additional Info": "Informaci\u00f3n adicional",
|
||||
"Customer Name": "Nombre del cliente",
|
||||
"Project": "Proyecto",
|
||||
"Projects": "Proyectos",
|
||||
"Task Id": "Tarea Id",
|
||||
"Task Name": "Nombre de tarea",
|
||||
"Timesheet Detail": "Detalle de parte de horas",
|
||||
"Total Hours (Actual)": "Horas totales (real)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Type d'activit\u00e9",
|
||||
"Actual End Time": "Heure de fin r\u00e9elle",
|
||||
"Actual Start Time": "Heure de d\u00e9but r\u00e9elle",
|
||||
"Additional Info": "Informations additionnelles \u00e0",
|
||||
"Customer Name": "Nom du client",
|
||||
"Project": "Projet",
|
||||
"Projects": "Projets",
|
||||
"Task Id": "T\u00e2che Id",
|
||||
"Task Name": "Nom de la t\u00e2che",
|
||||
"Timesheet Detail": "D\u00e9tail des feuilles de temps",
|
||||
"Total Hours (Actual)": "Total des heures (r\u00e9elles)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "\u0917\u0924\u093f\u0935\u093f\u0927\u093f \u092a\u094d\u0930\u0915\u093e\u0930",
|
||||
"Actual End Time": "\u0935\u093e\u0938\u094d\u0924\u0935\u093f\u0915 \u0905\u0902\u0924 \u0938\u092e\u092f",
|
||||
"Actual Start Time": "\u0935\u093e\u0938\u094d\u0924\u0935\u093f\u0915 \u092a\u094d\u0930\u093e\u0930\u0902\u092d \u0938\u092e\u092f",
|
||||
"Additional Info": "\u0905\u0924\u093f\u0930\u093f\u0915\u094d\u0924 \u091c\u093e\u0928\u0915\u093e\u0930\u0940",
|
||||
"Customer Name": "\u0917\u094d\u0930\u093e\u0939\u0915 \u0915\u093e \u0928\u093e\u092e",
|
||||
"Project": "\u092a\u0930\u093f\u092f\u094b\u091c\u0928\u093e",
|
||||
"Projects": "\u092a\u0930\u093f\u092f\u094b\u091c\u0928\u093e\u0913\u0902",
|
||||
"Task Id": "\u091f\u093e\u0938\u094d\u0915 \u0906\u0908\u0921\u0940",
|
||||
"Task Name": "\u0915\u093e\u0930\u094d\u092f \u0915\u093e \u0928\u093e\u092e",
|
||||
"Timesheet Detail": "Timesheet \u0935\u093f\u0938\u094d\u0924\u093e\u0930",
|
||||
"Total Hours (Actual)": "\u0915\u0941\u0932 \u0918\u0902\u091f\u0947 (\u0935\u093e\u0938\u094d\u0924\u0935\u093f\u0915)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Aktivnost Tip",
|
||||
"Actual End Time": "Stvarni Vrijeme zavr\u0161etka",
|
||||
"Actual Start Time": "Stvarni Vrijeme po\u010detka",
|
||||
"Additional Info": "Dodatne informacije",
|
||||
"Customer Name": "Naziv klijenta",
|
||||
"Project": "Projekt",
|
||||
"Projects": "Projekti",
|
||||
"Task Id": "Zadatak Id",
|
||||
"Task Name": "Zadatak Ime",
|
||||
"Timesheet Detail": "Timesheet Detalj",
|
||||
"Total Hours (Actual)": "Ukupno vrijeme (Stvarni)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Activiteit Type",
|
||||
"Actual End Time": "Werkelijke Eindtijd",
|
||||
"Actual Start Time": "Werkelijke Starttijd",
|
||||
"Additional Info": "Extra informatie",
|
||||
"Customer Name": "Klantnaam",
|
||||
"Project": "Project",
|
||||
"Projects": "Projecten",
|
||||
"Task Id": "Taak-id",
|
||||
"Task Name": "Taaknaam",
|
||||
"Timesheet Detail": "Timesheet Detail",
|
||||
"Total Hours (Actual)": "Totaal uren (werkelijke)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Tipo da Atividade",
|
||||
"Actual End Time": "Tempos Final Real",
|
||||
"Actual Start Time": "Hor\u00e1rio de In\u00edcio Real",
|
||||
"Additional Info": "Informa\u00e7\u00f5es Adicionais",
|
||||
"Customer Name": "Nome do cliente",
|
||||
"Project": "Projeto",
|
||||
"Projects": "Projetos",
|
||||
"Task Id": "ID da Tarefa",
|
||||
"Task Name": "Nome da Tarefa",
|
||||
"Timesheet Detail": "Detalhe do Quadro de Hor\u00e1rios",
|
||||
"Total Hours (Actual)": "Total de Horas (Real)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "Tipo de Atividade",
|
||||
"Actual End Time": "Fim dos Tempos real",
|
||||
"Actual Start Time": "Hor\u00e1rio de in\u00edcio real",
|
||||
"Additional Info": "Informa\u00e7\u00f5es Adicionais",
|
||||
"Customer Name": "Nome do cliente",
|
||||
"Project": "Projeto",
|
||||
"Projects": "Projetos",
|
||||
"Task Id": "Tarefa Id",
|
||||
"Task Name": "Nome da Tarefa",
|
||||
"Timesheet Detail": "Detalhe de quadro de hor\u00e1rios",
|
||||
"Total Hours (Actual)": "Total de Horas (Real)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442 \u0422\u0438\u043f",
|
||||
"Actual End Time": "\u0421\u0443\u043d\u0446\u0435 \u041a\u0440\u0430\u0458\u045a\u0435 \u0432\u0440\u0435\u043c\u0435",
|
||||
"Actual Start Time": "\u0421\u0443\u043d\u0446\u0435 \u0421\u0442\u0430\u0440\u0442 \u0422\u0438\u043c\u0435",
|
||||
"Additional Info": "\u0414\u043e\u0434\u0430\u0442\u043d\u0438 \u043f\u043e\u0434\u0430\u0446\u0438",
|
||||
"Customer Name": "\u0418\u043c\u0435 \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0430",
|
||||
"Project": "\u041f\u0440\u043e\u0458\u0435\u043a\u0430\u0442",
|
||||
"Projects": "\u041f\u0440\u043e\u0458\u0435\u043a\u0442\u0438",
|
||||
"Task Id": "\u0417\u0430\u0434\u0430\u0442\u0430\u043a \u0418\u0434",
|
||||
"Task Name": "\u041d\u0430\u0437\u0438\u0432 \u0437\u0430\u0434\u0430\u0442\u043a\u0430",
|
||||
"Timesheet Detail": "\u0422\u0438\u043c\u0435\u0441\u0445\u0435\u0435\u0442 \u0414\u0435\u0442\u0430\u0459",
|
||||
"Total Hours (Actual)": "\u0423\u043a\u0443\u043f\u043d\u043e \u0432\u0440\u0435\u043c\u0435 (\u0421\u0443\u043d\u0446\u0435)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "\u0ba8\u0b9f\u0bb5\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc8 \u0bb5\u0b95\u0bc8",
|
||||
"Actual End Time": "\u0b89\u0ba3\u0bcd\u0bae\u0bc8\u0baf\u0bbe\u0ba9 \u0bae\u0bc1\u0b9f\u0bbf\u0bb5\u0bc1 \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",
|
||||
"Actual Start Time": "\u0b89\u0ba3\u0bcd\u0bae\u0bc8\u0baf\u0bbe\u0ba9 \u0ba4\u0bc6\u0bbe\u0b9f\u0b95\u0bcd\u0b95 \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",
|
||||
"Additional Info": "\u0b95\u0bc2\u0b9f\u0bc1\u0ba4\u0bb2\u0bcd \u0ba4\u0b95\u0bb5\u0bb2\u0bcd",
|
||||
"Customer Name": "\u0bb5\u0bbe\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc8\u0baf\u0bbe\u0bb3\u0bb0\u0bcd \u0baa\u0bc6\u0baf\u0bb0\u0bcd",
|
||||
"Project": "\u0ba4\u0bbf\u0b9f\u0bcd\u0b9f\u0bae\u0bcd",
|
||||
"Projects": "\u0ba4\u0bbf\u0b9f\u0bcd\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",
|
||||
"Task Id": "\u0baa\u0ba3\u0bbf \u0b85\u0b9f\u0bc8\u0baf\u0bbe\u0bb3\u0bae\u0bcd",
|
||||
"Task Name": "\u0baa\u0ba3\u0bbf \u0baa\u0bc6\u0baf\u0bb0\u0bcd",
|
||||
"Timesheet Detail": "Timesheet \u0bb5\u0bbf\u0bb0\u0bbf\u0bb5\u0bbe\u0b95",
|
||||
"Total Hours (Actual)": "\u0bae\u0bc6\u0bbe\u0ba4\u0bcd\u0ba4 \u0ba8\u0bc7\u0bb0\u0bae\u0bcd (\u0b85\u0b9a\u0bb2\u0bcd)"
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"Activity Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",
|
||||
"Actual End Time": "\u0e40\u0e27\u0e25\u0e32\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e08\u0e23\u0e34\u0e07",
|
||||
"Actual Start Time": "\u0e40\u0e27\u0e25\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e08\u0e23\u0e34\u0e07",
|
||||
"Additional Info": "\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21",
|
||||
"Customer Name": "\u0e0a\u0e37\u0e48\u0e2d\u0e25\u0e39\u0e01\u0e04\u0e49\u0e32",
|
||||
"Project": "\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
|
||||
"Projects": "\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
|
||||
"Task Id": "\u0e23\u0e2b\u0e31\u0e2a\u0e07\u0e32\u0e19",
|
||||
"Task Name": "\u0e0a\u0e37\u0e48\u0e2d\u0e07\u0e32\u0e19",
|
||||
"Timesheet Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14 Timesheet",
|
||||
"Total Hours (Actual)": "\u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07\u0e23\u0e27\u0e21 (\u0e08\u0e23\u0e34\u0e07)"
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
|
||||
class DocType:
|
||||
def __init__(self, d, dl):
|
||||
self.doc, self.doclist = d, dl
|
@ -1,132 +0,0 @@
|
||||
[
|
||||
{
|
||||
"creation": "2013-01-10 16:34:18",
|
||||
"docstatus": 0,
|
||||
"modified": "2013-01-22 14:50:09",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "Administrator"
|
||||
},
|
||||
{
|
||||
"autoname": "TSD.#####",
|
||||
"doctype": "DocType",
|
||||
"istable": 1,
|
||||
"module": "Projects",
|
||||
"name": "__common__"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"name": "__common__",
|
||||
"parent": "Timesheet Detail",
|
||||
"parentfield": "fields",
|
||||
"parenttype": "DocType",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocType",
|
||||
"name": "Timesheet Detail"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "act_start_time",
|
||||
"fieldtype": "Time",
|
||||
"label": "Actual Start Time",
|
||||
"oldfieldname": "act_start_time",
|
||||
"oldfieldtype": "Time",
|
||||
"print_width": "160px",
|
||||
"reqd": 1,
|
||||
"width": "160px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "act_end_time",
|
||||
"fieldtype": "Time",
|
||||
"label": "Actual End Time",
|
||||
"oldfieldname": "act_end_time",
|
||||
"oldfieldtype": "Time",
|
||||
"print_width": "160px",
|
||||
"reqd": 1,
|
||||
"width": "160px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "activity_type",
|
||||
"fieldtype": "Link",
|
||||
"label": "Activity Type",
|
||||
"options": "Activity Type",
|
||||
"print_width": "200px",
|
||||
"reqd": 1,
|
||||
"search_index": 0,
|
||||
"width": "200px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "other_details",
|
||||
"fieldtype": "Text",
|
||||
"label": "Additional Info",
|
||||
"oldfieldname": "other_details",
|
||||
"oldfieldtype": "Text",
|
||||
"print_width": "200px",
|
||||
"width": "200px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "act_total_hrs",
|
||||
"fieldtype": "Data",
|
||||
"label": "Total Hours (Actual)",
|
||||
"oldfieldname": "act_total_hrs",
|
||||
"oldfieldtype": "Data",
|
||||
"print_width": "100px",
|
||||
"read_only": 1,
|
||||
"width": "100px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "customer_name",
|
||||
"fieldtype": "Link",
|
||||
"label": "Customer Name",
|
||||
"oldfieldname": "customer_name",
|
||||
"oldfieldtype": "Data",
|
||||
"options": "Customer",
|
||||
"print_width": "150px",
|
||||
"width": "150px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "project_name",
|
||||
"fieldtype": "Link",
|
||||
"in_filter": 1,
|
||||
"label": "Project",
|
||||
"oldfieldname": "project_name",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "Project",
|
||||
"print_width": "150px",
|
||||
"reqd": 0,
|
||||
"search_index": 1,
|
||||
"width": "150px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "task_id",
|
||||
"fieldtype": "Link",
|
||||
"in_filter": 1,
|
||||
"label": "Task Id",
|
||||
"oldfieldname": "task_id",
|
||||
"oldfieldtype": "Link",
|
||||
"options": "Task",
|
||||
"print_width": "150px",
|
||||
"search_index": 1,
|
||||
"width": "150px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "task_name",
|
||||
"fieldtype": "Data",
|
||||
"label": "Task Name",
|
||||
"oldfieldname": "task_name",
|
||||
"oldfieldtype": "Link",
|
||||
"print_width": "250px",
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"width": "250px"
|
||||
}
|
||||
]
|
Loading…
x
Reference in New Issue
Block a user