def set_buying_amount(self, stock_ledger_entries = None):
		from stock.utils import get_buying_amount, get_sales_bom_buying_amount
		if not stock_ledger_entries:
			stock_ledger_entries = self.get_stock_ledger_entries()

		item_sales_bom = {}
		for d in self.doclist.get({"parentfield": "packing_details"}):
			new_d = webnotes._dict(d.fields.copy())
			new_d.total_qty = -1 * d.qty
			item_sales_bom.setdefault(d.parent_item, []).append(new_d)
		
		if stock_ledger_entries:
			for item in self.doclist.get({"parentfield": self.fname}):
				if item.item_code in self.stock_items or \
						(item_sales_bom and item_sales_bom.get(item.item_code)):
					
					buying_amount = 0
					if item.item_code in self.stock_items:
						buying_amount = get_buying_amount(self.doc.doctype, self.doc.name, 
							item.name, stock_ledger_entries.get((item.item_code, 
								item.warehouse), []))
					elif item_sales_bom and item_sales_bom.get(item.item_code):
						buying_amount = get_sales_bom_buying_amount(item.item_code, item.warehouse, 
							self.doc.doctype, self.doc.name, item.name, stock_ledger_entries, 
							item_sales_bom)
					
					# buying_amount >= 0.01 so that gl entry doesn't get created for such small amounts
					item.buying_amount = buying_amount >= 0.01 and buying_amount or 0
					webnotes.conn.set_value(item.doctype, item.name, "buying_amount", 
						item.buying_amount)
def execute(filters=None):
    if not filters: filters = {}

    stock_ledger_entries = get_stock_ledger_entries(filters)
    source = get_source_data(filters)
    item_sales_bom = get_item_sales_bom()

    columns = [
        "Delivery Note/Sales Invoice::120", "Link::30", "Posting Date:Date",
        "Posting Time", "Item Code:Link/Item", "Item Name", "Description",
        "Warehouse:Link/Warehouse", "Qty:Float", "Selling Rate:Currency",
        "Avg. Buying Rate:Currency", "Selling Amount:Currency",
        "Buying Amount:Currency", "Gross Profit:Currency",
        "Gross Profit %:Percent", "Project:Link/Project"
    ]
    data = []
    for row in source:
        selling_amount = flt(row.amount)

        item_sales_bom_map = item_sales_bom.get(row.parenttype, {}).get(
            row.name, webnotes._dict())

        if item_sales_bom_map.get(row.item_code):
            buying_amount = get_sales_bom_buying_amount(
                row.item_code, row.warehouse, row.parenttype, row.name,
                row.item_row, stock_ledger_entries, item_sales_bom_map)
        else:
            buying_amount = get_buying_amount(
                row.parenttype, row.name, row.item_row,
                stock_ledger_entries.get((row.item_code, row.warehouse), []))

        buying_amount = buying_amount > 0 and buying_amount or 0

        gross_profit = selling_amount - buying_amount
        if selling_amount:
            gross_profit_percent = (gross_profit / selling_amount) * 100.0
        else:
            gross_profit_percent = 0.0

        icon = """<a href="%s"><i class="icon icon-share" style="cursor: pointer;"></i></a>""" \
         % ("/".join(["#Form", row.parenttype, row.name]),)
        data.append([
            row.name, icon, row.posting_date, row.posting_time, row.item_code,
            row.item_name, row.description, row.warehouse, row.qty,
            row.basic_rate, row.qty and (buying_amount / row.qty) or 0,
            row.amount, buying_amount, gross_profit, gross_profit_percent,
            row.project
        ])

    return columns, data
Exemple #3
0
def execute(filters=None):
	if not filters: filters = {}
	
	stock_ledger_entries = get_stock_ledger_entries(filters)
	source = get_source_data(filters)
	item_sales_bom = get_item_sales_bom()
	
	columns = ["Delivery Note/Sales Invoice::120", "Link::30", "Posting Date:Date", "Posting Time", 
		"Item Code:Link/Item", "Item Name", "Description", "Warehouse:Link/Warehouse",
		"Qty:Float", "Selling Rate:Currency", "Avg. Buying Rate:Currency", 
		"Selling Amount:Currency", "Buying Amount:Currency",
		"Gross Profit:Currency", "Gross Profit %:Percent", "Project:Link/Project"]
	data = []
	for row in source:
		selling_amount = flt(row.amount)
		
		item_sales_bom_map = item_sales_bom.get(row.parenttype, {}).get(row.name, webnotes._dict())
		
		if item_sales_bom_map.get(row.item_code):
			buying_amount = get_sales_bom_buying_amount(row.item_code, row.warehouse, 
				row.parenttype, row.name, row.item_row, stock_ledger_entries, item_sales_bom_map)
		else:
			buying_amount = get_buying_amount(row.parenttype, row.name, row.item_row,
				stock_ledger_entries.get((row.item_code, row.warehouse), []))
		
		buying_amount = buying_amount > 0 and buying_amount or 0

		gross_profit = selling_amount - buying_amount
		if selling_amount:
			gross_profit_percent = (gross_profit / selling_amount) * 100.0
		else:
			gross_profit_percent = 0.0
		
		icon = """<a href="%s"><i class="icon icon-share" style="cursor: pointer;"></i></a>""" \
			% ("/".join(["#Form", row.parenttype, row.name]),)
		data.append([row.name, icon, row.posting_date, row.posting_time, row.item_code, row.item_name,
			row.description, row.warehouse, row.qty, row.basic_rate, 
			row.qty and (buying_amount / row.qty) or 0, row.amount, buying_amount,
			gross_profit, gross_profit_percent, row.project])
			
	return columns, data