4 Commits

4 changed files with 193 additions and 73 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "odoo-mpm", "name": "odoo-mpm",
"version": "0.4.0", "version": "0.4.1",
"description": "Connects Claude to MPM's Odoo instance (mpmedia.odoo.com) — Products, Knowledge, Contacts, Sales, CRM, Project (full), Helpdesk, Purchase, Inventory, Employees, eLearning, and bulk utilities.", "description": "Connects Claude to MPM's Odoo instance (mpmedia.odoo.com) — Products, Knowledge, Contacts, Sales, CRM, Project (full), Helpdesk, Purchase, Inventory, Employees, eLearning, and bulk utilities.",
"author": { "name": "Message Point Media" }, "author": { "name": "Message Point Media" },
"keywords": ["odoo", "erp", "mpm", "project", "crm", "helpdesk", "sales", "inventory", "elearning", "courses"] "keywords": ["odoo", "erp", "mpm", "project", "crm", "helpdesk", "sales", "inventory", "elearning", "courses"]
+45 -68
View File
@@ -2,7 +2,7 @@
MPM Odoo ERP plugin for Claude Cowork — connects to mpmedia.odoo.com via XML-RPC with proxy-aware transport. MPM Odoo ERP plugin for Claude Cowork — connects to mpmedia.odoo.com via XML-RPC with proxy-aware transport.
**Version:** 0.4.0 **Version:** 0.4.1
**Author:** Message Point Media **Author:** Message Point Media
**Repo:** https://git.mpm.to/mpm/odoo-mpm-plugin **Repo:** https://git.mpm.to/mpm/odoo-mpm-plugin
**CoWork Project:** CW-003 — Odoo V19 MCP Bridge **CoWork Project:** CW-003 — Odoo V19 MCP Bridge
@@ -11,7 +11,7 @@ MPM Odoo ERP plugin for Claude Cowork — connects to mpmedia.odoo.com via XML-R
## Overview ## Overview
This plugin bridges Claude Cowork to MPM's Odoo ERP instance at mpmedia.odoo.com. It runs a local MCP server (`odoo-mpm`) via `uv` that exposes read/write access across 12 modules: Products, Knowledge (with Templates), Contacts, Sales, CRM, Project (full CRUD + milestones + subtasks + chatter + followers + stages), Helpdesk, Purchase, Inventory, Employees, eLearning, and Utilities. This plugin bridges Claude Cowork to MPM's Odoo ERP instance at mpmedia.odoo.com. It runs a local MCP server (`odoo-mpm`) via `uv` that exposes read/write access across 13 modules: Products, Knowledge (with Templates), Contacts, Sales, CRM, Project (full CRUD + milestones + subtasks + chatter + followers + stages + checklists), Helpdesk, Purchase, Inventory, Employees, eLearning, Task Checklists (Cybrosys), and Utilities.
Credentials are personal — each user authenticates with their own Odoo API key, stored securely in the OS keystore (macOS Keychain / Windows Credential Manager / Linux Secret Service). Keys are never written to disk. Credentials are personal — each user authenticates with their own Odoo API key, stored securely in the OS keystore (macOS Keychain / Windows Credential Manager / Linux Secret Service). Keys are never written to disk.
@@ -21,7 +21,7 @@ Credentials are personal — each user authenticates with their own Odoo API key
| Skill | What It Does | | Skill | What It Does |
|---|---| |---|---|
| `odoo` | Full read/write access to MPM's Odoo instance. Triggers on: "in Odoo", "our products", "the knowledge base", "find a contact", "sales order", "opportunity", "project tasks", "helpdesk ticket", "purchase order", "stock", "inventory", "employee", "what stage is", "create a task", "update the ticket", "cancel quotation", "cancel quote", "archive", "mark lost", "bulk update", "how many records", "count of", "stage id for", "resolve stage", "search with filters", "filter by", "lost reasons", "course", "training", "elearning", "lesson", "slide", "quiz", "enroll", "enrollment", "publish course", "create course", "add lesson" | | `odoo` | Full read/write access to MPM's Odoo instance. Triggers on: "in Odoo", "our products", "the knowledge base", "find a contact", "sales order", "opportunity", "project tasks", "helpdesk ticket", "purchase order", "stock", "inventory", "employee", "create a task", "update the ticket", "cancel quotation", "archive", "mark lost", "bulk update", "how many records", "stage id for", "lost reasons", "course", "training", "elearning", "lesson", "slide", "quiz", "enroll", "create project", "archive project", "milestone", "subtask", "add follower", "post a note", "task chatter", "create stage", "checklist", "archive task" |
--- ---
@@ -37,13 +37,15 @@ Credentials are personal — each user authenticates with their own Odoo API key
| **Sales** | `search_sales_orders`, `get_sales_order`, `create_sales_order`, `cancel_sale_orders`, `cancel_and_archive_quotations` | | **Sales** | `search_sales_orders`, `get_sales_order`, `create_sales_order`, `cancel_sale_orders`, `cancel_and_archive_quotations` |
| **CRM** | `search_crm_leads`, `get_crm_lead`, `create_crm_lead`, `update_crm_lead`, `list_crm_stages`, `mark_crm_lead_lost`, `list_crm_lost_reasons` | | **CRM** | `search_crm_leads`, `get_crm_lead`, `create_crm_lead`, `update_crm_lead`, `list_crm_stages`, `mark_crm_lead_lost`, `list_crm_lost_reasons` |
| **Project — Core** | `list_projects`, `get_project`, `search_tasks`, `get_task`, `create_task`, `update_task`, `list_task_stages` | | **Project — Core** | `list_projects`, `get_project`, `search_tasks`, `get_task`, `create_task`, `update_task`, `list_task_stages` |
| **Project — CRUD** | `create_project`, `update_project`, `archive_project` | | **Project — CRUD** | `create_project` *(supports `parent_id` for sub-projects)*, `update_project`, `archive_project` |
| **Project — Milestones** | `list_milestones`, `create_milestone`, `update_milestone` | | **Project — Milestones** | `list_milestones`, `create_milestone`, `update_milestone` |
| **Project — Task Chatter** | `post_task_message`, `get_task_messages` | | **Project — Task Chatter** | `post_task_message`, `get_task_messages` |
| **Project — Subtasks** | `get_task_subtasks`, `create_subtask` | | **Project — Subtasks** | `get_task_subtasks`, `create_subtask` |
| **Project — Lifecycle** | `archive_task` | | **Project — Lifecycle** | `archive_task` |
| **Project — Followers** | `add_task_follower`, `remove_task_follower` | | **Project — Followers** | `add_task_follower`, `remove_task_follower` |
| **Project — Stages** | `create_task_stage`, `update_task_stage` | | **Project — Stages** | `create_task_stage`, `update_task_stage` |
| **Project — Drive Link** | `link_drive_document_to_project` |
| **Project — Checklists** | `list_checklist_templates`, `get_task_checklists`, `add_checklist_to_task`, `update_checklist_item` |
| **Helpdesk** | `search_helpdesk_tickets`, `get_helpdesk_ticket`, `create_helpdesk_ticket`, `update_helpdesk_ticket`, `list_helpdesk_teams` | | **Helpdesk** | `search_helpdesk_tickets`, `get_helpdesk_ticket`, `create_helpdesk_ticket`, `update_helpdesk_ticket`, `list_helpdesk_teams` |
| **Purchase** | `search_purchase_orders`, `get_purchase_order` | | **Purchase** | `search_purchase_orders`, `get_purchase_order` |
| **Inventory** | `search_inventory`, `get_stock_moves`, `list_internal_locations` | | **Inventory** | `search_inventory`, `get_stock_moves`, `list_internal_locations` |
@@ -55,53 +57,17 @@ Credentials are personal — each user authenticates with their own Odoo API key
| **eLearning — Media** | `set_course_cover`, `set_slide_cover`, `link_drive_document`, `add_course_resource` | | **eLearning — Media** | `set_course_cover`, `set_slide_cover`, `link_drive_document`, `add_course_resource` |
| **Utilities** | `odoo_search`, `odoo_get_record`, `odoo_search_read`, `get_record_count`, `bulk_update_records`, `archive_records`, `get_stage_ids`, `call_odoo_method` | | **Utilities** | `odoo_search`, `odoo_get_record`, `odoo_search_read`, `get_record_count`, `bulk_update_records`, `archive_records`, `get_stage_ids`, `call_odoo_method` |
### Knowledge Article Icon Support ### Task Checklists (Cybrosys `projects_task_checklists` v19.0.1.0.0)
`create_knowledge_article`, `update_knowledge_article`, and `get_knowledge_article` all support an `icon` parameter — a Unicode emoji (e.g. `"⚙️"`, `"🔌"`, `"🖥️"`) that sets the article's icon in the KB tree. Browse emojis at: **https://emojipedia.org** Models: `task.checklist` (templates), `checklist.item` (template items), `checklist.item.line` (per-task instances).
State values: `todo` / `in_progress` / `done` / `cancel` — no `is_done` field.
`update_checklist_item` uses Odoo action methods so task progress % and chatter update automatically.
Primary use case: phase acceptance criteria on Odoo Implementation project tasks.
### Project — Drive Link
`link_drive_document_to_project` attaches a Google Drive URL to a `project.project` record as an `ir.attachment` (type=url). Appears in the project's Attachments panel.
### Projects Module (v0.4.0) ### Projects Module (v0.4.1 / v0.4.0)
15 new tools completing full project lifecycle management. `create_project` now accepts `parent_id` (int) to create sub-projects within a programme hierarchy.
**Project CRUD:** Create projects with configurable visibility (`employees` / `portal` / `followers`), update metadata, archive/restore.
**Milestones:** Full CRUD on `project.milestone`. `update_milestone(is_reached=True)` marks complete; `list_milestones` filters to open by default.
**Task chatter:** `post_task_message` posts comments or internal notes to a task's chatter thread (`comment` vs `internal` message_type). `get_task_messages` returns the full message history.
**Subtasks:** `get_task_subtasks` returns all direct children of a task. `create_subtask` links a new task to a parent and inherits the parent's project if none specified.
**Followers:** `add_task_follower` / `remove_task_follower` accept either `partner_ids` or `user_ids` — user IDs are resolved to partner IDs automatically before calling `message_subscribe` / `message_unsubscribe`.
**Stage management:** `create_task_stage` creates a kanban column and links it to one or more projects. `update_task_stage` supports incremental `add_project_ids` / `remove_project_ids` without replacing the full association list.
---
### eLearning Module (v0.3.0)
22 tools across 5 groups for building and managing internal, reseller, and end-client courses.
**Slide types:** `pdf` (Drive link), `youtube_video`, `vimeo_video`, `infographic`, `webpage` (native HTML article)
**Google Drive policy:** All image and document operations use the Google Workspace MCP connector when available. The skill never asks the user to construct or copy Drive URLs unless the connector is absent.
**Audience tiers** via course settings:
- Internal employees: `visibility=members`, `enroll=invite`, `enroll_group_names=['Internal Users']`
- Resellers: `visibility=connected`, `enroll=public`
- End-clients: `visibility=public`, `enroll=public`
**Onboarding hook:** `enroll_in_course` and `bulk_enroll` are designed to be called by the project management plugin to automatically enroll new customers in courses on contract/onboarding events.
**Quiz generation:** Read course content → Claude generates questions → call `generate_quiz` to write all at once.
### Sales Cancellation Safety Guard
`cancel_sale_orders` and `cancel_and_archive_quotations` **only operate on orders in Quotation (draft) or Quotation Sent (sent) state**. Both tools pre-validate all IDs and raise a named error listing any orders in other states before touching anything. Confirmed Sale Orders cannot be cancelled via Claude.
### Utility Tools (v0.2.0)
- **`odoo_search_read`** — preferred for efficient queries: full domain filter + return only specified fields. Avoids token bloat vs. `odoo_get_record`.
- **`get_record_count`** — count matching records without fetching data. Use before bulk operations.
- **`bulk_update_records`** — set one or more fields on a list of IDs in a single API call. Works for stages, custom Studio fields (`x_studio_*`), status flags.
- **`archive_records`** — soft-delete via `active=False`. For `sale.order`, cancel first.
- **`get_stage_ids`** — resolve stage names to IDs with case-insensitive exact matching across `crm.stage`, `project.task.type`, `helpdesk.stage`.
- **`call_odoo_method`** — escape hatch for any model method not covered by other tools.
--- ---
@@ -112,19 +78,11 @@ Full install guide: [MPM Odoo Plugin — Install Guide](https://docs.google.com/
**Quick summary:** **Quick summary:**
1. **Install the plugin** — Claude Desktop: Settings → Plugins → Add Plugin → paste `https://git.mpm.to/mpm/odoo-mpm-plugin`. Or double-click the `.plugin` file from the [CW-003 Drive folder](https://drive.google.com/drive/folders/1RYRUFKAltyp9nxcz203_TSD8eAABcuw5). 1. **Install the plugin** — Claude Desktop: Settings → Plugins → Add Plugin → paste `https://git.mpm.to/mpm/odoo-mpm-plugin`. Or double-click the `.plugin` file from the [CW-003 Drive folder](https://drive.google.com/drive/folders/1RYRUFKAltyp9nxcz203_TSD8eAABcuw5).
2. **Verify `uv` is installed** — Run `which uv` in terminal. If missing — Mac/Linux: `curl -LsSf https://astral.sh/uv/install.sh | sh`. Windows: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`. 2. **Verify `uv` is installed** — Run `which uv` in terminal. If missing — Mac/Linux: `curl -LsSf https://astral.sh/uv/install.sh | sh`.
3. **Restart Claude Desktop** — Quit and relaunch. `uv` auto-installs Python dependencies (`keyring`) on first start. 3. **Restart Claude Desktop** — Quit and relaunch.
4. **Generate a personal Odoo API key** — Odoo → Avatar → My Profile → Account Security → API Keys → New API Key → set expiration to **No Limit**. Copy immediately — not shown again. 4. **Generate a personal Odoo API key** — Odoo → Avatar → My Profile → Account Security → API Keys → New API Key → set expiration to **No Limit**.
5. **Connect** — In CoWork, type "Set up my Odoo credentials". Claude will prompt for your Odoo login email and API key. 5. **Connect** — In CoWork, type "Set up my Odoo credentials".
6. **Verify** — Ask Claude: "List my Odoo projects". A project list confirms full connectivity. 6. **Verify** — Ask Claude: "List my Odoo projects".
### Setup Checklist
- [ ] Plugin installed (URL or `.plugin` file)
- [ ] `uv` installed and in terminal PATH
- [ ] Claude restarted after install
- [ ] Odoo API key generated (No Limit expiration)
- [ ] `setup_odoo_credentials` completed
- [ ] "List my Odoo projects" returns data
--- ---
@@ -140,13 +98,31 @@ Full install guide: [MPM Odoo Plugin — Install Guide](https://docs.google.com/
--- ---
## Workflow Notes ## Changelog
- Before updating a task or ticket stage, call `list_task_stages` or `get_stage_ids` to confirm valid stage IDs. ### v0.4.1 (2026-05-29)
- Use `odoo_search_read` for any query where you only need specific fields — more efficient than `odoo_get_record`. - `create_project` now accepts `parent_id` for sub-project hierarchy
- Knowledge article bodies are HTML — use basic HTML formatting when creating or updating. - New tool: `link_drive_document_to_project` — attach Drive URL to project.project as ir.attachment
- Before calling `mark_crm_lead_lost`, call `list_crm_lost_reasons` to show the user available reasons. - New Cybrosys checklist tools (4): `list_checklist_templates`, `get_task_checklists`, `add_checklist_to_task`, `update_checklist_item`
- Before calling `cancel_sale_orders`, verify orders are in `draft` or `sent` state — the tool will reject anything else with a clear error. - Built against actual Cybrosys module source (task.checklist / checklist.item / checklist.item.line)
- 97 total tools
### v0.4.0 (2026-05-28)
- Full Projects module (15 new tools): `create_project`, `update_project`, `archive_project`, `list_milestones`, `create_milestone`, `update_milestone`, `post_task_message`, `get_task_messages`, `get_task_subtasks`, `create_subtask`, `archive_task`, `add_task_follower`, `remove_task_follower`, `create_task_stage`, `update_task_stage`
- SKILL.md description trimmed to ≤100 words (plugin validator hard limit — documented)
- 92 total tools
### v0.3.0 (2026-05-28)
- eLearning module (22 new tools): Courses, Slides, Quiz, Enrollment, Media
### v0.2.0 (2026-05-28)
- Sales cancellation safety guard, bulk utilities, CRM lost reasons, Knowledge Templates
### v0.1.3 (2026-05-18)
- Knowledge article icon support
### v0.1.2 (2026-05-05)
- Initial CoWork registration
--- ---
@@ -167,3 +143,4 @@ Full install guide: [MPM Odoo Plugin — Install Guide](https://docs.google.com/
| Authentication failed | Rotate Odoo API key; run `clear_odoo_credentials` then `setup_odoo_credentials` | | Authentication failed | Rotate Odoo API key; run `clear_odoo_credentials` then `setup_odoo_credentials` |
| Keychain prompt on first use | Normal — allow it | | Keychain prompt on first use | Normal — allow it |
| `cancel_sale_orders` refused | Check order state — only `draft`/`sent` allowed | | `cancel_sale_orders` refused | Check order state — only `draft`/`sent` allowed |
| Plugin validation failed | Check SKILL.md description word count — must be ≤100 words |
+130 -2
View File
@@ -714,16 +714,20 @@ def list_task_stages(project_id: int = None) -> list:
@mcp.tool() @mcp.tool()
def create_project(name: str, description: str = "", user_id: int = None, def create_project(name: str, description: str = "", user_id: int = None,
date_start: str = "", date: str = "", date_start: str = "", date: str = "",
privacy_visibility: str = "employees") -> int: privacy_visibility: str = "employees",
parent_id: int = None) -> int:
"""Create a new project. Returns the new project ID. """Create a new project. Returns the new project ID.
parent_id: ID of the parent project.project — use to create sub-projects within a programme.
privacy_visibility: 'employees' (all employees), 'portal' (employees + invited portal users), privacy_visibility: 'employees' (all employees), 'portal' (employees + invited portal users),
'followers' (invited internal users only). 'followers' (invited internal users only).
Trigger phrases: "create project", "new project", "add a project", "start a project".""" Trigger phrases: "create project", "new project", "add a project", "start a project",
"create sub-project", "create child project"."""
vals: dict = {"name": name} vals: dict = {"name": name}
if description: vals["description"] = description if description: vals["description"] = description
if user_id: vals["user_id"] = user_id if user_id: vals["user_id"] = user_id
if date_start: vals["date_start"] = date_start if date_start: vals["date_start"] = date_start
if date: vals["date"] = date if date: vals["date"] = date
if parent_id: vals["parent_id"] = parent_id
vals["privacy_visibility"] = privacy_visibility or "employees" vals["privacy_visibility"] = privacy_visibility or "employees"
return _create("project.project", vals) return _create("project.project", vals)
@@ -937,6 +941,130 @@ def update_task_stage(stage_id: int, name: str = "", sequence: int = None,
return _write("project.task.type", stage_id, vals) if vals else False return _write("project.task.type", stage_id, vals) if vals else False
# ── Link Drive document to project ───────────────────────────────────────────
@mcp.tool()
def link_drive_document_to_project(project_id: int, drive_url: str,
name: str = "Google Drive Folder") -> int:
"""Attach a Google Drive folder or document URL to a project.project record
as an ir.attachment of type 'url'. The link appears in the project's
Attachments panel in Odoo. Returns the new attachment ID.
Trigger phrases: "link drive folder to project", "attach drive to project",
"add drive link to project", "connect drive folder"."""
return _create("ir.attachment", {
"name": name,
"type": "url",
"url": drive_url,
"res_model": "project.project",
"res_id": project_id,
})
# ── Task Checklists (projects_task_checklists — Cybrosys) ─────────────────────
# Models: task.checklist (templates), checklist.item (template items),
# checklist.item.line (per-task instances). State: todo/in_progress/done/cancel.
# project.task extended with: checklist_id (Many2one), checklists_ids (One2many via projects_id).
@mcp.tool()
def list_checklist_templates(query: str = "", limit: int = 30) -> list:
"""List available task.checklist templates with their items.
Trigger phrases: "checklist templates", "list checklists", "available checklists",
"show checklist templates"."""
domain = [["name", "ilike", query]] if query else []
templates = _search_read("task.checklist", domain,
["name", "description", "checklist_ids"], limit=limit)
for t in templates:
if t.get("checklist_ids"):
t["items"] = _search_read(
"checklist.item",
[["id", "in", t["checklist_ids"]]],
["name", "sequence", "description"],
limit=200,
)
return templates
@mcp.tool()
def get_task_checklists(task_id: int) -> list:
"""Get all checklist item lines (checklist.item.line) attached to a task,
with state and item name. State values: 'todo', 'in_progress', 'done', 'cancel'.
Task progress % is recomputed automatically from these states in Odoo.
Trigger phrases: "task checklist", "checklist items", "checklist status",
"acceptance criteria", "phase checklist", "what's checked off"."""
return _search_read(
"checklist.item.line",
[["projects_id", "=", task_id]],
["check_list_item_id", "description", "checklist_id", "state"],
limit=200,
)
@mcp.tool()
def add_checklist_to_task(task_id: int, checklist_id: int) -> int:
"""Attach a task.checklist template to a task by creating checklist.item.line records.
Idempotent — items already added for this checklist+task combination are skipped.
Also sets checklist_id on the task to the given template.
Returns count of new lines created.
Use list_checklist_templates to find valid checklist_id values.
NOTE: Replicates the UI onchange since that only fires client-side.
Trigger phrases: "add checklist to task", "attach checklist", "apply checklist",
"add acceptance criteria", "apply phase checklist"."""
# Items already present for this checklist on this task
existing = _search_read(
"checklist.item.line",
[["projects_id", "=", task_id], ["checklist_id", "=", checklist_id]],
["check_list_item_id"],
limit=200,
)
existing_item_ids = {
r["check_list_item_id"][0]
for r in existing
if isinstance(r.get("check_list_item_id"), list)
}
# Template items not yet added
items = _search_read(
"checklist.item",
[["checklist_id", "=", checklist_id]],
["id"],
limit=200,
)
new_items = [it for it in items if it["id"] not in existing_item_ids]
if not new_items:
return 0
commands = [
(0, 0, {"check_list_item_id": it["id"], "checklist_id": checklist_id, "state": "todo"})
for it in new_items
]
_write("project.task", task_id, {
"checklist_id": checklist_id,
"checklists_ids": commands,
})
return len(new_items)
@mcp.tool()
def update_checklist_item(line_id: int, state: str) -> bool:
"""Update the state of a checklist.item.line.
state: 'todo' | 'in_progress' | 'done' | 'cancel'.
Uses Odoo action methods so task progress % and chatter are updated automatically.
Use get_task_checklists to find valid line_id values.
Trigger phrases: "mark checklist item done", "check off item", "mark in progress",
"cancel checklist item", "complete acceptance criteria", "mark phase complete"."""
if state == "in_progress":
_call("checklist.item.line", "action_approve_and_next", [[line_id]], {})
elif state == "done":
_call("checklist.item.line", "action_mark_completed", [[line_id]], {})
elif state == "cancel":
_call("checklist.item.line", "action_mark_canceled", [[line_id]], {})
elif state == "todo":
_write("checklist.item.line", line_id, {"state": "todo"})
else:
raise ValueError(
f"Invalid state '{state}'. Valid values: 'todo', 'in_progress', 'done', 'cancel'."
)
return True
# ════════════════════════════════════════════════════════════════════════════ # ════════════════════════════════════════════════════════════════════════════
# HELPDESK # HELPDESK
# ════════════════════════════════════════════════════════════════════════════ # ════════════════════════════════════════════════════════════════════════════
+17 -2
View File
@@ -3,7 +3,7 @@ name: odoo
description: > description: >
Access MPM's Odoo ERP system (mpmedia.odoo.com). Modules: Products, Access MPM's Odoo ERP system (mpmedia.odoo.com). Modules: Products,
Knowledge, Contacts, Sales, CRM, Project (CRUD, milestones, subtasks, Knowledge, Contacts, Sales, CRM, Project (CRUD, milestones, subtasks,
chatter, followers, stages), Helpdesk, Purchase, Inventory, Employees, chatter, followers, stages, checklists), Helpdesk, Purchase, Inventory, Employees,
eLearning (courses, slides, quiz, enrollment), Utilities. eLearning (courses, slides, quiz, enrollment), Utilities.
Triggers on: "in Odoo", "our products", "the knowledge base", "find a Triggers on: "in Odoo", "our products", "the knowledge base", "find a
contact", "sales order", "opportunity", "project tasks", "helpdesk ticket", contact", "sales order", "opportunity", "project tasks", "helpdesk ticket",
@@ -13,7 +13,7 @@ description: >
"course", "training", "elearning", "lesson", "slide", "quiz", "enroll", "course", "training", "elearning", "lesson", "slide", "quiz", "enroll",
"create project", "archive project", "milestone", "subtask", "create project", "archive project", "milestone", "subtask",
"add follower", "post a note", "task chatter", "create stage", "add follower", "post a note", "task chatter", "create stage",
"archive task". "checklist", "archive task".
--- ---
# Odoo MPM Skill # Odoo MPM Skill
@@ -105,6 +105,21 @@ Subscribe or unsubscribe users from task notifications. Accepts `partner_ids` (r
Create new task stages (kanban columns) linked to one or more projects, or update existing stages. Create new task stages (kanban columns) linked to one or more projects, or update existing stages.
`create_task_stage` requires `project_ids` list. `update_task_stage` accepts `add_project_ids` / `remove_project_ids` for incremental association changes. `create_task_stage` requires `project_ids` list. `update_task_stage` accepts `add_project_ids` / `remove_project_ids` for incremental association changes.
### Project — Drive Link (`link_drive_document_to_project`)
Attach a Google Drive folder or document URL to a `project.project` record as an `ir.attachment` of type `url`. Appears in the project's Attachments panel. Use for the Drive↔Odoo cross-linking standard across implementation module projects.
### Project — Task Checklists (`list_checklist_templates`, `get_task_checklists`, `add_checklist_to_task`, `update_checklist_item`)
Cybrosys `projects_task_checklists` module (installed, v19.0.1.0.0). Models: `task.checklist` (templates), `checklist.item` (template items), `checklist.item.line` (per-task instances).
**Key facts:**
- `list_checklist_templates` — list templates; each has `checklist_ids` (items).
- `get_task_checklists` — returns all `checklist.item.line` records for a task with `state` and `check_list_item_id`.
- `add_checklist_to_task` — idempotent; replicates the UI onchange server-side; returns count of lines created.
- `update_checklist_item` — accepts `state`: `todo` | `in_progress` | `done` | `cancel`. Uses Odoo action methods so task progress % and chatter update automatically. No `is_done` field — use `state`.
- Task fields: `checklist_id` (active template), `checklists_ids` (lines via `projects_id`), `progress` (computed %).
**Usage pattern for phase acceptance:** `list_checklist_templates``add_checklist_to_task``get_task_checklists``update_checklist_item` as criteria are met.
### Helpdesk (`search_helpdesk_tickets`, `get_helpdesk_ticket`, `create_helpdesk_ticket`, `update_helpdesk_ticket`, `list_helpdesk_teams`) ### Helpdesk (`search_helpdesk_tickets`, `get_helpdesk_ticket`, `create_helpdesk_ticket`, `update_helpdesk_ticket`, `list_helpdesk_teams`)
Manage support tickets across helpdesk teams. Manage support tickets across helpdesk teams.