mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-01 19:29:10 +00:00
set project wise timesheet data
This commit is contained in:
@@ -462,12 +462,21 @@ cur_frm.set_query("asset", "items", function(doc, cdt, cdn) {
|
|||||||
frappe.ui.form.on('Sales Invoice', {
|
frappe.ui.form.on('Sales Invoice', {
|
||||||
setup: function(frm){
|
setup: function(frm){
|
||||||
frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(doc, cdt, cdn){
|
frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(doc, cdt, cdn){
|
||||||
return {
|
return{
|
||||||
filters: [
|
query: "erpnext.projects.doctype.timesheet.timesheet.get_timesheet",
|
||||||
["Timesheet", "status", "in", ["Submitted", "Payslip"]]
|
filters: {'project': doc.project}
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
project: function(frm){
|
||||||
|
frm.call({
|
||||||
|
method: "add_timesheet_data",
|
||||||
|
doc: frm.doc,
|
||||||
|
callback: function(r, rt) {
|
||||||
|
refresh_field(['timesheets'])
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ from erpnext.accounts.doctype.sales_invoice.pos import update_multi_mode_option
|
|||||||
from erpnext.controllers.selling_controller import SellingController
|
from erpnext.controllers.selling_controller import SellingController
|
||||||
from erpnext.accounts.utils import get_account_currency
|
from erpnext.accounts.utils import get_account_currency
|
||||||
from erpnext.stock.doctype.delivery_note.delivery_note import update_billed_amount_based_on_so
|
from erpnext.stock.doctype.delivery_note.delivery_note import update_billed_amount_based_on_so
|
||||||
|
from erpnext.projects.doctype.timesheet.timesheet import get_projectwise_timesheet_data
|
||||||
from erpnext.accounts.doctype.asset.depreciation \
|
from erpnext.accounts.doctype.asset.depreciation \
|
||||||
import get_disposal_account_and_cost_center, get_gl_entries_on_asset_disposal
|
import get_disposal_account_and_cost_center, get_gl_entries_on_asset_disposal
|
||||||
|
|
||||||
@@ -221,11 +222,19 @@ class SalesInvoice(SellingController):
|
|||||||
for d in self.timesheets:
|
for d in self.timesheets:
|
||||||
if d.time_sheet:
|
if d.time_sheet:
|
||||||
timesheet = frappe.get_doc("Timesheet", d.time_sheet)
|
timesheet = frappe.get_doc("Timesheet", d.time_sheet)
|
||||||
|
self.update_time_sheet_detail(timesheet, d)
|
||||||
timesheet.sales_invoice = sales_invoice
|
timesheet.sales_invoice = sales_invoice
|
||||||
timesheet.flags.ignore_validate_update_after_submit = True
|
timesheet.flags.ignore_validate_update_after_submit = True
|
||||||
timesheet.set_status()
|
timesheet.set_status()
|
||||||
timesheet.save()
|
timesheet.save()
|
||||||
|
|
||||||
|
def update_time_sheet_detail(self, timesheet, args):
|
||||||
|
for data in timesheet.time_logs:
|
||||||
|
if (self.project and self.project == data.project) or \
|
||||||
|
(not self.project and (data.billing_amount - data.billed_amount) > 0):
|
||||||
|
data.billed_amount = args.billing_amount
|
||||||
|
if self.project: return
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
self.set_paid_amount()
|
self.set_paid_amount()
|
||||||
|
|
||||||
@@ -464,6 +473,18 @@ class SalesInvoice(SellingController):
|
|||||||
|
|
||||||
self.total_billing_amount = total_billing_amount
|
self.total_billing_amount = total_billing_amount
|
||||||
|
|
||||||
|
def add_timesheet_data(self):
|
||||||
|
self.set('timesheets', [])
|
||||||
|
if self.project:
|
||||||
|
for data in get_projectwise_timesheet_data(self.project):
|
||||||
|
self.append('timesheets', {
|
||||||
|
'time_sheet': data.parent,
|
||||||
|
'billing_hours': data.billing_hours,
|
||||||
|
'billing_amount': data.billing_amt
|
||||||
|
})
|
||||||
|
|
||||||
|
self.calculate_billing_amount_from_timesheet()
|
||||||
|
|
||||||
def get_warehouse(self):
|
def get_warehouse(self):
|
||||||
user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile`
|
user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile`
|
||||||
where ifnull(user,'') = %s and company = %s""", (frappe.session['user'], self.company))
|
where ifnull(user,'') = %s and company = %s""", (frappe.session['user'], self.company))
|
||||||
|
|||||||
@@ -570,6 +570,32 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "total_billed_amount",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"label": "Total Billed Amount",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
@@ -739,7 +765,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2016-09-07 02:54:20.930768",
|
"modified": "2016-09-07 06:48:27.316087",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Timesheet",
|
"name": "Timesheet",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class Timesheet(Document):
|
|||||||
self.total_billing_hours = 0.0
|
self.total_billing_hours = 0.0
|
||||||
self.total_billing_amount = 0.0
|
self.total_billing_amount = 0.0
|
||||||
self.total_costing_amount = 0.0
|
self.total_costing_amount = 0.0
|
||||||
|
self.total_billed_amount = 0.0
|
||||||
|
|
||||||
for d in self.get("time_logs"):
|
for d in self.get("time_logs"):
|
||||||
self.update_billing_hours(d)
|
self.update_billing_hours(d)
|
||||||
@@ -40,6 +41,7 @@ class Timesheet(Document):
|
|||||||
if d.billable:
|
if d.billable:
|
||||||
self.total_billing_amount += flt(d.billing_amount)
|
self.total_billing_amount += flt(d.billing_amount)
|
||||||
self.total_costing_amount += flt(d.costing_amount)
|
self.total_costing_amount += flt(d.costing_amount)
|
||||||
|
self.total_billed_amount += flt(d.billed_amount)
|
||||||
|
|
||||||
def update_billing_hours(self, args):
|
def update_billing_hours(self, args):
|
||||||
if cint(args.billing_hours) == 0:
|
if cint(args.billing_hours) == 0:
|
||||||
@@ -245,6 +247,34 @@ class Timesheet(Document):
|
|||||||
data.billing_amount = data.billing_rate * hours
|
data.billing_amount = data.billing_rate * hours
|
||||||
data.costing_amount = data.costing_rate * hours
|
data.costing_amount = data.costing_rate * hours
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_projectwise_timesheet_data(project, parent=None):
|
||||||
|
cond = ''
|
||||||
|
if parent:
|
||||||
|
cond = "and parent = %(parent)s"
|
||||||
|
|
||||||
|
return frappe.db.sql("""select parent, billing_hours, (billing_amount - billed_amount) as billing_amt
|
||||||
|
from `tabTimesheet Detail` where docstatus=1 and project = %(project)s {0}
|
||||||
|
having billing_amt > 0""".format(cond), {'project': project, 'parent': parent}, as_dict=1)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_timesheet(doctype, txt, searchfield, start, page_len, filters):
|
||||||
|
if not filters: filters = {}
|
||||||
|
|
||||||
|
condition = ""
|
||||||
|
if filters.get("project"):
|
||||||
|
condition = "and tsd.project = %(project)s"
|
||||||
|
|
||||||
|
return frappe.db.sql("""select distinct tsd.parent from `tabTimesheet Detail` tsd,
|
||||||
|
`tabTimesheet` ts where ts.status in ('Submitted', 'Payslip') and
|
||||||
|
(tsd.billing_amount - tsd.billed_amount) > 0 and
|
||||||
|
tsd.docstatus = 1 and tsd.parent LIKE %(txt)s {condition}
|
||||||
|
order by tsd.parent limit %(start)s, %(page_len)s"""
|
||||||
|
.format(condition=condition), {
|
||||||
|
"txt": "%%%s%%" % frappe.db.escape(txt),
|
||||||
|
"start": start, "page_len": page_len, 'project': filters.get("project")
|
||||||
|
})
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_sales_invoice(source_name, target=None):
|
def make_sales_invoice(source_name, target=None):
|
||||||
target = frappe.new_doc("Sales Invoice")
|
target = frappe.new_doc("Sales Invoice")
|
||||||
|
|||||||
Reference in New Issue
Block a user