# Features — odoo_modules

Evidence date: 2026-10-08. Source: `main` at `df1bfde`.

Status words used here:

- **Current** — present and installable on `main`.
- **Completed** — shipped in the commits that were read (the repository has no older released line).
- **Planned** — named in an in-repo roadmap and not found in code.
- **Changed** — commit subjects on 2026-07-08 that alter behaviour after the feature first appeared.
- **Deprecated / removed** — not found. No removal commit was identified.

There is no long-lived release branch. "Completed" means the feature is in `df1bfde`, not that a product owner signed it off.

## Current features

### Silicon Overdrive Helpdesk (`addons/so_helpdesk/`)

Version `17.0.2.1.0`. Application. Author: Silicon Overdrive.

| Feature | Status | Evidence |
|---|---|---|
| Four departmental teams and per-team stages | Current | `data/helpdesk_team_data.xml` |
| Nine ticket types with team links and default priorities | Current | `data/helpdesk_ticket_type_data.xml` |
| Ticket sequence `SO-HD/{year}/{00000}` | Current | `data/helpdesk_sequence.xml` |
| Kanban by stage, plus list, pivot, graph, calendar filters in the ticket views | Current | `views/helpdesk_ticket_views.xml` |
| Dashboard counts (open, closed, archived, escalation, ratings, activity) | Current | `models/helpdesk_dashboard.py` |
| SLA policies and hourly failure cron | Current | `models/helpdesk_sla.py`, `data/mail_template_data.xml` |
| IMAP support mailboxes, test connection, fetch now, 5-minute cron | Current | `models/helpdesk_mail_server.py` |
| Reply threading on `SO-HD/YYYY/#####` in the subject | Current | `models/helpdesk_mail_utils.py` |
| Customer follower and email on public comments until close | Current | `helpdesk_ticket.py` `message_post` |
| Escalate to team leader and force priority 3 | Current | `action_escalate` |
| Canned responses, optional team scope | Current | `models/helpdesk_canned_response.py` |
| 1–3 star rating email and public rate route | Current | `controllers/rating.py` |
| Portal `/my/helpdesk` and public `/helpdesk/submit` | Current | `controllers/portal.py` |
| UTM campaign on tickets | Current | manifest depends on `utm`; ticket search filter `campaign_id` |
| Optional product on a ticket, no delivery order | Current | `product_id` field; `docs/so_helpdesk.md` |
| Tags | Current | `models/helpdesk_tag.py` |
| Archive and unarchive | Current | `action_archive` |
| Assign to me | Current | `action_assign_to_me` |
| Post-init grant of Agent to all internal users | Current | `hooks.py` |
| Helpdesk logo asset | Current | commit `44db045`; menu `web_icon` `so_helpdesk/static/img/logo.png` |

### My Company (`addons/my_company/`)

Version `17.0.1.10.0`. Application. Author: JB.

| Feature | Status | Evidence |
|---|---|---|
| Feed posts, announcements, kudos | Current | `models/mycompany_post.py` |
| Images on posts | Current | `attachment_ids` |
| Comments via mail thread | Current | `_inherit` `mail.thread` |
| Tagged people and department targeting with notification | Current | `_notify_tagged_and_teams` |
| Pinned posts sorted first | Current | `_order` |
| OWL three-panel hub | Current | `static/src/js/my_company_hub.js`, `xml/my_company_hub.xml` |
| Resizable columns saved in the browser | Documented in `docs/my_company.md`. Browser storage was not re-read in the JS file for this note | Docs say layout is saved automatically |
| Colleague list and Discuss open | Current | `res_users.py` `open_hub_chat`; hub RPC `get_hub_users` |
| Birthday list (next 12) | Current | `get_hub_birthdays` |
| Startup page per user and company default | Current | `res_users.py`, `res_config_settings.py` |
| Configurable hub display name | Current | `mycompany_hub_name`; commit `150eb24` |
| Bundled logo | Current | commits `2734aca`, `142f616` |
| Weekly engagement cron | Current | `data/ir_cron.xml` |
| Manager menu for posts | Current | `views/menu_views.xml` group manager |

### AI Assistant (`addons/jb_ai_assistant/`)

