[IMP] delivery_stamps: mechanisms for rating and shipping per package

This commit is contained in:
Jared Kipe
2021-09-20 17:48:11 -07:00
parent 63ec0b5a65
commit 9090a3ac92
2 changed files with 28 additions and 8 deletions

View File

@@ -3,7 +3,7 @@
{ {
'name': 'Stamps.com (USPS) Shipping', 'name': 'Stamps.com (USPS) Shipping',
'summary': 'Send your shippings through Stamps.com and track them online.', 'summary': 'Send your shippings through Stamps.com and track them online.',
'version': '14.0.1.0.0', 'version': '14.0.1.1.0',
'author': "Hibou Corp.", 'author': "Hibou Corp.",
'category': 'Warehouse', 'category': 'Warehouse',
'license': 'OPL-1', 'license': 'OPL-1',

View File

@@ -147,11 +147,13 @@ class ProviderStamps(models.Model):
ret_val.ContentType = self._stamps_content_type() ret_val.ContentType = self._stamps_content_type()
return ret_val return ret_val
def _get_stamps_shipping_multi(self, service, date_planned, order=False, picking=False): def _get_stamps_shipping_multi(self, service, date_planned, order=False, picking=False, package=False):
if order: if order:
weight = sum([(line.product_id.weight * line.product_qty) for line in order.order_line]) or 0.0 weight = sum([(line.product_id.weight * line.product_qty) for line in order.order_line]) or 0.0
else: elif not package:
weight = picking.shipping_weight weight = picking.shipping_weight
else:
weight = package.shipping_weight or package.weight
weight = self._stamps_convert_weight(weight) weight = self._stamps_convert_weight(weight)
shipper = self.get_shipper_warehouse(order=order, picking=picking) shipper = self.get_shipper_warehouse(order=order, picking=picking)
@@ -164,7 +166,7 @@ class ProviderStamps(models.Model):
ret_val.ShipDate = date_planned.strftime('%Y-%m-%d') if date_planned else date.today().isoformat() ret_val.ShipDate = date_planned.strftime('%Y-%m-%d') if date_planned else date.today().isoformat()
ret_val.From = self._stamps_address(service, shipper) ret_val.From = self._stamps_address(service, shipper)
ret_val.To = self._stamps_address(service, recipient) ret_val.To = self._stamps_address(service, recipient)
ret_val.PackageType = self._stamps_package_type() ret_val.PackageType = self._stamps_package_type(package=package)
ret_val.WeightLb = weight ret_val.WeightLb = weight
ret_val.ContentType = 'Merchandise' ret_val.ContentType = 'Merchandise'
return ret_val return ret_val
@@ -206,7 +208,13 @@ class ProviderStamps(models.Model):
if not all((from_partner.zip, to_partner.zip)): if not all((from_partner.zip, to_partner.zip)):
raise ValidationError('Stamps needs ZIP/PostalCode. From: ' + str(from_partner.zip) + ' To: ' + str(to_partner.zip)) raise ValidationError('Stamps needs ZIP/PostalCode. From: ' + str(from_partner.zip) + ' To: ' + str(to_partner.zip))
for package in picking.package_ids: picking_packages = picking.package_ids
package_carriers = picking_packages.mapped('carrier_id')
if package_carriers:
# only ship ours
picking_packages = picking_packages.filtered(lambda p: p.carrier_id == self and not p.carrier_tracking_ref)
for package in picking_packages:
weight = self._stamps_convert_weight(package.shipping_weight) weight = self._stamps_convert_weight(package.shipping_weight)
l, w, h = self._stamps_package_dimensions(package=package) l, w, h = self._stamps_package_dimensions(package=package)
@@ -223,7 +231,7 @@ class ProviderStamps(models.Model):
ret_val.WeightLb = weight ret_val.WeightLb = weight
ret_val.ContentType = self._stamps_content_type(package=package) ret_val.ContentType = self._stamps_content_type(package=package)
ret.append((package.name + ret_val.ShipDate + str(ret_val.WeightLb) + self._stamps_hash_partner(to_partner), ret_val)) ret.append((package.name + ret_val.ShipDate + str(ret_val.WeightLb) + self._stamps_hash_partner(to_partner), ret_val))
if not ret: if not ret and not package_carriers:
weight = self._stamps_convert_weight(picking.shipping_weight) weight = self._stamps_convert_weight(picking.shipping_weight)
l, w, h = self._stamps_package_dimensions() l, w, h = self._stamps_package_dimensions()
@@ -312,6 +320,8 @@ class ProviderStamps(models.Model):
package_labels = [] package_labels = []
shippings = self._stamps_get_shippings_for_picking(service, picking) shippings = self._stamps_get_shippings_for_picking(service, picking)
if not shippings:
continue
company, from_partner, to_partner = self._stamps_get_addresses_for_picking(picking) company, from_partner, to_partner = self._stamps_get_addresses_for_picking(picking)
customs = None customs = None
@@ -453,14 +463,23 @@ class ProviderStamps(models.Model):
except WebFault as e: except WebFault as e:
raise ValidationError(e) raise ValidationError(e)
def stamps_rate_shipment_multi(self, order=None, picking=None): def stamps_rate_shipment_multi(self, order=None, picking=None, packages=None):
if not packages:
return self._stamps_rate_shipment_multi_package(order=order, picking=picking)
else:
rates = []
for package in packages:
rates += self._stamps_rate_shipment_multi_package(order=order, picking=picking, package=package)
return rates
def _stamps_rate_shipment_multi_package(self, order=None, picking=None, package=None):
self.ensure_one() self.ensure_one()
date_planned = fields.Datetime.now() date_planned = fields.Datetime.now()
if self.env.context.get('date_planned'): if self.env.context.get('date_planned'):
date_planned = self.env.context.get('date_planned') date_planned = self.env.context.get('date_planned')
res = [] res = []
service = self._get_stamps_service() service = self._get_stamps_service()
shipping = self._get_stamps_shipping_multi(service, date_planned, order=order, picking=picking) shipping = self._get_stamps_shipping_multi(service, date_planned, order=order, picking=picking, package=package)
rates = service.get_rates(shipping) rates = service.get_rates(shipping)
for rate in rates: for rate in rates:
price = float(rate.Amount) price = float(rate.Amount)
@@ -486,6 +505,7 @@ class ProviderStamps(models.Model):
if carrier: if carrier:
res.append({ res.append({
'carrier': carrier, 'carrier': carrier,
'package': package or self.env['stock.quant.package'].browse(),
'success': True, 'success': True,
'price': price, 'price': price,
'error_message': False, 'error_message': False,