# Modelo de Datos: Project **Modulo:** project **Total Modelos:** 6+ **Modelos Documentados:** 5 (principales) --- ## 1. Indice de Modelos Principales | Modelo | Descripcion | Lineas | Archivo | |--------|-------------|--------|---------| | project.task | Tareas | 2,212 | project_task.py | | project.project | Proyectos | 1,443 | project_project.py | | project.task.type | Etapas tareas | 239 | project_task_type.py | | project.milestone | Hitos | 143 | project_milestone.py | | project.project.stage | Etapas proyectos | 83 | project_project_stage.py | --- ## 2. Detalle por Modelo ### 2.1 project.task (Tareas) **Archivo:** `models/project_task.py` **Descripcion:** Task **Hereda de:** portal.mixin, mail.thread.cc, mail.activity.mixin, rating.mixin, mail.tracking.duration.mixin #### Estados (state) | Estado | Nombre UI | Tipo | |--------|-----------|------| | 01_in_progress | In Progress | OPEN | | 02_changes_requested | Changes Requested | OPEN | | 03_approved | Approved | OPEN | | 04_waiting_normal | Waiting | OPEN | | 1_done | Done | CLOSED | | 1_canceled | Cancelled | CLOSED | #### Campos Principales | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre tarea | | active | Boolean | No | Activa | | state | Selection | Si | Estado actual | | stage_id | Many2one | No | Etapa kanban | | priority | Selection | No | Prioridad (0/1) | | sequence | Integer | No | Orden | | is_closed | Boolean | No | Estado cerrado (computed) | #### Campos de Proyecto | Campo | Tipo | Descripcion | |-------|------|-------------| | project_id | Many2one | Proyecto contenedor | | displayed_image_id | Many2one | Imagen destacada | | partner_id | Many2one | Cliente | | company_id | Many2one | Empresa | #### Campos de Asignacion | Campo | Tipo | Descripcion | |-------|------|-------------| | user_ids | Many2many | Asignados | | date_assign | Datetime | Fecha asignacion | #### Campos de Fechas | Campo | Tipo | Descripcion | |-------|------|-------------| | date_deadline | Datetime | Fecha limite | | date_end | Datetime | Fecha fin | | date_last_stage_update | Datetime | Ultima actualizacion etapa | #### Campos de Subtareas | Campo | Tipo | Descripcion | |-------|------|-------------| | parent_id | Many2one | Tarea padre | | child_ids | One2many | Subtareas | | subtask_count | Integer | Cantidad subtareas | #### Campos de Dependencias | Campo | Tipo | Descripcion | |-------|------|-------------| | depend_on_ids | Many2many | Bloqueada por | | dependent_ids | Many2many | Bloquea a | #### Campos de Milestone | Campo | Tipo | Descripcion | |-------|------|-------------| | milestone_id | Many2one | Hito asociado | #### Campos de Recurrencia | Campo | Tipo | Descripcion | |-------|------|-------------| | recurring_task | Boolean | Es recurrente | | recurrence_id | Many2one | Patron recurrencia | | repeat_interval | Integer | Cada X periodos | | repeat_unit | Selection | day/week/month/year | | repeat_type | Selection | forever/until | | repeat_until | Date | Fecha fin recurrencia | #### Campos Etapas Personales | Campo | Tipo | Descripcion | |-------|------|-------------| | personal_stage_type_ids | Many2many | Etapas del usuario | | personal_stage_id | Many2one | Etapa personal actual | --- ### 2.2 project.project (Proyectos) **Archivo:** `models/project_project.py` **Descripcion:** Project **Hereda de:** portal.mixin, mail.alias.mixin, rating.parent.mixin, mail.activity.mixin, analytic.plan.fields.mixin #### Campos Principales | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre proyecto | | active | Boolean | No | Activo | | sequence | Integer | No | Orden | | partner_id | Many2one | No | Cliente | | company_id | Many2one | Si | Empresa | | user_id | Many2one | No | Project Manager | | date_start | Date | No | Fecha inicio | | date | Date | No | Fecha fin | #### Campos de Tareas | Campo | Tipo | Descripcion | |-------|------|-------------| | task_ids | One2many | Tareas del proyecto | | task_count | Integer | Total tareas | | open_task_count | Integer | Tareas abiertas | | closed_task_count | Integer | Tareas cerradas | | type_ids | Many2many | Etapas habilitadas | #### Campos de Visibilidad | Campo | Tipo | Descripcion | |-------|------|-------------| | privacy_visibility | Selection | Visibilidad | | privacy_visibility_warning | Char | Advertencia | #### Campos Analiticos | Campo | Tipo | Descripcion | |-------|------|-------------| | account_id | Many2one | Cuenta analitica | #### Campos de Configuracion | Campo | Tipo | Descripcion | |-------|------|-------------| | allow_subtasks | Boolean | Permitir subtareas | | allow_milestones | Boolean | Permitir milestones | | allow_task_dependencies | Boolean | Permitir dependencias | | allow_recurring_tasks | Boolean | Permitir recurrencia | --- ### 2.3 project.task.type (Etapas de Tareas) **Archivo:** `models/project_task_type.py` **Descripcion:** Task Stage | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre etapa | | sequence | Integer | No | Orden (default=1) | | fold | Boolean | No | Etapa final/plegada | | project_ids | Many2many | No | Proyectos asociados | | user_id | Many2one | No | Propietario (personal) | | rating_active | Boolean | No | Solicitar calificacion | | rotting_threshold_days | Integer | No | Dias sin actualizar | | mail_template_id | Many2one | No | Template email | --- ### 2.4 project.milestone (Hitos) **Archivo:** `models/project_milestone.py` **Descripcion:** Project Milestone | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre hito | | deadline | Date | No | Fecha limite | | is_reached | Boolean | No | Alcanzado | | project_id | Many2one | Si | Proyecto | | task_ids | One2many | No | Tareas vinculadas | | task_count | Integer | No | Total tareas | | done_task_count | Integer | No | Tareas completadas | --- ### 2.5 project.project.stage (Etapas de Proyectos) **Archivo:** `models/project_project_stage.py` **Descripcion:** Project Stage | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre etapa | | sequence | Integer | No | Orden | | fold | Boolean | No | Plegada | | color | Integer | No | Color | | mail_template_id | Many2one | No | Template notificacion | --- ## 3. Diagrama Entidad-Relacion ``` ┌───────────────────────┐ task_ids ┌───────────────────────┐ │ project.project │─────────────────────►│ project.task │ │ │ │ │ │ - name │ project_id │ - name │ │ - task_count │◄──────────────────────│ - state │ │ - allow_subtasks │ │ - stage_id │ │ - account_id │ │ - user_ids │ └───────────┬───────────┘ └───────────┬───────────┘ │ │ │ type_ids parent_id, child_ids ▼ │ ┌───────────────────────┐ ┌───────────┴───────────┐ │ project.task.type │ │ project.task │ │ │ │ (subtarea) │ │ - fold │ └───────────────────────┘ │ - sequence │ │ - project_ids │ milestone_id ┌───────────────────────┐ └───────────────────────┘ │ project.milestone │ │ │ ┌───────────────────────┐◄──────────────────────│ - deadline │ │ project.task │ │ - is_reached │ │ │ │ - task_count │ │ - milestone_id │ └───────────────────────┘ └───────────────────────┘ DEPENDENCIAS: ┌───────────────────────┐ depend_on_ids ┌───────────────────────┐ │ project.task │◄────────────────────►│ project.task │ │ (bloqueada) │ dependent_ids │ (bloquea) │ └───────────────────────┘ └───────────────────────┘ ``` --- ## 4. Constantes del Modulo ```python # Estados cerrados CLOSED_STATES = { '1_done': 'Done', '1_canceled': 'Cancelled', } # Estados abiertos = todos excepto CLOSED_STATES # Campos leibles por portal PROJECT_TASK_READABLE_FIELDS = { 'id', 'active', 'priority', 'project_id', 'user_ids', 'date_deadline', 'subtask_count', 'milestone_id', 'stage_id', 'tag_ids', ... } # Campos escribibles por portal PROJECT_TASK_WRITABLE_FIELDS = { 'name', 'description', 'partner_id', 'date_deadline', 'stage_id', 'state', ... } ``` --- ## 5. Tabla Etapas Personales ``` project.task.stage.personal (tabla: project_task_user_rel) | task_id | user_id | stage_id | |---------|---------|----------| | 1 | 5 | 10 | | 1 | 7 | 12 | Cada usuario puede tener diferente etapa para la misma tarea ``` --- ## 6. Constraints (Restricciones) | Modelo | Campos | Validacion | Mensaje | |--------|--------|------------|---------| | project.task | company_id, partner_id | Tarea y partner deben ser misma empresa | Task and partner must be same company | | project.task | child_ids, project_id | Tarea con subtareas no puede ser privada | Task with subtasks cannot be private | | project.task | depend_on_ids | No dependencias ciclicas | Two tasks cannot depend on each other | | project.task | parent_id | No jerarquia recursiva | Cannot create recursive hierarchy | | project.task.type | user_id, project_ids | Etapa personal no puede vincularse a proyectos | Personal stage cannot link to projects | | project.project | stage_id | Etapa debe ser misma empresa | Stage must be same company as project | | project.task.recurrence | repeat_interval | Intervalo debe ser > 0 | Interval should be greater than 0 | | project.task.recurrence | repeat_type, repeat_until | Fecha fin debe ser futura | End date should be in the future | --- **Referencias:** - Carpeta models: `addons/project/models/`