Draft:Module Event Organization

(Draft page, no need to be translated) This is a draft on how the "Event Organization" module can be designed.

This module will be used to organize Events: An event can be a congress, a summit, a DevCamp, a forum, a training campaign, a virtual congress. We must be able to organize an event by defining and following tasks. Also we must be able to group a lot of existing element of an event (proposal, invoices, stocks movement, etc...). For this reason, an event will be a Dolibarr project. But we will add a new role "usage_organize_event"

Module Event Organization

An event can be a congress, a summit, a training campaign, a virtual congress...

  • We must be able to organize an event by defining and following tasks.
  • We must be able to group on same Event, a lot of existing elements of this event (proposals, invoices, stocks movement, events in agenda, etc...).
  • We must be able to bill time spent for organization of the event and have a view of the balance revenues/expenses of the event.

=> So an Event Organization must be a "Project" with the new role: "Organize an event" because all this features already exists on project.

  • An event may contains 1 to n Conference, and|or 1 to n Booths.

Add a module 'Event Organization':

  • A dependency must be added to enable module Project when we enable this new module Event Organization.
  • Into the setup page of the Event Organization module:
- Define a list of label of tasks to create automatically when we validate a Project with role usage_organize_event. For example "Send Call for Conference", "Send Call for Booth", "Receive call for conferences", "Receive call for Booth", "Open subscriptions to events for attendees", "Send remind of event to speakers", "Send remind of event to Booth hoster", "Send remind of event to attendees" => Field textarea separate by return char
- Category to add to third-parties automatically created when someone suggests a conference.
- Category to add to third-parties automatically created when they suggests a booth.
- Template of email to send after receiving a suggestion of a conference.
- Template of email to send after receiving a suggestion of a booth.
- Template of email to send  after a subscription to a booth has been paid.
- Template of email to send after a subscription to an event has been paid.
- Template of email of massaction to attendes
- Template of email of massaction to speakers

Changes to do in Project module:

  • Add a new role (so a new field) on project when module Organize Event is on, called "Organize event" (under role "Follow tasks" and "Bill time spent"). The field is already in project table with name "usage_organize_event"

=> On the new tab Conference or Booth (see below)

  • Add a field "Allow unknown people to suggest conferences" (integer 0 or 1)
  • Add a field "Allow unknown people to suggest booth" (integer 0 or 1)
  • Add a field "Price of registration" in project
  • Add a field "Price of booth" in project
  • Link to ICS

Trigger on validation of project

Into the trigger of module EventOrganization :

When a project is validated, if usage_organize_event is set, create automatically the tasks defined into setup (if task with this label do not exist)

New object ConferenceOrBooth

  • Add a new object ConferenceOrBooth with properties (Extend ActionComm class data will be store in the same table with specific event type "ConferenceOrBooth" system type create at module activation):
  • New card and list will be created with module builder
- Parent id of EventOrganization (the ID of event this conference or Booth is part of)( Project ID)
- Label => Required
- Description => required on public page only)
- Conference Speaker or Booth responsible (Id to third party)
- Format mandatory (A dictionary with fields:   code, label, type). Dictionary must be prefilled with sql data 
  "ONLINECONF", "Online/Virtual conference", "conference"
  "INDOORCONF", "Indoor conference", "conference"
  "ONLINEBOOTH", "Online/Virtual booth", "booth", 
  "INDOORBOOTH", "Indoor booth", "booth  => Required
- Status ("Draft", "Suggested", "Confirmed", "Not qualified", "Canceled", "Done")  => Required
- Planned start date/hour  => Required for status Confirmed
- Planned end date/hour
- num_vote
- Booth paid (0 = default or 1)
  • Add a tab with list of attendees (see object ConferenceOrBoothAttendee)
We must have a + button to be able to add an attendee (An attendee will be a prospect third party with a given Tag). A link will be saved between third party and ConferenceOrBooth object into table ConferenceOrBoothAttendees.

We must be able to add/remove an attendee from backoffice.


ConferenceOrBooth card must be displayed bellow the Event/project Card (like in Project and task tab)


Add also a link on the ConferenceorBooth object to the payment page /public/payment/newpayment.php to pay a booth (with typeobject and Id of ConferenceorBooth) .

Add also a link on the ConferenceOrBoothAttendee object to the payment page /public/payment/newpayment.php to pay a booth (with typeobject and Id of ConferenceOrBoothAttendee) .


Add Contact/Adress Tab with role "Conference Speaker" or "Booth responsible"

  • Need to create role at module activation

Public pages to register (as speaker or booth responsible)

Public page for create and vote(list)

