This commit is contained in:
gsinghpal
2026-03-09 23:45:00 -04:00
parent acd3fc455e
commit f81e0cd918
85 changed files with 6085 additions and 126 deletions

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="choose_delivery_carrier_view_form_cp" model="ir.ui.view">
<field name="name">choose.delivery.carrier.form.cp</field>
<field name="model">choose.delivery.carrier</field>
<field name="inherit_id" ref="delivery.choose_delivery_carrier_view_form"/>
<field name="arch" type="xml">
<!-- Hidden state fields (inside the existing group — no layout impact) -->
<xpath expr="//field[@name='delivery_price']" position="after">
<field name="fusion_cp_selected_service" invisible="1"/>
<field name="fusion_cp_dimension_unit_label" invisible="1"/>
<field name="fusion_cp_weight_unit_label" invisible="1"/>
</xpath>
<!-- Hide base "Get rate" button for Canada Post -->
<xpath expr="//button[@name='update_price']" position="attributes">
<attribute name="invisible">delivery_type in ('fixed', 'base_on_rule', 'fusion_canada_post')</attribute>
</xpath>
<!-- "Get Prices" button (inside the Cost / Get-rate row) -->
<xpath expr="//button[@name='update_price']" position="after">
<button name="update_price" type="object"
invisible="delivery_type != 'fusion_canada_post'">
<i class="oi oi-arrow-right me-1"/>Get Prices
</button>
</xpath>
<!--
Full-width sections AFTER the outer <group>.
This avoids them being crammed into the group's
label-field grid and gives them the full dialog width.
-->
<xpath expr="//form/group" position="after">
<!-- ── Package list ── -->
<div invisible="delivery_type != 'fusion_canada_post'"
class="px-3 mt-2">
<span class="o_form_label fw-bold mb-1">Packages</span>
<field name="fusion_cp_package_ids" nolabel="1">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="package_type_id" string="Box Type"/>
<field name="package_length" string="L"/>
<field name="package_width" string="W"/>
<field name="package_height" string="H"/>
<field name="weight" string="Weight"/>
<field name="selected_price" string="Cost"
widget="monetary"
options="{'currency_field': 'currency_id'}"
optional="hide"/>
<field name="currency_id" column_invisible="1"/>
</list>
</field>
</div>
<!-- ── Service selection ── -->
<div invisible="delivery_type != 'fusion_canada_post' or not fusion_cp_rate_ids"
class="px-3 mt-3">
<span class="o_form_label fw-bold mb-1">Select a Service</span>
<field name="fusion_cp_rate_ids" nolabel="1">
<list create="0" delete="0" no_open="1"
decoration-bf="is_selected"
decoration-success="is_selected">
<field name="is_selected" column_invisible="1"/>
<field name="service_name" string="Service"/>
<field name="price" string="Shipping Cost"
widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="currency_id" column_invisible="1"/>
<field name="expected_delivery"
string="Expected Delivery"/>
<button name="action_select" type="object"
string="Select"
class="btn-sm btn-link"
icon="fa-circle-o"
invisible="is_selected"/>
<button name="action_select" type="object"
string="Selected"
class="btn-sm btn-primary"
icon="fa-check-circle"
invisible="not is_selected"/>
</list>
</field>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="delivery_carrier_form_view_fusion_canada_post" model="ir.ui.view">
<field name="name">delivery.carrier.form.view.fusion.canada.post</field>
<field name="model">delivery.carrier</field>
<field name="inherit_id" ref="delivery.view_delivery_carrier_form"/>
<field name="arch" type="xml">
<!-- Rename "Get Rate" → "Get Prices" on the Integration Level radio -->
<xpath expr="//field[@name='integration_level']" position="attributes">
<attribute name="invisible">delivery_type == 'fusion_canada_post'</attribute>
</xpath>
<xpath expr="//field[@name='integration_level']" position="after">
<field name="integration_level"
invisible="delivery_type != 'fusion_canada_post'"
widget="radio"
options="{'horizontal': true}"
help="Get Prices: only fetch shipping prices on sale orders. Get Prices and Create Shipment: also generate labels and tracking when the delivery order is validated."/>
</xpath>
<xpath expr="//page[@name='destination']" position='before'>
<page string="Configuration" name="configuration" invisible="delivery_type != 'fusion_canada_post'">
<group string="API Credentials"
invisible="delivery_type != 'fusion_canada_post'">
<group>
<field name="username" string="API Key"
required="delivery_type == 'fusion_canada_post'"
help="API key from the Canada Post Developer Program."/>
<field name="password" string="API Password" password="True"
required="delivery_type == 'fusion_canada_post'"
help="API password from the Canada Post Developer Program."/>
<field name="customer_number" required="delivery_type == 'fusion_canada_post'"
help="Your Canada Post customer number (mailed-by number)."/>
</group>
<group>
<field name="fusion_cp_type" string="Account Type"
required="delivery_type == 'fusion_canada_post'"/>
<field name="fusion_cp_contract_id" required="fusion_cp_type == 'commercial'"
invisible="fusion_cp_type == 'counter'"/>
</group>
</group>
<group>
<group string="Shipping Options">
<field name="service_type" string="Default Service"
required="delivery_type == 'fusion_canada_post'"
help="Default shipping service. Users can choose a different service when adding shipping to a sale order."/>
<field name="option_code" string="Shipping Option"/>
<field name="reason_for_export"/>
<field name="product_packaging_id"
help="Optional default package type. Dimensions will pre-fill in the shipping wizard but can be overridden per shipment."
/>
<field name="fusion_cp_dimension_unit"
required="delivery_type == 'fusion_canada_post'"
help="Unit for package dimensions. Values are automatically converted to centimetres for the Canada Post API."/>
</group>
<group string="Payment &amp; Tracking">
<field
name="fusion_cp_payment_method"
string="Payment Method"
required="delivery_type == 'fusion_canada_post'"
/>
<field name="tracking_link"
help="Custom tracking URL. Leave blank to use the default Canada Post tracking page."/>
</group>
</group>
<group string="Label Settings"
invisible="delivery_type != 'fusion_canada_post'">
<group>
<field name="fusion_cp_output_format"
required="delivery_type == 'fusion_canada_post'"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,266 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Search View -->
<record id="view_fusion_cp_shipment_search" model="ir.ui.view">
<field name="name">fusion.cp.shipment.search</field>
<field name="model">fusion.cp.shipment</field>
<field name="arch" type="xml">
<search string="Search Shipments">
<field name="name"/>
<field name="tracking_number"/>
<field name="shipment_id"/>
<field name="sale_order_id"/>
<field name="picking_id"/>
<field name="recipient_name"/>
<filter name="filter_confirmed" string="Confirmed"
domain="[('status','=','confirmed')]"/>
<filter name="filter_shipped" string="Shipped"
domain="[('status','=','shipped')]"/>
<filter name="filter_delivered" string="Delivered"
domain="[('status','=','delivered')]"/>
<filter name="filter_cancelled" string="Cancelled"
domain="[('status','=','cancelled')]"/>
<group>
<filter name="group_status" string="Status"
context="{'group_by': 'status'}"/>
<filter name="group_service" string="Service Type"
context="{'group_by': 'service_type'}"/>
<filter name="group_date" string="Shipment Date"
context="{'group_by': 'shipment_date:month'}"/>
</group>
</search>
</field>
</record>
<!-- List View -->
<record id="view_fusion_cp_shipment_list" model="ir.ui.view">
<field name="name">fusion.cp.shipment.list</field>
<field name="model">fusion.cp.shipment</field>
<field name="arch" type="xml">
<list string="Canada Post Shipments" default_order="shipment_date desc">
<field name="name" decoration-bf="1"/>
<field name="tracking_number"/>
<field name="recipient_name"/>
<field name="sale_order_id" optional="show"/>
<field name="picking_id" optional="show"/>
<field name="service_type"/>
<field name="shipping_cost" sum="Total Cost"/>
<field name="weight" optional="hide"/>
<field name="package_name" optional="hide"/>
<field name="shipment_date"/>
<field name="status"
decoration-info="status == 'draft'"
decoration-success="status in ('confirmed','shipped')"
decoration-bf="status == 'delivered'"
decoration-danger="status == 'cancelled'"
widget="badge"/>
</list>
</field>
</record>
<!-- Form View -->
<record id="view_fusion_cp_shipment_form" model="ir.ui.view">
<field name="name">fusion.cp.shipment.form</field>
<field name="model">fusion.cp.shipment</field>
<field name="arch" type="xml">
<form string="Canada Post Shipment">
<header>
<button name="action_refresh_tracking" type="object"
string="Refresh Tracking"
class="btn-primary"
icon="fa-refresh"
invisible="not tracking_number or status == 'cancelled'"/>
<button name="action_track_on_canada_post" type="object"
string="Track on Canada Post"
class="btn-secondary"
icon="fa-external-link"
invisible="not tracking_number"/>
<button name="action_void_shipment" type="object"
string="Void Shipment"
class="btn-danger"
icon="fa-ban"
invisible="status in ('cancelled', 'delivered')"
confirm="Are you sure you want to void this shipment? This cannot be undone."/>
<button name="action_reissue_shipment" type="object"
string="Reissue Shipment"
class="btn-warning"
icon="fa-repeat"
invisible="status != 'cancelled'"/>
<field name="status" widget="statusbar"
statusbar_visible="confirmed,shipped,delivered"/>
</header>
<sheet>
<div name="button_box" class="oe_button_box">
<button name="action_open_sale_order" type="object"
class="oe_stat_button" icon="fa-shopping-cart"
invisible="not sale_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Sale Order</span>
</div>
</button>
<button name="action_open_picking" type="object"
class="oe_stat_button" icon="fa-truck"
invisible="not picking_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Transfer</span>
</div>
</button>
<button name="action_refresh_tracking" type="object"
class="oe_stat_button" icon="fa-map-marker"
invisible="not tracking_number">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="tracking_event_count"/>
</span>
<span class="o_stat_text">Events</span>
</div>
</button>
</div>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" readonly="1"/></h1>
</div>
<group>
<group string="Shipment Details">
<field name="tracking_number"/>
<field name="shipment_id"/>
<field name="carrier_id"/>
<field name="service_type"/>
<field name="shipment_date"/>
<field name="shipping_cost"/>
<field name="weight"/>
<field name="package_name"
invisible="not package_name"/>
</group>
<group string="Links">
<field name="sale_order_id"/>
<field name="picking_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<group>
<group string="Sender">
<field name="sender_name"/>
<field name="sender_address"/>
</group>
<group string="Recipient">
<field name="recipient_name"/>
<field name="recipient_address"/>
</group>
</group>
<notebook>
<page string="Labels &amp; Documents" name="labels">
<field name="label_attachment_id" invisible="1"/>
<field name="full_label_attachment_id" invisible="1"/>
<field name="receipt_attachment_id" invisible="1"/>
<field name="commercial_invoice_attachment_id" invisible="1"/>
<group string="Labels">
<span class="o_form_label" invisible="not label_attachment_id">Printable Label (4x6)</span>
<button name="action_view_label" type="object"
class="btn btn-link p-0"
icon="fa-file-pdf-o"
string="Open"
invisible="not label_attachment_id"/>
<span class="o_form_label" invisible="not full_label_attachment_id">Full Label (8.5x11)</span>
<button name="action_view_full_label" type="object"
class="btn btn-link p-0"
icon="fa-file-pdf-o"
string="Open"
invisible="not full_label_attachment_id"/>
</group>
<group string="Documents">
<span class="o_form_label" invisible="not receipt_attachment_id">Receipt</span>
<button name="action_view_receipt" type="object"
class="btn btn-link p-0"
icon="fa-file-pdf-o"
string="Open"
invisible="not receipt_attachment_id"/>
<span class="o_form_label" invisible="not commercial_invoice_attachment_id">Commercial Invoice</span>
<button name="action_view_commercial_invoice" type="object"
class="btn btn-link p-0"
icon="fa-file-pdf-o"
string="Open"
invisible="not commercial_invoice_attachment_id"/>
</group>
</page>
<page string="Tracking History" name="tracking_history">
<group>
<group>
<field name="last_tracking_update"/>
</group>
<group>
<field name="delivery_date"
invisible="status != 'delivered'"/>
</group>
</group>
<field name="tracking_event_ids" readonly="1" nolabel="1">
<list string="Tracking Events"
default_order="event_datetime desc">
<field name="event_datetime" string="Date/Time"/>
<field name="event_description"/>
<field name="event_site" string="Location"/>
<field name="event_province"/>
<field name="signatory_name" optional="hide"/>
<field name="event_type" optional="hide"/>
</list>
</field>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- Kanban View -->
<record id="view_fusion_cp_shipment_kanban" model="ir.ui.view">
<field name="name">fusion.cp.shipment.kanban</field>
<field name="model">fusion.cp.shipment</field>
<field name="arch" type="xml">
<kanban default_group_by="status" class="o_kanban_small_column">
<field name="name"/>
<field name="tracking_number"/>
<field name="status"/>
<field name="shipping_cost"/>
<field name="shipment_date"/>
<field name="recipient_name"/>
<field name="service_type"/>
<templates>
<t t-name="card">
<div class="oe_kanban_details">
<strong><field name="name"/></strong>
<div><field name="recipient_name"/></div>
<div class="text-muted">
<i class="fa fa-barcode"/> <field name="tracking_number"/>
</div>
<div class="text-muted">
<field name="service_type"/> |
<field name="shipment_date" widget="date"/>
</div>
<div>
<strong>$<field name="shipping_cost"/></strong>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Window Action -->
<record id="action_fusion_cp_shipment" model="ir.actions.act_window">
<field name="name">Shipments</field>
<field name="res_model">fusion.cp.shipment</field>
<field name="view_mode">list,form,kanban</field>
<field name="search_view_id" ref="view_fusion_cp_shipment_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No shipments yet
</p>
<p>Shipments are created automatically when you validate a delivery
order with a Canada Post carrier.</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Top-level app menu -->
<menuitem id="menu_fusion_cp_root"
name="Canada Post"
web_icon="fusion_canada_post,static/description/icon.png"
sequence="85"/>
<!-- Shipments -->
<menuitem id="menu_fusion_cp_shipments"
name="Shipments"
parent="menu_fusion_cp_root"
action="action_fusion_cp_shipment"
sequence="10"/>
<!-- Configuration parent -->
<menuitem id="menu_fusion_cp_config"
name="Configuration"
parent="menu_fusion_cp_root"
sequence="90"/>
<!-- Carrier Settings action -->
<record id="action_fusion_cp_carrier_settings" model="ir.actions.act_window">
<field name="name">Canada Post Carrier</field>
<field name="res_model">delivery.carrier</field>
<field name="view_mode">list,form</field>
<field name="domain">[('delivery_type', '=', 'fusion_canada_post')]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Configure your Canada Post carrier
</p>
</field>
</record>
<menuitem id="menu_fusion_cp_carrier"
name="Carrier Settings"
parent="menu_fusion_cp_config"
action="action_fusion_cp_carrier_settings"
sequence="10"/>
</odoo>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_fusion_cp" model="ir.ui.view">
<field name="name">res.config.settings.view.form.fusion.canada.post</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//form" position="inside">
<app data-string="Canada Post" string="Canada Post"
name="fusion_canada_post">
<block title="Carrier Configuration" name="carrier_config_block">
<setting string="Canada Post Carrier Settings"
help="Configure your Canada Post API credentials, service types, label format, and shipping preferences.">
<div class="content-group">
<div class="mt8">
<button name="%(fusion_canada_post.action_fusion_cp_carrier_settings)d"
type="action"
class="btn-link"
icon="oi-arrow-right"
string="Open Carrier Configuration"/>
</div>
</div>
</setting>
<setting string="Shipment History"
help="View and manage all Canada Post shipments, labels, and tracking information.">
<div class="content-group">
<div class="mt8">
<button name="%(fusion_canada_post.action_fusion_cp_shipment)d"
type="action"
class="btn-link"
icon="oi-arrow-right"
string="View Shipments"/>
</div>
</div>
</setting>
</block>
</app>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_order_form_fusion_cp" model="ir.ui.view">
<field name="name">sale.order.form.fusion.cp</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_view_fusion_cp_shipments" type="object"
class="oe_stat_button" icon="fa-plane"
invisible="fusion_cp_shipment_count == 0">
<field name="fusion_cp_shipment_count" widget="statinfo"
string="CP Shipments"/>
</button>
</xpath>
<!-- Show CP package details on the sale order -->
<xpath expr="//group[@name='note_group']" position="before">
<group string="Canada Post Packages"
invisible="not fusion_cp_package_ids"
colspan="6">
<field name="fusion_cp_package_ids" nolabel="1"
colspan="6" readonly="1">
<list create="0" delete="0" no_open="1">
<field name="package_type_id" string="Box Type"
optional="show"/>
<field name="package_length" string="Length"/>
<field name="package_width" string="Width"/>
<field name="package_height" string="Height"/>
<field name="weight" string="Weight"/>
<field name="service_name" string="Service"/>
<field name="price" string="Cost"
widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="currency_id" column_invisible="1"/>
</list>
</field>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_picking_form_fusion_cp" model="ir.ui.view">
<field name="name">stock.picking.form.fusion.cp</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_view_fusion_cp_shipments" type="object"
class="oe_stat_button" icon="fa-plane"
invisible="fusion_cp_shipment_count == 0">
<field name="fusion_cp_shipment_count" widget="statinfo"
string="CP Shipments"/>
</button>
</xpath>
</field>
</record>
</odoo>