コード例 #1
0
ファイル: buying_controller.py プロジェクト: OmarJaber/Aldaan
    def update_raw_materials_supplied_based_on_bom(self, item,
                                                   raw_material_table):
        exploded_item = 1
        if hasattr(item, 'include_exploded_items'):
            exploded_item = item.get('include_exploded_items')

        bom_items = get_items_from_bom(item.item_code, item.bom, exploded_item)

        used_alternative_items = []
        if self.doctype == 'Purchase Receipt' and item.purchase_order:
            used_alternative_items = get_used_alternative_items(
                purchase_order=item.purchase_order)

        raw_materials_cost = 0
        items = list(set([d.item_code for d in bom_items]))
        item_wh = frappe._dict(
            frappe.db.sql(
                """select i.item_code, id.default_warehouse
			from `tabItem` i, `tabItem Default` id
			where id.parent=i.name and id.company=%s and i.name in ({0})""".format(
                    ", ".join(["%s"] * len(items))), [self.company] + items))

        for bom_item in bom_items:
            if self.doctype == "Purchase Order":
                reserve_warehouse = bom_item.source_warehouse or item_wh.get(
                    bom_item.item_code)
                if frappe.db.get_value("Warehouse", reserve_warehouse,
                                       "company") != self.company:
                    reserve_warehouse = None

            conversion_factor = item.conversion_factor
            if (self.doctype == 'Purchase Receipt' and item.purchase_order
                    and bom_item.item_code in used_alternative_items):
                alternative_item_data = used_alternative_items.get(
                    bom_item.item_code)
                bom_item.item_code = alternative_item_data.item_code
                bom_item.item_name = alternative_item_data.item_name
                bom_item.stock_uom = alternative_item_data.stock_uom
                conversion_factor = alternative_item_data.conversion_factor
                bom_item.description = alternative_item_data.description

            # check if exists
            exists = 0
            for d in self.get(raw_material_table):
                if d.main_item_code == item.item_code and d.rm_item_code == bom_item.item_code \
                 and d.reference_name == item.name:
                    rm, exists = d, 1
                    break

            if not exists:
                rm = self.append(raw_material_table, {})

            required_qty = flt(
                flt(bom_item.qty_consumed_per_unit) *
                (flt(item.qty) + getattr(item, 'rejected_qty', 0)) *
                flt(conversion_factor), rm.precision("required_qty"))
            rm.reference_name = item.name
            rm.bom_detail_no = bom_item.name
            rm.main_item_code = item.item_code
            rm.rm_item_code = bom_item.item_code
            rm.stock_uom = bom_item.stock_uom
            rm.required_qty = required_qty
            if self.doctype == "Purchase Order" and not rm.reserve_warehouse:
                rm.reserve_warehouse = reserve_warehouse

            rm.conversion_factor = conversion_factor

            if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
                rm.consumed_qty = required_qty
                rm.description = bom_item.description
                if item.batch_no and not rm.batch_no:
                    rm.batch_no = item.batch_no

            # get raw materials rate
            if self.doctype == "Purchase Receipt":
                from erpnext.stock.utils import get_incoming_rate
                rm.rate = get_incoming_rate({
                    "item_code": bom_item.item_code,
                    "warehouse": self.supplier_warehouse,
                    "posting_date": self.posting_date,
                    "posting_time": self.posting_time,
                    "qty": -1 * required_qty,
                    "serial_no": rm.serial_no
                })
                if not rm.rate:
                    rm.rate = get_valuation_rate(
                        bom_item.item_code,
                        self.supplier_warehouse,
                        self.doctype,
                        self.name,
                        currency=self.company_currency,
                        company=self.company)
            else:
                rm.rate = bom_item.rate

            rm.amount = required_qty * flt(rm.rate)
            raw_materials_cost += flt(rm.amount)

        if self.doctype in ("Purchase Receipt", "Purchase Invoice"):
            item.rm_supp_cost = raw_materials_cost
コード例 #2
0
	def update_raw_materials_supplied_based_on_bom(self, item, raw_material_table):
		exploded_item = 1
		if hasattr(item, 'include_exploded_items'):
			exploded_item = item.get('include_exploded_items')

		bom_items = get_items_from_bom(item.item_code, item.bom, exploded_item)

		used_alternative_items = []
		if self.doctype == 'Purchase Receipt' and item.purchase_order:
			used_alternative_items = get_used_alternative_items(purchase_order = item.purchase_order)

		raw_materials_cost = 0
		items = list(set([d.item_code for d in bom_items]))
		item_wh = frappe._dict(frappe.db.sql("""select i.item_code, id.default_warehouse
			from `tabItem` i, `tabItem Default` id
			where id.parent=i.name and id.company=%s and i.name in ({0})"""
			.format(", ".join(["%s"] * len(items))), [self.company] + items))

		for bom_item in bom_items:
			if self.doctype == "Purchase Order":
				reserve_warehouse = bom_item.source_warehouse or item_wh.get(bom_item.item_code)
				if frappe.db.get_value("Warehouse", reserve_warehouse, "company") != self.company:
					reserve_warehouse = None

			conversion_factor = item.conversion_factor
			if (self.doctype == 'Purchase Receipt' and item.purchase_order and
				bom_item.item_code in used_alternative_items):
				alternative_item_data = used_alternative_items.get(bom_item.item_code)
				bom_item.item_code = alternative_item_data.item_code
				bom_item.item_name = alternative_item_data.item_name
				bom_item.stock_uom = alternative_item_data.stock_uom
				conversion_factor = alternative_item_data.conversion_factor
				bom_item.description = alternative_item_data.description

			# check if exists
			exists = 0
			for d in self.get(raw_material_table):
				if d.main_item_code == item.item_code and d.rm_item_code == bom_item.item_code \
					and d.reference_name == item.name:
						rm, exists = d, 1
						break

			if not exists:
				rm = self.append(raw_material_table, {})

			required_qty = flt(flt(bom_item.qty_consumed_per_unit) * (flt(item.qty) + getattr(item, 'rejected_qty', 0)) *
				flt(conversion_factor), rm.precision("required_qty"))
			rm.reference_name = item.name
			rm.bom_detail_no = bom_item.name
			rm.main_item_code = item.item_code
			rm.rm_item_code = bom_item.item_code
			rm.stock_uom = bom_item.stock_uom
			rm.required_qty = required_qty
			if self.doctype == "Purchase Order" and not rm.reserve_warehouse:
				rm.reserve_warehouse = reserve_warehouse

			rm.conversion_factor = conversion_factor

			if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
				rm.consumed_qty = required_qty
				rm.description = bom_item.description
				if item.batch_no and not rm.batch_no:
					rm.batch_no = item.batch_no

			# get raw materials rate
			if self.doctype == "Purchase Receipt":
				from erpnext.stock.utils import get_incoming_rate
				rm.rate = get_incoming_rate({
					"item_code": bom_item.item_code,
					"warehouse": self.supplier_warehouse,
					"posting_date": self.posting_date,
					"posting_time": self.posting_time,
					"qty": -1 * required_qty,
					"serial_no": rm.serial_no
				})
				if not rm.rate:
					rm.rate = get_valuation_rate(bom_item.item_code, self.supplier_warehouse,
						self.doctype, self.name, currency=self.company_currency, company = self.company)
			else:
				rm.rate = bom_item.rate

			rm.amount = required_qty * flt(rm.rate)
			raw_materials_cost += flt(rm.amount)

		if self.doctype in ("Purchase Receipt", "Purchase Invoice"):
			item.rm_supp_cost = raw_materials_cost