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:
70
activeblue_familylaw/models/fl_discovery.py
Normal file
70
activeblue_familylaw/models/fl_discovery.py
Normal file
@@ -0,0 +1,70 @@
|
||||
from odoo import api, fields, models
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
|
||||
class FlDiscovery(models.Model):
|
||||
"""
|
||||
Phase 3 — Full implementation.
|
||||
Phase 1: Stub with core fields.
|
||||
|
||||
Covers all FL discovery methods:
|
||||
- Interrogatories (FL 1.340) — 30 days to respond
|
||||
- Request for Production (FL 1.350) — 30 days to respond
|
||||
- Request for Admissions (FL 1.370) — 30 days to respond
|
||||
- Subpoena — third party documents (FL 1.351)
|
||||
- Depositions — tracked in fl.deposition
|
||||
"""
|
||||
_name = 'fl.discovery'
|
||||
_description = 'Discovery Item'
|
||||
_inherit = ['mail.thread']
|
||||
_order = 'served_date asc'
|
||||
|
||||
case_id = fields.Many2one(
|
||||
'fl.case', required=True, ondelete='cascade', index=True
|
||||
)
|
||||
discovery_type = fields.Selection([
|
||||
('interrogatories', 'Interrogatories (FL 1.340)'),
|
||||
('production', 'Request for Production (FL 1.350)'),
|
||||
('admissions', 'Request for Admissions (FL 1.370)'),
|
||||
('subpoena', 'Subpoena — Third Party (FL 1.351)'),
|
||||
('deposition', 'Deposition (FL 1.310)'),
|
||||
], string='Discovery Type', required=True)
|
||||
directed_to = fields.Selection([
|
||||
('petitioner', 'Petitioner'),
|
||||
('respondent', 'Respondent'),
|
||||
('third_party', 'Third Party'),
|
||||
], string='Directed To', required=True)
|
||||
third_party_id = fields.Many2one(
|
||||
'res.partner', string='Third Party'
|
||||
)
|
||||
description = fields.Char(string='Description / Subject')
|
||||
served_date = fields.Date(string='Served Date')
|
||||
response_due_date = fields.Date(
|
||||
string='Response Due Date',
|
||||
compute='_compute_response_due', store=True,
|
||||
help='FL 1.340/1.350/1.370: 30 days to respond'
|
||||
)
|
||||
response_received_date = fields.Date(string='Response Received Date')
|
||||
response_complete = fields.Boolean(string='Response Complete')
|
||||
objections_raised = fields.Boolean(string='Objections Raised')
|
||||
objection_detail = fields.Text(string='Objection Details')
|
||||
deficiency_notice_sent = fields.Boolean(string='Deficiency Notice Sent')
|
||||
state = fields.Selection([
|
||||
('draft', 'Drafting'),
|
||||
('served', 'Served'),
|
||||
('responded', 'Response Received'),
|
||||
('deficient', 'Response Deficient'),
|
||||
('compelled', 'Motion to Compel Filed'),
|
||||
('complete', 'Complete'),
|
||||
], string='Status', default='draft', tracking=True)
|
||||
notes = fields.Text(string='Notes')
|
||||
|
||||
@api.depends('served_date', 'discovery_type')
|
||||
def _compute_response_due(self):
|
||||
for rec in self:
|
||||
if rec.served_date and rec.discovery_type != 'deposition':
|
||||
rec.response_due_date = (
|
||||
rec.served_date + relativedelta(days=30)
|
||||
)
|
||||
else:
|
||||
rec.response_due_date = False
|
||||
Reference in New Issue
Block a user