frappe/frappe#478 removed more instances of doclist

This commit is contained in:
Rushabh Mehta 2014-04-03 12:38:42 +05:30
parent cfb6ccfe51
commit d36cb5c812
9 changed files with 82 additions and 87 deletions

View File

@ -736,7 +736,7 @@ def send_notification(new_rv):
from frappe.core.doctype.print_format.print_format import get_html from frappe.core.doctype.print_format.print_format import get_html
frappe.sendmail(new_rv.notification_email_address, frappe.sendmail(new_rv.notification_email_address,
subject="New Invoice : " + new_rv.name, subject="New Invoice : " + new_rv.name,
message = get_html(new_rv.doc, new_rv.doclist, "SalesInvoice")) message = get_html(new_rv.doc, new_rv, "SalesInvoice"))
def notify_errors(inv, customer, owner): def notify_errors(inv, customer, owner):
from frappe.utils.user import get_system_managers from frappe.utils.user import get_system_managers

View File

@ -41,7 +41,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
out["sales_team"] = [{ out["sales_team"] = [{
"sales_person": d.sales_person, "sales_person": d.sales_person,
"sales_designation": d.sales_designation "sales_designation": d.sales_designation
} for d in party_bean.doclist.get({"doctype":"Sales Team"})] } for d in party_bean.get("sales_team")]
return out return out

View File

@ -370,7 +370,7 @@ class SellingController(StockController):
d.get(ref_fieldname)) d.get(ref_fieldname))
def check_active_sales_items(obj): def check_active_sales_items(obj):
for d in obj.doclist.get({"parentfield": obj.fname}): for d in obj.get(obj.fname):
if d.item_code: if d.item_code:
item = frappe.db.sql("""select docstatus, is_sales_item, item = frappe.db.sql("""select docstatus, is_sales_item,
is_service_item, income_account from tabItem where name = %s""", is_service_item, income_account from tabItem where name = %s""",

View File

@ -290,19 +290,14 @@ def make_sales_invoice(source_name, target_doc=None):
si.is_pos = 0 si.is_pos = 0
si.run_method("onload_post_render") si.run_method("onload_post_render")
si.set_doclist(si.doclist.get({"parentfield": ["!=", "entries"]}) +
si.doclist.get({"parentfield": "entries", "qty": [">", 0]}))
if len(si.get("entries")) == 0: if len(si.get("entries")) == 0:
frappe.msgprint(_("Hey! All these items have already been invoiced."), frappe.msgprint(_("All these items have already been invoiced."),
raise_exception=True) raise_exception=True)
return si.doclist
def update_item(source_doc, target_doc, source_parent): def update_item(source_doc, target_doc, source_parent):
target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0) target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0)
doclist = get_mapped_doc("Delivery Note", source_name, { doc = get_mapped_doc("Delivery Note", source_name, {
"Delivery Note": { "Delivery Note": {
"doctype": "Sales Invoice", "doctype": "Sales Invoice",
"validation": { "validation": {
@ -318,7 +313,8 @@ def make_sales_invoice(source_name, target_doc=None):
"against_sales_order": "sales_order", "against_sales_order": "sales_order",
"serial_no": "serial_no" "serial_no": "serial_no"
}, },
"postprocess": update_item "postprocess": update_item,
"filter": lambda d: d.qty - invoiced_qty_map.get(d.name, 0)==0
}, },
"Sales Taxes and Charges": { "Sales Taxes and Charges": {
"doctype": "Sales Taxes and Charges", "doctype": "Sales Taxes and Charges",
@ -333,7 +329,7 @@ def make_sales_invoice(source_name, target_doc=None):
} }
}, target_doc, update_accounts) }, target_doc, update_accounts)
return doclist.as_dict() return doc.as_dict()
@frappe.whitelist() @frappe.whitelist()
def make_installation_note(source_name, target_doc=None): def make_installation_note(source_name, target_doc=None):

View File

