| ]project-open[ Core : Projects
]project-open[ Core

# Projects

Projects are the central element of collaboration in ]project-open[. You can use projects to define groups of people who are working together on a common goal. You can also use projects as the primary unit of accounting that allows you to register the cost of the project members activity.

The diagram below shows a a number of activities related to a translation project.

### Requirements

Check the original Big Picture document from ArsDigita for the requirements of the ACS 3.4 Intranet module.

Additional requirements in ]project-open[ include:

- Integration of Companies and Providers:
  Projects need to facilitate the cooperation across company boundaries, allowing companies and providers to interact (in a "structured" way!) with company staff.
- Powerful Permission Model:
  In order to integrate companies and providers into a project we need "structured" interaction because neither companies nor providers should get all information about a project.
- "Virtual Organization":
  Today, project teams are more and more distributed spacially. The organization of projects in ]project-open[ should help to overcome these limits:
  - Across several offices of the same company
  - Across several departmens of the same company
  - Outsourced to providers at the other end of the world
  - Open-Source projects are distributed by definition
  - ...
- Flexible "Project Rooms":
  A "project room" is the list of services related to a single project. This list of services needs to be extensible using a modular approach to allow:
  - The extension of services by 3rd party companies who are specialized in specific business sectors
  - The configuration/customization of services to the needs of a specific company or business sector

### Design

Projects are implemented as a ]project-open[ business object just the same as companies, offices etc., using the same security mechanisms and using the same extension system (components, menus, categories, ...).

So the basic project structure only consists only of the "core" project properties such as company, start- and end date etc. All advanced functionality is added by extension modules.

- Admin Group is a group containing all project members (see permissions).
- Project Nr is a short unique project identifier (by default something like: "2004_0012")
- Project Path is for the filestorage module. I determines where the project files are stored in the filesystem.
- Parent ID allows to build a project hierarchy.

    create table im_projects (
            project_id              integer
                                    constraint im_projects_pk
                                    primary key
                                    constraint im_project_prj_fk
                                    references acs_objects,
                                    -- avoid using the OpenACS permission system
                                    -- because we have to ask frequently:
                                    -- "Who has read permissions on this object".
            admin_group_id          integer not null
                                    constraint im_projects_admin_group_fk
                                    references groups,
            project_name            varchar(1000) not null
                                    constraint im_projects_name_un unique,
            project_nr              varchar(100) not null
                                    constraint im_projects_nr_un unique,
            project_path            varchar(100) not null
                                    constraint im_projects_path_un unique,
            parent_id               integer
                                    constraint im_projects_parent_fk
                                    references im_projects,
            company_id             integer not null
                                    constraint im_projects_company_fk
                                    references im_companies,
            project_type_id         not null
                                    constraint im_projects_prj_type_fk
                                    references categories,
            project_status_id       not null
                                    constraint im_projects_prj_status_fk
                                    references categories,
            description             varchar(4000),
            start_date              date,
            end_date                date,
                                    -- make sure the end date is after the start date
                                    constraint im_projects_date_const
                                    check( end_date - start_date >= 0 ),
            note                    varchar(4000),
            project_lead_id         integer
                                    constraint im_projects_prj_lead_fk
                                    references users,
            supervisor_id           integer
                                    constraint im_projects_supervisor_fk
                                    references users,
            requires_report_p       char(1) default('t')
                                    constraint im_project_requires_report_p
                                    check (requires_report_p in ('t','f')),
            project_budget          number(12,2)
    );