Merge branch 'master' of github.com:webnotes/erpnext
This commit is contained in:
commit
4d9dabf136
@ -213,8 +213,8 @@ erpnext.POS = Class.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// if form is local then allow this function
|
// if form is local then allow this function
|
||||||
if (me.frm.doc.docstatus===0) {
|
$(me.wrapper).find("div.pos-item").on("click", function() {
|
||||||
$("div.pos-item").on("click", function() {
|
if(me.frm.doc.docstatus==0) {
|
||||||
if(!me.frm.doc[me.party.toLowerCase()] && ((me.frm.doctype == "Quotation" &&
|
if(!me.frm.doc[me.party.toLowerCase()] && ((me.frm.doctype == "Quotation" &&
|
||||||
me.frm.doc.quotation_to == "Customer")
|
me.frm.doc.quotation_to == "Customer")
|
||||||
|| me.frm.doctype != "Quotation")) {
|
|| me.frm.doctype != "Quotation")) {
|
||||||
@ -223,8 +223,8 @@ erpnext.POS = Class.extend({
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
me.add_to_cart($(this).attr("data-item_code"));
|
me.add_to_cart($(this).attr("data-item_code"));
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -313,7 +313,7 @@ erpnext.POS = Class.extend({
|
|||||||
// taxes
|
// taxes
|
||||||
var taxes = wn.model.get_children(this.sales_or_purchase + " Taxes and Charges",
|
var taxes = wn.model.get_children(this.sales_or_purchase + " Taxes and Charges",
|
||||||
this.frm.doc.name, this.frm.cscript.other_fname, this.frm.doctype);
|
this.frm.doc.name, this.frm.cscript.other_fname, this.frm.doctype);
|
||||||
$(".tax-table")
|
$(this.wrapper).find(".tax-table")
|
||||||
.toggle((taxes && taxes.length) ? true : false)
|
.toggle((taxes && taxes.length) ? true : false)
|
||||||
.find("tbody").empty();
|
.find("tbody").empty();
|
||||||
|
|
||||||
@ -345,18 +345,18 @@ erpnext.POS = Class.extend({
|
|||||||
|
|
||||||
// if form is local then only run all these functions
|
// if form is local then only run all these functions
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
$("input.qty").on("focus", function() {
|
$(this.wrapper).find("input.qty").on("focus", function() {
|
||||||
$(this).select();
|
$(this).select();
|
||||||
});
|
});
|
||||||
|
|
||||||
// append quantity to the respective item after change from input box
|
// append quantity to the respective item after change from input box
|
||||||
$("input.qty").on("change", function() {
|
$(this.wrapper).find("input.qty").on("change", function() {
|
||||||
var item_code = $(this).closest("tr")[0].id;
|
var item_code = $(this).closest("tr")[0].id;
|
||||||
me.update_qty(item_code, $(this).val(), true);
|
me.update_qty(item_code, $(this).val(), true);
|
||||||
});
|
});
|
||||||
|
|
||||||
// on td click toggle the highlighting of row
|
// on td click toggle the highlighting of row
|
||||||
me.wrapper.find("#cart tbody tr td").on("click", function() {
|
$(this.wrapper).find("#cart tbody tr td").on("click", function() {
|
||||||
var row = $(this).closest("tr");
|
var row = $(this).closest("tr");
|
||||||
if (row.attr("data-selected") == "false") {
|
if (row.attr("data-selected") == "false") {
|
||||||
row.attr("class", "warning");
|
row.attr("class", "warning");
|
||||||
@ -371,21 +371,27 @@ erpnext.POS = Class.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
me.refresh_delete_btn();
|
me.refresh_delete_btn();
|
||||||
this.frm.pos.barcode.$input.focus();
|
this.barcode.$input.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
// if form is submitted & cancelled then disable all input box & buttons
|
// if form is submitted & cancelled then disable all input box & buttons
|
||||||
if (this.frm.doc.docstatus>=1) {
|
if (this.frm.doc.docstatus>=1) {
|
||||||
me.wrapper.find('input, button').each(function () {
|
$(this.wrapper).find('input, button').each(function () {
|
||||||
$(this).prop('disabled', true);
|
$(this).prop('disabled', true);
|
||||||
});
|
});
|
||||||
$(".delete-items").hide();
|
$(this.wrapper).find(".delete-items").hide();
|
||||||
$(".make-payment").hide();
|
$(this.wrapper).find(".make-payment").hide();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$(this.wrapper).find('input, button').each(function () {
|
||||||
|
$(this).prop('disabled', false);
|
||||||
|
});
|
||||||
|
$(this.wrapper).find(".make-payment").show();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show Make Payment button only in Sales Invoice
|
// Show Make Payment button only in Sales Invoice
|
||||||
if (this.frm.doctype != "Sales Invoice")
|
if (this.frm.doctype != "Sales Invoice")
|
||||||
$(".make-payment").hide();
|
$(this.wrapper).find(".make-payment").hide();
|
||||||
|
|
||||||
// If quotation to is not Customer then remove party
|
// If quotation to is not Customer then remove party
|
||||||
if (this.frm.doctype == "Quotation") {
|
if (this.frm.doctype == "Quotation") {
|
||||||
@ -395,7 +401,7 @@ erpnext.POS = Class.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
refresh_delete_btn: function() {
|
refresh_delete_btn: function() {
|
||||||
$(".delete-items").toggle($(".item-cart .warning").length ? true : false);
|
$(this.wrapper).find(".delete-items").toggle($(".item-cart .warning").length ? true : false);
|
||||||
},
|
},
|
||||||
add_item_thru_barcode: function() {
|
add_item_thru_barcode: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
@ -417,9 +423,9 @@ erpnext.POS = Class.extend({
|
|||||||
remove_selected_item: function() {
|
remove_selected_item: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
var selected_items = [];
|
var selected_items = [];
|
||||||
var no_of_items = me.wrapper.find("#cart tbody tr").length;
|
var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
|
||||||
for(var x=0; x<=no_of_items - 1; x++) {
|
for(var x=0; x<=no_of_items - 1; x++) {
|
||||||
var row = me.wrapper.find("#cart tbody tr:eq(" + x + ")");
|
var row = $(this.wrapper).find("#cart tbody tr:eq(" + x + ")");
|
||||||
if(row.attr("data-selected") == "true") {
|
if(row.attr("data-selected") == "true") {
|
||||||
selected_items.push(row.attr("id"));
|
selected_items.push(row.attr("id"));
|
||||||
}
|
}
|
||||||
@ -442,7 +448,7 @@ erpnext.POS = Class.extend({
|
|||||||
},
|
},
|
||||||
make_payment: function() {
|
make_payment: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
var no_of_items = me.wrapper.find("#cart tbody tr").length;
|
var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
|
||||||
var mode_of_payment = [];
|
var mode_of_payment = [];
|
||||||
|
|
||||||
if (no_of_items == 0)
|
if (no_of_items == 0)
|
||||||
@ -470,7 +476,7 @@ erpnext.POS = Class.extend({
|
|||||||
"total_amount": $(".grand-total").text()
|
"total_amount": $(".grand-total").text()
|
||||||
});
|
});
|
||||||
dialog.show();
|
dialog.show();
|
||||||
me.frm.pos.barcode.$input.focus();
|
me.barcode.$input.focus();
|
||||||
|
|
||||||
dialog.get_input("total_amount").prop("disabled", true);
|
dialog.get_input("total_amount").prop("disabled", true);
|
||||||
|
|
||||||
|
@ -29,9 +29,10 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
// toggle to pos view if is_pos is 1 in user_defaults
|
// toggle to pos view if is_pos is 1 in user_defaults
|
||||||
if ((cint(wn.defaults.get_user_defaults("is_pos"))===1 || cur_frm.doc.is_pos) &&
|
if ((cint(wn.defaults.get_user_defaults("is_pos"))===1 || cur_frm.doc.is_pos) &&
|
||||||
cint(wn.defaults.get_user_defaults("fs_pos_view"))===1) {
|
cint(wn.defaults.get_user_defaults("fs_pos_view"))===1) {
|
||||||
this.frm.set_value("is_pos", 1);
|
if(this.frm.doc.__islocal && !this.frm.doc.amended_from) {
|
||||||
this.is_pos();
|
this.frm.set_value("is_pos", 1);
|
||||||
cur_frm.cscript.toggle_pos(true);
|
this.is_pos(function() {cur_frm.cscript.toggle_pos(true);});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if document is POS then change default print format to "POS Invoice"
|
// if document is POS then change default print format to "POS Invoice"
|
||||||
@ -126,7 +127,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
this.get_terms();
|
this.get_terms();
|
||||||
},
|
},
|
||||||
|
|
||||||
is_pos: function() {
|
is_pos: function(callback_fn) {
|
||||||
cur_frm.cscript.hide_fields(this.frm.doc);
|
cur_frm.cscript.hide_fields(this.frm.doc);
|
||||||
if(cint(this.frm.doc.is_pos)) {
|
if(cint(this.frm.doc.is_pos)) {
|
||||||
if(!this.frm.doc.company) {
|
if(!this.frm.doc.company) {
|
||||||
@ -140,6 +141,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(!r.exc) {
|
if(!r.exc) {
|
||||||
me.frm.script_manager.trigger("update_stock");
|
me.frm.script_manager.trigger("update_stock");
|
||||||
|
if(callback_fn) callback_fn()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -195,7 +195,7 @@ class DocType(SellingController):
|
|||||||
pos = get_pos_settings(self.doc.company)
|
pos = get_pos_settings(self.doc.company)
|
||||||
|
|
||||||
if pos:
|
if pos:
|
||||||
if not for_validate:
|
if not for_validate and not self.doc.customer:
|
||||||
self.doc.customer = pos.customer
|
self.doc.customer = pos.customer
|
||||||
self.set_customer_defaults()
|
self.set_customer_defaults()
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-24 19:29:05",
|
"creation": "2013-05-24 19:29:05",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-09-19 11:42:13",
|
"modified": "2013-10-03 18:54:31",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@ -180,7 +180,6 @@
|
|||||||
"search_index": 1
|
"search_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "Today",
|
|
||||||
"description": "Enter the date by which payments from customer is expected against this invoice.",
|
"description": "Enter the date by which payments from customer is expected against this invoice.",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "due_date",
|
"fieldname": "due_date",
|
||||||
|
@ -6,6 +6,7 @@ import webnotes
|
|||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
webnotes.reload_doc("selling", "doctype", "shopping_cart_price_list")
|
webnotes.reload_doc("selling", "doctype", "shopping_cart_price_list")
|
||||||
|
webnotes.reload_doc("setup", "doctype", "item_price")
|
||||||
|
|
||||||
for t in [
|
for t in [
|
||||||
("Supplier Quotation", "price_list_name", "buying_price_list"),
|
("Supplier Quotation", "price_list_name", "buying_price_list"),
|
||||||
|
0
patches/october_2013/__init__.py
Normal file
0
patches/october_2013/__init__.py
Normal file
13
patches/october_2013/fix_is_cancelled_in_sle.py
Normal file
13
patches/october_2013/fix_is_cancelled_in_sle.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
webnotes.conn.sql("""update `tabStock Ledger Entry` set is_cancelled = 'No'
|
||||||
|
where ifnull(is_cancelled, '') = ''""")
|
||||||
|
|
||||||
|
webnotes.conn.sql("""update tabBin b set b.stock_uom =
|
||||||
|
(select i.stock_uom from tabItem i where i.name = b.item_code)
|
||||||
|
where b.creation>='2013-09-01'""")
|
@ -0,0 +1,84 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
from webnotes.utils import nowdate, nowtime, cstr
|
||||||
|
from accounts.utils import get_fiscal_year
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
item_map = {}
|
||||||
|
for item in webnotes.conn.sql("""select * from tabItem""", as_dict=1):
|
||||||
|
item_map.setdefault(item.name, item)
|
||||||
|
|
||||||
|
warehouse_map = get_warehosue_map()
|
||||||
|
naming_series = "STE/13/"
|
||||||
|
|
||||||
|
for company in webnotes.conn.sql("select name from tabCompany"):
|
||||||
|
stock_entry = [{
|
||||||
|
"doctype": "Stock Entry",
|
||||||
|
"naming_series": naming_series,
|
||||||
|
"posting_date": nowdate(),
|
||||||
|
"posting_time": nowtime(),
|
||||||
|
"purpose": "Material Transfer",
|
||||||
|
"company": company[0],
|
||||||
|
"remarks": "Material Transfer to activate perpetual inventory",
|
||||||
|
"fiscal_year": get_fiscal_year(nowdate())[0]
|
||||||
|
}]
|
||||||
|
expense_account = "Cost of Goods Sold - NISL"
|
||||||
|
cost_center = "Default CC Ledger - NISL"
|
||||||
|
|
||||||
|
for bin in webnotes.conn.sql("""select * from tabBin bin where ifnull(item_code, '')!=''
|
||||||
|
and ifnull(warehouse, '')!='' and ifnull(actual_qty, 0) != 0
|
||||||
|
and (select company from tabWarehouse where name=bin.warehouse)=%s""",
|
||||||
|
company[0], as_dict=1):
|
||||||
|
item_details = item_map[bin.item_code]
|
||||||
|
new_warehouse = warehouse_map[bin.warehouse].get("fixed_asset_warehouse") \
|
||||||
|
if cstr(item_details.is_asset_item) == "Yes" \
|
||||||
|
else warehouse_map[bin.warehouse].get("current_asset_warehouse")
|
||||||
|
|
||||||
|
if item_details.has_serial_no == "Yes":
|
||||||
|
serial_no = "\n".join([d[0] for d in webnotes.conn.sql("""select name
|
||||||
|
from `tabSerial No` where item_code = %s and warehouse = %s
|
||||||
|
and status='Available'""", (bin.item_code, bin.warehouse))])
|
||||||
|
else:
|
||||||
|
serial_no = None
|
||||||
|
|
||||||
|
stock_entry.append({
|
||||||
|
"doctype": "Stock Entry Detail",
|
||||||
|
"parentfield": "mtn_details",
|
||||||
|
"s_warehouse": bin.warehouse,
|
||||||
|
"t_warehouse": new_warehouse,
|
||||||
|
"item_code": bin.item_code,
|
||||||
|
"description": item_details.description,
|
||||||
|
"qty": bin.actual_qty,
|
||||||
|
"transfer_qty": bin.actual_qty,
|
||||||
|
"uom": item_details.stock_uom,
|
||||||
|
"stock_uom": item_details.stock_uom,
|
||||||
|
"conversion_factor": 1,
|
||||||
|
"expense_account": expense_account,
|
||||||
|
"cost_center": cost_center,
|
||||||
|
"serial_no": serial_no
|
||||||
|
})
|
||||||
|
|
||||||
|
webnotes.bean(stock_entry).insert()
|
||||||
|
|
||||||
|
def get_warehosue_map():
|
||||||
|
return {
|
||||||
|
"MAHAPE": {
|
||||||
|
"current_asset_warehouse": "Mahape-New - NISL",
|
||||||
|
"fixed_asset_warehouse": ""
|
||||||
|
},
|
||||||
|
"DROP SHIPMENT": {
|
||||||
|
"current_asset_warehouse": "Drop Shipment-New - NISL",
|
||||||
|
"fixed_asset_warehouse": ""
|
||||||
|
},
|
||||||
|
"TRANSIT": {
|
||||||
|
"current_asset_warehouse": "Transit-New - NISL",
|
||||||
|
"fixed_asset_warehouse": ""
|
||||||
|
},
|
||||||
|
"ASSET - MAHAPE": {
|
||||||
|
"current_asset_warehouse": "",
|
||||||
|
"fixed_asset_warehouse": "Assets-New - NISL"
|
||||||
|
}
|
||||||
|
}
|
10
patches/october_2013/set_stock_value_diff_in_sle.py
Normal file
10
patches/october_2013/set_stock_value_diff_in_sle.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
from webnotes.utils import cint
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
from patches.september_2012 import repost_stock
|
||||||
|
repost_stock.execute()
|
@ -218,4 +218,6 @@ patch_list = [
|
|||||||
"execute:webnotes.bean('Style Settings').save() #2013-09-19",
|
"execute:webnotes.bean('Style Settings').save() #2013-09-19",
|
||||||
"execute:webnotes.conn.set_value('Accounts Settings', None, 'frozen_accounts_modifier', 'Accounts Manager') # 2013-09-24",
|
"execute:webnotes.conn.set_value('Accounts Settings', None, 'frozen_accounts_modifier', 'Accounts Manager') # 2013-09-24",
|
||||||
"patches.september_2013.p04_unsubmit_serial_nos",
|
"patches.september_2013.p04_unsubmit_serial_nos",
|
||||||
|
"patches.september_2013.p05_fix_customer_in_pos",
|
||||||
|
"patches.october_2013.fix_is_cancelled_in_sle",
|
||||||
]
|
]
|
22
patches/september_2013/p05_fix_customer_in_pos.py
Normal file
22
patches/september_2013/p05_fix_customer_in_pos.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
def execute():
|
||||||
|
si_list = webnotes.conn.sql("""select name, debit_to from `tabSales Invoice`
|
||||||
|
where ifnull(is_pos, 1)=1 and docstatus=1 and modified > '2013-09-03'""", as_dict=1)
|
||||||
|
|
||||||
|
for si in si_list:
|
||||||
|
if not webnotes.conn.get_value("GL Entry", {"voucher_type": "Sales Invoice",
|
||||||
|
"voucher_no": si.name, "account": si.debit_to}):
|
||||||
|
debit_to = webnotes.conn.sql("""select account from `tabGL Entry` gle
|
||||||
|
where voucher_type='Sales Invoice' and voucher_no=%s
|
||||||
|
and (select master_type from tabAccount where name=gle.account)='Customer'
|
||||||
|
""", si.name)
|
||||||
|
if debit_to:
|
||||||
|
si_bean = webnotes.bean("Sales Invoice", si.name)
|
||||||
|
si_bean.doc.debit_to = debit_to[0][0]
|
||||||
|
si_bean.doc.customer = None
|
||||||
|
si_bean.run_method("set_customer_defaults")
|
||||||
|
si_bean.update_after_submit()
|
@ -29,6 +29,8 @@ erpnext.StockGridReport = wn.views.TreeGridReport.extend({
|
|||||||
|
|
||||||
if(add_qty)
|
if(add_qty)
|
||||||
wh.fifo_stack.push([add_qty, sl.incoming_rate, sl.posting_date]);
|
wh.fifo_stack.push([add_qty, sl.incoming_rate, sl.posting_date]);
|
||||||
|
|
||||||
|
if(sl.serial_no) value_diff = this.get_serialized_value_diff(sl);
|
||||||
} else {
|
} else {
|
||||||
// outgoing
|
// outgoing
|
||||||
if(sl.serial_no) {
|
if(sl.serial_no) {
|
||||||
@ -98,7 +100,7 @@ erpnext.StockGridReport = wn.views.TreeGridReport.extend({
|
|||||||
|
|
||||||
$.each(sl.serial_no.trim().split("\n"), function(i, sr) {
|
$.each(sl.serial_no.trim().split("\n"), function(i, sr) {
|
||||||
if(sr) {
|
if(sr) {
|
||||||
value_diff += flt(me.serialized_buying_rates[sr.trim()]);
|
value_diff += flt(me.serialized_buying_rates[sr.trim().toLowerCase()]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -112,7 +114,7 @@ erpnext.StockGridReport = wn.views.TreeGridReport.extend({
|
|||||||
if(sle.qty > 0 && sle.serial_no) {
|
if(sle.qty > 0 && sle.serial_no) {
|
||||||
$.each(sle.serial_no.trim().split("\n"), function(i, sr) {
|
$.each(sle.serial_no.trim().split("\n"), function(i, sr) {
|
||||||
if(sr && sle.incoming_rate !== undefined) {
|
if(sr && sle.incoming_rate !== undefined) {
|
||||||
serialized_buying_rates[sr.trim()] = flt(sle.incoming_rate);
|
serialized_buying_rates[sr.trim().toLowerCase()] = flt(sle.incoming_rate);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,7 @@ def backup_to_dropbox():
|
|||||||
error_log = []
|
error_log = []
|
||||||
path = os.path.join(get_base_path(), "public", "files")
|
path = os.path.join(get_base_path(), "public", "files")
|
||||||
for filename in os.listdir(path):
|
for filename in os.listdir(path):
|
||||||
|
filename = cstr(filename)
|
||||||
if filename in ignore_list:
|
if filename in ignore_list:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ def backup_to_gdrive():
|
|||||||
webnotes.conn.close()
|
webnotes.conn.close()
|
||||||
path = os.path.join(get_base_path(), "public", "files")
|
path = os.path.join(get_base_path(), "public", "files")
|
||||||
for filename in os.listdir(path):
|
for filename in os.listdir(path):
|
||||||
|
filename = cstr(filename)
|
||||||
found = False
|
found = False
|
||||||
filepath = os.path.join(path, filename)
|
filepath = os.path.join(path, filename)
|
||||||
ext = filename.split('.')[-1]
|
ext = filename.split('.')[-1]
|
||||||
|
@ -9,6 +9,7 @@ from __future__ import unicode_literals
|
|||||||
import os, json
|
import os, json
|
||||||
from xml.etree import ElementTree as ET
|
from xml.etree import ElementTree as ET
|
||||||
from webnotes.utils.datautils import read_csv_content
|
from webnotes.utils.datautils import read_csv_content
|
||||||
|
from webnotes.utils import cstr
|
||||||
|
|
||||||
path = "/Users/rmehta/Downloads/openerp/openerp/addons"
|
path = "/Users/rmehta/Downloads/openerp/openerp/addons"
|
||||||
chart_roots = []
|
chart_roots = []
|
||||||
@ -108,6 +109,7 @@ def find_charts():
|
|||||||
basename = os.path.basename(basepath)
|
basename = os.path.basename(basepath)
|
||||||
if basename.startswith("l10n"):
|
if basename.startswith("l10n"):
|
||||||
for fname in files:
|
for fname in files:
|
||||||
|
fname = cstr(fname)
|
||||||
filepath = os.path.join(basepath, fname)
|
filepath = os.path.join(basepath, fname)
|
||||||
if fname.endswith(".xml"):
|
if fname.endswith(".xml"):
|
||||||
tree = ET.parse(filepath)
|
tree = ET.parse(filepath)
|
||||||
|
7
setup/doctype/price_list/price_list.css
Normal file
7
setup/doctype/price_list/price_list.css
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.table-grid tbody tr {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-grid thead tr {
|
||||||
|
height: 50px;
|
||||||
|
}
|
@ -5,4 +5,253 @@ $.extend(cur_frm.cscript, {
|
|||||||
onload: function() {
|
onload: function() {
|
||||||
erpnext.add_for_territory();
|
erpnext.add_for_territory();
|
||||||
},
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
|
cur_frm.cscript.show_item_prices();
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_frm.cscript.show_item_prices = function() {
|
||||||
|
var item_price = wn.model.get("Item Price", {parent: cur_frm.doc.name});
|
||||||
|
|
||||||
|
$(cur_frm.fields_dict.item_prices_html.wrapper).empty();
|
||||||
|
|
||||||
|
new wn.ui.form.TableGrid({
|
||||||
|
parent: cur_frm.fields_dict.item_prices_html.wrapper,
|
||||||
|
frm: cur_frm,
|
||||||
|
table_field: wn.meta.get_docfield("Price List", "item_prices", cur_frm.doc.name)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
wn.ui.form.TableGrid = Class.extend({
|
||||||
|
init: function(opts) {
|
||||||
|
$.extend(this, opts);
|
||||||
|
this.fields = wn.meta.get_docfields("Item Price", cur_frm.doc.name);
|
||||||
|
this.make_table();
|
||||||
|
},
|
||||||
|
make_table: function() {
|
||||||
|
var me = this;
|
||||||
|
// Creating table & assigning attributes
|
||||||
|
var grid_table = document.createElement("table");
|
||||||
|
grid_table.className = "table table-hover table-bordered table-grid";
|
||||||
|
|
||||||
|
// Appending header & rows to table
|
||||||
|
grid_table.appendChild(this.make_table_headers());
|
||||||
|
grid_table.appendChild(this.make_table_rows());
|
||||||
|
|
||||||
|
// Creating button to add new row
|
||||||
|
var btn_div = document.createElement("div");
|
||||||
|
var new_row_btn = document.createElement("button");
|
||||||
|
new_row_btn.className = "btn btn-success table-new-row";
|
||||||
|
new_row_btn.title = "Add new row";
|
||||||
|
|
||||||
|
var btn_icon = document.createElement("i");
|
||||||
|
btn_icon.className = "icon-plus";
|
||||||
|
new_row_btn.appendChild(btn_icon);
|
||||||
|
new_row_btn.innerHTML += " Add new row";
|
||||||
|
btn_div.appendChild(new_row_btn);
|
||||||
|
|
||||||
|
// Appending table & button to parent
|
||||||
|
var $grid_table = $(grid_table).appendTo($(this.parent));
|
||||||
|
var $btn_div = $(btn_div).appendTo($(this.parent));
|
||||||
|
|
||||||
|
$btn_div.on("click", ".table-new-row", function() {
|
||||||
|
me.make_dialog();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$grid_table.on("click", ".table-row", function() {
|
||||||
|
me.make_dialog(this);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
make_table_headers: function() {
|
||||||
|
var me = this;
|
||||||
|
var header = document.createElement("thead");
|
||||||
|
|
||||||
|
// Creating header row
|
||||||
|
var row = document.createElement("tr");
|
||||||
|
row.className = "active";
|
||||||
|
|
||||||
|
// Creating head first cell
|
||||||
|
var th = document.createElement("th");
|
||||||
|
th.width = "8%";
|
||||||
|
th.className = "text-center";
|
||||||
|
th.innerHTML = "#";
|
||||||
|
row.appendChild(th);
|
||||||
|
|
||||||
|
// Make other headers with label as heading
|
||||||
|
for(var i=0, l=this.fields.length; i<l; i++) {
|
||||||
|
var df = this.fields[i];
|
||||||
|
|
||||||
|
if(!!!df.hidden && df.in_list_view === 1) {
|
||||||
|
var th = document.createElement("th");
|
||||||
|
|
||||||
|
// If currency then move header to right
|
||||||
|
if(["Int", "Currency", "Float"].indexOf(df.fieldtype) !== -1) th.className = "text-right";
|
||||||
|
|
||||||
|
th.innerHTML = wn._(df.label);
|
||||||
|
row.appendChild(th);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header.appendChild(row);
|
||||||
|
|
||||||
|
return header;
|
||||||
|
},
|
||||||
|
make_table_rows: function() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
// Creating table body
|
||||||
|
var table_body = document.createElement("tbody");
|
||||||
|
|
||||||
|
var item_prices = wn.model.get_children(this.table_field.options, this.frm.doc.name,
|
||||||
|
this.table_field.fieldname, this.frm.doctype);
|
||||||
|
|
||||||
|
for(var i=0, l=item_prices.length; i<l; i++) {
|
||||||
|
var d = item_prices[i];
|
||||||
|
|
||||||
|
// Creating table row
|
||||||
|
var tr = this.add_new_row(d);
|
||||||
|
|
||||||
|
// append row to table body
|
||||||
|
table_body.appendChild(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.table_body = table_body;
|
||||||
|
|
||||||
|
return table_body;
|
||||||
|
},
|
||||||
|
make_dialog: function(row) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
this.dialog = new wn.ui.Dialog({
|
||||||
|
title: this.table_field.options,
|
||||||
|
fields: this.fields
|
||||||
|
});
|
||||||
|
|
||||||
|
if (row)
|
||||||
|
this.dialog.set_values(this.make_dialog_values(row));
|
||||||
|
|
||||||
|
$a(this.dialog.body, 'div', '', '', this.make_dialog_buttons(row));
|
||||||
|
this.dialog.show();
|
||||||
|
|
||||||
|
this.dialog.$wrapper.find('button.update').on('click', function() {
|
||||||
|
me.update_row(row);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.dialog.$wrapper.find('button.delete').on('click', function() {
|
||||||
|
me.delete_row(row);
|
||||||
|
});
|
||||||
|
return row;
|
||||||
|
},
|
||||||
|
make_dialog_values: function(row) {
|
||||||
|
var me = this;
|
||||||
|
var dialog_values = {};
|
||||||
|
|
||||||
|
$.each(this.fields, function(i, item) {
|
||||||
|
dialog_values[item.fieldname] = $(row).find('td[data-fieldname="'+ item.fieldname +'"]').attr('data-fieldvalue');
|
||||||
|
});
|
||||||
|
|
||||||
|
return dialog_values;
|
||||||
|
},
|
||||||
|
make_dialog_buttons: function(row) {
|
||||||
|
var me = this;
|
||||||
|
var buttons = '<button class="btn btn-primary update">Update</button>';
|
||||||
|
|
||||||
|
// if user can delete then only add the delete button in dialog
|
||||||
|
if (wn.model.can_delete(me.frm.doc.doctype) && row)
|
||||||
|
buttons += ' <button class="btn btn-default delete">Delete</button>';
|
||||||
|
|
||||||
|
return buttons;
|
||||||
|
},
|
||||||
|
update_row: function(row) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (!row) {
|
||||||
|
var d = wn.model.add_child(this.frm.doc, this.table_field.options,
|
||||||
|
this.table_field.fieldname);
|
||||||
|
refresh_field(this.table_field.fieldname);
|
||||||
|
this.update_item_price(d.name);
|
||||||
|
var tr = this.add_new_row(d);
|
||||||
|
this.table_body.appendChild(tr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.update_item_price(null, row);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dialog.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
update_item_price: function(docname, row) {
|
||||||
|
var me = this;
|
||||||
|
if(!docname && row) docname = $(row).attr("data-docname");
|
||||||
|
$.each(me.fields, function(i, df) {
|
||||||
|
var val = me.dialog.get_values()[df.fieldname];
|
||||||
|
|
||||||
|
if(["Currency", "Float"].indexOf(df.fieldtype)!==-1) {
|
||||||
|
val = flt(val);
|
||||||
|
} else if(["Int", "Check"].indexOf(df.fieldtype)!==-1) {
|
||||||
|
val = cint(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
wn.model.set_value(me.table_field.options, docname,
|
||||||
|
df.fieldname, val);
|
||||||
|
|
||||||
|
if(row) {
|
||||||
|
var $td = $(row).find('td[data-fieldname="'+ df.fieldname +'"]');
|
||||||
|
$td.attr('data-fieldvalue', val);
|
||||||
|
// If field type is currency the update with format currency
|
||||||
|
$td.html(wn.format(val, df));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
delete_row: function(row) {
|
||||||
|
var me = this;
|
||||||
|
var docname = $(row).find('td:last').attr('data-docname');
|
||||||
|
wn.model.clear_doc(me.table_field.options, docname);
|
||||||
|
$(row).remove();
|
||||||
|
|
||||||
|
// Re-assign idx
|
||||||
|
$.each($(this.parent).find("tbody tr"), function(idx, data) {
|
||||||
|
var $td = $(data).find('td:first');
|
||||||
|
$td.html(idx + 1);
|
||||||
|
});
|
||||||
|
this.dialog.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
add_new_row: function(d) {
|
||||||
|
var tr = document.createElement("tr");
|
||||||
|
tr.className = "table-row";
|
||||||
|
tr.setAttribute("data-docname", d.name);
|
||||||
|
|
||||||
|
// Creating table data & appending to row
|
||||||
|
var td = document.createElement("td");
|
||||||
|
td.className = "text-center";
|
||||||
|
td.innerHTML = d.idx;
|
||||||
|
tr.appendChild(td);
|
||||||
|
|
||||||
|
for(var f=0, lf=this.fields.length; f<lf; f++) {
|
||||||
|
var df = this.fields[f];
|
||||||
|
if(!!!df.hidden && df.in_list_view===1) {
|
||||||
|
var td = document.createElement("td");
|
||||||
|
td.setAttribute("data-fieldname", df.fieldname);
|
||||||
|
td.setAttribute("data-fieldvalue", d[df.fieldname]);
|
||||||
|
td.setAttribute("data-docname", d.name);
|
||||||
|
|
||||||
|
// If currency then move header to right
|
||||||
|
if(["Int", "Currency", "Float"].indexOf(df.fieldtype) !== -1) {
|
||||||
|
td.className = "text-right";
|
||||||
|
}
|
||||||
|
|
||||||
|
// format and set display
|
||||||
|
td.innerHTML = wn.format(d[df.fieldname], df);
|
||||||
|
|
||||||
|
// append column to tabel row
|
||||||
|
tr.appendChild(td);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tr;
|
||||||
|
}
|
||||||
});
|
});
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-25 11:35:09",
|
"creation": "2013-01-25 11:35:09",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-09-06 15:03:38",
|
"modified": "2013-10-02 11:36:09",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@ -85,16 +85,23 @@
|
|||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"description": "To change row values, click on the respective row",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "item_prices_section",
|
"fieldname": "item_prices_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"label": "Item Prices"
|
"label": "Item Prices"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "item_prices_html",
|
||||||
|
"fieldtype": "HTML"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "item_prices",
|
"fieldname": "item_prices",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
|
"hidden": 1,
|
||||||
"label": "Item Prices",
|
"label": "Item Prices",
|
||||||
"options": "Item Price"
|
"options": "Item Price"
|
||||||
},
|
},
|
||||||
|
@ -16,7 +16,7 @@ class DocType:
|
|||||||
self.doclist = doclist
|
self.doclist = doclist
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if not self.doc.stock_uom:
|
if self.doc.fields.get("__islocal") or not self.doc.stock_uom:
|
||||||
self.doc.stock_uom = webnotes.conn.get_value('Item', self.doc.item_code, 'stock_uom')
|
self.doc.stock_uom = webnotes.conn.get_value('Item', self.doc.item_code, 'stock_uom')
|
||||||
|
|
||||||
self.validate_mandatory()
|
self.validate_mandatory()
|
||||||
|
@ -246,6 +246,7 @@ class DocType(StockController):
|
|||||||
"stock_uom": webnotes.conn.get_value("Item", row.item_code, "stock_uom"),
|
"stock_uom": webnotes.conn.get_value("Item", row.item_code, "stock_uom"),
|
||||||
"voucher_detail_no": row.voucher_detail_no,
|
"voucher_detail_no": row.voucher_detail_no,
|
||||||
"fiscal_year": self.doc.fiscal_year,
|
"fiscal_year": self.doc.fiscal_year,
|
||||||
|
"is_cancelled": "No"
|
||||||
})
|
})
|
||||||
args.update(opts)
|
args.update(opts)
|
||||||
self.make_sl_entries([args])
|
self.make_sl_entries([args])
|
||||||
|
@ -126,10 +126,11 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({
|
|||||||
} else {
|
} else {
|
||||||
item.inflow_value += value_diff;
|
item.inflow_value += value_diff;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
item.closing_qty += qty_diff;
|
item.closing_qty += qty_diff;
|
||||||
item.closing_value += value_diff;
|
item.closing_value += value_diff;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user