diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index a16794b696..e852de2d7b 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@ import frappe
from erpnext.hooks import regional_overrides
from frappe.utils import getdate
-__version__ = '10.0.23'
+__version__ = '10.1.0'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 913aa6e360..3f7c9d9b6c 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -59,16 +59,21 @@ class PaymentEntry(AccountsController):
if self.difference_amount:
frappe.throw(_("Difference Amount must be zero"))
self.make_gl_entries()
+ self.update_outstanding_amounts()
self.update_advance_paid()
self.update_expense_claim()
def on_cancel(self):
self.setup_party_account_field()
self.make_gl_entries(cancel=1)
+ self.update_outstanding_amounts()
self.update_advance_paid()
self.update_expense_claim()
self.delink_advance_entry_references()
+ def update_outstanding_amounts(self):
+ self.set_missing_ref_details(force=True)
+
def validate_duplicate_entry(self):
reference_names = []
for d in self.get("references"):
@@ -130,14 +135,14 @@ class PaymentEntry(AccountsController):
self.set_missing_ref_details()
- def set_missing_ref_details(self):
+ def set_missing_ref_details(self, force=False):
for d in self.get("references"):
if d.allocated_amount:
ref_details = get_reference_details(d.reference_doctype,
d.reference_name, self.party_account_currency)
for field, value in ref_details.items():
- if not d.get(field):
+ if not d.get(field) or force:
d.set(field, value)
def validate_payment_type(self):
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index ebd9439d0e..0901046af2 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -3,9 +3,26 @@
frappe.provide("erpnext.accounts");
+frappe.ui.form.on("Payment Reconciliation Payment", {
+ invoice_number: function(frm, cdt, cdn) {
+ var row = locals[cdt][cdn];
+ if(row.invoice_number) {
+ var parts = row.invoice_number.split(' | ');
+ var invoice_type = parts[0];
+ var invoice_number = parts[1];
+
+ var invoice_amount = frm.doc.invoices.filter(function(d) {
+ return d.invoice_type === invoice_type && d.invoice_number === invoice_number;
+ })[0].outstanding_amount;
+
+ frappe.model.set_value(cdt, cdn, "allocated_amount", Math.min(invoice_amount, row.amount));
+ }
+ }
+});
+
erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.extend({
onload: function() {
- var me = this
+ var me = this;
this.frm.set_query("party_type", function() {
return{
query: "erpnext.setup.doctype.party_type.party_type.get_party_type"
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index 5910a2402d..3c87fe5433 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -55,6 +55,7 @@ class PaymentReconciliation(Document):
THEN 1=1
ELSE {bank_account_condition}
END)
+ order by t1.posting_date
""".format(**{
"dr_or_cr": dr_or_cr,
"bank_account_condition": bank_account_condition,
diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.py b/erpnext/accounts/doctype/pos_profile/pos_profile.py
index 0bce49c016..20a90f4bfe 100644
--- a/erpnext/accounts/doctype/pos_profile/pos_profile.py
+++ b/erpnext/accounts/doctype/pos_profile/pos_profile.py
@@ -32,7 +32,7 @@ class POSProfile(Document):
.format(res[0][0], row.user), raise_exception=1)
elif not row.default and not res:
msgprint(_("User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User.")
- .format(row.user, row.idx), raise_exception=1)
+ .format(row.user, row.idx))
def validate_all_link_fields(self):
accounts = {"Account": [self.income_account,
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 754fc6b177..93c22067d8 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -106,6 +106,10 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
on_submit: function(doc, dt, dn) {
var me = this;
+ if (frappe.get_route()[0] != 'Sales Invoice') {
+ return
+ }
+
$.each(doc["items"], function(i, row) {
if(row.delivery_note) frappe.model.clear_doc("Delivery Note", row.delivery_note)
})
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index 8917c9ff63..a39b831250 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -50,10 +50,12 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
row += [
d.customer_group, d.debit_to, ", ".join(mode_of_payments.get(d.parent, [])),
d.territory, d.project, d.company, d.sales_order,
- delivery_note, d.income_account, d.cost_center, d.stock_qty, d.stock_uom,
- d.base_net_rate, d.base_net_amount
+ delivery_note, d.income_account, d.cost_center, d.stock_qty, d.stock_uom
]
+ row += [d.base_net_rate/d.stock_qty, d.base_net_amount] \
+ if d.stock_uom != d.uom else [d.base_net_rate, d.base_net_amount]
+
total_tax = 0
for tax in tax_columns:
item_tax = itemised_tax.get(d.name, {}).get(tax, {})
@@ -131,7 +133,7 @@ def get_items(filters, additional_query_columns):
`tabSales Invoice Item`.stock_uom, `tabSales Invoice Item`.base_net_rate,
`tabSales Invoice Item`.base_net_amount, `tabSales Invoice`.customer_name,
`tabSales Invoice`.customer_group, `tabSales Invoice Item`.so_detail,
- `tabSales Invoice`.update_stock {0}
+ `tabSales Invoice`.update_stock, `tabSales Invoice Item`.uom {0}
from `tabSales Invoice`, `tabSales Invoice Item`
where `tabSales Invoice`.name = `tabSales Invoice Item`.parent
and `tabSales Invoice`.docstatus = 1 %s %s
diff --git a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json
index f167d064ca..dfae780347 100644
--- a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json
+++ b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:46:55",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:16:25.027061",
+ "modified": "2018-02-21 01:28:31.261299",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Trends",
diff --git a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json
index d7837e378c..7437550cc2 100644
--- a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json
+++ b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:44:21",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:15:12.885723",
+ "modified": "2018-02-21 01:28:03.622485",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Trends",
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index eae8241aef..21629f9b9b 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -3096,6 +3096,37 @@
"set_only_once": 0,
"unique": 0
},
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": "supplied_items",
+ "columns": 0,
+ "fieldname": "raw_material_details",
+ "fieldtype": "Section Break",
+ "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": "Raw Materials Supplied",
+ "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": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
@@ -3324,7 +3355,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-01-11 14:39:36.869688",
+ "modified": "2018-02-17 11:00:05.037716",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
diff --git a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json
index aabb5b617a..ca58c4ed44 100644
--- a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json
+++ b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:45:01",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:16:13.121638",
+ "modified": "2018-02-21 01:28:37.416562",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order Trends",
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 1425160629..1720b1a5e9 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -883,6 +883,7 @@ def get_advance_payment_entries(party_type, party, party_account,
t1.name = t2.parent and t1.{0} = %s and t1.payment_type = %s
and t1.party_type = %s and t1.party = %s and t1.docstatus = 1
and t2.reference_doctype = %s {1}
+ order by t1.posting_date
""".format(party_account_field, reference_condition),
[party_account, payment_type, party_type, party, order_doctype] + order_list, as_dict=1)
@@ -894,6 +895,7 @@ def get_advance_payment_entries(party_type, party, party_account,
where
{0} = %s and party_type = %s and party = %s and payment_type = %s
and docstatus = 1 and unallocated_amount > 0
+ order by posting_date
""".format(party_account_field), (party_account, party_type, party, payment_type), as_dict=1)
return list(payment_entries_against_order) + list(unallocated_payment_entries)
diff --git a/erpnext/docs/user/manual/en/accounts/pricing-rule.md b/erpnext/docs/user/manual/en/accounts/pricing-rule.md
index ad68b0f5d6..c4a3eb9145 100644
--- a/erpnext/docs/user/manual/en/accounts/pricing-rule.md
+++ b/erpnext/docs/user/manual/en/accounts/pricing-rule.md
@@ -52,7 +52,6 @@ Using Price List Rule, you can ultimately define rate or %discount to be applied
Rate or Discount specified in the Pricing Rule will be applied only if above applicability rules are matched with values in the transaction. Rate mentioned in Pricing Rule will be given priority over item's Price List rate.
->>>>>>> Renamed price to rate in pricing rule
#### 2.2 Discount Percentage
diff --git a/erpnext/healthcare/page/medical_record/medical_record.css b/erpnext/healthcare/page/medical_record/medical_record.css
index e76df0f82e..70014da1c0 100644
--- a/erpnext/healthcare/page/medical_record/medical_record.css
+++ b/erpnext/healthcare/page/medical_record/medical_record.css
@@ -14,6 +14,10 @@
margin-bottom: -4px;
}
+.medical_record-row > * {
+ z-index: -999;
+}
+
.date-indicator {
background:none;
font-size:12px;
@@ -48,7 +52,6 @@
.medical_record-date {
padding: 15px;
padding-right: 0px;
- z-index: 1;
}
#page-medical_record .plot-wrapper {
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index f7f1720551..a2f7e5667f 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -11,7 +11,7 @@ app_email = "info@erpnext.com"
app_license = "GNU General Public License (v3)"
source_link = "https://github.com/frappe/erpnext"
-develop_version = '9.x.x-develop'
+develop_version = '10.x.x-develop'
error_report_email = "support@erpnext.com"
diff --git a/erpnext/hub_node/doctype/hub_settings/hub_settings.py b/erpnext/hub_node/doctype/hub_settings/hub_settings.py
index 50b8e01461..59807532e0 100644
--- a/erpnext/hub_node/doctype/hub_settings/hub_settings.py
+++ b/erpnext/hub_node/doctype/hub_settings/hub_settings.py
@@ -10,9 +10,7 @@ from frappe import _
from erpnext.utilities.product import get_price, get_qty_in_stock
from six import string_types
-# hub_url = "http://erpnext.hub:8000"
-hub_url = "https://hub.erpnext.org"
-# hub_url = "http://192.168.29.145:3000"
+hub_url = "https://hubmarket.org"
class HubSetupError(frappe.ValidationError): pass
@@ -102,4 +100,4 @@ def reset_hub_settings(last_sync_datetime = ""):
@frappe.whitelist()
def sync():
hub_settings = frappe.get_doc('Hub Settings')
- hub_settings.sync()
\ No newline at end of file
+ hub_settings.sync()
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 8fa6517f5e..953b4bc762 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -202,6 +202,14 @@ class BOM(WebsiteGenerator):
if not from_child_bom:
frappe.msgprint(_("Cost Updated"))
+ def update_parent_cost(self):
+ if self.total_cost:
+ cost = self.total_cost / self.quantity
+
+ frappe.db.sql("""update `tabBOM Item` set rate=%s, amount=stock_qty*%s
+ where bom_no = %s and docstatus < 2 and parenttype='BOM'""",
+ (cost, cost, self.name))
+
def get_bom_unitcost(self, bom_no):
bom = frappe.db.sql("""select name, base_total_cost/quantity as unit_cost from `tabBOM`
where is_active = 1 and name = %s""", bom_no, as_dict=1)
diff --git a/erpnext/manufacturing/doctype/bom/bom_tree.js b/erpnext/manufacturing/doctype/bom/bom_tree.js
index 6cbd7a2ab1..4ec9bef998 100644
--- a/erpnext/manufacturing/doctype/bom/bom_tree.js
+++ b/erpnext/manufacturing/doctype/bom/bom_tree.js
@@ -13,6 +13,7 @@ frappe.treeview_settings["BOM"] = {
disable_add_node: true,
root_label: "BOM", //fieldname from filters
get_tree_root: false,
+ show_expand_all: false,
get_label: function(node) {
if(node.data.qty) {
return node.data.qty + " x " + node.data.item_code;
diff --git a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
index 3b6c3a15ef..ec948eb5ed 100644
--- a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
+++ b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
@@ -13,11 +13,14 @@ class BOMUpdateTool(Document):
def replace_bom(self):
self.validate_bom()
self.update_new_bom()
- bom_list = self.get_parent_boms()
+ bom_list = self.get_parent_boms(self.new_bom)
updated_bom = []
for bom in bom_list:
bom_obj = frappe.get_doc("BOM", bom)
updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
+ bom_obj.calculate_cost()
+ bom_obj.update_parent_cost()
+ bom_obj.db_update()
frappe.msgprint(_("BOM replaced"))
@@ -38,10 +41,18 @@ class BOMUpdateTool(Document):
rate=%s, amount=stock_qty*%s where bom_no = %s and docstatus < 2 and parenttype='BOM'""",
(self.new_bom, new_bom_unitcost, new_bom_unitcost, self.current_bom))
- def get_parent_boms(self):
- return [d[0] for d in frappe.db.sql("""select distinct parent
- from `tabBOM Item` where ifnull(bom_no, '') = %s and docstatus < 2 and parenttype='BOM'""",
- self.new_bom)]
+ def get_parent_boms(self, bom, bom_list=None):
+ if not bom_list:
+ bom_list = []
+
+ data = frappe.db.sql(""" select distinct parent from `tabBOM Item`
+ where ifnull(bom_no, '') = %s and docstatus < 2 and parenttype='BOM'""", bom)
+
+ for d in data:
+ bom_list.append(d[0])
+ self.get_parent_boms(d[0], bom_list)
+
+ return bom_list
@frappe.whitelist()
def enqueue_update_cost():
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index c4e3949601..bbba837ea3 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -504,4 +504,4 @@ execute:frappe.delete_doc('DocType', 'Production Planning Tool', ignore_missing=
erpnext.patches.v10_0.migrate_daily_work_summary_settings_to_daily_work_summary_group
erpnext.patches.v10_0.add_default_cash_flow_mappers
erpnext.patches.v11_0.make_quality_inspection_template
-erpnext.patches.v10_0.update_territory_and_customer_group
+erpnext.patches.v10_0.update_territory_and_customer_group
\ No newline at end of file
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index c1b020bbe5..f00b84f368 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -92,7 +92,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
item.amount = flt(item.rate * item.qty, precision("amount", item));
item.net_amount = item.amount;
item.item_tax_amount = 0.0;
- item.total_weight = flt(item.weight_per_unit * item.qty);
+ item.total_weight = flt(item.weight_per_unit * item.stock_qty);
me.set_in_company_currency(item, ["price_list_rate", "rate", "amount", "net_rate", "net_amount"]);
});
diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py
index 8dc3bb1b5a..e66f142395 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.py
+++ b/erpnext/regional/report/gstr_1/gstr_1.py
@@ -121,7 +121,6 @@ class Gstr1Report(object):
conditions += """ and SUBSTR(place_of_supply, 1, 2) != SUBSTR(company_gstin, 1, 2)
and grand_total > {0} and is_return != 1 and customer in ('{1}')""".\
format(flt(b2c_limit), "', '".join([frappe.db.escape(c.name) for c in customers]))
-
elif self.filters.get("type_of_business") == "B2C Small":
conditions += """ and (
SUBSTR(place_of_supply, 1, 2) = SUBSTR(company_gstin, 1, 2)
diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.js b/erpnext/selling/page/point_of_sale/point_of_sale.js
index 72250c265f..fccebd4991 100644
--- a/erpnext/selling/page/point_of_sale/point_of_sale.js
+++ b/erpnext/selling/page/point_of_sale/point_of_sale.js
@@ -258,17 +258,22 @@ erpnext.pos.PointOfSale = class PointOfSale {
if (field == 'qty' && value < 0) {
frappe.msgprint(__("Quantity must be positive"));
value = item.qty;
+ } else {
+ item[field] = value;
+ if (field == "serial_no" && value) {
+ let serial_nos = value.split("\n");
+ item["qty"] = serial_nos.filter(d => {
+ return d!=="";
+ }).length;
+ }
}
- if (field) {
- return frappe.model.set_value(item.doctype, item.name, field, value)
- .then(() => this.frm.script_manager.trigger('qty', item.doctype, item.name))
- .then(() => {
- if (field === 'qty' && item.qty === 0) {
- frappe.model.clear_doc(item.doctype, item.name);
- }
- })
- }
+ return this.frm.script_manager.trigger('qty', item.doctype, item.name)
+ .then(() => {
+ if (field === 'qty' && item.qty === 0) {
+ frappe.model.clear_doc(item.doctype, item.name);
+ }
+ })
return Promise.resolve();
}
@@ -285,24 +290,13 @@ erpnext.pos.PointOfSale = class PointOfSale {
}
submit_sales_invoice() {
- var is_saved = 0;
- if(!this.frm.doc.__islocal){
- is_saved = 1;
- }
- frappe.confirm(__("Permanently Submit {0}?", [this.frm.doc.name]), () => {
- frappe.call({
- method: 'erpnext.selling.page.point_of_sale.point_of_sale.submit_invoice',
- freeze: true,
- args: {
- doc: this.frm.doc,
- is_saved: is_saved
- }
- }).then(r => {
- if(r.message) {
- this.frm.doc = r.message;
+ this.frm.savesubmit()
+ .then((r) => {
+ if (r && r.doc) {
+ this.frm.doc.docstatus = r.doc.docstatus;
frappe.show_alert({
indicator: 'green',
- message: __(`Sales invoice ${r.message.name} created succesfully`)
+ message: __(`Sales invoice ${r.doc.name} created succesfully`)
});
this.toggle_editing();
@@ -310,21 +304,22 @@ erpnext.pos.PointOfSale = class PointOfSale {
this.set_primary_action_in_modal();
}
});
- });
}
set_primary_action_in_modal() {
- this.frm.msgbox = frappe.msgprint(
- `
- ${__('Print')}
-
- ${__('New')}`
- );
+ if (!this.frm.msgbox) {
+ this.frm.msgbox = frappe.msgprint(
+ `
+ ${__('Print')}
+
+ ${__('New')}`
+ );
- $(this.frm.msgbox.body).find('.btn-default').on('click', () => {
- this.frm.msgbox.hide();
- this.make_new_invoice();
- })
+ $(this.frm.msgbox.body).find('.btn-default').on('click', () => {
+ this.frm.msgbox.hide();
+ this.make_new_invoice();
+ })
+ }
}
change_pos_profile() {
@@ -493,11 +488,6 @@ erpnext.pos.PointOfSale = class PointOfSale {
//
// }).addClass('visible-xs');
- this.page.add_menu_item(__("Form View"), function () {
- frappe.model.sync(me.frm.doc);
- frappe.set_route("Form", me.frm.doc.doctype, me.frm.doc.name);
- });
-
this.page.add_menu_item(__("POS Profile"), function () {
frappe.set_route('List', 'POS Profile');
});
@@ -606,6 +596,7 @@ class POSCart {
this.$taxes_and_totals.html(this.get_taxes_and_totals());
this.numpad && this.numpad.reset_value();
this.customer_field.set_value("");
+ this.frm.msgbox = "";
this.$discount_amount.find('input:text').val('');
this.wrapper.find('.grand-total-value').text(
diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.py b/erpnext/selling/page/point_of_sale/point_of_sale.py
index bbfb5adfb9..fe13432a81 100644
--- a/erpnext/selling/page/point_of_sale/point_of_sale.py
+++ b/erpnext/selling/page/point_of_sale/point_of_sale.py
@@ -90,23 +90,6 @@ def get_conditions(item_code, serial_no, batch_no, barcode):
return '%%%s%%'%(frappe.db.escape(item_code)), condition
-@frappe.whitelist()
-def submit_invoice(doc,is_saved):
- if isinstance(doc, string_types):
- args = json.loads(doc)
-
- if(cint(is_saved) == 1):
- doc = frappe.get_doc('Sales Invoice',args["name"])
- else:
- doc = frappe.new_doc('Sales Invoice')
-
- doc.update(args)
- doc.run_method("set_missing_values")
- doc.run_method("calculate_taxes_and_totals")
- doc.submit()
-
- return doc
-
def get_item_group_condition(pos_profile):
cond = "and 1=1"
item_groups = get_item_groups(pos_profile)
diff --git a/erpnext/selling/report/quotation_trends/quotation_trends.json b/erpnext/selling/report/quotation_trends/quotation_trends.json
index 0dae26bdb2..5587cc68b4 100644
--- a/erpnext/selling/report/quotation_trends/quotation_trends.json
+++ b/erpnext/selling/report/quotation_trends/quotation_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-07 16:01:16",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:15:33.967044",
+ "modified": "2018-02-21 01:28:14.928929",
"modified_by": "Administrator",
"module": "Selling",
"name": "Quotation Trends",
diff --git a/erpnext/selling/report/sales_order_trends/sales_order_trends.json b/erpnext/selling/report/sales_order_trends/sales_order_trends.json
index 1ae8957ba4..9dfc7d0789 100644
--- a/erpnext/selling/report/sales_order_trends/sales_order_trends.json
+++ b/erpnext/selling/report/sales_order_trends/sales_order_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:43:30",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:15:01.634392",
+ "modified": "2018-02-20 08:05:46.191588",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order Trends",
diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
index 558a9af061..025e740173 100644
--- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
+++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
@@ -13,10 +13,8 @@ def execute(filters=None):
entries = get_entries(filters)
item_details = get_item_details()
data = []
- total_contribution_amount = 0
- for d in entries:
- total_contribution_amount += flt(d.contribution_amt)
+ for d in entries:
data.append([
d.name, d.customer, d.territory, d.posting_date, d.item_code,
item_details.get(d.item_code, {}).get("item_group"), item_details.get(d.item_code, {}).get("brand"),
@@ -25,8 +23,6 @@ def execute(filters=None):
if data:
total_row = [""]*len(data[0])
- total_row[0] = _("Total")
- total_row[-1] = total_contribution_amount
data.append(total_row)
return columns, data
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index 7599cd229b..45de5e7550 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -163,9 +163,9 @@ def notify_customers(docname, date, driver, vehicle, sender_email, delivery_noti
if delivery_stop_info.delivery_notes:
delivery_notes = (delivery_stop_info.delivery_notes).split(",")
+ default_print_format = frappe.get_meta('Delivery Note').default_print_format
attachments = []
for delivery_note in delivery_notes:
- default_print_format = frappe.get_value('Delivery Note', delivery_note, 'default_print_format')
attachments.append(
frappe.attach_print('Delivery Note',
delivery_note,
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index f51652cf15..d36b6cf827 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -109,9 +109,9 @@ class LandedCostVoucher(Document):
# set valuation amount in pr item
doc.update_valuation_rate("items")
- # save will update landed_cost_voucher_amount and voucher_amount in PR,
- # as those fields are allowed to edit after submit
- doc.save()
+ # db_update will update and save landed_cost_voucher_amount and voucher_amount in PR
+ for item in doc.get("items"):
+ item.db_update()
# update latest valuation rate in serial no
self.update_rate_in_serial_no(doc)
diff --git a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.json b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.json
index 29aeab105c..fe133e9d5a 100644
--- a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.json
+++ b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:42:11",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:18:32.793637",
+ "modified": "2018-02-21 01:28:47.049042",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note Trends",
diff --git a/erpnext/stock/report/item_balance/__init__.py b/erpnext/stock/report/item_balance/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/erpnext/stock/report/item_balance/item_balance.json b/erpnext/stock/report/item_balance/item_balance.json
new file mode 100644
index 0000000000..af58fb2c60
--- /dev/null
+++ b/erpnext/stock/report/item_balance/item_balance.json
@@ -0,0 +1,30 @@
+{
+ "add_total_row": 0,
+ "apply_user_permissions": 1,
+ "creation": "2018-02-17 19:52:16.370979",
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2018-02-19 12:03:53.902167",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Item Balance (Simple)",
+ "owner": "Administrator",
+ "query": "select a.item_code as \"Item:Link/Item:120\",\n\t a.item_name as \"Item Name::150\",\n\t a.item_group as \"Item Group:Link/Item Group:120\",\n\t a.brand as \"Brand:Link/Brand:120\",\n\t a.description as \"Description::150\",\n\t b.warehouse as \"Warehouse:Link/Warehouse:120\",\n\t b.actual_qty as \"Balance Qty:Float:140\"\n from `tabItem` a left join `tabBin` b\n ON a.item_code = b.item_code",
+ "ref_doctype": "Bin",
+ "report_name": "Item Balance (Simple)",
+ "report_type": "Query Report",
+ "roles": [
+ {
+ "role": "Sales User"
+ },
+ {
+ "role": "Purchase User"
+ },
+ {
+ "role": "Stock User"
+ }
+ ]
+}
diff --git a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.json b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.json
index 3a09b43a78..696f81675c 100644
--- a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.json
+++ b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.json
@@ -1,5 +1,5 @@
{
- "add_total_row": 0,
+ "add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-06-13 18:45:44",
"disabled": 0,
@@ -7,7 +7,7 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
- "modified": "2017-02-24 20:16:00.211762",
+ "modified": "2018-02-21 01:28:22.682161",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt Trends",
diff --git a/erpnext/templates/emails/reorder_item.html b/erpnext/templates/emails/reorder_item.html
index c4039e3ee0..c1aa897038 100644
--- a/erpnext/templates/emails/reorder_item.html
+++ b/erpnext/templates/emails/reorder_item.html
@@ -7,8 +7,9 @@
Renaming...
"); frappe.call({ diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js index 7e70f76fa0..746ac79488 100644 --- a/erpnext/utilities/page/leaderboard/leaderboard.js +++ b/erpnext/utilities/page/leaderboard/leaderboard.js @@ -17,14 +17,15 @@ frappe.Leaderboard = Class.extend({ this.$sidebar_list = this.page.sidebar.find('ul'); // const list of doctypes - this.doctypes = ["Customer", "Item", "Supplier", "Sales Partner"]; + this.doctypes = ["Customer", "Item", "Supplier", "Sales Partner","Sales Person"]; this.timespans = ["Week", "Month", "Quarter", "Year"]; - this.desc_fields = ["total_amount", "total_request", "annual_billing", "commission_rate"]; this.filters = { - "Customer": ["total_amount", "total_item_purchased"], - "Item": ["total_request", "total_purchase", "avg_price"], - "Supplier": ["annual_billing", "total_unpaid"], - "Sales Partner": ["commission_rate", "target_qty", "target_amount"], + "Customer": ["total_sales_amount", "total_qty_sold", "outstanding_amount", ], + "Item": ["total_sales_amount", "total_qty_sold", "total_purchase_amount", + "total_qty_purchased", "available_stock_qty", "available_stock_value"], + "Supplier": ["total_purchase_amount", "total_qty_purchased", "outstanding_amount"], + "Sales Partner": ["total_sales_amount", "total_commision"], + "Sales Person": ["total_sales_amount"], }; // for saving current selected filters @@ -58,14 +59,24 @@ frappe.Leaderboard = Class.extend({ this.get_sidebar_item(doctype).appendTo(this.$sidebar_list); }); + this.company_select = this.page.add_field({ + fieldname: 'company', + label: __('Company'), + fieldtype:'Link', + options:'Company', + default:frappe.defaults.get_default('company'), + reqd: 1, + change: function() { + me.options.selected_company = this.value; + me.make_request($container); + } + }); this.timespan_select = this.page.add_select(__("Timespan"), this.timespans.map(d => { return {"label": __(d), value: d } }) ); - // this.timespan_select.val(this.timespans[1]); - this.type_select = this.page.add_select(__("Type"), me.options.selected_filter.map(d => { return {"label": __(frappe.model.unscrub(d)), value: d } @@ -76,6 +87,7 @@ frappe.Leaderboard = Class.extend({ let $li = $(this); let doctype = $li.find('span').html(); + me.options.selected_company = frappe.defaults.get_default('company'); me.options.selected_doctype = doctype; me.options.selected_filter = me.filters[doctype]; me.options.selected_filter_item = me.filters[doctype][0]; @@ -114,16 +126,18 @@ frappe.Leaderboard = Class.extend({ }); }, - get_leaderboard: function (notify, $container, start=0) { + get_leaderboard: function (notify, $container) { var me = this; - + if(!me.options.selected_company) { + frappe.throw(__("Please select Company")); + } frappe.call({ method: "erpnext.utilities.page.leaderboard.leaderboard.get_leaderboard", args: { doctype: me.options.selected_doctype, timespan: me.options.selected_timespan, + company: me.options.selected_company, field: me.options.selected_filter_item, - start: start }, callback: function (r) { let results = r.message || []; @@ -256,28 +270,27 @@ frappe.Leaderboard = Class.extend({ get_item_html: function (item) { var me = this; - const _selected_filter = me.options.selected_filter - .map(i => frappe.model.unscrub(i)); - const fields = ['name', me.options.selected_filter_item]; + const company = me.options.selected_company; + const currency = frappe.get_doc(":Company", company).default_currency; + const fields = ['name','value']; const html = `