mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[IMP] delivery_hibou: package count (special for package by volume)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
from math import ceil
|
||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.tools.float_utils import float_compare
|
from odoo.tools.float_utils import float_compare
|
||||||
from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES
|
from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES
|
||||||
@@ -48,6 +49,14 @@ class DeliveryCarrier(models.Model):
|
|||||||
_logger.info(' package by NULL')
|
_logger.info(' package by NULL')
|
||||||
return self.env['stock.package.type']
|
return self.env['stock.package.type']
|
||||||
|
|
||||||
|
def get_package_count_for_order(self, order, package_type=None):
|
||||||
|
if package_type is None:
|
||||||
|
package_type = self.get_package_type_for_order(order)
|
||||||
|
|
||||||
|
if self.package_by_field == 'volume':
|
||||||
|
return self._get_package_count_for_order(order, package_type, 'package_volume', 'volume')
|
||||||
|
return self._get_package_count_for_order(order, package_type, 'max_weight', 'weight')
|
||||||
|
|
||||||
def _get_package_type_for_order(self, order, package_type_field, product_field):
|
def _get_package_type_for_order(self, order, package_type_field, product_field):
|
||||||
# NOTE do not optimize this into non-loop.
|
# NOTE do not optimize this into non-loop.
|
||||||
# this may be an orderfake
|
# this may be an orderfake
|
||||||
@@ -67,6 +76,17 @@ class DeliveryCarrier(models.Model):
|
|||||||
return package_types if not package_type else package_type
|
return package_types if not package_type else package_type
|
||||||
return self.env['stock.package.type']
|
return self.env['stock.package.type']
|
||||||
|
|
||||||
|
def _get_package_count_for_order(self, order, package_type, package_type_field, product_field):
|
||||||
|
# NOTE do not optimize this into non-loop.
|
||||||
|
# this may be an orderfake
|
||||||
|
order_total = 0.0
|
||||||
|
for ol in order.order_line.filtered(lambda ol: ol.product_id.type in ('product', 'consu')):
|
||||||
|
order_total += ol.product_id[product_field] * ol.product_uom_qty
|
||||||
|
package_type_field_value = package_type[package_type_field]
|
||||||
|
if not package_type_field_value or package_type_field_value >= order_total:
|
||||||
|
return 1.0
|
||||||
|
return ceil(order_total / package_type_field_value)
|
||||||
|
|
||||||
# Utility
|
# Utility
|
||||||
def get_to_ship_picking_packages(self, picking):
|
def get_to_ship_picking_packages(self, picking):
|
||||||
# Will return a stock.quant.package record set if the picking has packages
|
# Will return a stock.quant.package record set if the picking has packages
|
||||||
@@ -204,7 +224,7 @@ class DeliveryCarrier(models.Model):
|
|||||||
|
|
||||||
def _get_shipper_warehouse_dropship_in(self, picking):
|
def _get_shipper_warehouse_dropship_in(self, picking):
|
||||||
if picking.sale_id:
|
if picking.sale_id:
|
||||||
picking.sale_id.partner_shipping_id
|
return picking.sale_id.partner_shipping_id
|
||||||
return self._get_shipper_warehouse_dropship_in_no_sale(picking)
|
return self._get_shipper_warehouse_dropship_in_no_sale(picking)
|
||||||
|
|
||||||
def _get_shipper_warehouse_dropship_in_no_sale(self, picking):
|
def _get_shipper_warehouse_dropship_in_no_sale(self, picking):
|
||||||
|
|||||||
Reference in New Issue
Block a user