fix: (travis) Production Plan Summary Report breaks if no WO

- `get_cached_value` throws a DoesNotExistError if non-existent value, used `get_value` instead
- accomodate production plan items that dont have WO/PO against them as well (blank values)
- added some None value handling to avoid AttributeError
diff --git a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
index 43ef12e..55b1a3f 100644
--- a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
+++ b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
@@ -28,8 +28,15 @@
 
 	production_plan_doc = frappe.get_cached_doc("Production Plan", filters.get("production_plan"))
 	for row in production_plan_doc.po_items:
-		work_order = frappe.get_cached_value("Work Order", {"production_plan_item": row.name,
-			"bom_no": row.bom_no, "production_item": row.item_code}, "name")
+		work_order = frappe.get_value(
+			"Work Order",
+			{
+				"production_plan_item": row.name,
+				"bom_no": row.bom_no,
+				"production_item": row.item_code
+			},
+			"name"
+		)
 
 		if row.item_code not in itemwise_indent:
 			itemwise_indent.setdefault(row.item_code, {})
@@ -40,10 +47,10 @@
 			"item_name": frappe.get_cached_value("Item", row.item_code, "item_name"),
 			"qty": row.planned_qty,
 			"document_type": "Work Order",
-			"document_name": work_order,
+			"document_name": work_order or "",
 			"bom_level": frappe.get_cached_value("BOM", row.bom_no, "bom_level"),
-			"produced_qty": order_details.get((work_order, row.item_code)).get("produced_qty"),
-			"pending_qty": flt(row.planned_qty) - flt(order_details.get((work_order, row.item_code)).get("produced_qty"))
+			"produced_qty": order_details.get((work_order, row.item_code), {}).get("produced_qty", 0),
+			"pending_qty": flt(row.planned_qty) - flt(order_details.get((work_order, row.item_code), {}).get("produced_qty", 0))
 		})
 
 		get_production_plan_sub_assembly_item_details(filters, row, production_plan_doc, data, order_details)
@@ -54,11 +61,23 @@
 			subcontracted_item = (item.type_of_manufacturing == 'Subcontract')
 
 			if subcontracted_item:
-				docname = frappe.get_cached_value("Purchase Order Item",
-					{"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)}, "parent")
+				docname = frappe.get_value(
+					"Purchase Order Item",
+					{
+						"production_plan_sub_assembly_item": item.name,
+						"docstatus": ("<", 2)
+					},
+					"parent"
+				)
 			else:
-				docname = frappe.get_cached_value("Work Order",
-					{"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)}, "name")
+				docname = frappe.get_value(
+					"Work Order",
+					{
+						"production_plan_sub_assembly_item": item.name,
+						"docstatus": ("<", 2)
+					},
+					"name"
+				)
 
 			data.append({
 				"indent": 1,
@@ -66,10 +85,10 @@
 				"item_name": item.item_name,
 				"qty": item.qty,
 				"document_type": "Work Order" if not subcontracted_item else "Purchase Order",
-				"document_name": docname,
+				"document_name": docname or "",
 				"bom_level": item.bom_level,
-				"produced_qty": order_details.get((docname, item.production_item)).get("produced_qty"),
-				"pending_qty": flt(item.qty) - flt(order_details.get((docname, item.production_item)).get("produced_qty"))
+				"produced_qty": order_details.get((docname, item.production_item), {}).get("produced_qty", 0),
+				"pending_qty": flt(item.qty) - flt(order_details.get((docname, item.production_item), {}).get("produced_qty", 0))
 			})
 
 def get_work_order_details(filters, order_details):