Skip to content

Business Domain Overview

Pre-rewrite analysis - Layer 1: Overview Generated: 2026-02-19

Table of Contents


1. Executive Summary

The Pharmagin Speaker Platform is a comprehensive system for managing pharmaceutical industry speaker programs. It enables pharmaceutical companies to organize educational events where healthcare professionals (HCPs) serve as speakers, manage attendee registrations, track budgets, ensure regulatory compliance, and generate reports.

Platform Users

User GroupFrontend AppPurpose
Agency Plannersplannerview (port 3000)Create and manage programs, meetings, registrations, budgets, compliance
Sales Representativessalesview (port 3200)Request programs, manage attendees, view reports and budgets
Speakers (HCPs)speakerview (port 3100)Manage profiles, contracts, training, view scheduled programs

System Scale

DimensionCount
Backend Modules (v1)37
Database Entities138
Frontend Applications3
External Integrations13
Feature Flags100+

2. Business Domain Map

┌─────────────────────────────────────────────────────────────────────┐
│                    PHARMAGIN SPEAKER PLATFORM                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              CORE BUSINESS DOMAINS                          │    │
│  │                                                             │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │    │
│  │  │   Program &   │  │   Speaker    │  │   Attendee &     │  │    │
│  │  │   Meeting     │←→│  Management  │←→│   Registration   │  │    │
│  │  └──────┬───────┘  └──────┬───────┘  └────────┬─────────┘  │    │
│  │         │                 │                    │             │    │
│  │  ┌──────┴───────┐  ┌─────┴────────┐  ┌───────┴──────────┐  │    │
│  │  │   Budget &    │  │  Compliance  │  │   Survey &       │  │    │
│  │  │   Financial   │  │  & Regulatory│  │   Feedback       │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────┘  │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              SUPPORTING DOMAINS                             │    │
│  │                                                             │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │    │
│  │  │   User &     │  │ Communication│  │   Reporting &    │  │    │
│  │  │  Permission  │  │ & Notification│  │   Analytics     │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────┘  │    │
│  │                                                             │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │    │
│  │  │  Content &   │  │  Geographic  │  │   Virtual        │  │    │
│  │  │  Document    │  │  & Territory │  │   Program        │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────┘  │    │
│  │                                                             │    │
│  │  ┌──────────────┐  ┌──────────────┐                        │    │
│  │  │  Expense     │  │ Configuration│                        │    │
│  │  │  Management  │  │ & Features   │                        │    │
│  │  └──────────────┘  └──────────────┘                        │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              EXTERNAL INTEGRATIONS                          │    │
│  │  Salesforce │ SendGrid │ Zoom │ SFTP │ NPI │ Google │ SSO  │    │
│  └─────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────┘

3. Domain Details

3.1 Program & Meeting Management

The central domain of the platform. Programs represent pharmaceutical speaker engagements (dinners, symposiums, roundtables) where speakers present to healthcare professional audiences.

Backend Modules

ModulePathPurpose
meeting/v1/meetingsMeeting container, listing, search, alerts
program/v1/programsProgram lifecycle (create → approve → execute → close)
calendar/v1/calendarCalendar integration for scheduling
project/v1/tasksProject task tracking for program execution

Database Entities (18 entities)

EntityTableKey FieldsNotes
MeetingRequestt_meeting_requestid, productId, meetingStatusId, approvalStatus120+ fields - the primary program entity
Meetingt_meetingid, meetingRequestId, registrationUrl90+ fields - registration/event details
MeetingAlertt_meeting_alertmeetingRequestId, alertTypeMeeting-specific alerts
MeetingAttachmentt_meeting_attachmentmeetingRequestId, fileIdFile attachments
MeetingChangeLogt_meeting_changelogmeetingRequestId, fieldName, oldValue, newValueAudit trail
MeetingComplianceDocumentt_meeting_compliance_documentmeetingRequestId, documentIdCompliance docs
MeetingProgramTypet_meeting_program_typemeetingRequestId, programTypeIdMulti-type support
MeetingProjectTaskt_meeting_project_taskmeetingRequestId, taskIdTask tracking
MeetingRequestStatust_meeting_request_statusid, nameStatus definitions
MeetingRequestWorkflowt_meeting_request_workflowid, statusId, nextStatusIdState transitions
MeetingSharedUsert_meeting_shared_usermeetingRequestId, userIdAccess control
Locationt_locationid, address, city, state, zipMeeting venues
Venuet_venueid, name, addressVenue master data
ProjectTaskt_project_taskid, name, descriptionTask definitions
ProjectTaskTemplatet_project_task_templateid, templateNameTask templates
PLIDt_plidid, nameProgram/License identifiers
FiscalYeart_fiscal_yearid, startDate, endDateFinancial year tracking
Workflowt_workflowid, nameWorkflow definitions

Frontend Pages

Plannerview:

  • /meetings - Meeting list/dashboard (MeetingTable)
  • /meetings/:id(/:productId) - Meeting detail with tabs: Profile, Budget, Documents, ChangeLog, Summary, Assign, Tasks, Workflow, Virtual Setup
  • /calendar - Calendar view
  • /data-exceptions - Data exception tracking
  • /plids - PLID management

Salesview:

  • /programs - Program list with status tabs (Pending, Approved, Scheduled, Completed)
  • /programs/add - Create program form
  • /programs/:programId/:type - Program detail (Information, Attendees, Surveys, Evaluation)
  • /programs/:programId/sign-in-attendees - Sign-in page
  • /calendar - Calendar view

