diff --git a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py index 52b848ed504..ec498837f5e 100644 --- a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py +++ b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py @@ -11,7 +11,7 @@ def execute(filters=None): columns=get_columns("Campaign Name") data=get_lead_data(filters or {}, "Campaign Name") return columns, data - + def get_columns(based_on): return [ { @@ -69,21 +69,21 @@ def get_columns(based_on): "width": 100 } ] - + def get_lead_data(filters, based_on): based_on_field = frappe.scrub(based_on) conditions = get_filter_conditions(filters) - + lead_details = frappe.db.sql(""" select {based_on_field}, name - from `tabLead` - where {based_on_field} is not null and {based_on_field} != '' {conditions} + from `tabLead` + where {based_on_field} is not null and {based_on_field} != '' {conditions} """.format(based_on_field=based_on_field, conditions=conditions), filters, as_dict=1) - + lead_map = frappe._dict() for d in lead_details: lead_map.setdefault(d.get(based_on_field), []).append(d.name) - + data = [] for based_on_value, leads in lead_map.items(): row = { @@ -94,42 +94,42 @@ def get_lead_data(filters, based_on): row["opp_count"] = get_lead_opp_count(leads) row["order_count"] = get_quotation_ordered_count(leads) row["order_value"] = get_order_amount(leads) or 0 - + row["opp_lead"] = flt(row["opp_count"]) / flt(row["lead_count"] or 1.0) * 100.0 row["quot_lead"] = flt(row["quot_count"]) / flt(row["lead_count"] or 1.0) * 100.0 - + row["order_quot"] = flt(row["order_count"]) / flt(row["quot_count"] or 1.0) * 100.0 - + data.append(row) - + return data - + def get_filter_conditions(filters): conditions="" if filters.from_date: conditions += " and date(creation) >= %(from_date)s" if filters.to_date: conditions += " and date(creation) <= %(to_date)s" - + return conditions - + def get_lead_quotation_count(leads): - return frappe.db.sql("""select count(name) from `tabQuotation` - where lead in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] - + return frappe.db.sql("""select count(name) from `tabQuotation` + where quotation_to = 'Lead' and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] #nosec + def get_lead_opp_count(leads): - return frappe.db.sql("""select count(name) from `tabOpportunity` - where lead in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] - + return frappe.db.sql("""select count(name) from `tabOpportunity` + where opportunity_from = 'Lead' and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] + def get_quotation_ordered_count(leads): - return frappe.db.sql("""select count(name) - from `tabQuotation` where status = 'Ordered' - and lead in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] - + return frappe.db.sql("""select count(name) + from `tabQuotation` where status = 'Ordered' and quotation_to = 'Lead' + and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] + def get_order_amount(leads): - return frappe.db.sql("""select sum(base_net_amount) + return frappe.db.sql("""select sum(base_net_amount) from `tabSales Order Item` where prevdoc_docname in ( - select name from `tabQuotation` where status = 'Ordered' - and lead in (%s) + select name from `tabQuotation` where status = 'Ordered' + and quotation_to = 'Lead' and party_name in (%s) )""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] \ No newline at end of file diff --git a/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py b/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py index 8134bc20032..6172a75fdd8 100644 --- a/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py +++ b/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py @@ -11,16 +11,61 @@ def execute(filters=None): columns=get_columns() data=get_lead_data(filters, "Lead Owner") return columns, data - + def get_columns(): return [ - _("Lead Owner") + ":Data:130", - _("Lead Count") + ":Int:80", - _("Opp Count") + ":Int:80", - _("Quot Count") + ":Int:80", - _("Order Count") + ":Int:100", - _("Order Value") + ":Float:100", - _("Opp/Lead %") + ":Float:100", - _("Quot/Lead %") + ":Float:100", - _("Order/Quot %") + ":Float:100" + { + "fieldname": "lead_owner", + "label": _("Lead Owner"), + "fieldtype": "Data", + "width": "130" + }, + { + "fieldname": "lead_count", + "label": _("Lead Count"), + "fieldtype": "Int", + "width": "80" + }, + { + "fieldname": "opp_count", + "label": _("Opp Count"), + "fieldtype": "Int", + "width": "80" + }, + { + "fieldname": "quot_count", + "label": _("Quot Count"), + "fieldtype": "Int", + "width": "80" + }, + { + "fieldname": "order_count", + "label": _("Order Count"), + "fieldtype": "Int", + "width": "100" + }, + { + "fieldname": "order_value", + "label": _("Order Value"), + "fieldtype": "Float", + "width": "100" + }, + { + "fieldname": "opp_lead", + "label": _("Opp/Lead %"), + "fieldtype": "Float", + "width": "100" + }, + { + "fieldname": "quot_lead", + "label": _("Quot/Lead %"), + "fieldtype": "Float", + "width": "100" + }, + { + "fieldname": "order_quot", + "label": _("Order/Quot %"), + "fieldtype": "Float", + "width": "100" + } ] \ No newline at end of file