diff --git a/accounts/Print Format/POS Invoice/POS Invoice.txt b/accounts/Print Format/POS Invoice/POS Invoice.txt index 672c107b847..ebf25e42530 100644 --- a/accounts/Print Format/POS Invoice/POS Invoice.txt +++ b/accounts/Print Format/POS Invoice/POS Invoice.txt @@ -2,14 +2,14 @@ { "creation": "2011-12-21 11:08:55", "docstatus": 0, - "modified": "2013-08-16 16:15:46", + "modified": "2013-08-30 12:46:21", "modified_by": "Administrator", "owner": "Administrator" }, { "doc_type": "Sales Invoice", "doctype": "Print Format", - "html": "\n\n\n\n\n\n\n\n\n\n \n \n\n\n \n\n
NO: DATE:
M/s
\n\n
\n\n
\n\n

\n\n \n \n \n \n
For
 
Signatory
\n\n\n", + "html": "\n\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n
RECEIPT NO: DATE:
M/s
\n\n
\n\n\n", "module": "Accounts", "name": "__common__", "print_format_type": "Client", diff --git a/accounts/doctype/pos_setting/pos_setting.js b/accounts/doctype/pos_setting/pos_setting.js index 641b3ef1cfc..af4f993da33 100755 --- a/accounts/doctype/pos_setting/pos_setting.js +++ b/accounts/doctype/pos_setting/pos_setting.js @@ -49,15 +49,9 @@ cur_frm.fields_dict['cost_center'].get_query = function(doc,cdt,cdn) { } } -// ------------------ Get Print Heading ------------------------------------ -cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { - return{ - filters:[ - ['Print Heading', 'docstatus', '!=', 2] - ] - } -} +// Expense Account +// ----------------------------- cur_frm.fields_dict["expense_account"].get_query = function(doc) { return { filters: { @@ -69,6 +63,16 @@ cur_frm.fields_dict["expense_account"].get_query = function(doc) { } } +// ------------------ Get Print Heading ------------------------------------ +cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { + return{ + filters:[ + ['Print Heading', 'docstatus', '!=', 2] + ] + } +} + + cur_frm.fields_dict.user.get_query = function(doc,cdt,cdn) { return{ query:"core.doctype.profile.profile.profile_query"} } diff --git a/accounts/doctype/pos_setting/pos_setting.py b/accounts/doctype/pos_setting/pos_setting.py index 73f5ed6e721..f8055181247 100755 --- a/accounts/doctype/pos_setting/pos_setting.py +++ b/accounts/doctype/pos_setting/pos_setting.py @@ -7,7 +7,7 @@ from webnotes import msgprint, _ from webnotes.utils import cint class DocType: - def __init__(self,doc,doclist=[]): + def __init__(self,doc,doclist): self.doc, self.doclist = doc,doclist def get_series(self): @@ -20,6 +20,7 @@ class DocType: def validate(self): self.check_for_duplicate() self.validate_expense_account() + self.validate_all_link_fields() def check_for_duplicate(self): res = webnotes.conn.sql("""select name, user from `tabPOS Setting` @@ -36,4 +37,26 @@ class DocType: def validate_expense_account(self): if cint(webnotes.defaults.get_global_default("auto_inventory_accounting")) \ and not self.doc.expense_account: - msgprint(_("Expense Account is mandatory"), raise_exception=1) \ No newline at end of file + msgprint(_("Expense Account is mandatory"), raise_exception=1) + + def validate_all_link_fields(self): + accounts = {"Account": [self.doc.cash_bank_account, self.doc.income_account, self.doc.expense_account], \ + "Cost Center": [self.doc.cost_center], "Warehouse": [self.doc.warehouse]} + + for link_dt, dn_list in accounts.items(): + for link_dn in dn_list: + if not webnotes.conn.exists({"doctype": link_dt, "company": self.doc.company, "name": link_dn}): + msgprint(link_dn +_(" does not belong to ") + self.doc.company) + + def on_update(self): + webnotes.defaults.clear_default("is_pos") + + pos_view_users = webnotes.conn.sql_list("""select user from `tabPOS Setting`""") + for user in pos_view_users: + if user: + webnotes.defaults.set_user_default("is_pos", 1, user) + else: + webnotes.defaults.set_global_default("is_pos", 1) + + def on_trash(self): + self.on_update() \ No newline at end of file diff --git a/accounts/doctype/sales_invoice/pos.js b/accounts/doctype/sales_invoice/pos.js index b5a781cd090..30e01cfef56 100644 --- a/accounts/doctype/sales_invoice/pos.js +++ b/accounts/doctype/sales_invoice/pos.js @@ -16,7 +16,7 @@ erpnext.POS = Class.extend({
\
\
\ - \ +
\ \ \ \ @@ -160,8 +160,10 @@ erpnext.POS = Class.extend({ parent: this.wrapper.find(".barcode-area") }); this.barcode.make_input(); - this.barcode.$input.on("change", function() { - me.add_item_thru_barcode(); + this.barcode.$input.on("keypress", function() { + if(me.barcode_timeout) + clearTimeout(me.barcode_timeout); + me.barcode_timeout = setTimeout(function() { me.add_item_thru_barcode(); }, 1000); }); }, make_item_list: function() { @@ -178,12 +180,13 @@ erpnext.POS = Class.extend({ me.wrapper.find(".item-list").empty(); $.each(r.message, function(index, obj) { if (obj.image) - image = ""; + image = ''; else image = '
'; $(repl('
\ - %(item_image)s\ +
%(item_image)s
\
%(item_code)s
\
%(item_name)s
\
%(item_price)s
\ @@ -196,13 +199,16 @@ erpnext.POS = Class.extend({ })).appendTo($wrap); }); - $("div.pos-item").on("click", function() { - if(!cur_frm.doc.customer) { - msgprint("Please select customer first."); - return; - } - me.add_to_cart($(this).attr("data-item_code")); - }); + // if form is local then allow this function + if (cur_frm.doc.docstatus===0) { + $("div.pos-item").on("click", function() { + if(!cur_frm.doc.customer) { + msgprint("Please select customer first."); + return; + } + me.add_to_cart($(this).attr("data-item_code")); + }); + } } }); }, @@ -230,22 +236,25 @@ erpnext.POS = Class.extend({ var child = wn.model.add_child(me.frm.doc, "Sales Invoice Item", "entries"); child.item_code = item_code; me.frm.cscript.item_code(me.frm.doc, child.doctype, child.name); - //me.refresh(); } }, - update_qty: function(item_code, qty) { + update_qty: function(item_code, qty, textbox_qty) { var me = this; $.each(wn.model.get_children("Sales Invoice Item", this.frm.doc.name, "entries", "Sales Invoice"), function(i, d) { if (d.item_code == item_code) { - if (qty == 1) - d.qty += 1; - else + if (textbox_qty) { + if (qty == 0 && d.item_code == item_code) + wn.model.clear_doc(d.doctype, d.name); d.qty = qty; + } + else + d.qty += 1; me.frm.cscript.qty(me.frm.doc, d.doctype, d.name); } }); + me.frm.dirty(); me.refresh(); }, refresh: function() { @@ -262,7 +271,7 @@ erpnext.POS = Class.extend({
\ \ - \ + \ ', { item_code: d.item_code, @@ -283,10 +292,11 @@ erpnext.POS = Class.extend({ $.each(taxes, function(i, d) { $(repl('\ - \ + \ \ ', { description: d.description, + rate: d.rate, tax_amount: format_currency(d.tax_amount, me.frm.doc.price_list_currency) })).appendTo(".tax-table tbody"); }); @@ -297,44 +307,63 @@ erpnext.POS = Class.extend({ this.wrapper.find(".grand-total").text(format_currency(this.frm.doc.grand_total_export, cur_frm.doc.price_list_currency)); - // append quantity to the respective item after change from input box - $("input.qty").on("change", function() { - var item_code = $(this).closest("tr")[0].id; - me.update_qty(item_code, $(this).val()); - }); + // if form is local then only run all these functions + if (cur_frm.doc.docstatus===0) { + $("input.qty").on("focus", function() { + $(this).select(); + }); + + // append quantity to the respective item after change from input box + $("input.qty").on("change", function() { + var item_code = $(this).closest("tr")[0].id; + me.update_qty(item_code, $(this).val(), true); + }); + + // on td click toggle the highlighting of row + $("#cart tbody tr td").on("click", function() { + var row = $(this).closest("tr"); + if (row.attr("data-selected") == "false") { + row.attr("class", "warning"); + row.attr("data-selected", "true"); + } + else { + row.prop("class", null); + row.attr("data-selected", "false"); + } + me.refresh_delete_btn(); + + }); - // on td click highlight the respective row - $("td").on("click", function() { - var row = $(this).closest("tr"); - if (row.attr("data-selected") == "false") { - row.attr("class", "warning"); - row.attr("data-selected", "true"); - } - else { - row.prop("class", null); - row.attr("data-selected", "false"); - } me.refresh_delete_btn(); - - }); - - me.refresh_delete_btn(); + cur_frm.pos.barcode.$input.focus(); + } + + // if form is submitted & cancelled then disable all input box & buttons + if (cur_frm.doc.docstatus>=1) { + me.wrapper.find('input, button').each(function () { + $(this).prop('disabled', true); + }); + $(".delete-items").hide(); + $(".make-payment").hide(); + } }, refresh_delete_btn: function() { $(".delete-items").toggle($(".item-cart .warning").length ? true : false); }, add_item_thru_barcode: function() { var me = this; + me.barcode_timeout = null; wn.call({ method: 'accounts.doctype.sales_invoice.pos.get_item_from_barcode', args: {barcode: this.barcode.$input.val()}, callback: function(r) { if (r.message) { me.add_to_cart(r.message[0].name); - me.refresh(); } else msgprint(wn._("Invalid Barcode")); + + me.refresh(); } }); }, @@ -348,20 +377,20 @@ erpnext.POS = Class.extend({ selected_items.push(row.attr("id")); } } - - if (!selected_items[0]) - msgprint(wn._("Please select any item to remove it")); var child = wn.model.get_children("Sales Invoice Item", this.frm.doc.name, "entries", "Sales Invoice"); $.each(child, function(i, d) { for (var i in selected_items) { if (d.item_code == selected_items[i]) { + // cur_frm.fields_dict["entries"].grid.grid_rows[d.idx].remove(); wn.model.clear_doc(d.doctype, d.name); } } }); cur_frm.fields_dict["entries"].grid.refresh(); + cur_frm.script_manager.trigger("calculate_taxes_and_totals"); + me.frm.dirty(); me.refresh(); }, make_payment: function() { @@ -394,12 +423,14 @@ erpnext.POS = Class.extend({ "total_amount": $(".grand-total").text() }); dialog.show(); + cur_frm.pos.barcode.$input.focus(); dialog.get_input("total_amount").prop("disabled", true); dialog.fields_dict.pay.input.onclick = function() { cur_frm.set_value("mode_of_payment", dialog.get_values().mode_of_payment); cur_frm.set_value("paid_amount", dialog.get_values().total_amount); + cur_frm.cscript.mode_of_payment(cur_frm.doc); cur_frm.save(); dialog.hide(); me.refresh(); diff --git a/accounts/doctype/sales_invoice/pos.py b/accounts/doctype/sales_invoice/pos.py index 2f2ad6a36c2..1b867cb8dbc 100644 --- a/accounts/doctype/sales_invoice/pos.py +++ b/accounts/doctype/sales_invoice/pos.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import webnotes +from webnotes import msgprint @webnotes.whitelist() def get_items(price_list, item=None, item_group=None): diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js index 0c8fc3714cd..8cc94f9154f 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.js +++ b/accounts/doctype/sales_invoice/sales_invoice.js @@ -26,7 +26,18 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte } } - cur_frm.cscript.toggle_pos(true); + // 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) { + this.frm.set_value("is_pos", 1); + this.is_pos(); + cur_frm.cscript.toggle_pos(true); + } + + // if document is POS then change default print format to "POS Invoice" + if(cur_frm.doc.is_pos && cur_frm.doc.docstatus===1) { + locals.DocType[cur_frm.doctype].default_print_format = "POS Invoice"; + cur_frm.setup_print(); + } }, refresh: function(doc, dt, dn) { @@ -90,16 +101,11 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte } }); }); - - if(cint(sys_defaults.fs_pos_view)===1) - cur_frm.cscript.pos_btn(); - - // setTimeout(function() { cur_frm.$pos_btn.click(); }, 1000); - - } else { - // hide shown pos for submitted records - if(cur_frm.pos_active) cur_frm.cscript.toggle_pos(false); } + + // Show POS button only if it enabled from features setup + if(cint(sys_defaults.fs_pos_view)===1) + cur_frm.cscript.pos_btn(); }, pos_btn: function() { @@ -118,13 +124,9 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte cur_frm.cscript.toggle_pos(); cur_frm.cscript.pos_btn(); }, icon); - }, - toggle_pos: function(show) { - if(cint(sys_defaults.fs_pos_view)===0) return; - if(!(this.frm.doc.is_pos && this.frm.doc.docstatus===0)) return; - + toggle_pos: function(show) { if (!this.frm.doc.selling_price_list) msgprint(wn._("Please select Price List")) else { diff --git a/accounts/doctype/sales_invoice/sales_invoice.txt b/accounts/doctype/sales_invoice/sales_invoice.txt index 2a2a2e1db66..f921f242234 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.txt +++ b/accounts/doctype/sales_invoice/sales_invoice.txt @@ -2,13 +2,14 @@ { "creation": "2013-05-24 19:29:05", "docstatus": 0, - "modified": "2013-08-31 10:19:01", + "modified": "2013-09-01 05:26:13", "modified_by": "Administrator", "owner": "Administrator" }, { "allow_attach": 1, "autoname": "naming_series:", + "default_print_format": "Standard", "doctype": "DocType", "document_type": "Transaction", "icon": "icon-file-text", diff --git a/patches/patch_list.py b/patches/patch_list.py index ff28031a8f6..94e6d2bdefb 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -257,6 +257,8 @@ patch_list = [ "execute:webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice') # 2013-08-16", "patches.august_2013.p06_fix_sle_against_stock_entry", "execute:webnotes.bean('Style Settings').save() #2013-08-20", + "patches.september_2013.p01_add_user_defaults_from_pos_setting", + "execute:webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice') # 2013-09-02", "patches.september_2013.p01_fix_buying_amount_gl_entries", "patches.september_2013.p01_update_communication", "patches.september_2013.p02_fix_serial_no_status", diff --git a/patches/september_2013/__init__.py b/patches/september_2013/__init__.py index e69de29bb2d..baffc488252 100644 --- a/patches/september_2013/__init__.py +++ b/patches/september_2013/__init__.py @@ -0,0 +1 @@ +from __future__ import unicode_literals diff --git a/patches/september_2013/p01_add_user_defaults_from_pos_setting.py b/patches/september_2013/p01_add_user_defaults_from_pos_setting.py new file mode 100644 index 00000000000..f3a9344464d --- /dev/null +++ b/patches/september_2013/p01_add_user_defaults_from_pos_setting.py @@ -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(): + pos_view_users = webnotes.conn.sql_list("""select user from `tabPOS Setting`""") + for user in pos_view_users: + if user: + webnotes.defaults.set_user_default("is_pos", 1, user) + else: + webnotes.defaults.set_global_default("is_pos", 1) \ No newline at end of file diff --git a/setup/doctype/company/company.js b/setup/doctype/company/company.js index 6ae16268093..c8042710a67 100644 --- a/setup/doctype/company/company.js +++ b/setup/doctype/company/company.js @@ -36,8 +36,6 @@ cur_frm.cscript.abbr = function(doc){ } } -cur_frm.fields_dict.default_cash_account.get_query = cur_frm.fields_dict.default_bank_account.get_query; - cur_frm.fields_dict.default_bank_account.get_query = function(doc) { return{ filters:{ @@ -48,7 +46,7 @@ cur_frm.fields_dict.default_bank_account.get_query = function(doc) { } } -cur_frm.fields_dict.payables_group.get_query = cur_frm.fields_dict.receivables_group.get_query; +cur_frm.fields_dict.default_cash_account.get_query = cur_frm.fields_dict.default_bank_account.get_query; cur_frm.fields_dict.receivables_group.get_query = function(doc) { return{ @@ -59,6 +57,39 @@ cur_frm.fields_dict.receivables_group.get_query = function(doc) { } } +cur_frm.fields_dict.payables_group.get_query = cur_frm.fields_dict.receivables_group.get_query; + +cur_frm.fields_dict.default_expense_account.get_query = function(doc) { + return{ + filters:{ + 'company': doc.name, + 'group_or_ledger': "Ledger", + 'is_pl_account': "Yes", + 'debit_or_credit': "Debit" + } + } +} + +cur_frm.fields_dict.default_income_account.get_query = function(doc) { + return{ + filters:{ + 'company': doc.name, + 'group_or_ledger': "Ledger", + 'is_pl_account': "Yes", + 'debit_or_credit': "Credit" + } + } +} + +cur_frm.fields_dict.cost_center.get_query = function(doc) { + return{ + filters:{ + 'company': doc.name, + 'group_or_ledger': "Ledger", + } + } +} + if (sys_defaults.auto_inventory_accounting) { cur_frm.fields_dict["stock_in_hand_account"].get_query = function(doc) { return { diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py index 66c83d69338..eeff2d1bef2 100644 --- a/setup/doctype/company/company.py +++ b/setup/doctype/company/company.py @@ -48,7 +48,8 @@ class DocType: self.create_default_warehouses() self.create_default_web_page() - if not self.doc.cost_center: + if not webnotes.conn.get_value("Cost Center", {"group_or_ledger": "Ledger", + "company": self.doc.name}): self.create_default_cost_center() self.set_default_accounts()
Item%(item_code)s%(item_name)s%(rate)s
%(amount)s
%(amount)s
%(rate)s
%(description)s%(description)s (%(rate)s%)%(tax_amount)s