A **[[Project]]** is a transient page that serves as the identity and hub for a collection of other notes, knowledge, and activities serving a singular, unified, and finite purpose. ^about
This is a [[Class]] within the [[System]] using the [[State#Standard Action Workflow]].
If the use case has limited complexity with short time-horizon, consider using just a [[Transient]].
>[!quote|no-icon]- Dictionary Block
> ````yaml
> ---
> publish: false
> description:
> classes:
> - "[[Project]]"
> states:
> - "[[Doing]]"
> parents: # any entities involved in the project, e.g. [[Business]] or [[Group]] or [[Person]]
> sponsors: # of the parents, which one(s) are funding this work (typically a Business, not specific Persons)
> suppliers: # of the parents, which one(s) are doing the work (typically a Business, not specific Persons)
> consumers: # of the parents, which one(s) are benefitting from this work (typically a Business, not specific Persons)
> start_date: # when the project is commenced
> end_date: # when the project got completed
> ---
>
>>[!abstract] Total Hours: `$=dv.pages('"private/logs"').where(p => p.file.outlinks.includes(dv.current().file.link)).hours.values.reduce((acc, val) => acc + val, 0).toFixed(2)`
>
> ```base
> formulas:
> Edit: link(file.path, "✏️")
> views:
> - type: table
> name: Parent of Pages
> filters:
> and:
> - note.parents.contains(this.file.name)
> order:
> - file.name
> - classes
> - states
> columnSize:
> file.name: 492
> note.classes: 152
> - type: table
> name: Mentioned in Logs
> filters:
> and:
> - file.links.contains(this.file.name)
> - file.folder == "private/logs"
> order:
> - formula.Edit
> - datetime
> - hours
> - event
> sort:
> - property: datetime
> direction: DESC
> - property: event
> direction: ASC
> columnSize:
> note.datetime: 237
> note.event: 402
>
> ```
> ````
>[!quote|no-icon pub-hidden] Project List (Private)
> ```base
> filters:
> and:
> - classes.contains(this.file.asLink())
> views:
> - type: table
> name: Doing
> filters:
> and:
> - states.contains(link("Doing"))
> order:
> - file.name
> - parents
> - sponsors
> columnSize:
> file.name: 528
> note.parents: 391
> - type: table
> name: To Do
> filters:
> and:
> - states.contains(link("To Do"))
> order:
> - file.name
> - parents
> - sponsors
> columnSize:
> file.name: 528
> note.parents: 391
> - type: table
> name: Done
> filters:
> and:
> - states.containsAny(link("Cancelled"), link("Done"), link("Subsumed"))
> order:
> - file.name
> - parents
> - sponsors
> - start_date
> - end_date
> columnSize:
> file.name: 517
> note.parents: 246
> note.sponsors: 147
> note.start_date: 140
> note.end_date: 136
> - type: table
> name: All Projects
> order:
> - file.name
> - parents
> - states
> - sponsors
> - suppliers
> - consumers
> - start_date
> - end_date
>
> ```
%%
>[!info|no-icon] Active
><span class="dataview">`$=dv.execute(await dv.page("Project Doing (script)").script_local)`</span>![[Project Doing (tpdv output)|app-hidden]]
>[!quote|no-icon]- To Do
><span class="dataview">`$=dv.execute(await dv.page("Project To Do (script)").script_local)`</span>![[Project To Do (tpdv output)|app-hidden]]
>[!success|no-icon]- Done / Cancelled / Subsumed
><span class="dataview">`$=dv.execute(await dv.page("Project Done (script)").script_local)`</span>![[Project Done (tpdv output)|app-hidden]]
>[!danger|no-icon]- Invalid Action State
><span class="dataview">`$=dv.execute(await dv.page("Project Invalid (script)").script_local)`</span>![[Project Invalid (tpdv output)|app-hidden]]