Skip to content

Commit

Permalink
Grant commission on certains items only (#555)
Browse files Browse the repository at this point in the history
* feat: Grant commission on certain items only (backport frappe#27467)

* feat: Grant commission on certain items only (backport frappe#27467)

* fix

* fix
  • Loading branch information
fproldan committed Jan 4, 2023
1 parent 75b34fe commit 9818a31
Show file tree
Hide file tree
Showing 17 changed files with 206 additions and 71 deletions.
10 changes: 9 additions & 1 deletion erpnext/accounts/doctype/pos_invoice/pos_invoice.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@
"sales_team_section_break",
"sales_partner",
"column_break10",
"amount_eligible_for_commission",
"commission_rate",
"total_commission",
"section_break2",
Expand Down Expand Up @@ -1561,16 +1562,23 @@
"label": "Coupon Code",
"options": "Coupon Code",
"print_hide": 1
},
{
"fieldname": "amount_eligible_for_commission",
"fieldtype": "Currency",
"label": "Amount Eligible for Commission",
"read_only": 1
}
],
"icon": "fa fa-file-text",
"is_submittable": 1,
"links": [],
"modified": "2021-08-27 20:12:57.306772",
"modified": "2021-08-29 21:12:57.306772",
"modified_by": "Administrator",
"module": "Accounts",
"name": "POS Invoice",
"name_case": "Title Case",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
Expand Down
11 changes: 10 additions & 1 deletion erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"base_amount",
"pricing_rules",
"is_free_item",
"grant_commission",
"section_break_21",
"net_rate",
"net_amount",
Expand Down Expand Up @@ -800,14 +801,22 @@
"no_copy": 1,
"print_hide": 1,
"read_only": 1
},
{
"default": "0",
"fieldname": "grant_commission",
"fieldtype": "Check",
"label": "Grant Commission",
"read_only": 1
}
],
"istable": 1,
"links": [],
"modified": "2021-01-04 17:34:49.924531",
"modified": "2021-01-05 17:34:49.924531",
"modified_by": "Administrator",
"module": "Accounts",
"name": "POS Invoice Item",
"naming_rule": "Random",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
Expand Down
9 changes: 8 additions & 1 deletion erpnext/accounts/doctype/sales_invoice/sales_invoice.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@
"sales_team_section_break",
"sales_partner",
"column_break10",
"amount_eligible_for_commission",
"commission_rate",
"total_commission",
"section_break2",
Expand Down Expand Up @@ -2025,6 +2026,12 @@
"label": "Total Billing Hours",
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "amount_eligible_for_commission",
"fieldtype": "Currency",
"label": "Amount Eligible for Commission",
"read_only": 1
}
],
"icon": "fa fa-file-text",
Expand All @@ -2037,7 +2044,7 @@
"link_fieldname": "consolidated_invoice"
}
],
"modified": "2022-02-26 11:51:44.271169",
"modified": "2022-04-21 14:23:44.271169",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
Expand Down
23 changes: 23 additions & 0 deletions erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -2321,6 +2321,29 @@ def test_payment_statuses(self):
si.reload()
self.assertEqual(si.status, "Paid")

def test_sales_commission(self):
si = frappe.copy_doc(test_records[0])
item = copy.deepcopy(si.get('items')[0])
item.update({
"qty": 1,
"rate": 500,
"grant_commission": 1
})
si.append("items", item)

# Test valid values
for commission_rate, total_commission in ((0, 0), (10, 50), (100, 500)):
si.commission_rate = commission_rate
si.save()
self.assertEqual(si.amount_eligible_for_commission, 500)
self.assertEqual(si.total_commission, total_commission)

# Test invalid values
for commission_rate in (101, -1):
si.reload()
si.commission_rate = commission_rate
self.assertRaises(frappe.ValidationError, si.save)

def get_sales_invoice_for_e_invoice():
si = make_sales_invoice_for_ewaybill()
si.naming_series = 'INV-2020-.#####'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"stock_qty",
"comisi\u00f3n_section",
"porcentaje_comision",
"grant_commission",
"column_break_53",
"importe_comision",
"section_break_17",
Expand Down Expand Up @@ -853,15 +854,23 @@
"fieldtype": "Link",
"label": "Discount Account",
"options": "Account"
},
{
"default": "0",
"fieldname": "grant_commission",
"fieldtype": "Check",
"label": "Grant Commission",
"read_only": 1
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2021-08-19 15:42:53.435827",
"modified": "2021-08-20 16:42:53.435827",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",
"naming_rule": "Random",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
{
"add_total_row": 0,
"apply_user_permissions": 1,
"creation": "2013-05-06 12:28:23",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
"modified": "2017-03-06 05:52:57.645281",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Partners Commission",
"owner": "Administrator",
"query": "SELECT\n sales_partner as \"Sales Partner:Link/Sales Partner:150\",\n\tsum(base_net_total) as \"Invoiced Amount (Exclusive Tax):Currency:210\",\n\tsum(total_commission) as \"Total Commission:Currency:150\",\n\tsum(total_commission)*100/sum(base_net_total) as \"Average Commission Rate:Currency:170\"\nFROM\n\t`tabSales Invoice`\nWHERE\n\tdocstatus = 1 and ifnull(base_net_total, 0) > 0 and ifnull(total_commission, 0) > 0\nGROUP BY\n\tsales_partner\nORDER BY\n\t\"Total Commission:Currency:120\"",
"ref_doctype": "Sales Invoice",
"report_name": "Sales Partners Commission",
"report_type": "Query Report",
"add_total_row": 0,
"columns": [],
"creation": "2013-05-06 12:28:23",
"disable_prepared_report": 0,
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 3,
"is_standard": "Yes",
"modified": "2021-10-06 06:26:07.881340",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Partners Commission",
"owner": "Administrator",
"prepared_report": 0,
"query": "SELECT\n sales_partner as \"Sales Partner:Link/Sales Partner:220\",\n\tsum(base_net_total) as \"Invoiced Amount (Excl. Tax):Currency:220\",\n\tsum(amount_eligible_for_commission) as \"Amount Eligible for Commission:Currency:220\",\n\tsum(total_commission) as \"Total Commission:Currency:170\",\n\tsum(total_commission)*100/sum(amount_eligible_for_commission) as \"Average Commission Rate:Percent:220\"\nFROM\n\t`tabSales Invoice`\nWHERE\n\tdocstatus = 1 and ifnull(base_net_total, 0) > 0 and ifnull(total_commission, 0) > 0\nGROUP BY\n\tsales_partner\nORDER BY\n\t\"Total Commission:Currency:120\"",
"ref_doctype": "Sales Invoice",
"report_name": "Sales Partners Commission",
"report_type": "Query Report",
"roles": [
{
"role": "Accounts Manager"
},
},
{
"role": "Accounts User"
}
]
}
}
7 changes: 6 additions & 1 deletion erpnext/controllers/accounts_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,12 @@ def calculate_taxes_and_totals(self):
from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals
calculate_taxes_and_totals(self)

