def _prepare_sales_orders_and_items(self): self.expected_programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.expected_programme_1.save() self.expected_programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.expected_programme_2.save() self.sales_order_1 = SalesOrder(programme=self.expected_programme_1, order_number=20173918, date=datetime.date(2015, 12, 3)) self.sales_order_1.save() self.sales_order_2 = SalesOrder(programme=self.expected_programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.sales_order_2.save() self.item_1 = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.item_2 = Item(description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.sales_item_1 = SalesOrderItem(sales_order=self.sales_order_1, item=self.item_1, net_price=0, net_value=Decimal('51322.6500'), issue_date=datetime.date(2015, 12, 3), delivery_date=datetime.date(2015, 12, 3), description='Scale,electronic,mother/child,150kgx100g') self.sales_item_2 = SalesOrderItem(sales_order=self.sales_order_2, item=self.item_2, net_price=0, net_value=Decimal('2673'), issue_date=datetime.date(2015, 12, 14), delivery_date=datetime.date(2015, 12, 14), description='Laundry soap, Carton, 25 bars, 800 grams')
def assert_sales_orders_were_created(self, programme_one, programme_two): sales_order_one = SalesOrder(order_number=20146879, programme=programme_one, date=datetime.date(2014, 1, 3)) sales_order_two = SalesOrder(order_number=20147028, programme=programme_two, date=datetime.date(2014, 1, 9)) self.assert_sales_orders_are_equal(sales_order_one, SalesOrder.objects.all()[0]) self.assert_sales_orders_are_equal(sales_order_two, SalesOrder.objects.all()[1])
def _create_sales_order_from_dict(sales_order_data): sales_order = SalesOrder() sales_order.order_number = sales_order_data['order_number'] sales_order.date = datetime.strptime(sales_order_data['items'][0]['issue_date'], "%m/%d/%Y") sales_order.save() for sales_order_item_data in sales_order_data['items']: sales_order_item = SalesOrderItem() sales_order_item.sales_order = sales_order sales_order_item.item = Item.objects.get(material_code=sales_order_item_data['material_code']) sales_order_item.quantity = float(sales_order_item_data['quantity'].replace(',', '')) sales_order_item.issue_date = datetime.strptime(sales_order_item_data['issue_date'], "%m/%d/%Y") sales_order_item.delivery_date = datetime.strptime(sales_order_item_data['delivery_date'], "%m/%d/%Y") sales_order_item.net_price = float(sales_order_item_data['net_price'].replace(',', '')) sales_order_item.net_value = float(sales_order_item_data['net_value'].replace(',', '')) sales_order_item.save()
def _prepare_sales_and_purchase_order(self): Consignee.objects.create(customer_id='L626010000') Consignee.objects.create(customer_id='L626010384') self.programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.programme_1.save() self.programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.programme_2.save() self.sales_order_1 = SalesOrder(programme=self.programme_1, order_number=20173918, date=datetime.date(2015, 12, 3)) self.sales_order_1.save() self.sales_order_2 = SalesOrder(programme=self.programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.sales_order_2.save() self.purchase_order_1 = PurchaseOrder(order_number=45143984, sales_order=self.sales_order_1, date=datetime.date(2015, 11, 30), po_type='NB') self.purchase_order_1.save() self.purchase_order_2 = PurchaseOrder(order_number=45144863, sales_order=self.sales_order_2, date=datetime.date(2015, 12, 14), po_type='ZLC') self.purchase_order_2.save() self.item_1 = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.item_1.save() self.item_2 = Item(description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.item_2.save() self.purchase_order_item_1 = PurchaseOrderItem(purchase_order=self.purchase_order_1, item=self.item_1, item_number=10, sales_order_item=None, quantity=100.00, value=Decimal('51322.65')) self.purchase_order_item_1.save() self.purchase_order_item_2 = PurchaseOrderItem(purchase_order=self.purchase_order_2, item=self.item_2, item_number=20, sales_order_item=None, quantity=80.00, value=Decimal('2673')) self.purchase_order_item_2.save()
def _create_new_order(self, order): new_order = SalesOrder() new_order.order_number = order['order_number'] new_order.date = datetime.strptime(order['items'][0]['issue_date'], "%m/%d/%Y") new_order.programme = Programme.objects.get(name=order['programme_name']) new_order.save() return new_order
def setUp(self): self.downloaded_sales_orders = downloaded_sales_orders self.converted_sales_orders = converted_sales_orders Programme.objects.create(wbs_element_ex='0060/A0/07/883') self.expected_programme = Programme(wbs_element_ex='0060/A0/07/883') self.expected_sales_order = SalesOrder(programme=self.expected_programme, order_number=20173918, date=datetime.date(2015, 12, 6)) self.expected_item = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.expected_sales_order_item = SalesOrderItem(sales_order=self.expected_sales_order, item=self.expected_item, net_price=0, net_value=Decimal('51322.6500'), issue_date=datetime.date(2015, 12, 6), delivery_date=datetime.date(2015, 12, 6), description='Scale,electronic,mother/child,150kgx100g') start_date = '01122015' end_date = datetime.date.today().strftime('%d%m%Y') self.synchronizer = SalesOrderSynchronizer(start_date=start_date) base_url = 'https://devapis.unicef.org/BIService/BIWebService.svc/GetSalesOrderInfo_JSON/' self.expected_url = base_url + start_date + '/' + end_date
def _create_sales_order_from_dict(sales_order_data): sales_order = SalesOrder() sales_order.order_number = sales_order_data['order_number'] sales_order.date = datetime.strptime( sales_order_data['items'][0]['issue_date'], "%m/%d/%Y") sales_order.save() for sales_order_item_data in sales_order_data['items']: sales_order_item = SalesOrderItem() sales_order_item.sales_order = sales_order sales_order_item.item = Item.objects.get( material_code=sales_order_item_data['material_code']) sales_order_item.quantity = float( sales_order_item_data['quantity'].replace(',', '')) sales_order_item.issue_date = datetime.strptime( sales_order_item_data['issue_date'], "%m/%d/%Y") sales_order_item.delivery_date = datetime.strptime( sales_order_item_data['delivery_date'], "%m/%d/%Y") sales_order_item.net_price = float( sales_order_item_data['net_price'].replace(',', '')) sales_order_item.net_value = float( sales_order_item_data['net_value'].replace(',', '')) sales_order_item.save()
class TestSyncPurchaseOrder(TestCase): def setUp(self): self.downloaded_purchase_orders = downloaded_purchase_orders self.converted_purchase_orders = converted_purchase_orders self.purchase_order_which_do_not_have_reference_to_sales_order = \ purchase_order_which_do_not_have_reference_to_sales_order self.purchase_order_item_which_do_not_have_reference_to_sales_order_item = \ purchase_order_item_which_do_not_have_reference_to_sales_order_item self.purchase_order_item_with_invalid_po_type = \ purchase_order_item_with_invalid_po_type self._prepare_sales_orders_and_items() self.expected_purchase_order = PurchaseOrder(order_number=45143984, sales_order=self.sales_order_1, date=datetime.date(2015, 11, 30), po_type='NB') self.expected_purchase_order_item = PurchaseOrderItem(purchase_order=self.expected_purchase_order, item=self.item_1, item_number=10, sales_order_item=self.sales_item_1, quantity=100.00, value=Decimal('51322.65')) start_date = '01122015' end_date = datetime.date.today().strftime('%d%m%Y') self.synchronizer = PurchaseOrderSynchronizer(start_date=start_date) base_url = 'https://devapis.unicef.org/BIService/BIWebService.svc/GetPurchaseOrderInfo_JSON/' self.expected_url = base_url + start_date + '/' + end_date def tearDown(self): SalesOrder.objects.all().delete() SalesOrderItem.objects.all().delete() Item.objects.all().delete() OrderItem.objects.all().delete() Programme.objects.all().delete() PurchaseOrder.objects.all().delete() PurchaseOrderItem.objects.all().delete() DistributionPlan.objects.all().delete() DistributionPlanNode.objects.all().delete() def test_should_point_to_correct_endpoint(self): self.synchronizer._load_records = MagicMock(return_value=[]) self.synchronizer.sync() self.assertEqual(self.synchronizer.url, self.expected_url) def test_should_load_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._load_records.assert_called() self.synchronizer._save_records.assert_called() def test_should_convert_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._save_records.assert_called_with(self.converted_purchase_orders) def test_should_save_purchase_orders(self): self._sync_purchase_order() purchase_order = PurchaseOrder.objects.all().first() self._assert_purchase_order_equal(purchase_order, self.expected_purchase_order) def test_should_save_purchase_order_items(self): self._sync_purchase_order() expected_order_number_one = self.expected_purchase_order.order_number actual_purchase_item = PurchaseOrderItem.objects.get(purchase_order__order_number=expected_order_number_one) self._assert_purchase_order_item_equal(actual_purchase_item, self.expected_purchase_order_item) def test_should_NOT_import_purchase_order_which_can_not_refer_to_existing_sales_order(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = \ MagicMock(return_value=self.purchase_order_which_do_not_have_reference_to_sales_order) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_import_purchase_order_item_which_can_not_refer_to_existing_sales_order_item(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = \ MagicMock(return_value=self.purchase_order_item_which_do_not_have_reference_to_sales_order_item) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.all()[0] purchase_order_item = PurchaseOrderItem.objects.all()[0] self._assert_purchase_order_equal(purchase_order, self.expected_purchase_order) self.assertEqual(purchase_order_item.sales_order_item, None) def test_should_NOT_import_purchase_order_with_invalid_po_type(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = MagicMock(return_value=self.purchase_order_item_with_invalid_po_type) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_NOT_update_when_got_an_older_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [{"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": "100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1440859600000)/", "UPDATE_DATE": u"/Date(1440859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g"}] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2015, 11, 30, 13, 0).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 100) def test_should_update_when_got_a_newer_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [{"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": u"100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1458859600000)/", "UPDATE_DATE": u"/Date(1458859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g"}] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2016, 3, 25, 6, 46, 40).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 99) def _prepare_sales_orders_and_items(self): self.expected_programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.expected_programme_1.save() self.expected_programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.expected_programme_2.save() self.sales_order_1 = SalesOrder(programme=self.expected_programme_1, order_number=20173918, date=datetime.date(2015, 12, 3)) self.sales_order_1.save() self.sales_order_2 = SalesOrder(programme=self.expected_programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.sales_order_2.save() self.item_1 = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.item_2 = Item(description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.sales_item_1 = SalesOrderItem(sales_order=self.sales_order_1, item=self.item_1, net_price=0, net_value=Decimal('51322.6500'), issue_date=datetime.date(2015, 12, 3), delivery_date=datetime.date(2015, 12, 3), description='Scale,electronic,mother/child,150kgx100g') self.sales_item_2 = SalesOrderItem(sales_order=self.sales_order_2, item=self.item_2, net_price=0, net_value=Decimal('2673'), issue_date=datetime.date(2015, 12, 14), delivery_date=datetime.date(2015, 12, 14), description='Laundry soap, Carton, 25 bars, 800 grams') def _sync_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() def _assert_purchase_order_equal(self, actual_purchase_order, expected_purchase_order): self.assertEqual(actual_purchase_order.order_number, expected_purchase_order.order_number) self.assertEqual(actual_purchase_order.date, expected_purchase_order.date) self.assertEqual(actual_purchase_order.po_type, expected_purchase_order.po_type) def _assert_purchase_order_item_equal(self, actual_purchase_order_item, expected_purchase_order_item): self._assert_purchase_order_equal(actual_purchase_order_item.purchase_order, expected_purchase_order_item.purchase_order) self.assertEqual(actual_purchase_order_item.item_number, expected_purchase_order_item.item_number) self.assertEqual(actual_purchase_order_item.quantity, expected_purchase_order_item.quantity) self.assertEqual(actual_purchase_order_item.value, expected_purchase_order_item.value)
class TestSyncPurchaseOrder(TestCase): def setUp(self): self.downloaded_purchase_orders = [{"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": u"100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1448859600000)/", "UPDATE_DATE": u"/Date(1448859600000)/", "PO_ITEM_QTY": 100, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g"}, {"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": u"100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1450069200000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 10, "PREQ_QTY": 2673, "SO_NUMBER": u"0020174363", "PO_NUMBER": u"0045144863", "PO_ITEM": 20, "PO_TYPE": "ZLC", "PO_DATE": u"/Date(1450069200000)/", "CREATE_DATE": u"/Date(1450069200000)/", "UPDATE_DATE": u"/Date(1450069200000)/", "PO_ITEM_QTY": 80, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 2673, "AMOUNT_USD": 2673, "MATERIAL_CODE": "SL009100", "MATERIAL_DESC": "Laundry soap, Carton, 25 bars, 800 grams"}] self.converted_purchase_orders = [ {'AMOUNT_CURR': 51322.65, 'PURCHASING_GROUP_CODE': 100, 'PURCHASING_ORG_CODE': '1000', 'PREQ_NO': '0030344125', 'PLANT_CODE': '1000', 'MATERIAL_DESC': 'Scale,electronic,mother/child,150kgx100g', 'EXPIRY_DATE': datetime.datetime(2016, 12, 31, 8, 0), 'PO_ITEM_QTY': 100, 'PREQ_ITEM': 80, 'PURCHASING_GROUP_NAME': 'IMMUNIZATION', 'PO_ITEM': 10, 'PO_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'CREATE_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'UPDATE_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'VENDOR_CTRY_NAME': 'Indonesia', 'DONOR_NAME': 'Ministry of National Health', 'PREQ_QTY': 51322.65, 'CURRENCY_CODE': 'USD', 'SO_NUMBER': 20173918, 'VENDOR_CODE': '1900000501', 'AMOUNT_USD': 51322.65, 'GRANT_REF': 'XP154478', 'PO_NUMBER': 45143984, 'MATERIAL_CODE': 'S0141021', 'PO_TYPE': 'NB', 'VENDOR_NAME': 'P.T. BIO FARMA (PERSERO)'}, {'AMOUNT_CURR': 2673, 'PURCHASING_GROUP_CODE': 100, 'PURCHASING_ORG_CODE': '1000', 'PREQ_NO': '0030344125', 'PLANT_CODE': '1000', 'MATERIAL_DESC': 'Laundry soap, Carton, 25 bars, 800 grams', 'EXPIRY_DATE': datetime.datetime(2015, 12, 14, 8, 0), 'PO_ITEM_QTY': 80, 'PREQ_ITEM': 10, 'PURCHASING_GROUP_NAME': 'IMMUNIZATION', 'PO_ITEM': 20, 'PO_DATE': datetime.datetime(2015, 12, 14, 8, 0), 'CREATE_DATE': datetime.datetime(2015, 12, 14, 8, 0), 'UPDATE_DATE': datetime.datetime(2015, 12, 14, 8, 0), 'VENDOR_CTRY_NAME': 'Indonesia', 'DONOR_NAME': 'Ministry of National Health', 'PREQ_QTY': 2673, 'CURRENCY_CODE': 'USD', 'SO_NUMBER': 20174363, 'VENDOR_CODE': '1900000501', 'AMOUNT_USD': 2673, 'GRANT_REF': 'XP154478', 'PO_NUMBER': 45144863, 'MATERIAL_CODE': 'SL009100', 'PO_TYPE': 'ZLC', 'VENDOR_NAME': 'P.T. BIO FARMA (PERSERO)'}] self.purchase_order_which_do_not_have_reference_to_sales_order = \ [{'UPDATE_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'PURCHASING_GROUP_CODE': 100, # This so number don't exists in Eums when import this po 'SO_NUMBER': 20170001, 'PO_NUMBER': 45143984, 'PO_TYPE': 'NB', 'PO_ITEM': 10, 'MATERIAL_DESC': 'Scale,electronic,mother/child,150kgx100g', 'AMOUNT_USD': 51322.65, 'MATERIAL_CODE': 'S0141021', 'PREQ_ITEM': 80, 'PO_ITEM_QTY': 100}] self.purchase_order_item_which_do_not_have_reference_to_sales_order_item = \ [{'UPDATE_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'PURCHASING_GROUP_CODE': 100, 'SO_NUMBER': 20173918, 'PO_NUMBER': 45143984, 'PO_TYPE': 'NB', 'PO_ITEM': 10, 'MATERIAL_DESC': 'Scale,electronic,mother/child,150kgx100g', 'AMOUNT_USD': 51322.65, 'MATERIAL_CODE': 'S0141021', # so item number in Eums is 80, but this one is 70, so this item can't refer to so item 'PREQ_ITEM': 70, 'PO_ITEM_QTY': 100}] self.purchase_order_item_with_invalid_po_type = \ [{'UPDATE_DATE': datetime.datetime(2015, 11, 30, 8, 0), 'PURCHASING_GROUP_CODE': 100, 'SO_NUMBER': 20173918, 'PO_NUMBER': 45143984, # For now only NB, ZLC, ZUB, ZOC are supported by Eums 'PO_TYPE': 'ZAM', 'PO_ITEM': 10, 'MATERIAL_DESC': 'Scale,electronic,mother/child,150kgx100g', 'AMOUNT_USD': 51322.65, 'MATERIAL_CODE': 'S0141021', 'PREQ_ITEM': 80, 'PO_ITEM_QTY': 100}] self._prepare_sales_orders_and_items() self.expected_purchase_order_1 = PurchaseOrder(order_number=45143984, sales_order=self.sales_order_1, date=datetime.date(2015, 11, 30), po_type='NB') self.expected_purchase_order_2 = PurchaseOrder(order_number=45144863, sales_order=self.sales_order_2, date=datetime.date(2015, 12, 14), po_type='ZLC') self.expected_purchase_order_item_1 = PurchaseOrderItem(purchase_order=self.expected_purchase_order_1, item=self.item_1, item_number=10, sales_order_item=self.sales_item_1, quantity=100.00, value=Decimal('51322.65')) self.expected_purchase_order_item_2 = PurchaseOrderItem(purchase_order=self.expected_purchase_order_2, item=self.item_2, item_number=20, sales_order_item=self.sales_item_2, quantity=80.00, value=Decimal('2673')) start_date = '01122015' end_date = datetime.date.today().strftime('%d%m%Y') self.synchronizer = PurchaseOrderSynchronizer(start_date=start_date) base_url = 'https://devapis.unicef.org/BIService/BIWebService.svc/GetPurchaseOrderInfo_JSON/' self.expected_url = base_url + start_date + '/' + end_date def tearDown(self): SalesOrder.objects.all().delete() SalesOrderItem.objects.all().delete() Item.objects.all().delete() OrderItem.objects.all().delete() Programme.objects.all().delete() PurchaseOrder.objects.all().delete() PurchaseOrderItem.objects.all().delete() DistributionPlan.objects.all().delete() DistributionPlanNode.objects.all().delete() def test_should_point_to_correct_endpoint(self): self.synchronizer._load_records = MagicMock(return_value=[]) self.synchronizer.sync() self.assertEqual(self.synchronizer.url, self.expected_url) def test_should_load_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._load_records.assert_called() self.synchronizer._save_records.assert_called() def test_should_convert_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._save_records.assert_called_with(self.converted_purchase_orders) def test_should_save_purchase_orders(self): self._sync_purchase_order() all_purchase_orders = PurchaseOrder.objects.all() actual_purchase_order_1 = all_purchase_orders[0] actual_purchase_order_2 = all_purchase_orders[1] self._assert_purchase_order_equal(actual_purchase_order_1, self.expected_purchase_order_1) self._assert_purchase_order_equal(actual_purchase_order_2, self.expected_purchase_order_2) def test_should_save_purchase_order_items(self): self._sync_purchase_order() expected_order_number_one = self.expected_purchase_order_1.order_number expected_order_number_two = self.expected_purchase_order_2.order_number actual_purchase_item_1 = PurchaseOrderItem.objects.get(purchase_order__order_number=expected_order_number_one) actual_purchase_item_2 = PurchaseOrderItem.objects.get(purchase_order__order_number=expected_order_number_two) self._assert_purchase_order_item_equal(actual_purchase_item_1, self.expected_purchase_order_item_1) self._assert_purchase_order_item_equal(actual_purchase_item_2, self.expected_purchase_order_item_2) def test_should_NOT_import_purchase_order_which_can_not_refer_to_existing_sales_order(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = \ MagicMock(return_value=self.purchase_order_which_do_not_have_reference_to_sales_order) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_import_purchase_order_item_which_can_not_refer_to_existing_sales_order_item(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = \ MagicMock(return_value=self.purchase_order_item_which_do_not_have_reference_to_sales_order_item) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.all()[0] purchase_order_item = PurchaseOrderItem.objects.all()[0] self._assert_purchase_order_equal(purchase_order, self.expected_purchase_order_1) self.assertEqual(purchase_order_item.sales_order_item, None) def test_should_NOT_import_purchase_order_with_invalid_po_type(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = MagicMock(return_value=self.purchase_order_item_with_invalid_po_type) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_NOT_update_when_got_an_older_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [{"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": "100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1440859600000)/", "UPDATE_DATE": u"/Date(1440859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g"}] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2015, 11, 30, 13, 0).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 100) def test_should_update_when_got_a_newer_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [{"PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": u"100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1458859600000)/", "UPDATE_DATE": u"/Date(1458859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g"}] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2016, 3, 25, 6, 46, 40).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 99) def _prepare_sales_orders_and_items(self): self.expected_programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.expected_programme_1.save() self.expected_programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.expected_programme_2.save() self.sales_order_1 = SalesOrder(programme=self.expected_programme_1, order_number=20173918, date=datetime.date(2015, 12, 3)) self.sales_order_1.save() self.sales_order_2 = SalesOrder(programme=self.expected_programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.sales_order_2.save() self.item_1 = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.item_2 = Item(description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.sales_item_1 = SalesOrderItem(sales_order=self.sales_order_1, item=self.item_1, net_price=0, net_value=Decimal('51322.6500'), issue_date=datetime.date(2015, 12, 3), delivery_date=datetime.date(2015, 12, 3), description='Scale,electronic,mother/child,150kgx100g') self.sales_item_2 = SalesOrderItem(sales_order=self.sales_order_2, item=self.item_2, net_price=0, net_value=Decimal('2673'), issue_date=datetime.date(2015, 12, 14), delivery_date=datetime.date(2015, 12, 14), description='Laundry soap, Carton, 25 bars, 800 grams') def _sync_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() def _assert_purchase_order_equal(self, actual_purchase_order, expected_purchase_order): self.assertEqual(actual_purchase_order.order_number, expected_purchase_order.order_number) self.assertEqual(actual_purchase_order.date, expected_purchase_order.date) self.assertEqual(actual_purchase_order.po_type, expected_purchase_order.po_type) def _assert_purchase_order_item_equal(self, actual_purchase_order_item, expected_purchase_order_item): self._assert_purchase_order_equal(actual_purchase_order_item.purchase_order, expected_purchase_order_item.purchase_order) self.assertEqual(actual_purchase_order_item.item_number, expected_purchase_order_item.item_number) self.assertEqual(actual_purchase_order_item.quantity, expected_purchase_order_item.quantity) self.assertEqual(actual_purchase_order_item.value, expected_purchase_order_item.value)
class TestSyncPurchaseOrder(TestCase): def setUp(self): self.downloaded_purchase_orders = downloaded_purchase_orders self.converted_purchase_orders = converted_purchase_orders self.purchase_order_which_do_not_have_reference_to_sales_order = ( purchase_order_which_do_not_have_reference_to_sales_order ) self.purchase_order_item_which_do_not_have_reference_to_sales_order_item = ( purchase_order_item_which_do_not_have_reference_to_sales_order_item ) self.purchase_order_item_with_invalid_po_type = purchase_order_item_with_invalid_po_type self._prepare_sales_orders_and_items() self.expected_purchase_order = PurchaseOrder( order_number=45143984, sales_order=self.sales_order_1, date=datetime.date(2015, 11, 30), po_type="NB" ) self.expected_purchase_order_item = PurchaseOrderItem( purchase_order=self.expected_purchase_order, item=self.item_1, item_number=10, sales_order_item=self.sales_item_1, quantity=100.00, value=Decimal("51322.65"), ) start_date = "01122015" end_date = datetime.date.today().strftime("%d%m%Y") self.synchronizer = PurchaseOrderSynchronizer(start_date=start_date) base_url = "https://devapis.unicef.org/BIService/BIWebService.svc/GetPurchaseOrderInfo_JSON/" self.expected_url = base_url + start_date + "/" + end_date def tearDown(self): SalesOrder.objects.all().delete() SalesOrderItem.objects.all().delete() Item.objects.all().delete() OrderItem.objects.all().delete() Programme.objects.all().delete() PurchaseOrder.objects.all().delete() PurchaseOrderItem.objects.all().delete() DistributionPlan.objects.all().delete() DistributionPlanNode.objects.all().delete() def test_should_point_to_correct_endpoint(self): self.synchronizer._load_records = MagicMock(return_value=[]) self.synchronizer.sync() self.assertEqual(self.synchronizer.url, self.expected_url) def test_should_load_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._load_records.assert_called() self.synchronizer._save_records.assert_called() def test_should_convert_purchase_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._save_records.assert_called_with(self.converted_purchase_orders) def test_should_save_purchase_orders(self): self._sync_purchase_order() purchase_order = PurchaseOrder.objects.all().first() self._assert_purchase_order_equal(purchase_order, self.expected_purchase_order) def test_should_save_purchase_order_items(self): self._sync_purchase_order() expected_order_number_one = self.expected_purchase_order.order_number actual_purchase_item = PurchaseOrderItem.objects.get(purchase_order__order_number=expected_order_number_one) self._assert_purchase_order_item_equal(actual_purchase_item, self.expected_purchase_order_item) def test_should_NOT_import_purchase_order_which_can_not_refer_to_existing_sales_order(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = MagicMock( return_value=self.purchase_order_which_do_not_have_reference_to_sales_order ) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_import_purchase_order_item_which_can_not_refer_to_existing_sales_order_item(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = MagicMock( return_value=self.purchase_order_item_which_do_not_have_reference_to_sales_order_item ) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.all()[0] purchase_order_item = PurchaseOrderItem.objects.all()[0] self._assert_purchase_order_equal(purchase_order, self.expected_purchase_order) self.assertEqual(purchase_order_item.sales_order_item, None) def test_should_NOT_import_purchase_order_with_invalid_po_type(self): self.synchronizer._load_records = MagicMock() self.synchronizer._convert_records = MagicMock(return_value=self.purchase_order_item_with_invalid_po_type) self.synchronizer.sync() self.assertEqual(PurchaseOrder.objects.count(), 0) self.assertEqual(PurchaseOrderItem.objects.count(), 0) def test_should_NOT_update_when_got_an_older_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [ { "PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": "100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1440859600000)/", "UPDATE_DATE": u"/Date(1440859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g", } ] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2015, 11, 30, 13, 0).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 100) def test_should_update_when_got_a_newer_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() older_purchase_order = [ { "PURCHASING_ORG_CODE": "1000", "PURCHASING_GROUP_CODE": u"100", "PURCHASING_GROUP_NAME": "IMMUNIZATION", "PLANT_CODE": "1000", "VENDOR_CODE": "1900000501", "VENDOR_NAME": "P.T. BIO FARMA (PERSERO)", "VENDOR_CTRY_NAME": "Indonesia", "GRANT_REF": "XP154478", "EXPIRY_DATE": u"/Date(1483160400000)/", "DONOR_NAME": "Ministry of National Health", "PREQ_NO": "0030344125", "PREQ_ITEM": 80, "PREQ_QTY": 51322.65, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "PO_TYPE": "NB", "PO_DATE": u"/Date(1448859600000)/", "CREATE_DATE": u"/Date(1458859600000)/", "UPDATE_DATE": u"/Date(1458859600000)/", "PO_ITEM_QTY": 99, "CURRENCY_CODE": "USD", "AMOUNT_CURR": 51322.65, "AMOUNT_USD": 51322.65, "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g", } ] self.synchronizer._load_records = MagicMock(return_value=older_purchase_order) self.synchronizer.sync() purchase_order = PurchaseOrder.objects.get(order_number=45143984) self.assertEqual(purchase_order.date, datetime.datetime(2016, 3, 25, 6, 46, 40).date()) purchase_order_item = PurchaseOrderItem.objects.get(purchase_order=purchase_order, item_number=10) self.assertEqual(purchase_order_item.quantity, 99) def _prepare_sales_orders_and_items(self): self.expected_programme_1 = Programme(wbs_element_ex="0060/A0/07/883") self.expected_programme_1.save() self.expected_programme_2 = Programme(wbs_element_ex="4380/A0/04/105") self.expected_programme_2.save() self.sales_order_1 = SalesOrder( programme=self.expected_programme_1, order_number=20173918, date=datetime.date(2015, 12, 3) ) self.sales_order_1.save() self.sales_order_2 = SalesOrder( programme=self.expected_programme_2, order_number=20174363, date=datetime.date(2015, 12, 14) ) self.sales_order_2.save() self.item_1 = Item(description="Scale,electronic,mother/child,150kgx100g", material_code="S0141021") self.item_2 = Item(description="Laundry soap, Carton, 25 bars, 800 grams", material_code="SL009100") self.sales_item_1 = SalesOrderItem( sales_order=self.sales_order_1, item=self.item_1, net_price=0, net_value=Decimal("51322.6500"), issue_date=datetime.date(2015, 12, 3), delivery_date=datetime.date(2015, 12, 3), description="Scale,electronic,mother/child,150kgx100g", ) self.sales_item_2 = SalesOrderItem( sales_order=self.sales_order_2, item=self.item_2, net_price=0, net_value=Decimal("2673"), issue_date=datetime.date(2015, 12, 14), delivery_date=datetime.date(2015, 12, 14), description="Laundry soap, Carton, 25 bars, 800 grams", ) def _sync_purchase_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_purchase_orders) self.synchronizer.sync() def _assert_purchase_order_equal(self, actual_purchase_order, expected_purchase_order): self.assertEqual(actual_purchase_order.order_number, expected_purchase_order.order_number) self.assertEqual(actual_purchase_order.date, expected_purchase_order.date) self.assertEqual(actual_purchase_order.po_type, expected_purchase_order.po_type) def _assert_purchase_order_item_equal(self, actual_purchase_order_item, expected_purchase_order_item): self._assert_purchase_order_equal( actual_purchase_order_item.purchase_order, expected_purchase_order_item.purchase_order ) self.assertEqual(actual_purchase_order_item.item_number, expected_purchase_order_item.item_number) self.assertEqual(actual_purchase_order_item.quantity, expected_purchase_order_item.quantity) self.assertEqual(actual_purchase_order_item.value, expected_purchase_order_item.value)
class TestSyncReleaseOrder(TestCase): def setUp(self): self.downloaded_release_orders = [{"RELEASE_ORDER_NUMBER": u"0054155912", "RELEASE_ORDER_ITEM": 10, "RELEASE_ORDER_TYPE": "ZLO", "SALES_UNIT": "EA", "PLANT": "5631", "SHIP_TO_PARTY": "L626010384", "WAREHOUSE_NUMBER": "492", "CONSIGNEE": "L626010384", "DOCUMENT_DATE": u"/Date(1447390800000)/", "GOODS_ISSUE_DATE": u"/Date(1448254800000)/", "MATERIAL_NUMBER": "S0141021", "DELIVERY_QUANTITY": 55, "VALUE": 15030.86, "MOVING_AVG_PRICE": 273.29, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "WBS_ELEMENT": "6260\/A0\/05\/401\/005\/001", "WAYBILL_NUMBER": u"0072124798", "FORWARDER_NO": None, "SHIPMENT_END_DATE": u"/Date(1448254800000)/", "ACTUAL_SHIPMENT_START_DATE": None, "SHIPMENT_COMPLETION_DATE": None, "RELEASE_ORDER_CREATE_DATE": u"/Date(1447390800000)/", "RELEASE_ORDER_UPDATE_DATE": u"/Date(1447390800000)/"}] self.converted_release_orders = [{"RELEASE_ORDER_NUMBER": 54155912, "RELEASE_ORDER_ITEM": 10, "RELEASE_ORDER_TYPE": "ZLO", "SALES_UNIT": "EA", "PLANT": "5631", "SHIP_TO_PARTY": "L626010384", "WAREHOUSE_NUMBER": "492", "CONSIGNEE": "L626010384", "DOCUMENT_DATE": datetime.datetime(2015, 11, 13, 8, 0), "GOODS_ISSUE_DATE": datetime.datetime(2015, 11, 23, 8, 0), "MATERIAL_NUMBER": "S0141021", "DELIVERY_QUANTITY": 55, "VALUE": 15030.86, "MOVING_AVG_PRICE": 273.29, "SO_NUMBER": 20173918, "PO_NUMBER": 45143984, "PO_ITEM": 10, "WBS_ELEMENT": "6260\/A0\/05\/401\/005\/001", "WAYBILL_NUMBER": 72124798, "FORWARDER_NO": None, "SHIPMENT_END_DATE": datetime.datetime(2015, 11, 23, 8, 0), "ACTUAL_SHIPMENT_START_DATE": None, "SHIPMENT_COMPLETION_DATE": None, "RELEASE_ORDER_CREATE_DATE": datetime.datetime(2015, 11, 13, 8, 0), "RELEASE_ORDER_UPDATE_DATE": datetime.datetime(2015, 11, 13, 8, 0)}] self._prepare_sales_and_purchase_order() consignee_1 = Consignee(customer_id='L626010384') self.expected_release_order_1 = ReleaseOrder(order_number=54155912, waybill=72124798, delivery_date=datetime.date(2015, 11, 23), consignee=consignee_1, sales_order=self.sales_order_1, purchase_order=self.purchase_order_1) item = Item(material_code='S0141021') self.expected_release_order_item_1 = ReleaseOrderItem(release_order=self.expected_release_order_1, purchase_order_item=self.purchase_order_item_1, item=item, item_number=10, quantity=55, value=Decimal('15030.86')) self.release_order_which_can_not_refer_to_sales_order \ = [{'PO_ITEM': 10, 'MATERIAL_NUMBER': 'S0141021', 'RELEASE_ORDER_ITEM': 10, 'VALUE': 15030.86, 'DELIVERY_QUANTITY': 55, 'PO_NUMBER': 45143984, 'SHIPMENT_END_DATE': '/Date(1448254800000)/', 'WAYBILL_NUMBER': 72124798, 'CONSIGNEE': 'L626010384', 'SO_NUMBER': 20170001, 'RELEASE_ORDER_NUMBER': 54155912, 'RELEASE_ORDER_UPDATE_DATE': datetime.datetime(2015, 11, 13, 8, 0)}] self.release_order_which_can_not_refer_to_purchase_order \ = [{'PO_ITEM': 10, 'MATERIAL_NUMBER': 'S0141021', 'RELEASE_ORDER_ITEM': 10, 'VALUE': 15030.86, 'DELIVERY_QUANTITY': 55, 'PO_NUMBER': 45140001, 'SHIPMENT_END_DATE': '/Date(1448254800000)/', 'WAYBILL_NUMBER': 72124798, 'CONSIGNEE': 'L626010384', 'SO_NUMBER': 20173918, 'RELEASE_ORDER_NUMBER': 54155912, 'RELEASE_ORDER_UPDATE_DATE': datetime.datetime(2015, 11, 13, 8, 0)}] start_date = '01122015' end_date = datetime.date.today().strftime('%d%m%Y') self.synchronizer = ReleaseOrderSynchronizer(start_date=start_date) base_url = 'https://devapis.unicef.org/BIService/BIWebService.svc/GetReleaseOrderInfo_JSON/' self.expected_url = base_url + start_date + '/' + end_date def tearDown(self): Consignee.objects.all().delete() SalesOrder.objects.all().delete() Item.objects.all().delete() OrderItem.objects.all().delete() Programme.objects.all().delete() PurchaseOrder.objects.all().delete() PurchaseOrderItem.objects.all().delete() ReleaseOrder.objects.all().delete() ReleaseOrderItem.objects.all().delete() def test_should_point_to_correct_endpoint(self): self.synchronizer._load_records = MagicMock(return_value=[]) self.synchronizer.sync() self.assertEqual(self.synchronizer.url, self.expected_url) def test_should_load_release_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer._convert_records = MagicMock() self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._load_records.assert_called() self.synchronizer._convert_records.assert_called() self.synchronizer._save_records.assert_called() def test_should_convert_release_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer._save_records = MagicMock() self.synchronizer.sync() self.synchronizer._save_records.assert_called_with(self.converted_release_orders) def test_should_save_release_orders(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer.sync() all_release_orders = ReleaseOrder.objects.all() actual_release_order_1 = all_release_orders[0] self._assert_release_order_equal(actual_release_order_1, self.expected_release_order_1) def test_should_save_release_order_items(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer.sync() all_release_order_items = ReleaseOrderItem.objects.all() actual_release_order_item_1 = all_release_order_items[0] self._assert_release_order_item_equal(actual_release_order_item_1, self.expected_release_order_item_1) def test_should_NOT_save_release_order_which_can_not_refer_to_existing_sales_order(self): self.synchronizer._load_records = MagicMock(return_value=self.release_order_which_can_not_refer_to_sales_order) self.synchronizer.sync() self.assertEqual(ReleaseOrder.objects.count(), 0) def test_should_NOT_save_release_order_which_can_not_refer_to_exsiting_purchase_order(self): self.synchronizer._load_records = \ MagicMock(return_value=self.release_order_which_can_not_refer_to_purchase_order) self.synchronizer.sync() self.assertEqual(ReleaseOrder.objects.count(), 0) def test_should_NOT_update_when_got_an_older_release_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer.sync() older_release_order = [{"RELEASE_ORDER_NUMBER": u"0054155912", "RELEASE_ORDER_ITEM": 10, "RELEASE_ORDER_TYPE": "ZLO", "SALES_UNIT": "EA", "PLANT": "5631", "SHIP_TO_PARTY": "L626010000", "WAREHOUSE_NUMBER": "492", "CONSIGNEE": "L626010384", "DOCUMENT_DATE": u"/Date(1447390800000)/", "GOODS_ISSUE_DATE": u"/Date(1448254800000)/", "MATERIAL_NUMBER": "S0141021", "DELIVERY_QUANTITY": 100, "VALUE": 15030.86, "MOVING_AVG_PRICE": 273.29, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "WBS_ELEMENT": "6260\/A0\/05\/401\/005\/001", "WAYBILL_NUMBER": u"0072124798", "FORWARDER_NO": None, "SHIPMENT_END_DATE": u"/Date(1440004800000)/", "ACTUAL_SHIPMENT_START_DATE": None, "SHIPMENT_COMPLETION_DATE": None, "RELEASE_ORDER_CREATE_DATE": u"/Date(1440390800000)/", "RELEASE_ORDER_UPDATE_DATE": u"/Date(1440390800000)/"}] self.synchronizer._load_records = MagicMock(return_value=older_release_order) self.synchronizer.sync() release_order = ReleaseOrder.objects.get(order_number=54155912) self.assertEqual(Consignee.objects.get(pk=release_order.consignee.id).customer_id, 'L626010384') release_order_item = ReleaseOrderItem.objects.get(release_order=release_order) self.assertEqual(release_order_item.quantity, 55) def test_should_update_when_got_a_newer_release_order(self): self.synchronizer._load_records = MagicMock(return_value=self.downloaded_release_orders) self.synchronizer.sync() newer_release_order = [{"RELEASE_ORDER_NUMBER": u"0054155912", "RELEASE_ORDER_ITEM": 10, "RELEASE_ORDER_TYPE": "ZLO", "SALES_UNIT": "EA", "PLANT": "5631", "SHIP_TO_PARTY": "L626010384", "WAREHOUSE_NUMBER": "492", "CONSIGNEE": "L626010000", "DOCUMENT_DATE": u"/Date(1447390800000)/", "GOODS_ISSUE_DATE": u"/Date(1448254800000)/", "MATERIAL_NUMBER": "S0141021", "DELIVERY_QUANTITY": 100, "VALUE": 15030.86, "MOVING_AVG_PRICE": 273.29, "SO_NUMBER": u"0020173918", "PO_NUMBER": u"0045143984", "PO_ITEM": 10, "WBS_ELEMENT": "6260\/A0\/05\/401\/005\/001", "WAYBILL_NUMBER": u"0072124798", "FORWARDER_NO": None, "SHIPMENT_END_DATE": u"/Date(1448254800000)/", "ACTUAL_SHIPMENT_START_DATE": None, "SHIPMENT_COMPLETION_DATE": None, "RELEASE_ORDER_CREATE_DATE": u"/Date(1447390800000)/", "RELEASE_ORDER_UPDATE_DATE": u"/Date(1448390800000)/"}] self.synchronizer._load_records = MagicMock(return_value=newer_release_order) self.synchronizer.sync() release_order = ReleaseOrder.objects.get(order_number=54155912) self.assertEqual(Consignee.objects.get(pk=release_order.consignee.id).customer_id, 'L626010000') release_order_item = ReleaseOrderItem.objects.get(release_order=release_order) self.assertEqual(release_order_item.quantity, 100) def _prepare_sales_and_purchase_order(self): Consignee.objects.create(customer_id='L626010000') Consignee.objects.create(customer_id='L626010384') self.programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.programme_1.save() self.programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.programme_2.save() self.sales_order_1 = SalesOrder(programme=self.programme_1, order_number=20173918, date=datetime.date(2015, 12, 3)) self.sales_order_1.save() self.sales_order_2 = SalesOrder(programme=self.programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.sales_order_2.save() self.purchase_order_1 = PurchaseOrder(order_number=45143984, sales_order=self.sales_order_1, date=datetime.date(2015, 11, 30), po_type='NB') self.purchase_order_1.save() self.purchase_order_2 = PurchaseOrder(order_number=45144863, sales_order=self.sales_order_2, date=datetime.date(2015, 12, 14), po_type='ZLC') self.purchase_order_2.save() self.item_1 = Item(description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.item_1.save() self.item_2 = Item(description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.item_2.save() self.purchase_order_item_1 = PurchaseOrderItem(purchase_order=self.purchase_order_1, item=self.item_1, item_number=10, sales_order_item=None, quantity=100.00, value=Decimal('51322.65')) self.purchase_order_item_1.save() self.purchase_order_item_2 = PurchaseOrderItem(purchase_order=self.purchase_order_2, item=self.item_2, item_number=20, sales_order_item=None, quantity=80.00, value=Decimal('2673')) self.purchase_order_item_2.save() def _assert_release_order_equal(self, actual_release_order, expected_release_order): self.assertEqual(actual_release_order.order_number, expected_release_order.order_number) self.assertEqual(actual_release_order.waybill, expected_release_order.waybill) self.assertEqual(actual_release_order.delivery_date, expected_release_order.delivery_date) self.assertEqual(actual_release_order.delivery_date, expected_release_order.delivery_date) def _assert_release_order_item_equal(self, actual_release_order_item, expected_release_order_item_1): self._assert_release_order_equal(actual_release_order_item.release_order, expected_release_order_item_1.release_order) self.assertEqual(actual_release_order_item.item_number, expected_release_order_item_1.item_number) self.assertEqual(actual_release_order_item.quantity, expected_release_order_item_1.quantity) self.assertEqual(actual_release_order_item.value, expected_release_order_item_1.value)
def setUp(self): self.downloaded_sales_orders = [{ "SALES_ORDER_NO": u"0020173918", "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": u"/Date(1449118800000)/", "CREATE_DATE": u"/Date(1449118800000)/", "UPDATE_DATE": u"/Date(1449378000000)/", "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z00601", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-AFGHANISTAN-KABUL", "SHIP_TO_PARTY": "006", "SHIP_TO_PARTY_DESCRIPTION": "Afghanistan", "SO_ITEM_NO": 80, "REQUISITION_NO": "0030344383", "REQUISITION_ITEM_NO": 80, "PURCHASING_GROUP_NAME_SHORT": "NUTRITION", "WBS_REFERENCE": "0060A007883001002", "GRANT_REF": "Unknown", "GRANT_EXPIRY_DATE": None, "DONOR_NAME": "UNICEF-AFGHANISTAN-KABUL", "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g", "SO_ITEM_DESC": "Scale,electronic,mother/child,150kgx100g", "NET_VALUE": 51322.65 }, { "SALES_ORDER_NO": u"0020173918", "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": u"/Date(1449118800000)/", "CREATE_DATE": u"/Date(1449118800000)/", "UPDATE_DATE": u"/Date(1449378000000)/", "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z00601", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-AFGHANISTAN-KABUL", "SHIP_TO_PARTY": "006", "SHIP_TO_PARTY_DESCRIPTION": "Afghanistan", "SO_ITEM_NO": 90, "REQUISITION_NO": "0030344383", "REQUISITION_ITEM_NO": 90, "PURCHASING_GROUP_NAME_SHORT": "NUTRITION", "WBS_REFERENCE": "0060A007883001002", "GRANT_REF": "Unknown", "GRANT_EXPIRY_DATE": None, "DONOR_NAME": "UNICEF-AFGHANISTAN-KABUL", "MATERIAL_CODE": "S0145620", "MATERIAL_DESC": "MUAC,Child 11.5 Red/PAC-50", "SO_ITEM_DESC": "MUAC,Child 11.5 Red/PAC-50", "NET_VALUE": 3655.16 }, { "SALES_ORDER_NO": u"0020174363", "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": u"/Date(1450069200000)/", "CREATE_DATE": u"/Date(1450069200000)/", "UPDATE_DATE": u"/Date(1450069200000)/", "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z43801", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-UGANDA-KAMPALA", "SHIP_TO_PARTY": "438", "SHIP_TO_PARTY_DESCRIPTION": "Uganda", "SO_ITEM_NO": 10, "REQUISITION_NO": "0030344855", "REQUISITION_ITEM_NO": 10, "PURCHASING_GROUP_NAME_SHORT": "Kampala, Uganda", "WBS_REFERENCE": "4380A004105007042", "GRANT_REF": "SM150377", "GRANT_EXPIRY_DATE": u"/Date(1451538000000)/", "DONOR_NAME": "UNICEF-UGANDA-KAMPALA", "MATERIAL_CODE": "SL009100", "MATERIAL_DESC": "Laundry soap, Carton, 25 bars, 800 grams", "SO_ITEM_DESC": "Laundry soap, Carton, 25 bars, 800 grams", "NET_VALUE": 2673 }] self.converted_sales_orders = [{ "SALES_ORDER_NO": 20173918, "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": datetime.datetime(2015, 12, 3, 8, 0), "CREATE_DATE": datetime.datetime(2015, 12, 3, 8, 0), "UPDATE_DATE": datetime.datetime(2015, 12, 6, 8, 0), "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z00601", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-AFGHANISTAN-KABUL", "SHIP_TO_PARTY": "006", "SHIP_TO_PARTY_DESCRIPTION": "Afghanistan", "SO_ITEM_NO": 80, "REQUISITION_NO": "0030344383", "REQUISITION_ITEM_NO": 80, "PURCHASING_GROUP_NAME_SHORT": "NUTRITION", "WBS_REFERENCE": "0060/A0/07/883", "GRANT_REF": "Unknown", "GRANT_EXPIRY_DATE": None, "DONOR_NAME": "UNICEF-AFGHANISTAN-KABUL", "MATERIAL_CODE": "S0141021", "MATERIAL_DESC": "Scale,electronic,mother/child,150kgx100g", "SO_ITEM_DESC": "Scale,electronic,mother/child,150kgx100g", "NET_VALUE": 51322.65 }, { "SALES_ORDER_NO": 20173918, "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": datetime.datetime(2015, 12, 3, 8, 0), "CREATE_DATE": datetime.datetime(2015, 12, 3, 8, 0), "UPDATE_DATE": datetime.datetime(2015, 12, 6, 8, 0), "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z00601", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-AFGHANISTAN-KABUL", "SHIP_TO_PARTY": "006", "SHIP_TO_PARTY_DESCRIPTION": "Afghanistan", "SO_ITEM_NO": 90, "REQUISITION_NO": "0030344383", "REQUISITION_ITEM_NO": 90, "PURCHASING_GROUP_NAME_SHORT": "NUTRITION", "WBS_REFERENCE": "0060/A0/07/883", "GRANT_REF": "Unknown", "GRANT_EXPIRY_DATE": None, "DONOR_NAME": "UNICEF-AFGHANISTAN-KABUL", "MATERIAL_CODE": "S0145620", "MATERIAL_DESC": "MUAC,Child 11.5 Red/PAC-50", "SO_ITEM_DESC": "MUAC,Child 11.5 Red/PAC-50", "NET_VALUE": 3655.16 }, { "SALES_ORDER_NO": 20174363, "DOCUMENT_TYPE": "ZCOM", "DOCUMENT_DATE": datetime.datetime(2015, 12, 14, 8, 0), "CREATE_DATE": datetime.datetime(2015, 12, 14, 8, 0), "UPDATE_DATE": datetime.datetime(2015, 12, 14, 8, 0), "BUDGET_YEAR": 2015, "SOLD_TO_PARTY": "Z43801", "SOLD_TO_PARTY_DESCRIPTION": "UNICEF-UGANDA-KAMPALA", "SHIP_TO_PARTY": "438", "SHIP_TO_PARTY_DESCRIPTION": "Uganda", "SO_ITEM_NO": 10, "REQUISITION_NO": "0030344855", "REQUISITION_ITEM_NO": 10, "PURCHASING_GROUP_NAME_SHORT": "Kampala, Uganda", "WBS_REFERENCE": "4380/A0/04/105", "GRANT_REF": "SM150377", "GRANT_EXPIRY_DATE": datetime.datetime(2015, 12, 31, 8, 0), "DONOR_NAME": "UNICEF-UGANDA-KAMPALA", "MATERIAL_CODE": "SL009100", "MATERIAL_DESC": "Laundry soap, Carton, 25 bars, 800 grams", "SO_ITEM_DESC": "Laundry soap, Carton, 25 bars, 800 grams", "NET_VALUE": 2673 }] Programme.objects.create(wbs_element_ex='0060/A0/07/883') Programme.objects.create(wbs_element_ex='4380/A0/04/105') self.expected_programme_1 = Programme(wbs_element_ex='0060/A0/07/883') self.expected_programme_2 = Programme(wbs_element_ex='4380/A0/04/105') self.expected_sales_order_1 = SalesOrder( programme=self.expected_programme_1, order_number=20173918, date=datetime.date(2015, 12, 6)) self.expected_sales_order_2 = SalesOrder( programme=self.expected_programme_2, order_number=20174363, date=datetime.date(2015, 12, 14)) self.expected_item_1 = Item( description='Scale,electronic,mother/child,150kgx100g', material_code='S0141021') self.expected_item_2 = Item(description='MUAC,Child 11.5 Red/PAC-50', material_code='S0145620') self.expected_item_3 = Item( description='Laundry soap, Carton, 25 bars, 800 grams', material_code='SL009100') self.expected_sales_order_item_1 = SalesOrderItem( sales_order=self.expected_sales_order_1, item=self.expected_item_1, net_price=0, net_value=Decimal('51322.6500'), issue_date=datetime.date(2015, 12, 6), delivery_date=datetime.date(2015, 12, 6), description='Scale,electronic,mother/child,150kgx100g') self.expected_sales_order_item_2 = SalesOrderItem( sales_order=self.expected_sales_order_1, item=self.expected_item_2, net_price=0, net_value=Decimal('3655.16'), issue_date=datetime.date(2015, 12, 6), delivery_date=datetime.date(2015, 12, 6), description='MUAC,Child 11.5 Red/PAC-50') self.expected_sales_order_item_3 = SalesOrderItem( sales_order=self.expected_sales_order_2, item=self.expected_item_3, net_price=0, net_value=Decimal('2673'), issue_date=datetime.date(2015, 12, 14), delivery_date=datetime.date(2015, 12, 14), description='Laundry soap, Carton, 25 bars, 800 grams') start_date = '01122015' end_date = datetime.date.today().strftime('%d%m%Y') self.synchronizer = SalesOrderSynchronizer(start_date=start_date) base_url = 'https://devapis.unicef.org/BIService/BIWebService.svc/GetSalesOrderInfo_JSON/' self.expected_url = base_url + start_date + '/' + end_date