diff --git a/delivery_fedex_hibou/models/delivery_fedex.py b/delivery_fedex_hibou/models/delivery_fedex.py index c66f4f4d..b66bd683 100644 --- a/delivery_fedex_hibou/models/delivery_fedex.py +++ b/delivery_fedex_hibou/models/delivery_fedex.py @@ -38,6 +38,8 @@ class DeliveryFedex(models.Model): if not third_party_account.delivery_type == 'fedex': raise ValidationError('Non-FedEx Shipping Account indicated during FedEx shipment.') return third_party_account.name + if picking and picking.picking_type_id.warehouse_id.fedex_account_number: + return picking.picking_type_id.warehouse_id.fedex_account_number return self.fedex_account_number def _get_fedex_account_number(self, order=None, picking=None): @@ -245,7 +247,6 @@ class DeliveryFedex(models.Model): payment_acc_number = superself._get_fedex_payment_account_number(picking=picking) order_name = superself.get_order_name(picking=picking) attn = superself.get_attn(picking=picking) - insurance_value = superself.get_insurance_value(picking=picking) residential = self._get_fedex_recipient_is_residential(recipient) srm.web_authentication_detail(superself.fedex_developer_key, superself.fedex_developer_password) @@ -341,7 +342,8 @@ class DeliveryFedex(models.Model): po_number=po_number, dept_number=dept_number, ref=('%s-%d' % (order_name, sequence)), - insurance=insurance_value + insurance=superself.get_insurance_value(picking=picking, package=package), + signature_required=superself.get_signature_required(picking=picking, package=package) ) srm.set_master_package(net_weight, package_count, master_tracking_id=master_tracking_id) request = srm.process_shipment() @@ -421,7 +423,8 @@ class DeliveryFedex(models.Model): po_number=po_number, dept_number=dept_number, ref=order_name, - insurance=insurance_value + insurance=superself.get_insurance_value(picking=picking, package=picking_packages[:1]), + signature_required=superself.get_signature_required(picking=picking, package=picking_packages[:1]) ) srm.set_master_package(net_weight, 1) @@ -516,7 +519,8 @@ class DeliveryFedex(models.Model): acc_number = superself._get_fedex_account_number(order=order, picking=picking) meter_number = superself._get_fedex_meter_number(order=order, picking=picking) order_name = superself.get_order_name(order=order, picking=picking) - insurance_value = superself.get_insurance_value(order=order, picking=picking) + insurance_value = superself.get_insurance_value(order=order, picking=picking, package=package) + signature_required = superself.get_signature_required(order=order, picking=picking, package=package) residential = self._get_fedex_recipient_is_residential(recipient) date_planned = fields.Datetime.now() if self.env.context.get('date_planned'): @@ -600,7 +604,8 @@ class DeliveryFedex(models.Model): # po_number=po_number, # dept_number=dept_number, ref=('%s-%d' % (order_name, 1)), - insurance=insurance_value + insurance=insurance_value, + signature_required=signature_required ) else: # deliver all together... @@ -618,7 +623,8 @@ class DeliveryFedex(models.Model): # po_number=po_number, # dept_number=dept_number, ref=('%s-%d' % (order_name, 1)), - insurance=insurance_value + insurance=insurance_value, + signature_required=signature_required ) @@ -708,3 +714,27 @@ class DeliveryFedex(models.Model): ('fedex_service_type', '=', service_code) ], limit=1) return carrier + + def fedex_cancel_shipment(self, picking): + request = FedexRequest(self.log_xml, request_type="shipping", prod_environment=self.prod_environment) + superself = self.sudo() + request.web_authentication_detail(superself.fedex_developer_key, superself.fedex_developer_password) + acc_number = superself._get_fedex_account_number(picking=picking) + meter_number = superself._get_fedex_meter_number(picking=picking) + request.client_detail(acc_number, meter_number) + request.transaction_detail(picking.id) + + master_tracking_id = picking.carrier_tracking_ref.split(',')[0] + request.set_deletion_details(master_tracking_id) + result = request.delete_shipment() + + warnings = result.get('warnings_message') + if warnings: + _logger.info(warnings) + + if result.get('delete_success') and not result.get('errors_message'): + picking.message_post(body=_(u'Shipment N° %s has been cancelled' % master_tracking_id)) + picking.write({'carrier_tracking_ref': '', + 'carrier_price': 0.0}) + else: + raise UserError(result['errors_message']) diff --git a/delivery_fedex_hibou/models/fedex_request.py b/delivery_fedex_hibou/models/fedex_request.py index ca8c230c..df32800d 100644 --- a/delivery_fedex_hibou/models/fedex_request.py +++ b/delivery_fedex_hibou/models/fedex_request.py @@ -32,6 +32,7 @@ class FedexRequest(fedex_request.FedexRequest): _service_transit_days = { 'FEDEX_2_DAY': 2, 'FEDEX_2_DAY_AM': 2, + 'FEDEX_3_DAY_FREIGHT': 3, 'FIRST_OVERNIGHT': 1, 'PRIORITY_OVERNIGHT': 1, 'STANDARD_OVERNIGHT': 1, @@ -74,12 +75,12 @@ class FedexRequest(fedex_request.FedexRequest): self.RequestedShipment.Recipient.Contact = Contact self.RequestedShipment.Recipient.Address = Address - def add_package(self, weight_value, package_code=False, package_height=0, package_width=0, package_length=0, sequence_number=False, mode='shipping', ref=False, insurance=False): + def add_package(self, weight_value, package_code=False, package_height=0, package_width=0, package_length=0, sequence_number=False, mode='shipping', ref=False, insurance=False, signature_required=False): # TODO remove in master and change the signature of a public method return self._add_package(weight_value=weight_value, package_code=package_code, package_height=package_height, package_width=package_width, - package_length=package_length, sequence_number=sequence_number, mode=mode, po_number=False, dept_number=False, ref=ref, insurance=insurance) + package_length=package_length, sequence_number=sequence_number, mode=mode, po_number=False, dept_number=False, ref=ref, insurance=insurance, signature_required=signature_required) - def _add_package(self, weight_value, package_code=False, package_height=0, package_width=0, package_length=0, sequence_number=False, mode='shipping', po_number=False, dept_number=False, ref=False, insurance=False): + def _add_package(self, weight_value, package_code=False, package_height=0, package_width=0, package_length=0, sequence_number=False, mode='shipping', po_number=False, dept_number=False, ref=False, insurance=False, signature_required=False): package = self.client.factory.create('RequestedPackageLineItem') package_weight = self.client.factory.create('Weight') package_weight.Value = weight_value @@ -98,6 +99,12 @@ class FedexRequest(fedex_request.FedexRequest): insured.Currency = 'USD' package.InsuredValue = insured + special_service = self.client.factory.create("PackageSpecialServicesRequested") + signature_detail = self.client.factory.create("SignatureOptionDetail") + signature_detail.OptionType = 'DIRECT' if signature_required else 'NO_SIGNATURE_REQUIRED' + special_service.SignatureOptionDetail = signature_detail + package.SpecialServicesRequested = special_service + package.PhysicalPackaging = 'BOX' if package_code == 'YOUR_PACKAGING': package.Dimensions.Height = package_height @@ -202,6 +209,10 @@ class FedexRequest(fedex_request.FedexRequest): # Hibou Delivery Planning if hasattr(self.response.RateReplyDetails[0], 'DeliveryTimestamp') and self.response.RateReplyDetails[0].DeliveryTimestamp: formatted_response['date_delivered'] = self.response.RateReplyDetails[0].DeliveryTimestamp + if hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'TransitTime'): + transit_days = self.response.RateReplyDetails[0].CommitDetails[0].TransitTime + transit_days = self._transit_days.get(transit_days, 0) + formatted_response['transit_days'] = transit_days elif hasattr(self.response.RateReplyDetails[0], 'CommitDetails') and hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'CommitTimestamp'): formatted_response['date_delivered'] = self.response.RateReplyDetails[0].CommitDetails[0].CommitTimestamp formatted_response['transit_days'] = self._service_transit_days.get(self.response.RateReplyDetails[0].CommitDetails[0].ServiceType, 0) @@ -221,9 +232,14 @@ class FedexRequest(fedex_request.FedexRequest): # Hibou Delivery Planning if hasattr(rate_reply_detail, 'DeliveryTimestamp') and rate_reply_detail.DeliveryTimestamp: res['date_delivered'] = rate_reply_detail.DeliveryTimestamp + res['transit_days'] = self._service_transit_days.get(rate_reply_detail.ServiceType, 0) + if not res['transit_days'] and hasattr(rate_reply_detail.CommitDetails[0], 'TransitTime'): + transit_days = rate_reply_detail.CommitDetails[0].TransitTime + transit_days = self._transit_days.get(transit_days, 0) + res['transit_days'] = transit_days elif hasattr(rate_reply_detail, 'CommitDetails') and hasattr(rate_reply_detail.CommitDetails[0], 'CommitTimestamp'): res['date_delivered'] = rate_reply_detail.CommitDetails[0].CommitTimestamp - res['transit_days'] = self._service_transit_days.get(rate_reply_detail.CommitDetails[0].ServiceType, 0) + res['transit_days'] = self._service_transit_days.get(rate_reply_detail.ServiceType, 0) elif hasattr(rate_reply_detail, 'CommitDetails') and hasattr(rate_reply_detail.CommitDetails[0], 'TransitTime'): transit_days = rate_reply_detail.CommitDetails[0].TransitTime transit_days = self._transit_days.get(transit_days, 0) diff --git a/delivery_gso/models/delivery_gso.py b/delivery_gso/models/delivery_gso.py index 4c7f7864..be06ace0 100644 --- a/delivery_gso/models/delivery_gso.py +++ b/delivery_gso/models/delivery_gso.py @@ -187,14 +187,6 @@ class ProviderGSO(models.Model): request_body['Shipment'].update(self._gso_make_shipper_address(from_, company)) request_body['Shipment'].update(self._gso_make_ship_address(to)) - # Automatic insurance at $100.0 - insurance_value = sudoself.get_insurance_value(picking=picking) - if insurance_value: - request_body['Shipment']['SignatureCode'] = 'SIG_REQD' - if insurance_value > 100.0: - # Documentation says to set DeclaredValue ONLY if over $100.00 - request_body['Shipment']['DeclaredValue'] = insurance_value - cost = 0.0 labels = { 'thermal': [], @@ -209,6 +201,20 @@ class ProviderGSO(models.Model): if picking_packages: # Every package will be a transaction for package in picking_packages: + # Use Sale Order Number or fall back to Picking + shipment_ref = (picking.sale_id.name if picking.sale_id else picking.name) + '-' + package.name + insurance_value = sudoself.get_insurance_value(picking=picking, package=package) + if insurance_value > 100.0: + # Documentation says to set DeclaredValue ONLY if over $100.00 + request_body['Shipment']['DeclaredValue'] = insurance_value + elif 'DeclaredValue' in request_body['Shipment']: + del request_body['Shipment']['DeclaredValue'] + + if sudoself.get_signature_required(picking=picking, package=package): + request_body['Shipment']['SignatureCode'] = 'SIG_REQD' + else: + request_body['Shipment']['SignatureCode'] = 'SIG_NOT_REQD' + request_body['Shipment']['Weight'] = self._gso_convert_weight(package.shipping_weight) request_body['Shipment'].update(self._gso_get_package_dimensions(package)) request_body['Shipment']['ShipmentReference'] = package.name @@ -227,9 +233,10 @@ class ProviderGSO(models.Model): raise ValidationError(e) elif not package_carriers: # ship the whole picking + shipment_ref = picking.sale_id.name if picking.sale_id else picking.name request_body['Shipment']['Weight'] = self._gso_convert_weight(picking.shipping_weight) request_body['Shipment'].update(self._gso_get_package_dimensions()) - request_body['Shipment']['ShipmentReference'] = picking.name + request_body['Shipment']['ShipmentReference'] = shipment_ref request_body['Shipment']['TrackingNumber'] = self._gso_create_tracking_number(picking.name) try: response = service.post_shipment(request_body) @@ -356,7 +363,7 @@ class ProviderGSO(models.Model): try: service = sudoself._get_gso_service() except HTTPError as e: - _logger.error(e) + # _logger.error(e) return [{ 'success': False, 'price': 0.0, @@ -400,7 +407,7 @@ class ProviderGSO(models.Model): result = service.get_rates_and_transit_time(request_body) # _logger.warn('GSO result:\n%s' % result) except HTTPError as e: - _logger.error(e) + # _logger.error(e) return [{ 'success': False, 'price': 0.0, diff --git a/delivery_hibou/__manifest__.py b/delivery_hibou/__manifest__.py index 72f0f3bb..95ffb712 100644 --- a/delivery_hibou/__manifest__.py +++ b/delivery_hibou/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Delivery Hibou', 'summary': 'Adds underlying pinnings for things like "RMA Return Labels"', - 'version': '12.0.1.1.0', + 'version': '12.0.1.2.0', 'author': "Hibou Corp.", 'category': 'Stock', 'license': 'AGPL-3', diff --git a/delivery_hibou/models/delivery.py b/delivery_hibou/models/delivery.py index 8eefb7e9..9ef9cdf9 100644 --- a/delivery_hibou/models/delivery.py +++ b/delivery_hibou/models/delivery.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from odoo.tools.float_utils import float_compare from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES from odoo.exceptions import UserError @@ -9,6 +10,9 @@ class DeliveryCarrier(models.Model): automatic_insurance_value = fields.Float(string='Automatic Insurance Value', help='Will be used during shipping to determine if the ' 'picking\'s value warrants insurance being added.') + automatic_sig_req_value = fields.Float(string='Automatic Signature Required Value', + help='Will be used during shipping to determine if the ' + 'picking\'s value warrants signature required being added.') procurement_priority = fields.Selection(PROCUREMENT_PRIORITIES, string='Procurement Priority', help='Priority for this carrier. Will affect pickings ' @@ -16,7 +20,7 @@ class DeliveryCarrier(models.Model): # Utility - def get_insurance_value(self, order=None, picking=None): + def get_insurance_value(self, order=None, picking=None, package=None): value = 0.0 if order: if order.order_line: @@ -24,13 +28,34 @@ class DeliveryCarrier(models.Model): else: return value if picking: - value = picking.declared_value() - if picking.require_insurance == 'no': - value = 0.0 - elif picking.require_insurance == 'auto' and self.automatic_insurance_value and self.automatic_insurance_value > value: + value = picking.declared_value(package=package) + if package and not package.require_insurance: value = 0.0 + else: + if picking.require_insurance == 'no': + value = 0.0 + elif picking.require_insurance == 'auto' and self.automatic_insurance_value and self.automatic_insurance_value > value: + value = 0.0 return value + def get_signature_required(self, order=None, picking=None, package=None): + value = 0.0 + if order: + if order.order_line: + value = sum(order.order_line.filtered(lambda l: l.product_id.type != 'service').mapped('price_subtotal')) + else: + return False + if picking: + value = picking.declared_value(package=package) + if package: + return package.require_signature + else: + if picking.require_signature == 'no': + return False + elif picking.require_signature == 'yes': + return True + return self.automatic_sig_req_value and value >= self.automatic_sig_req_value + def get_third_party_account(self, order=None, picking=None): if order and order.shipping_account_id: return order.shipping_account_id @@ -203,9 +228,9 @@ class DeliveryCarrier(models.Model): res = [] for carrier in self: - carrier_packages = packages.filtered(lambda p: not p.carrier_tracking_ref and - (not p.carrier_id or p.carrier_id == carrier) and - p.packaging_id.package_carrier_type in (False, '', 'none', carrier.delivery_type)) + carrier_packages = packages and packages.filtered(lambda p: not p.carrier_tracking_ref and + (not p.carrier_id or p.carrier_id == carrier) and + p.packaging_id.package_carrier_type in (False, '', 'none', carrier.delivery_type)) if packages and not carrier_packages: continue if hasattr(carrier, '%s_rate_shipment_multi' % self.delivery_type): @@ -244,3 +269,57 @@ class DeliveryCarrier(models.Model): }) return getattr(self, '%s_cancel_shipment' % self.delivery_type)(pickings) + + +class ChooseDeliveryPackage(models.TransientModel): + _inherit = 'choose.delivery.package' + + package_declared_value = fields.Float(string='Declared Value') + package_require_insurance = fields.Boolean(string='Require Insurance') + package_require_signature = fields.Boolean(string='Require Signature') + + @api.model + def default_get(self, fields_list): + defaults = super().default_get(fields_list) + if 'package_declared_value' in fields_list: + if self.env.context.get('default_picking_id'): + picking_id = self.env.context.get('default_picking_id') + package_id = self.env.context.get('default_stock_quant_package_id') + picking = self.env['stock.picking'].browse(picking_id) + move_line_ids = picking.move_line_ids.filtered(lambda m: + float_compare(m.qty_done, 0.0, precision_rounding=m.product_uom_id.rounding) > 0 + and (not m.result_package_id or m.result_package_id.id == package_id) + ) + total_value = 0.0 + for ml in move_line_ids: + qty = ml.product_uom_id._compute_quantity(ml.qty_done, ml.product_id.uom_id) + total_value += qty * ml.product_id.standard_price + defaults['package_declared_value'] = total_value + elif self.env.context.get('default_stock_quant_package_id'): + stock_quant_package = self.env['stock.quant.package'].browse(self.env.context['default_stock_quant_package_id']) + defaults['package_declared_value'] = stock_quant_package.declared_value + return defaults + + @api.onchange('package_declared_value') + def _onchange_package_declared_value(self): + picking_id = self.env.context.get('default_picking_id') + if picking_id: + picking = self.env['stock.picking'].browse(picking_id) + value = self.package_declared_value + if picking.require_insurance == 'auto': + self.package_require_insurance = value and picking.carrier_id.automatic_insurance_value and value >= picking.carrier_id.automatic_insurance_value + else: + self.package_require_insurance = picking.require_insurance == 'yes' + if picking.require_signature == 'auto': + self.package_require_signature = value and picking.carrier_id.automatic_sig_req_value and value >= picking.carrier_id.automatic_sig_req_value + else: + self.package_require_signature = picking.require_signature == 'yes' + + def put_in_pack(self): + super().put_in_pack() + if self.stock_quant_package_id: + self.stock_quant_package_id.write({ + 'declared_value': self.package_declared_value, + 'require_insurance': self.package_require_insurance, + 'require_signature': self.package_require_signature, + }) diff --git a/delivery_hibou/models/stock.py b/delivery_hibou/models/stock.py index d7e95137..d072195a 100644 --- a/delivery_hibou/models/stock.py +++ b/delivery_hibou/models/stock.py @@ -7,15 +7,16 @@ class StockQuantPackage(models.Model): carrier_id = fields.Many2one('delivery.carrier', string='Carrier') carrier_tracking_ref = fields.Char(string='Tracking Reference') + require_insurance = fields.Boolean(string='Require Insurance') + require_signature = fields.Boolean(string='Require Signature') + declared_value = fields.Float(string='Declared Value') def _get_active_picking(self): picking_id = self._context.get('active_id') picking_model = self._context.get('active_model') if not picking_id or picking_model != 'stock.picking': - params = self._context.get('params') - if params: - picking_id = params.get('id') - picking_model = params.get('model') + picking_id = self._context.get('picking_active_id') + picking_model = self._context.get('picking_active_model') if not picking_id or picking_model != 'stock.picking': raise UserError('Cannot cancel package other than through shipment/picking.') return self.env['stock.picking'].browse(picking_id) @@ -39,6 +40,12 @@ class StockPicking(models.Model): ('no', 'No'), ], string='Require Insurance', default='auto', help='If your carrier supports it, auto should be calculated off of the "Automatic Insurance Value" field.') + require_signature = fields.Selection([ + ('auto', 'Automatic'), + ('yes', 'Yes'), + ('no', 'No'), + ], string='Require Signature', default='auto', + help='If your carrier supports it, auto should be calculated off of the "Automatic Signature Required Value" field.') package_carrier_tracking_ref = fields.Char(string='Package Tracking Numbers', compute='_compute_package_carrier_tracking_ref') commercial_partner_id = fields.Many2one('res.partner', related='partner_id.commercial_partner_id') @@ -86,8 +93,10 @@ class StockPicking(models.Model): res = super(StockPicking, self).create(values) return res - def declared_value(self): + def declared_value(self, package=None): self.ensure_one() + if package: + return package.declared_value cost = sum([(l.product_id.standard_price * l.qty_done) for l in self.move_line_ids] or [0.0]) if not cost: # Assume Full Value @@ -131,6 +140,8 @@ class StockPicking(models.Model): tracking_numbers.append(tracking_number) # Try to add tracking to the individual packages. potential_tracking_numbers = tracking_number.split(',') + if len(potential_tracking_numbers) == 1: + potential_tracking_numbers = tracking_number.split('+') # UPS for example... if len(potential_tracking_numbers) >= len(carrier_packages): for t, p in zip(potential_tracking_numbers, carrier_packages): p.carrier_tracking_ref = t diff --git a/delivery_hibou/tests/test_delivery_hibou.py b/delivery_hibou/tests/test_delivery_hibou.py index 95a9e26a..49f49d0f 100644 --- a/delivery_hibou/tests/test_delivery_hibou.py +++ b/delivery_hibou/tests/test_delivery_hibou.py @@ -28,8 +28,10 @@ class TestDeliveryHibou(common.TransactionCase): # Assign values to new Carrier test_insurance_value = 600 + test_sig_req_value = 300 test_procurement_priority = '1' self.carrier.automatic_insurance_value = test_insurance_value + self.carrier.automatic_sig_req_value = test_sig_req_value self.carrier.procurement_priority = test_procurement_priority @@ -71,7 +73,9 @@ class TestDeliveryHibou(common.TransactionCase): def test_carrier_hibou_out(self): test_insurance_value = 4000 + test_sig_req_value = 4000 self.carrier.automatic_insurance_value = test_insurance_value + self.carrier.automatic_sig_req_value = test_sig_req_value picking_out = self.env.ref('stock.outgoing_shipment_main_warehouse') picking_out.action_assign() @@ -88,21 +92,29 @@ class TestDeliveryHibou(common.TransactionCase): # The 'value' is assumed to be all of the product value from the initial demand. self.assertEqual(picking_out.declared_value(), 15.0 * 3300.0) self.assertEqual(picking_out.carrier_id.get_insurance_value(picking=picking_out), picking_out.declared_value()) + self.assertTrue(picking_out.carrier_id.get_signature_required(picking=picking_out)) # Workflow where user explicitly opts out of insurance on the picking level. picking_out.require_insurance = 'no' + picking_out.require_signature = 'no' self.assertEqual(picking_out.carrier_id.get_insurance_value(picking=picking_out), 0.0) + self.assertFalse(picking_out.carrier_id.get_signature_required(picking=picking_out)) picking_out.require_insurance = 'auto' + picking_out.require_signature = 'auto' # Lets choose to only delivery one piece at the moment. # This does not meet the minimum on the carrier to have insurance value. picking_out.move_line_ids.qty_done = 1.0 self.assertEqual(picking_out.declared_value(), 3300.0) self.assertEqual(picking_out.carrier_id.get_insurance_value(picking=picking_out), 0.0) + self.assertFalse(picking_out.carrier_id.get_signature_required(picking=picking_out)) # Workflow where user opts in to insurance. picking_out.require_insurance = 'yes' + picking_out.require_signature = 'yes' self.assertEqual(picking_out.carrier_id.get_insurance_value(picking=picking_out), 3300.0) + self.assertTrue(picking_out.carrier_id.get_signature_required(picking=picking_out)) picking_out.require_insurance = 'auto' + picking_out.require_signature = 'auto' # Test with picking having 3rd party account. self.assertEqual(picking_out.carrier_id.get_third_party_account(picking=picking_out), None) @@ -129,9 +141,9 @@ class TestDeliveryHibou(common.TransactionCase): picking_in.carrier_id = self.carrier # This relies heavily on the 'stock' demo data. # Should only have a single move_line_ids and it should not be done at all. - self.assertEqual(picking_in.move_line_ids.mapped('qty_done'), [0.0, 0.0, 0.0]) - self.assertEqual(picking_in.move_line_ids.mapped('product_uom_qty'), [35.0, 10.0, 12.0]) - self.assertEqual(picking_in.move_line_ids.mapped('product_id.standard_price'), [55.0, 35.0, 1700.0]) + self.assertEqual(picking_in.move_line_ids.mapped('qty_done'), [0.0]) + self.assertEqual(picking_in.move_line_ids.mapped('product_uom_qty'), [35.0]) + self.assertEqual(picking_in.move_line_ids.mapped('product_id.standard_price'), [55.0]) self.assertEqual(picking_in.carrier_id._classify_picking(picking=picking_in), 'in') self.assertEqual(picking_in.carrier_id.get_shipper_company(picking=picking_in), diff --git a/delivery_hibou/views/delivery_views.xml b/delivery_hibou/views/delivery_views.xml index 638ef921..a1e4015f 100644 --- a/delivery_hibou/views/delivery_views.xml +++ b/delivery_hibou/views/delivery_views.xml @@ -7,6 +7,7 @@ + @@ -20,6 +21,11 @@ [('product_id', '=', False)] + + + + + diff --git a/delivery_hibou/views/stock_views.xml b/delivery_hibou/views/stock_views.xml index 1f920118..82d24216 100644 --- a/delivery_hibou/views/stock_views.xml +++ b/delivery_hibou/views/stock_views.xml @@ -17,6 +17,9 @@