Rewritten landed cost wizard
This commit is contained in:
parent
7b095e97ad
commit
b0fa2af45b
@ -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',
|
||||
|
8
erpnext/patches/reload_lc_wizard.py
Normal file
8
erpnext/patches/reload_lc_wizard.py
Normal 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')
|
@ -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"'
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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'
|
||||
}
|
||||
]
|
@ -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'
|
||||
}
|
||||
]
|
@ -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',
|
||||
|
Loading…
x
Reference in New Issue
Block a user