@ -40,8 +40,7 @@ class LandedCostWizard(Document):
for lc in self.get("landed_cost_details"): for lc in self.get("landed_cost_details"):
amt = flt(lc.amount) * flt(pr_bean.net_total)/ flt(total_amt) amt = flt(lc.amount) * flt(pr_bean.net_total)/ flt(total_amt)
matched_row = pr_bean.doclist.get({ matched_row = pr_bean.get("other_charges", {
"parentfield": "other_charges",
"category": "Valuation", "category": "Valuation",
"add_deduct_tax": "Add", "add_deduct_tax": "Add",
"charge_type": "Actual", "charge_type": "Actual",
@ -66,8 +65,8 @@ class LandedCostWizard(Document):
matched_row[0].cost_center = lc.cost_center matched_row[0].cost_center = lc.cost_center
pr_bean.run_method("validate") pr_bean.run_method("validate")
for d in pr_bean.doclist: for d in pr_bean.get_all_children():
d.save() d.db_update()
def get_total_pr_amt(self, purchase_receipts): def get_total_pr_amt(self, purchase_receipts):
return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt` return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt`

View File

@ -191,29 +191,32 @@ def _update_requested_qty(bean, mr_obj, mr_items):
"""update requested qty (before ordered_qty is updated)""" """update requested qty (before ordered_qty is updated)"""
from erpnext.stock.utils import update_bin from erpnext.stock.utils import update_bin
for mr_item_name in mr_items: for mr_item_name in mr_items:
mr_item = mr_obj.doclist.getone({"parentfield": "indent_details", "name": mr_item_name}) mr_item = mr_obj.get("indent_details", {"name": mr_item_name})
se_detail = bean.doclist.getone({"parentfield": "mtn_details", se_detail = bean.get("mtn_details", {"material_request": mr_obj.name,
"material_request": mr_obj.name, "material_request_item": mr_item_name}) "material_request_item": mr_item_name})
mr_item.ordered_qty = flt(mr_item.ordered_qty) if mr_item and se_detail:
mr_item.qty = flt(mr_item.qty) mr_item = mr_item[0]
se_detail.transfer_qty = flt(se_detail.transfer_qty) se_detail = se_detail[0]
mr_item.ordered_qty = flt(mr_item.ordered_qty)
mr_item.qty = flt(mr_item.qty)
se_detail.transfer_qty = flt(se_detail.transfer_qty)
if se_detail.docstatus == 2 and mr_item.ordered_qty > mr_item.qty \ if se_detail.docstatus == 2 and mr_item.ordered_qty > mr_item.qty \
and se_detail.transfer_qty == mr_item.ordered_qty: and se_detail.transfer_qty == mr_item.ordered_qty:
add_indented_qty = mr_item.qty add_indented_qty = mr_item.qty
elif se_detail.docstatus == 1 and \ elif se_detail.docstatus == 1 and \
mr_item.ordered_qty + se_detail.transfer_qty > mr_item.qty: mr_item.ordered_qty + se_detail.transfer_qty > mr_item.qty:
add_indented_qty = mr_item.qty - mr_item.ordered_qty add_indented_qty = mr_item.qty - mr_item.ordered_qty
else: else:
add_indented_qty = se_detail.transfer_qty add_indented_qty = se_detail.transfer_qty
update_bin({ update_bin({
"item_code": se_detail.item_code, "item_code": se_detail.item_code,
"warehouse": se_detail.t_warehouse, "warehouse": se_detail.t_warehouse,
"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty, "indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
"posting_date": bean.posting_date, "posting_date": bean.posting_date,
}) })
def set_missing_values(source, target_doc): def set_missing_values(source, target_doc):
po = frappe.get_doc(target_doc) po = frappe.get_doc(target_doc)

View File

@ -299,7 +299,7 @@ def update_serial_nos_after_submit(controller, parentfield):
if not stock_ledger_entries: return if not stock_ledger_entries: return
for d in controller.doclist.get({"parentfield": parentfield}): for d in controller.get(parentfield):
serial_no = None serial_no = None
for sle in stock_ledger_entries: for sle in stock_ledger_entries:
if sle.voucher_detail_no==d.name: if sle.voucher_detail_no==d.name:

View File

@ -241,23 +241,23 @@ class StockEntry(StockController):
def validate_return_reference_doc(self): def validate_return_reference_doc(self):
"""validate item with reference doc""" """validate item with reference doc"""
ref = get_return_doclist_and_details(self.fields) ref = get_return_doc_and_details(self)
if ref.doclist: if ref.doc:
# validate docstatus # validate docstatus
if ref.doclist[0].docstatus != 1: if ref.doc.docstatus != 1:
frappe.msgprint(_(ref.doclist[0].doctype) + ' "' + ref.doclist[0].name + '": ' frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
+ _("Status should be Submitted"), raise_exception=frappe.InvalidStatusError) + _("Status should be Submitted"), raise_exception=frappe.InvalidStatusError)
# update stock check # update stock check
if ref.doclist[0].doctype == "Sales Invoice" and cint(ref.doclist[0].update_stock) != 1: if ref.doc.doctype == "Sales Invoice" and cint(ref.doc.update_stock) != 1:
frappe.msgprint(_(ref.doclist[0].doctype) + ' "' + ref.doclist[0].name + '": ' frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
+ _("Update Stock should be checked."), + _("Update Stock should be checked."),
raise_exception=NotUpdateStockError) raise_exception=NotUpdateStockError)
# posting date check # posting date check
ref_posting_datetime = "%s %s" % (cstr(ref.doclist[0].posting_date), ref_posting_datetime = "%s %s" % (cstr(ref.doc.posting_date),
cstr(ref.doclist[0].posting_time) or "00:00:00") cstr(ref.doc.posting_time) or "00:00:00")
this_posting_datetime = "%s %s" % (cstr(self.posting_date), this_posting_datetime = "%s %s" % (cstr(self.posting_date),
cstr(self.posting_time)) cstr(self.posting_time))
if this_posting_datetime < ref_posting_datetime: if this_posting_datetime < ref_posting_datetime:
@ -266,18 +266,18 @@ class StockEntry(StockController):
+ ": " + datetime_in_user_format(ref_posting_datetime), + ": " + datetime_in_user_format(ref_posting_datetime),
raise_exception=True) raise_exception=True)
stock_items = get_stock_items_for_return(ref.doclist, ref.parentfields) stock_items = get_stock_items_for_return(ref.doc, ref.parentfields)
already_returned_item_qty = self.get_already_returned_item_qty(ref.fieldname) already_returned_item_qty = self.get_already_returned_item_qty(ref.fieldname)
for item in self.get("mtn_details"): for item in self.get("mtn_details"):
# validate if item exists in the ref doclist and that it is a stock item # validate if item exists in the ref doc and that it is a stock item
if item.item_code not in stock_items: if item.item_code not in stock_items:
msgprint(_("Item") + ': "' + item.item_code + _("\" does not exist in ") + msgprint(_("Item") + ': "' + item.item_code + _("\" does not exist in ") +
ref.doclist[0].doctype + ": " + ref.doclist[0].name, ref.doc.doctype + ": " + ref.doc.name,
raise_exception=frappe.DoesNotExistError) raise_exception=frappe.DoesNotExistError)
# validate quantity <= ref item's qty - qty already returned # validate quantity <= ref item's qty - qty already returned
ref_item = ref.doclist.getone({"item_code": item.item_code}) ref_item = ref.getone({"item_code": item.item_code})
returnable_qty = ref_item.qty - flt(already_returned_item_qty.get(item.item_code)) returnable_qty = ref_item.qty - flt(already_returned_item_qty.get(item.item_code))
if not returnable_qty: if not returnable_qty:
frappe.throw("{item}: {item_code} {returned}".format( frappe.throw("{item}: {item_code} {returned}".format(
@ -638,13 +638,13 @@ def query_purchase_return_doc(doctype, txt, searchfield, start, page_len, filter
def query_return_item(doctype, txt, searchfield, start, page_len, filters): def query_return_item(doctype, txt, searchfield, start, page_len, filters):
txt = txt.replace("%", "") txt = txt.replace("%", "")
ref = get_return_doclist_and_details(filters) ref = get_return_doc_and_details(filters)
stock_items = get_stock_items_for_return(ref.doclist, ref.parentfields) stock_items = get_stock_items_for_return(ref.doc, ref.parentfields)
result = [] result = []
for item in ref.doclist.get({"parentfield": ["in", ref.parentfields]}): for item in ref.doc.get_all_children():
if item.item_code in stock_items: if getattr(item, "item_code", None) in stock_items:
item.item_name = cstr(item.item_name) item.item_name = cstr(item.item_name)
item.description = cstr(item.description) item.description = cstr(item.description)
if (txt in item.item_code) or (txt in item.item_name) or (txt in item.description): if (txt in item.item_code) or (txt in item.item_name) or (txt in item.description):
@ -704,28 +704,28 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
limit %(start)s, %(page_len)s limit %(start)s, %(page_len)s
""" % args) """ % args)
def get_stock_items_for_return(ref_doclist, parentfields): def get_stock_items_for_return(ref_doc, parentfields):
"""return item codes filtered from doclist, which are stock items""" """return item codes filtered from doc, which are stock items"""
if isinstance(parentfields, basestring): if isinstance(parentfields, basestring):
parentfields = [parentfields] parentfields = [parentfields]
all_items = list(set([d.item_code for d in all_items = list(set([d.item_code for d in
ref_doclist.get({"parentfield": ["in", parentfields]})])) ref_doc.get_all_children() if d.item_code]))
stock_items = frappe.db.sql_list("""select name from `tabItem` stock_items = frappe.db.sql_list("""select name from `tabItem`
where is_stock_item='Yes' and name in (%s)""" % (", ".join(["%s"] * len(all_items))), where is_stock_item='Yes' and name in (%s)""" % (", ".join(["%s"] * len(all_items))),
tuple(all_items)) tuple(all_items))
return stock_items return stock_items
def get_return_doclist_and_details(args): def get_return_doc_and_details(args):
ref = frappe._dict() ref = frappe._dict()
# get ref_doclist # get ref_doc
if args["purpose"] in return_map: if args["purpose"] in return_map:
for fieldname, val in return_map[args["purpose"]].items(): for fieldname, val in return_map[args["purpose"]].items():
if args.get(fieldname): if args.get(fieldname):
ref.fieldname = fieldname ref.fieldname = fieldname
ref.doclist = frappe.get_doclist(val[0], args[fieldname]) ref.doc = frappe.get_doc(val[0], args[fieldname])
ref.parentfields = val[1] ref.parentfields = val[1]
break break
@ -748,16 +748,16 @@ def make_return_jv(stock_entry):
if not se.purpose in ["Sales Return", "Purchase Return"]: if not se.purpose in ["Sales Return", "Purchase Return"]:
return return
ref = get_return_doclist_and_details(se.fields) ref = get_return_doc_and_details(se.fields)
if ref.doclist[0].doctype == "Delivery Note": if ref.doc.doctype == "Delivery Note":
result = make_return_jv_from_delivery_note(se, ref) result = make_return_jv_from_delivery_note(se, ref)
elif ref.doclist[0].doctype == "Sales Invoice": elif ref.doc.doctype == "Sales Invoice":
result = make_return_jv_from_sales_invoice(se, ref) result = make_return_jv_from_sales_invoice(se, ref)
elif ref.doclist[0].doctype == "Purchase Receipt": elif ref.doc.doctype == "Purchase Receipt":
result = make_return_jv_from_purchase_receipt(se, ref) result = make_return_jv_from_purchase_receipt(se, ref)
# create jv doclist and fetch balance for each unique row item # create jv doc and fetch balance for each unique row item
jv_list = [{ jv_list = [{
"__islocal": 1, "__islocal": 1,
"doctype": "Journal Voucher", "doctype": "Journal Voucher",
@ -785,28 +785,28 @@ def make_return_jv(stock_entry):
def make_return_jv_from_sales_invoice(se, ref): def make_return_jv_from_sales_invoice(se, ref):
# customer account entry # customer account entry
parent = { parent = {
"account": ref.doclist[0].debit_to, "account": ref.doc.debit_to,
"against_invoice": ref.doclist[0].name, "against_invoice": ref.doc.name,
} }
# income account entries # income account entries
children = [] children = []
for se_item in se.get("mtn_details"): for se_item in se.get("mtn_details"):
# find item in ref.doclist # find item in ref.doc
ref_item = ref.doclist.getone({"item_code": se_item.item_code}) ref_item = ref.doc.get({"item_code": se_item.item_code})[0]
account = get_sales_account_from_item(ref.doclist, ref_item) account = get_sales_account_from_item(ref.doc, ref_item)
if account not in children: if account not in children:
children.append(account) children.append(account)
return [parent] + [{"account": account} for account in children] return [parent] + [{"account": account} for account in children]
def get_sales_account_from_item(doclist, ref_item): def get_sales_account_from_item(doc, ref_item):
account = None account = None
if not ref_item.income_account: if not ref_item.income_account:
if ref_item.parent_item: if ref_item.parent_item:
parent_item = doclist.getone({"item_code": ref_item.parent_item}) parent_item = doc.get({"item_code": ref_item.parent_item})[0]
account = parent_item.income_account account = parent_item.income_account
else: else:
account = ref_item.income_account account = ref_item.income_account
@ -815,10 +815,10 @@ def get_sales_account_from_item(doclist, ref_item):
def make_return_jv_from_delivery_note(se, ref): def make_return_jv_from_delivery_note(se, ref):
invoices_against_delivery = get_invoice_list("Sales Invoice Item", "delivery_note", invoices_against_delivery = get_invoice_list("Sales Invoice Item", "delivery_note",
ref.doclist[0].name) ref.doc.name)
if not invoices_against_delivery: if not invoices_against_delivery:
sales_orders_against_delivery = [d.against_sales_order for d in ref.doclist if d.against_sales_order] sales_orders_against_delivery = [d.against_sales_order for d in ref.doc.get_all_children() if d.against_sales_order]
if sales_orders_against_delivery: if sales_orders_against_delivery:
invoices_against_delivery = get_invoice_list("Sales Invoice Item", "sales_order", invoices_against_delivery = get_invoice_list("Sales Invoice Item", "sales_order",
@ -827,8 +827,7 @@ def make_return_jv_from_delivery_note(se, ref):
if not invoices_against_delivery: if not invoices_against_delivery:
return [] return []
packing_item_parent_map = dict([[d.item_code, d.parent_item] for d in ref.doclist.get( packing_item_parent_map = dict([[d.item_code, d.parent_item] for d in ref.doc.get(ref.parentfields[1])])
{"parentfield": ref.parentfields[1]})])
parent = {} parent = {}
children = [] children = []
@ -838,16 +837,16 @@ def make_return_jv_from_delivery_note(se, ref):
si = frappe.get_doc("Sales Invoice", sales_invoice) si = frappe.get_doc("Sales Invoice", sales_invoice)
if se_item.item_code in packing_item_parent_map: if se_item.item_code in packing_item_parent_map:
ref_item = si.doclist.get({"item_code": packing_item_parent_map[se_item.item_code]}) ref_item = si.get({"item_code": packing_item_parent_map[se_item.item_code]})
else: else:
ref_item = si.doclist.get({"item_code": se_item.item_code}) ref_item = si.get({"item_code": se_item.item_code})
if not ref_item: if not ref_item:
continue continue
ref_item = ref_item[0] ref_item = ref_item[0]
account = get_sales_account_from_item(si.doclist, ref_item) account = get_sales_account_from_item(si, ref_item)
if account not in children: if account not in children:
children.append(account) children.append(account)
@ -874,11 +873,11 @@ def get_invoice_list(doctype, link_field, value):
def make_return_jv_from_purchase_receipt(se, ref): def make_return_jv_from_purchase_receipt(se, ref):
invoice_against_receipt = get_invoice_list("Purchase Invoice Item", "purchase_receipt", invoice_against_receipt = get_invoice_list("Purchase Invoice Item", "purchase_receipt",
ref.doclist[0].name) ref.doc.name)
if not invoice_against_receipt: if not invoice_against_receipt:
purchase_orders_against_receipt = [d.prevdoc_docname for d in purchase_orders_against_receipt = [d.prevdoc_docname for d in
ref.doclist.get({"prevdoc_doctype": "Purchase Order"}) if d.prevdoc_docname] ref.get({"prevdoc_doctype": "Purchase Order"}) if d.prevdoc_docname]
if purchase_orders_against_receipt: if purchase_orders_against_receipt:
invoice_against_receipt = get_invoice_list("Purchase Invoice Item", "purchase_order", invoice_against_receipt = get_invoice_list("Purchase Invoice Item", "purchase_order",
@ -893,7 +892,7 @@ def make_return_jv_from_purchase_receipt(se, ref):
for se_item in se.get("mtn_details"): for se_item in se.get("mtn_details"):
for purchase_invoice in invoice_against_receipt: for purchase_invoice in invoice_against_receipt:
pi = frappe.get_doc("Purchase Invoice", purchase_invoice) pi = frappe.get_doc("Purchase Invoice", purchase_invoice)
ref_item = pi.doclist.get({"item_code": se_item.item_code}) ref_item = pi.get({"item_code": se_item.item_code})
if not ref_item: if not ref_item:
continue continue

View File

@ -209,12 +209,10 @@ def validate_conversion_rate(args, meta):
def get_party_item_code(args, item_bean, out): def get_party_item_code(args, item_bean, out):
if args.transaction_type == "selling": if args.transaction_type == "selling":
customer_item_code = item_bean.doclist.get({"parentfield": "item_customer_details", customer_item_code = item_bean.get("item_customer_details", {"customer_name": args.customer})
"customer_name": args.customer})
out.customer_item_code = customer_item_code[0].ref_code if customer_item_code else None out.customer_item_code = customer_item_code[0].ref_code if customer_item_code else None
else: else:
item_supplier = item_bean.doclist.get({"parentfield": "item_supplier_details", item_supplier = item_bean.get({"item_supplier_details", {"supplier": args.supplier})
"supplier": args.supplier})
out.supplier_part_no = item_supplier[0].supplier_part_no if item_supplier else None out.supplier_part_no = item_supplier[0].supplier_part_no if item_supplier else None