I'm SO struggling for the name: Community Capitalism, a.k.a.
ConsumerFunded.com, PFFS.cc, ccfmr.com, humbeep.com or Nonsofree.com,
which are at the moment available. Whatever. Presently it's
tomveatch.com/pffs, a mere
personal subproject.
"This thing" will require some cloud infrastructure, including
specifically at least a database, perhaps as complex as a medium-sized
organization's accounting database.
We aim for its database table structure to be generic across
projects and participants, so new projects and people can be added
without restructuring the whole infrastructure.
Since I'm familiar with MySQL and know it to be robust to even large
organizational purposes, let's use MySQL.
Now:
DB tables
Let there be tables as follows:
- Projects, Roles, Individuals, Roles-on-projects, Tasks, Teams, Bank,
Donations, Payments, Logic (prerequisites, event, result)
Descriptions, Plans, Project-trees, Histories.
Let there be table columns as follows (including unique ID for each
table by default) (some of these are desiderata rather than column
names, so this needs some work; also please review for redundancy).
- Projects: ProjectID, primary POC (an Individual's IID), Title
(TextID), Abstract (TextID), Paper (DocumentID),
ParentProjectID.
- Roles: RoleID, role as enum {idea specifier, PI/PM, lawyer,
engineer, contractor, subcontractor, worker, donor, investor,
closer, administrator, customer/user/beneficiary, public POC};
- Individuals: IID, Personal/Family/Business Names, Email
Address, Mailing Address/St/City/State/Zip/Country, TaxID.
- Applications/Bids: BidID, from whom (IID), for what role
(RoleID), in what project (ProjectID), to carry out what spec
(SpecID) or task (TaskID), for what bid Amount, with what
schedule (ScheduleID) with what acceptance criteria (LogicID).
- Assignments: (AssignmentID, ProjectID, RoleID, IID, TeamID,
startDate, endDate.). Each row says a certain individual or
team plays a certain role on a certain project starting and
ending on dates of record (past) or planning (future). These
are concrete descriptions of job assignment and
responsibility to people.
- Roles-on-projects: AffiliateID, ProjectID, RoleID, Importance.
Each row says a project contains a certain role with some
importance level. These are abstract descriptions of need for
roles to be played.
- Teams: some roles are carried out by teams, thus a TeamID
associated with team members' IIDs, lets the TeamID be used.
TeamMemberID, TeamID, IID, RoleID, joinDate leaveDate. Each
row has a single team member. The multiple rows with the same
TeamID are one team.
- Tasks: A task is a concrete assignment of who is doing
something. Task ID, assigner role (RoleID & IID), assignee
role (RoleID & IID), description (SpecID), status (enum
{proposed, offered, agreed, future, ongoing, Milestone
1..120, finishing, done}), startDate, endDate.
- Specs: A spec is an abstraction, a statement of needs and work
to be done but without who/when/where details entered.
Tracking the facts is done in the Task table. Also, specs can
be in a tree with parent specifications including
subspecifications. The trees are implicit in the superspecs
in the table; if a spec has no superspec then it's a separate
tree.
SpecID, ProjectID, superspec SpecID, BudgetAmount, BudgetRule,
TextID, DocumentID (for description in brief or at
length). status (enum {unspecified, draft, proposed, accepted,
funded, tasked (tracks Tasks status passed the accepted phase),
done (tracks Tasks status done}).
Specs are used in milestone transitions and thus may have
BeforeDescription, AfterDescription, as well as Criteria given
in the details.
A Project's budget can be built for each ProjectID from the
specs attached to that project, each spec having its own
budget amount and rule of interpretation.
Considered having a plans table with project (under specs),
task (under join tasks specs for a given project), milestones,
orderings, release-triggers, doer, judger, final acceptance
(all under Schedules and Milestones); those are all contained
elsewhere, so we don't need a separate plans table.
- Schedule: A schedule is a sequence of milestones.
ScheduleItemID, ScheduleID, sequence, MilestoneID. Each row
is a single milestone on the schedule, ScheduleID is the same
across multiple milestones in the schedule. ScheduleItemID is
unique AUTO_INCREMENT in the table. Sequence enables ordering,
as a numeric or at least sortable field to order the
milestones which we assumed are fully orderable.
- Milestone: A milestone for a project enables knowing what it
is (by its name), when it's complete (by its spec), who
requests (Requester), rejects (Acceptor), or manages (Judge)
acceptance (each by their roles), what are the costs and
benefits of late/early performance, some structure enabling
there to be a sequence of milestones with descriptions,
triggering successor tasks or funds flow. MilestoneID, Name, SpecID,
requestor RoleID Acceptor RoleID, Judge RoleID, StartDate,
Duration, DaysEarly, EarlyReward, DaysLate, LatePenalty.
- Logic (prerequisites, event, result)
E.g., business logic rules for what to do under what circumstances.
E.g., with a project ongoing, reaches a milestone, triggers
judgement/acceptance/rejection spiral then acceptance then
payment release. Including release criteria for milestones.
Or, when to add a manager, when to add a separate PR person,
how much budget is required before spending some to make a better budget,
etc.
- Texts: TextID, create-date, version number, creator IID,
content (a short, standalone HTML5 utf-8 text snippet without
JavaScript or CSS styling, <256B, to be displayed as < div
id="$text_ID" > $content < / div > ). Texts are used as
Project, Task, and Spec Titles and Abstracts.
- DocChunks: ChunkID, DocumentID, prev ID, succ ID, create-date,
version number, creator IID, and content (long text documents
are here broken up into page-size (2048B) chunks; appended
without separator they are to be displayed as a text discussed
above; HREF links supported to reference static external
content.) Documents contain descriptions of as use case,
features, benefits, infrastructure requirements, current
budget, current plans, whatever is needed.
- ProjectTree is implicit in the above data tables. It is
implemented with one-way pointers in the Projects table. Each
ProjectID is a node in the tree; without parents it is at the
top level. ProjectID 0 is the implied global parent. If
daughters can't be built from the DB on the fly, then maybe a
daughterProjects table would need to be made. Some
placeholder project IDs are: Software, Medical research, Other
research, Public Works. Maybe if a new project is not one of
those then it needs a parent project to be specified.
- TX: a double entry financial transaction history: date, from
account, to account, amount, currency, item, description,
associated to ProjectID, SpecID, optional IID for donors and
recipients, MilestoneID (for milestone-tagged donations and
payments), subscription donations, etc.). (One should be able
to roll this up from day one to sum up everything in each
account.)
- Accounts (each can be read of the tx history with its account
name to make another redundant table of its own with a tx
structure): enum {
- payable,
- receiveable,
- cash on
hand,
- bank,
- donations,
- unreleased,
- released,
- paid,
- reported,
- taxes-payable,
- taxes-paid,
- inventory
}
A donation is a TX from donations to receiveables specifying
amount, currency, date, donor's IID, project ID, spec ID for
acceptance criterion for when the funds will be released.
A payment is a TX from released to paid specifying similarly:
amount, currency, recipient's IID, from ProjectID, to RoleID, upon
milestone, relating to SpecID.
- CoWork communications. Thread ID, CoTask Title, from whom to
what list of recipients, under what project and task and role
triggering what milestones if any, text of message,
previous-message-in-thread, relative date of reply expected.
(Like Sprex Co-Work participants should be able to see each
others' queues and demand reply so as to move work forward.)
Uses, UIs, Queries:
Pages