Version `17.0.1.1.0`. Application. Author: JB.

| Feature | Status | Evidence |
|---|---|---|
| OWL chat with sidebar history | Current | `static/src/js/ai_chat.js` |
| Personal conversation history | Current | record rules in `security/security.xml` |
| Per-user bot name, default Udi | Current | `ai_conversation.py` `_get_user_bot_name` |
| Admin model list, seeded GPT-4o and GPT-4o Mini | Current | `data/ai_model_data.xml` |
| Global API key, base URL, temperature, max tokens, system prompt | Current | `data/ir_config_parameter.xml` |
| Card rails appended to the system message | Current | `models/ai_card_rail.py` |
| Per-conversation session memory | Current | `memory` on conversation; included in system content |
| Admin view of all conversations | Current | `group_ai_admin` rule |
| Settings entry and user preference | Current | `views/res_config_settings_views.xml`, `res_users_views.xml` |
| Production auto-install | Current | `scripts/odoo-start.sh`, commit `49184fc` |

Changelog `17.0.1.0.0` (2026-07-08) describes the first AI assistant cut. The manifest version is `17.0.1.1.0`. The changelog does not describe the patch.

### JB Timesheets (`addons/jb_timesheet/`)

Version `17.0.1.0.0`. Not an application (`application: False`). Author: JB. Depends on HR timesheets and project.

| Feature | Status | Evidence |
|---|---|---|
| Internal notes, time in, time out, billable flag | Current | `models/account_analytic_line.py` |
| Invoiced flag and invoiced date | Current | same file; `wizard/mark_invoiced_wizard.py` |
| EIT billing id, manual push wizard | Current | `wizard/eit_copy_wizard.py` |
| Convergence id, automatic push | Current | `_maybe_push_to_convergence` |
| Employee EIT user id, monthly target hours, office-target flag, remind count | Current | `models/hr_employee.py` |
| Partner EIT client id | Current | `models/res_partner.py` |
| Project EIT id, template flag, created-from template | Current | `models/project_project.py` |
| Task hour progress, overrun flags, is-ticket, ticket source project | Current | `models/project_task.py` |
| Create-ticket wizard (parent task plus subtasks) | Current | `wizard/create_ticket_wizard.py` |
| Daily overrun mail at 50 / 75 / 100 percent | Current | `data/ir_cron.xml`, mail templates |
| Weekly timesheet reminder | Current | `hr_employee.py` |
| Monthly remind-count reset | Current | same |
| Reports: timesheet list, project breakdown, office target, my target | Current | `report/timesheet_report.py` |
| Menus under JB Timesheets | Current | `views/menu_views.xml` |
| Groups: User, Manager, Invoice Manager | Current | `security/jb_timesheet_security.xml` |

### Time Sheet V2 (`addons/jb_timesheet_v2/`)

Version `17.0.1.2.0`. Application. Depends on `jb_timesheet`.

| Feature | Status | Evidence |
|---|---|---|
| My Dashboard (weekly plan form) | Current | `views/menu_views.xml`, `timesheet_v2_week_plan.py` |
| Previous / next / this week | Current | `action_prev_week`, `action_next_week`, `action_this_week` |
| To-dos with client, project, planned hours, done | Current | `timesheet.v2.week.plan.line` |
| Planned vs logged hours and variance | Current | `_compute_actual_hours` |
| Previous week recap link | Current | `previous_plan_id` |
| My Timesheet list with date, user, client filters | Current | `views/account_analytic_line_views.xml` |
| Team weekly plans (managers) | Current | menu group `group_timesheet_manager` |
| Overview dashboard | Current | `models/timesheet_v2_dashboard.py` |
| My Target and Office Target report actions reused from v1 | Current | menu items point at `jb_timesheet` report actions |
| Timesheet2 import views | Current | `views/timesheet2_import_views.xml` |
| Demo data | Current | `data/demo_data.xml` |
| Post-init recompute of amount and internal flag | Current | `hooks.py` — signature differs from Odoo 17 `env` hooks; see PRD |

Screenshots: `docs/timesheet_v2_my_dashboard.png`, `docs/timesheet_v2_my_timesheet.png`.

### JB Mail Inbox (`addons/jb_mail_inbox/`)