Key Business Flows

Program Lifecycle:
  Draft → Pending Approval → Approved → Scheduled → In Progress → Completed → Closed
                ↑                                                        │
                └──── Rejected ←─── (at any approval step) ──────────────┘

Meeting vs MeetingRequest:
  MeetingRequest = the program request (business workflow)
  Meeting = the registration/event instance (attendee-facing)
  One MeetingRequest typically maps to one Meeting

Initial Issues Identified

  • MeetingRequest vs Meeting duality: Two massive entities (120+ and 90+ fields) represent overlapping concepts. The boundary between "program" and "meeting" is unclear and leads to confusion.
  • MeetingRequest used as Program entity: The MeetingRequest table serves as the Program entity despite the name suggesting it's just a request. Misleading naming.
  • Field bloat: Both entities have grown organically and contain 100+ fields, many of which are nullable flags or config overrides.
  • Dual status tracking: MeetingRequestStatus and approval workflow concepts overlap.

3.2 Speaker Management

Manages healthcare professional speakers who are contracted to deliver presentations at pharmaceutical industry events.

Backend Modules

ModulePathPurpose
speaker/v1/speakersSpeaker CRUD, profile, status, login, bulk upload
(sub) contracts/v1/speakers/{id}/contractsSpeaker contract management
(sub) presentations/v1/speakers/{id}/presentationsPresentation content
(sub) reminders/v1/speakers/{id}/remindersSpeaker notifications

Database Entities (8 entities)

EntityTableKey FieldsNotes
Speakert_speakerid, firstName, lastName, npiNumber, speakerStatus100+ fields - profile, credentials, financial rates, geographic data
SpeakerContractt_speaker_contractid, speakerId, contractStatus, honorariaRateContract terms and compensation
SpeakerGroupt_speaker_groupid, nameSpeaker segmentation
SpeakerTrainingt_speaker_trainingspeakerId, trainingId, completionDateTraining completion tracking
SpeakerSlidet_speaker_slidespeakerId, slideIdPresentation materials
MappingTopicSpeakert_mapping_topic_speakertopicId, speakerIdSpeaker-topic expertise
MappingSpeakerDistrictt_mapping_speaker_districtspeakerId, districtIdGeographic assignment
MappingSpeakerGroupt_mapping_speaker_groupspeakerId, groupIdGroup membership

Frontend Pages

Speakerview (speaker-facing portal):

  • /speakers/speakers - Speaker list (admin view)
  • /speakers/speakers/:speakerId/profile - Speaker profile management
  • /speakers/speakers/:speakerId/documents - Document management
  • /speakers/speakers/:speakerId/contracts - Contract viewing/signing
  • /speakers/speakers/:speakerId/training - Training modules
  • /speakers/speakers/:speakerId/scheduled-programs - Upcoming programs
  • /speakers/speakers/:speakerId/completed-programs - Past programs
  • /speakers/speakers/:speakerId/expenses - Expense reports
  • /speakers/contracts - Contracts list
  • /speakers/content - Content library
  • /speakers/topics - Topics/expertise
  • /speakers/nominations - Speaker nominations
  • /speakers/training - Training library

Plannerview:

  • Admin > Preferred Speakers List

Salesview:

  • /speakers or /speaker-list - Speaker roster

Key Business Flows

Speaker Lifecycle:
  Nominated → Profile Created → Contracts Signed → Training Completed → Active → Deactivated

Speaker Engagement:
  Assigned to Program → Confirm Availability → Present → Submit Expenses → Reimbursed

Initial Issues Identified

  • Speaker entity bloat: 100+ fields covering profile, credentials, financial rates, and geographic data in a single entity.
  • Speaker login/auth mixed into speaker module: Speaker authentication is handled within the speaker module rather than the unified auth system.
  • Topic management scattered: Topics appear in both speaker and dictionary modules.

3.3 Attendee & Registration

Manages healthcare professional attendees who register for and attend speaker programs.

Backend Modules

ModulePathPurpose
site/v1/sitesRegistration site management (public-facing)
registration/v1/registrationRegistration workflow processing
npi/v1/npisNPI (National Provider Identifier) validation
target/v1/targetsTarget audience (HCP) management

Database Entities (15 entities)

EntityTableKey FieldsNotes
Attendeet_attendeeattendeeId (UUID), meetingId, npiNumber, registrationStatus70+ fields - registration, compliance, sign-in
AttendeeTypet_attendee_typeid, nameHCP, Student, Compliance Officer, etc.
AttendeeResponset_attendee_responseattendeeId, responseTypeRSVP tracking
AttendeeSignaturet_attendee_signatureattendeeId, signatureDataE-signature capture
AttendeeSurveyt_attendee_surveyattendeeId, surveyIdSurvey responses
AttendeeChangeLogt_attendee_changelogattendeeId, fieldNameAudit trail
AttendeeInfoFieldt_attendee_info_fieldid, fieldNameCustom attendee fields
AttendanceConfigt_attendance_configid, configTypeAttendance rules
Targett_targettargetId (Long), npiNumber, firstName, lastNameTarget HCP audience
SecondaryTargett_secondary_targetid, targetIdSecondary target list
NpiDatat_npi_datanpi, providerName, specialtyNPI registry data
RegistrationStatust_registration_statusid, nameStatus definitions
RegistrationWorkflowt_registration_workflowid, statusId, nextStatusIdState transitions
SleepingRoomt_sleeping_roomid, meetingId, hotelNameAccommodation
SleepingRoomInventoryt_sleeping_room_inventoryroomId, date, availableRoom availability

