business-as-code
Version:
Primitives for expressing business logic and processes as code
255 lines • 19 kB
JavaScript
/**
* Communication & Collaboration Entities
* Meeting, Decision, ActionItem, Announcement, Feedback, Discussion
*/
export const Meeting = {
singular: 'meeting',
plural: 'meetings',
description: 'A scheduled meeting or event',
properties: {
name: { type: 'string', description: 'Meeting name' },
description: { type: 'string', description: 'Meeting description' },
type: { type: 'string', description: 'Type of meeting', examples: ['one-on-one', 'team', 'all-hands', 'standup', 'planning', 'review', 'retrospective', 'interview', 'client', 'board', 'workshop', 'training'] },
status: { type: 'string', description: 'Meeting status', examples: ['scheduled', 'confirmed', 'in-progress', 'completed', 'cancelled', 'rescheduled', 'no-show'] },
recurring: { type: 'boolean', description: 'Is recurring meeting' },
recurrencePattern: { type: 'string', description: 'Recurrence pattern', examples: ['daily', 'weekly', 'biweekly', 'monthly', 'quarterly'], optional: true },
startTime: { type: 'date', description: 'Start date and time' },
endTime: { type: 'date', description: 'End date and time' },
duration: { type: 'number', description: 'Duration in minutes' },
timezone: { type: 'string', description: 'Meeting timezone' },
location: { type: 'string', description: 'Physical location', optional: true },
virtualLink: { type: 'string', description: 'Virtual meeting link', optional: true },
platform: { type: 'string', description: 'Meeting platform', examples: ['zoom', 'teams', 'meet', 'webex', 'in-person', 'hybrid'] },
organizer: { type: 'string', description: 'Meeting organizer' },
attendees: { type: 'string[]', description: 'Attendees list' },
requiredAttendees: { type: 'string[]', description: 'Required attendees' },
optionalAttendees: { type: 'string[]', description: 'Optional attendees' },
actualAttendees: { type: 'string[]', description: 'Actual attendees' },
agenda: { type: 'string[]', description: 'Meeting agenda items' },
objectives: { type: 'string[]', description: 'Meeting objectives' },
notes: { type: 'string', description: 'Meeting notes', optional: true },
notesUrl: { type: 'string', description: 'Notes document URL', optional: true },
recordingUrl: { type: 'string', description: 'Recording URL', optional: true },
transcriptUrl: { type: 'string', description: 'Transcript URL', optional: true },
calendarEventId: { type: 'string', description: 'Calendar event ID', optional: true },
reminderMinutes: { type: 'number', description: 'Reminder before meeting (minutes)' },
tags: { type: 'string[]', description: 'Meeting tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
decisions: { type: 'decision[]', description: 'Decisions made', backref: 'meeting' },
actionItems: { type: 'actionItem[]', description: 'Action items', backref: 'meeting' },
project: { type: 'project', description: 'Related project', backref: 'meetings' },
deal: { type: 'deal', description: 'Related deal', backref: 'meetings' },
customer: { type: 'customer', description: 'Related customer', backref: 'meetings' },
series: { type: 'meeting', description: 'Parent series', backref: 'instances' },
instances: { type: 'meeting[]', description: 'Series instances', backref: 'series' },
},
actions: ['create', 'update', 'schedule', 'reschedule', 'cancel', 'start', 'end', 'summarize', 'record'],
events: ['created', 'updated', 'scheduled', 'rescheduled', 'cancelled', 'started', 'ended', 'summarized', 'recorded'],
};
export const Decision = {
singular: 'decision',
plural: 'decisions',
description: 'A documented business decision',
properties: {
name: { type: 'string', description: 'Decision title' },
description: { type: 'string', description: 'Decision description' },
type: { type: 'string', description: 'Type of decision', examples: ['strategic', 'tactical', 'operational', 'technical', 'policy', 'resource', 'budget', 'hiring', 'process'] },
status: { type: 'string', description: 'Decision status', examples: ['proposed', 'under-review', 'approved', 'rejected', 'deferred', 'superseded', 'implemented'] },
outcome: { type: 'string', description: 'Decision outcome' },
rationale: { type: 'string', description: 'Decision rationale' },
alternatives: { type: 'string[]', description: 'Alternatives considered' },
impact: { type: 'string', description: 'Impact assessment' },
risks: { type: 'string[]', description: 'Associated risks' },
benefits: { type: 'string[]', description: 'Expected benefits' },
constraints: { type: 'string[]', description: 'Constraints considered' },
stakeholders: { type: 'string[]', description: 'Stakeholders consulted' },
decisionMaker: { type: 'string', description: 'Decision maker' },
approvers: { type: 'string[]', description: 'Required approvers' },
proposedBy: { type: 'string', description: 'Proposed by' },
proposedDate: { type: 'date', description: 'Date proposed' },
decidedDate: { type: 'date', description: 'Date decided' },
implementationDate: { type: 'date', description: 'Target implementation date', optional: true },
reviewDate: { type: 'date', description: 'Review date', optional: true },
expirationDate: { type: 'date', description: 'Decision expiration', optional: true },
documentUrl: { type: 'string', description: 'Decision document URL' },
category: { type: 'string', description: 'Decision category' },
priority: { type: 'string', description: 'Decision priority', examples: ['critical', 'high', 'medium', 'low'] },
reversible: { type: 'boolean', description: 'Is reversible' },
notes: { type: 'string', description: 'Additional notes', optional: true },
tags: { type: 'string[]', description: 'Decision tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
meeting: { type: 'meeting', description: 'Decision meeting', backref: 'decisions' },
actionItems: { type: 'actionItem[]', description: 'Follow-up actions', backref: 'decision' },
project: { type: 'project', description: 'Related project', backref: 'decisions' },
supersedes: { type: 'decision', description: 'Previous decision', backref: 'supersededBy' },
supersededBy: { type: 'decision', description: 'Superseding decision', backref: 'supersedes' },
relatedDecisions: { type: 'decision[]', description: 'Related decisions', backref: 'relatedDecisions' },
},
actions: ['create', 'update', 'propose', 'review', 'approve', 'reject', 'defer', 'implement', 'supersede', 'archive'],
events: ['created', 'updated', 'proposed', 'reviewed', 'approved', 'rejected', 'deferred', 'implemented', 'superseded', 'archived'],
};
export const ActionItem = {
singular: 'actionItem',
plural: 'actionItems',
description: 'An action item or follow-up task',
properties: {
name: { type: 'string', description: 'Action item title' },
description: { type: 'string', description: 'Action item description' },
status: { type: 'string', description: 'Action item status', examples: ['pending', 'in-progress', 'completed', 'cancelled', 'blocked', 'deferred'] },
priority: { type: 'string', description: 'Priority level', examples: ['critical', 'high', 'medium', 'low'] },
source: { type: 'string', description: 'Source of action item', examples: ['meeting', 'email', 'decision', 'review', 'audit', 'incident'] },
assignee: { type: 'string', description: 'Assigned person' },
assignedBy: { type: 'string', description: 'Assigned by' },
collaborators: { type: 'string[]', description: 'Collaborators' },
dueDate: { type: 'date', description: 'Due date' },
completedDate: { type: 'date', description: 'Completion date', optional: true },
createdDate: { type: 'date', description: 'Creation date' },
context: { type: 'string', description: 'Context or background' },
outcome: { type: 'string', description: 'Expected outcome' },
actualOutcome: { type: 'string', description: 'Actual outcome', optional: true },
blockers: { type: 'string[]', description: 'Current blockers' },
progress: { type: 'number', description: 'Progress percentage' },
notes: { type: 'string', description: 'Additional notes', optional: true },
tags: { type: 'string[]', description: 'Action item tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
meeting: { type: 'meeting', description: 'Source meeting', backref: 'actionItems' },
decision: { type: 'decision', description: 'Related decision', backref: 'actionItems' },
task: { type: 'task', description: 'Linked task', backref: 'actionItem' },
project: { type: 'project', description: 'Related project', backref: 'actionItems' },
dependencies: { type: 'actionItem[]', description: 'Dependencies', backref: 'dependents' },
dependents: { type: 'actionItem[]', description: 'Dependent items', backref: 'dependencies' },
},
actions: ['create', 'update', 'assign', 'reassign', 'start', 'complete', 'cancel', 'defer', 'escalate'],
events: ['created', 'updated', 'assigned', 'reassigned', 'started', 'completed', 'cancelled', 'deferred', 'escalated'],
};
export const Announcement = {
singular: 'announcement',
plural: 'announcements',
description: 'A company-wide or team announcement',
properties: {
title: { type: 'string', description: 'Announcement title' },
content: { type: 'string', description: 'Announcement content' },
summary: { type: 'string', description: 'Brief summary' },
type: { type: 'string', description: 'Type of announcement', examples: ['general', 'product', 'company', 'HR', 'policy', 'event', 'milestone', 'emergency', 'recognition'] },
status: { type: 'string', description: 'Announcement status', examples: ['draft', 'scheduled', 'published', 'archived', 'recalled'] },
priority: { type: 'string', description: 'Priority level', examples: ['urgent', 'high', 'normal', 'low'] },
audience: { type: 'string[]', description: 'Target audience', examples: ['all', 'engineering', 'sales', 'leadership', 'specific-team'] },
channels: { type: 'string[]', description: 'Distribution channels', examples: ['email', 'slack', 'intranet', 'all-hands', 'newsletter'] },
author: { type: 'string', description: 'Author' },
approver: { type: 'string', description: 'Approver', optional: true },
publishDate: { type: 'date', description: 'Publish date' },
expirationDate: { type: 'date', description: 'Expiration date', optional: true },
acknowledgmentRequired: { type: 'boolean', description: 'Requires acknowledgment' },
acknowledgmentCount: { type: 'number', description: 'Acknowledgment count' },
viewCount: { type: 'number', description: 'View count' },
attachments: { type: 'string[]', description: 'Attachment URLs' },
featured: { type: 'boolean', description: 'Is featured/pinned' },
comments: { type: 'boolean', description: 'Comments enabled' },
notes: { type: 'string', description: 'Internal notes', optional: true },
tags: { type: 'string[]', description: 'Announcement tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
department: { type: 'department', description: 'Source department', backref: 'announcements' },
relatedAnnouncements: { type: 'announcement[]', description: 'Related announcements', backref: 'relatedAnnouncements' },
},
actions: ['create', 'update', 'draft', 'schedule', 'publish', 'recall', 'archive', 'acknowledge', 'feature'],
events: ['created', 'updated', 'drafted', 'scheduled', 'published', 'recalled', 'archived', 'acknowledged', 'featured'],
};
export const Feedback = {
singular: 'feedback',
plural: 'feedbacks',
description: 'Feedback from customers, employees, or stakeholders',
properties: {
title: { type: 'string', description: 'Feedback title' },
content: { type: 'string', description: 'Feedback content' },
type: { type: 'string', description: 'Type of feedback', examples: ['feature-request', 'bug-report', 'complaint', 'praise', 'suggestion', 'review', 'survey-response', 'NPS'] },
source: { type: 'string', description: 'Feedback source', examples: ['customer', 'employee', 'partner', 'support', 'sales', 'survey', 'social', 'review-site'] },
status: { type: 'string', description: 'Feedback status', examples: ['new', 'acknowledged', 'under-review', 'in-progress', 'resolved', 'declined', 'archived'] },
sentiment: { type: 'string', description: 'Sentiment analysis', examples: ['positive', 'neutral', 'negative', 'mixed'] },
rating: { type: 'number', description: 'Rating score (1-5 or 1-10)' },
npsScore: { type: 'number', description: 'NPS score (-100 to 100)', optional: true },
category: { type: 'string', description: 'Feedback category', examples: ['product', 'service', 'support', 'pricing', 'UX', 'performance', 'documentation'] },
priority: { type: 'string', description: 'Priority level', examples: ['critical', 'high', 'medium', 'low'] },
submitter: { type: 'string', description: 'Feedback submitter' },
submitterEmail: { type: 'string', description: 'Submitter email', optional: true },
submitterType: { type: 'string', description: 'Submitter type', examples: ['customer', 'prospect', 'employee', 'partner', 'anonymous'] },
submittedDate: { type: 'date', description: 'Submission date' },
assignee: { type: 'string', description: 'Assigned handler' },
response: { type: 'string', description: 'Response to feedback', optional: true },
responseDate: { type: 'date', description: 'Response date', optional: true },
resolvedDate: { type: 'date', description: 'Resolution date', optional: true },
productArea: { type: 'string', description: 'Related product area' },
feature: { type: 'string', description: 'Related feature', optional: true },
channel: { type: 'string', description: 'Submission channel' },
publicUrl: { type: 'string', description: 'Public URL if applicable', optional: true },
votes: { type: 'number', description: 'Vote count (for public feedback)' },
notes: { type: 'string', description: 'Internal notes', optional: true },
tags: { type: 'string[]', description: 'Feedback tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
customer: { type: 'customer', description: 'Related customer', backref: 'feedback' },
product: { type: 'product', description: 'Related product', backref: 'feedback' },
feature: { type: 'feature', description: 'Related feature', backref: 'feedback' },
task: { type: 'task', description: 'Created task', backref: 'feedback' },
relatedFeedback: { type: 'feedback[]', description: 'Related feedback', backref: 'relatedFeedback' },
},
actions: ['create', 'update', 'acknowledge', 'assign', 'respond', 'resolve', 'decline', 'archive', 'merge', 'upvote'],
events: ['created', 'updated', 'acknowledged', 'assigned', 'responded', 'resolved', 'declined', 'archived', 'merged', 'upvoted'],
};
export const Discussion = {
singular: 'discussion',
plural: 'discussions',
description: 'A threaded discussion or conversation',
properties: {
title: { type: 'string', description: 'Discussion title' },
content: { type: 'string', description: 'Initial post content' },
type: { type: 'string', description: 'Type of discussion', examples: ['question', 'proposal', 'brainstorm', 'announcement', 'decision', 'RFC', 'retrospective'] },
status: { type: 'string', description: 'Discussion status', examples: ['open', 'active', 'resolved', 'closed', 'locked', 'archived'] },
category: { type: 'string', description: 'Discussion category' },
author: { type: 'string', description: 'Discussion author' },
participants: { type: 'string[]', description: 'Participants' },
mentions: { type: 'string[]', description: 'Mentioned users' },
replyCount: { type: 'number', description: 'Number of replies' },
viewCount: { type: 'number', description: 'View count' },
lastReplyDate: { type: 'date', description: 'Last reply date' },
lastReplyBy: { type: 'string', description: 'Last reply by' },
pinned: { type: 'boolean', description: 'Is pinned' },
locked: { type: 'boolean', description: 'Is locked' },
resolved: { type: 'boolean', description: 'Is resolved' },
resolvedBy: { type: 'string', description: 'Resolved by', optional: true },
resolvedDate: { type: 'date', description: 'Resolution date', optional: true },
visibility: { type: 'string', description: 'Visibility', examples: ['public', 'team', 'private', 'confidential'] },
createdDate: { type: 'date', description: 'Creation date' },
notes: { type: 'string', description: 'Internal notes', optional: true },
tags: { type: 'string[]', description: 'Discussion tags' },
metadata: { type: 'object', description: 'Additional metadata', optional: true },
},
relationships: {
project: { type: 'project', description: 'Related project', backref: 'discussions' },
team: { type: 'team', description: 'Related team', backref: 'discussions' },
decision: { type: 'decision', description: 'Related decision', backref: 'discussions' },
parentDiscussion: { type: 'discussion', description: 'Parent discussion', backref: 'replies' },
replies: { type: 'discussion[]', description: 'Replies', backref: 'parentDiscussion' },
},
actions: ['create', 'update', 'reply', 'resolve', 'close', 'reopen', 'pin', 'unpin', 'lock', 'unlock', 'archive'],
events: ['created', 'updated', 'replied', 'resolved', 'closed', 'reopened', 'pinned', 'unpinned', 'locked', 'unlocked', 'archived'],
};
// Export all communication entities
export const CommunicationEntities = {
Meeting,
Decision,
ActionItem,
Announcement,
Feedback,
Discussion,
};
export default CommunicationEntities;
//# sourceMappingURL=communication.js.map