Version `17.0.3.0.0`. Application.

| Feature | Status | Evidence |
|---|---|---|
| IMAP server configuration, SSL, folder, test, fetch | Current | `models/mail_sync_server.py` |
| 5-minute fetch cron | Current | `data/ir_cron.xml` |
| Message store with attachments and raw headers | Current | `models/mail_sync_message.py` |
| Dedup on UID and Message-ID | Current | SQL constraints |
| States new / read / archived | Current | `state` selection |
| Contact log-note routing | Current | `_route_to_contacts` |
| CRM lead log-note routing | Current | `mail_sync_message_crm.py` |
| Create lead when unmatched (default on) | Current | `crm_create_lead_if_unmatched` default True |
| Partner and lead smart buttons / views | Current | `views/res_partner_views.xml`, `crm_lead_views.xml` |
| Backfill script | Current | `work_scripts/jb_mail_inbox/backfill_crm_routing.py` |
| Manual routing test script | Current | `work_scripts/test_mail_inbox_routing/run_tests.py` |

Not auto-installed by `odoo-start.sh`.

## Completed in the 2026-07-08 line

These are the feature commits on `main`. They are the current code, not a separate historical release.

| Commit | Feature |
|---|---|
| `46516cd` | My Company hub and Dokploy deployment config |
| `d91981c` | Production database sync bundle |
| `0df0ded` | One-time bootstrap of the local dump on production start |
| `2e32ec2` | Silicon Overdrive Helpdesk |
| `eeffe89` | Auto-install helpdesk on first production boot |
| `150eb24` | Hub logo and configurable display name |
| `a6631f5` | AI assistant module |
| `49184fc` | Auto-install AI assistant on production boot |

## Changed after introduction (same day)

| Commit | Change |
|---|---|
| `91d7057` | Set production `web.base.url` to stop a login redirect loop |
| `64962a5`, `c98d8b5`, `e1d8934` | Bootstrap CLI flag fixes; skip bootstrap when the database already exists |
| `8ee23b6` | Install helpdesk when module state is not installed |
| `07fde26` | Grant helpdesk access to internal users on install and startup |
| `2734aca` | Bundle hub logo and auto-upgrade My Company on production start |
| `142f616` | Restore hub action by removing a broken logo import |
| `44db045` | Helpdesk logo for app icon and dashboard |
| `21bc5fb` | Mount full repo so addons sync on deploy |
| `8af3a47` | Restore `odoo.prod.conf` mount for database connectivity |
| `df1bfde` | Revert compose mounts to restore production uptime |

The tip commit reverts a mount change. The startup script still contains a branch that prefers `/mnt/repo/config/odoo.prod.conf` and `/mnt/repo/addons` when that path exists. `docker-compose.dokploy.yml` at `df1bfde` mounts `./addons`, `./work_scripts`, `./config/odoo.prod.conf`, and `./scripts/odoo-start.sh`. It does not mount the repo at `/mnt/repo`. Provenance: **Implemented**. Whether a Dokploy UI mount still adds `/mnt/repo` outside this file is **Unknown**.

## Planned

Documented and not found as implementation:

| Item | Source |
|---|---|
| @mention autocomplete in the hub composer | `docs/my_company.md` |
| Reactions / likes | same |
| Tagging projects and tasks in posts | same |
| Embedded Discuss panel | same |
| Manager moderation queue | same |
| Weekly highlight digest email | same |
| DALL-E / image generation | `docs/jb_ai_assistant.md` |
| Email drafting helper | same |
| Knowledge-base / company Q&A tools | same |
| Streaming chat responses | same |

## Deprecated / removed

None identified. `jb_timesheet` remains a dependency of V2 and still has its own root menu. V2 does not replace the v1 models; it extends them.

The create-ticket wizard and `is_ticket` on `project.task` are a second "ticket" concept beside `so.helpdesk.ticket`. Both are current. They are not wired to each other in the code that was read.

## Not features of this repository

- Odoo Enterprise Helpdesk.
- Inventory or delivery for returns.
- A SonarQube project file (named in the onboarding scan, absent on `main`).
- A root `README`. Module behaviour is documented in `docs/*.md` for helpdesk, My Company, and the AI assistant only.