Frontend Pages

Plannerview:

  • /registrations - Registration site list
  • /registrations/:id(/:type) - Registration detail (Contacts, Accommodation, Communication, Workflow, Reports)
  • /reg/:url(/:planner) - Public registration form
  • /confirmation/:attendeeId - Attendance confirmation page
  • /invitations/:attendeeId - Invitation display
  • /decline/:attendeeId - Decline invitation form
  • /unsubscribe/:attendeeId - Email unsubscribe

Salesview:

  • /programs/:programId/attendees - Attendee management within program
  • /programs/:programId/sign-in-attendees - Sign-in page

Key Business Flows

Attendee Registration:
  Invited/Self-Register → NPI Validated → Frequency Checked → Registered → Confirmed → Signed In → Attended

Target Reconciliation Types:
  Type 1: NPI-based (match against NPI database)
  Type 2: Target list (match against uploaded target lists)
  Type 3: Salesforce (match against Salesforce contacts)

Initial Issues Identified

  • Site vs Meeting vs Registration confusion: "Site" represents a registration portal tied to a Meeting, but the naming is unintuitive. The relationship between Site, Meeting, and Registration is convoluted.
  • Attendee ID type inconsistency: Attendee uses UUID (String) while most other entities use Integer. This creates friction in joins and queries.
  • Dual reconciliation paths: NPI and Target reconciliation use different flows but should ideally be unified.
  • SleepingRoom in site module: Accommodation management is bundled with registration but could be its own domain.

3.4 Budget & Financial Management

Hierarchical budget allocation and tracking from company level down to individual programs.

Backend Modules

