Hello,
In my Custom App I have a DocType called Route Card
. This DocType has two child tables in it. Here one child table is filled with data from Work Order’s Operations child table and another child table is empty at the time of creation.
What I want to do is when a user clicks on Start
in Work Order
I want to create the Route Card
for current Work Order
in background.
I don’t understand as to from where to start. Can someone guide me as to how I can auto create Route Card.
TIA
Yogi Yang
Hello YogiYang,
there are two solutions for creating documents in the background.
Auto Repeat
Using python
doc = frappe.get_doc({
“doctype”:“Route Card”,
“reference_doctype”:“Work Order”,
“reference_name”:doc.name,
“item” :[
{
“item_code” :child.item_code,
“item_name”: child.item_name
}
]
}).insert(ignore_permissions=True,ignore_mandatory=True)
doc.save()
Note: this is an example code
you can run this code on any server events(like After Submit, After Insert) or on the client side using API(like on Button).
1 Like
Hello @Rehan_Ansari ,
The child in my DocType has multiple rows so how can I insert multiple rows here?
TIA
Yogi Yang
Foram
October 6, 2022, 7:28am
4
You can also do it by setting up the cron job.
You can pass multiple child and multiple rows in this way →
multiple rows in one child table
“child-table-name” :[
#first row
{
“item_code” :child.item_code,
“item_name”: child.item_name
},
#second row
{
“item_code” :child.item_code,
“item_name”: child.item_name
}
#and so on
]
multiple child table
#first child
“first-child-table-name” :[
{
“item_code” :child.item_code,
“item_name”: child.item_name
}
],
#second child
“second-child-table-name” :[
{
“item_code” :child.item_code,
“item_name”: child.item_name
}
]
I hope I answered your question correctly.?
1 Like
Hello @Rehan_Ansari ,
But I have to read the data from the DocType My Work Order
and insert them in the child of Route Card
.
Will a loop work?
Here is the code that I am trying to build.
import frappe
from dateutil.relativedelta import relativedelta
from frappe import _
from frappe.model.document import Document
from frappe.model.mapper import get_mapped_doc
from frappe.model.document import Document
class MyWorkOrder(Document):
def create_route_card(my_work_order, operations):
if isinstance(operations, str):
operations = json.loads(operations)
my_work_order = frappe.get_doc("My Work Order", my_work_order)
doc = frappe.get_doc({
"date":"now",
"my_work_order_num": my_work_order.name,
"customer_code": my_work_order.customer_code,
"item_to_mfg": my_work_order.production_item,
"qty": my_work_order.qty,
"operations":[{
"operation": operations.operation,
"workstation": operations.workstation,
"source_warehouse": operations.source_warehouse,
"target_warehouse": operations.target_warehouse,
"perform_qc": operations.perform_qc,
"time_in_mins": operations.time_in_mins,
"quality_inspection_template": operations.quality_inspection_template
}]
}).insert(ignore_permissions=True,ignore_mandatory=True)
# Save Document
doc.save()
TIA
Yogi Yang
1 Like
my_work_order = frappe.get_doc("My Work Order", my_work_order)
doc = frappe.get_doc({
**mention doctype**
"doctype":"Route Card"
"date":"now",
"my_work_order_num": my_work_order.name,
"customer_code": my_work_order.customer_code,
"item_to_mfg": my_work_order.production_item,
"qty": my_work_order.qty,
"operations":[{
"operation": operations.operation,
"workstation": operations.workstation,
"source_warehouse": operations.source_warehouse,
"target_warehouse": operations.target_warehouse,
"perform_qc": operations.perform_qc,
"time_in_mins": operations.time_in_mins,
"quality_inspection_template": operations.quality_inspection_template
}]
}).insert(ignore_permissions=True,ignore_mandatory=True)
# Save Document
doc.save()
yes this will work, just mentioned the doctype.
I am assuming that you have to read data from Work Order and you are creating multiple Route Cards (Doctype).
1 Like
Hello,
Rehan_Ansari:
"operations":[{
"operation": operations.operation,
"workstation": operations.workstation,
"source_warehouse": operations.source_warehouse,
"target_warehouse": operations.target_warehouse,
"perform_qc": operations.perform_qc,
"time_in_mins": operations.time_in_mins,
"quality_inspection_template": operations.quality_inspection_template
}]
Here I want to repeat the following code but don’t understand as to how to insert a loop in between.
"operations":[{
"operation": operations.operation,
"workstation": operations.workstation,
"source_warehouse": operations.source_warehouse,
"target_warehouse": operations.target_warehouse,
"perform_qc": operations.perform_qc,
"time_in_mins": operations.time_in_mins,
"quality_inspection_template": operations.quality_inspection_template
}]
What I am trying to do is copy the data of Processes from Work Order to Route Card.
TIA
Yogi Yang
Hi YogiYang
use following server side script for your issue(insert multiple rows ).
```
my_work_order = frappe.get_doc(“My Work Order”, my_work_order)
Rut_Card = frappe.new_doc(“Route Card”)
Rut_Card.date = “now”
Rut_Card.my_work_order_num = my_work_order.name,
etc…
for i in operations:
Rut_Card.append(“your_route_card_child_table_field_name”,{
“operation”: i.operation,
“workstation”: i.workstation,
“source_warehouse”: i.source_warehouse,
“target_warehouse”: i.target_warehouse,
“perform_qc”: i.perform_qc,
“time_in_mins”: i.time_in_mins,
“quality_inspection_template”: i.quality_inspection_template
})
Rut_Card.flags.ignore_permissions = 1
Rut_Card.save()
frappe.db.commit()
1 Like
@anil_pise ,
Your code sample helped me a lot but the child items are getting inserted blank.
I am using this code.
def create_route_card(my_work_order):
# if isinstance(operations, str):
# operations = json.loads(operations)
my_work_order = frappe.get_doc("My Work Order", my_work_order)
# Get the Processed from Work Order
my_work_order_processes = frappe.get_list("My Work Order Operations", {"parent": my_work_order.name})
my_route_card = frappe.new_doc("My Route Card")
my_route_card.date = datetime.datetime.now()
my_route_card.my_work_order_num = my_work_order.name
my_route_card.customer_code = my_work_order.customer_code
my_route_card.item_to_mfg = my_work_order.production_item
my_route_card.qty = my_work_order.qty
for spc in my_work_order_processes:
my_route_card.append("operations",{
"operation": spc.operation,
"workstation": spc.workstation,
"source_warehouse": spc.source_warehouse,
"target_warehouse": spc.target_warehouse,
"perform_qc": spc.perform_qc,
"time_in_mins": spc.time_in_mins,
"quality_inspection_template": spc.quality_inspection_template
})
my_route_card.flags.ignore_permissions = 1
my_route_card.flags.ignore_mandatory = 1
my_route_card.save()
frappe.db.commit()
Is there any mistake in this code?
TIA
Yogi Yang