[fix] [mapper] from delivery note to sales invoice, only map unbilled items
This commit is contained in:
parent
49154c790e
commit
17350b899f
@ -93,12 +93,18 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
wn.model.map_current_doc({
|
wn.model.map_current_doc({
|
||||||
method: "stock.doctype.delivery_note.delivery_note.make_sales_invoice",
|
method: "stock.doctype.delivery_note.delivery_note.make_sales_invoice",
|
||||||
source_doctype: "Delivery Note",
|
source_doctype: "Delivery Note",
|
||||||
get_query_filters: {
|
get_query: function() {
|
||||||
|
var filters = {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
customer: cur_frm.doc.customer || undefined,
|
|
||||||
company: cur_frm.doc.company
|
company: cur_frm.doc.company
|
||||||
|
};
|
||||||
|
if(cur_frm.doc.customer) filters["customer"] = cur_frm.doc.customer;
|
||||||
|
return {
|
||||||
|
query: "controllers.queries.get_delivery_notes_to_be_billed",
|
||||||
|
filters: filters
|
||||||
|
};
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// cur_frm.add_custom_button(wn._("POS View"), function() {
|
// cur_frm.add_custom_button(wn._("POS View"), function() {
|
||||||
|
@ -1001,10 +1001,12 @@ def make_delivery_note(source_name, target_doclist=None):
|
|||||||
bean = webnotes.bean(target)
|
bean = webnotes.bean(target)
|
||||||
bean.run_method("onload_post_render")
|
bean.run_method("onload_post_render")
|
||||||
|
|
||||||
def update_item(obj, target, source_parent):
|
def update_item(source_doc, target_doc, source_parent):
|
||||||
target.amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.basic_rate)
|
target_doc.amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \
|
||||||
target.export_amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.export_rate)
|
flt(source_doc.basic_rate)
|
||||||
target.qty = flt(obj.qty) - flt(obj.delivered_qty)
|
target_doc.export_amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \
|
||||||
|
flt(source_doc.export_rate)
|
||||||
|
target_doc.qty = flt(source_doc.qty) - flt(source_doc.delivered_qty)
|
||||||
|
|
||||||
doclist = get_mapped_doclist("Sales Invoice", source_name, {
|
doclist = get_mapped_doclist("Sales Invoice", source_name, {
|
||||||
"Sales Invoice": {
|
"Sales Invoice": {
|
||||||
|
@ -394,7 +394,6 @@ class AccountsController(TransactionBase):
|
|||||||
|
|
||||||
total_billed_amt = flt(flt(already_billed) + flt(item.fields[based_on]),
|
total_billed_amt = flt(flt(already_billed) + flt(item.fields[based_on]),
|
||||||
self.precision(based_on, item))
|
self.precision(based_on, item))
|
||||||
webnotes.errprint([max_allowed_amt, total_billed_amt])
|
|
||||||
|
|
||||||
if max_allowed_amt and total_billed_amt - max_allowed_amt > 0.02:
|
if max_allowed_amt and total_billed_amt - max_allowed_amt > 0.02:
|
||||||
webnotes.msgprint(_("Row ")+ cstr(item.idx) + ": " + cstr(item.item_code) +
|
webnotes.msgprint(_("Row ")+ cstr(item.idx) + ": " + cstr(item.item_code) +
|
||||||
|
@ -23,7 +23,7 @@ def get_filters_cond(doctype, filters, conditions):
|
|||||||
filters = filters.items()
|
filters = filters.items()
|
||||||
flt = []
|
flt = []
|
||||||
for f in filters:
|
for f in filters:
|
||||||
if f[1][0] == '!':
|
if isinstance(f[1], basestring) and f[1][0] == '!':
|
||||||
flt.append([doctype, f[0], '!=', f[1][1:]])
|
flt.append([doctype, f[0], '!=', f[1][1:]])
|
||||||
else:
|
else:
|
||||||
flt.append([doctype, f[0], '=', f[1]])
|
flt.append([doctype, f[0], '=', f[1]])
|
||||||
@ -205,3 +205,19 @@ def get_price_list_currency(doctype, txt, searchfield, start, page_len, filters)
|
|||||||
("%s", "%s", searchfield, "%s", "%s", "%s"),
|
("%s", "%s", searchfield, "%s", "%s", "%s"),
|
||||||
(filters["price_list_name"], filters['buying_or_selling'], "%%%s%%" % txt,
|
(filters["price_list_name"], filters['buying_or_selling'], "%%%s%%" % txt,
|
||||||
start, page_len))
|
start, page_len))
|
||||||
|
|
||||||
|
def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters):
|
||||||
|
return webnotes.conn.sql("""select `tabDelivery Note`.name, `tabDelivery Note`.customer_name
|
||||||
|
from `tabDelivery Note`
|
||||||
|
where `tabDelivery Note`.`%(key)s` like %(txt)s %(fcond)s and
|
||||||
|
(ifnull((select sum(qty) from `tabDelivery Note Item` where
|
||||||
|
`tabDelivery Note Item`.parent=`tabDelivery Note`.name), 0) >
|
||||||
|
ifnull((select sum(qty) from `tabSales Invoice Item` where
|
||||||
|
`tabSales Invoice Item`.delivery_note=`tabDelivery Note`.name), 0))
|
||||||
|
%(mcond)s order by `tabDelivery Note`.`%(key)s` asc
|
||||||
|
limit %(start)s, %(page_len)s""" % {
|
||||||
|
"key": searchfield,
|
||||||
|
"fcond": get_filters_cond(doctype, filters, []),
|
||||||
|
"mcond": get_match_cond(doctype),
|
||||||
|
"start": "%(start)s", "page_len": "%(page_len)s", "txt": "%(txt)s"
|
||||||
|
}, { "start": start, "page_len": page_len, "txt": ("%%%s%%" % txt) }, debug=True)
|
@ -75,8 +75,10 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({
|
|||||||
|
|
||||||
company: function() {
|
company: function() {
|
||||||
if(this.frm.doc.company && this.frm.fields_dict.currency) {
|
if(this.frm.doc.company && this.frm.fields_dict.currency) {
|
||||||
var company_currency = this.get_company_currency();
|
if(!this.frm.doc.currency) {
|
||||||
this.frm.set_value("currency", company_currency);
|
this.frm.set_value("currency", this.get_company_currency());
|
||||||
|
}
|
||||||
|
|
||||||
this.frm.script_manager.trigger("currency");
|
this.frm.script_manager.trigger("currency");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -369,12 +369,38 @@ class DocType(SellingController):
|
|||||||
from accounts.general_ledger import make_gl_entries
|
from accounts.general_ledger import make_gl_entries
|
||||||
make_gl_entries(gl_entries, cancel=(self.doc.docstatus == 2))
|
make_gl_entries(gl_entries, cancel=(self.doc.docstatus == 2))
|
||||||
|
|
||||||
|
def get_invoiced_qty_map(delivery_note):
|
||||||
|
"""returns a map: {dn_detail: invoiced_qty}"""
|
||||||
|
invoiced_qty_map = {}
|
||||||
|
|
||||||
|
for dn_detail, qty in webnotes.conn.sql("""select dn_detail, qty from `tabSales Invoice Item`
|
||||||
|
where delivery_note=%s and docstatus=1""", delivery_note):
|
||||||
|
if not invoiced_qty_map.get(dn_detail):
|
||||||
|
invoiced_qty_map[dn_detail] = 0
|
||||||
|
invoiced_qty_map[dn_detail] += qty
|
||||||
|
|
||||||
|
return invoiced_qty_map
|
||||||
|
|
||||||
@webnotes.whitelist()
|
@webnotes.whitelist()
|
||||||
def make_sales_invoice(source_name, target_doclist=None):
|
def make_sales_invoice(source_name, target_doclist=None):
|
||||||
|
invoiced_qty_map = get_invoiced_qty_map(source_name)
|
||||||
|
|
||||||
def update_accounts(source, target):
|
def update_accounts(source, target):
|
||||||
si = webnotes.bean(target)
|
si = webnotes.bean(target)
|
||||||
si.run_method("onload_post_render")
|
si.run_method("onload_post_render")
|
||||||
|
|
||||||
|
si.set_doclist(si.doclist.get({"parentfield": ["!=", "entries"]}) +
|
||||||
|
si.doclist.get({"parentfield": "entries", "qty": [">", 0]}))
|
||||||
|
|
||||||
|
if len(si.doclist.get({"parentfield": "entries"})) == 0:
|
||||||
|
webnotes.msgprint(_("Hey! All these items have already been invoiced."),
|
||||||
|
raise_exception=True)
|
||||||
|
|
||||||
|
return si.doclist
|
||||||
|
|
||||||
|
def update_item(source_doc, target_doc, source_parent):
|
||||||
|
target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0)
|
||||||
|
|
||||||
doclist = get_mapped_doclist("Delivery Note", source_name, {
|
doclist = get_mapped_doclist("Delivery Note", source_name, {
|
||||||
"Delivery Note": {
|
"Delivery Note": {
|
||||||
"doctype": "Sales Invoice",
|
"doctype": "Sales Invoice",
|
||||||
@ -391,6 +417,7 @@ def make_sales_invoice(source_name, target_doclist=None):
|
|||||||
"prevdoc_docname": "sales_order",
|
"prevdoc_docname": "sales_order",
|
||||||
"serial_no": "serial_no"
|
"serial_no": "serial_no"
|
||||||
},
|
},
|
||||||
|
"postprocess": update_item
|
||||||
},
|
},
|
||||||
"Sales Taxes and Charges": {
|
"Sales Taxes and Charges": {
|
||||||
"doctype": "Sales Taxes and Charges",
|
"doctype": "Sales Taxes and Charges",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user