Phase 1: core models, security, seed data, and backend views

Implements full Phase 1 of the activeblue_familylaw Odoo 18 module:
- 17 Python models (fl.case, fl.party, fl.child, fl.support.calculation,
  fl.fee.waiver, fl.income.withholding, fl.deadline, fl.hearing,
  fl.deposition, fl.discovery, fl.document, fl.caselaw, fl.analysis,
  fl.ai.engine, fl.argument, fl.statute, fl.issue.tag) + hr.expense extension
- 3 wizard stubs (intake, analysis, generate-packet)
- Security: 4 groups (admin/paralegal/portal-petitioner/portal-respondent)
  + record rules scoping portal users to their own cases
- Seed data: issue tags, FL statutes, FL DCF support schedule, ir.sequence
- 13 backend view XML files with FL 61.30 worksheet, fee waiver
  eligibility banner, DV safety resources, emancipation alerts
- Static CSS/JS stubs for Phase 6 portal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Carlos Garcia
2026-05-04 18:52:04 -04:00
commit 1d52d85a78
46 changed files with 5626 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_analysis_tree" model="ir.ui.view">
<field name="name">fl.analysis.tree</field>
<field name="model">fl.analysis</field>
<field name="arch" type="xml">
<tree string="AI Analyses">
<field name="case_id"/>
<field name="analysis_date"/>
<field name="model_used"/>
<field name="attorney_referral_flag"/>
<field name="confidence_level"/>
<field name="case_complexity"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_fl_analysis_form" model="ir.ui.view">
<field name="name">fl.analysis.form</field>
<field name="model">fl.analysis</field>
<field name="arch" type="xml">
<form string="AI Case Analysis">
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="analysis_date"/>
<field name="model_used"/>
<field name="state"/>
</group>
<group>
<field name="attorney_referral_flag"/>
<field name="confidence_level"/>
<field name="case_complexity"/>
</group>
</group>
<div class="alert alert-danger" role="alert"
attrs="{'invisible': [('attorney_referral_flag', '=', False)]}">
<strong>⚠️ ATTORNEY REFERRAL RECOMMENDED</strong><br/>
<field name="attorney_referral_reason" readonly="1" nolabel="1"/>
</div>
<separator string="Plain English Summary (English)"/>
<field name="plain_english_summary" readonly="1" nolabel="1"/>
<separator string="Plain English Summary (Español)"/>
<field name="plain_english_summary_es" readonly="1" nolabel="1"/>
<separator string="Matched Case Law"/>
<field name="matched_caselaw_ids" widget="many2many_tags" readonly="1" nolabel="1"/>
</sheet>
</form>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,388 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- ══════════════════════════════════════════════════════
FORM VIEW
══════════════════════════════════════════════════════ -->
<record id="view_fl_case_form" model="ir.ui.view">
<field name="name">fl.case.form</field>
<field name="model">fl.case</field>
<field name="arch" type="xml">
<form string="Family Law Case">
<header>
<field name="stage" widget="statusbar"
statusbar_visible="intake,preparation,filed,service_complete,discovery,mediation,hearing_scheduled,order_entered,closed"/>
<button name="action_run_ai_analysis" string="Run AI Analysis"
type="object" class="oe_highlight"
groups="activeblue_familylaw.group_admin,activeblue_familylaw.group_paralegal"/>
<button name="action_open_support_calculator" string="Open Calculator"
type="object"
attrs="{'invisible': [('case_type', 'not in', ['modification','dissolution_children','paternity','custody_modification'])]}"/>
</header>
<!-- Attorney Referral Banner -->
<div class="alert alert-danger" role="alert"
attrs="{'invisible': [('attorney_referral_flag', '=', False)]}">
<strong>⚠️ ATTORNEY REFERRAL RECOMMENDED</strong>
— This case has been flagged as complex or high-risk for pro se representation.
Strongly consider consulting with a family law attorney.
<br/>Legal Services of Greater Miami: (305) 576-0080
</div>
<!-- DV Safety Note -->
<field name="dv_safety_note" widget="html"
attrs="{'invisible': [('domestic_violence_flag', '=', False)]}"/>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="object"
name="action_view_tasks" icon="fa-tasks">
<field string="Tasks" name="task_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="object"
name="action_open_support_calculator" icon="fa-calculator"
attrs="{'invisible': [('case_type', 'not in', ['modification','dissolution_children','paternity','custody_modification'])]}">
<span class="o_stat_text">Calculator</span>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
<h2>
<field name="case_type" options="{'no_create': True}"/>
</h2>
</div>
<group>
<group string="Case Identity">
<field name="court_case_number"
placeholder="e.g. 2025-DR-012345-01"/>
<field name="circuit"/>
<field name="county"/>
<field name="division"/>
<field name="judge_id"/>
</group>
<group string="Key Dates">
<field name="filing_date"/>
<field name="service_date"/>
<field name="last_order_date"
attrs="{'invisible': [('case_type', 'not in', ['modification','alimony_modification','custody_modification'])]}"/>
<field name="marriage_date"
attrs="{'invisible': [('case_type', 'not in', ['dissolution_children','dissolution_no_children','alimony_modification'])]}"/>
<field name="years_of_marriage"
attrs="{'invisible': [('case_type', 'not in', ['dissolution_children','dissolution_no_children','alimony_modification'])]}"/>
<field name="retroactivity_date" readonly="1"/>
</group>
</group>
<notebook>
<!-- TAB 1: Parties & Safety -->
<page string="Parties" name="parties">
<group>
<group string="Petitioner">
<field name="petitioner_id"/>
<field name="petitioner_attorney_id"
placeholder="Leave blank if pro se"/>
<field name="petitioner_fl_resident_since"/>
<field name="residency_warning" readonly="1"
attrs="{'invisible': [('petitioner_fl_resident_since', '=', False)]}"/>
</group>
<group string="Respondent">
<field name="respondent_id"/>
<field name="respondent_attorney_id"/>
<field name="respondent_has_counsel" readonly="1"/>
<field name="respondent_answered"/>
</group>
</group>
<group string="Safety Flags">
<field name="domestic_violence_flag"/>
<field name="dv_injunction_active"
attrs="{'invisible': [('domestic_violence_flag', '=', False)]}"/>
</group>
<separator string="Party Details (Income, Employment, Service)"/>
<field name="party_ids">
<tree string="Parties" editable="bottom">
<field name="partner_id"/>
<field name="role"/>
<field name="employment_type"/>
<field name="gross_monthly_income"/>
<field name="net_monthly_income" readonly="1"/>
<field name="income_imputed"/>
</tree>
</field>
</page>
<!-- TAB 2: Children -->
<page string="Children" name="children"
attrs="{'invisible': [('case_type', 'in', ['dissolution_no_children','alimony_modification'])]}">
<group>
<field name="children_count" readonly="1"/>
<field name="has_minor_children" readonly="1"/>
</group>
<separator string="Parenting Class (FL 61.21)"
attrs="{'invisible': [('parenting_class_required', '=', False)]}"/>
<group attrs="{'invisible': [('parenting_class_required', '=', False)]}">
<group>
<field name="petitioner_parenting_class_done"/>
<field name="petitioner_parenting_class_date"
attrs="{'invisible': [('petitioner_parenting_class_done', '=', False)]}"/>
</group>
<group>
<field name="respondent_parenting_class_done"/>
<field name="respondent_parenting_class_date"
attrs="{'invisible': [('respondent_parenting_class_done', '=', False)]}"/>
</group>
</group>
<field name="parenting_class_warning" readonly="1"
attrs="{'invisible': [('parenting_class_required', '=', False)]}"/>
<separator string="Children on Case"/>
<field name="child_ids">
<tree string="Children" editable="bottom">
<field name="name"/>
<field name="date_of_birth"/>
<field name="age" readonly="1"/>
<field name="emancipation_date" readonly="1"/>
<field name="approaching_emancipation" readonly="1"/>
<field name="emancipated" readonly="1"/>
<field name="support_amount"/>
</tree>
</field>
</page>
<!-- TAB 3: Support & Threshold -->
<page string="Support Calculation" name="support"
attrs="{'invisible': [('case_type', 'not in', ['modification','dissolution_children','paternity','custody_modification'])]}">
<group string="Current Order">
<field name="current_order_amount"/>
<field name="current_order_per_child"/>
<field name="current_order_total" readonly="1"/>
</group>
<group string="FL 61.30 Calculation">
<field name="support_calc_id"/>
<field name="calculated_support" readonly="1"/>
<field name="support_difference" readonly="1"/>
<field name="support_difference_pct" readonly="1"
string="Difference %" widget="percentage"/>
</group>
<group string="Modification Threshold Test (FL 61.30(1)(b))"
attrs="{'invisible': [('case_type', '!=', 'modification')]}">
<field name="threshold_met" readonly="1"/>
<field name="substantial_change_basis"/>
<field name="substantial_change_detail"/>
</group>
<field name="threshold_result" widget="html" readonly="1"
attrs="{'invisible': [('case_type', '!=', 'modification')]}"/>
</page>
<!-- TAB 4: Timesharing -->
<page string="Timesharing" name="timesharing"
attrs="{'invisible': [('case_type', 'not in', ['modification','dissolution_children','paternity','custody_modification'])]}">
<group>
<group>
<field name="timesharing_changed"/>
<field name="petitioner_overnights"/>
<field name="respondent_overnights" readonly="1"/>
<field name="petitioner_timesharing_pct" readonly="1" string="Petitioner %"/>
<field name="substantial_timesharing_applies" readonly="1"/>
</group>
<group>
<field name="mediator_id"/>
</group>
</group>
</page>
<!-- TAB 5: Deadlines -->
<page string="Deadlines" name="deadlines">
<group>
<field name="next_deadline" readonly="1"/>
<field name="next_deadline_label" readonly="1" string="Next Deadline"/>
<field name="overdue_deadline_count" readonly="1"/>
<field name="discovery_cutoff_date" readonly="1"/>
</group>
<field name="deadline_ids">
<tree string="Deadlines" decoration-danger="is_overdue == True"
decoration-warning="days_until_due &lt;= 7 and days_until_due &gt;= 0"
decoration-muted="completed == True">
<field name="name"/>
<field name="deadline_type"/>
<field name="due_date"/>
<field name="days_until_due"/>
<field name="statute_reference"/>
<field name="completed"/>
<field name="is_overdue" readonly="1"/>
</tree>
</field>
</page>
<!-- TAB 6: Hearings, Discovery, Depositions -->
<page string="Hearings" name="hearings">
<field name="next_hearing_date" readonly="1"/>
<field name="hearing_ids">
<tree string="Hearings" editable="bottom">
<field name="name"/>
<field name="hearing_type"/>
<field name="hearing_date"/>
<field name="location"/>
<field name="state"/>
</tree>
</field>
</page>
<!-- TAB 7: AI Analysis -->
<page string="AI Analysis" name="ai">
<group>
<field name="attorney_referral_flag" readonly="1"/>
<field name="fee_waiver_eligible" readonly="1"/>
</group>
<separator string="AI Case Summary (English)"/>
<field name="ai_plain_english" readonly="1" nolabel="1"
placeholder="Run AI Analysis to generate summary"/>
<separator string="AI Case Summary (Español)"/>
<field name="ai_plain_english_es" readonly="1" nolabel="1"/>
<separator string="All Analyses"/>
<field name="analysis_ids">
<tree string="Analyses">
<field name="analysis_date"/>
<field name="model_used"/>
<field name="attorney_referral_flag"/>
<field name="confidence_level"/>
<field name="case_complexity"/>
<field name="state"/>
</tree>
</field>
</page>
<!-- TAB 8: Fee Waiver & Expenses -->
<page string="Fees &amp; Expenses" name="fees">
<group string="Fee Waiver (FL 57.082)">
<field name="fee_waiver_eligible" readonly="1"/>
<field name="fee_waiver_id"/>
<button name="action_create_fee_waiver"
string="Create Fee Waiver Application"
type="object" class="btn-secondary"
attrs="{'invisible': [('fee_waiver_id', '!=', False)]}"/>
</group>
<group string="Post-Order">
<field name="new_order_amount"/>
<field name="new_order_date"/>
<field name="income_withholding_id"/>
</group>
<separator string="Case Expenses"/>
<field name="total_expenses" readonly="1"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<!-- ══════════════════════════════════════════════════════
TREE VIEW
══════════════════════════════════════════════════════ -->
<record id="view_fl_case_tree" model="ir.ui.view">
<field name="name">fl.case.tree</field>
<field name="model">fl.case</field>
<field name="arch" type="xml">
<tree string="Family Law Cases"
decoration-danger="overdue_deadline_count &gt; 0"
decoration-warning="attorney_referral_flag == True">
<field name="name"/>
<field name="case_type"/>
<field name="court_case_number"/>
<field name="petitioner_id"/>
<field name="respondent_id"/>
<field name="stage"/>
<field name="filing_date"/>
<field name="next_deadline"/>
<field name="next_deadline_label" string="Next Deadline"/>
<field name="overdue_deadline_count" string="Overdue"/>
<field name="threshold_met"
attrs="{'invisible': [('case_type', '!=', 'modification')]}"/>
<field name="attorney_referral_flag" widget="boolean_toggle"/>
<field name="domestic_violence_flag" widget="boolean_toggle"/>
</tree>
</field>
</record>
<!-- ══════════════════════════════════════════════════════
SEARCH VIEW
══════════════════════════════════════════════════════ -->
<record id="view_fl_case_search" model="ir.ui.view">
<field name="name">fl.case.search</field>
<field name="model">fl.case</field>
<field name="arch" type="xml">
<search string="Search Cases">
<field name="name" string="Case Reference"/>
<field name="court_case_number"/>
<field name="petitioner_id"/>
<field name="respondent_id"/>
<separator/>
<filter string="Active Cases" name="active"
domain="[('active', '=', True)]"/>
<filter string="Intake" name="stage_intake"
domain="[('stage', '=', 'intake')]"/>
<filter string="Filed" name="stage_filed"
domain="[('stage', '=', 'filed')]"/>
<filter string="Discovery" name="stage_discovery"
domain="[('stage', '=', 'discovery')]"/>
<separator/>
<filter string="Modification Cases" name="type_modification"
domain="[('case_type', '=', 'modification')]"/>
<filter string="Dissolution" name="type_dissolution"
domain="[('case_type', 'in', ['dissolution_children','dissolution_no_children'])]"/>
<separator/>
<filter string="Has Overdue Deadlines" name="overdue"
domain="[('overdue_deadline_count', '&gt;', 0)]"/>
<filter string="Attorney Referral Flagged" name="attorney_referral"
domain="[('attorney_referral_flag', '=', True)]"/>
<filter string="Domestic Violence" name="dv"
domain="[('domestic_violence_flag', '=', True)]"/>
<filter string="Threshold Met" name="threshold_met"
domain="[('threshold_met', '=', True)]"/>
<separator/>
<group expand="0" string="Group By">
<filter string="Stage" name="group_stage" context="{'group_by': 'stage'}"/>
<filter string="Case Type" name="group_type" context="{'group_by': 'case_type'}"/>
<filter string="Filing Date" name="group_date" context="{'group_by': 'filing_date:month'}"/>
</group>
</search>
</field>
</record>
<!-- ══════════════════════════════════════════════════════
ACTIONS
══════════════════════════════════════════════════════ -->
<record id="action_fl_case_list" model="ir.actions.act_window">
<field name="name">Family Law Cases</field>
<field name="res_model">fl.case</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_fl_case_search"/>
<field name="context">{'search_default_active': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No cases yet. Create your first case!
</p>
<p>Use the intake wizard or create a case directly.</p>
</field>
</record>
<!-- Intake Wizard Action -->
<record id="action_fl_intake_wizard" model="ir.actions.act_window">
<field name="name">New Case — Intake</field>
<field name="res_model">fl.intake.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_caselaw_tree" model="ir.ui.view">
<field name="name">fl.caselaw.tree</field>
<field name="model">fl.caselaw</field>
<field name="arch" type="xml">
<tree string="Case Law Library">
<field name="short_name"/>
<field name="year"/>
<field name="court"/>
<field name="favorable_to"/>
<field name="issue_tag_ids" widget="many2many_tags"/>
<field name="superseded_by_2023_reform"/>
</tree>
</field>
</record>
<record id="view_fl_caselaw_form" model="ir.ui.view">
<field name="name">fl.caselaw.form</field>
<field name="model">fl.caselaw</field>
<field name="arch" type="xml">
<form string="Case Law">
<sheet>
<div class="alert alert-warning" role="alert"
attrs="{'invisible': [('superseded_by_2023_reform', '=', False)]}">
<strong>⚠️ NOTE:</strong> This case involves permanent alimony
which was <strong>eliminated by HB 1409 (effective July 1, 2023)</strong>.
Pre-2023 permanent alimony holdings may not apply to new cases.
</div>
<group>
<group>
<field name="short_name"/>
<field name="citation"/>
<field name="court"/>
<field name="year"/>
<field name="favorable_to"/>
</group>
<group>
<field name="statute_ref_ids" widget="many2many_tags"/>
<field name="issue_tag_ids" widget="many2many_tags"/>
<field name="full_text_url" widget="url"/>
<field name="google_scholar_url" widget="url"/>
<field name="superseded_by_2023_reform"/>
<field name="active"/>
</group>
</group>
<group string="Holding">
<field name="holding" nolabel="1"/>
</group>
<group string="Facts Summary">
<field name="facts_summary" nolabel="1"/>
</group>
<group string="Why It Matters for Pro Se Litigants">
<field name="relevance" nolabel="1"/>
</group>
<group string="Plain English (EN)">
<field name="plain_english" nolabel="1"/>
</group>
<group string="Plain English (ES)">
<field name="plain_english_es" nolabel="1"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_fl_caselaw_search" model="ir.ui.view">
<field name="name">fl.caselaw.search</field>
<field name="model">fl.caselaw</field>
<field name="arch" type="xml">
<search string="Search Case Law">
<field name="short_name"/>
<field name="citation"/>
<field name="holding"/>
<field name="issue_tag_ids"/>
<separator/>
<filter string="3rd DCA (Miami-Dade)" name="3rd_dca"
domain="[('court', '=', '3rd_dca')]"/>
<filter string="FL Supreme Court" name="supreme"
domain="[('court', '=', 'fl_supreme')]"/>
<filter string="Petitioner-Favorable" name="petitioner"
domain="[('favorable_to', '=', 'petitioner')]"/>
<filter string="Not Superseded" name="current"
domain="[('superseded_by_2023_reform', '=', False)]"/>
<group expand="0" string="Group By">
<filter string="Court" name="group_court"
context="{'group_by': 'court'}"/>
<filter string="Issue" name="group_issue"
context="{'group_by': 'issue_tag_ids'}"/>
</group>
</search>
</field>
</record>
<record id="action_fl_caselaw_list" model="ir.actions.act_window">
<field name="name">Case Law Library</field>
<field name="res_model">fl.caselaw</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_fl_caselaw_search"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_child_form" model="ir.ui.view">
<field name="name">fl.child.form</field>
<field name="model">fl.child</field>
<field name="arch" type="xml">
<form string="Child">
<div class="alert alert-warning" role="alert"
attrs="{'invisible': [('approaching_emancipation', '=', False)]}">
<strong>⚠️ APPROACHING EMANCIPATION:</strong>
<field name="name" readonly="1"/> turns 18 in
<field name="days_until_emancipation" readonly="1"/> days
(<field name="emancipation_date" readonly="1"/>).
File Motion to Modify 60 days before emancipation.
</div>
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="name"/>
<field name="date_of_birth"/>
<field name="age" readonly="1"/>
<field name="gender"/>
<field name="school"/>
<field name="medical_provider"/>
</group>
<group string="Emancipation">
<field name="emancipation_date" readonly="1"/>
<field name="days_until_emancipation" readonly="1"/>
<field name="approaching_emancipation" readonly="1"/>
<field name="emancipated" readonly="1"/>
<field name="emancipation_alert_sent"/>
</group>
</group>
<group string="Early Emancipation Factors">
<field name="married"/>
<field name="active_military"/>
<field name="declared_emancipated"/>
<field name="emancipation_notes"/>
</group>
<group string="Support Amounts">
<field name="support_amount"/>
<field name="health_insurance_premium"/>
<field name="childcare_cost"/>
<field name="extraordinary_expenses"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_fl_child_tree" model="ir.ui.view">
<field name="name">fl.child.tree</field>
<field name="model">fl.child</field>
<field name="arch" type="xml">
<tree string="Children"
decoration-warning="approaching_emancipation == True"
decoration-muted="emancipated == True">
<field name="name"/>
<field name="date_of_birth"/>
<field name="age"/>
<field name="emancipation_date"/>
<field name="days_until_emancipation"/>
<field name="approaching_emancipation"/>
<field name="emancipated"/>
<field name="support_amount"/>
</tree>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_deadline_tree" model="ir.ui.view">
<field name="name">fl.deadline.tree</field>
<field name="model">fl.deadline</field>
<field name="arch" type="xml">
<tree string="Deadlines"
decoration-danger="is_overdue == True"
decoration-warning="days_until_due &lt;= 7 and days_until_due &gt;= 0 and completed == False"
decoration-muted="completed == True or waived == True">
<field name="case_id"/>
<field name="name"/>
<field name="deadline_type"/>
<field name="due_date"/>
<field name="days_until_due"/>
<field name="statute_reference"/>
<field name="completed"/>
<field name="waived"/>
<field name="is_overdue" readonly="1"/>
</tree>
</field>
</record>
<record id="view_fl_deadline_form" model="ir.ui.view">
<field name="name">fl.deadline.form</field>
<field name="model">fl.deadline</field>
<field name="arch" type="xml">
<form string="Deadline">
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="name"/>
<field name="deadline_type"/>
<field name="due_date"/>
<field name="statute_reference"/>
</group>
<group>
<field name="anchor_date"/>
<field name="offset_days"/>
<field name="days_until_due" readonly="1"/>
<field name="is_overdue" readonly="1"/>
</group>
</group>
<group>
<field name="completed"/>
<field name="completed_date"
attrs="{'invisible': [('completed', '=', False)]}"/>
<field name="waived"/>
</group>
<field name="notes"/>
</sheet>
</form>
</field>
</record>
<record id="action_fl_deadline_list" model="ir.actions.act_window">
<field name="name">Case Deadlines</field>
<field name="res_model">fl.deadline</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('completed', '=', False), ('waived', '=', False)]</field>
<field name="context">{'search_default_group_case': 1}</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_deposition_tree" model="ir.ui.view">
<field name="name">fl.deposition.tree</field>
<field name="model">fl.deposition</field>
<field name="arch" type="xml">
<tree string="Depositions">
<field name="case_id"/>
<field name="deponent_id"/>
<field name="deponent_type"/>
<field name="notice_date"/>
<field name="scheduled_date"/>
<field name="state"/>
<field name="duces_tecum"/>
<field name="income_verified"/>
</tree>
</field>
</record>
<record id="view_fl_deposition_form" model="ir.ui.view">
<field name="name">fl.deposition.form</field>
<field name="model">fl.deposition</field>
<field name="arch" type="xml">
<form string="Deposition">
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="alert alert-info" role="alert">
<strong>FL 1.310(b):</strong> Minimum <strong>10 days notice</strong>
required before deposition.
FL 1.310(d): Maximum <strong>7 hours</strong> per deponent per day.
</div>
<group>
<group>
<field name="case_id"/>
<field name="deponent_id"/>
<field name="deponent_type"/>
<field name="notice_date"/>
<field name="scheduled_date"/>
</group>
<group>
<field name="location"/>
<field name="max_duration_hours"/>
<field name="duces_tecum"/>
</group>
</group>
<group string="Results">
<field name="income_verified"/>
<field name="income_verified_amount"
attrs="{'invisible': [('income_verified', '=', False)]}"/>
<field name="key_findings"/>
</group>
<field name="notes"/>
</sheet>
</form>
</field>
</record>
<record id="action_fl_deposition_list" model="ir.actions.act_window">
<field name="name">Depositions</field>
<field name="res_model">fl.deposition</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_discovery_tree" model="ir.ui.view">
<field name="name">fl.discovery.tree</field>
<field name="model">fl.discovery</field>
<field name="arch" type="xml">
<tree string="Discovery" decoration-danger="state == 'deficient'"
decoration-warning="state == 'served'">
<field name="case_id"/>
<field name="discovery_type"/>
<field name="directed_to"/>
<field name="third_party_id"/>
<field name="served_date"/>
<field name="response_due_date"/>
<field name="response_complete"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_fl_discovery_form" model="ir.ui.view">
<field name="name">fl.discovery.form</field>
<field name="model">fl.discovery</field>
<field name="arch" type="xml">
<form string="Discovery Item">
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="discovery_type"/>
<field name="directed_to"/>
<field name="third_party_id"
attrs="{'invisible': [('directed_to', '!=', 'third_party')]}"/>
<field name="description"/>
</group>
<group>
<field name="served_date"/>
<field name="response_due_date" readonly="1"/>
<field name="response_received_date"/>
<field name="response_complete"/>
</group>
</group>
<group string="Objections / Deficiencies">
<field name="objections_raised"/>
<field name="objection_detail"
attrs="{'invisible': [('objections_raised', '=', False)]}"/>
<field name="deficiency_notice_sent"/>
</group>
<field name="notes"/>
</sheet>
</form>
</field>
</record>
<record id="action_fl_discovery_list" model="ir.actions.act_window">
<field name="name">Discovery</field>
<field name="res_model">fl.discovery</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_fee_waiver_form" model="ir.ui.view">
<field name="name">fl.fee.waiver.form</field>
<field name="model">fl.fee.waiver</field>
<field name="arch" type="xml">
<form string="Fee Waiver Application (FL 57.082)">
<header>
<button name="action_submit" string="Submit to Clerk"
type="object" class="oe_highlight"
attrs="{'invisible': [('state', '!=', 'draft')]}"/>
<button name="action_approve" string="Approved"
type="object"
attrs="{'invisible': [('state', '!=', 'submitted')]}"
groups="activeblue_familylaw.group_admin"/>
<button name="action_deny" string="Denied"
type="object"
attrs="{'invisible': [('state', '!=', 'submitted')]}"
groups="activeblue_familylaw.group_admin"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="alert alert-success" role="alert"
attrs="{'invisible': [('eligible', '=', False)]}">
<strong>✅ ELIGIBLE</strong><field name="eligibility_note" readonly="1" nolabel="1"/>
<br/>This applicant may also qualify for a
<strong>free county mediator</strong> under FL 44.108.
</div>
<div class="alert alert-warning" role="alert"
attrs="{'invisible': [('eligible', '=', True)]}">
<field name="eligibility_note" readonly="1" nolabel="1"/>
</div>
<group>
<group>
<field name="case_id"/>
<field name="party_id"/>
<field name="application_date"/>
</group>
<group string="Household &amp; Income">
<field name="household_size"/>
<field name="monthly_gross_income"/>
<field name="annual_gross_income" readonly="1"/>
</group>
</group>
<group string="FPL Threshold (FL 57.082)">
<field name="fpl_annual" readonly="1" string="100% FPL"/>
<field name="fpl_200pct_threshold" readonly="1" string="200% FPL (Threshold)"/>
<field name="eligible" readonly="1"/>
<field name="mediator_fee_waiver_eligible" readonly="1"/>
</group>
<group string="Outcome"
attrs="{'invisible': [('state', 'in', ['draft', 'submitted'])]}">
<field name="approval_date"
attrs="{'invisible': [('state', '!=', 'approved')]}"/>
<field name="denial_reason"
attrs="{'invisible': [('state', '!=', 'denied')]}"/>
</group>
<field name="notes"/>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="view_fl_fee_waiver_tree" model="ir.ui.view">
<field name="name">fl.fee.waiver.tree</field>
<field name="model">fl.fee.waiver</field>
<field name="arch" type="xml">
<tree string="Fee Waivers">
<field name="case_id"/>
<field name="party_id"/>
<field name="household_size"/>
<field name="monthly_gross_income"/>
<field name="fpl_200pct_threshold"/>
<field name="eligible"/>
<field name="state"/>
</tree>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_hearing_tree" model="ir.ui.view">
<field name="name">fl.hearing.tree</field>
<field name="model">fl.hearing</field>
<field name="arch" type="xml">
<tree string="Hearings">
<field name="case_id"/>
<field name="name"/>
<field name="hearing_type"/>
<field name="hearing_date"/>
<field name="location"/>
<field name="courtroom"/>
<field name="state"/>
<field name="order_entered"/>
</tree>
</field>
</record>
<record id="view_fl_hearing_form" model="ir.ui.view">
<field name="name">fl.hearing.form</field>
<field name="model">fl.hearing</field>
<field name="arch" type="xml">
<form string="Hearing">
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="name"/>
<field name="hearing_type"/>
<field name="hearing_date"/>
</group>
<group>
<field name="location"/>
<field name="courtroom"/>
<field name="judge_id"/>
</group>
</group>
<group string="Outcome">
<field name="order_entered"/>
<field name="outcome"/>
</group>
<field name="notes"/>
</sheet>
</form>
</field>
</record>
<record id="action_fl_hearing_list" model="ir.actions.act_window">
<field name="name">Hearings</field>
<field name="res_model">fl.hearing</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_party_form" model="ir.ui.view">
<field name="name">fl.party.form</field>
<field name="model">fl.party</field>
<field name="arch" type="xml">
<form string="Party Details">
<sheet>
<group>
<group>
<field name="case_id"/>
<field name="partner_id"/>
<field name="role"/>
<field name="preferred_language"/>
</group>
<group string="Employment">
<field name="employment_type"/>
<field name="employer_name"/>
<field name="employer_address"/>
<field name="employer_phone"/>
</group>
</group>
<notebook>
<page string="Income (FL 61.30)">
<group>
<group string="Gross Income">
<field name="gross_monthly_income"/>
</group>
<group string="Statutory Deductions (FL 61.30(3))">
<field name="fed_tax_monthly"/>
<field name="fica_ss_monthly" readonly="1"/>
<field name="fica_medicare_monthly" readonly="1"/>
<field name="mandatory_retirement"/>
<field name="mandatory_union_dues"/>
<field name="health_insurance_self"/>
<field name="other_court_ordered_support"/>
</group>
</group>
<group>
<field name="net_monthly_income" readonly="1"/>
<field name="effective_monthly_income" readonly="1"/>
</group>
<separator string="Income Sources"/>
<field name="income_source_ids">
<tree editable="bottom">
<field name="source_type"/>
<field name="description"/>
<field name="monthly_amount"/>
<field name="verified"/>
<field name="verification_document"/>
</tree>
</field>
</page>
<page string="Income Imputation (FL 61.30(2)(b))">
<group>
<field name="income_imputed"/>
<field name="imputed_amount"
attrs="{'invisible': [('income_imputed', '=', False)]}"/>
<field name="fl_minimum_wage_hourly"/>
<field name="fl_minimum_wage_monthly" readonly="1"/>
<field name="imputation_basis"
attrs="{'invisible': [('income_imputed', '=', False)]}"/>
</group>
<separator string="Lifestyle Analysis (Barner v. Barner)"/>
<group>
<field name="lifestyle_inconsistency_flag"/>
<field name="lifestyle_notes"
attrs="{'invisible': [('lifestyle_inconsistency_flag', '=', False)]}"/>
</group>
</page>
<page string="Service &amp; SSN">
<group>
<group string="Service of Process">
<field name="service_address"/>
<field name="service_method"/>
<field name="process_server_id"
attrs="{'invisible': [('service_method', '!=', 'personal')]}"/>
</group>
<group string="SSN (FL-12.930(a))">
<field name="ssn_last4"/>
<field name="ssn_notice_filed"/>
<field name="ssn_handwritten_confirmed"/>
</group>
</group>
<div class="alert alert-warning" role="alert"
attrs="{'invisible': [('service_method', '!=', 'publication')]}">
<strong>⚠️ Service by Publication</strong> is the most complex
service method and requires a diligent search affidavit.
Attorney representation is strongly recommended.
</div>
</page>
<page string="Portal Access">
<group>
<field name="portal_user_id"/>
<field name="portal_access_granted"/>
<field name="portal_invite_sent"/>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_fl_party_tree" model="ir.ui.view">
<field name="name">fl.party.tree</field>
<field name="model">fl.party</field>
<field name="arch" type="xml">
<tree string="Parties">
<field name="case_id"/>
<field name="partner_id"/>
<field name="role"/>
<field name="employment_type"/>
<field name="gross_monthly_income"/>
<field name="net_monthly_income"/>
<field name="income_imputed"/>
<field name="lifestyle_inconsistency_flag" string="Lifestyle ⚠"/>
</tree>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_fl_statute_tree" model="ir.ui.view">
<field name="name">fl.statute.tree</field>
<field name="model">fl.statute</field>
<field name="arch" type="xml">
<tree string="FL Statute Index">
<field name="name"/>
<field name="title"/>
<field name="category"/>
<field name="active"/>
</tree>
</field>
</record>
<record id="view_fl_statute_form" model="ir.ui.view">
<field name="name">fl.statute.form</field>
<field name="model">fl.statute</field>
<field name="arch" type="xml">
<form string="FL Statute">
<sheet>
<group>
<group>
<field name="name"/>
<field name="title"/>
<field name="category"/>
<field name="active"/>
</group>
<group>
<field name="url" widget="url"/>
</group>
</group>
<field name="description"/>
</sheet>
</form>
</field>
</record>
<record id="view_fl_issue_tag_tree" model="ir.ui.view">
<field name="name">fl.issue.tag.tree</field>
<field name="model">fl.issue.tag</field>
<field name="arch" type="xml">
<tree string="Issue Tags" editable="bottom">
<field name="name"/>
<field name="name_es"/>
<field name="case_type"/>
<field name="color" widget="color_picker"/>
</tree>
</field>
</record>
<record id="action_fl_statute_list" model="ir.actions.act_window">
<field name="name">FL Statute Index</field>
<field name="res_model">fl.statute</field>
<field name="view_mode">tree,form</field>
</record>
<record id="action_fl_issue_tag_list" model="ir.actions.act_window">
<field name="name">Issue Tags</field>
<field name="res_model">fl.issue.tag</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- ══════<E29590><E29590>══════════════════════════════<E29590><E29590>════════════════
FL SUPPORT CALCULATION — FORM
══════════════════════════════════════════════<E29590><E29590><EFBFBD>═══════ -->
<record id="view_fl_support_calc_form" model="ir.ui.view">
<field name="name">fl.support.calculation.form</field>
<field name="model">fl.support.calculation</field>
<field name="arch" type="xml">
<form string="FL 61.30 Child Support Calculation">
<sheet>
<div class="oe_title">
<h1>FL 61.30 Child Support Guidelines Worksheet</h1>
</div>
<group>
<group>
<field name="case_id"/>
<field name="calculation_date"/>
<field name="calculation_type"/>
</group>
<group>
<field name="number_of_children" readonly="1"/>
<field name="notes"/>
</group>
</group>
<separator string="Step 1: Net Monthly Income (FL 61.30(3))"/>
<group>
<group string="Petitioner">
<field name="petitioner_net_income"/>
<field name="petitioner_income_pct" readonly="1" string="Income %"/>
</group>
<group string="Respondent">
<field name="respondent_net_income"/>
<field name="respondent_income_pct" readonly="1" string="Income %"/>
</group>
</group>
<group>
<field name="combined_net_income" readonly="1"/>
</group>
<separator string="Step 2: Basic Support Obligation (Schedule Lookup)"/>
<group>
<field name="basic_support_obligation" readonly="1"/>
<field name="support_schedule_id" readonly="1"/>
<field name="above_schedule" readonly="1"/>
</group>
<separator string="Step 3: Adjustments (FL 61.30(7),(8),(9))"/>
<group>
<group string="Health Insurance (FL 61.30(8))">
<field name="child_health_insurance_total"/>
<field name="health_insurance_by_petitioner"/>
<field name="health_insurance_by_respondent"/>
</group>
<group string="Childcare — Work Related (FL 61.30(7))">
<field name="childcare_total"/>
<field name="childcare_by_petitioner"/>
<field name="childcare_by_respondent"/>
</group>
</group>
<group>
<field name="extraordinary_expenses"/>
<field name="adjusted_support_obligation" readonly="1"/>
</group>
<separator string="Step 4: Timesharing Adjustment (FL 61.30(11)(b))"/>
<group>
<field name="substantial_timesharing" readonly="1"/>
<field name="petitioner_overnights" readonly="1"/>
<field name="respondent_overnights" readonly="1"/>
<field name="timesharing_adjustment" readonly="1"/>
</group>
<separator string="Step 5: Final Obligation"/>
<group>
<field name="total_support_obligation" readonly="1"/>
<field name="petitioner_obligation" readonly="1"/>
<field name="respondent_obligation" readonly="1"/>
<field name="net_payment_amount" readonly="1"/>
<field name="payment_direction" readonly="1"/>
</group>
<separator string="Deviation (FL 61.30(1)(a)) — Optional"/>
<group>
<field name="deviation_requested"/>
<field name="deviation_reason"
attrs="{'invisible': [('deviation_requested', '=', False)]}"/>
<field name="deviation_amount"
attrs="{'invisible': [('deviation_requested', '=', False)]}"/>
<field name="final_amount_with_deviation" readonly="1"
attrs="{'invisible': [('deviation_requested', '=', False)]}"/>
</group>
<separator string="Summary"/>
<field name="calculation_summary" readonly="1" nolabel="1"/>
<div class="alert alert-info" role="alert">
<strong>⚖️ Disclaimer:</strong>
This calculation is generated by computer for informational purposes.
Verify all figures before filing with the court.
FL support schedule values should be verified against the current
Florida Department of Revenue guidelines.
</div>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<!-- ════════════<E29590><E29590>═════════════════════════════════════════
FL SUPPORT CALCULATION — TREE
══════════════════════════════════════════════════════ -->
<record id="view_fl_support_calc_tree" model="ir.ui.view">
<field name="name">fl.support.calculation.tree</field>
<field name="model">fl.support.calculation</field>
<field name="arch" type="xml">
<tree string="Support Calculations">
<field name="case_id"/>
<field name="calculation_date"/>
<field name="calculation_type"/>
<field name="combined_net_income"/>
<field name="basic_support_obligation"/>
<field name="total_support_obligation"/>
<field name="net_payment_amount"/>
<field name="payment_direction"/>
</tree>
</field>
</record>
<!-- ══════════════════════<E29590><E29590><EFBFBD>═══════════════════════════════
FL SUPPORT SCHEDULE ENTRY — TREE (admin view)
═══════════════════════════════════<E29590><E29590><EFBFBD>══════════════════ -->
<record id="view_fl_support_schedule_tree" model="ir.ui.view">
<field name="name">fl.support.schedule.entry.tree</field>
<field name="model">fl.support.schedule.entry</field>
<field name="arch" type="xml">
<tree string="FL Support Schedule">
<field name="income_min"/>
<field name="income_max"/>
<field name="children_count"/>
<field name="obligation_amount"/>
<field name="effective_date"/>
<field name="active"/>
</tree>
</field>
</record>
<!-- ══════════════════<E29590><E29590><EFBFBD>══════════════════════════<E29590><E29590>════════
ACTIONS
══════════════════════════════════════════════════════ -->
<record id="action_fl_support_calc_list" model="ir.actions.act_window">
<field name="name">Support Calculations</field>
<field name="res_model">fl.support.calculation</field>
<field name="view_mode">tree,form</field>
</record>
<record id="action_fl_support_schedule_list" model="ir.actions.act_window">
<field name="name">FL DCF Support Schedule</field>
<field name="res_model">fl.support.schedule.entry</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- ══════════════════════════════════════════════════════
TOP-LEVEL APPLICATION MENU
══════════════════════════════════════════════════════ -->
<menuitem
id="menu_familylaw_root"
name="Family Law"
sequence="100"
web_icon="activeblue_familylaw,static/src/img/icon.png"
groups="activeblue_familylaw.group_admin,activeblue_familylaw.group_paralegal"/>
<!-- ══════════════════════════════════════════════════════
MAIN SECTIONS
══════════════════════════════════════════════════════ -->
<menuitem
id="menu_fl_cases"
name="Cases"
parent="menu_familylaw_root"
sequence="10"/>
<menuitem
id="menu_fl_support"
name="Support Calculator"
parent="menu_familylaw_root"
sequence="20"/>
<menuitem
id="menu_fl_caselaw"
name="Case Law Library"
parent="menu_familylaw_root"
sequence="30"/>
<menuitem
id="menu_fl_config"
name="Configuration"
parent="menu_familylaw_root"
sequence="90"
groups="activeblue_familylaw.group_admin"/>
<!-- ══════════════════════════════════════════════════════
CASES SUB-MENU
══════════════════════════════════════════════════════ -->
<menuitem
id="menu_fl_cases_list"
name="All Cases"
parent="menu_fl_cases"
action="action_fl_case_list"
sequence="10"/>
<menuitem
id="menu_fl_case_new"
name="New Case (Intake Wizard)"
parent="menu_fl_cases"
action="action_fl_intake_wizard"
sequence="20"/>
<menuitem
id="menu_fl_deadlines"
name="Deadlines"
parent="menu_fl_cases"
action="action_fl_deadline_list"
sequence="30"/>
<menuitem
id="menu_fl_hearings"
name="Hearings"
parent="menu_fl_cases"
action="action_fl_hearing_list"
sequence="40"/>
<menuitem
id="menu_fl_depositions"
name="Depositions"
parent="menu_fl_cases"
action="action_fl_deposition_list"
sequence="50"/>
<menuitem
id="menu_fl_discovery"
name="Discovery"
parent="menu_fl_cases"
action="action_fl_discovery_list"
sequence="60"/>
<!-- ══════════════════════════════════════════════════════
SUPPORT CALCULATOR SUB-MENU
══════════════════════════════════════════════════════ -->
<menuitem
id="menu_fl_support_calcs"
name="Calculations"
parent="menu_fl_support"
action="action_fl_support_calc_list"
sequence="10"/>
<menuitem
id="menu_fl_support_schedule"
name="FL DCF Schedule"
parent="menu_fl_support"
action="action_fl_support_schedule_list"
sequence="20"
groups="activeblue_familylaw.group_admin"/>
<!-- ══════════════════════════════════════════════════════
CONFIGURATION SUB-MENU
══════════════════════════════════════════════════════ -->
<menuitem
id="menu_fl_statutes"
name="FL Statute Index"
parent="menu_fl_config"
action="action_fl_statute_list"
sequence="10"/>
<menuitem
id="menu_fl_issue_tags"
name="Issue Tags"
parent="menu_fl_config"
action="action_fl_issue_tag_list"
sequence="20"/>
</data>
</odoo>