ModulePathPurpose
budget/v1/budget/allocation, /v1/budgets/*Budget allocation, categories, items, templates, caps

Database Entities (11 entities)

EntityTableKey FieldsNotes
BudgetVersiont_budget_versionid, meetingRequestId, versionNumberBudget snapshot versions
BudgetCategoryt_budget_categoryid, productId, nameExpense categories
BudgetItemt_budget_itemid, budgetVersionId, categoryId, amountLine items
BudgetItemTemplatet_budget_item_templateid, templateNameReusable templates
BudgetCapItemt_budget_cap_itemid, productId, capType, capAmountSpending caps
BudgetAlertt_budget_alertid, productId, thresholdBudget threshold alerts
BudgetAlertViewHistoryt_budget_alert_view_historyalertId, userIdAlert read tracking
BudgetAllocationHistoryt_budget_allocation_historyid, allocationType, amountAllocation audit
AllocationTovt_allocation_tovid, attendeeId, amountTransfer of Value
FiscalYeart_fiscal_yearid, startDate, endDateFiscal period
Brandt_brandid, productId, nameBrand-level budgets

Frontend Pages

Plannerview:

  • Meeting detail > Budget tab (MTBudget, MTBudgetForm)
  • Admin > Budget Categories
  • Admin > Budget Templates

Salesview:

  • /budget-allocation - Budget allocation overview
  • /budget-allocation/region-budget - Region-level allocation
  • /budget-allocation/district-budget - District-level allocation
  • Reports > Programs by Budget Status
  • Reports > Fiscal YTD Spend by Brand

Budget Hierarchy

Company → Product → Brand → Region → District → Territory → Program
  Each level can have allocated amounts and spending caps

Initial Issues Identified

  • Budget spread across modules: Budget entities are in common persistence, but budget allocation logic touches program, meeting, and compliance modules.
  • AllocationTov (Transfer of Value) mixes compliance and budget concerns in a single entity.
  • Complex versioning: BudgetVersion per meeting creates many rows and complicates reporting.

3.5 Compliance & Regulatory

Pharmaceutical regulatory compliance - tracks payments to HCPs (Transfer of Value), manages required documentation, and generates aggregate spend reports for regulatory reporting (e.g., Sunshine Act).

Backend Modules

ModulePathPurpose
compliance/v1/complianceCompliance records, document checklists, field mappings, exports

Database Entities (5 entities)

EntityTableKey FieldsNotes
ComplianceDocumentt_compliance_documentid, name, requiredDocument checklist definitions
MeetingComplianceDocumentt_meeting_compliance_documentmeetingRequestId, documentIdPer-meeting compliance docs
AggregateSpendReportt_aggregate_spend_reportid, productIdSpend report configuration
AggregateSpendReportFieldt_aggregate_spend_report_fieldreportId, fieldNameReport field definitions
AggregateSpendFieldMappingaggregate_spend_field_mappingid, fieldName, mappedToData mapping rules

Frontend Pages

Plannerview:

  • /compliance/0 - Compliance by Attendees (Aggregate Spend)
  • /compliance/1 - Compliance by Programs
  • Admin > Compliance Document Checklist
  • Admin > Aggregate Spend Report Configuration
  • Meeting detail > Compliance Documents tab

Salesview:

  • /reports/compliance-audit - Compliance audit reports
  • /reports/compliance-audit/:meetingRequestId - Per-meeting compliance

Initial Issues Identified

  • Compliance is tightly coupled to attendee and program: Hard to test or reason about compliance logic independently.
  • Aggregate Spend reporting is configuration-heavy: Complex field mapping system that could benefit from simplification.
  • Document checklist logic is duplicated: Similar patterns in meeting compliance docs and general compliance docs.

3.6 User & Permission Management

Multi-level RBAC system supporting user access at instance, company, and product levels with granular permissions.

Backend Modules

ModulePathPurpose
user/v1/usersUser CRUD, activation, password management
(sub) auth/v1/users/loginAuthentication
(sub) roles/v1/users/rolesRole management
(sub) permissions-Permission checking

Database Entities (11 entities)

EntityTableKey FieldsNotes
UnifiedUsert_unified_userid, username, email, activeCentral user profile
UserRolet_user_roleuserId, roleIdUser-role mapping
UserProductt_user_productuserId, productIdUser-product access
UserProductRolet_user_product_roleuserId, productId, roleIdProduct-level roles
UserCompanyt_user_companyuserId, companyIdCompany access
UserInstancet_user_instanceuserId, instanceIdInstance access
Permissiont_permissionid, name, codePermission definitions
RolePermissiont_role_permissionroleId, permissionIdRole-permission mapping
RoleGroupt_role_groupid, nameRole grouping
UserAuthTokenuser_auth_tokenemail, tokenAuth tokens
UserPasswordHistoryt_user_password_historyuserId, passwordHashPassword history

Frontend Pages

Plannerview:

  • Admin > Users (Planner View)
  • Admin > Pharmagin Users (system-level users)
  • Admin > Pharmagin Roles (role management)
  • Admin > Users Limit

Salesview:

  • /users - User management (sales rep users)

Speakerview:

  • /speakers/admin - Speaker admin panel
  • /speakers/login - Speaker login
  • /speakers/forgotPwd/:uuid - Password reset

Access Control Model

Instance (deployment)
  └── Company (pharmaceutical company)
       └── Product (drug/brand)
            └── Role (ADMIN, PLANNER, SALES_REP, SPEAKER, etc.)
                 └── Permission (PROGRAMS_VIEW, BUDGET_EDIT, etc.)

Authority Pattern (Salesview): PRODUCT-{productId}-{AUTHORITY_KEY}
  e.g., PRODUCT-1-PROGRAMS, PRODUCT-1-BUDGET_ALLOCATION

Initial Issues Identified

  • Speaker auth is separate: Speaker login/authentication exists in the speaker module, not in the user module.
  • Two SSO services: pharmagin-sso (production) and pharmagin-login (next-gen) create maintenance burden.
  • Complex multi-level permissions: Instance → Company → Product → Role → Permission hierarchy is powerful but complex to manage and debug.
  • UserQuantityLimit: Licensing enforcement is mixed with user management.

3.7 Communication & Notification

Multi-channel communication system for emails, alerts, and notifications to speakers, attendees, and planners.

Backend Modules

ModulePathPurpose
mail/v1/mailsEmail sending, templates, sandbox
communication/v1/communicationsCommunication tracking/history
sendgrid/v1/sendgridSendGrid integration and analytics
alert/v1/customAlertsAlert rules configuration
reminder/v1/speakers/{id}/remindersAutomated reminders
invitationtemplate/v1/invitation-templatesEmail invitation templates

Database Entities (10 entities)

EntityTableKey FieldsNotes
Mailt_mailid, subject, body, templateTypeEmail templates
MailServiceTypet_mail_service_typeid, nameService type definitions
ScheduledEmailt_scheduled_emailid, scheduledDate, statusScheduled campaigns
ScheduledEmailInstancet_scheduled_email_instanceemailId, recipientEmailIndividual deliveries
SendGridEmailActivitysendgrid_email_activityid, email, eventDelivery tracking
Alertt_alertid, type, messageSystem alerts
CustomAlertt_custom_alertid, name, conditionUser-defined alerts
CustomAlertViewHistoryt_custom_alert_view_historyalertId, userIdAlert read tracking
InvitationHistoryt_invitation_historyid, attendeeId, sentDateInvitation audit trail
UnsubscribedEmailt_unsubscribed_emailid, emailEmail opt-out list

Frontend Pages

Plannerview:

  • Registration detail > Communication tab (ScheduledEmails)
  • Admin > Email Invitation Templates
  • Admin > Email Sandbox
  • Admin > Push Alerts
  • Admin > Unsubscribed List
  • /unsubscribe/:attendeeId - Public unsubscribe
  • /resubscribe/:attendeeId - Public resubscribe

Initial Issues Identified

  • Alert vs CustomAlert duality: Two separate alert systems exist, creating confusion about which to use.
  • Mail module is overloaded: Handles templates, sending, sandbox, unsubscribe, and calendar invites.
  • Communication tracking is separate from mail: Communication history and actual email sending are in different modules.

3.8 Reporting & Analytics

Business intelligence and reporting for program performance, budget utilization, speaker utilization, and attendee demographics.

Backend Modules

ModulePathPurpose
report/v1/reports, /v1/products/{productId}/reportsStandard and custom reports
adhoc/v1/adhocAd-hoc report generation

Database Entities (6 entities)

EntityTableKey FieldsNotes
AdhocReportt_adhoc_reportid, name, queryAd-hoc report definitions
AdhocReportDetailt_adhoc_report_detailreportId, fieldNameReport field details
ReportFieldt_report_fieldid, fieldName, displayNameConfigurable report fields

Frontend Pages

Plannerview:

  • /custom-reports - Custom report builder
  • Admin > Download Change Log
  • Admin > Scheduled Reports

Salesview (extensive reporting):

  • /reports/glance - At A Glance Dashboard
  • /reports/program-activity/dashboard - Program Activity Dashboard
  • /reports/program-activity/program-summary - Program Summary (download)
  • /reports/program-activity/fiscal-ytd-spend-by-brand - Fiscal YTD Spend
  • /reports/program-activity/fiscal-ytd-operated-future-programs - Future Programs
  • /reports/program-activity/programs-by-budget-status - Budget Status
  • /reports/program-activity/program-activity-by-geography-and-spend - Geographic Analysis
  • /reports/program-activity/program-activity-by-sales-representatives - Sales Rep Analysis
  • /reports/program-activity/speaker-utilization - Speaker Utilization
  • /reports/attendee-analytics/dashboard - Attendee Analytics Dashboard
  • /reports/attendee-analytics/attendee-tracker - Attendee Tracker (download)
  • /reports/attendee-analytics/registration-summary - Registration Summary
  • /reports/attendee-analytics/registration-by-specialty - By Specialty
  • /reports/attendee-analytics/registration-by-geography - By Geography
  • /reports/attendee-analytics/registration-by-program - By Program
  • /reports/custom-reports - Custom Reports

Speakerview:

  • /speakers/reports - Speaker reports dashboard

Initial Issues Identified

  • Reporting logic is scattered: Report generation happens in the report module, adhoc module, compliance module, and inline in other modules.
  • No unified reporting framework: Custom reports, adhoc reports, and standard reports all have different architectures.
  • Heavy frontend reporting: Salesview has 15+ report pages, many with complex chart configurations hardcoded in the frontend.

3.9 Configuration & Feature Management

Centralized configuration system using Spring Cloud Config for multi-tenant, per-client feature management.

Backend Modules

ModulePathPurpose
config/v1/configuration/*Instance and product configuration
dict/v1/dictionaryReference data/lookup values

Configuration Layers

1. Agency Config (agency-{env}.yml)
   - Feature flags: projectTaskEnabled, enableScheduledReports, enableApprovalFlow, etc.
   - Notification settings
   - Optional meeting fields

2. Company Config (company-{env}.yml)
   - Branding: logo, theme, footer
   - Navigation: disableTopics, disableTraining, disableExpenseReports, etc.
   - Labels: customLabel for speaker/product
   - Contract form configuration

3. Product Config (product-{env}.yml)
   - Reconciliation type (NPI, TARGET, SALESFORCE)
   - SSO settings
   - Custom labels for geography hierarchy
   - Speaker search filters
   - Program settings: approval, sharing, cancellation
   - Registration settings: open, site, close, copy, sync
   - Document templates: sign-in sheet, invitation, survey, etc.
   - Virtual program settings (Zoom)
   - Report permissions

4. Dictionary (dictionary.yml)
   - Speaker levels
   - Medical specialties (60+ values)

Database Entities (7 entities)

EntityTableKey FieldsNotes
ProductConfigurationt_product_configurationproductId, configKey, configValueProduct-level settings
Topict_topicid, name, serviceTypeIdEducational topics
Productt_productid, name, companyIdProduct master
Brandt_brandid, name, productIdBrand hierarchy
Themet_themeid, primaryColor, secondaryColorUI branding

Frontend Pages

Plannerview Admin:

  • Program Types, Budget Categories, Budget Templates
  • Brand Configuration, Upload Logos
  • Team Setup, Attendance Frequency
  • Registration Workflow, Force Target Invitation
  • Program Task Templates
  • SFTP Configuration

Initial Issues Identified

  • 100+ feature flags: Too many flags make configuration complex and error-prone. Many may no longer be needed.
  • 3-layer config hierarchy: Agency → Company → Product configuration creates override complexity.
  • Config values in both YAML and database: ProductConfiguration table duplicates some YAML settings, making it unclear which source of truth wins.
  • Dictionary module is a catch-all: Contains reference data for many different domains (products, brands, regions, districts, topics, venues, etc.).

3.10 Geographic & Territory Management

Hierarchical geographic structure for sales territory management, synchronized with Salesforce CRM.

Backend Modules

ModulePathPurpose
geography/v1/geographiesGeographic hierarchy management
(dict) regions/districts/territories/v1/dictionary/*Reference data

Database Entities (11 entities)

EntityTableKey FieldsNotes
Regiont_regionid, productId, nameSales regions
Districtt_districtid, regionId, nameSales districts
Territoryt_territoryid, districtId, nameSales territories
Teamt_teamid, nameOrganizational teams
SalesTeamt_sales_teamid, teamId, userIdTeam membership
RegionManagert_region_managerregionId, userIdRegion management
DistrictManagert_district_managerdistrictId, userIdDistrict management
TeamBrandt_team_brandteamId, brandIdTeam-brand assignments
TeamProgramTypet_team_program_typeteamId, programTypeIdTeam-type assignments
Countryt_countryid, name, codeCountry reference
Statet_stateid, name, countryIdState/province reference

Frontend Pages

Salesview:

  • /geography - Geography management
  • /reassign-program-geography - Reassign program territories

Geographic Hierarchy

Product → Region → District → Territory

                              SalesTeam → SalesRep (User)

3.11 Content & Document Management

Document generation, template management, and content library for presentations, agreements, and compliance documents.

Backend Modules

ModulePathPurpose
xdoc/v1/xdocreport/*, /v1/templatesDocument generation (XDocReport)
file/v1/filesFile upload/download/storage

Database Entities (8 entities)

EntityTableKey FieldsNotes
Templatet_templateid, name, type, bodyDocument templates
Contentt_contentid, title, typeContent library items
ContentGroupt_content_groupid, nameContent organization
ContentTopict_content_topiccontentId, topicIdContent-topic mapping
SiteTemplatet_site_templateid, meetingIdRegistration site templates
SiteTemplatePaget_site_template_pagetemplateId, pageNameTemplate pages
SiteTemplateFieldt_site_template_fieldpageId, fieldNameTemplate fields
Filet_fileid, fileName, mimeType, pathFile storage metadata
Documentt_documentid, name, typeDocument records

Document Types

  • Sign-in sheets
  • Paper invitations
  • Attendee survey responses
  • Signature reports
  • Honoraria invoices
  • Speaker expense reimbursement forms
  • Post-program certifications

Frontend Pages

Speakerview:

  • /speakers/content - Content library
  • /speakers/presentation/:slideId/:accessToken - Presentation viewer
  • /speakers/speakers/:speakerId/documents - Speaker documents

Plannerview:

  • Admin > Document Templates
  • Meeting detail > Documents tab

Salesview:

  • /presentations - Presentation management

3.12 Survey & Feedback

Post-event survey system for collecting feedback from attendees and evaluating program effectiveness.

Backend Modules

ModulePathPurpose
survey/v1/surveysSurvey CRUD, responses, statistics

Database Entities (2 entities)

EntityTableKey FieldsNotes
AttendeeSurveyt_attendee_surveyattendeeId, surveyId, responsesSurvey response data
(Survey definition likely stored as JSON or in config)

Frontend Pages

Plannerview:

  • /survey/builder(/:surveyId) - Survey builder
  • /meeting/:meetingRequestId/survey - Meeting survey results
  • Admin > Surveys

Salesview:

  • /programs/:programId/surveys - Program surveys
  • /programs/:programId/evaluation - Program evaluation
  • /reports/survey - Survey results reports
  • /reports/survey/:surveyId - Survey detail
  • /reports/other-survey - Other survey reports

3.13 External Integrations

13 external service integrations connecting the platform to CRM, email, video, and data services.

IntegrationTypePackage/ModulePurposeStatus
SalesforceCRMplus.integration.sfContact/Account/Event syncActive
SendGridEmailmodules.v1.sendgridEmail delivery & analyticsActive
ZoomVideomodules.v1.virtualProgramVirtual meeting managementActive
SFTPFile Transfermodules.v1.sftpBatch data exchangeActive
NPI RegistryDatamodules.v1.npiProvider validationActive
Google GeocodingLocationcommon.service.GoogleAPIServiceAddress-to-GPS conversionActive (flag)
iCal4jCalendarmodules.v1.mailCalendar invite generationActive
CloudConvertDocumentmodules.v1.xdocFormat conversionActive
XDocReportDocumentmodules.v1.xdocMail merge/templatesActive
Aspose SlidesDocument(dependency)PowerPoint processingActive
MosaicDatamodules.v1.mosaicEvent/attendee dataOptional (flag)
SAML 2.0Authpharmagin-ssoAzure AD/Okta SSOActive
OAuth2/JWTAuthcommon.securityAPI authenticationActive

3.14 Virtual Program Management

Virtual/hybrid event support via Zoom integration for webinars and virtual meetings.

Backend Modules

ModulePathPurpose
virtualProgram/v1/virtualProgramsVirtual event management, Zoom webhooks

Configuration (product-dev.yml)

yaml
virtualPrograms:
  zoomVirtualMeeting:
    issuer: "<Zoom Client ID>"
    secretKey: "<Zoom Client Secret>"
    url: "https://api.zoom.us/v2"
    users: [userId1, userId2]  # Host accounts
    programSettings:
      join_before_host: true
      mute_upon_entry: true
      auto_recording: "NONE"
      waiting_room: true
  zoomWebinar: (similar config)

Frontend Pages

Plannerview:

  • Meeting detail > Virtual Program Setup tab

Salesview:

  • Virtual meeting join URL within program detail

Note

PVM (Pharmagin Virtual Meeting) using Agora has been removed. Only Zoom and third-party integrations remain.


3.15 Expense Management

Speaker expense tracking and reimbursement for travel, meals, and other program-related costs.

Backend Modules

Part of the speaker module - expenses are managed as a sub-resource of speakers.

Database Entities (4 entities)

EntityTableKey FieldsNotes
Expenset_expenseid, speakerId, meetingRequestId, statusExpense header
ExpenseItemt_expense_itemid, expenseId, category, amountLine items
ExpenseCategoryt_expense_categoryid, nameExpense categories
ExpenseHistoryt_expense_historyexpenseId, action, timestampAudit trail

Frontend Pages

Speakerview:

  • /speakers/expenses(/:expenseId) - Expense report submission
  • /speakers/speakers/:speakerId/expenses - Speaker expense history

4. Domain Dependency Map

                    ┌──────────────┐
                    │ Configuration│
                    │  & Features  │
                    └──────┬───────┘
                           │ (feature flags govern all modules)

┌──────────┐     ┌──────────────┐     ┌──────────────┐
│ User &   │────→│   Program &  │←────│  Geographic  │
│Permission│     │   Meeting    │     │  & Territory │
└──────────┘     └──────┬───────┘     └──────────────┘

           ┌────────────┼────────────┐
           ▼            ▼            ▼
    ┌──────────┐ ┌──────────┐ ┌──────────────┐
    │ Speaker  │ │ Attendee │ │   Budget &   │
    │Management│ │& Registr.│ │  Financial   │
    └────┬─────┘ └────┬─────┘ └──────────────┘
         │            │
         ▼            ▼
    ┌──────────┐ ┌──────────┐     ┌──────────────┐
    │ Expense  │ │  Survey  │     │  Compliance  │
    │Management│ │& Feedback│     │ & Regulatory │
    └──────────┘ └──────────┘     └──────┬───────┘


    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
    │Communication │  │  Reporting   │  │   Content &  │
    │& Notification│  │ & Analytics  │  │   Document   │
    └──────────────┘  └──────────────┘  └──────────────┘


    ┌──────────────────────────────────────────┐
    │          External Integrations           │
    │  Salesforce│SendGrid│Zoom│SFTP│NPI│SSO   │
    └──────────────────────────────────────────┘

Key Dependency Chains

  1. Program → Speaker + Attendee + Budget + Compliance: A program cannot exist without speakers, attendees, a budget, and compliance rules.
  2. Attendee → NPI + Target + Registration: Attendee registration requires NPI validation and target matching.
  3. Budget → Product + Geography: Budget allocation follows the product and geographic hierarchy.
  4. Compliance → Attendee + Program + Budget: Compliance reporting aggregates data from multiple domains.
  5. Communication → All domains: Email notifications are triggered by events in every domain.

5. Cross-cutting Concerns

5.1 Event/Bus System

The bus module provides internal event publishing for decoupling:

  • ProgramCreatedEvent, ProgramUpdatedEvent, ProgramCanceledEvent
  • ApprovalStatusChangedEvent
  • AttendeeListClosedEvent, RegistrationStatusChangedEvent
  • CreateAttendeeEvent, UpdateAttendeeEvent
  • AssignProgramPlannerEvent

5.2 Audit Trail

Multiple audit mechanisms exist:

  • JaVers for entity-level change tracking
  • ChangeLog entities (MeetingChangeLog, AttendeeChangeLog)
  • History entities (ExpenseHistory, BudgetAllocationHistory, InvitationHistory)
  • ViewHistory entities (AlertViewHistory, BudgetAlertViewHistory)

5.3 Cron Jobs

The cronjobs module manages scheduled background tasks:

  • Automated reminders
  • SendGrid email activity sync
  • Data export to SFTP
  • Scheduled email campaigns

5.4 File Storage

Centralized file service (file module) with abstract FileServer supporting storage operations for all modules.


6. Initial Problem Identification

6.1 Architectural Issues

IssueSeverityDescription
MeetingRequest/Meeting dualityHIGHTwo massive entities (120+ / 90+ fields) with unclear boundaries. MeetingRequest is actually the "Program" entity but the name is misleading.
Entity bloatHIGHSpeaker (100+), MeetingRequest (120+), Meeting (90+), Attendee (70+) fields indicate God objects that should be decomposed.
Scattered reportingMEDIUMReport logic exists in report, adhoc, compliance, and inline in other modules with no unified framework.
Dual alert systemsMEDIUMAlert and CustomAlert are separate systems with overlapping functionality.
Speaker auth isolationMEDIUMSpeaker authentication is separate from the unified user/auth system.
Config source ambiguityMEDIUMConfiguration lives in YAML files AND database tables with unclear precedence rules.

6.2 Data Model Issues

IssueSeverityDescription
ID type inconsistencyMEDIUMMost entities use Integer IDENTITY, but Attendee uses UUID String and Target uses Long.
Table naming inconsistencyLOWMost tables use t_ prefix, but some don't (noven_attendee_history, sendgrid_email_activity, aggregate_spend_field_mapping).
Dual status/workflowMEDIUMMeetingRequestStatus + MeetingRequestWorkflow and RegistrationStatus + RegistrationWorkflow have overlapping concerns.
JSON/Object columnsLOWproductConfig, virtualProgramInfo use dynamic JSON which bypasses schema validation.

6.3 Module Organization Issues

IssueSeverityDescription
Dictionary as catch-allMEDIUMDictionary module serves as a lookup for 15+ different reference data types.
Site module overloadedMEDIUMSite module manages registration portals, attendees, accommodations, contacts, and signatures.
Mail module overloadedMEDIUMHandles templates, sending, sandbox, unsubscribe, and calendar invites.
Feature flag proliferationMEDIUM100+ feature flags across 3 config layers make behavior hard to predict.

6.4 Integration Issues

IssueSeverityDescription
Dual SSO servicesMEDIUMpharmagin-sso (production) and pharmagin-login (next-gen) both exist, creating maintenance burden.
Salesforce tightly coupledMEDIUMSalesforce integration is in the plus package with deep dependencies on core entities.
No integration abstractionLOWEach external service has its own integration pattern with no unified adapter layer.

7. Deep Dive Priority

Based on the initial analysis, the recommended order for Layer 2 deep dives:

PriorityDomainDocumentReason
1Program & Meeting02-program-meeting-domain.mdCore domain with the most complexity and issues (MeetingRequest/Meeting duality)
2Speaker Management03-speaker-domain.mdSecond core domain, 100+ field entity, auth concerns
3Attendee & Registration04-attendee-registration-domain.mdThird core domain, NPI/Target reconciliation complexity
4Budget & Financial05-budget-domain.mdFinancial critical, complex hierarchy
5Compliance & Regulatory06-compliance-domain.mdRegulatory risk, cross-domain dependencies
6User & Permission07-user-permission-domain.mdSecurity critical, multi-level RBAC
7Communication & Notification08-communication-domain.mdOverloaded modules, multiple systems
8External Integrations09-integration-domain.mdSalesforce, Zoom, SendGrid dependencies
9Reporting & Analytics10-reporting-domain.mdScattered architecture, heavy frontend logic
10Configuration & Features11-configuration-domain.md100+ flags, 3-layer hierarchy
11Geographic & Territory12-geographic-domain.mdSalesforce sync, hierarchy management
12Content & Document13-content-document-domain.mdMultiple document systems
13Survey & Feedback14-survey-domain.mdRelatively contained domain
14Expense Management15-expense-domain.mdRelatively contained domain
15Virtual Programs16-virtual-program-domain.mdSimplified after PVM removal

Appendix A: Complete Backend Module Index

#ModuleBase PathEntity CountFrontend Coverage
1meeting/v1/meetings11PV, SV
2program/v1/programs(shared with meeting)PV, SV
3speaker/v1/speakers8SPV, SV
4site/v1/sites15PV
5user/v1/users11PV, SV, SPV
6budget/v1/budget/*11PV, SV
7config/v1/configuration/*7All
8compliance/v1/compliance5PV, SV
9dict/v1/dictionary(reference data)All
10registration/v1/registration4PV
11npi/v1/npis1-
12target/v1/targets2-
13mail/v1/mails5PV
14communication/v1/communications-PV
15sendgrid/v1/sendgrid1-
16file/v1/files2All
17report/v1/reports3PV, SV, SPV
18adhoc/v1/adhoc2PV
19xdoc/v1/xdocreport/*3PV, SPV
20survey/v1/surveys1PV, SV
21virtualProgram/v1/virtualPrograms-PV, SV
22calendar/v1/calendar-PV, SV
23geography/v1/geographies11SV
24product/v1/products2All
25planner/v1/planners-PV
26plid/v1/plids1PV
27alert/v1/customAlerts4PV
28project/v1/tasks3PV
29reminder/v1/speakers/*/reminders-SPV
30sftp/v1/sftp-PV
31invitationtemplate/v1/invitation-templates1PV
32external/v1/external-SV
33bus(internal)--
34cronjobs/v1/cronjobs--
35mosaic(internal)--
36view(internal)--
37attendance(via config)1-

