C1 duplicate-call detection - Wizard computes duplicate_count + duplicate_repair_ids when partner is picked (open repairs from the configurable window, default 14 days). - Yellow banner with "Open Existing Repair" button to jump to the most recent duplicate so CS can add a note instead of creating a new repair. C5 outstanding-balance warning - Wizard sums posted unpaid account.move.amount_residual across all invoices of the partner. - Red banner shown when balance >= fusion_repairs.outstanding_balance_threshold (default $100) with a "View Invoices" button. C6 quote-only mode - New quote_only boolean on the wizard; passed through the shared intake service. Skips dispatch-task creation for urgent/safety AND for catalogue auto_schedule. Chatter note "Created in Quote Only mode" posted on the resulting repair.order. D2 skills filter on dispatch picker - _pick_dispatch_technician(repair) prefers users whose x_fc_repair_skills Many2many contains the repair's product category. Three-tier preference: 1) intake user if field staff AND has the skill 2) any active field-staff user with the skill 3) any active field-staff user (no skill filter) - last-resort - Logs a warning + skips task creation if no field-staff user exists at all. T1 Open in Maps on technician task - action_open_in_maps() returns ir.actions.act_url to https://www.google.com/maps?q=<URL-encoded address>. Deep-links into Apple Maps / Google Maps native apps on iOS / Android, browser otherwise. - Header button added on the fusion.technician.task form (after the existing buttons) plus a "View Repair" button when x_fc_repair_order_id is set. Verified end-to-end on local westin-v19: Existing repair: RO-202605-06 C1 duplicate_count = 5 (>=1 expected) - last duplicate: RO-202605-06 C5 balance check ran without error (target partner had $0) C6 quote-only repair: RO-202605-07 tech_tasks = 0 (expected 0) D2 picked the only stairlift-skilled field-staff user T1 Maps URL: https://www.google.com/maps?q=15+Fisherman+Dr%2C+Brampton%2C+ON+L7A+1B7%2C+Canad... Bumped to 19.0.1.1.0. Co-authored-by: Cursor <cursoragent@cursor.com>
109 lines
5.8 KiB
XML
109 lines
5.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
|
|
<record id="view_repair_intake_wizard_form" model="ir.ui.view">
|
|
<field name="name">fusion.repair.intake.wizard.form</field>
|
|
<field name="model">fusion.repair.intake.wizard</field>
|
|
<field name="arch" type="xml">
|
|
<form string="New Service Call">
|
|
<sheet>
|
|
<group>
|
|
<group string="Caller / Client">
|
|
<field name="intake_user_id" options="{'no_create': True}"/>
|
|
<field name="partner_id"
|
|
options="{'no_create_edit': False, 'no_quick_create': False}"/>
|
|
<field name="partner_phone" readonly="1" invisible="not partner_id"/>
|
|
</group>
|
|
</group>
|
|
|
|
<!-- C1: duplicate-call detection banner -->
|
|
<div class="alert alert-warning d-flex justify-content-between align-items-center"
|
|
role="alert"
|
|
invisible="duplicate_count == 0">
|
|
<div>
|
|
<i class="fa fa-exclamation-triangle me-1"/>
|
|
<strong>Open repair already exists for this client</strong>
|
|
(<field name="duplicate_count" nolabel="1" readonly="1" class="d-inline"/> in last 14 days).
|
|
Consider adding a note to the existing repair instead.
|
|
</div>
|
|
<button name="action_open_existing_repair"
|
|
type="object"
|
|
string="Open Existing Repair"
|
|
class="btn btn-sm btn-warning"/>
|
|
</div>
|
|
<field name="duplicate_repair_ids" invisible="1"/>
|
|
|
|
<!-- C5: outstanding-balance warning banner -->
|
|
<div class="alert alert-danger d-flex justify-content-between align-items-center"
|
|
role="alert"
|
|
invisible="not show_outstanding_warning">
|
|
<div>
|
|
<i class="fa fa-money me-1"/>
|
|
<strong>Outstanding balance:</strong>
|
|
<field name="outstanding_balance" widget="monetary" nolabel="1" readonly="1" class="d-inline"/>
|
|
across <field name="outstanding_invoice_count" nolabel="1" readonly="1" class="d-inline"/> invoice(s).
|
|
Worth mentioning during this call.
|
|
</div>
|
|
<button name="action_view_outstanding_invoices"
|
|
type="object"
|
|
string="View Invoices"
|
|
class="btn btn-sm btn-danger"/>
|
|
</div>
|
|
|
|
<separator string="Equipment Items (one repair per item)"/>
|
|
<field name="equipment_ids">
|
|
<list editable="bottom">
|
|
<field name="sequence" widget="handle"/>
|
|
<field name="repair_category_id" options="{'no_create': True}"/>
|
|
<field name="product_id" optional="show"/>
|
|
<field name="lot_id" optional="hide"/>
|
|
<field name="third_party" optional="show"/>
|
|
<field name="urgency" widget="badge"
|
|
decoration-success="urgency == 'normal'"
|
|
decoration-warning="urgency == 'urgent'"
|
|
decoration-danger="urgency == 'safety'"/>
|
|
<field name="issue_summary"/>
|
|
<field name="scheduled_date" optional="hide"/>
|
|
</list>
|
|
<form>
|
|
<group>
|
|
<group>
|
|
<field name="repair_category_id" options="{'no_create': True}"/>
|
|
<field name="product_id"/>
|
|
<field name="lot_id"/>
|
|
<field name="third_party"/>
|
|
</group>
|
|
<group>
|
|
<field name="urgency"/>
|
|
<field name="scheduled_date"/>
|
|
<field name="intake_template_id" options="{'no_create': True}"/>
|
|
</group>
|
|
</group>
|
|
<field name="issue_summary"
|
|
placeholder="One-line summary (e.g. 'stairlift stops halfway up')"/>
|
|
<field name="issue_category"
|
|
placeholder="Symptom tag (e.g. battery, motor, remote)"/>
|
|
<field name="internal_notes" placeholder="Internal notes"/>
|
|
<separator string="Photos / Videos"/>
|
|
<field name="photo_ids" widget="many2many_binary"/>
|
|
</form>
|
|
</field>
|
|
<!-- C6: quote-only mode -->
|
|
<separator string="Options"/>
|
|
<group>
|
|
<field name="quote_only"/>
|
|
</group>
|
|
</sheet>
|
|
<footer>
|
|
<button string="Submit"
|
|
name="action_submit"
|
|
type="object"
|
|
class="btn-primary"/>
|
|
<button string="Cancel" class="btn-secondary" special="cancel"/>
|
|
</footer>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
</odoo>
|