Merge branch 'master' of github.com:webnotes/erpnext
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 ed67ba2..58f66c7 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 0000000..6c884c9
--- /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 5209d1a..7e68f9b 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 @@
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 e1d5774..2b828f9 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,177 @@
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]
+ if not self.selected_pr:
+ msgprint("Please select atleast one PR to proceed.", raise_exception=1)
+
+ 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)
+ 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 90c570a..1e12afa 100644
--- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt
+++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.txt
@@ -3,16 +3,18 @@
# These values are common in all dictionaries
{
- 'creation': '2010-08-08 17:09:07',
+ 'creation': '2011-11-16 16:17:22',
'docstatus': 0,
- 'modified': '2011-06-30 18:47:46',
+ 'modified': '2011-11-16 16:32:18',
'modified_by': 'Administrator',
'owner': 'wasim@webnotestech.com'
},
# These values are common for all DocType
{
+ '_last_update': '1321441191',
'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': 35
},
# 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,7 +113,6 @@
# DocPerm
{
'doctype': 'DocPerm',
- 'idx': 8,
'permlevel': 1,
'role': 'Purchase Manager'
},
@@ -126,9 +120,23 @@
# DocField
{
'doctype': 'DocField',
+ 'fieldtype': 'HTML',
+ 'label': 'Process',
+ 'options': '<div class="field_description"><b>Process:</b><br>1. Fetch and select Purchase Receipt<br>2. Enter extra costs<br>3. Click on Update Landed Cost button<br> 4. Cost will be added into other charges table of selected PR proportionately based on net total<br>5. Item Valuation Rate will be recalculated</div>'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldtype': 'Section Break',
+ 'options': 'Simple'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
'fieldname': 'from_pr_date',
'fieldtype': 'Date',
- 'idx': 1,
'label': 'From PR Date',
'reqd': 1
},
@@ -138,7 +146,6 @@
'doctype': 'DocField',
'fieldname': 'to_pr_date',
'fieldtype': 'Date',
- 'idx': 2,
'label': 'To PR Date',
'reqd': 1
},
@@ -148,7 +155,6 @@
'doctype': 'DocField',
'fieldname': 'currency',
'fieldtype': 'Select',
- 'idx': 3,
'label': 'Currency',
'options': 'link:Currency',
'reqd': 1
@@ -158,7 +164,6 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 4,
'label': 'Get Purchase Receipt',
'options': 'get_purchase_receipts'
},
@@ -166,18 +171,8 @@
# 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 +181,6 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 7,
- 'label': 'Landed Cost Detail',
'options': 'Simple'
},
@@ -196,7 +189,6 @@
'doctype': 'DocField',
'fieldname': 'landed_cost',
'fieldtype': 'Link',
- 'idx': 8,
'label': 'Select Landed Cost Details Master',
'options': 'Landed Cost Master'
},
@@ -206,7 +198,6 @@
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 9,
'label': 'Get Details',
'options': 'get_landed_cost_master_details'
},
@@ -216,7 +207,6 @@
'doctype': 'DocField',
'fieldname': 'landed_cost_details',
'fieldtype': 'Table',
- 'idx': 10,
'label': 'Landed Cost Details',
'options': 'Landed Cost Detail'
},
@@ -225,8 +215,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 d09285d..b6bcb42 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 2348e8e..2e3514e 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',