feat(fusion_shipping): UPS bill-receiver clarity + controllable commercial invoice
- Relabel UPS 'Bill My Account' -> "Bill recipient's UPS account" with clear help (it bills the customer's own UPS account; $0 shipping line; falls back to Bill Shipper when the customer has no account on file). - Improve the customer 'UPS Account Number' field help (stored per-customer, auto-recalled at ship time for Bill Receiver). - Add ups_rest_documentation_type setting (No / UPS commercial invoice) on the UPS REST carrier, mirroring FedEx. Default 'invoice' preserves the existing auto-generate-on-international behaviour; gate require_invoice on it so it can be turned off. Surfaced on the UPS REST config page. Validated live on entech (UPS production): CA->US shipment generated the label + a 60KB commercial invoice PDF (country of origin auto = CA, HS code applied), then voided. Bill Receiver request confirmed accepted by UPS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Fusion Shipping",
|
"name": "Fusion Shipping",
|
||||||
"version": "19.0.1.5.0",
|
"version": "19.0.1.6.0",
|
||||||
"category": "Inventory/Delivery",
|
"category": "Inventory/Delivery",
|
||||||
"summary": "All-in-one shipping integration — Canada Post, UPS, FedEx, DHL Express. "
|
"summary": "All-in-one shipping integration — Canada Post, UPS, FedEx, DHL Express. "
|
||||||
"Live pricing, label generation, shipment tracking, and multi-package support.",
|
"Live pricing, label generation, shipment tracking, and multi-package support.",
|
||||||
|
|||||||
@@ -242,9 +242,12 @@ class DeliveryCarrier(models.Model):
|
|||||||
('EPL', 'EPL'),
|
('EPL', 'EPL'),
|
||||||
('SPL', 'SPL')],
|
('SPL', 'SPL')],
|
||||||
string="UPS Label File Type", default='GIF')
|
string="UPS Label File Type", default='GIF')
|
||||||
ups_bill_my_account = fields.Boolean(string='Bill My Account',
|
ups_bill_my_account = fields.Boolean(string="Bill recipient's UPS account",
|
||||||
help="If checked, ecommerce users will be prompted their UPS account number\n"
|
help="When the customer has a UPS account number on file (set on the "
|
||||||
"and delivery fees will be charged on it.")
|
"customer's contact, Sales & Purchase tab), charge UPS shipping to "
|
||||||
|
"THEIR account instead of yours (UPS 'Bill Receiver'). The shipping "
|
||||||
|
"line on the order is set to $0 since the customer pays. Customers "
|
||||||
|
"with no account on file are billed to your account at the normal rate.")
|
||||||
ups_saturday_delivery = fields.Boolean(string='UPS Saturday Delivery',
|
ups_saturday_delivery = fields.Boolean(string='UPS Saturday Delivery',
|
||||||
help='This value added service will allow you to ship the package on saturday also.')
|
help='This value added service will allow you to ship the package on saturday also.')
|
||||||
ups_cod_funds_code = fields.Selection(selection=[
|
ups_cod_funds_code = fields.Selection(selection=[
|
||||||
@@ -261,6 +264,16 @@ class DeliveryCarrier(models.Model):
|
|||||||
ups_access_token = fields.Char(string='UPS Access Token', groups="base.group_system")
|
ups_access_token = fields.Char(string='UPS Access Token', groups="base.group_system")
|
||||||
ups_default_packaging_id = fields.Many2one('stock.package.type', string='UPS Package Type')
|
ups_default_packaging_id = fields.Many2one('stock.package.type', string='UPS Package Type')
|
||||||
ups_require_signature = fields.Boolean("Require Signature")
|
ups_require_signature = fields.Boolean("Require Signature")
|
||||||
|
ups_rest_documentation_type = fields.Selection(
|
||||||
|
[('none', 'No'),
|
||||||
|
('invoice', 'UPS commercial invoice (paperless if account enrolled)')],
|
||||||
|
string='Generate customs invoice', default='invoice',
|
||||||
|
help="For international shipments, have UPS generate the commercial invoice "
|
||||||
|
"from the order data (UPS 'International Forms') and attach the PDF to the "
|
||||||
|
"delivery. If your UPS account is enrolled in Paperless Invoice, UPS also "
|
||||||
|
"submits it electronically to customs/the recipient (and you avoid UPS's "
|
||||||
|
"paper-invoice surcharge). Requires an HS code and country of origin on the "
|
||||||
|
"shipped products. No invoice is generated for domestic shipments.")
|
||||||
|
|
||||||
# ══════════════════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════════════════
|
||||||
# FEDEX SOAP (Legacy) FIELDS
|
# FEDEX SOAP (Legacy) FIELDS
|
||||||
@@ -1892,7 +1905,7 @@ class DeliveryCarrier(models.Model):
|
|||||||
currency_code = picking.sale_id.currency_id.name
|
currency_code = picking.sale_id.currency_id.name
|
||||||
|
|
||||||
shipment_info = {
|
shipment_info = {
|
||||||
'require_invoice': picking._should_generate_commercial_invoice(),
|
'require_invoice': (self.ups_rest_documentation_type != 'none') and picking._should_generate_commercial_invoice(),
|
||||||
'invoice_date': fields.Date.today().strftime('%Y%m%d'),
|
'invoice_date': fields.Date.today().strftime('%Y%m%d'),
|
||||||
'description': picking.origin or picking.name,
|
'description': picking.origin or picking.name,
|
||||||
'total_qty': sum(sml.quantity for sml in picking.move_line_ids),
|
'total_qty': sum(sml.quantity for sml in picking.move_line_ids),
|
||||||
|
|||||||
@@ -7,5 +7,8 @@ class ResPartner(models.Model):
|
|||||||
property_ups_carrier_account = fields.Char(
|
property_ups_carrier_account = fields.Char(
|
||||||
string="UPS Account Number",
|
string="UPS Account Number",
|
||||||
company_dependent=True,
|
company_dependent=True,
|
||||||
help="UPS carrier account number for bill-my-account shipping.",
|
help="The customer's own UPS account number. Stored on the customer and "
|
||||||
|
"recalled automatically when you ship to them with a UPS carrier that "
|
||||||
|
"has \"Bill recipient's UPS account\" enabled -- UPS then bills this "
|
||||||
|
"account for the shipping (UPS 'Bill Receiver') instead of yours.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -120,6 +120,8 @@
|
|||||||
<field name="ups_require_signature"/>
|
<field name="ups_require_signature"/>
|
||||||
<field name="ups_duty_payment" string="Duties paid by"
|
<field name="ups_duty_payment" string="Duties paid by"
|
||||||
required="delivery_type == 'fusion_ups_rest'"/>
|
required="delivery_type == 'fusion_ups_rest'"/>
|
||||||
|
<field name="ups_rest_documentation_type"
|
||||||
|
required="delivery_type == 'fusion_ups_rest'"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
Reference in New Issue
Block a user