feat: separate fusion field service and LTC into standalone modules, update core modules

- fusion_claims: separated field service logic, updated controllers/views
- fusion_tasks: updated task views and map integration
- fusion_authorizer_portal: added page 11 signing, schedule booking, migrations
- fusion_shipping: new standalone shipping module (Canada Post, FedEx, DHL, Purolator)
- fusion_ltc_management: new standalone LTC management module
This commit is contained in:
2026-03-11 16:19:52 +00:00
parent 1f79cdcaaf
commit 431052920e
274 changed files with 52782 additions and 7302 deletions

View File

@@ -32,7 +32,7 @@
<field name="binding_type">report</field>
</record>
<!-- Landscape report - REMOVED FROM MENU (no binding) -->
<!-- Landscape ADP report - also attached to quotation/order emails -->
<record id="action_report_saleorder_landscape" model="ir.actions.report">
<field name="name">Quotation / Order (Landscape - ADP)</field>
<field name="model">sale.order</field>
@@ -40,21 +40,6 @@
<field name="report_name">fusion_claims.report_saleorder_landscape</field>
<field name="report_file">fusion_claims.report_saleorder_landscape</field>
<field name="print_report_name">'%s - %s' % (object.name, object.partner_id.name)</field>
<!-- No binding_model_id - removed from print menu -->
<field name="binding_type">report</field>
<field name="paperformat_id" ref="paperformat_a4_landscape"/>
</record>
<!-- =============================================================== -->
<!-- LTC Repair Order / Quotation Report (Landscape) -->
<!-- =============================================================== -->
<record id="action_report_saleorder_ltc_repair" model="ir.actions.report">
<field name="name">LTC Repair Order / Quotation</field>
<field name="model">sale.order</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">fusion_claims.report_saleorder_ltc_repair</field>
<field name="report_file">fusion_claims.report_saleorder_ltc_repair</field>
<field name="print_report_name">'LTC Repair - %s - %s' % (object.name, object.partner_id.name)</field>
<field name="binding_model_id" ref="sale.model_sale_order"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="paperformat_a4_landscape"/>
@@ -127,19 +112,6 @@
<field name="binding_type">report</field>
</record>
<!-- =============================================================== -->
<!-- Rental Agreement Report -->
<!-- =============================================================== -->
<record id="action_report_rental_agreement" model="ir.actions.report">
<field name="name">Rental Agreement</field>
<field name="model">sale.order</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">fusion_claims.report_rental_agreement</field>
<field name="report_file">fusion_claims.report_rental_agreement</field>
<field name="print_report_name">'Rental Agreement - %s' % object.name</field>
<field name="binding_model_id" ref="sale.model_sale_order"/>
<field name="binding_type">report</field>
</record>
<!-- =============================================================== -->
<!-- Grab Bar Installation Waiver Report -->
@@ -169,6 +141,21 @@
<field name="binding_type">report</field>
</record>
<!-- =============================================================== -->
<!-- Approved Items Report (Landscape) -->
<!-- =============================================================== -->
<record id="action_report_approved_items" model="ir.actions.report">
<field name="name">Approved Items Report</field>
<field name="model">sale.order</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">fusion_claims.report_approved_items</field>
<field name="report_file">fusion_claims.report_approved_items</field>
<field name="print_report_name">'Approved Items - %s - %s' % (object.name, object.partner_id.name)</field>
<field name="binding_model_id" ref="sale.model_sale_order"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="paperformat_a4_landscape"/>
</record>
<!-- =============================================================== -->
<!-- March of Dimes Quotation Report -->
<!-- =============================================================== -->

View File

