from __future__ import unicode_literals import unittest import frappe import random, json import frappe.utils from frappe.utils import nowdate, add_months from frappe.model import mapper from frappe.test_runner import make_test_records class TestMapper(unittest.TestCase): def test_map_docs(self): '''Test mapping of multiple source docs on a single target doc''' make_test_records("Item") items = frappe.get_all("Item", fields = ["name", "item_code"], filters = {'is_sales_item': 1, 'has_variants': 0}) customers = frappe.get_all("Customer") if items and customers: # Make source docs (quotations) and a target doc (sales order) customer = random.choice(customers).name qtn1, item_list_1 = self.make_quotation(items, customer) qtn2, item_list_2 = self.make_quotation(items, customer) so, item_list_3 = self.make_sales_order() # Map source docs to target with corresponding mapper method method = "erpnext.selling.doctype.quotation.quotation.make_sales_order" updated_so = mapper.map_docs(method, json.dumps([qtn1.name, qtn2.name]), so) # Assert that all inserted items are present in updated sales order src_items = item_list_1 + item_list_2 + item_list_3 self.assertEqual(set([d.item_code for d in src_items]), set([d.item_code for d in updated_so.items])) def get_random_items(self, items, limit): '''Get a number of random items from a list of given items''' random_items = [] for i in range(0, limit): random_items.append(random.choice(items)) return random_items def make_quotation(self, items, customer): item_list = self.get_random_items(items, 3) qtn = frappe.get_doc({ "doctype": "Quotation", "quotation_to": "Customer", "customer": customer, "order_type": "Sales", "transaction_date" : nowdate(), "valid_till" : add_months(nowdate(), 1) }) for item in item_list: qtn.append("items", {"qty": "2", "item_code": item.item_code}) qtn.submit() return qtn, item_list def make_sales_order(self): item = frappe.get_doc({ "base_amount": 1000.0, "base_rate": 100.0, "description": "CPU", "doctype": "Sales Order Item", "item_code": "_Test Item Home Desktop 100", "item_name": "CPU", "parentfield": "items", "qty": 10.0, "rate": 100.0, "warehouse": "_Test Warehouse - _TC", "stock_uom": "_Test UOM", "conversion_factor": 1.0, "uom": "_Test UOM" }) so = frappe.get_doc(frappe.get_test_records('Sales Order')[0]) so.insert(ignore_permissions=True) return so, [item]