If role "Organize event" is checked on project (checkbox "Event on project), show a link on Project (on conference tab) page to a public "Page for conferences or booth" (/public/project/index.php. See example of /public/payment/newpayment.php). This page show the name or project and the public note of project and has a button "Suggest a new conference" (if field suggest conferences is on), "View and vote for suggested events (displayed only Confirmed Conférence or booth) " (vote will be control by cookies as in survey module), "Suggest a booth" (if field suggest booth is on). Same architecture than the public payment page.

Suggesting a "new conference" event from public page will add a third-party + contact record ("supplier" identified by email with the category defined into setup) if record does not exist yet (if thirdparty record found and not contact only create contact, if contact exists do nothing, if none of them create both). It will also add a record "ConferenceBooth". All submitted events will be visible with status on the second page "View and vote for suggested events".

Suggesting a "new booth" event from public page will add a third-party + contact record ("supplier" identified by email with the category defined into setup) if record does not exist yet(if thirdparty record found and not contact only create contact, if contact exists do nothing, if none of them create both). It will also add a record "ConferenceBooth". If a price for booth is defined, create an invoice and redirect to page of public payment.

Send an email from emails templates.

Public pages to register (as attendee of an event)

  • If role "Organize event" is checked, add a new link to a public "Page for attendees subscription" with a form to subscribe to the event. When someone register, we will add third-party record "prospect" and add a link between third-party and project into object "ConferenceOrBoothAttendee". If a "Price of registration" has been set on project/event, create an invoice and redirect to public payment page.

Modify the public payment page so when an invoice linked to an ConferenceOrBoothAttendee is paid, the subscription is confirmed.

Send an email from emails templates.

(can be inspired from public/members/new.php)

New tab on project

  • If the checkbox "Organize event": Add a tab on project card called "Organized event". In this tab, show list of ConferencesOrBooth with button + to add a new one.
  • Can click on a conference ref to open conference record (ConferenceOrBooth card must be displayed bellow the Event/project Card (like in Project and task tab)).
  • Add also button "Send emailing to contact ConferenceOrBooth" => On mass action
  • Add also button "Send emailing to attendees" => On mass action

Add substitution variable for link to ICS file of event

The module must add a substitution variable that will be public link to download an ICS file of the event.

Add a public url to ICS file

Add a public url to be able to download an ICS file of an event. (inspired by public/agenda/agendaexport.php)

Enhance the public payment page

Enhance the existing public page to make payment so we can provide an id of event to show the amount on payment page. Once payment has been done, we must generate an invoice linked to the project and record payment.

New object ConferenceOrBoothAttendee

  • Properties of object ConferenceOrBoothAttendee (link between Third-party and ConferenceBooth):
- Attendee (Id to third-party prospect)
- Email (Thirdparty email) (index unique 1)
- Project ConférenceOrBooth id (Id of project) (index unique 1)
- Date of subscription
- Amount of subscription paid

On update thirdparty email, check mail attendees to update (as what to do if unique index broke)

ConferenceOrBoothAttendees card must be displayed bellow the Event/project Card (like in Project and task tab)

Menus

  • Enabling the module will also add menu entries into project menu:
- Organized events
   - List => Project List filter by project with attribute "Event" 
   - New => New project card  by project with attribute "Event" prechek an other case nocheck
- ConferenceOrBooth 
   - List
   - New

Permissions

  • read (Read conference or booth, attendees)
  • create/modify (Create/modify conference or booth, attendees)
  • delete (Delete conference or booth, remove attendees)

Note

Module and new managed objects must be generated with Module ModuleBuilder.

Goal is to have module included in core so modification of core files is possible. However, process to submit the work must follow this rule:

  • A) Code submission must be done using Pull Request on GitHub.
  • B) PR content must be the smaller as possible. Each PR must keep the application working the same way as before the merge, when the module is not enabled. For example, you can make one PR for the database addition and migration, and another PR for adding the module descriptor, another one for adding a page, another one for modifying a core file keeping backward compatibility, ...)
  • C) PR must be atomic (PR must be submitted only once everything seems stable inside 1 PR.

For example, you can't push one PR to make the migration of tables to add a field and another for the script to create the table for a first installation. If you do this, it means there is an inconsistency into the snapshot if we merge only one PR and not the other one.

  • D) Try to wait that first PR are merged to continue to submit other PR to follow previous rules.

For example: if you add a page that use a new field and want to do it into a different PR to match rule B, wait the previous PR that add that the creation/migration of the new field has been merged. If not, you will break the rule C.

All other development rules must be applied. If not, the PR will not be refused and if development of module were subcontracted, delivery will be refused and payment may not be done.