if self.doctype in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]:
if self.doctype in (
'Sales Order',
'Delivery Note',
'Sales Invoice',
'POS Invoice',
):
self.calculate_commission()
self.calculate_contribution()

Expand Down
25 changes: 18 additions & 7 deletions erpnext/controllers/selling_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,24 @@ def set_total_in_words(self):
self.in_words = money_in_words(amount, self.currency)

def calculate_commission(self):
if self.meta.get_field("commission_rate"):
self.round_floats_in(self, ["base_net_total", "commission_rate"])
if self.commission_rate > 100.0:
throw(_("Commission rate cannot be greater than 100"))
if not self.meta.get_field("commission_rate"):
return

self.round_floats_in(
self, ("amount_eligible_for_commission", "commission_rate")
)

if not (0 <= self.commission_rate <= 100.0):
throw("{} {}".format(_(self.meta.get_label("commission_rate")), _("must be between 0 and 100"),))

self.total_commission = flt(self.base_net_total * self.commission_rate / 100.0,
self.precision("total_commission"))
self.amount_eligible_for_commission = sum(
item.base_net_amount for item in self.items if item.grant_commission
)

self.total_commission = flt(
self.amount_eligible_for_commission * self.commission_rate / 100.0,
self.precision("total_commission")
)

def calculate_contribution(self):
if not self.meta.get_field("sales_team"):
Expand All @@ -139,7 +150,7 @@ def calculate_contribution(self):
self.round_floats_in(sales_person)

sales_person.allocated_amount = flt(
self.base_net_total * sales_person.allocated_percentage / 100.0,
self.amount_eligible_for_commission * sales_person.allocated_percentage / 100.0,
self.precision("allocated_amount", sales_person))

if sales_person.commission_rate:
Expand Down
10 changes: 7 additions & 3 deletions erpnext/public/js/controllers/transaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -1275,16 +1275,20 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({

calculate_incentives: function(frm, cdt, cdn) {
var child = locals[cdt][cdn];
var importe_comision = flt((child.porcentaje_comision * child.net_amount) / 100.0)
frappe.model.set_value(cdt, cdn, "importe_comision", importe_comision);
if (child.grant_commission) {
var importe_comision = flt((child.porcentaje_comision * child.net_amount) / 100.0)
frappe.model.set_value(cdt, cdn, "importe_comision", importe_comision);
}
},

calculate_total_incentives: function() {
if (this.frm.doc["sales_team"] || []) {
var total_incentives = 0.0;

$.each(this.frm.doc["items"] || [], function(i, item) {
total_incentives += flt(item.importe_comision);
if (item.grant_commission) {
total_incentives += flt(item.importe_comision);
}
});

$.each(this.frm.doc["sales_team"] || [], function(i, item) {
Expand Down
10 changes: 9 additions & 1 deletion erpnext/selling/doctype/sales_order/sales_order.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@
"sales_team_section_break",
"sales_partner",
"column_break7",
"amount_eligible_for_commission",
"commission_rate",
"total_commission",
"section_break1",
Expand Down Expand Up @@ -1519,16 +1520,23 @@
"fieldtype": "Small Text",
"label": "Dispatch Address",
"read_only": 1
},
{
"fieldname": "amount_eligible_for_commission",
"fieldtype": "Currency",
"label": "Amount Eligible for Commission",
"read_only": 1
}
],
"icon": "fa fa-file-text",
"idx": 105,
"is_submittable": 1,
"links": [],
"modified": "2021-09-28 13:09:51.515542",
"modified": "2021-09-30 15:09:51.515542",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
Expand Down
11 changes: 10 additions & 1 deletion erpnext/selling/doctype/sales_order_item/sales_order_item.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"stock_qty",
"comisi\u00f3n_section",
"porcentaje_comision",
"grant_commission",
"column_break_53",
"importe_comision",
"section_break_16",
Expand Down Expand Up @@ -813,15 +814,23 @@
"fieldname": "importe_comision",
"fieldtype": "Float",
"label": "Incentivo"
},
{
"default": "0",
"fieldname": "grant_commission",
"fieldtype": "Check",
"label": "Grant Commission",
"read_only": 1
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2022-07-07 15:02:24.732248",
"modified": "2022-07-08 16:02:24.732248",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order Item",
"naming_rule": "Random",
"owner": "Administrator",
"permissions": [],
"route": "app/doctype/Sales%20Order%20Item",
Expand Down
Loading

0 comments on commit 9818a31

Please sign in to comment.