Legend: PV = Plannerview, SV = Salesview, SPV = Speakerview

Appendix B: Entity Count by Domain

DomainEntity CountLargest Entity (fields)
Meeting Management18MeetingRequest (120+), Meeting (90+)
Attendee & Registration15Attendee (70+)
Geographic & Territory11-
User & Security11-
Budget & Financial11-
Communication10-
Content & Document8-
Speaker Management8Speaker (100+)
Configuration7-
Reporting6-
Compliance5-
Expense4-
Workflow & Status4-
NPI & Target3-
Survey2-
Other/Mapping15-
Total138

Appendix C: Redux Store Domains (Plannerview)

The plannerview Redux store contains 40+ state slices reflecting the business domains:

route, global, common, meetingTable, meetingDetail, registrations,
registrationsDetail, sitebuilder, siteBuilderConfig, attendeeTypes,
contacts, accommodation, report, accommodationReport, changeReport,
adhocReport, meetingBudget, changeLog, workflow, attachments, transfer,
meetingTask, virtualProgramSetup, user, salesForce, category, pushAlert,
programType, budgetTemplates, brand, team, attendanceFrequency,
registrationWorkflow, templates, preferredSpeakers, forceTargetInvitation,
projectTask, aggSpendReportConfig, uploadLogos, survey, surveyBuilder,
pharmaginUsers, pharmaginRoles, emailInvitationTemplates, compliance,
plids, customReports, calendar

