Asset linked to purchase receipt and serial no

This commit is contained in:
Rohit Waghchaure
2018-04-26 19:18:29 +05:30
parent 17aec2d16c
commit ab84254188
23 changed files with 763 additions and 105 deletions

View File

@@ -11,6 +11,7 @@ from erpnext.stock.get_item_details import get_conversion_factor
from erpnext.buying.utils import validate_for_items, update_last_purchase_rate
from erpnext.stock.stock_ledger import get_valuation_rate
from erpnext.stock.doctype.stock_entry.stock_entry import get_used_alternative_items
from erpnext.stock.doctype.serial_no.serial_no import get_auto_serial_nos, auto_make_serial_nos
from erpnext.controllers.stock_controller import StockController
@@ -439,6 +440,11 @@ class BuyingController(StockController):
if self.get('is_return'):
return
if self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
if self.doctype == 'Purchase Receipt':
self.process_fixed_asset()
self.update_fixed_asset()
update_last_purchase_rate(self, is_submit = 1)
def on_cancel(self):
@@ -446,6 +452,118 @@ class BuyingController(StockController):
return
update_last_purchase_rate(self, is_submit = 0)
if self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
if self.doctype == 'Purchase Receipt':
self.delete_linked_asset()
self.update_fixed_asset()
def process_fixed_asset(self):
if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
return
asset_items = [d.item_code for d in self.items if d.is_fixed_asset]
if asset_items:
self.make_serial_nos_for_asset(asset_items)
def make_serial_nos_for_asset(self, asset_items):
items_data = get_asset_item_details(asset_items)
for d in self.items:
if d.is_fixed_asset:
item_data = items_data.get(d.item_code)
if item_data.get('has_serial_no'):
# If item has serial no
if item_data.get('serial_no_series') and not d.serial_no:
serial_nos = get_auto_serial_nos(item_data.get('serial_no_series'), d.qty)
elif d.serial_no:
serial_nos = d.serial_no
elif not d.serial_no:
frappe.throw(_("Serial no is mandatory for the item {0}").format(d.item_code))
auto_make_serial_nos({
'serial_no': serial_nos,
'item_code': d.item_code,
'via_stock_ledger': False,
'company': self.company,
'actual_qty': d.qty,
'purchase_document_type': self.doctype,
'purchase_document_no': self.name
})
d.db_set('serial_no', serial_nos)
if not d.asset:
asset = self.make_asset(d)
d.db_set('asset', asset)
if d.asset:
self.make_asset_movement(d)
def make_asset(self, row):
asset = frappe.get_doc({
'doctype': 'Asset',
'item_code': row.item_code,
'asset_name': '{0} - {1}'.format(self.name, row.item_code),
'warehouse': row.warehouse,
'serial_no': row.serial_no,
'company': self.company,
'purchase_date': self.posting_date,
'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None,
'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None
})
asset.flags.ignore_validate = True
asset.flags.ignore_mandatory = True
asset.insert()
frappe.msgprint(_("Asset {0} created").format(asset.name))
return asset.name
def make_asset_movement(self, row):
asset_movement = frappe.get_doc({
'doctype': 'Asset Movement',
'asset': row.asset,
'source_warehouse': '',
'target_warehouse': row.warehouse,
'purpose': 'Receipt',
'serial_no': row.serial_no,
'company': self.company,
'transaction_date': self.posting_date,
'reference_doctype': self.doctype,
'reference_name': self.name
}).insert()
return asset_movement.name
def update_fixed_asset(self):
field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt'
for d in self.get("items"):
if d.is_fixed_asset and d.asset:
asset = frappe.get_doc("Asset", d.asset)
if self.docstatus in [0, 1] and not asset.get(field):
asset.set(field, self.name)
asset.purchase_date = self.posting_date
asset.supplier = self.supplier
else:
asset.set(field, None)
asset.supplier = None
asset.flags.ignore_validate_update_after_submit = True
if asset.docstatus == 0:
asset.flags.ignore_validate = True
asset.save()
def delete_linked_asset(self):
if not self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
return
if self.doctype == 'Purchase Invoice' and self.get('update_stock'):
return
frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s and docstatus = 0", self.name)
frappe.db.sql("delete from `tabSerial No` where purchase_document_no=%s", self.name)
def validate_schedule_date(self):
if not self.schedule_date:
@@ -480,3 +598,11 @@ def get_items_from_bom(item_code, bom, exploded_item=1):
msgprint(_("Specified BOM {0} does not exist for Item {1}").format(bom, item_code), raise_exception=1)
return bom_items
def get_asset_item_details(asset_items):
asset_items_data = {}
for d in frappe.get_all('Item', fields = ["name", "has_serial_no", "serial_no_series"],
filters = {'name': ('in', asset_items)}):
asset_items_data.setdefault(d.name, d)
return asset_items_data