Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion delivery_carrier_label_paazl/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://paazl.com>`_ to the available carriers.

Expand All @@ -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
Expand Down
48 changes: 39 additions & 9 deletions delivery_carrier_label_paazl/models/stock_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Comment thread
StefanRijnhart marked this conversation as resolved.
# 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
Comment thread
benrazanskas marked this conversation as resolved.
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,
}
Expand Down Expand Up @@ -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,
Expand All @@ -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`
Expand Down Expand Up @@ -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"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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):
Expand Down