Rewritten landed cost wizard

This commit is contained in:
Nabin Hait 2011-11-16 16:20:37 +05:30
parent 7b095e97ad
commit b0fa2af45b
7 changed files with 240 additions and 280 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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'
}
]

View File

@ -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'
}
]

View File

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