From 9a433ffca134d1d2f5ddbaa7b0d57a643ae6107d Mon Sep 17 00:00:00 2001 From: Revant Nandgaonkar Date: Fri, 5 Aug 2016 21:44:34 +0530 Subject: [PATCH 1/5] [fix] success_url Issue #6004 --- erpnext/projects/web_form/tasks/tasks.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/projects/web_form/tasks/tasks.py b/erpnext/projects/web_form/tasks/tasks.py index 6f387fe222..e97f36d04b 100644 --- a/erpnext/projects/web_form/tasks/tasks.py +++ b/erpnext/projects/web_form/tasks/tasks.py @@ -5,6 +5,8 @@ import frappe def get_context(context): if frappe.form_dict.project: context.parents = [{'title': frappe.form_dict.project, 'route': '/projects?project='+ frappe.form_dict.project}] + context.success_url = "/projects?project=" + frappe.form_dict.project elif context.doc and context.doc.get('project'): - context.parents = [{'title': context.doc.project, 'route': '/projects?project='+ context.doc.project}] \ No newline at end of file + context.parents = [{'title': context.doc.project, 'route': '/projects?project='+ context.doc.project}] + context.success_url = "/projects?project=" + context.doc.project From 93b1f2ad722555997c4e736f81613def0b7bf8d9 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Sat, 6 Aug 2016 12:09:08 +0530 Subject: [PATCH 2/5] [Minor] Removed hard coded success URL --- erpnext/projects/web_form/tasks/tasks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/web_form/tasks/tasks.json b/erpnext/projects/web_form/tasks/tasks.json index 1d952fc074..98a20557d9 100644 --- a/erpnext/projects/web_form/tasks/tasks.json +++ b/erpnext/projects/web_form/tasks/tasks.json @@ -11,14 +11,14 @@ "idx": 0, "is_standard": 1, "login_required": 1, - "modified": "2016-07-07 06:04:30.979390", + "modified": "2016-08-06 11:59:21.494549", "modified_by": "Administrator", "module": "Projects", "name": "tasks", "owner": "Administrator", "published": 1, "route": "tasks", - "success_url": "/projects?project=Collaborative Project Management", + "success_url": "", "title": "Task", "web_form_fields": [ { From b77a1057ce8f09ef5e2e01cf54a67fb0578359d2 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 1 Aug 2016 18:35:18 +0530 Subject: [PATCH 3/5] fixes and cleanups. --- erpnext/accounts/doctype/sales_invoice/pos.py | 21 ++++++++++++------- erpnext/accounts/page/pos/pos.js | 2 ++ .../request_for_quotation.js | 2 +- .../request_for_quotation.json | 5 +++-- .../projects/doctype/timesheet/timesheet.js | 8 ++++--- .../projects/doctype/timesheet/timesheet.json | 4 ++-- .../projects/doctype/timesheet/timesheet.py | 9 +------- .../timesheet_detail/timesheet_detail.json | 6 +++--- 8 files changed, 31 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py index 9f64e075d6..9643764ab9 100644 --- a/erpnext/accounts/doctype/sales_invoice/pos.py +++ b/erpnext/accounts/doctype/sales_invoice/pos.py @@ -108,13 +108,14 @@ def get_items(doc, pos_profile): item.price_list_rate = frappe.db.get_value('Item Price', {'item_code': item.name, 'price_list': doc.selling_price_list}, 'price_list_rate') or 0 - item.default_warehouse = pos_profile.get('warehouse') or item.default_warehouse or None + item.default_warehouse = pos_profile.get('warehouse') or \ + get_item_warehouse_for_company(doc.company, item.default_warehouse) or None item.expense_account = pos_profile.get('expense_account') or item.expense_account item.income_account = pos_profile.get('income_account') or item_doc.income_account item.cost_center = pos_profile.get('cost_center') or item_doc.selling_cost_center item.actual_qty = frappe.db.get_value('Bin', {'item_code': item.name, 'warehouse': item.default_warehouse}, 'actual_qty') or 0 - item.serial_nos = get_serial_nos(item, pos_profile) + item.serial_nos = get_serial_nos(item, pos_profile, doc.company) item.batch_nos = frappe.db.sql_list("""select name from `tabBatch` where ifnull(expiry_date, '4000-10-10') > curdate() and item = %(item_code)s""", {'item_code': item.item_code}) @@ -122,13 +123,19 @@ def get_items(doc, pos_profile): return item_list -def get_serial_nos(item, pos_profile): +def get_item_warehouse_for_company(company, warehouse): + if frappe.db.get_value('Warehouse', warehouse, 'company') != company: + warehouse = None + return warehouse + +def get_serial_nos(item, pos_profile, company): cond = "1=1" if pos_profile.get('update_stock') and pos_profile.get('warehouse'): cond = "warehouse = '{0}'".format(pos_profile.get('warehouse')) serial_nos = frappe.db.sql("""select name, warehouse from `tabSerial No` where {0} - and item_code = %(item_code)s""".format(cond), {'item_code': item.item_code}, as_dict=1) + and item_code = %(item_code)s and company = %(company)s + """.format(cond), {'item_code': item.item_code, 'company': company}, as_dict=1) serial_no_list = {} for serial_no in serial_nos: @@ -214,9 +221,9 @@ def submit_invoice(si_doc, name): save_invoice(e, si_doc, name) def save_invoice(e, si_doc, name): - si_doc.docstatus = 0 - si_doc.name = '' - si_doc.save(ignore_permissions=True) + if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}): + si_doc.flags.ignore_mandatory = True + si_doc.insert() make_scheduler_log(e, si_doc.name) def make_scheduler_log(e, sales_invoice): diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index 183010387c..8444dbe91f 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -177,6 +177,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ doc = JSON.parse(localStorage.getItem('doc')) if(this.frm.doc.payments.length == 0){ this.frm.doc.payments = doc.payments; + this.calculate_outstanding_amount(); } if(this.frm.doc.customer){ @@ -869,6 +870,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ for(key in data){ if(data[key].docstatus == 1 && index < 50){ index++ + data[key].docstatus = 0; return data } } diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 5eafb81a0e..d126eb091e 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -30,7 +30,7 @@ frappe.ui.form.on("Request for Quotation",{ }, onload: function(frm) { - frm.add_fetch('standard_reply', 'response', 'response'); + frm.add_fetch('standard_reply', 'response', 'message_for_supplier'); if(!frm.doc.message_for_supplier) { frm.set_value("message_for_supplier", __("Please supply the specified items at the best possible rates")) diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json index 2ce5c5c7be..e48e1dc506 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -9,6 +9,7 @@ "docstatus": 0, "doctype": "DocType", "document_type": "Document", + "editable_grid": 0, "fields": [ { "allow_on_submit": 0, @@ -296,7 +297,7 @@ "options": "Standard Reply", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, @@ -638,7 +639,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-06-30 01:57:49.233065", + "modified": "2016-08-01 08:45:39.777405", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index e2e6459b0a..a780ab4f47 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -6,15 +6,17 @@ frappe.ui.form.on("Timesheet", { setup: function(frm) { frm.get_field('time_logs').grid.editable_fields = [ {fieldname: 'billable', columns: 1}, + {fieldname: 'project', columns: 3}, {fieldname: 'activity_type', columns: 2}, {fieldname: 'from_time', columns: 3}, - {fieldname: 'hours', columns: 1}, - {fieldname: 'project', columns: 3} + {fieldname: 'hours', columns: 1} ]; frm.fields_dict.employee.get_query = function() { return { - query:"erpnext.projects.doctype.timesheet.timesheet.get_employee_list" + filters:{ + 'status': 'Active' + } } } diff --git a/erpnext/projects/doctype/timesheet/timesheet.json b/erpnext/projects/doctype/timesheet/timesheet.json index c035cd3a16..16d71d8c24 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.json +++ b/erpnext/projects/doctype/timesheet/timesheet.json @@ -1,6 +1,6 @@ { "allow_copy": 0, - "allow_import": 0, + "allow_import": 1, "allow_rename": 0, "autoname": "naming_series:", "beta": 0, @@ -662,7 +662,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-07-26 00:01:56.055046", + "modified": "2016-08-01 08:54:31.840829", "modified_by": "Administrator", "module": "Projects", "name": "Timesheet", diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index a1b757c4bc..abcffad1c7 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -94,7 +94,7 @@ class Timesheet(Document): if self.production_order and flt(data.completed_qty) == 0: frappe.throw(_("Row {0}: Completed Qty must be greater than zero.").format(data.idx)) - if self.production_order and flt(pending_qty) < flt(data.completed_qty): + if self.production_order and flt(pending_qty) < flt(data.completed_qty) and flt(pending_qty) > 0: frappe.throw(_("Row {0}: Completed Qty cannot be more than {1} for operation {2}").format(data.idx, pending_qty, data.operation), OverProductionLoggedError) @@ -290,10 +290,3 @@ def get_activity_cost(employee=None, activity_type=None): ["costing_rate", "billing_rate"], as_dict=True) return rate[0] if rate else {} - -@frappe.whitelist() -def get_employee_list(doctype, txt, searchfield, start, page_len, filters): - return frappe.db.sql("""select distinct employee, employee_name - from `tabSalary Structure` where salary_slip_based_on_timesheet=1 - and employee like %(txt)s or employee_name like %(txt)s limit %(start)s, %(page_len)s""", - {'txt': "%%%s%%"% txt, 'start': start, 'page_len': page_len}) diff --git a/erpnext/projects/doctype/timesheet_detail/timesheet_detail.json b/erpnext/projects/doctype/timesheet_detail/timesheet_detail.json index 7604ded6ed..f847e64ae5 100644 --- a/erpnext/projects/doctype/timesheet_detail/timesheet_detail.json +++ b/erpnext/projects/doctype/timesheet_detail/timesheet_detail.json @@ -22,7 +22,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Billable", + "label": "Bill", "length": 0, "no_copy": 0, "permlevel": 0, @@ -121,7 +121,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Hours", + "label": "Hrs", "length": 0, "no_copy": 0, "permlevel": 0, @@ -532,7 +532,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-07-26 00:07:58.267131", + "modified": "2016-08-06 03:14:31.691605", "modified_by": "Administrator", "module": "Projects", "name": "Timesheet Detail", From 705384d8fe03d9f373d97c3e3094f11918804000 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Sat, 6 Aug 2016 13:42:18 +0530 Subject: [PATCH 4/5] Leave Application Validation for processed salary --- .../hr/doctype/leave_application/leave_application.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index fee39aad3c..838d8f7513 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -36,6 +36,7 @@ class LeaveApplication(Document): self.validate_max_days() self.show_block_day_warning() self.validate_block_days() + self.validate_salary_processed_days() self.validate_leave_approver() def on_update(self): @@ -95,6 +96,15 @@ class LeaveApplication(Document): frappe.throw(_("Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}") .format(formatdate(future_allocation[0].from_date), future_allocation[0].name)) + def validate_salary_processed_days(self): + last_processed_pay_slip = frappe.db.sql("""select start_date, end_date from `tabSalary Slip` + where docstatus != 2 and employee = %s and ((%s between start_date and end_date) or (%s between start_date and end_date)) order by modified desc limit 1""",(self.employee, self.to_date, self.from_date)) + + if last_processed_pay_slip: + frappe.throw(_("Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range."). + format(formatdate(last_processed_pay_slip[0][0]), formatdate(last_processed_pay_slip[0][1]))) + + def show_block_day_warning(self): block_dates = get_applicable_block_dates(self.from_date, self.to_date, self.employee, self.company, all_lists=True) From 537301a210c4dac08babc9cd49c871ebe4d1df50 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 6 Aug 2016 14:45:34 +0600 Subject: [PATCH 5/5] bumped to version 7.0.20 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 153a289a03..6bb9a1f713 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.0.19' +__version__ = '7.0.20' def get_default_company(user=None): '''Get default company for user'''