Merge branch 'develop' into sla_fix
This commit is contained in:
commit
9323c3ae29
@ -25,7 +25,8 @@ def get_ordered_to_be_billed_data(args):
|
|||||||
from
|
from
|
||||||
`{parent_tab}`, `{child_tab}`
|
`{parent_tab}`, `{child_tab}`
|
||||||
where
|
where
|
||||||
`{parent_tab}`.name = `{child_tab}`.parent and `{parent_tab}`.docstatus = 1 and `{parent_tab}`.status != 'Closed'
|
`{parent_tab}`.name = `{child_tab}`.parent and `{parent_tab}`.docstatus = 1
|
||||||
|
and `{parent_tab}`.status not in ('Closed', 'Completed')
|
||||||
and `{child_tab}`.amount > 0 and round(`{child_tab}`.billed_amt *
|
and `{child_tab}`.amount > 0 and round(`{child_tab}`.billed_amt *
|
||||||
ifnull(`{parent_tab}`.conversion_rate, 1), {precision}) < `{child_tab}`.base_amount
|
ifnull(`{parent_tab}`.conversion_rate, 1), {precision}) < `{child_tab}`.base_amount
|
||||||
order by
|
order by
|
||||||
|
|||||||
@ -107,7 +107,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
if(doc.docstatus == 1) {
|
if(doc.docstatus == 1) {
|
||||||
if(!in_list(["Closed", "Delivered"], doc.status)) {
|
if(!in_list(["Closed", "Delivered"], doc.status)) {
|
||||||
if (this.frm.has_perm("submit")) {
|
if (this.frm.has_perm("submit")) {
|
||||||
if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) {
|
if(flt(doc.per_billed, 6) < 100 || flt(doc.per_received, 6) < 100) {
|
||||||
if (doc.status != "On Hold") {
|
if (doc.status != "On Hold") {
|
||||||
this.frm.add_custom_button(__('Hold'), () => this.hold_purchase_order(), __("Status"));
|
this.frm.add_custom_button(__('Hold'), () => this.hold_purchase_order(), __("Status"));
|
||||||
} else{
|
} else{
|
||||||
|
|||||||
@ -428,8 +428,9 @@ class BuyingController(StockController):
|
|||||||
elif not flt(d.rejected_qty):
|
elif not flt(d.rejected_qty):
|
||||||
d.rejected_qty = flt(d.received_qty) - flt(d.qty)
|
d.rejected_qty = flt(d.received_qty) - flt(d.qty)
|
||||||
|
|
||||||
|
val = flt(d.qty) + flt(d.rejected_qty)
|
||||||
# Check Received Qty = Accepted Qty + Rejected Qty
|
# Check Received Qty = Accepted Qty + Rejected Qty
|
||||||
if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
|
if (flt(val, d.precision("received_qty")) != flt(d.received_qty, d.precision("received_qty"))):
|
||||||
frappe.throw(_("Accepted + Rejected Qty must be equal to Received quantity for Item {0}").format(d.item_code))
|
frappe.throw(_("Accepted + Rejected Qty must be equal to Received quantity for Item {0}").format(d.item_code))
|
||||||
|
|
||||||
def validate_negative_quantity(self, item_row, field_list):
|
def validate_negative_quantity(self, item_row, field_list):
|
||||||
|
|||||||
@ -27,7 +27,7 @@ status_map = {
|
|||||||
],
|
],
|
||||||
"Quotation": [
|
"Quotation": [
|
||||||
["Draft", None],
|
["Draft", None],
|
||||||
["Submitted", "eval:self.docstatus==1"],
|
["Open", "eval:self.docstatus==1"],
|
||||||
["Lost", "eval:self.status=='Lost'"],
|
["Lost", "eval:self.status=='Lost'"],
|
||||||
["Ordered", "has_sales_order"],
|
["Ordered", "has_sales_order"],
|
||||||
["Cancelled", "eval:self.docstatus==2"],
|
["Cancelled", "eval:self.docstatus==2"],
|
||||||
|
|||||||
@ -46,7 +46,7 @@ update_and_get_user_progress = "erpnext.utilities.user_progress_utils.update_def
|
|||||||
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
on_session_creation = "erpnext.shopping_cart.utils.set_cart_count"
|
||||||
on_logout = "erpnext.shopping_cart.utils.clear_cart_count"
|
on_logout = "erpnext.shopping_cart.utils.clear_cart_count"
|
||||||
|
|
||||||
treeviews = ['Account', 'Cost Center', 'Warehouse', 'Item Group', 'Customer Group', 'Sales Person', 'Territory', 'Assessment Group']
|
treeviews = ['Account', 'Cost Center', 'Warehouse', 'Item Group', 'Customer Group', 'Sales Person', 'Territory', 'Assessment Group', 'Department']
|
||||||
|
|
||||||
# website
|
# website
|
||||||
update_website_context = ["erpnext.shopping_cart.utils.update_website_context", "erpnext.education.doctype.education_settings.education_settings.update_website_context"]
|
update_website_context = ["erpnext.shopping_cart.utils.update_website_context", "erpnext.education.doctype.education_settings.education_settings.update_website_context"]
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
frappe.ui.form.on('Department', {
|
frappe.ui.form.on('Department', {
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
// read-only for root department
|
// read-only for root department
|
||||||
if(!frm.doc.parent_department) {
|
if(!frm.doc.parent_department && !frm.is_new()) {
|
||||||
frm.set_read_only();
|
frm.set_read_only();
|
||||||
frm.set_intro(__("This is a root department and cannot be edited."));
|
frm.set_intro(__("This is a root department and cannot be edited."));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_events_in_timeline": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 1,
|
"allow_rename": 1,
|
||||||
@ -19,6 +20,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "department_name",
|
"fieldname": "department_name",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -52,6 +54,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "parent_department",
|
"fieldname": "parent_department",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -85,6 +88,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "company",
|
"fieldname": "company",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -118,6 +122,7 @@
|
|||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "is_group",
|
"fieldname": "is_group",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -150,6 +155,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "disabled",
|
"fieldname": "disabled",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -182,6 +188,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "section_break_4",
|
"fieldname": "section_break_4",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -214,6 +221,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "Days for which Holidays are blocked for this department.",
|
"description": "Days for which Holidays are blocked for this department.",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "leave_block_list",
|
"fieldname": "leave_block_list",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -246,6 +254,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "leave_section",
|
"fieldname": "leave_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -279,6 +288,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "The first Leave Approver in the list will be set as the default Leave Approver.",
|
"description": "The first Leave Approver in the list will be set as the default Leave Approver.",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "leave_approvers",
|
"fieldname": "leave_approvers",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -312,6 +322,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "expense_section",
|
"fieldname": "expense_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -345,6 +356,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"description": "The first Expense Approver in the list will be set as the default Expense Approver.",
|
"description": "The first Expense Approver in the list will be set as the default Expense Approver.",
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "expense_approvers",
|
"fieldname": "expense_approvers",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@ -378,6 +390,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "lft",
|
"fieldname": "lft",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -410,6 +423,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "rgt",
|
"fieldname": "rgt",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -442,6 +456,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
"fieldname": "old_parent",
|
"fieldname": "old_parent",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
@ -479,7 +494,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-08-29 06:26:12.995703",
|
"modified": "2019-06-25 18:43:05.550387",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Department",
|
"name": "Department",
|
||||||
@ -543,7 +558,7 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
"quick_entry": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 0,
|
"read_only_onload": 0,
|
||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
|
|||||||
@ -605,4 +605,5 @@ erpnext.patches.v11_1.delete_scheduling_tool
|
|||||||
erpnext.patches.v12_0.make_custom_fields_for_bank_remittance #14-06-2019
|
erpnext.patches.v12_0.make_custom_fields_for_bank_remittance #14-06-2019
|
||||||
execute:frappe.delete_doc_if_exists("Page", "support-analytics")
|
execute:frappe.delete_doc_if_exists("Page", "support-analytics")
|
||||||
erpnext.patches.v12_0.make_item_manufacturer
|
erpnext.patches.v12_0.make_item_manufacturer
|
||||||
|
erpnext.patches.v12_0.set_quotation_status
|
||||||
erpnext.patches.v12_0.set_priority_for_support
|
erpnext.patches.v12_0.set_priority_for_support
|
||||||
|
|||||||
7
erpnext/patches/v12_0/set_quotation_status.py
Normal file
7
erpnext/patches/v12_0/set_quotation_status.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
|
||||||
|
frappe.db.sql(""" UPDATE `tabQuotation` set status = 'Open'
|
||||||
|
where docstatus = 1 and status = 'Submitted' """)
|
||||||
File diff suppressed because it is too large
Load Diff
@ -2,11 +2,11 @@ frappe.listview_settings['Quotation'] = {
|
|||||||
add_fields: ["customer_name", "base_grand_total", "status",
|
add_fields: ["customer_name", "base_grand_total", "status",
|
||||||
"company", "currency", 'valid_till'],
|
"company", "currency", 'valid_till'],
|
||||||
get_indicator: function(doc) {
|
get_indicator: function(doc) {
|
||||||
if(doc.status==="Submitted") {
|
if(doc.status==="Open") {
|
||||||
if (doc.valid_till && doc.valid_till < frappe.datetime.nowdate()) {
|
if (doc.valid_till && doc.valid_till < frappe.datetime.nowdate()) {
|
||||||
return [__("Expired"), "darkgrey", "valid_till,<," + frappe.datetime.nowdate()];
|
return [__("Expired"), "darkgrey", "valid_till,<," + frappe.datetime.nowdate()];
|
||||||
} else {
|
} else {
|
||||||
return [__("Submitted"), "blue", "status,=,Submitted"];
|
return [__("Open"), "orange", "status,=,Open"];
|
||||||
}
|
}
|
||||||
} else if(doc.status==="Ordered") {
|
} else if(doc.status==="Ordered") {
|
||||||
return [__("Ordered"), "green", "status,=,Ordered"];
|
return [__("Ordered"), "green", "status,=,Ordered"];
|
||||||
|
|||||||
@ -34,7 +34,7 @@ frappe.ui.form.on("Sales Order", {
|
|||||||
},
|
},
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
if(frm.doc.docstatus === 1 && frm.doc.status !== 'Closed'
|
if(frm.doc.docstatus === 1 && frm.doc.status !== 'Closed'
|
||||||
&& flt(frm.doc.per_delivered) < 100 && flt(frm.doc.per_billed) < 100) {
|
&& flt(frm.doc.per_delivered, 6) < 100 && flt(frm.doc.per_billed, 6) < 100) {
|
||||||
frm.add_custom_button(__('Update Items'), () => {
|
frm.add_custom_button(__('Update Items'), () => {
|
||||||
erpnext.utils.update_child_items({
|
erpnext.utils.update_child_items({
|
||||||
frm: frm,
|
frm: frm,
|
||||||
|
|||||||
@ -90,9 +90,13 @@ erpnext.SalesFunnel = class SalesFunnel {
|
|||||||
|
|
||||||
get_data(btn) {
|
get_data(btn) {
|
||||||
var me = this;
|
var me = this;
|
||||||
if (me.options.chart == 'sales_funnel'){
|
const method_map = {
|
||||||
|
"sales_funnel": "erpnext.selling.page.sales_funnel.sales_funnel.get_funnel_data",
|
||||||
|
"opp_by_lead_source": "erpnext.selling.page.sales_funnel.sales_funnel.get_opp_by_lead_source",
|
||||||
|
"sales_pipeline": "erpnext.selling.page.sales_funnel.sales_funnel.get_pipeline_data"
|
||||||
|
};
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: "erpnext.selling.page.sales_funnel.sales_funnel.get_funnel_data",
|
method: method_map[this.options.chart],
|
||||||
args: {
|
args: {
|
||||||
from_date: this.options.from_date,
|
from_date: this.options.from_date,
|
||||||
to_date: this.options.to_date,
|
to_date: this.options.to_date,
|
||||||
@ -106,54 +110,11 @@ erpnext.SalesFunnel = class SalesFunnel {
|
|||||||
const $parent = me.elements.funnel_wrapper;
|
const $parent = me.elements.funnel_wrapper;
|
||||||
$parent.html(__('No data for this period'));
|
$parent.html(__('No data for this period'));
|
||||||
} else {
|
} else {
|
||||||
me.render_funnel();
|
me.render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (me.options.chart == 'opp_by_lead_source'){
|
|
||||||
frappe.call({
|
|
||||||
method: "erpnext.selling.page.sales_funnel.sales_funnel.get_opp_by_lead_source",
|
|
||||||
args: {
|
|
||||||
from_date: this.options.from_date,
|
|
||||||
to_date: this.options.to_date,
|
|
||||||
company: this.company
|
|
||||||
},
|
|
||||||
btn: btn,
|
|
||||||
callback: function(r) {
|
|
||||||
if(!r.exc) {
|
|
||||||
me.options.data = r.message;
|
|
||||||
if (me.options.data=='empty') {
|
|
||||||
const $parent = me.elements.funnel_wrapper;
|
|
||||||
$parent.html(__('No data for this period'));
|
|
||||||
} else {
|
|
||||||
me.render_opp_by_lead_source();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (me.options.chart == 'sales_pipeline'){
|
|
||||||
frappe.call({
|
|
||||||
method: "erpnext.selling.page.sales_funnel.sales_funnel.get_pipeline_data",
|
|
||||||
args: {
|
|
||||||
from_date: this.options.from_date,
|
|
||||||
to_date: this.options.to_date,
|
|
||||||
company: this.company
|
|
||||||
},
|
|
||||||
btn: btn,
|
|
||||||
callback: function(r) {
|
|
||||||
if(!r.exc) {
|
|
||||||
me.options.data = r.message;
|
|
||||||
if (me.options.data=='empty') {
|
|
||||||
const $parent = me.elements.funnel_wrapper;
|
|
||||||
$parent.html(__('No data for this period'));
|
|
||||||
} else {
|
|
||||||
me.render_pipeline();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -161,9 +122,9 @@ erpnext.SalesFunnel = class SalesFunnel {
|
|||||||
if (me.options.chart == 'sales_funnel'){
|
if (me.options.chart == 'sales_funnel'){
|
||||||
me.render_funnel();
|
me.render_funnel();
|
||||||
} else if (me.options.chart == 'opp_by_lead_source'){
|
} else if (me.options.chart == 'opp_by_lead_source'){
|
||||||
me.render_opp_by_lead_source();
|
me.render_chart("Sales Opportunities by Source");
|
||||||
} else if (me.options.chart == 'sales_pipeline'){
|
} else if (me.options.chart == 'sales_pipeline'){
|
||||||
me.render_pipeline();
|
me.render_chart("Sales Pipeline by Stage");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,15 +231,15 @@ erpnext.SalesFunnel = class SalesFunnel {
|
|||||||
context.fillText(__(title), width + 20, y_mid);
|
context.fillText(__(title), width + 20, y_mid);
|
||||||
}
|
}
|
||||||
|
|
||||||
render_opp_by_lead_source() {
|
render_chart(title) {
|
||||||
let me = this;
|
let me = this;
|
||||||
let currency = frappe.defaults.get_default("currency");
|
let currency = frappe.defaults.get_default("currency");
|
||||||
|
|
||||||
let chart_data = me.options.data ? me.options.data : null;
|
let chart_data = me.options.data ? me.options.data : null;
|
||||||
|
|
||||||
const parent = me.elements.funnel_wrapper[0];
|
const parent = me.elements.funnel_wrapper[0];
|
||||||
this.chart = new Chart(parent, {
|
this.chart = new frappe.Chart(parent, {
|
||||||
title: __("Sales Opportunities by Source"),
|
title: title,
|
||||||
height: 400,
|
height: 400,
|
||||||
data: chart_data,
|
data: chart_data,
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
@ -290,23 +251,4 @@ erpnext.SalesFunnel = class SalesFunnel {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
render_pipeline() {
|
|
||||||
let me = this;
|
|
||||||
let currency = frappe.defaults.get_default("currency");
|
|
||||||
|
|
||||||
let chart_data = me.options.data ? me.options.data : null;
|
|
||||||
|
|
||||||
const parent = me.elements.funnel_wrapper[0];
|
|
||||||
this.chart = new Chart(parent, {
|
|
||||||
title: __("Sales Pipeline by Stage"),
|
|
||||||
height: 400,
|
|
||||||
data: chart_data,
|
|
||||||
type: 'bar',
|
|
||||||
tooltipOptions: {
|
|
||||||
formatTooltipY: d => format_currency(d, currency),
|
|
||||||
},
|
|
||||||
colors: ['light-green', 'green']
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user