Appendix D: Configuration Feature Flags Summary

Agency-Level Flags (agency-{env}.yml)

  • projectTaskEnabled, enableScheduledReports, enableApprovalFlow
  • enableAutomatedEmail, enablePreferredSpeakersList, enableForceTargetInvitation
  • enableHonorariaAmount, enableCloseOutProgram, enableUnsubscribedEmail
  • enableDataExceptions, enableAttendeeTrackerDataToSftp
  • enableMosaicIntegration, enablePorzioAggSpendReport, enableGoogleGeocodeAPI

Company-Level Flags (company-{env}.yml)

  • navigation.disableTopics, navigation.disableTraining
  • navigation.disableExpenseReports, navigation.disableNominations
  • navigation.disableReports, navigation.disableSpeakerGroup
  • navigation.enableAdmin
  • enableContractAdvanced, disablePresentationDelete
  • disablePresentationOnTraining, disableSurveyAlerts

Product-Level Flags (product-{env}.yml)

  • program.editProgram, program.approvalEnabled, program.shareableEnabled
  • program.cancelProgramEnabled, program.attachmentsEnabled
  • registration.openRegistrationEnabled, registration.registrationSiteEnabled
  • registration.closeAttendeeListEnabled, registration.copyAttendeesEnabled
  • registration.updateCRMAttendeesEnabled, registration.deleteAttendeeEnabled
  • registration.addToSalesforceEnabled, registration.enableEmailInvitation
  • documentTemplate.signInSheetEnabled, documentTemplate.paperInvitationEnabled
  • documentTemplate.attendeeSurveyResponsesEnabled, documentTemplate.signatureReportEnabled
  • documentTemplate.honorariaInvoiceEnabled, documentTemplate.speakerExpenseReimbursementEnabled
  • documentTemplate.postProgramCertificationEnabled
  • enableNewSurvey, enableCustomReport, enableSpeakerNomination, enablePLID
  • fiscalPeriodEnabled, brandBudgetAllocationEnabled
  • programSummaryReportRestrictionsEnabled, speakerUtilizationRestrictionsEnabled