CRM migration
Field-level mapping, validation, and rollback between The Attorney Case File and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
The Attorney Case File
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between The Attorney Case File and Odoo CRM.
Complexity
BStandard
Timeline
3–6 weeks
Overview
The Attorney Case File organizes legal work around Cases, Clients, Documents, and Time Entries — a case-centric data model where every record traces back to a single matter. Odoo CRM uses a lead/opportunity model (crm.lead) for pipeline management, res.partner for contacts and organizations, and ir.attachment for files, with custom fields and properties tracked via ir.model.data and custom field definitions. The migration carries all standard and custom fields from The Attorney Case File into their Odoo equivalents, re-uploads every document and attachment to Odoo's filestore, and preserves relational links between matters, contacts, and documents via Odoo's many2one and many2many field conventions. Workflows, template documents, and billing-rate schedules do not migrate — those must be rebuilt in Odoo using its automation rules and product-pricelist model. FlitStack sequences the load so res.partner records exist before crm.lead records reference them, preventing foreign-key orphans, and runs a delta-pickup window after cutover to capture any records modified during the transition.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a The Attorney Case File object lands in Odoo CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
The Attorney Case File
Case / Matter
Odoo CRM
crm.lead (type=opportunity)
1:1Each The Attorney Case File matter becomes a crm.lead record with type='opportunity'. The crm.lead.name field holds the matter title, and stage is set based on the case-status mapping defined during discovery. Original case creation date is preserved as a custom datetime field since Odoo sets crm.lead.create_date at migration time.
The Attorney Case File
Client / Party
Odoo CRM
res.partner
1:1Client records from The Attorney Case File map directly to res.partner. Individual attorneys and opposing counsel each become separate res.partner records. The client-type flag (e.g., plaintiff, defendant, opposing counsel) is stored as a custom selection field since Odoo's native partner category model is used for tagging rather than party role classification.
The Attorney Case File
Firm / Organization
Odoo CRM
res.partner (company_type=company)
1:1When The Attorney Case File stores a firm or organization name as a separate entity from individual contacts, it maps to res.partner with company_type='company'. Individual contacts at the firm become child res.partner records with parent_id pointing to the firm, mirroring Odoo's standard company-contact structure.
The Attorney Case File
Document / File Attachment
Odoo CRM
ir.attachment
1:1Every document linked to a case in The Attorney Case File re-uploads as an ir.attachment record with res_model='crm.lead' and res_id set to the migrated crm.lead ID. The original file name and MIME type are preserved; Odoo's ir_attachment.store_file field routes storage to PostgreSQL or the filestore directory per your Odoo configuration.
The Attorney Case File
Time Entry / Billing Record
Odoo CRM
account.analytic.line
1:1Time entries linked to matters map to account.analytic.line records with product_id set to the migrated billing-rate product. Odoo requires the Timesheet app or a timesheet-enabled project to be active; if neither exists, time entries migrate as notes on the crm.lead with a custom description field carrying the original hours and narrative.
The Attorney Case File
Billing Rate / Fee Schedule
Odoo CRM
product.pricelist / product.template
1:1Fixed billing rates and fee schedules stored in The Attorney Case File become product.template records in Odoo's Product app. Each rate becomes a product with a list_price set to the billing amount, and the rate name maps to product.name. Hourly rates use uom_id='Hour'; flat fees use uom_id='Unit'.
The Attorney Case File
Case Status / Stage
Odoo CRM
crm.stage
1:1Each distinct case-status value in The Attorney Case File is mapped to a corresponding crm.stage record in Odoo. Stage names (e.g., 'Active Litigation', 'Discovery', 'Settlement Negotiations') are created as new stages in the default Odoo pipeline or a dedicated legal pipeline. Probability values are assigned per stage to support Odoo's forecast reporting.
The Attorney Case File
Calendar / Court Date
Odoo CRM
calendar.event
1:1Scheduled court dates and attorney calendar events from The Attorney Case File map to calendar.event records in Odoo, with the crm.lead linked via the res_id field. Start and stop datetime values are preserved; reminder settings are mapped to calendar.alarm records. If no calendar module is active in Odoo, events are stored as notes on the crm.lead.
The Attorney Case File
Custom Case Property
Odoo CRM
ir.model.fields (custom field on crm.lead)
1:1Any custom properties defined on The Attorney Case File matters — such as statute of limitations dates, venue court names, insurance carrier references, or judicial assignment data — require new ir.model.fields entries on the crm.lead model before migration. FlitStack generates the field definition SQL and applies it during the schema-setup phase.
The Attorney Case File
Custom Client Property
Odoo CRM
ir.model.fields (custom field on res.partner)
1:1Client-specific custom fields from The Attorney Case File (e.g., bar number, referral source, conflict-check status) are added to res.partner via ir.model.fields. Odoo restricts field name length to 50 characters and requires snake_case naming; source field names are normalized during the field creation phase.
The Attorney Case File
Opposing Counsel / Party Role
Odoo CRM
res.partner (with custom role field)
many:1The Attorney Case File may store opposing counsel as a separate contact record. In Odoo, these contacts are merged into res.partner with the party role recorded in a custom selection field (Case_Party_Role__c) rather than as separate object types. This preserves the relationship without inflating contact counts.
The Attorney Case File
User / Attorney Owner
Odoo CRM
res.users
1:1The Attorney Case File owner or responsible attorney on a matter is resolved by email match against res.users in Odoo. If no matching Odoo user exists, the crm.lead.owner_id is set to a fallback attorney designated by the firm, and the original owner name is preserved in a custom field for reconciliation.
| The Attorney Case File | Odoo CRM | Compatibility | |
|---|---|---|---|
| Case / Matter | crm.lead (type=opportunity)1:1 | Fully supported | |
| Client / Party | res.partner1:1 | Fully supported | |
| Firm / Organization | res.partner (company_type=company)1:1 | Fully supported | |
| Document / File Attachment | ir.attachment1:1 | Fully supported | |
| Time Entry / Billing Record | account.analytic.line1:1 | Fully supported | |
| Billing Rate / Fee Schedule | product.pricelist / product.template1:1 | Fully supported | |
| Case Status / Stage | crm.stage1:1 | Fully supported | |
| Calendar / Court Date | calendar.event1:1 | Fully supported | |
| Custom Case Property | ir.model.fields (custom field on crm.lead)1:1 | Fully supported | |
| Custom Client Property | ir.model.fields (custom field on res.partner)1:1 | Fully supported | |
| Opposing Counsel / Party Role | res.partner (with custom role field)many:1 | Fully supported | |
| User / Attorney Owner | res.users1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
The Attorney Case File gotchas
No public API — extraction requires vendor coordination
Export envelope is limited to workbook-level records
Trust accounting data is outside the export scope
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Discover The Attorney Case File data model and custom properties
FlitStack extracts the complete schema from The Attorney Case File — all standard and custom case fields, client fields, document records, time entries, and billing-rate definitions. We catalog every unique case-status value, practice-area label, and custom property name. This discovery output drives the Odoo field-creation plan: which ir.model.fields entries are needed on crm.lead and res.partner before any data loads. We also identify the owner/attorney fields to map to Odoo res.users via email resolution.
Deploy Odoo schema setup module with custom fields and stages
FlitStack generates and installs a migration-specific Odoo module that defines all custom fields (x_case_number, x_practice_area, x_date_filed, x_statute_of_limitations, x_insurance_carrier, x_bar_number, and others identified during discovery) on the crm.lead and res.partner models. We also create crm.stage records matching The Attorney Case File case-status values and assign probability weights for Odoo's forecast reporting. The module is applied to your Odoo instance before the data load begins.
Load contacts and organizations before case records
Odoo's ORM enforces referential integrity: crm.lead records must have a valid partner_id (res.partner) before they can be saved if the partner_id field is marked as required. FlitStack sequences the migration so res.partner records load first — all clients, opposing counsel, and firm organizations — with their custom fields populated. Case records (crm.lead) load second, referencing the newly created partner IDs. This ordering prevents the foreign-key constraint violations that occur when document attachments or time entries reference orphaned case IDs.
Run a sample migration on a representative case slice
A sample migration executes against 50–200 representative records spanning multiple case types, practice areas, and document counts. FlitStack generates a field-level diff comparing source values to Odoo destination values for every mapped field. You verify that practice-area values land in x_practice_area, statute-of-limitations dates appear correctly, and documents attach to the right crm.lead. The sample run surfaces any value-mapping gaps, custom-field name conflicts, or stage-probability mismatches before the full load commits.
Execute full migration with delta-pickup window
The full data load runs against your Odoo instance using the Odoo XML-RPC API (xmlrpc/2/object) for record writes and direct file upload for ir.attachment binaries. A delta-pickup window of 24–48 hours opens at cutover, during which your team continues working in The Attorney Case File. Any new cases, contacts, or documents created during this window are pulled in the final delta pass. FlitStack produces an audit log of every record written and supports one-click rollback to the pre-migration Odoo database state if reconciliation fails.
Validate and reconcile with post-migration audit report
After the migration and delta-pickup complete, FlitStack generates a reconciliation report comparing record counts and field totals between The Attorney Case File and Odoo for every object type. Document counts, total billing-hours migrated, and case-status distribution are verified against source totals. Unmatched or skipped records are flagged with reason codes. The report is delivered alongside a rebuild reference document for workflows, billing-rate schedules, and matter-status automation rules that must be recreated in Odoo.
Platform deep dives
The Attorney Case File
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across The Attorney Case File and Odoo CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
The Attorney Case File: Not publicly documented.
Data volume sensitivity
The Attorney Case File doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during The Attorney Case File to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your The Attorney Case File to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave The Attorney Case File
Other ways to arrive at Odoo CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.