Merge pull request #21427 from ruchamahabal/fix-desk-pages
fix(Desk Page): Number of Open Leads not visible on Shortcut Card
diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py
index 866bf0c..3966879 100644
--- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py
+++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py
@@ -141,19 +141,18 @@
conditions = ""
if filters.get("company"):
- conditions += " AND company=%s"% frappe.db.escape(filters.get('company'))
+ conditions += " AND par.company=%s" % frappe.db.escape(filters.get('company'))
if filters.get("cost_center") or filters.get("project"):
conditions += """
- AND (cost_center=%s
- OR project=%s)
- """% (frappe.db.escape(filters.get('cost_center')), frappe.db.escape(filters.get('project')))
+ AND (child.`cost_center`=%s OR child.`project`=%s)
+ """ % (frappe.db.escape(filters.get('cost_center')), frappe.db.escape(filters.get('project')))
if filters.get("from_date"):
- conditions += " AND transaction_date>=%s"% filters.get('from_date')
+ conditions += " AND par.transaction_date>='%s'" % filters.get('from_date')
if filters.get("to_date"):
- conditions += " AND transaction_date<=%s"% filters.get('to_date')
+ conditions += " AND par.transaction_date<='%s'" % filters.get('to_date')
return conditions
def get_data(filters):
@@ -162,7 +161,6 @@
mr_records, procurement_record_against_mr = get_mapped_mr_details(conditions)
pr_records = get_mapped_pr_records()
pi_records = get_mapped_pi_records()
- print(pi_records)
procurement_record=[]
if procurement_record_against_mr:
@@ -198,16 +196,16 @@
mr_records = {}
mr_details = frappe.db.sql("""
SELECT
- mr.transaction_date,
- mr.per_ordered,
- mr_item.name,
- mr_item.parent,
- mr_item.amount
- FROM `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
+ par.transaction_date,
+ par.per_ordered,
+ child.name,
+ child.parent,
+ child.amount
+ FROM `tabMaterial Request` par, `tabMaterial Request Item` child
WHERE
- mr.per_ordered>=0
- AND mr.name=mr_item.parent
- AND mr.docstatus=1
+ par.per_ordered>=0
+ AND par.name=child.parent
+ AND par.docstatus=1
{conditions}
""".format(conditions=conditions), as_dict=1) #nosec
@@ -254,29 +252,29 @@
def get_po_entries(conditions):
return frappe.db.sql("""
SELECT
- po_item.name,
- po_item.parent,
- po_item.cost_center,
- po_item.project,
- po_item.warehouse,
- po_item.material_request,
- po_item.material_request_item,
- po_item.description,
- po_item.stock_uom,
- po_item.qty,
- po_item.amount,
- po_item.base_amount,
- po_item.schedule_date,
- po.transaction_date,
- po.supplier,
- po.status,
- po.owner
- FROM `tabPurchase Order` po, `tabPurchase Order Item` po_item
+ child.name,
+ child.parent,
+ child.cost_center,
+ child.project,
+ child.warehouse,
+ child.material_request,
+ child.material_request_item,
+ child.description,
+ child.stock_uom,
+ child.qty,
+ child.amount,
+ child.base_amount,
+ child.schedule_date,
+ par.transaction_date,
+ par.supplier,
+ par.status,
+ par.owner
+ FROM `tabPurchase Order` par, `tabPurchase Order Item` child
WHERE
- po.docstatus = 1
- AND po.name = po_item.parent
- AND po.status not in ("Closed","Completed","Cancelled")
+ par.docstatus = 1
+ AND par.name = child.parent
+ AND par.status not in ("Closed","Completed","Cancelled")
{conditions}
GROUP BY
- po.name,po_item.item_code
+ par.name, child.item_code
""".format(conditions=conditions), as_dict=1) #nosec
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index d13bb45..03fe3fa 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -30,16 +30,16 @@
def validate_leave_allocation_days(self):
company = frappe.db.get_value("Employee", self.employee, "company")
leave_period = get_leave_period(self.from_date, self.to_date, company)
- max_leaves_allowed = frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed")
+ max_leaves_allowed = flt(frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed"))
if max_leaves_allowed > 0:
leave_allocated = 0
if leave_period:
leave_allocated = get_leave_allocation_for_period(self.employee, self.leave_type,
leave_period[0].from_date, leave_period[0].to_date)
- leave_allocated += self.new_leaves_allocated
+ leave_allocated += flt(self.new_leaves_allocated)
if leave_allocated > max_leaves_allowed:
frappe.throw(_("Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period")
- .format(self.leave_type, self.employee))
+ .format(self.leave_type, self.employee))
def on_submit(self):
self.create_leave_ledger_entry()
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 0ea83fd..eaeebcf 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -673,3 +673,4 @@
erpnext.patches.v12_0.repost_stock_ledger_entries_for_target_warehouse
erpnext.patches.v12_0.update_end_date_and_status_in_email_campaign
erpnext.patches.v13_0.move_tax_slabs_from_payroll_period_to_income_tax_slab #123
+erpnext.patches.v12_0.fix_quotation_expired_status
diff --git a/erpnext/patches/v12_0/fix_quotation_expired_status.py b/erpnext/patches/v12_0/fix_quotation_expired_status.py
new file mode 100644
index 0000000..c8708d8
--- /dev/null
+++ b/erpnext/patches/v12_0/fix_quotation_expired_status.py
@@ -0,0 +1,34 @@
+import frappe
+
+def execute():
+ # fixes status of quotations which have status 'Expired' despite having valid sales order created
+
+ # filter out submitted expired quotations which has sales order created
+ cond = "qo.docstatus = 1 and qo.status = 'Expired'"
+ invalid_so_against_quo = """
+ SELECT
+ so.name FROM `tabSales Order` so, `tabSales Order Item` so_item
+ WHERE
+ so_item.docstatus = 1 and so.docstatus = 1
+ and so_item.parent = so.name
+ and so_item.prevdoc_docname = qo.name
+ and qo.valid_till < so.transaction_date""" # check if SO was created after quotation expired
+
+ frappe.db.sql(
+ """UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and exists({invalid_so_against_quo})"""
+ .format(cond=cond, invalid_so_against_quo=invalid_so_against_quo)
+ )
+
+ valid_so_against_quo = """
+ SELECT
+ so.name FROM `tabSales Order` so, `tabSales Order Item` so_item
+ WHERE
+ so_item.docstatus = 1 and so.docstatus = 1
+ and so_item.parent = so.name
+ and so_item.prevdoc_docname = qo.name
+ and qo.valid_till >= so.transaction_date""" # check if SO was created before quotation expired
+
+ frappe.db.sql(
+ """UPDATE `tabQuotation` qo SET qo.status = 'Closed' WHERE {cond} and exists({valid_so_against_quo})"""
+ .format(cond=cond, valid_so_against_quo=valid_so_against_quo)
+ )
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 4296447..5843034 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -288,7 +288,7 @@
this.setup_sms();
this.setup_quality_inspection();
let scan_barcode_field = this.frm.get_field('scan_barcode');
- if (scan_barcode_field) {
+ if (scan_barcode_field && scan_barcode_field.get_value()) {
scan_barcode_field.set_value("");
scan_barcode_field.set_new_description("");
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 7c47b8a..7cfec5a 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -193,12 +193,23 @@
return doclist
def set_expired_status():
- frappe.db.sql("""
- UPDATE
- `tabQuotation` SET `status` = 'Expired'
- WHERE
- `status` not in ('Ordered', 'Expired', 'Lost', 'Cancelled') AND `valid_till` < %s
- """, (nowdate()))
+ # filter out submitted non expired quotations whose validity has been ended
+ cond = "qo.docstatus = 1 and qo.status != 'Expired' and qo.valid_till < %s"
+ # check if those QUO have SO against it
+ so_against_quo = """
+ SELECT
+ so.name FROM `tabSales Order` so, `tabSales Order Item` so_item
+ WHERE
+ so_item.docstatus = 1 and so.docstatus = 1
+ and so_item.parent = so.name
+ and so_item.prevdoc_docname = qo.name"""
+
+ # if not exists any SO, set status as Expired
+ frappe.db.sql(
+ """UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and not exists({so_against_quo})"""
+ .format(cond=cond, so_against_quo=so_against_quo),
+ (nowdate())
+ )
@frappe.whitelist()
def make_sales_invoice(source_name, target_doc=None):
diff --git a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json
index eab08e2..9646f2d 100644
--- a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json
+++ b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json
@@ -1,186 +1,96 @@
{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:quality_inspection_template_name",
- "beta": 0,
- "creation": "2018-01-24 16:23:41.691127",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
+ "actions": [],
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:quality_inspection_template_name",
+ "creation": "2018-01-24 16:23:41.691127",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "quality_inspection_template_name",
+ "item_quality_inspection_parameter"
+ ],
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "quality_inspection_template_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Quality Inspection Template Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "fieldname": "quality_inspection_template_name",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Quality Inspection Template Name",
+ "reqd": 1,
+ "unique": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "item_quality_inspection_parameter",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Item Quality Inspection Parameter",
- "length": 0,
- "no_copy": 0,
- "options": "Item Quality Inspection Parameter",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "fieldname": "item_quality_inspection_parameter",
+ "fieldtype": "Table",
+ "label": "Item Quality Inspection Parameter",
+ "options": "Item Quality Inspection Parameter",
+ "reqd": 1
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-02-21 12:05:29.304432",
- "modified_by": "Administrator",
- "module": "Stock",
- "name": "Quality Inspection Template",
- "name_case": "",
- "owner": "Administrator",
+ ],
+ "links": [
+ {
+ "group": "Quality Inspection",
+ "link_doctype": "Quality Inspection",
+ "link_fieldname": "quality_inspection_template"
+ }
+ ],
+ "modified": "2020-04-26 20:13:02.810132",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Quality Inspection Template",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "share": 1,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Stock User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Stock User",
+ "share": 1,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Quality Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Quality Manager",
+ "share": 1,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Manufacturing User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Manufacturing User",
+ "share": 1,
"write": 1
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
}
\ No newline at end of file