@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2024-2025 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Claim Assistant product family.
Approved Items Report - Landscape
-->
<odoo>
<template id="report_approved_items">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>
<t t-set="company" t-value="doc.company_id"/>
<t t-set="is_deduction" t-value="doc.x_fc_adp_application_status == 'approved_deduction'"/>
<t t-set="lines" t-value="doc.order_line.filtered(lambda l: l.product_id and l.display_type not in ('line_section', 'line_note'))"/>
<t t-set="has_deduction" t-value="any(l.x_fc_deduction_type and l.x_fc_deduction_type != 'none' for l in lines)"/>
<style>
.fc-ai { font-family: Arial, sans-serif; font-size: 10pt; }
.fc-ai h2 { color: #0066a1; font-size: 16pt; text-align: center; margin: 25px 0 20px 0; }
.fc-ai table { width: 100%; border-collapse: collapse; margin-bottom: 10px; }
.fc-ai table.bordered, .fc-ai table.bordered th, .fc-ai table.bordered td { border: 1px solid #000; }
.fc-ai th { background-color: #0066a1; color: white; padding: 6px 8px; font-weight: bold; font-size: 9pt; }
.fc-ai td { padding: 5px 6px; vertical-align: top; font-size: 9pt; }
.fc-ai .text-center { text-align: center; }
.fc-ai .text-end { text-align: right; }
.fc-ai .info-label { font-weight: bold; background-color: #f5f5f5; width: 18%; }
.fc-ai .alt-row { background-color: #f7fafc; }
.fc-ai .total-row { background-color: #edf2f7; font-weight: bold; }
.fc-ai .status-approved { color: #38a169; font-weight: bold; }
.fc-ai .status-deduction { color: #d69e2e; font-weight: bold; }
</style>
<div class="fc-ai">
<div class="page">
<div style="height: 30px;"></div>
<h2>APPROVED ITEMS REPORT</h2>
<!-- Case Info -->
<table class="bordered" style="margin-bottom: 15px;">
<thead>
<tr>
<th colspan="4">CASE DETAILS</th>
</tr>
</thead>
<tbody>
<tr>
<td class="info-label">Case</td>
<td><t t-esc="doc.name"/></td>
<td class="info-label">Client</td>
<td><t t-esc="doc.partner_id.name"/></td>
</tr>
<tr>
<td class="info-label">Claim Number</td>
<td><t t-esc="doc.x_fc_claim_number or 'N/A'"/></td>
<td class="info-label">Status</td>
<td>
<t t-if="is_deduction">
<span class="status-deduction">Approved with Deduction</span>
</t>
<t t-else="">
<span class="status-approved">Approved</span>
</t>
</td>
</tr>
<tr>
<td class="info-label">Assessment Date</td>
<td>
<t t-if="doc.x_fc_assessment_end_date"><span t-field="doc.x_fc_assessment_end_date" t-options="{'widget': 'date'}"/></t>
<t t-else="">N/A</t>
</td>
<td class="info-label">Approval Date</td>
<td>
<t t-if="doc.x_fc_claim_approval_date"><span t-field="doc.x_fc_claim_approval_date" t-options="{'widget': 'date'}"/></t>
<t t-else="">N/A</t>
</td>
</tr>
<tr>
<td class="info-label">Client Ref 1</td>
<td><t t-esc="doc.x_fc_client_ref_1 or 'N/A'"/></td>
<td class="info-label">Client Ref 2</td>
<td><t t-esc="doc.x_fc_client_ref_2 or 'N/A'"/></td>
</tr>
</tbody>
</table>
<!-- Items Table -->
<table class="bordered">
<thead>
<tr>
<th class="text-center" style="width: 5%;">S/N</th>
<th style="width: 12%;">ADP CODE</th>
<th style="width: 15%;">DEVICE TYPE</th>
<th style="width: 28%;">PRODUCT NAME</th>
<th class="text-end" style="width: 5%;">QTY</th>
<th class="text-end" style="width: 12%;">ADP PORTION</th>
<th class="text-end" style="width: 13%;">CLIENT PORTION</th>
<t t-if="has_deduction">
<th class="text-end" style="width: 10%;">DEDUCTION</th>
</t>
</tr>
</thead>
<tbody>
<t t-set="total_adp" t-value="0"/>
<t t-set="total_client" t-value="0"/>
<t t-set="idx" t-value="0"/>
<t t-foreach="lines" t-as="line">
<t t-set="idx" t-value="idx + 1"/>
<t t-set="total_adp" t-value="total_adp + (line.x_fc_adp_portion or 0)"/>
<t t-set="total_client" t-value="total_client + (line.x_fc_client_portion or 0)"/>
<tr t-attf-class="#{ 'alt-row' if idx % 2 == 0 else '' }">
<td class="text-center"><t t-esc="idx"/></td>
<td><t t-esc="line._get_adp_code_for_report()"/></td>
<td><t t-esc="line._get_adp_device_type()"/></td>
<td><t t-esc="line.product_id.name or '-'"/></td>
<td class="text-end">
<t t-esc="int(line.product_uom_qty) if line.product_uom_qty == int(line.product_uom_qty) else line.product_uom_qty"/>
</td>
<td class="text-end">
$<t t-esc="'%.2f' % (line.x_fc_adp_portion or 0)"/>
</td>
<td class="text-end">
$<t t-esc="'%.2f' % (line.x_fc_client_portion or 0)"/>
</td>
<t t-if="has_deduction">
<td class="text-end">
<t t-if="line.x_fc_deduction_type == 'pct' and line.x_fc_deduction_value">
<t t-esc="'%.0f' % line.x_fc_deduction_value"/>%
</t>
<t t-elif="line.x_fc_deduction_type == 'amt' and line.x_fc_deduction_value">
$<t t-esc="'%.2f' % line.x_fc_deduction_value"/>
</t>
<t t-else="">-</t>
</td>
</t>
</tr>
</t>
<!-- Totals -->
<tr class="total-row">
<td colspan="5" class="text-end" style="border-top: 2px solid #000;">TOTAL</td>
<td class="text-end" style="border-top: 2px solid #000;">
$<t t-esc="'%.2f' % total_adp"/>
</td>
<td class="text-end" style="border-top: 2px solid #000;">
$<t t-esc="'%.2f' % total_client"/>
</td>
<t t-if="has_deduction">
<td style="border-top: 2px solid #000;"></td>
</t>
</tr>
</tbody>
</table>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_ltc_nursing_station_document">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="facility">
<t t-call="web.external_layout">
<div class="page" style="font-size: 11px;">
<h3 class="text-center mb-3">
Equipment Repair Log - <t t-esc="facility.name"/>
</h3>
<p class="text-center text-muted mb-4">
Generated: <t t-esc="context_timestamp(datetime.datetime.now()).strftime('%B %d, %Y')"/>
</p>
<table class="table table-bordered" style="border: 1px solid #000;">
<thead>
<tr style="background-color: #f0f0f0; height: 20px;">
<th style="border: 1px solid #000; width: 5%; text-align: center;">S/N</th>
<th style="border: 1px solid #000; width: 18%;">Client Name</th>
<th style="border: 1px solid #000; width: 8%; text-align: center;">Room #</th>
<th style="border: 1px solid #000; width: 27%;">Issue Description</th>
<th style="border: 1px solid #000; width: 12%; text-align: center;">Reported Date</th>
<th style="border: 1px solid #000; width: 20%;">Resolution</th>
<th style="border: 1px solid #000; width: 10%; text-align: center;">Fixed Date</th>
</tr>
</thead>
<tbody>
<t t-set="counter" t-value="0"/>
<t t-foreach="facility.repair_ids.sorted(key=lambda r: r.issue_reported_date or '', reverse=True)"
t-as="repair">
<t t-set="counter" t-value="counter + 1"/>
<tr style="height: 20px;">
<td style="border: 1px solid #000; text-align: center;">
<t t-esc="counter"/>
</td>
<td style="border: 1px solid #000;">
<t t-esc="repair.display_client_name"/>
</td>
<td style="border: 1px solid #000; text-align: center;">
<t t-esc="repair.room_number"/>
</td>
<td style="border: 1px solid #000; font-size: 10px;">
<t t-esc="repair.issue_description"/>
</td>
<td style="border: 1px solid #000; text-align: center;">
<t t-if="repair.issue_reported_date">
<t t-esc="repair.issue_reported_date" t-options='{"widget": "date"}'/>
</t>
</td>
<td style="border: 1px solid #000; font-size: 10px;">
<t t-esc="repair.resolution_description or ''"/>
</td>
<td style="border: 1px solid #000; text-align: center;">
<t t-if="repair.issue_fixed_date">
<t t-esc="repair.issue_fixed_date" t-options='{"widget": "date"}'/>
</t>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
<template id="report_ltc_repairs_summary_document">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="facility">
<t t-call="web.external_layout">
<div class="page">
<h3 class="text-center mb-3">
Repair Summary - <t t-esc="facility.name"/>
</h3>
<p class="text-center text-muted mb-4">
Total Repairs: <t t-esc="len(facility.repair_ids)"/>
</p>
<h5>Repairs by Stage</h5>
<table class="table table-bordered">
<thead>
<tr>
<th>Stage</th>
<th class="text-end">Count</th>
</tr>
</thead>
<tbody>
<t t-set="stages" t-value="{}"/>
<t t-foreach="facility.repair_ids" t-as="r">
<t t-set="sname" t-value="r.stage_id.name or 'No Stage'"/>
<t t-if="sname not in stages">
<t t-set="_" t-value="stages.__setitem__(sname, 0)"/>
</t>
<t t-set="_" t-value="stages.__setitem__(sname, stages[sname] + 1)"/>
</t>
<t t-foreach="stages" t-as="stage_name">
<tr>
<td><t t-esc="stage_name"/></td>
<td class="text-end"><t t-esc="stages[stage_name]"/></td>
</tr>
</t>
</tbody>
</table>
<h5 class="mt-4">Recent Repairs</h5>
<table class="table table-bordered">
<thead>
<tr>
<th>Reference</th>
<th>Client</th>
<th>Room</th>
<th>Reported</th>
<th>Fixed</th>
<th>Stage</th>
</tr>
</thead>
<tbody>
<t t-foreach="facility.repair_ids.sorted(key=lambda r: r.issue_reported_date or '', reverse=True)[:50]"
t-as="repair">
<tr>
<td><t t-esc="repair.name"/></td>
<td><t t-esc="repair.display_client_name"/></td>
<td><t t-esc="repair.room_number"/></td>
<td><t t-esc="repair.issue_reported_date" t-options='{"widget": "date"}'/></td>
<td><t t-esc="repair.issue_fixed_date" t-options='{"widget": "date"}'/></td>
<td><t t-esc="repair.stage_id.name"/></td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -1,365 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2024-2025 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Claim Assistant product family.
Rental Agreement Document - Compact 2-Page Layout
-->
<odoo>
<template id="report_rental_agreement">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>
<t t-set="company" t-value="doc.company_id"/>
<style>
.fc-rental { font-family: Arial, sans-serif; font-size: 8pt; line-height: 1.3; }
.fc-rental h1 { color: #0066a1; font-size: 14pt; text-align: center; margin: 5px 0 10px 0; }
.fc-rental h2 { color: #0066a1; font-size: 9pt; margin: 6px 0 3px 0; font-weight: bold; }
.fc-rental p { margin: 2px 0; text-align: justify; }
.fc-rental .parties { font-size: 8pt; margin-bottom: 8px; }
.fc-rental .intro { margin-bottom: 8px; font-size: 8pt; }
.fc-rental table { width: 100%; border-collapse: collapse; }
.fc-rental table.bordered, .fc-rental table.bordered th, .fc-rental table.bordered td { border: 1px solid #000; }
.fc-rental th { background-color: #0066a1; color: white; padding: 4px 6px; font-weight: bold; font-size: 8pt; }
.fc-rental td { padding: 3px 5px; vertical-align: top; font-size: 8pt; }
.fc-rental .text-center { text-align: center; }
.fc-rental .info-header { background-color: #f5f5f5; color: #333; font-weight: bold; }
/* Two-column layout for terms */
.fc-rental .terms-container { column-count: 2; column-gap: 20px; margin-top: 10px; }
.fc-rental .term-section { break-inside: avoid; margin-bottom: 8px; }
/* Credit card section - 15% taller */
.fc-rental .cc-section { margin-top: 12px; padding: 12px; border: 2px solid #0066a1; background-color: #f8f9fa; }
.fc-rental .cc-title { font-size: 10pt; font-weight: bold; color: #0066a1; margin-bottom: 10px; text-align: center; }
.fc-rental .cc-box { border: 1px solid #000; display: inline-block; width: 21px; height: 21px; text-align: center; background: white; }
.fc-rental .authorization-text { font-size: 7pt; margin-top: 10px; font-style: italic; }
/* Signature - 40% taller */
.fc-rental .signature-section { margin-top: 15px; }
.fc-rental .signature-box { border: 1px solid #000; padding: 12px; }
.fc-rental .signature-line { border-bottom: 1px solid #000; min-height: 35px; margin-bottom: 5px; }
.fc-rental .signature-label { font-size: 7pt; color: #666; }
</style>
<div class="fc-rental">
<div class="page">
<!-- ============================================================ -->
<!-- PAGE 1: TERMS AND CONDITIONS -->
<!-- ============================================================ -->
<h1>RENTAL AGREEMENT</h1>
<!-- Parties - Compact -->
<div class="parties">
<strong>BETWEEN:</strong> <t t-esc="company.name"/> ("Company")
<strong style="margin-left: 20px;">AND:</strong> <t t-esc="doc.partner_id.name"/> ("Renter")
</div>
<!-- Introduction -->
<div class="intro">
<p><t t-esc="company.name"/> rents to the Renter medical equipment (hospital beds, patient lifts, trapeze, over-bed tables, mobility scooters, electric wheelchairs, manual wheelchairs, stairlifts, ceiling lifts and lift chairs) subject to the terms and conditions set forth in this Rental Agreement.</p>
</div>
<!-- Terms and Conditions in Two Columns -->
<div class="terms-container">
<div class="term-section">
<h2>1. Ownership and Condition of Equipment</h2>
<p>The medical equipment is the property of <t t-esc="company.name"/> and is provided in good condition. The Renter shall return the equipment in the same condition as when received, subject to normal wear and tear. <t t-esc="company.name"/> reserves the right to inspect the equipment upon its return and may repossess it without prior notice if it is being used in violation of this agreement.</p>
</div>
<div class="term-section">
<h2>2. Cancellation Policy</h2>
<p>The Renter may cancel the order before delivery and will be charged twenty-five percent (25%) of the total rental cost. If the order is canceled during the rental period after delivery, no refund will be provided.</p>
</div>
<div class="term-section">
<h2>3. Security Deposit</h2>
<p>The security deposit will be returned after an inspection of the equipment. If the equipment has any damage, the cost of repairs will be deducted from the security deposit. If the security deposit is insufficient to cover the damages, the credit card on file will be charged for the remaining amount. Security deposit refunds may take 4 to 15 business days to process. <t t-esc="company.name"/> is not responsible for delays caused by the Renter's financial institution.</p>
</div>
<div class="term-section">
<h2>4. Liability for Loss or Damage</h2>
<p><t t-esc="company.name"/> shall not be liable for any loss of or damage to property left, lost, damaged, stolen, stored, or transported by the Renter or any other person using the medical equipment. The Renter assumes all risks associated with such loss or damage and waives any claims against <t t-esc="company.name"/>. The Renter agrees to defend, indemnify, and hold <t t-esc="company.name"/> harmless against all claims arising from such loss or damage.</p>
</div>
<div class="term-section">
<h2>5. Risk and Liability</h2>
<p>The Renter assumes all risk and liability for any loss, damage, injury, or death resulting from the use or operation of the medical equipment. <t t-esc="company.name"/> is not responsible for any acts or omissions of the Renter or the Renter's agents, servants, or employees.</p>
</div>
<div class="term-section">
<h2>6. Renter Responsibilities</h2>
<p>The Renter is responsible for the full cost of replacement for any damage, loss, theft, or destruction of the medical equipment. <t t-esc="company.name"/> may charge the Renter's credit card for repair or replacement costs as deemed necessary. The equipment must not be used by individuals under the age of 18, under the influence of intoxicants or narcotics, or in an unsafe manner.</p>
</div>
<div class="term-section">
<h2>7. Indemnification</h2>
<p>The Renter shall indemnify, defend, and hold harmless <t t-esc="company.name"/>, its agents, officers, and employees, from any claims, demands, actions, or causes of action arising from the use or operation of the medical equipment, except where caused by <t t-esc="company.name"/>'s gross negligence or willful misconduct.</p>
</div>
<div class="term-section">
<h2>8. Accident Notification</h2>
<p>The Renter must immediately notify <t t-esc="company.name"/> of any accidents, damages, or incidents involving the medical equipment.</p>
</div>
<div class="term-section">
<h2>9. Costs and Expenses</h2>
<p>The Renter agrees to cover all costs, expenses, and attorney's fees incurred by <t t-esc="company.name"/> in collecting overdue payments, recovering possession of the equipment, or enforcing claims for damage or loss.</p>
</div>
<div class="term-section">
<h2>10. Independent Status</h2>
<p>The Renter or any driver of the equipment shall not be considered an agent or employee of <t t-esc="company.name"/>.</p>
</div>
<div class="term-section">
<h2>11. Binding Obligations</h2>
<p>Any individual signing this agreement on behalf of a corporation or other entity shall be personally liable for all obligations under this agreement. This agreement is binding upon the heirs, executors, administrators, and assigns of the Renter.</p>
</div>
<div class="term-section">
<h2>12. Refusal of Service</h2>
<p><t t-esc="company.name"/> reserves the right to refuse rental to any individual or entity at its sole discretion.</p>
</div>
<div class="term-section">
<h2>13. Governing Law</h2>
<p>This Agreement shall be governed by and construed in accordance with the laws of the jurisdiction in which <t t-esc="company.name"/> operates.</p>
</div>
<div class="term-section">
<h2>14. Entire Agreement</h2>
<p>This Agreement constitutes the entire understanding between the parties concerning the rental of medical equipment and supersedes all prior agreements, representations, or understandings, whether written or oral.</p>
</div>
</div>
<!-- ============================================================ -->
<!-- PAGE 2: RENTAL DETAILS, PAYMENT, AND SIGNATURE -->
<!-- ============================================================ -->
<div style="page-break-before: always;"></div>
<h1>RENTAL DETAILS</h1>
<!-- Customer Info and Rental Period Side by Side -->
<table style="width: 100%; margin-bottom: 10px;">
<tr>
<td style="width: 50%; vertical-align: top; padding-right: 10px;">
<table class="bordered" style="width: 100%;">
<tr>
<th colspan="2" class="info-header" style="background-color: #0066a1; color: white;">RENTER INFORMATION</th>
</tr>
<tr>
<td style="width: 35%; font-weight: bold; background-color: #f5f5f5;">Name</td>
<td><t t-esc="doc.partner_id.name"/></td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Address</td>
<td>
<div t-field="doc.partner_shipping_id"
t-options="{'widget': 'contact', 'fields': ['address'], 'no_marker': True}"/>
</td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Phone</td>
<td><t t-esc="doc.partner_id.phone or doc.partner_id.mobile or ''"/></td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Order Ref</td>
<td><t t-esc="doc.name"/></td>
</tr>
</table>
</td>
<td style="width: 50%; vertical-align: top; padding-left: 10px;">
<table class="bordered" style="width: 100%;">
<tr>
<th colspan="2" class="info-header" style="background-color: #0066a1; color: white;">RENTAL PERIOD</th>
</tr>
<tr>
<td style="width: 40%; font-weight: bold; background-color: #f5f5f5;">Start Date</td>
<td>
<t t-if="doc.rental_start_date">
<span t-field="doc.rental_start_date" t-options="{'widget': 'date'}"/>
</t>
<t t-else=""><span style="color: #999;">Not specified</span></t>
</td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Return Date</td>
<td>
<t t-if="doc.rental_return_date">
<span t-field="doc.rental_return_date" t-options="{'widget': 'date'}"/>
</t>
<t t-else=""><span style="color: #999;">Not specified</span></t>
</td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Duration</td>
<td>
<t t-if="doc.duration_days">
<span t-esc="doc.duration_days"/> Day<t t-if="doc.duration_days != 1">s</t>
<t t-if="doc.remaining_hours and doc.remaining_hours > 0">
, <t t-esc="doc.remaining_hours"/> Hr<t t-if="doc.remaining_hours != 1">s</t>
</t>
</t>
<t t-elif="doc.rental_start_date and doc.rental_return_date"><span>Less than 1 day</span></t>
<t t-else=""><span style="color: #999;">Not specified</span></t>
</td>
</tr>
<tr>
<td style="font-weight: bold; background-color: #f5f5f5;">Total Amount</td>
<td><strong><span t-field="doc.amount_total" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></strong></td>
</tr>
</table>
</td>
</tr>
</table>
<!-- Equipment List - Compact -->
<table class="bordered" style="margin-bottom: 10px;">
<thead>
<tr>
<th class="text-center" style="width: 15%;">PRODUCT CODE</th>
<th style="width: 55%;">DESCRIPTION</th>
<th class="text-center" style="width: 15%;">SERIAL #</th>
<th class="text-center" style="width: 15%;">QTY</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.order_line" t-as="line">
<t t-if="not line.display_type">
<tr>
<td class="text-center">
<span t-esc="line.product_id.default_code or ''"/>
</td>
<td>
<t t-if="line.name">
<t t-set="clean_name" t-value="line.name"/>
<t t-if="'] ' in clean_name">
<t t-set="clean_name" t-value="clean_name.split('] ', 1)[1]"/>
</t>
<t t-if="' to ' in clean_name and '\n' in clean_name">
<t t-set="clean_name" t-value="clean_name.split('\n')[0]"/>
</t>
<t t-esc="clean_name"/>
</t>
</td>
<td class="text-center">
<span t-esc="line.x_fc_serial_number or ''"/>
</td>
<td class="text-center">
<span t-esc="int(line.product_uom_qty) if line.product_uom_qty == int(line.product_uom_qty) else line.product_uom_qty"/>
</td>
</tr>
</t>
</t>
</tbody>
</table>
<!-- Credit Card Authorization - Compact -->
<div class="cc-section">
<div class="cc-title">CREDIT CARD PAYMENT AUTHORIZATION</div>
<table style="width: 100%; border: none;">
<tr>
<td style="width: 20%; padding: 5px 4px; border: none;"><strong>Card #:</strong></td>
<td style="padding: 5px 4px; border: none;">
<t t-if="doc.rental_payment_token_id">
<span style="font-size: 14px;">**** **** **** <t t-out="doc._get_card_last_four() or '****'">1234</t></span>
</t>
<t t-else="">
<span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span>
<span style="margin: 0 3px;">-</span>
<span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span>
<span style="margin: 0 3px;">-</span>
<span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span>
<span style="margin: 0 3px;">-</span>
<span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span><span class="cc-box"></span>
</t>
</td>
</tr>
<tr>
<td style="padding: 5px 4px; border: none;"><strong>Exp Date:</strong></td>
<td style="padding: 5px 4px; border: none;">
<span class="cc-box"></span><span class="cc-box"></span>
<span style="margin: 0 2px;">/</span>
<span class="cc-box"></span><span class="cc-box"></span>
<span style="margin-left: 20px;"><strong>CVV:</strong></span>
<span>***</span>
<t t-set="deposit_lines" t-value="doc.order_line.filtered(lambda l: l.is_security_deposit)"/>
<span style="margin-left: 20px;"><strong>Security Deposit:</strong>
<t t-if="deposit_lines">
$<t t-out="'%.2f' % sum(deposit_lines.mapped('price_unit'))">0.00</t>
</t>
<t t-else="">$___________</t>
</span>
</td>
</tr>
<tr>
<td style="padding: 5px 4px; border: none;"><strong>Cardholder:</strong></td>
<td style="padding: 5px 4px; border: none;">
<t t-if="doc.rental_agreement_signer_name">
<span t-out="doc.rental_agreement_signer_name">Name</span>
</t>
<t t-else="">
<div style="border-bottom: 1px solid #000; min-height: 18px; width: 100%;"></div>
</t>
</td>
</tr>
<tr>
<td colspan="2" style="padding: 5px 4px; border: none;">
<strong>Billing Address (if different):</strong>
<div style="border-bottom: 1px solid #000; min-height: 18px; width: 100%; margin-top: 4px;"></div>
</td>
</tr>
</table>
<div class="authorization-text">
<p>I authorize <t t-esc="company.name"/> to charge the credit card indicated in this authorization form according to the terms outlined above. I certify that I am an authorized user of this credit card and will not dispute the payment. By signing this form, I acknowledge that I have read the rental agreement and understand the terms and conditions. I understand that if the rented item is not returned on the agreed return date, additional charges will be incurred. *Payments for monthly rental items will be charged on the re-rental date until the item is returned.</p>
</div>
</div>
<!-- Signature Section - Compact -->
<div class="signature-section">
<div class="signature-box">
<table style="width: 100%; border: none;">
<tr>
<td style="width: 40%; padding: 5px; border: none;">
<div class="signature-label">FULL NAME (PRINT)</div>
<t t-if="doc.rental_agreement_signer_name">
<div style="min-height: 18px; font-size: 14px;" t-out="doc.rental_agreement_signer_name">Name</div>
</t>
<t t-else=""><div class="signature-line"></div></t>
</td>
<td style="width: 40%; padding: 5px; border: none;">
<div class="signature-label">SIGNATURE</div>
<t t-if="doc.rental_agreement_signature">
<img t-att-src="'data:image/png;base64,' + doc.rental_agreement_signature.decode('utf-8') if doc.rental_agreement_signature else ''" style="max-height: 50px; max-width: 100%;"/>
</t>
<t t-else=""><div class="signature-line"></div></t>
</td>
<td style="width: 20%; padding: 5px; border: none;">
<div class="signature-label">DATE</div>
<t t-if="doc.rental_agreement_signed_date">
<div style="min-height: 18px; font-size: 14px;" t-out="doc.rental_agreement_signed_date.strftime('%m/%d/%Y')">Date</div>
</t>
<t t-else=""><div class="signature-line"></div></t>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -285,66 +285,14 @@
</div>
</t>
<!-- Acceptance & Signature Section -->
<div style="margin-top: 25px; border: 2px solid #000; padding: 15px; page-break-inside: avoid;">
<div style="font-weight: bold; font-size: 10pt; text-transform: uppercase; border-bottom: 2px solid #000; padding-bottom: 5px; margin-bottom: 10px;">
Terms of Acceptance
<!-- Signature -->
<t t-if="doc.signature">
<div style="margin-top: 20px; text-align: right;">
<strong>Signature</strong><br/>
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 4cm; max-width: 8cm;"/><br/>
<span t-field="doc.signed_by"/>
</div>
<div style="font-size: 8pt; line-height: 1.4; margin-bottom: 12px;">
By signing this document, the undersigned ("Client") acknowledges and agrees:
<ol style="margin: 5px 0 0 0; padding-left: 18px;">
<li>The Client has reviewed this quotation in its entirety and accepts all items, pricing, terms, and specifications as stated herein.</li>
<li>Upon signing, this quotation becomes a binding Sales Order between the Client and <t t-esc="doc.company_id.name"/>.</li>
<li>Any modifications to this order after acceptance must be submitted in writing and may result in revised pricing, terms, or delivery timelines.</li>
<li>Payment shall be made in accordance with the payment terms specified in this document.</li>
<li t-if="is_adp">For orders funded through the Ontario Assistive Devices Program (ADP), the Client authorizes <t t-esc="doc.company_id.name"/> to submit claims and documentation to ADP on their behalf.</li>
<li>Products are subject to the return and refund policy as outlined in <t t-esc="doc.company_id.name"/>'s standard terms of service.</li>
</ol>
</div>
<t t-if="doc.signature">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 50%; padding: 5px 10px 5px 0; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Client Signature</div>
<div style="min-height: 55px; border-bottom: 1px solid #000; padding: 3px 0;">
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 3cm; max-width: 7cm;"/>
</div>
</td>
<td style="width: 50%; padding: 5px 0 5px 10px; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Printed Name</div>
<div style="min-height: 25px; border-bottom: 1px solid #000; padding: 3px 0; font-size: 11pt; font-weight: bold;">
<span t-field="doc.signed_by"/>
</div>
<div style="margin-top: 12px;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Date &amp; Time of Acceptance</div>
<div style="min-height: 25px; border-bottom: 1px solid #000; padding: 3px 0; font-size: 10pt;">
<span t-field="doc.signed_on" t-options="{'widget': 'datetime'}"/>
</div>
</div>
</td>
</tr>
</table>
</t>
<t t-else="">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 50%; padding: 5px 10px 5px 0; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Client Signature</div>
<div style="min-height: 55px; border-bottom: 1px solid #000;"></div>
</td>
<td style="width: 50%; padding: 5px 0 5px 10px; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Printed Name</div>
<div style="min-height: 25px; border-bottom: 1px solid #000;"></div>
<div style="margin-top: 12px;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Date &amp; Time</div>
<div style="min-height: 25px; border-bottom: 1px solid #000;"></div>
</div>
</td>
</tr>
</table>
</t>
</div>
</t>
</div>
</div>

View File

@@ -1,280 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2024-2026 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Claim Assistant product family.
Landscape LTC Repair Order / Quotation Report Template
-->
<odoo>
<template id="report_saleorder_ltc_repair">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>
<t t-set="repair" t-value="doc.x_fc_ltc_repair_id"/>
<style>
.fc-ltc { font-family: Arial, sans-serif; font-size: 11pt; }
.fc-ltc table { width: 100%; border-collapse: collapse; margin-bottom: 12px; }
.fc-ltc table.bordered, .fc-ltc table.bordered th, .fc-ltc table.bordered td { border: 1px solid #000; }
.fc-ltc th { background-color: #0066a1; color: white; padding: 8px 10px; font-weight: bold; font-size: 10pt; }
.fc-ltc td { padding: 6px 8px; vertical-align: top; font-size: 10pt; }
.fc-ltc .text-center { text-align: center; }
.fc-ltc .text-end { text-align: right; }
.fc-ltc .text-start { text-align: left; }
.fc-ltc .repair-bg { background-color: #e8f5e9; }
.fc-ltc .section-row { background-color: #f0f0f0; font-weight: bold; }
.fc-ltc .note-row { font-style: italic; }
.fc-ltc h2 { color: #0066a1; margin: 10px 0; font-size: 18pt; }
.fc-ltc .info-table td { padding: 8px 12px; font-size: 11pt; }
.fc-ltc .info-table th { background-color: #f5f5f5; color: #333; font-size: 10pt; padding: 6px 12px; }
.fc-ltc .totals-table { border: 1px solid #000; }
.fc-ltc .totals-table td { border: 1px solid #000; padding: 8px 12px; font-size: 11pt; }
.fc-ltc .photo-grid { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 8px; }
.fc-ltc .photo-grid img { max-width: 220px; max-height: 180px; border: 1px solid #ccc; }
.fc-ltc .photo-section { margin-top: 20px; page-break-inside: avoid; }
.fc-ltc .photo-section h3 { color: #0066a1; font-size: 14pt; border-bottom: 2px solid #0066a1; padding-bottom: 4px; }
</style>
<div class="fc-ltc">
<div class="page">
<!-- Document Title -->
<h2 style="text-align: left;">
<span t-if="doc.state in ['draft','sent']">LTC Repair Quotation </span>
<span t-else="">LTC Repair Order </span>
<span t-field="doc.name"/>
</h2>
<!-- Address Table -->
<table class="bordered">
<thead>
<tr>
<th style="width: 50%;">BILLING ADDRESS</th>
<th style="width: 50%;">DELIVERY ADDRESS</th>
</tr>
</thead>
<tbody>
<tr>
<td style="height: 70px; font-size: 12pt;">
<div t-field="doc.partner_invoice_id"
t-options="{'widget': 'contact', 'fields': ['name', 'address'], 'no_marker': True}"/>
</td>
<td style="height: 70px; font-size: 12pt;">
<div t-field="doc.partner_shipping_id"
t-options="{'widget': 'contact', 'fields': ['name', 'address'], 'no_marker': True}"/>
</td>
</tr>
</tbody>
</table>
<!-- Order Info Table -->
<table class="bordered info-table">
<thead>
<tr>
<th>ORDER DATE</th>
<th>SALES REP</th>
<th>VALIDITY</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">
<span t-field="doc.date_order" t-options="{'widget': 'date'}"/>
</td>
<td class="text-center">
<span t-field="doc.user_id"/>
</td>
<td class="text-center">
<span t-field="doc.validity_date"/>
</td>
</tr>
</tbody>
</table>
<!-- LTC Repair Info Table -->
<t t-if="repair">
<table class="bordered info-table">
<thead>
<tr class="repair-bg">
<th style="background-color: #e8f5e9; color: #333;">REPAIR REF</th>
<th style="background-color: #e8f5e9; color: #333;">TECHNICIAN</th>
<th style="background-color: #e8f5e9; color: #333;">REPORTED DATE</th>
<th style="background-color: #e8f5e9; color: #333;">SERIAL #</th>
<th style="background-color: #e8f5e9; color: #333;">LTC LOCATION</th>
<th style="background-color: #e8f5e9; color: #333;">ROOM #</th>
</tr>
</thead>
<tbody>
<tr class="repair-bg">
<td class="text-center">
<span t-esc="repair.name or '-'"/>
</td>
<td class="text-center">
<span t-if="repair.assigned_technician_id"
t-esc="repair.assigned_technician_id.name"/>
<span t-else="">-</span>
</td>
<td class="text-center">
<t t-if="repair.issue_reported_date">
<span t-field="repair.issue_reported_date"/>
</t>
<t t-else="">-</t>
</td>
<td class="text-center">
<span t-esc="repair.product_serial or '-'"/>
</td>
<td class="text-center">
<span t-if="repair.facility_id"
t-esc="repair.facility_id.name"/>
<span t-else="">-</span>
</td>
<td class="text-center">
<span t-esc="repair.room_number or '-'"/>
</td>
</tr>
</tbody>
</table>
</t>
<!-- Order Lines Table -->
<table class="bordered">
<thead>
<tr>
<th class="text-start" style="width: 40%;">DESCRIPTION</th>
<th class="text-center" style="width: 10%;">QTY</th>
<th class="text-center" style="width: 15%;">UNIT PRICE</th>
<th class="text-center" style="width: 15%;">TAX</th>
<th class="text-center" style="width: 20%;">TOTAL</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.order_line" t-as="line">
<!-- Section Header -->
<t t-if="line.display_type == 'line_section'">
<tr class="section-row">
<td colspan="5">
<strong><span t-field="line.name"/></strong>
</td>
</tr>
</t>
<!-- Note Line -->
<t t-elif="line.display_type == 'line_note'">
<tr class="note-row">
<td colspan="5">
<span t-field="line.name"/>
</td>
</tr>
</t>
<!-- Product Line -->
<t t-elif="not line.display_type">
<tr>
<td>
<t t-if="line.name">
<t t-set="clean_name" t-value="line.name"/>
<t t-if="'] ' in line.name">
<t t-set="clean_name" t-value="line.name.split('] ', 1)[1]"/>
</t>
<t t-esc="clean_name"/>
</t>
</td>
<td class="text-center">
<span t-esc="int(line.product_uom_qty) if line.product_uom_qty == int(line.product_uom_qty) else line.product_uom_qty"/>
</td>
<td class="text-end">
<span t-field="line.price_unit" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
</td>
<td class="text-center">
<t t-esc="', '.join([(tax.invoice_label or tax.name) for tax in line.tax_ids]) or 'NO TAX SALE'"/>
</td>
<td class="text-end">
<span t-field="line.price_subtotal" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
</td>
</tr>
</t>
</t>
</tbody>
</table>
<!-- Payment Terms and Totals Row -->
<div class="row" style="margin-top: 15px;">
<div class="col-7">
<t t-if="doc.payment_term_id.note">
<strong>Payment Terms:</strong><br/>
<span t-field="doc.payment_term_id.note"/>
</t>
</div>
<div class="col-5" style="text-align: right;">
<table class="totals-table" style="width: auto; margin-left: auto;">
<tr>
<td style="min-width: 200px;">Subtotal</td>
<td class="text-end" style="min-width: 150px;">
<span t-field="doc.amount_untaxed" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
</td>
</tr>
<tr>
<td>Taxes</td>
<td class="text-end">
<span t-field="doc.amount_tax" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
</td>
</tr>
<tr>
<td><strong>Grand Total</strong></td>
<td class="text-end"><strong>
<span t-field="doc.amount_total" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
</strong></td>
</tr>
</table>
</div>
</div>
<!-- Terms and Conditions -->
<t t-if="doc.note">
<div style="margin-top: 15px;">
<strong>Terms and Conditions:</strong>
<div t-field="doc.note"/>
</div>
</t>
<!-- Before Photos -->
<t t-if="repair and repair.before_photo_ids">
<div class="photo-section">
<h3>Before Photos (Reported Condition)</h3>
<div class="photo-grid">
<t t-foreach="repair.before_photo_ids" t-as="photo">
<img t-att-src="image_data_uri(photo.datas)"
t-att-alt="photo.name"/>
</t>
</div>
</div>
</t>
<!-- After Photos -->
<t t-if="repair and repair.after_photo_ids">
<div class="photo-section">
<h3>After Photos (Completed Repair)</h3>
<div class="photo-grid">
<t t-foreach="repair.after_photo_ids" t-as="photo">
<img t-att-src="image_data_uri(photo.datas)"
t-att-alt="photo.name"/>
</t>
</div>
</div>
</t>
<!-- Signature -->
<t t-if="doc.signature">
<div style="margin-top: 20px; text-align: right;">
<strong>Signature</strong><br/>
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 4cm; max-width: 8cm;"/><br/>
<span t-field="doc.signed_by"/>
</div>
</t>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -203,13 +203,13 @@
<t t-esc="', '.join([(tax.invoice_label or tax.name) for tax in line.tax_ids]) or 'NO TAX'"/>
</td>
<td t-if="is_adp" class="text-end adp-bg">
<span t-field="line.x_fc_adp_portion" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
<span t-field="line.x_fc_adp_portion"/>
</td>
<td t-if="is_adp" class="text-end client-bg">
<span t-field="line.x_fc_client_portion" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
<span t-field="line.x_fc_client_portion"/>
</td>
<td class="text-end">
<span t-field="line.price_subtotal" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
<span t-field="line.price_subtotal"/>
</td>
</tr>
</t>
@@ -230,26 +230,26 @@
<table class="totals-table" style="width: auto; margin-left: auto;">
<tr>
<td style="min-width: 140px;">Subtotal</td>
<td class="text-end" style="min-width: 100px;"><span t-field="doc.amount_untaxed" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></td>
<td class="text-end" style="min-width: 100px;"><span t-field="doc.amount_untaxed"/></td>
</tr>
<tr>
<td>Taxes</td>
<td class="text-end"><span t-field="doc.amount_tax"/></td>
</tr>
<tr>
<td><strong>Total</strong></td>
<td class="text-end"><strong><span t-field="doc.amount_total"/></strong></td>
</tr>
<t t-if="is_adp">
<tr class="adp-bg">
<td><strong>ADP Portion</strong></td>
<td class="text-end"><span t-field="doc.x_fc_adp_portion_total" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></td>
<td><strong>Total ADP Portion</strong></td>
<td class="text-end"><span t-field="doc.x_fc_adp_portion_total"/></td>
</tr>
<tr class="client-bg">
<td><strong>Client Portion</strong></td>
<td class="text-end"><span t-field="doc.x_fc_client_portion_total" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></td>
<td><strong>Total Client Portion</strong></td>
<td class="text-end"><span t-field="doc.x_fc_client_portion_total"/></td>
</tr>
</t>
<tr>
<td>Taxes</td>
<td class="text-end"><span t-field="doc.amount_tax" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></td>
</tr>
<tr style="border-top: 2px solid #000;">
<td><strong>Grand Total</strong></td>
<td class="text-end"><strong><span t-field="doc.amount_total" t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/></strong></td>
</tr>
</table>
</div>
</div>
@@ -262,66 +262,14 @@
</div>
</t>
<!-- Acceptance & Signature Section -->
<div style="margin-top: 25px; border: 2px solid #000; padding: 15px; page-break-inside: avoid;">
<div style="font-weight: bold; font-size: 10pt; text-transform: uppercase; border-bottom: 2px solid #000; padding-bottom: 5px; margin-bottom: 10px;">
Terms of Acceptance
<!-- Signature -->
<t t-if="doc.signature">
<div style="margin-top: 20px; text-align: right;">
<strong>Signature</strong><br/>
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 4cm; max-width: 8cm;"/><br/>
<span t-field="doc.signed_by"/>
</div>
<div style="font-size: 8pt; line-height: 1.4; margin-bottom: 12px;">
By signing this document, the undersigned ("Client") acknowledges and agrees:
<ol style="margin: 5px 0 0 0; padding-left: 18px;">
<li>The Client has reviewed this quotation in its entirety and accepts all items, pricing, terms, and specifications as stated herein.</li>
<li>Upon signing, this quotation becomes a binding Sales Order between the Client and <t t-esc="doc.company_id.name"/>.</li>
<li>Any modifications to this order after acceptance must be submitted in writing and may result in revised pricing, terms, or delivery timelines.</li>
<li>Payment shall be made in accordance with the payment terms specified in this document.</li>
<li t-if="is_adp">For orders funded through the Ontario Assistive Devices Program (ADP), the Client authorizes <t t-esc="doc.company_id.name"/> to submit claims and documentation to ADP on their behalf.</li>
<li>Products are subject to the return and refund policy as outlined in <t t-esc="doc.company_id.name"/>'s standard terms of service.</li>
</ol>
</div>
<t t-if="doc.signature">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 50%; padding: 5px 10px 5px 0; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Client Signature</div>
<div style="min-height: 55px; border-bottom: 1px solid #000; padding: 3px 0;">
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 3cm; max-width: 7cm;"/>
</div>
</td>
<td style="width: 50%; padding: 5px 0 5px 10px; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Printed Name</div>
<div style="min-height: 25px; border-bottom: 1px solid #000; padding: 3px 0; font-size: 11pt; font-weight: bold;">
<span t-field="doc.signed_by"/>
</div>
<div style="margin-top: 12px;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Date &amp; Time of Acceptance</div>
<div style="min-height: 25px; border-bottom: 1px solid #000; padding: 3px 0; font-size: 10pt;">
<span t-field="doc.signed_on" t-options="{'widget': 'datetime'}"/>
</div>
</div>
</td>
</tr>
</table>
</t>
<t t-else="">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 50%; padding: 5px 10px 5px 0; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Client Signature</div>
<div style="min-height: 55px; border-bottom: 1px solid #000;"></div>
</td>
<td style="width: 50%; padding: 5px 0 5px 10px; vertical-align: top;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Printed Name</div>
<div style="min-height: 25px; border-bottom: 1px solid #000;"></div>
<div style="margin-top: 12px;">
<div style="font-size: 7pt; color: #666; text-transform: uppercase; margin-bottom: 3px;">Date &amp; Time</div>
<div style="min-height: 25px; border-bottom: 1px solid #000;"></div>
</div>
</td>
</tr>
</table>
</t>
</div>
</t>
</div>
</div>