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/models/stock_picking.py b/delivery_carrier_label_paazl/models/stock_picking.py index e257de463f..b1a43343cc 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, } @@ -197,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, @@ -217,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` @@ -260,6 +287,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..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 @@ -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,7 @@ def _request(self, path, method="POST", data=None, headers=None): class TestDeliveryCarrierLabelPaazl( DeliveryCarrierLabelPaazlCase, carrier_label_case.TestCarrierLabel): + def test_cancel_shipment(self): self.assertTrue(self.picking.carrier_tracking_ref) with self._setup_mock_client() as mock_client: @@ -186,6 +192,33 @@ 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 paazl generatePdfReturnLabel API endpoint to generate return labels. + """ + picking = self.picking.copy() + 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") + 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() + + 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): def _picking_data(self):