diff --git a/delivery_fedex_hibou/models/delivery_fedex.py b/delivery_fedex_hibou/models/delivery_fedex.py index 521bea81..9e05dff6 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): @@ -242,7 +244,7 @@ class DeliveryFedex(models.Model): recipient = superself.get_recipient(picking=picking) acc_number = superself._get_fedex_account_number(picking=picking) meter_number = superself._get_fedex_meter_number(picking=picking) - payment_acc_number = superself._get_fedex_payment_account_number() + 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) residential = self._get_fedex_recipient_is_residential(recipient) @@ -712,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_hibou/models/delivery.py b/delivery_hibou/models/delivery.py index dcfb90df..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 @@ -273,36 +274,46 @@ class DeliveryCarrier(models.Model): class ChooseDeliveryPackage(models.TransientModel): _inherit = 'choose.delivery.package' - package_declared_value = fields.Float(string='Declared Value', - default=lambda self: self._default_package_declared_value()) + package_declared_value = fields.Float(string='Declared Value') package_require_insurance = fields.Boolean(string='Require Insurance') package_require_signature = fields.Boolean(string='Require Signature') - def _default_package_declared_value(self): - # guard for install - if not self.env.context.get('active_id'): - return 0.0 - if 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']) - return stock_quant_package.package_declared_value - else: - picking_id = self.env['stock.picking'].browse(self.env.context['active_id']) - move_line_ids = [po for po in picking_id.move_line_ids if po.qty_done > 0 and not po.result_package_id] - total_value = sum([po.qty_done * po.product_id.standard_price for po in move_line_ids]) - return total_value + @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 = self.env['stock.picking'].browse(self.env.context['active_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' + 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() diff --git a/delivery_hibou/models/stock.py b/delivery_hibou/models/stock.py index 1a620b32..3d5dfeb0 100644 --- a/delivery_hibou/models/stock.py +++ b/delivery_hibou/models/stock.py @@ -15,10 +15,8 @@ class StockQuantPackage(models.Model): 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) diff --git a/delivery_hibou/views/stock_views.xml b/delivery_hibou/views/stock_views.xml index a1a53b30..8cbf343c 100644 --- a/delivery_hibou/views/stock_views.xml +++ b/delivery_hibou/views/stock_views.xml @@ -39,12 +39,12 @@