Files
famlaw/WORKFLOWS.md
tocmo0nlord 13cf3fe201 Add end-to-end workflow documentation (WORKFLOWS.md)
Practical guide walking the case from intake through closed: per-stage
walkthroughs (Intake → Active → Discovery → Pre-Trial → Closed), cross-cutting
flows (Documents → e-Sign → e-File, AI agents comparison, time & billing,
deadlines, conflict gate, portal access), roles, troubleshooting, menu map.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 20:43:10 +00:00

510 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ActiveBlue Family Law — End-to-End Workflows
How a case moves from intake through final order, what each role does at each
stage, and which buttons / menus to click. Targets the live build on
`192.168.2.9:8069`, database `db1`. Florida 11th Circuit (Miami-Dade).
---
## Stage map at a glance
```
Intake ─► Active ─► Discovery ─► Pre-Trial ─► Closed
│ │ │ │ │
│ │ │ │ └─ archive, bill, retention
│ │ │ └─ pretrial stmt, exhibits, witnesses, mediation
│ │ └─ interrogatories, production, depositions
│ └─ serve, mandatory disclosure (FL 12.932), initial hearings
└─ conflict check, questionnaire, fee-waiver assessment
```
Move stages via the Kanban (drag) or the status bar on the case form. Each
transition automatically runs the **Paralegal agent**, which (1) generates the
stage's task batch, (2) recalculates deadlines, (3) cross-references statutes
to the case's issue tags, and (4) posts a chatter summary.
The case **cannot leave Intake until the conflict-of-interest check passes**
(or an administrator overrides it with a written justification).
---
## One-time configuration (before your first case)
Settings → Technical → System Parameters:
| Key | Value | Used by |
|---|---|---|
| `fl_ai.claude_api_key` | `sk-ant-…` | AI engine, Paralegal agent, Attorney agent |
| `fl_timesheet.default_hourly_rate` | e.g. `350` | Time & Billing totals when employee has no rate set |
| `fl_efiling.portal_url` | `https://eportal.flcourts.org` (default) | Open e-Filing Portal button |
| `web.base.url` | your Odoo base URL | Signing-portal link in emails |
Per-employee: open the employee record, set **Family Law Billing Rate ($/hr)**.
Python dependencies in the container (already required by code paths):
`anthropic`, `pikepdf`, `PyMuPDF`. Install with
`docker exec -u root odoo-web-1 pip install anthropic pikepdf PyMuPDF`.
---
## STAGE 1 — Intake
**Goal:** capture parties, screen for conflicts, decide if pro se vs attorney
referral, assess fee-waiver eligibility, identify legal issues.
### 1.1 Create the case
Two paths:
- **Family Law → Cases → New Case (Intake Wizard)** — guided form covering
case type, parties, children, basic facts.
- **Family Law → Cases → All Cases → New** — direct creation of `fl.case`.
Required at create time: `case_type` and `petitioner_id`. `respondent_id` is
strongly recommended (drives conflict screening and downstream service).
### 1.2 What the system does automatically on create
1. **Conflict-of-interest check** runs first
- Compares petitioner / respondent / party names against parties on every
other open case (folded stages excluded).
- Exact partner-id match → instant conflict. Otherwise fuzzy match
(difflib ≥ 0.85).
- Conflict found → red banner on the case, Kanban "Conflict" badge,
`conflict_check_passed = False`, **case is locked at Intake**.
- Clear → `conflict_check_passed = True`, case can advance.
2. **Project auto-created** with case-type task templates.
3. **Paralegal agent** generates the Intake task batch:
- Run conflict-of-interest check (the audit record)
- Complete client intake questionnaire
- Assess fee-waiver eligibility (FL 57.082)
4. **Fee waiver eligibility** computed quickly from petitioner income vs
200% FPL; chatter note if eligible.
5. **DV flag** (if set) posts a safety banner with mediation/representation
guidance and the Miami DV hotlines, forces `attorney_referral_flag`.
### 1.3 Resolving a flagged conflict
Open the conflict check record from the case's "Conflict of Interest" group
(Parties tab) or via **Cases → Conflict Checks**.
- Review the match list and similarity scores.
- If proceeding is safe, an **administrator** writes a justification and
clicks **Override Conflict** → state becomes "override",
`conflict_check_passed = True`, audit entry posted to chatter.
- Never silently pass a conflict — the override leaves a permanent record.
### 1.4 Fill in the questionnaire (Parties tab)
For each party (One2many "Party Details"):
- Employment type and gross monthly income.
- Statutory deductions (federal tax withholding, mandatory retirement,
health insurance self-only, other court-ordered support) → Odoo computes
net monthly income per FL 61.30(3).
- **Income imputation** (FL 61.30(2)(b)) if voluntarily un/under-employed —
set `income_imputed`, an imputed amount, and document the basis.
- **Lifestyle inconsistency** flag if income vs lifestyle is suspect
(Barner v. Barner) — Attorney agent will incorporate this.
### 1.5 Run the AI passes
- **Paralegal Review** (header button) — Claude procedural briefing
(best-effort; falls back to a rule-based summary if the API is unavailable).
Useful to see "what should we be doing now?" at any time.
- **AI tab → Generate Attorney Strategy Memo** (admin) — substantive memo.
Identifies the top 35 statutes and case law (from the seeded library only,
no hallucinated citations), drafts petitioner arguments, opposing
counterarguments, procedural risks, and a substantial-change assessment for
modifications. Stored as `fl.analysis` of type "attorney", linked from
`case.attorney_memo_id`.
### 1.6 Advance to Active
Drag the case to **Active** on the Kanban (or click the status bar). If
`conflict_check_passed` is still False you'll get a blocking error — go back
and resolve the conflict.
---
## STAGE 2 — Active
**Goal:** serve the respondent, exchange mandatory disclosure, schedule the
initial hearings, generate and file the petition.
### 2.1 Automatic on stage entry
Paralegal agent generates the Active task batch:
- Effect service of process
- Serve mandatory disclosure (FL-12.932) within 45 days of service
- Schedule initial hearings (case management, temporary relief)
### 2.2 Filing date and service date drive deadlines
Set `filing_date` on the case → deadline engine generates filing-anchored
deadlines (30-day target service, 120-day FL 1.070 max service, parenting
class for petitioner if minor children).
Set `service_date` → service-anchored deadlines are generated/recalculated:
| Deadline | Offset | Statute |
|---|---|---|
| Respondent answer due | service + 20 days | FL 1.140 |
| Mandatory disclosure exchange | service + 45 days | FL 12.285 |
| Certificate of mandatory disclosure | service + 45 days | FL 12.932 |
| Discovery opens | service + 20 days | FL 12.280 |
| Respondent parenting class | service + 60 days | FL 61.21 |
Each `fl.deadline` syncs to a `calendar.event` (visible in the case's
Deadlines tab and on the user's calendar). Daily cron sends 7/3/1-day and
overdue alerts to the case chatter.
### 2.3 If respondent doesn't answer by day 20
A daily cron (FL 12.922 / FL 1.500) automatically:
1. Creates a "File Motion for Default" deadline (5 days out).
2. Adds an urgent project task with filing instructions.
3. Posts a "DEFAULT JUDGMENT WINDOW OPEN" alert to the case chatter.
### 2.4 Generate and file court documents
Each case document maps to a QWeb PDF report:
| Document | Form | Menu / Action |
|---|---|---|
| Financial Affidavit (Short) | FL-12.902(b) | Reports → on `fl.document` |
| Financial Affidavit (Long) | FL-12.902(c) | "" |
| Child Support Worksheet | FL-12.902(e) | "" |
| Motion to Modify | — | "" |
| Notice of SSN | FL-12.930(a) | "" |
| Mandatory Disclosure Certificate | FL-12.932 | "" |
| Notice of Deposition | — | "" |
| Motion to Compel | FL 1.380 | "" |
| Income Withholding | FL 61.1301 | "" |
| Parenting Plan | FL-12.995(a) | "" |
| Application for Civil Indigent Status | FL 57.082 | "" |
| Motion for Default | FL 12.922 | "" |
To get a signed, filed PDF, use **Filings tab → Request Signature** then
**Prepare e-Filing** (full walkthrough in *Cross-cutting flows: Documents →
e-Sign → e-File* below).
### 2.5 Fee waiver application
If the case shows "Fee Waiver Potentially Eligible" (200% FPL test), open the
Fees & Expenses tab → **Create Fee Waiver Application**. Complete household
size and income; eligibility is computed against the FL 57.082 threshold and
the document flows through draft → submitted → approved/denied. Generate the
QWeb PDF and file with the clerk.
### 2.6 Move to Discovery when ready
Drag to **Discovery** when initial service + mandatory disclosure are in
hand and you need formal discovery. Typically also after the Attorney agent
has rated complexity as `medium` or higher.
---
## STAGE 3 — Discovery
**Goal:** Interrogatories, requests for production, depositions, motions to
compel as needed.
### 3.1 Automatic on stage entry
Paralegal agent generates the Discovery task batch:
- Draft interrogatories
- Draft requests for production
- Schedule depositions where income or facts are disputed
### 3.2 Discovery Suggest wizard
From the case → **Run Discovery Suggest Wizard** (or Cases → Discovery →
specific tools). The wizard reads:
- Case's issue tags (`issue_tag_ids`)
- Complexity (from the latest analysis or rule-based fallback)
- Active flags (DV, income imputation, respondent has counsel)
…and proposes a tailored discovery package: interrogatory sets directed to
the opposing party, document requests, deposition notices, third-party
subpoenas (e.g., employer when income is disputed).
Each selected line creates an `fl.discovery` item linked to the case. The
wizard posts a chatter summary of everything generated.
### 3.3 Discovery items lifecycle (`fl.discovery`)
- States: draft → served → responded → complete (or → motion-to-compel /
deemed-admissions when overdue).
- 30-day response clock from service; **daily cron** fires alerts for overdue
responses and flags admissions deemed under FL 1.370 when the deadline lapses.
- Track objections and motion-to-compel status per item.
### 3.4 Depositions (`fl.deposition`)
- States: draft → noticed → confirmed → completed (or cancelled / no-show /
continued).
- **Notice validity** is computed (FL 1.310(b): ≥10 days notice). Search
filters expose "Invalid Notice" — fix before serving.
- Duces tecum (document subpoena): tracked separately.
- Generate the Notice of Deposition PDF and route through e-Sign / e-File.
### 3.5 Move to Pre-Trial
When discovery is essentially closed (responses in, depositions taken or
waived), advance the stage.
---
## STAGE 4 — Pre-Trial
**Goal:** Pretrial statement, exhibits, witnesses, mediation, support
calculation, parenting plan, threshold test for modifications.
### 4.1 Automatic on stage entry
Paralegal agent generates the Pre-Trial task batch:
- Prepare pretrial statement
- Compile exhibit list
- Compile witness list
- Schedule mediation (separate rooms if DV flagged — FL 44.102)
### 4.2 Child support calculation (FL 61.30)
Open **Case → Open Calculator** (or AI tab → Calculator stat button).
- Pulls petitioner / respondent effective monthly income (uses imputed if set).
- Children, day-care, health insurance for children, tax exemption assumptions.
- **Substantial timesharing** kicks in when either parent has > 73 overnights
(FL 61.30(11)(b)) — automatically detected from `petitioner_overnights`.
- Result → `case.calculated_support`.
For **modifications**, the Support tab also runs the threshold test
(FL 61.30(1)(b)): change must be both ≥ $50 AND ≥ 15%. The case shows a clear
"QUALIFIES" / "DOES NOT QUALIFY" panel with the math.
### 4.3 Mediation scheduling
Add `fl.hearing` of type "Mediation" (Hearings tab). If `domestic_violence_flag`
is set, you get a separate-rooms reminder. Court-ordered mediation is the
default in family law cases (FL 44.102).
### 4.4 Pretrial statement, exhibit and witness lists
Use the project tasks generated by the paralegal agent as the checklist.
Documents and exhibits go through the standard Documents → e-Sign → e-File
flow.
### 4.5 Move to Closed when the final order is entered
---
## STAGE 5 — Closed
**Goal:** Capture the new order, generate income withholding, reconcile
billing, archive the case, send retention notice.
### 5.1 Automatic on stage entry
Paralegal agent generates the Closed task batch:
- Complete archive checklist
- Reconcile billing
- Send file retention notice
### 5.2 Post-order: income withholding (FL 61.1301)
Set `new_order_amount` and `new_order_date` on the case → an
`fl.income.withholding` record is auto-created (mandatory under FL 61.1301
unless good cause or written agreement). Generate the Income Withholding PDF
and serve.
`retroactivity_date` is computed = `filing_date` (FL 61.30(17)).
### 5.3 Reconcile billing
Time & Billing tab shows:
- `total_billable_hours` — sum of billable timesheet entries
- `total_billable_amount` — billable hours × rate
- `total_ai_audit_hours` — non-billable AI agent time (for audit trail)
Add manual time entries inline (date, who, hours, description, billable).
The wrapped `account.analytic.line` records flow into standard Odoo
Accounting for invoicing.
### 5.4 File retention notice
Use the Document workflow to generate a closing letter to the client with
the retention/destruction policy.
---
## Cross-cutting flows
### A. Documents → e-Sign → e-File
The "paperwork pipeline" — every court document follows the same path.
1. **Generate** the document. From the case Documents area (Filings tab or
`fl.document` form), pick the document type (e.g., Financial Affidavit
Long). Use **Print → [Report]** to render the QWeb PDF, or the document
auto-renders when a signature request is created.
2. **Request Signature** (Filings tab → "Request Signature" button). On the
`fl.signature.request` form:
- Pick the document and signer (`signer_partner_id`).
- Click **Render PDF** to generate the unsigned PDF (or skip — clicking
"Send to Signer" will render automatically).
- Click **Send to Signer**. An email goes out with a one-time link
`https://<your-host>/familylaw/sign/<token>` (token is 256-bit; expires
in 14 days; cron sweeps expired links hourly).
3. **Signer signs** at the portal page (no login required):
- The unsigned PDF is shown in an iframe.
- The signer draws on the HTML5 canvas pad (mouse/trackpad/finger).
- "Submit Signature" posts the PNG to the server; PyMuPDF embeds it at
the per-report `_SIGNATURE_COORDS` rectangle.
- The signed PDF is attached to the `fl.document` (state → "signed"); the
request state → "signed"; case chatter logs the event with signer IP.
The signer can also Decline with an optional reason; the request closes.
4. **Re-validate PDF/A** on the signed PDF (signature form has a button) if
it's bound for e-filing. Uses the same `pikepdf` check as the e-Filing
model.
5. **Prepare e-Filing** (Filings tab → "Prepare e-Filing"). The wizard:
- Picks the signed PDF (or any attachment).
- Generates the 11th Circuit-compliant filename:
`{LastName}_{CaseNumber}_{DocType}_{YYYYMMDD}.pdf`.
- Auto-validates PDF/A.
6. **Submit on the FL e-Filing Portal**. From the `fl.efiling.submission`
form:
- Click **Open e-Filing Portal** — opens `eportal.flcourts.org` in a new
tab, deep-linked with the case number if available.
- Upload the signed PDF on the portal, complete the filing, copy the
portal confirmation #.
- Back in Odoo, paste the confirmation # and click **Mark Submitted**.
- When the clerk acts, click **Clerk Accepted** (which also marks the
`fl.document` as filed) or **Clerk Rejected** (note the reason).
The Submit via API button is reserved for Phase 2 and currently refuses to
call any unconfirmed endpoint — assisted submission is the supported flow.
### B. AI agents — when to use which
| Agent | Trigger | What it produces | Cost |
|---|---|---|---|
| **Paralegal — auto** | Every stage transition (including case creation) | Stage task batch, deadline recalc, statute cross-ref, rule-based chatter summary | No AI call |
| **Paralegal — manual** ("Paralegal Review" button) | On demand | Same as above + Claude procedural briefing | 1 Claude call |
| **AI Engine** ("Run AI Analysis" header → wizard) | On demand | Rule-based issue tagging + caselaw matching + Claude case-summary analysis (`fl.analysis` type `engine`) | 1 Claude call |
| **Attorney — manual** (AI tab → "Generate Attorney Strategy Memo") | On demand, admin | Substantive strategy memo: top 35 statutes (linked to `fl.statute`), top 35 case law (linked to `fl.caselaw`), petitioner arguments + opposing counterarguments, risk narrative, substantial-change assessment, attorney-referral flag | 1 Claude call (longer prompt) |
All agents log non-billable audit time to `fl.timesheet` (`ai_agent` field
identifies which agent) and fall back to rule-based output if Claude is
unavailable. AI failures never block the user workflow.
### C. Time & Billing
- **Manual entry**: Case → Time & Billing tab → add row. Date, employee,
hours, billable flag, description.
- **AI audit time**: posted automatically by each agent run (paralegal ~0.05h
AI / 0.01h rule-based; attorney ~0.1h AI / 0.02h fallback). Marked
non-billable; visible in the same tab and on the **Cases → Timesheets**
list (filter: AI Audit).
- Rate resolves to `hr.employee.fl_hourly_rate` (per person) or the firm
default param.
- Each timesheet entry wraps an `account.analytic.line`, so it shows up in
Odoo Accounting and flows into invoicing in the usual way.
### D. Deadlines & calendar
- Defined in `fl.deadline`; each one syncs to a `calendar.event` (default 1h
block at 08:00).
- Decoration in the Deadlines tab: red for overdue, yellow for ≤ 7 days.
- Daily cron posts 7-day, 3-day, 1-day, and overdue alerts to the case chatter.
- The case header shows "Next Deadline" and "Overdue Deadlines"; the Kanban
card shows the count.
### E. Conflict-of-interest gate
- Runs on case creation. Also accessible via header **Run Conflict Check**.
- Admin override only, with a written justification (audit-logged).
- Visible globally under **Cases → Conflict Checks** (default filter: open
conflicts).
### F. Portal access (clients)
Petitioner / respondent users (groups `group_portal_petitioner` /
`group_portal_respondent`) can sign in and see:
- `/my/cases` — their case(s)
- `/my/cases/<id>` — case detail with deadlines and timeline
- `/my/cases/calculator` — interactive FL 61.30 calculator
- `/my/cases/caselaw` — searchable FL case law library
To grant portal access, on the party record (Parties tab → party row) link a
`partner.user_ids` to that party's partner.
---
## Roles — who does what
| Role | Group | Typical day |
|---|---|---|
| Admin / Attorney | `group_admin` | Open Attorney Strategy Memo; review/override conflicts; review filings before submission; review billing |
| Paralegal | `group_paralegal` | Drives the case stage-by-stage; runs Paralegal Review for procedural questions; manages discovery, depositions, deadlines; prepares court documents, signatures, filings; logs billable time |
| Portal Petitioner | `group_portal_petitioner` | Sees own case; signs court documents on the portal page when sent a link |
| Portal Respondent | `group_portal_respondent` | Sees own case (read-only beyond their party record) |
---
## Quick troubleshooting
| Symptom | Where to look |
|---|---|
| Can't move case past Intake | Conflict check failed — open the conflict record, admin override with justification |
| "anthropic not installed" / no AI summary | `pip install anthropic` in `odoo-web-1`; set `fl_ai.claude_api_key` system parameter |
| Signature page errors | `pip install PyMuPDF`; check `web.base.url` is set so the email link is correct |
| PDF/A check always warns | Source PDFs are not PDF/A-compliant — wkhtmltopdf output is plain PDF. Run them through a PDF/A converter (e.g., Ghostscript `pdfa.ps`) before signing/filing if the clerk rejects them. The pikepdf check is pragmatic (markers + OutputIntents), not full veraPDF conformance. |
| e-Filing API button errors | By design — confirm portal endpoint, set `fl_efiling.api_endpoint`, then Phase 2 work is needed to wire real submission. Until then, use Open Portal + Mark Submitted. |
| Paralegal agent fires twice on Intake | Once from `create()`, once from the first stage-write. Tasks are idempotent (same-name guard) so no duplicates are actually created. |
| Deadline alerts not firing | Check **Settings → Technical → Scheduled Actions** for "FL Family Law: Daily Deadline Alerts" — `active = True`, last run within 24h |
---
## Reference: menus
```
Family Law
├── Cases
│ ├── All Cases
│ ├── New Case (Intake Wizard)
│ ├── Deadlines
│ ├── Hearings
│ ├── Depositions
│ ├── Discovery
│ ├── Conflict Checks
│ ├── Timesheets
│ ├── e-Filings
│ └── Signature Requests
├── Support Calculator
│ ├── Calculations
│ └── FL DCF Schedule (admin)
├── Case Law Library
└── Configuration (admin)
├── FL Statute Index
└── Issue Tags
```