From fd5be7c07dc9fd81d02f00a42d81d3d787c7678f Mon Sep 17 00:00:00 2001 From: Benas Date: Thu, 2 Jun 2022 18:42:39 +0300 Subject: [PATCH 1/5] [ADD] OD-1192: Add pdf return labels creation logic to return pickings. --- .../models/stock_picking.py | 20 +++++++-- .../test_delivery_carrier_label_paazl.py | 45 +++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/delivery_carrier_label_paazl/models/stock_picking.py b/delivery_carrier_label_paazl/models/stock_picking.py index e257de463f..6ce9c76bcf 100644 --- a/delivery_carrier_label_paazl/models/stock_picking.py +++ b/delivery_carrier_label_paazl/models/stock_picking.py @@ -67,15 +67,26 @@ def _paazl_generate_labels(self): """ self.ensure_one() api = self._paazl_api() - # we need to create labels in order to get a tracking number - status = api.service.generateLabels(**self._paazl_generate_labels_data()) + is_return = self.location_id.usage == "customer" + return_rma = all([is_return and self.picking_type_code == "incoming"]) + if return_rma: + payload = self._paazl_generate_labels_data() + # Removing since generatePdfReturnLabels call doesn't accept labelFormat + if "labelFormat" in payload: + payload.pop("labelFormat") + # Generating return labels + status = api.service.generatePdfReturnLabels(**payload) + else: + # we need to create labels in order to get a tracking number + status = api.service.generateLabels(**self._paazl_generate_labels_data()) self._paazl_raise_error(status) # as we have the labels anyways, attach them account = self._get_carrier_account() + status_label = status.label if return_rma else status.labels file_type = (account.file_format or "").lower() or "pdf" label = { "name": self._paazl_reference(), - "file": base64.b64encode(status.labels), + "file": base64.b64encode(status_label), "filename": "{}.{}".format(self._paazl_reference(), file_type), "file_type": file_type, } @@ -260,6 +271,9 @@ def _paazl_generate_labels_data(self): """Return a dict to be passed to the generateLabels endpoint""" self.ensure_one() auth_order_id = self._paazl_auth_order_id() + is_return = self.location_id.usage == "customer" + if is_return and self.picking_type_code == "incoming": + auth_order_id['shippingOption'] = self.option_ids.tmpl_option_id.code account = self._get_carrier_account() return { "webshop": auth_order_id.pop("webshop"), diff --git a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py index b7a0596027..8583b053d7 100644 --- a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py +++ b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py @@ -56,6 +56,11 @@ def _setup_mock_client(self): mock_client.service.generateLabels.return_value = Mock( error=False, labels=b"hello world", metaData=[{"trackingNumber": "number"}], ) + mock_client.service.generatePdfReturnLabels.return_value = Mock( + error=False, + label=b"generatePdfReturnLabel", + metaData=[{"trackingNumber": "number"}], + ) with patch.object(zeep, "Client") as mock_client_class: mock_client_class.return_value = mock_client yield mock_client @@ -114,6 +119,11 @@ def _request(self, path, method="POST", data=None, headers=None): class TestDeliveryCarrierLabelPaazl( DeliveryCarrierLabelPaazlCase, carrier_label_case.TestCarrierLabel): + def _picking_data(self): + """Add the boxes that vanmoof_shipping module makes required for Paazl""" + self.picking.paazl_pack_detail_ids = [(0, 0, {"name": __name__})] + return super()._picking_data() + def test_cancel_shipment(self): self.assertTrue(self.picking.carrier_tracking_ref) with self._setup_mock_client() as mock_client: @@ -186,6 +196,41 @@ def test_change_order(self): self.picking._paazl_send_update_order(change_order=True) self.assertTrue(self.picking.carrier_tracking_ref) + def test_paazl_return_pdf_label(self): + """ + Test generatePdfReturnLabel paazl API method. + """ + picking = self.picking.copy() + customer_location = self.env['stock.location'].search( + [("usage", "=", "customer")] + ) + picking.location_id = customer_location[0].id + picking.picking_type_code = "incoming" + picking.move_lines.quantity_done = 1 + with self._setup_mock_client(): + picking._paazl_send_update_order() + with self._setup_mock_client(): + picking.button_paazl_get_label() + picking.button_validate() + labels = self.env["shipping.label"].search([ + ("res_id", "=", picking.id), + ("res_model", "=", "stock.picking")]) + self.assertEqual( + picking.message_main_attachment_id.mimetype, + labels[0].attachment_id.mimetype) + self.assertEqual( + labels[0].attachment_id.mimetype, + "application/pdf" + ) + self.assertEqual( + picking.message_main_attachment_id.mimetype, + "application/pdf" + ) + self.assertEqual( + picking.message_main_attachment_id.datas_fname.split('.')[1], + "pdf" + ) + class TestDeliveryCarrierLabelPaazlPackaging(TestDeliveryCarrierLabelPaazl): def _picking_data(self): From 013ee7dd4b1032f14a764067b76f59bbaef67bf9 Mon Sep 17 00:00:00 2001 From: Benas Date: Mon, 6 Jun 2022 17:14:34 +0300 Subject: [PATCH 2/5] [RM] OD-1192: Reworked unittests to reuse OCA delivery carrier methods only. --- .../test_delivery_carrier_label_paazl.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py index 8583b053d7..5ddcf0240b 100644 --- a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py +++ b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py @@ -119,10 +119,6 @@ def _request(self, path, method="POST", data=None, headers=None): class TestDeliveryCarrierLabelPaazl( DeliveryCarrierLabelPaazlCase, carrier_label_case.TestCarrierLabel): - def _picking_data(self): - """Add the boxes that vanmoof_shipping module makes required for Paazl""" - self.picking.paazl_pack_detail_ids = [(0, 0, {"name": __name__})] - return super()._picking_data() def test_cancel_shipment(self): self.assertTrue(self.picking.carrier_tracking_ref) @@ -209,19 +205,18 @@ def test_paazl_return_pdf_label(self): picking.move_lines.quantity_done = 1 with self._setup_mock_client(): picking._paazl_send_update_order() - with self._setup_mock_client(): - picking.button_paazl_get_label() - picking.button_validate() + picking.send_to_shipper() + picking._paazl_generate_labels() + labels = self.env["shipping.label"].search([ ("res_id", "=", picking.id), - ("res_model", "=", "stock.picking")]) + ("res_model", "=", "stock.picking") + ]) self.assertEqual( picking.message_main_attachment_id.mimetype, - labels[0].attachment_id.mimetype) - self.assertEqual( - labels[0].attachment_id.mimetype, - "application/pdf" + labels[0].attachment_id.mimetype ) + self.assertEqual(labels[0].attachment_id.mimetype, "application/pdf") self.assertEqual( picking.message_main_attachment_id.mimetype, "application/pdf" From 64d809c3522c056e8449264af0849eee3f25d43a Mon Sep 17 00:00:00 2001 From: Benas Date: Thu, 23 Jun 2022 03:32:15 +0300 Subject: [PATCH 3/5] [ADD] OD-1192: Updated unittest. --- .../test_delivery_carrier_label_paazl.py | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py index 5ddcf0240b..403004e3a8 100644 --- a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py +++ b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py @@ -200,31 +200,21 @@ def test_paazl_return_pdf_label(self): customer_location = self.env['stock.location'].search( [("usage", "=", "customer")] ) + self.assertTrue(customer_location) picking.location_id = customer_location[0].id picking.picking_type_code = "incoming" + self.assertEqual(picking.picking_type_code, "incoming") picking.move_lines.quantity_done = 1 with self._setup_mock_client(): - picking._paazl_send_update_order() - picking.send_to_shipper() - picking._paazl_generate_labels() + picking.button_validate() - labels = self.env["shipping.label"].search([ + label = self.env["shipping.label"].search([ ("res_id", "=", picking.id), ("res_model", "=", "stock.picking") ]) - self.assertEqual( - picking.message_main_attachment_id.mimetype, - labels[0].attachment_id.mimetype - ) - self.assertEqual(labels[0].attachment_id.mimetype, "application/pdf") - self.assertEqual( - picking.message_main_attachment_id.mimetype, - "application/pdf" - ) - self.assertEqual( - picking.message_main_attachment_id.datas_fname.split('.')[1], - "pdf" - ) + self.assertEqual(label.attachment_id.mimetype, "application/pdf") + self.assertEqual(label.file_type, "pdf") + self.assertEqual(label.attachment_id.datas_fname.split('.')[1], "pdf") class TestDeliveryCarrierLabelPaazlPackaging(TestDeliveryCarrierLabelPaazl): From c37c84a6e1d55a3627b70cc3a0b623f0d99ebb46 Mon Sep 17 00:00:00 2001 From: Benas Date: Fri, 24 Jun 2022 00:16:44 +0300 Subject: [PATCH 4/5] [ADD] OD-1192: Update unittest to solve conflicts with vanmoof_shipping logic. --- delivery_carrier_label_paazl/README.rst | 3 ++- .../tests/test_delivery_carrier_label_paazl.py | 18 ++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/delivery_carrier_label_paazl/README.rst b/delivery_carrier_label_paazl/README.rst index 73bb78ff6e..b70fc10ab3 100644 --- a/delivery_carrier_label_paazl/README.rst +++ b/delivery_carrier_label_paazl/README.rst @@ -23,7 +23,7 @@ Carrier labels for paazl :target: https://runbot.odoo-community.org/runbot/99/12.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds `paazl `_ to the available carriers. @@ -49,6 +49,7 @@ To use this module, you need to: #. Select the paazl carrier on your sale orders or pickings #. Set exactly one delivery option #. As a label needs to be generated for the tracking code, there's no need to manually generate labels via the button +#. Note return labels are generated for return customer pickings #. Note that the addon passes the package's dimensions if a packaging is set on the package, and on the product's dimensions otherwise Bug Tracker diff --git a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py index 403004e3a8..12f909751c 100644 --- a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py +++ b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py @@ -194,7 +194,7 @@ def test_change_order(self): def test_paazl_return_pdf_label(self): """ - Test generatePdfReturnLabel paazl API method. + Test paazl generatePdfReturnLabel API endpoint to generate return labels. """ picking = self.picking.copy() customer_location = self.env['stock.location'].search( @@ -206,15 +206,13 @@ def test_paazl_return_pdf_label(self): self.assertEqual(picking.picking_type_code, "incoming") picking.move_lines.quantity_done = 1 with self._setup_mock_client(): - picking.button_validate() - - label = self.env["shipping.label"].search([ - ("res_id", "=", picking.id), - ("res_model", "=", "stock.picking") - ]) - self.assertEqual(label.attachment_id.mimetype, "application/pdf") - self.assertEqual(label.file_type, "pdf") - self.assertEqual(label.attachment_id.datas_fname.split('.')[1], "pdf") + payload = picking._paazl_generate_labels() + + labels = payload["labels"][0] + self.assertTrue(labels) + self.assertTrue(labels["file"]) + self.assertEqual(labels["file_type"], "pdf") + self.assertEqual(labels["filename"].split('.')[1], "pdf") class TestDeliveryCarrierLabelPaazlPackaging(TestDeliveryCarrierLabelPaazl): From 494cd7276aa6b15420e6689d244fce23ec874e6d Mon Sep 17 00:00:00 2001 From: antonioburic Date: Mon, 18 Jul 2022 06:49:13 +0200 Subject: [PATCH 5/5] [UPD] Invert/fix the addresses for the return labels (sender/reciever). --- .../models/stock_picking.py | 28 +++++++++++++++---- .../test_delivery_carrier_label_paazl.py | 5 ++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/delivery_carrier_label_paazl/models/stock_picking.py b/delivery_carrier_label_paazl/models/stock_picking.py index 6ce9c76bcf..b1a43343cc 100644 --- a/delivery_carrier_label_paazl/models/stock_picking.py +++ b/delivery_carrier_label_paazl/models/stock_picking.py @@ -208,11 +208,21 @@ def _paazl_commit_order_data(self): """Return a dict that can be passed as parameters to the `commitOrder` endpoint of the paazl soap api""" self.ensure_one() - shipping_address = self._paazl_partner_to_order_data(self.partner_id) - shipping_address["customerName"] = shipping_address.pop("addresseeLine") - if self.partner_id.parent_id: - shipping_address["companyName"] = self.partner_id.parent_id.name - return dict( + warehouse_partner_id = self.picking_type_id.warehouse_id.partner_id + is_return = self.location_id.usage == "customer" + if is_return and self.picking_type_code == "incoming": + shipping_address = self._paazl_partner_to_order_data(warehouse_partner_id) + shipper_address = self.partner_id + shipping_address["customerName"] = shipping_address.pop("addresseeLine") + if warehouse_partner_id.parent_id: + shipping_address["companyName"] = warehouse_partner_id.parent_id.name + else: + shipping_address = self._paazl_partner_to_order_data(self.partner_id) + shipper_address = warehouse_partner_id + shipping_address["customerName"] = shipping_address.pop("addresseeLine") + if self.partner_id.parent_id: + shipping_address["companyName"] = self.partner_id.parent_id.name + res = dict( **self._paazl_auth_order_id(), pendingOrderReference=self._paazl_reference(), customerEmail=self.partner_id.email, @@ -228,11 +238,17 @@ def _paazl_commit_order_data(self): packageCount=self._paazl_package_count(), ), shipperAddress=self._paazl_partner_to_order_data( - self.picking_type_id.warehouse_id.partner_id, + shipper_address, ), shippingAddress=shipping_address, totalAmount=0, ) + if is_return and self.picking_type_code == "incoming": + # in case of a return set the return address to the shipper + res.update(returnAddress=self._paazl_partner_to_order_data( + shipper_address, + )) + return res def _paazl_change_order_data(self): """Return a dict that can be passed as parameters to the `changeOrder` diff --git a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py index 12f909751c..51f1416300 100644 --- a/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py +++ b/delivery_carrier_label_paazl/tests/test_delivery_carrier_label_paazl.py @@ -204,6 +204,11 @@ def test_paazl_return_pdf_label(self): picking.location_id = customer_location[0].id picking.picking_type_code = "incoming" self.assertEqual(picking.picking_type_code, "incoming") + with self._setup_mock_client() as mock_client: + mock_client.service.commitOrder.return_value = Mock( + error=Mock(code=1003, message="") + ) + picking._paazl_send_update_order(change_order=True) picking.move_lines.quantity_done = 1 with self._setup_mock_client(): payload = picking._paazl_generate_labels()