From b0fa2af45be1346af18ea2c477885a1cda7baa2a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 16 Nov 2011 16:20:37 +0530 Subject: [PATCH] Rewritten landed cost wizard --- .../purchase_tax_detail.txt | 22 +- erpnext/patches/reload_lc_wizard.py | 8 + .../landed_cost_wizard/landed_cost_wizard.js | 5 +- .../landed_cost_wizard/landed_cost_wizard.py | 414 +++++++++--------- .../landed_cost_wizard/landed_cost_wizard.txt | 45 +- .../doctype/lc_pr_detail/lc_pr_detail.txt | 19 +- .../purchase_receipt_detail.txt | 7 +- 7 files changed, 240 insertions(+), 280 deletions(-) create mode 100644 erpnext/patches/reload_lc_wizard.py diff --git a/erpnext/accounts/doctype/purchase_tax_detail/purchase_tax_detail.txt b/erpnext/accounts/doctype/purchase_tax_detail/purchase_tax_detail.txt index ed67ba2f0b..58f66c7f6b 100644 --- a/erpnext/accounts/doctype/purchase_tax_detail/purchase_tax_detail.txt +++ b/erpnext/accounts/doctype/purchase_tax_detail/purchase_tax_detail.txt @@ -5,8 +5,8 @@ { 'creation': '2010-08-08 17:09:16', 'docstatus': 0, - 'modified': '2010-09-20 14:06:57', - 'modified_by': 'umair@iwebnotes.com', + 'modified': '2011-11-16 15:41:42', + 'modified_by': 'Administrator', 'owner': 'wasim@webnotestech.com' }, @@ -14,6 +14,7 @@ { 'autoname': 'PVTD.######', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'hide_heading': 1, 'istable': 1, @@ -22,7 +23,7 @@ 'section_style': 'Tray', 'server_code_error': ' ', 'show_in_menu': 0, - 'version': 10 + 'version': 12 }, # These values are common for all DocField @@ -45,7 +46,6 @@ 'doctype': 'DocField', 'fieldname': 'category', 'fieldtype': 'Select', - 'idx': 1, 'label': 'Category', 'oldfieldname': 'category', 'oldfieldtype': 'Select', @@ -60,7 +60,6 @@ 'doctype': 'DocField', 'fieldname': 'add_deduct_tax', 'fieldtype': 'Select', - 'idx': 2, 'label': 'Add or Deduct', 'oldfieldname': 'add_deduct_tax', 'oldfieldtype': 'Select', @@ -75,7 +74,6 @@ 'doctype': 'DocField', 'fieldname': 'charge_type', 'fieldtype': 'Select', - 'idx': 3, 'label': 'Type', 'oldfieldname': 'charge_type', 'oldfieldtype': 'Select', @@ -91,7 +89,6 @@ 'fieldname': 'row_id', 'fieldtype': 'Data', 'hidden': 0, - 'idx': 4, 'label': 'Enter Row', 'oldfieldname': 'row_id', 'oldfieldtype': 'Data', @@ -104,7 +101,6 @@ 'doctype': 'DocField', 'fieldname': 'item_wise_tax_detail', 'fieldtype': 'Small Text', - 'idx': 5, 'label': 'Item Wise Tax Detail ', 'oldfieldname': 'item_wise_tax_detail', 'oldfieldtype': 'Small Text', @@ -116,7 +112,6 @@ 'doctype': 'DocField', 'fieldname': 'description', 'fieldtype': 'Small Text', - 'idx': 6, 'label': 'Description', 'oldfieldname': 'description', 'oldfieldtype': 'Small Text', @@ -130,7 +125,6 @@ 'doctype': 'DocField', 'fieldname': 'account_head', 'fieldtype': 'Link', - 'idx': 7, 'label': 'Account Head', 'oldfieldname': 'account_head', 'oldfieldtype': 'Link', @@ -145,13 +139,11 @@ 'doctype': 'DocField', 'fieldname': 'cost_center', 'fieldtype': 'Link', - 'idx': 8, 'label': 'Cost Center', 'oldfieldname': 'cost_center', 'oldfieldtype': 'Link', 'options': 'Cost Center', 'permlevel': 0, - 'search_index': 0, 'trigger': 'Client' }, @@ -160,7 +152,6 @@ 'doctype': 'DocField', 'fieldname': 'rate', 'fieldtype': 'Currency', - 'idx': 9, 'label': 'Rate', 'oldfieldname': 'rate', 'oldfieldtype': 'Currency', @@ -174,7 +165,6 @@ 'doctype': 'DocField', 'fieldname': 'tax_amount', 'fieldtype': 'Currency', - 'idx': 10, 'label': 'Amount', 'oldfieldname': 'tax_amount', 'oldfieldtype': 'Currency', @@ -188,7 +178,6 @@ 'doctype': 'DocField', 'fieldname': 'total', 'fieldtype': 'Currency', - 'idx': 11, 'label': 'Aggregate Total', 'oldfieldname': 'total', 'oldfieldtype': 'Currency', @@ -201,7 +190,6 @@ 'fieldname': 'parenttype', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 12, 'in_filter': 1, 'label': 'Parenttype', 'oldfieldname': 'parenttype', @@ -218,7 +206,6 @@ 'fieldname': 'total_tax_amount', 'fieldtype': 'Currency', 'hidden': 1, - 'idx': 13, 'label': 'Total +Tax', 'no_copy': 1, 'oldfieldname': 'total_tax_amount', @@ -235,7 +222,6 @@ 'fieldname': 'total_amount', 'fieldtype': 'Currency', 'hidden': 1, - 'idx': 14, 'label': 'Tax Amount', 'no_copy': 1, 'oldfieldname': 'total_amount', diff --git a/erpnext/patches/reload_lc_wizard.py b/erpnext/patches/reload_lc_wizard.py new file mode 100644 index 0000000000..6c884c9a8c --- /dev/null +++ b/erpnext/patches/reload_lc_wizard.py @@ -0,0 +1,8 @@ +def execute(): + import webnotes + from webnotes.modules.module_manager import reload_doc + from webnotes.model import delete_doc + + delete_doc('DocType', 'Landed Cost Wizard') + reload_doc('stock', 'doctype', 'landed_cost_wizard') + reload_doc('stock', 'doctype', 'lc_pr_detail') diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.js b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.js index 5209d1ab26..7e68f9b4ae 100644 --- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.js +++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.js @@ -2,10 +2,7 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) { if(!doc.currency){doc.currency = sys_defaults.currency;} } -cur_frm.fields_dict['landed_cost_details'].grid.get_field("account_head").get_query = function(doc,cdt,cdn) { - return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.account_type = "Chargeable" AND tabAccount.name LIKE "%s"' -} cur_frm.fields_dict['landed_cost_details'].grid.get_field("account_head").get_query = function(doc,cdt,cdn) { return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND (tabAccount.account_type = "Tax" OR tabAccount.account_type = "Chargeable") AND tabAccount.name LIKE "%s"' -} \ No newline at end of file +} diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py index e1d57746d6..fccc3db4bb 100644 --- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py +++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py @@ -1,236 +1,47 @@ -# Please edit this list and import only required elements import webnotes +from webnotes.utils import cint, cstr, flt +from webnotes.model.doc import addchild, getchildren +from webnotes.model.doclist import getlist +from webnotes.model.code import get_obj +from webnotes import msgprint -from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add -from webnotes.model import db_exists -from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType -from webnotes.model.doclist import getlist, copy_doclist -from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax -from webnotes import session, form, is_testing, msgprint, errprint - -set = webnotes.conn.set sql = webnotes.conn.sql -get_value = webnotes.conn.get_value -in_transaction = webnotes.conn.in_transaction -convert_to_lists = webnotes.conn.convert_to_lists # ----------------------------------------------------------------------------------------- - class DocType: def __init__(self, doc, doclist=[]): self.doc = doc self.doclist = doclist + self.prwise_cost = {} + + def check_mandatory(self): + """ Check mandatory fields """ + if not self.doc.from_pr_date or not self.doc.to_pr_date: + msgprint("Please enter From and To PR Date", raise_exception=1) + + if not self.doc.currency: + msgprint("Please enter Currency.", raise_exception=1) + def get_purchase_receipts(self): + """ Get purchase receipts for given period """ + self.doc.clear_table(self.doclist,'lc_pr_details',1) - if not self.doc.from_pr_date or not self.doc.to_pr_date: - msgprint("Please enter From and To PR Date") - raise Exception - if not self.doc.currency: - msgprint("Please enter Currency.") - raise Exception - pr = sql("select name from `tabPurchase Receipt` where docstatus = 1 and posting_date >= '%s' and posting_date <= '%s' and currency = '%s' order by name "%(self.doc.from_pr_date,self.doc.to_pr_date,self.doc.currency), as_dict = 1) + self.check_mandatory() + + pr = sql("select name from `tabPurchase Receipt` where docstatus = 1 and posting_date >= '%s' and posting_date <= '%s' and currency = '%s' order by name " % (self.doc.from_pr_date, self.doc.to_pr_date, self.doc.currency), as_dict = 1) if len(pr)>200: - msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.") - raise Exception + msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.", raise_exception=1) + for i in pr: - if i and i['name']: - pr_no = addchild(self.doc, 'lc_pr_details', 'LC PR Detail', 1, self.doclist) - pr_no.purchase_receipt_no = i and i['name'] or '' - pr_no.save() + ch = addchild(self.doc, 'lc_pr_details', 'LC PR Detail', 1, self.doclist) + ch.purchase_receipt = i and i['name'] or '' + ch.save() - def update_pr_lc_se(self): - lst = [] - condition = ' name in(' - - amt = 0 - for d in getlist(self.doclist, 'lc_pr_details'): - - if cint(d.include_in_landed_cost) == 1: - condition += '"'+d.purchase_receipt_no+'",' - lst.append(d.purchase_receipt_no) - condition += '"")' - - amount = sql("SELECT SUM(net_total) FROM `tabPurchase Receipt` WHERE docstatus = 1 AND %s"%condition) - amt = amount and flt(amount[0][0]) or 0 - for lc in getlist(self.doclist, 'landed_cost_details'): - for name in lst: - pr_oc_det = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s ",(name, lc.account_head)) - #obj = get_obj('Purchase Receipt', name, with_children = 1) - if not pr_oc_det: - obj = get_obj('Purchase Receipt', name, with_children = 1) - lgth = cint(sql("select count(name) from `tabPurchase Tax Detail` where parent = '%s' "%(name))[0][0]) - pr_oc = addchild(obj.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1) - pr_oc.category = 'For Valuation' - pr_oc.add_deduct_tax = 'Add' - pr_oc.charge_type = 'Actual' - pr_oc.description = lc.description - pr_oc.account_head = lc.account_head - pr_oc.rate = flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)) - pr_oc.tax_amount = flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)) - pr_oc.total = obj.doc.grand_total - pr_oc.docstatus = 1 - pr_oc.idx = cint(lgth) - pr_oc.save() - else: - obj = get_obj('Purchase Receipt', name) - sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s",(flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)),flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)),pr_oc_det[0][0],name)) - - self.calc_pr_other_charges(name) - obj = get_obj('Purchase Receipt', name, with_children = 1) - for d in getlist(obj.doclist, 'purchase_receipt_details'): - if flt(d.qty): - d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor) - d.save() - sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name)) - - bin_name = sql("select t1.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1"%(d.name)) - if bin_name and bin_name[0][0]: - obj = get_obj('Bin', bin_name[0][0]).update_entries_after(bin_name[0][1], bin_name[0][2]) - - # now distribute the taxes among the PRs - for lc in getlist(self.doclist, 'landed_cost_details'): - for d in lst: - pr_id = d.purchase_receipt_no - - # load the purchase receipt object - pr = get_obj('Purchase Receipt', pr_id, with_children = 1) - - # get the tax detail (for valuation) in the PR if it exists - pr_oc_det = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s ",(pr_id, lc.account_head)) - - # update tax rate and tax amount - tax_amount = flt(flt(lc.amount) * flt(pr.doc.net_total/ amt)) - - # for display - d.net_total = pr.doc.net_total - d.added_cost = tax_amount - d.save() - - # if not exist, create the tax detail for valuation - if not pr_oc_det: - lgth = cint(sql("select count(name) from `tabPurchase Tax Detail` where parent = '%s' "%(pr_id))[0][0]) - pr_oc = addchild(pr.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1) - pr_oc.category = 'For Valuation' - pr_oc.add_deduct_tax = 'Add' - pr_oc.charge_type = 'Actual' - pr_oc.description = lc.description - pr_oc.account_head = lc.account_head - pr_oc.rate = tax_amount - pr_oc.tax_amount = tax_amount - pr_oc.total = obj.doc.grand_total - pr_oc.docstatus = 1 - pr_oc.idx = cint(lgth) - pr_oc.save() - else: - obj = get_obj('Purchase Receipt', name) - sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s", \ - (tax_amount, tax_amount, pr_oc_det[0][0], pr_id)) - - self.calc_pr_other_charges(name) - - # reload - and update the stock entries with the - # additional valuations - - obj = get_obj('Purchase Receipt', name, with_children = 1) - for d in getlist(obj.doclist, 'purchase_receipt_details'): - if flt(d.qty): - d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor) - d.save() - sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name)) - bin_name = sql("select t1.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1"%(d.name)) - - # update valuation of the item - if bin_name and bin_name[0][0]: - obj = get_obj('Bin', bin_name[0][0]).update_entries_after(bin_name[0][1], bin_name[0][2]) - - def add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=1): - ocd[oc].total_amount = flt(tax_amount.toFixed(2)) - ocd[oc].total_tax_amount = flt(prev_total.toFixed(2)) - ocd[oc].tax_amount += flt(tax_amount.toFixed(2)) - - total_amount = flt(ocd[oc].tax_amount) - total_tax_amount = flt(ocd[oc].total_tax_amount) + (f * flt(total_amount)) - - if ocd[oc].category != "For Valuation": - prev_total += f * flt(ocd[oc].total_amount) - total += f * flt(ocd[oc].tax_amount) - ocd[oc].total = flt(total) + (f * flt(tax[t].tax_amount)) - else: - prev_total = prev_total - ocd[oc].total = flt(total) - if ocd[oc].category != "For Total": - item_tax += f * ocd[oc].total_amount - ocd[oc].save() - - return total, prev_total - - # calculate the taxes for these PRs - def calc_pr_other_charges(self, name): - - # re-calculate other charges - obj = get_obj('Purchase Receipt', name, with_children = 1) - total = 0 - net_total = obj.doc.net_total - - - for prd in getlist(obj.doclist, 'purchase_receipt_details'): - prev_total, item_tax = flt(prd.amount), 0 - total += flt(flt(prd.qty) * flt(prd.purchase_rate)) - - check_tax = prd.item_tax_rate and eval(prd.item_tax_rate) or {} - ocd = getlist(obj.doclist, 'purchase_tax_details') - - # calculate tax for other charges - for oc in range(len(ocd)): - if check_tax.get(ocd[oc].account_head) and ocd[oc].charge_type != 'Actual': - rate = check_tax[ocd[oc].account_head] - else: - rate = flt(ocd[oc].rate) - - tax_amount = self.cal_tax(ocd, prd, rate, net_total, oc) - if ocd[oc].add_deduct_tax == 'Add': - add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=1) - - elif ocd[oc].add_deduct_tax == 'Deduct': - add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=-1) - - prd.item_tax_amount = flt(item_tax) - prd.save() - obj.doc.save() - - def cal_tax(self, ocd, prd, rate, net_total, oc): - tax_amount = 0 - if ocd[oc].charge_type == 'Actual': - value = flt(flt(rate) / flt(net_total)) - return flt(flt(value) * flt(prd.amount)) - - elif ocd[oc].charge_type == 'On Net Total': - return flt(flt(rate) * flt(prd.amount) / 100) - - elif ocd[oc].charge_type == 'On Previous Row Amount': - - row_no = cstr(ocd[oc].row_id) - row = (row_no).split("+") - for r in range(0, len(row.length)): - id = cint(row[r]) - tax_amount += flt((flt(rate) * flt(ocd[id-1].total_amount) / 100)) - row_id = row_no.find("/") - if row_id != -1: - rate = '' - row = (row_no).split("/") - - id1 = cint(row[0]) - id2 = cint(row[1]) - tax_amount = flt(flt(ocd[id1-1].total_amount) / flt(ocd[id2-1].total_amount)) - - return tax_amount - - # get details for landed cost table from master - # --------------------------------------------- def get_landed_cost_master_details(self): + """ pull details from landed cost master""" self.doc.clear_table(self.doclist, 'landed_cost_details') idx = 0 landed_cost = sql("select account_head, description from `tabLanded Cost Master Detail` where parent=%s", (self.doc.landed_cost), as_dict = 1) @@ -238,3 +49,176 @@ class DocType: lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Detail', 1, self.doclist) lct.account_head = cost['account_head'] lct.description = cost['description'] + + + def get_selected_pr(self): + """ Get selected purchase receipt no """ + self.selected_pr = [d.purchase_receipt for d in getlist(self.doclist, 'lc_pr_details') if d.select_pr] + + def validate_selected_pr(self): + """Validate selected PR as submitted""" + invalid_pr = sql("SELECT name FROM `tabPurchase Receipt` WHERE docstatus != 1 and name in (%s)" % ("'" + "', '".join(self.selected_pr) + "'")) + if invalid_pr: + msgprint("Selected purchase receipts must be submitted. Following PR are not submitted: %s" % invalid_pr, raise_exception=1) + + + def get_total_amt(self): + """ Get sum of net total of all selected PR""" + return sql("SELECT SUM(net_total) FROM `tabPurchase Receipt` WHERE name in (%s)" % ("'" + "', '".join(self.selected_pr) + "'"))[0][0] + + + def add_charges_in_pr(self): + """ Add additional charges in selected pr proportionately""" + total_amt = self.get_total_amt() + + for pr in self.selected_pr: + pr_obj = get_obj('Purchase Receipt', pr, with_children = 1) + cumulative_grand_total = flt(pr_obj.doc.grand_total) + + for lc in getlist(self.doclist, 'landed_cost_details'): + amt = flt(lc.amount) * flt(pr_obj.doc.net_total)/ flt(total_amt) + self.prwise_cost[pr] = self.prwise_cost.get(pr, 0) + amt + cumulative_grand_total += amt + + pr_oc_row = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head)) + if not pr_oc_row: # add if not exists + ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1) + ch.category = 'For Valuation' + ch.add_deduct_tax = 'Add' + ch.charge_type = 'Actual' + ch.description = lc.description + ch.account_head = lc.account_head + ch.rate = amt + ch.tax_amount = amt + ch.total = cumulative_grand_total + ch.docstatus = 1 + ch.idx = 500 # add at the end + ch.save(1) + else: # overwrite if exists + sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s ", (amt, amt, pr_oc_row[0][0], pr)) + + + def reset_other_charges(self, pr_obj): + """ Reset all calculated values to zero""" + for t in getlist(pr_obj.doclist, 'purchase_tax_details'): + t.total_tax_amount = 0; + t.total_amount = 0; + t.tax_amount = 0; + t.total = 0; + t.save() + + + def cal_charges_and_item_tax_amt(self): + """ Re-calculates other charges values and itemwise tax amount for getting valuation rate""" + for pr in self.selected_pr: + obj = get_obj('Purchase Receipt', pr, with_children = 1) + total = 0 + self.reset_other_charges(obj) + + for prd in getlist(obj.doclist, 'purchase_receipt_details'): + prev_total, item_tax = flt(prd.amount), 0 + total += flt(prd.qty) * flt(prd.purchase_rate) + + item_tax_rate = prd.item_tax_rate and eval(prd.item_tax_rate) or {} + + ocd = getlist(obj.doclist, 'purchase_tax_details') + # calculate tax for other charges + for oc in range(len(ocd)): + # Get rate : consider if diff for this item + if item_tax_rate.get(ocd[oc].account_head) and ocd[oc].charge_type != 'Actual': + rate = item_tax_rate[ocd[oc].account_head] + else: + rate = flt(ocd[oc].rate) + + tax_amount = self.cal_tax(ocd, prd, rate, obj.doc.net_total, oc) + total, prev_total, item_tax = self.add_deduct_taxes(ocd, oc, tax_amount, total, prev_total, item_tax) + + prd.item_tax_amount = flt(item_tax) + prd.save() + obj.doc.save() + + + def cal_tax(self, ocd, prd, rate, net_total, oc): + """ Calculates tax amount for one item""" + tax_amount = 0 + if ocd[oc].charge_type == 'Actual': + tax_amount = flt(rate) * flt(prd.amount) / flt(net_total) + elif ocd[oc].charge_type == 'On Net Total': + tax_amount = flt(rate) * flt(prd.amount) / 100 + elif ocd[oc].charge_type == 'On Previous Row Amount': + row_no = cstr(ocd[oc].row_id) + row = row_no.split("+") + for r in range(0, len(row)): + id = cint(row[r]) + tax_amount += flt((flt(rate) * flt(ocd[id-1].total_amount) / 100)) + row_id = row_no.find("/") + if row_id != -1: + rate = '' + row = (row_no).split("/") + id1 = cint(row[0]) + id2 = cint(row[1]) + tax_amount = flt(flt(ocd[id1-1].total_amount) / flt(ocd[id2-1].total_amount)) + elif ocd[oc].charge_type == 'On Previous Row Total': + row = cint(ocd[oc].row_id) + if ocd[row-1].add_deduct_tax == 'Add': + tax_amount = flt(rate) * (flt(ocd[row-1].total_tax_amount)+flt(ocd[row-1].total_amount)) / 100 + elif ocd[row-1].add_deduct_tax == 'Deduct': + tax_amount = flt(rate) * (flt(ocd[row-1].total_tax_amount)-flt(ocd[row-1].total_amount)) / 100 + + return tax_amount + + def add_deduct_taxes(self, ocd, oc, tax_amount, total, prev_total, item_tax): + """Calculates other charges values""" + add_ded = ocd[oc].add_deduct_tax == 'Add' and 1 or ocd[oc].add_or_deduct == 'Deduct' and -1 + ocd[oc].total_amount = flt(tax_amount) + ocd[oc].total_tax_amount = flt(prev_total) + ocd[oc].tax_amount += flt(tax_amount) + + total_amount = flt(ocd[oc].tax_amount) + total_tax_amount = flt(ocd[oc].total_tax_amount) + (add_ded * flt(total_amount)) + + if ocd[oc].category != "For Valuation": + prev_total += add_ded * flt(ocd[oc].total_amount) + total += add_ded * flt(ocd[oc].tax_amount) + msgprint(add_ded * flt(ocd[oc].tax_amount)) + ocd[oc].total = total + else: + prev_total = prev_total + ocd[oc].total = flt(total) + ocd[oc].save() + + if ocd[oc].category != "For Total": + item_tax += add_ded * ocd[oc].total_amount + + return total, prev_total, item_tax + + + def update_sle(self): + """ Recalculate valuation rate in all sle after pr posting date""" + for pr in self.selected_pr: + pr_obj = get_obj('Purchase Receipt', pr, with_children = 1) + + for d in getlist(pr_obj.doclist, 'purchase_receipt_details'): + if flt(d.qty): + d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost)/flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor) + d.save() + sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name)) + + bin = sql("select t1.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1" % d.name) + + # update valuation rate after pr posting date + if bin and bin[0][0]: + obj = get_obj('Bin', bin[0][0]).update_entries_after(bin[0][1], bin[0][2]) + + + def update_landed_cost(self): + """ + Add extra cost and recalculate all values in pr, + Recalculate valuation rate in all sle after pr posting date + """ + self.get_selected_pr() + self.validate_selected_pr() + self.add_charges_in_pr() + self.cal_charges_and_item_tax_amt() + self.update_sle() + msgprint("Landed Cost updated successfully") diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt index 90c570aebc..76f4968f2c 100644 --- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt +++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt @@ -5,14 +5,16 @@ { 'creation': '2010-08-08 17:09:07', 'docstatus': 0, - 'modified': '2011-06-30 18:47:46', + 'modified': '2011-11-16 15:59:42', 'modified_by': 'Administrator', 'owner': 'wasim@webnotestech.com' }, # These values are common for all DocType { + '_last_update': '1321350727', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'issingle': 1, 'module': 'Stock', @@ -20,7 +22,7 @@ 'section_style': 'Simple', 'server_code_error': ' ', 'show_in_menu': 1, - 'version': 31 + 'version': 33 }, # These values are common for all DocField @@ -52,7 +54,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 1, 'permlevel': 0, 'role': 'All', 'write': 0 @@ -64,7 +65,6 @@ 'cancel': 0, 'create': 1, 'doctype': 'DocPerm', - 'idx': 2, 'permlevel': 0, 'role': 'Purchase Manager', 'submit': 0, @@ -75,7 +75,6 @@ { 'create': 1, 'doctype': 'DocPerm', - 'idx': 3, 'permlevel': 0, 'role': 'System Manager', 'write': 1 @@ -85,7 +84,6 @@ { 'create': 1, 'doctype': 'DocPerm', - 'idx': 4, 'permlevel': 0, 'role': 'Purchase User', 'write': 1 @@ -94,7 +92,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 5, 'permlevel': 1, 'role': 'All' }, @@ -102,7 +99,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 6, 'permlevel': 1, 'role': 'System Manager' }, @@ -110,7 +106,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 7, 'permlevel': 1, 'role': 'Purchase User' }, @@ -118,17 +113,23 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 8, 'permlevel': 1, 'role': 'Purchase Manager' }, + # DocField + { + 'doctype': 'DocField', + 'fieldtype': 'Section Break', + 'label': 'Select PR', + 'options': 'Simple' + }, + # DocField { 'doctype': 'DocField', 'fieldname': 'from_pr_date', 'fieldtype': 'Date', - 'idx': 1, 'label': 'From PR Date', 'reqd': 1 }, @@ -138,7 +139,6 @@ 'doctype': 'DocField', 'fieldname': 'to_pr_date', 'fieldtype': 'Date', - 'idx': 2, 'label': 'To PR Date', 'reqd': 1 }, @@ -148,7 +148,6 @@ 'doctype': 'DocField', 'fieldname': 'currency', 'fieldtype': 'Select', - 'idx': 3, 'label': 'Currency', 'options': 'link:Currency', 'reqd': 1 @@ -158,26 +157,15 @@ { 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 4, 'label': 'Get Purchase Receipt', 'options': 'get_purchase_receipts' }, - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Section Break', - 'idx': 5, - 'label': 'LC PR Detail', - 'options': 'Simple' - }, - # DocField { 'doctype': 'DocField', 'fieldname': 'lc_pr_details', 'fieldtype': 'Table', - 'idx': 6, 'label': 'LC PR Details', 'options': 'LC PR Detail' }, @@ -186,8 +174,7 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 7, - 'label': 'Landed Cost Detail', + 'label': 'Update Landed Cost', 'options': 'Simple' }, @@ -196,7 +183,6 @@ 'doctype': 'DocField', 'fieldname': 'landed_cost', 'fieldtype': 'Link', - 'idx': 8, 'label': 'Select Landed Cost Details Master', 'options': 'Landed Cost Master' }, @@ -206,7 +192,6 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 9, 'label': 'Get Details', 'options': 'get_landed_cost_master_details' }, @@ -216,7 +201,6 @@ 'doctype': 'DocField', 'fieldname': 'landed_cost_details', 'fieldtype': 'Table', - 'idx': 10, 'label': 'Landed Cost Details', 'options': 'Landed Cost Detail' }, @@ -225,8 +209,7 @@ { 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 11, 'label': 'Update PR', - 'options': 'update_pr_lc_se' + 'options': 'update_landed_cost' } ] \ No newline at end of file diff --git a/erpnext/stock/doctype/lc_pr_detail/lc_pr_detail.txt b/erpnext/stock/doctype/lc_pr_detail/lc_pr_detail.txt index d09285db92..b6bcb42a9d 100644 --- a/erpnext/stock/doctype/lc_pr_detail/lc_pr_detail.txt +++ b/erpnext/stock/doctype/lc_pr_detail/lc_pr_detail.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:07', 'docstatus': 0, - 'modified': '2011-06-30 18:47:22', + 'modified': '2011-11-16 16:10:00', 'modified_by': 'Administrator', 'owner': 'wasim@webnotestech.com' }, @@ -13,6 +13,7 @@ # These values are common for all DocType { 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'istable': 1, 'module': 'Stock', @@ -20,7 +21,7 @@ 'section_style': 'Simple', 'server_code_error': ' ', 'show_in_menu': 0, - 'version': 2 + 'version': 5 }, # These values are common for all DocField @@ -42,25 +43,23 @@ # DocField { 'doctype': 'DocField', - 'fieldname': 'purchase_receipt_no', + 'fieldname': 'purchase_receipt', 'fieldtype': 'Link', - 'idx': 1, - 'label': 'Purchase Receipt No', + 'label': 'Purchase Receipt', 'oldfieldname': 'purchase_receipt_no', 'oldfieldtype': 'Link', 'options': 'Purchase Receipt', - 'search_index': 1 + 'width': '220px' }, # DocField { 'doctype': 'DocField', - 'fieldname': 'include_in_landed_cost', + 'fieldname': 'select_pr', 'fieldtype': 'Check', - 'idx': 2, - 'label': 'Include In Landed Cost', + 'label': 'Select PR', 'oldfieldname': 'include_in_landed_cost', 'oldfieldtype': 'Check', - 'width': '150px' + 'width': '120px' } ] \ No newline at end of file diff --git a/erpnext/stock/doctype/purchase_receipt_detail/purchase_receipt_detail.txt b/erpnext/stock/doctype/purchase_receipt_detail/purchase_receipt_detail.txt index 2348e8e048..2e3514e36f 100644 --- a/erpnext/stock/doctype/purchase_receipt_detail/purchase_receipt_detail.txt +++ b/erpnext/stock/doctype/purchase_receipt_detail/purchase_receipt_detail.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:16', 'docstatus': 0, - 'modified': '2011-10-20 18:40:15', + 'modified': '2011-11-16 15:43:36', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -22,7 +22,7 @@ 'section_style': 'Tray', 'server_code_error': ' ', 'show_in_menu': 0, - 'version': 60 + 'version': 63 }, # These values are common for all DocField @@ -451,6 +451,7 @@ # DocField { + 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldname': 'item_tax_amount', 'fieldtype': 'Currency', @@ -501,6 +502,7 @@ # DocField { + 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldname': 'valuation_rate', 'fieldtype': 'Currency', @@ -517,6 +519,7 @@ # DocField { + 'colour': 'White:FFF', 'description': 'Tax detail table fetched from item master as a string and stored in this field.\nUsed for Purchase Other Charges', 'doctype': 'DocField', 'fieldname': 'item_tax_rate',