Merge branch 'master' of github.com:webnotes/erpnext

This commit is contained in:
Anand Doshi
2013-09-05 12:22:14 +05:30
12 changed files with 185 additions and 75 deletions

View File

@@ -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"}
}

View File

@@ -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)
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()

View File

@@ -16,7 +16,7 @@ erpnext.POS = Class.extend({
<div class="col-sm-6">\
<div class="pos-bill">\
<div class="item-cart">\
<table class="table table-condensed table-hover" id="cart" style="table-layout: fixed;">\
<table class="table table-condensed table-hover" id="cart" style="table-layout: fixed;">\
<thead>\
<tr>\
<th style="width: 50%">Item</th>\
@@ -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 = "<img src='" + obj.image + "' class='img-responsive'>";
image = '<img src="' + obj.image + '" class="img-responsive" \
style="border:1px solid #eee;height:140px;width:100%;">';
else
image = '<div class="missing-image"><i class="icon-camera"></i></div>';
$(repl('<div class="col-xs-3 pos-item" data-item_code="%(item_code)s">\
%(item_image)s\
<div>%(item_image)s</div>\
<div class="small">%(item_code)s</div>\
<div class="small">%(item_name)s</div>\
<div class="small">%(item_price)s</div>\
@@ -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({
<td>%(item_code)s%(item_name)s</td>\
<td><input type="text" value="%(qty)s" \
class="form-control qty" style="text-align: right;"></td>\
<td style="text-align: right;">%(rate)s<br><b>%(amount)s</b></td>\
<td style="text-align: right;"><b>%(amount)s</b><br>%(rate)s</td>\
</tr>',
{
item_code: d.item_code,
@@ -283,10 +292,11 @@ erpnext.POS = Class.extend({
$.each(taxes, function(i, d) {
$(repl('<tr>\
<td>%(description)s</td>\
<td>%(description)s (%(rate)s%)</td>\
<td style="text-align: right;">%(tax_amount)s</td>\
<tr>', {
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();

View File

@@ -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):

View File

@@ -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 {

View File

@@ -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",