Merge branch 'develop' into remove-nonprofit

This commit is contained in:
ChillarAnand
2022-02-17 15:30:11 +05:30
3 changed files with 38 additions and 14 deletions

View File

@@ -64,6 +64,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
"account_currency", "account_currency",
(r) => { (r) => {
frm.currency = r.account_currency; frm.currency = r.account_currency;
frm.trigger("render_chart");
} }
); );
} }
@@ -128,7 +129,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
} }
}, },
render_chart(frm) { render_chart: frappe.utils.debounce((frm) => {
frm.cards_manager = new erpnext.accounts.bank_reconciliation.NumberCardManager( frm.cards_manager = new erpnext.accounts.bank_reconciliation.NumberCardManager(
{ {
$reconciliation_tool_cards: frm.get_field( $reconciliation_tool_cards: frm.get_field(
@@ -140,7 +141,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
currency: frm.currency, currency: frm.currency,
} }
); );
}, }, 500),
render(frm) { render(frm) {
if (frm.doc.bank_account) { if (frm.doc.bank_account) {

View File

@@ -319,7 +319,7 @@ class ProductionPlan(Document):
if self.total_produced_qty > 0: if self.total_produced_qty > 0:
self.status = "In Process" self.status = "In Process"
if self.check_have_work_orders_completed(): if self.all_items_completed():
self.status = "Completed" self.status = "Completed"
if self.status != 'Completed': if self.status != 'Completed':
@@ -591,21 +591,32 @@ class ProductionPlan(Document):
self.append("sub_assembly_items", data) self.append("sub_assembly_items", data)
def check_have_work_orders_completed(self): def all_items_completed(self):
wo_status = frappe.db.get_list( all_items_produced = all(flt(d.planned_qty) - flt(d.produced_qty) < 0.000001
for d in self.po_items)
if not all_items_produced:
return False
wo_status = frappe.get_all(
"Work Order", "Work Order",
filters={"production_plan": self.name}, filters={
"production_plan": self.name,
"status": ("not in", ["Closed", "Stopped"]),
"docstatus": ("<", 2),
},
fields="status", fields="status",
pluck="status" pluck="status",
) )
return all(s == "Completed" for s in wo_status) all_work_orders_completed = all(s == "Completed" for s in wo_status)
return all_work_orders_completed
@frappe.whitelist() @frappe.whitelist()
def download_raw_materials(doc, warehouses=None): def download_raw_materials(doc, warehouses=None):
if isinstance(doc, str): if isinstance(doc, str):
doc = frappe._dict(json.loads(doc)) doc = frappe._dict(json.loads(doc))
item_list = [['Item Code', 'Description', 'Stock UOM', 'Warehouse', 'Required Qty as per BOM', item_list = [['Item Code', 'Item Name', 'Description',
'Stock UOM', 'Warehouse', 'Required Qty as per BOM',
'Projected Qty', 'Available Qty In Hand', 'Ordered Qty', 'Planned Qty', 'Projected Qty', 'Available Qty In Hand', 'Ordered Qty', 'Planned Qty',
'Reserved Qty for Production', 'Safety Stock', 'Required Qty']] 'Reserved Qty for Production', 'Safety Stock', 'Required Qty']]
@@ -614,7 +625,8 @@ def download_raw_materials(doc, warehouses=None):
items = get_items_for_material_requests(doc, warehouses=warehouses, get_parent_warehouse_data=True) items = get_items_for_material_requests(doc, warehouses=warehouses, get_parent_warehouse_data=True)
for d in items: for d in items:
item_list.append([d.get('item_code'), d.get('description'), d.get('stock_uom'), d.get('warehouse'), item_list.append([d.get('item_code'), d.get('item_name'),
d.get('description'), d.get('stock_uom'), d.get('warehouse'),
d.get('required_bom_qty'), d.get('projected_qty'), d.get('actual_qty'), d.get('ordered_qty'), d.get('required_bom_qty'), d.get('projected_qty'), d.get('actual_qty'), d.get('ordered_qty'),
d.get('planned_qty'), d.get('reserved_qty_for_production'), d.get('safety_stock'), d.get('quantity')]) d.get('planned_qty'), d.get('reserved_qty_for_production'), d.get('safety_stock'), d.get('quantity')])
@@ -1044,4 +1056,4 @@ def get_sub_assembly_items(bom_no, bom_data, to_produce_qty, indent=0):
def set_default_warehouses(row, default_warehouses): def set_default_warehouses(row, default_warehouses):
for field in ['wip_warehouse', 'fg_warehouse']: for field in ['wip_warehouse', 'fg_warehouse']:
if not row.get(field): if not row.get(field):
row[field] = default_warehouses.get(field) row[field] = default_warehouses.get(field)

View File

@@ -409,9 +409,6 @@ class TestProductionPlan(ERPNextTestCase):
boms = { boms = {
"Assembly": { "Assembly": {
"SubAssembly1": {"ChildPart1": {}, "ChildPart2": {},}, "SubAssembly1": {"ChildPart1": {}, "ChildPart2": {},},
"SubAssembly2": {"ChildPart3": {}},
"SubAssembly3": {"SubSubAssy1": {"ChildPart4": {}}},
"ChildPart5": {},
"ChildPart6": {}, "ChildPart6": {},
"SubAssembly4": {"SubSubAssy2": {"ChildPart7": {}}}, "SubAssembly4": {"SubSubAssy2": {"ChildPart7": {}}},
}, },
@@ -591,6 +588,20 @@ class TestProductionPlan(ERPNextTestCase):
pln.reload() pln.reload()
self.assertEqual(pln.po_items[0].pending_qty, 1) self.assertEqual(pln.po_items[0].pending_qty, 1)
def test_qty_based_status(self):
pp = frappe.new_doc("Production Plan")
pp.po_items = [
frappe._dict(planned_qty=5, produce_qty=4)
]
self.assertFalse(pp.all_items_completed())
pp.po_items = [
frappe._dict(planned_qty=5, produce_qty=10),
frappe._dict(planned_qty=5, produce_qty=4)
]
self.assertFalse(pp.all_items_completed())
def create_production_plan(**args): def create_production_plan(**args):
""" """
sales_order (obj): Sales Order Doc Object sales_order (obj): Sales Order Doc Object