Project Structure: A Real-world Example
originally published October 18th, 2024I built the following application around 8 years ago. My goal with project structure has always been expression of the domain solution space. My desire is that you can understand HOW we solved problems and HOW you would need to modify the application to meet changing requirements just by looking at the structure. You can decide if this was a success or not.
The following is posted with permission of the current business owner. This is presented as it was when I left the company. I don’t know what has changed since. This has been completely unedited.
.
├── bootstrap.php
├── Bot
│ ├── BotBootstrap.php
│ ├── BotCommands
│ │ ├── BotCommand.php
│ │ ├── BotCommandRouter.php
│ │ ├── BotMemory.php
│ │ ├── GoogleMeetLink.php
│ │ ├── Help.php
│ │ ├── RebuildProjection.php
│ │ └── TimeZoneTable.php
│ ├── BotEventLog.php
│ ├── BotMemory.php
│ ├── BotMonologHandler.php
│ ├── Channel.php
│ ├── ChatIds.php
│ └── Memory.php
├── Cert
│ ├── BusinessCertification
│ │ ├── BusinessBecameCertified.php
│ │ ├── BusinessCertificationBootstrap.php
│ │ ├── BusinessCertificationCandidateWasRegistered.php
│ │ ├── BusinessCertificationConfiguration.php
│ │ ├── BusinessCertificationDiscountCodeWasAssigned.php
│ │ ├── BusinessCertificationEmails.php
│ │ ├── BusinessCertificationId.php
│ │ ├── BusinessCertificationLogoConfiguration.php
│ │ ├── business-certification.md
│ │ ├── BusinessCertification.php
│ │ ├── BusinessCertificationSubscriptionWasPurchasedThroughQuaderno.php
│ │ ├── BusinessCertificationVoucherOrderWasMade.php
│ │ ├── BusinessOnboardingTypeform.php
│ │ ├── CertifiedBusinessWasOnboarded.php
│ │ ├── CouldNotCreateBusinessCertificationDiscountCode.php
│ │ ├── CouldNotSendBusinessCertificationOnboardingEmail.php
│ │ ├── CouldNotSendBusinessCertificationWelcomeDetailsEmail.php
│ │ ├── Processes
│ │ │ ├── BusinessCertificationBegins.php
│ │ │ ├── BusinessPurchasesSubscription.php
│ │ │ ├── GenerateVoucherDiscountCode.php
│ │ │ ├── LinkCandidateToBusiness.php
│ │ │ ├── LinkVoucherOrderToBusiness.php
│ │ │ ├── ReceiveOnboardingDetails.php
│ │ │ ├── SendCertificationWelcomeDetailsEmail.php
│ │ │ └── SendOnboardingEmail.php
│ │ ├── Projections
│ │ │ ├── BusinessCertificationCandidate.php
│ │ │ ├── BusinessCertificationCandidatesProjection.php
│ │ │ ├── BusinessCertificationDiscountCode.php
│ │ │ ├── BusinessCertificationDiscountCodesProjection.php
│ │ │ ├── BusinessCertificationListingProjection.php
│ │ │ ├── BusinessCertificationVoucherOrder.php
│ │ │ ├── BusinessCertificationVoucherOrdersProjection.php
│ │ │ ├── CanNotFindBusinessCertificationCandidateByCandidateId.php
│ │ │ ├── CanNotFindBusinessInCertificationDirectorByCertificationId.php
│ │ │ ├── CanNotFindCertBusinessDiscountCodeByDiscountCode.php
│ │ │ ├── CanNotFindCertBusinessOrderByInvoiceNumber.php
│ │ │ └── CertifiedBusiness.php
│ │ ├── SentBusinessCertificationOnboardingEmail.php
│ │ └── SentBusinessCertificationWelcomeDetailsEmail.php
│ ├── CandidateExamination
│ │ ├── CandidateCertificateWasRevoked.php
│ │ ├── CandidateContactInformationWasChanged.php
│ │ ├── CandidateEmailWasChanged.php
│ │ ├── CandidateFailedTheirFirstExam.php
│ │ ├── CandidateFailedTheirRetakeExam.php
│ │ ├── CandidateId.php
│ │ ├── CandidatePassedTheirFirstExam.php
│ │ ├── CandidatePassedTheirRetakeExam.php
│ │ ├── Candidate.php
│ │ ├── CandidateWasAwardedACertificate.php
│ │ ├── CandidateWasDeniedACertificate.php
│ │ ├── CandidateWasInvitedToTheirExamRetake.php
│ │ ├── CandidateWasInvitedToTheirFirstExam.php
│ │ ├── CandidateWasRegisteredV2.php
│ │ ├── CanNotFailAnExamOfUnknownType.php
│ │ ├── CanNotPassAnExamOfUnknownType.php
│ │ ├── CanNotRegisterCandidate.php
│ │ ├── CertException.php
│ │ ├── ChangeCandidateContactInformation.php
│ │ ├── ChangeCandidateEmail.php
│ │ ├── CouldNotRegisterCandidateNoVouchersRemaining.php
│ │ ├── ExamId.php
│ │ ├── ExaminationProcessBegan.php
│ │ ├── ExaminationProcessEnded.php
│ │ ├── ExamMarkedForManualReview.php
│ │ ├── Exam.php
│ │ ├── ExamRetakeWasPlanned.php
│ │ ├── ExamVoucher.php
│ │ ├── ExamWasReviewed.php
│ │ ├── ExamWasScored.php
│ │ ├── FurtherExamApprovalWasIgnored.php
│ │ ├── IgnoreFurtherExamApproval.php
│ │ ├── InviteCandidateToExamRetake.php
│ │ ├── InviteCandidateToFirstExam.php
│ │ ├── LegacyExaminationProcessBegan.php
│ │ ├── LegacyExaminationProcessEnded.php
│ │ ├── LegacyExamWasFailed.php
│ │ ├── LegacyExamWasPassed.php
│ │ ├── LegacyExamWasReviewed.php
│ │ ├── LegacyExamWasScored.php
│ │ ├── Processes
│ │ │ ├── CannotJudgeExamWhenItHasNotBeenReviewed.php
│ │ │ ├── CannotJudgeExamWhenItHasNotBeenScored.php
│ │ │ ├── ExamJudgementDetails.php
│ │ │ ├── InviteRegisteredCandidatesToTheirFirstExam.php
│ │ │ ├── JudgeCandidateExamResults.php
│ │ │ ├── PlannedRetake.php
│ │ │ ├── RegisterCandidatesFromTypeform.php
│ │ │ ├── SendCandidateAwardedMessageToProveSource.php
│ │ │ ├── SendCandidateFailureAndSuccessNotifications.php
│ │ │ ├── SendExamRetakes.php
│ │ │ ├── SendPurchaserAnEmailWhenCandidateRegistrationsFail.php
│ │ │ ├── SubscribeCandidateToMailchimp.php
│ │ │ └── UntrustedClientConnection.php
│ │ ├── Projections
│ │ │ ├── CandidateExamListingProjection.php
│ │ │ ├── CandidateExam.php
│ │ │ ├── CandidateExamsRequiringManualApprovalProjection.php
│ │ │ ├── CandidateRegistrationListingProjection.php
│ │ │ ├── CandidateRegistration.php
│ │ │ ├── CanNotFindCandidateRegistration.php
│ │ │ ├── CannotFindExamInListing.php
│ │ │ └── ExamRequiringManualApproval.php
│ │ ├── RegisterCandidate.php
│ │ └── Versioned
│ │ ├── CandidateWasRegistered.php
│ │ ├── ExamInvitationWasSentToCandidate.php
│ │ ├── ExamInvitationWasSentToCandidateV2.php
│ │ └── ExamInvitationWasSentToCandidateV3.php
│ ├── CertBootstrap.php
│ ├── CertificateStatusesUpdated.php
│ ├── CertificationVerification
│ │ ├── CanNotVerifyDeveloper.php
│ │ ├── CertifiedDeveloperListing.php
│ │ └── CertifiedDeveloper.php
│ ├── CertInvoiceNumberDoesNotMatchCorrectFormat.php
│ ├── CertLogMessages.php
│ ├── CouldNotMatchExamRefundToOrder.php
│ ├── DiscountPrograms
│ │ ├── CanNotFindPaymentMethodForDiscountPurchase.php
│ │ ├── CountryCodeIsNotValid.php
│ │ ├── CountryCode.php
│ │ ├── CountryTierDefinition.php
│ │ ├── CountryTierDefinitions.php
│ │ ├── DiscountProgramEmails.php
│ │ ├── DiscountProgramsBootstrap.php
│ │ ├── DiscountTierDefinition.php
│ │ ├── DiscountTierDefinitions.php
│ │ ├── Economy
│ │ │ ├── ApproveUnvalidatedEconomyDiscountPurchase.php
│ │ │ ├── EconomyDiscountApplication.php
│ │ │ ├── EconomyDiscountApplicationWasReceived.php
│ │ │ ├── EconomyDiscountCountryListWasImported.php
│ │ │ ├── EconomyDiscountPurchaseVerificationFailed.php
│ │ │ ├── EconomyDiscountPurchaseWasMade.php
│ │ │ ├── EconomyDiscountTierListWasImported.php
│ │ │ ├── ImportEconomyDiscountCountryList.php
│ │ │ ├── ImportEconomyDiscountTierList.php
│ │ │ ├── Processes
│ │ │ │ ├── ReceiveEconomyDiscountApplicationsFromTypeform.php
│ │ │ │ ├── SendDiscountCodeToEconomyDiscountApplicant.php
│ │ │ │ ├── SendEconomyDiscountApplicationFailedEmailToCustomer.php
│ │ │ │ └── ValidateEconomyPurchaseMatchesDiscountCountryCode.php
│ │ │ └── Projections
│ │ │ ├── CanNotFindDiscountByCountryCode.php
│ │ │ ├── CanNotFindDiscountByDiscountCode.php
│ │ │ ├── CanNotFindUnvalidatedPurchaseByInvoiceNumber.php
│ │ │ ├── Discount.php
│ │ │ ├── EconomyDiscountTierDefinitionsProjection.php
│ │ │ └── ListOfPendingUnvalidatedEconomyDiscountPurchasesProjection.php
│ │ ├── Educational
│ │ │ ├── ApproveUnvalidatedEducationalDiscountPurchase.php
│ │ │ ├── EducationalDiscountApplication.php
│ │ │ ├── EducationalDiscountApplicationWasReceived.php
│ │ │ ├── EducationalDiscountCountryListWasImported.php
│ │ │ ├── EducationalDiscountPurchaseVerificationFailed.php
│ │ │ ├── EducationalDiscountPurchaseWasMade.php
│ │ │ ├── EducationalDiscountTierListWasImported.php
│ │ │ ├── ImportEducationalDiscountCountryList.php
│ │ │ ├── ImportEducationalDiscountTierList.php
│ │ │ ├── Processes
│ │ │ │ ├── ReceiveEducationalDiscountApplicationsFromTypeform.php
│ │ │ │ ├── SendDiscountCodeToEducationalApplicant.php
│ │ │ │ ├── SendEducationalDiscountApplicationFailedEmailToCustomer.php
│ │ │ │ └── ValidateEducationalPurchaseMatchesDiscountCountryCode.php
│ │ │ └── Projections
│ │ │ ├── CanNotFindDiscountByCountryCode.php
│ │ │ ├── CanNotFindDiscountByDiscountCode.php
│ │ │ ├── Discount.php
│ │ │ ├── EducationalDiscountTierDefinitionsProjection.php
│ │ │ └── ListOfPendingUnvalidatedEducationalDiscountPurchasesProjection.php
│ │ ├── Nonprofit
│ │ │ ├── ApproveUnvalidatedNonprofitDiscountPurchase.php
│ │ │ ├── ImportNonprofitDiscountCountryList.php
│ │ │ ├── ImportNonprofitDiscountTierList.php
│ │ │ ├── NonprofitDiscountApplication.php
│ │ │ ├── NonprofitDiscountApplicationWasReceived.php
│ │ │ ├── NonprofitDiscountCountryListWasImported.php
│ │ │ ├── NonprofitDiscountPurchaseVerificationFailed.php
│ │ │ ├── NonprofitDiscountPurchaseWasMade.php
│ │ │ ├── NonprofitDiscountTierListWasImported.php
│ │ │ ├── Processes
│ │ │ │ ├── ReceiveNonprofitDiscountApplicationsFromTypeform.php
│ │ │ │ ├── SendDiscountCodeToNonprofitApplicant.php
│ │ │ │ ├── SendNonprofitDiscountApplicationFailedEmailToCustomer.php
│ │ │ │ └── ValidateNonprofitPurchaseMatchesDiscountCountryCode.php
│ │ │ └── Projections
│ │ │ ├── CanNotFindDiscountByCountryCode.php
│ │ │ ├── CanNotFindDiscountByDiscountCode.php
│ │ │ ├── Discount.php
│ │ │ ├── ListOfPendingUnvalidatedNonprofitDiscountPurchasesProjection.php
│ │ │ └── NonprofitDiscountTierDefinitionsProjection.php
│ │ ├── Processes
│ │ │ ├── ResumeProcessingOfApproveUnvalidatedPurchases.php
│ │ │ └── SubscribeDiscountApplicantsToMailchimp.php
│ │ ├── Projections
│ │ │ ├── DiscountApplicant.php
│ │ │ ├── DiscountApplicantsProjection.php
│ │ │ ├── DiscountCodeOrderReportProjection.php
│ │ │ └── DiscountOrder.php
│ │ ├── UnvalidatedDiscountPurchaseWasApproved.php
│ │ ├── UnvalidatedPurchase.php
│ │ ├── UploadedCountryTierCsvIsNotCompatible.php
│ │ └── UploadedDiscountTierCsvIsNotCompatible.php
│ ├── Emails
│ │ ├── cannot-register-candidate-no-more-vouchers-email.twig
│ │ ├── CertEmails.php
│ │ ├── certificate-awarded-email.twig
│ │ ├── certificate-first-denial-email.twig
│ │ ├── certificate-retake-denial-email.twig
│ │ ├── InviteCandidateToExamEmail.twig
│ │ ├── InviteCandidateToRetakeTheExam.twig
│ │ └── InvitePurchaserToRegisterCandidates.twig
│ ├── ExamPlatform
│ │ ├── ApproveExam.php
│ │ ├── CandidateContactDetailsWereProvided.php
│ │ ├── CanNotDetermineWhichCertificateDenialEmailToSend.php
│ │ ├── CanNotDownloadCertificatePdfForVoucher.php
│ │ ├── DenyExam.php
│ │ ├── DownloadAndImportExamPlatformPurchaseList.php
│ │ ├── GetCandidateDetails.php
│ │ ├── GetCertificatePdf.php
│ │ ├── GetPurchaseList.php
│ │ ├── GetVoucher.php
│ │ ├── MonitorWebhooksToIdentifyExamPlatformEvents.php
│ │ └── VoucherId.php
│ ├── ExamPlatformPurchasesWereImported.php
│ ├── ExamPurchasedFulfilledThroughProctorExamAnalysis.php
│ ├── ExamPurchaseWasFulfilled.php
│ ├── ExamPurchaseWasMade.php
│ ├── ExamPurchaseWasRefundedByQuadernoImport.php
│ ├── ExamPurchaseWasRefunded.php
│ ├── ExamVouchersWereIssued.php
│ ├── Fulfillment
│ │ ├── IdentifyFulfilledOrders.php
│ │ └── SalesVoucherWasIssued.php
│ ├── IdentifyRefunds.php
│ ├── ImportExamPlatformPurchases.php
│ ├── ImportId.php
│ ├── InterpretImportedExamPurchases.php
│ ├── InvoiceNumber.php
│ ├── PartnerProgram
│ │ ├── CertPartnerProgramBootstrap.php
│ │ ├── cert-partner-program.md
│ │ ├── CouldNotCreatePartnershipDiscountCode.php
│ │ ├── CouldNotSendPartnershipDiscountCode.php
│ │ ├── PartnerProgramConfiguration.php
│ │ ├── PartnerProgramEmails.php
│ │ ├── PartnerProgramPurchaseWasMadeThroughQuaderno.php
│ │ ├── PartnershipBegan.php
│ │ ├── PartnershipDiscountCodeWasAdded.php
│ │ ├── PartnershipId.php
│ │ ├── Partnership.php
│ │ ├── PartnershipProgramDiscountCodeWasSent.php
│ │ └── Processes
│ │ ├── BeginPartnerships.php
│ │ ├── CreatePartnershipDiscountCodes.php
│ │ ├── IdentifyPartnerProgramPurchases.php
│ │ └── SendPartnershipDiscountCodeEmails.php
│ ├── Proctor
│ │ ├── CanNotFindExamIdForProctorId.php
│ │ ├── CreateProctorExam.php
│ │ ├── ExamContainsNoStudentSessions.php
│ │ ├── Exam.php
│ │ ├── ExamWasStarted.php
│ │ ├── MonitorWebhooksToIdentifyProctorExamEvents.php
│ │ ├── ProctorApi.php
│ │ ├── ProctorApiResponse.php
│ │ ├── ProctorExamId.php
│ │ ├── ProctorExam.php
│ │ ├── ReviewStatus.php
│ │ ├── StudentExam.php
│ │ ├── Student.php
│ │ └── UpdateCompletedProctorExams.php
│ ├── ProctorExamDataWasUpdated.php
│ ├── Purchasing
│ │ ├── CancelOrder.php
│ │ ├── ExamCreditCardPurchaseWasMade.php
│ │ ├── ExamOrderWasCanceled.php
│ │ ├── ExamPaypalPurchaseWasMade.php
│ │ ├── ExamPurchaseInvoiceWasCreated.php
│ │ ├── ExamPurchaseInvoiceWasPaid.php
│ │ ├── ExamPurchaseWasMade.php
│ │ ├── ExamPurchaseWasRefundedV2.php
│ │ ├── IdentifyExamPurchaseEvents.php
│ │ ├── PlaceInvoiceOrder.php
│ │ ├── Processes
│ │ │ ├── SendPurchaserInvitationToRegisterCandidates.php
│ │ │ └── SubscribePurchaserToMailchimp.php
│ │ ├── Projections
│ │ │ ├── CanNotFindExamVoucherOrder.php
│ │ │ ├── ExamVoucherOrderListingProjection.php
│ │ │ └── ExamVoucherOrder.php
│ │ └── SpanishCertificationPreorderWasMade.php
│ ├── Quaderno
│ │ ├── CreditId.php
│ │ ├── CreditNumber.php
│ │ ├── InvoiceWasConvertedToCredit.php
│ │ ├── MonitorWebhooksToIdentifyQuadernoEvents.php
│ │ ├── Projections
│ │ │ ├── CanNotFindQuadernoCreditWithCreditNumber.php
│ │ │ ├── CanNotFindQuadernoInvoiceWithInvoiceNumber.php
│ │ │ ├── CertCreditNumberDoesNotMatchCorrectFormat.php
│ │ │ ├── QuadernoInvoiceListing.php
│ │ │ └── QuadernoInvoiceListingProjection.php
│ │ ├── QuadernoCreditCreated.php
│ │ ├── QuadernoCredit.php
│ │ ├── QuadernoCreditUpdated.php
│ │ ├── QuadernoException.php
│ │ ├── QuadernoInvoiceCreated.php
│ │ ├── QuadernoInvoice.php
│ │ ├── QuadernoInvoiceUpdated.php
│ │ ├── QuadernoPaymentCreated.php
│ │ ├── TestInvoiceId.php
│ │ └── TestInvoiceWasCreated.php
│ ├── SearchForFulfilledOrdersUsingProctorExamAndCandidateRegistrationData.php
│ ├── SearchNewProctorExamDataForFulfilledOrders.php
│ ├── UpdateProctorExamDataNightly.php
│ └── Webinars
│ ├── Processes
│ │ ├── MonitorQuadernoEventsForWebinarPurchases.php
│ │ ├── MonitorWebinarsForCapacity.php
│ │ └── SendThankYouEmailToWebinarRegistrants.php
│ ├── WebinarCapacityWasChanged.php
│ ├── WebinarEmails.php
│ ├── WebinarPurchaseWasMade.php
│ └── WebinarsBootstrap.php
├── Charts
│ ├── ChartBootstrap.php
│ ├── Chart.php
│ ├── LineChart.php
│ ├── Quickchart.php
│ └── SendExampleChartToBot.php
├── Csv
│ └── Csv.php
├── CustomerSupport
│ └── ScanSupportTicketsForHelpfulContent.php
├── Database
│ ├── CanNotCommitMigration.php
│ ├── create_migrations_table.sql
│ ├── DatabasesBootstrap.php
│ ├── MgmtDb.php
│ ├── MigrationPaths.php
│ ├── Migrations.php
│ └── ResetDatabaseForTesting.php
├── Development
│ ├── Deployment
│ │ ├── DeploymentCompleted.php
│ │ ├── DeploymentId.php
│ │ └── IdentifyForgeDeploymentHooks.php
│ ├── DeveloperNoteId.php
│ ├── DeveloperNoteListing.php
│ ├── DeveloperNoteListingProjection.php
│ ├── DeveloperNoteWasLeft.php
│ ├── DevelopmentBootstrap.php
│ ├── DevelopmentException.php
│ ├── FeedAnEventIntoAListener.php
│ ├── HtmlDocumentationEnrichment.php
│ ├── InvalidEventListenerSpecified.php
│ └── LeaveDeveloperNote.php
├── EventManagement
│ ├── Charts
│ │ ├── SalesLineChart.php
│ │ └── Theme.php
│ ├── EventManagementBootstrap.php
│ ├── Events
│ │ ├── AddEvent.php
│ │ ├── CouldNotFindEvent.php
│ │ ├── EventId.php
│ │ ├── EventListing.php
│ │ ├── EventListingProjection.php
│ │ ├── Event.php
│ │ ├── EventWasAdded.php
│ │ ├── EventWasRenamed.php
│ │ └── RenameEvent.php
│ ├── HtmlFormattedEventStream.php
│ ├── Projections
│ │ ├── EventSale.php
│ │ └── EventSalesProjection.php
│ └── Ticketing
│ ├── BillingAddress.php
│ ├── BindTitoEventIdToEvent.php
│ ├── CanNotFindTitoEventByEventId.php
│ ├── ConvertTitoWebhooksToDomainEvents.php
│ ├── NotifyCustomerThatTheirPaymentWasReceived.php
│ ├── PaymentWasReceivedEmail.twig
│ ├── Reports
│ │ ├── FiveDaySalesReport.php
│ │ ├── Sale.php
│ │ ├── SalesTotal.php
│ │ └── TicketSalesProjection.php
│ ├── TicketingEmails.php
│ ├── TicketPurchaseListing.php
│ ├── TitoEventId.php
│ ├── TitoEventIdWasBoundToEvent.php
│ ├── TitoEventIdWasBoundToEventV2.php
│ ├── TitoEvent.php
│ ├── TitoEventsListing.php
│ ├── TitoOrderId.php
│ ├── TitoOrderWasCancelled.php
│ ├── TitoOrderWasCompleted.php
│ ├── TitoOrderWasFinished.php
│ ├── TitoOrderWasPaid.php
│ ├── TitoOrderWasUpdated.php
│ ├── TitoTicketId.php
│ ├── TitoTicket.php
│ ├── TitoTickets.php
│ ├── TitoTicketWasCompleted.php
│ ├── TitoTicketWasCreated.php
│ ├── TitoTicketWasReassigned.php
│ ├── TitoTicketWasUnvoided.php
│ ├── TitoTicketWasUpdated.php
│ ├── TitoTicketWasVoided.php
│ └── UnpaidInvoiceReminders
│ ├── EmailPaymentReminderCouldNotBeSent.php
│ ├── EmailPaymentReminderWasSent.php
│ ├── FirstPaymentReminderEmail.twig
│ ├── IdentifiedInvoiceOrderForPaymentReminder.php
│ ├── IdentifyOverdueInvoiceOrders.php
│ ├── InvoiceOrderContactEmailBounced.php
│ ├── InvoiceOrderWasCancelled.php
│ ├── InvoiceOrderWasPaid.php
│ ├── InvoiceOrderWasPlaced.php
│ ├── MonitorTitoInvoiceOrders.php
│ ├── OrderPaymentReminderSecondEmail.twig
│ ├── OrderPaymentReminderThirdEmail.twig
│ ├── SendUnpaidInvoiceReminderEmails.php
│ ├── StoppedTrackingOrderBecauseEventIsOver.php
│ ├── StoppedWatchingUnpaidInvoiceOrdersBecauseEventIsOver.php
│ ├── UnpaidInvoiceOrdersListingProjection.php
│ └── UnpaidInvoiceReminderEmails.php
├── EventSourcing
│ ├── EventCanNotBeFoundByDatabaseId.php
│ ├── EventStoreMaintenance.php
│ ├── ListenerMaintenance.php
│ └── ProjectionMaintenance.php
├── FeatureFlags
│ ├── Feature.php
│ └── Features.php
├── Freshdesk
│ ├── InvalidFreshdeskApiCredentials.php
│ └── Ticket.php
├── functions.php
├── Google
│ ├── AccessTokenIsNoLongerValid.php
│ ├── AccessToken.php
│ ├── AccessTokenResponseIsInvalid.php
│ ├── AccessTokenResponse.php
│ ├── ApiCredentials.php
│ ├── Api.php
│ ├── GoogleBootstrap.php
│ ├── GoogleCalendarApi.php
│ ├── GoogleCalendarOauthAccessTokenHasExpired.php
│ └── GoogleCalendar.php
├── Hopin
│ ├── CanNotCreateTickets.php
│ ├── CreateHiddenHopinTickets.php
│ ├── HopinBootstrap.php
│ ├── HopinRegistrationWasCreated.php
│ ├── HopinTicketReference.php
│ ├── IdentifyHopinWebhookEvents.php
│ └── Projections
│ ├── CanNotFindHopinRegistrationForRegistrationId.php
│ ├── HopinRegistration.php
│ └── HopinRegistrations.php
├── IngBanking
│ ├── AccountId.php
│ ├── Account.php
│ ├── Api
│ │ ├── AccountResponse.php
│ │ ├── AccountsResponse.php
│ │ ├── BookedTransactions.php
│ │ ├── PendingTransactions.php
│ │ └── TransactionsResponse.php
│ ├── Bban.php
│ ├── Bic.php
│ ├── EndToEndId.php
│ ├── Iban.php
│ ├── Name.php
│ ├── RemittanceInformation.php
│ ├── TransactionId.php
│ └── Transaction.php
├── LaraconEu
│ ├── LaraconEuBootstrap.php
│ ├── LaraconEu.md
│ └── Online
│ ├── BulkPurchaseForm.php
│ ├── BulkPurchaseId.php
│ ├── CouldNotCreateFreeConferenceTicketForAWebinarCustomer.php
│ ├── CouldNotCreateInvoiceForLaraconEuOnlineBulkPurchase.php
│ ├── CouldNotCreateInvoiceForLaraconEuOnlineHopinTicket.php
│ ├── CouldNotCreateTicketsForLaraconEuOnlineBulkPurchase.php
│ ├── CreateLaraconEuEventTickets.php
│ ├── FreeConferenceTicketForWebinarCustomerWasSent.php
│ ├── FreeConferenceTicketWasCreatedForAWebinarCustomer.php
│ ├── HopinTicketsForALaraconEUOnlineBulkPurchaseWereCreated.php
│ ├── InvoiceRequestForm.php
│ ├── LaraconEuHopinCustomerWasSentTheirInvoice.php
│ ├── LaraconEuInvoiceRequestWasReceived.php
│ ├── LaraconEuMoneybirdInvoiceForAHopinTicketWasCreated.php
│ ├── LaraconEuOnlineBulkPurchaseWasMade.php
│ ├── LaraconEuOnlineBulkTicketPurchaseDetailsWereSent.php
│ ├── LaraconEuOnlineEmails.php
│ ├── LaraconEuOnlineEventTicketsWereCreated.php
│ ├── LaraconEuOnlineMoneybirdInvoiceForBulkPurchasesWasCreated.php
│ ├── Processes
│ │ ├── CreateConferenceTicketsForWebinarCustomers.php
│ │ ├── CreateHopinTicketsForBulkPurchases.php
│ │ ├── GenerateInvoiceForBulkPurchases.php
│ │ ├── GenerateInvoiceForHopinPurchases.php
│ │ ├── IdentifyBulkPurchaseEventsFromWebhook.php
│ │ ├── IdentifyInvoiceRequestFormSubmissionsFromWebhook.php
│ │ ├── SendBulkTicketPurchasersTheirTicketAndInvoiceEmail.php
│ │ ├── SendConferenceTicketEmailToWebinarCustomer.php
│ │ ├── SendHopinCustomersAnInvitationToTheTaxDetailCollectionForm.php
│ │ ├── SendHopinCustomersTheirInvoice.php
│ │ └── SendLaraconEuOnlineTicketEmail.php
│ ├── Projections
│ │ ├── BulkPurchase.php
│ │ ├── BulkPurchases.php
│ │ ├── CanNotFindBulkPurchaseForBulkPurchaseId.php
│ │ ├── CanNotFindHopinInvoiceForRegistrationId.php
│ │ ├── CanNotFindInvoiceRequestForRegistration.php
│ │ ├── CreatedInvoice.php
│ │ ├── CreatedLaraconEuOnlineEventTickets.php
│ │ ├── CreatedTicket.php
│ │ ├── HopinInvoice.php
│ │ ├── HopinInvoices.php
│ │ ├── InvoiceRequest.php
│ │ └── InvoiceRequests.php
│ └── TicketCreationId.php
├── Logging
│ ├── CanNotFindLogEntryById.php
│ ├── Category.php
│ ├── EventHistoryLog.php
│ ├── LogEntryId.php
│ ├── LogEntry.php
│ ├── LoggingBootstrap.php
│ ├── LogMessageResolution.php
│ └── LogMessages.php
├── Mailchimp
│ ├── MailchimpApi.php
│ ├── MailchimpBootstrap.php
│ └── Mailchimp.php
├── Mailing
│ ├── EmailAddressIsNotValid.php
│ └── Email.php
├── MgmtException.php
├── Money
│ ├── CurrenciesDontMatch.php
│ ├── Currency.php
│ ├── Money.php
│ └── MoneyStringIsInvalid.php
├── Moneybird
│ ├── AccessTokenIsNoLongerValid.php
│ ├── AccessTokenResponseIsInvalid.php
│ ├── AccessTokenResponse.php
│ ├── ApiCredentials.php
│ ├── Api.php
│ ├── CanNotDownloadFile.php
│ ├── CanNotRetrieveAdministrationIdFromMoneybirdApi.php
│ ├── Contact.php
│ ├── Invoice.php
│ ├── LineItem.php
│ ├── MoneybirdBootstrap.php
│ ├── MoneybirdCanNotCreateContact.php
│ ├── MoneybirdException.php
│ ├── Moneybird.php
│ └── Payment.php
├── NewTelegram
│ ├── CanNotGetWebhookInfoFromTelegram.php
│ ├── Group.php
│ ├── Message.php
│ ├── Receive
│ │ ├── CanNotFindAMethodForRoutingReceivedCommand.php
│ │ ├── CanNotOverwriteTelegramCommandWithTheSameName.php
│ │ ├── CanNotParseARoutableMethodFromReceivedCommand.php
│ │ ├── Chat.php
│ │ ├── InvalidTelegramCommandArguments.php
│ │ ├── MessageEntity.php
│ │ ├── ReceivedCommand.php
│ │ ├── ReceivedMessage.php
│ │ ├── RouteParameters.php
│ │ ├── Sender.php
│ │ ├── TelegramCommand.php
│ │ └── TelegramCommandRouter.php
│ └── TelegramException.php
├── Postmark
│ ├── Attachment.php
│ ├── ConvertPostmarkWebhooksToDomainEvents.php
│ ├── ErrorResponse.php
│ ├── LaraconEUMailer.php
│ ├── LaravelCertificationMailer.php
│ ├── Mail.php
│ ├── MessageId.php
│ ├── PostmarkApi.php
│ ├── PostmarkBootstrap.php
│ ├── PostmarkEmailBounced.php
│ ├── PostmarkEmailLinkWasClicked.php
│ ├── PostmarkEmailWasDelivered.php
│ ├── PostmarkEmailWasOpened.php
│ ├── PostmarkLaraconEuMailer.php
│ ├── PostmarkLaravelCertificationMailer.php
│ ├── PostmarkMailer.php
│ ├── PostmarkMetadataFieldLengthsCannotBeLongerThan20Characters.php
│ ├── PostmarkMetadataValueLengthsCannotBeLongerThan80Characters.php
│ ├── Projections
│ │ ├── BounceData.php
│ │ ├── MailingEventHistoryProjection.php
│ │ ├── MailingEvent.php
│ │ ├── Metadata.php
│ │ └── RecipientData.php
│ ├── ReceivedAPostmarkSpamComplaint.php
│ └── SuccessResponse.php
├── Profiling
│ └── ProfileRequest.php
├── Quaderno
│ ├── Address.php
│ ├── BankAccount.php
│ ├── CanNotCreateContact.php
│ ├── CanNotCreateCountry.php
│ ├── CanNotCreateCoupon.php
│ ├── CanNotCreateLanguage.php
│ ├── CanNotCreateUnrecognizedKind.php
│ ├── CanNotFindQuadernoItemByCode.php
│ ├── CanNotValidateUrl.php
│ ├── CanNotValidateVatNumber.php
│ ├── ContactEmail.php
│ ├── ContactName.php
│ ├── Contact.php
│ ├── Country.php
│ ├── CouponCode.php
│ ├── CurlQuadernoApi.php
│ ├── Currency.php
│ ├── FullName.php
│ ├── InvoiceItems.php
│ ├── Invoice.php
│ ├── Item.php
│ ├── Kind.php
│ ├── Language.php
│ ├── PrimaryAddress.php
│ ├── QuadernoApi.php
│ ├── QuadernoBootstrap.php
│ ├── QuadernoContact.php
│ ├── QuadernoException.php
│ ├── QuadernoItem.php
│ ├── QuadernoItems.php
│ ├── QuadernoPayment.php
│ ├── QuadernoPayments.php
│ ├── SecondaryAddress.php
│ ├── Tax.php
│ ├── VatNumber.php
│ └── WebUrl.php
├── Shell
│ ├── ShellCommandFailed.php
│ └── ShellCommand.php
├── Storage
│ ├── CanNotDeleteLocalFile.php
│ ├── CanNotDownloadFile.php
│ ├── CanNotIdentifyRootPathForFileManagement.php
│ ├── CanNotStoreFileLocally.php
│ ├── FileManagement.php
│ ├── PublicS3.php
│ ├── S3Details.php
│ ├── S3.php
│ ├── StorageBootstrap.php
│ └── StorageException.php
├── Stripe
│ ├── Balance.php
│ ├── example-payloads
│ │ ├── balance.available.json
│ │ └── balance-object.json
│ ├── IdentifyStripeEventsFromWebhooks.php
│ ├── Iso4217Currency.php
│ ├── SourceType.php
│ ├── StripeAvailableBalanceWasUpdated.php
│ ├── StripeBootstrap.php
│ ├── StripeChargeSucceeded.php
│ ├── StripeRequest.php
│ └── ThreeLetterCurrencyCodeIsNotValid.php
├── SupportTickets
│ ├── FreshdeskTicketWasClosed.php
│ ├── MonitorWebhooksForSupportTicketEvents.php
│ ├── SupportTicketsBootstrap.php
│ └── TicketId.php
├── Telegram
│ ├── Group.php
│ ├── Message.php
│ └── TelegramBootstrap.php
├── Templating
│ ├── CamelCaseTransformsExtension.php
│ └── TwigExtensionsBootstrap.php
├── Test
│ ├── TestBootstrap.php
│ └── TestEvent.php
├── TextFormatting
│ ├── AnsiCodes.php
│ ├── Ansi.php
│ ├── SyntaxHighlighting.php
│ ├── TextRecordListing.php
│ └── TextTable.php
├── Time
│ ├── ADayHasPassed.php
│ ├── AnHourHasPassed.php
│ ├── Clock.php
│ ├── Date.php
│ ├── DayPassingEventIsntTriggered.php
│ ├── HourPassingEventIsntTriggered.php
│ ├── ServerClock.php
│ ├── TimeBootstrap.php
│ ├── TimeSanityCheck.php
│ └── TimezoneReport.php
├── Typeform
│ ├── Answer.php
│ ├── CanNotFindAnswerToQuestion.php
│ ├── CanNotFindHiddenValueInTypeform.php
│ ├── Form.php
│ └── Question.php
├── UserManagement
│ ├── CannotAddDuplicateCapability.php
│ ├── CapabilityNotSupported.php
│ ├── Capability.php
│ ├── CouldNotFindUser.php
│ ├── GlobalCapabilities.php
│ ├── GlobalCapability.php
│ ├── GrantGlobalCapability.php
│ ├── UserId.php
│ ├── UserListing.php
│ └── User.php
├── Web
│ ├── Auth
│ │ ├── Auth.php
│ │ ├── AuthRoutes.php
│ │ ├── ForwardLoggedInUsersToDashboard.php
│ │ ├── LoginController.php
│ │ ├── LoginForm.php
│ │ ├── login-form.twig
│ │ └── LogoutController.php
│ ├── Bot
│ │ ├── BotRoutes.php
│ │ ├── SendCertLogToMgmtController.php
│ │ ├── SendToMgmtController.php
│ │ ├── SmartListener.php
│ │ └── TelegramReceivedController.php
│ ├── Cert
│ │ ├── approve-exam-confirmation.twig
│ │ ├── BusinessCertification
│ │ │ ├── BusinessCertificationRoutes.php
│ │ │ ├── CertifiedBusinessListingController.php
│ │ │ └── certified-business-listing.twig
│ │ ├── CandidateDetailsController.php
│ │ ├── candidate-details.twig
│ │ ├── CandidateExamination
│ │ │ ├── ApproveExamController.php
│ │ │ ├── ClearExamRequiringManualApprovalController.php
│ │ │ ├── DenyExamController.php
│ │ │ ├── ExamsRequiringManualApprovalController.php
│ │ │ ├── exams-that-require-manual-approval.twig
│ │ │ ├── force-approve-exam-confirmation.twig
│ │ │ ├── ForceApproveExamController.php
│ │ │ ├── ForceApproveExamForm.php
│ │ │ ├── RegisterCandidateController.php
│ │ │ ├── RegisterCandidateForm.php
│ │ │ └── register-candidate-form.twig
│ │ ├── CandidateRegistrationListingController.php
│ │ ├── candidate-registration-listing.twig
│ │ ├── CanManageCert.php
│ │ ├── CertRoutes.php
│ │ ├── ChangeCandidateContactInformationController.php
│ │ ├── ChangeCandidateContactInformationForm.php
│ │ ├── change-candidate-contact-information-form.twig
│ │ ├── change-candidate-name-command-view.twig
│ │ ├── ChangeCandidateNameOnCertificateController.php
│ │ ├── ChangeCandidateNameOnCertificateForm.php
│ │ ├── change-candidate-name-on-certificate-form.twig
│ │ ├── deny-exam-confirmation.twig
│ │ ├── DiscountPrograms
│ │ │ ├── DiscountApplicantsController.php
│ │ │ ├── DiscountApplicantsCsvController.php
│ │ │ ├── discount-applicants.twig
│ │ │ ├── DiscountCodeOrderReportController.php
│ │ │ ├── DiscountCodeOrderReportCsvController.php
│ │ │ ├── discount-code-order-report.twig
│ │ │ ├── DiscountProgramsController.php
│ │ │ ├── discount-programs-index.twig
│ │ │ ├── Economy
│ │ │ │ ├── ApproveUnvalidatedEconomyDiscountPurchaseController.php
│ │ │ │ ├── UploadEconomyPricingSpreadsheetController.php
│ │ │ │ ├── UploadEconomyPricingSpreadsheetForm.php
│ │ │ │ └── upload-pricing-spreadsheet-form.twig
│ │ │ ├── Educational
│ │ │ │ ├── ApproveUnvalidatedEducationalDiscountPurchaseController.php
│ │ │ │ ├── UploadEducationalPricingSpreadsheetController.php
│ │ │ │ ├── UploadEducationalPricingSpreadsheetForm.php
│ │ │ │ └── upload-pricing-spreadsheet-form.twig
│ │ │ ├── Nonprofit
│ │ │ │ ├── ApproveUnvalidatedNonprofitDiscountPurchaseController.php
│ │ │ │ ├── UploadNonprofitPricingSpreadsheetController.php
│ │ │ │ ├── UploadNonprofitPricingSpreadsheetForm.php
│ │ │ │ └── upload-pricing-spreadsheet-form.twig
│ │ │ ├── UnvalidatedPurchasesController.php
│ │ │ └── unvalidated-purchases.twig
│ │ ├── ExamListingController.php
│ │ ├── exam-listing.twig
│ │ ├── ExamVoucherOrderListingController.php
│ │ ├── ExamVoucherOrderListingCsvController.php
│ │ ├── exam-voucher-order-listing.twig
│ │ ├── invite-candidate-to-first-exam-confirmation.twig
│ │ ├── InviteCandidateToFirstExamController.php
│ │ ├── invite-candidate-to-retake-exam-confirmation.twig
│ │ ├── InviteCandidateToRetakeExamController.php
│ │ ├── InvoiceRequest
│ │ │ ├── InvoiceRequestFormController.php
│ │ │ ├── InvoiceRequestForm.php
│ │ │ └── InvoiceRequestForm.twig
│ │ ├── PlannedRetakeListingController.php
│ │ ├── planned-retake-listing.twig
│ │ ├── ProctorExamListingController.php
│ │ ├── proctor-exam-listing.twig
│ │ ├── Quaderno
│ │ │ ├── QuadernoToolsIndexController.php
│ │ │ ├── quaderno-tools-index.twig
│ │ │ ├── ViewQuadernoEvidenceController.php
│ │ │ ├── ViewQuadernoEvidenceForm.php
│ │ │ ├── view-quaderno-evidence-form.twig
│ │ │ └── view-quaderno-evidence.twig
│ │ ├── ResendCandidateExamInvitationController.php
│ │ ├── resend-candidate-exam-invitation.twig
│ │ ├── ResendCandidateFailedFirstExamNotificationController.php
│ │ ├── resend-candidate-failed-first-exam-notification.twig
│ │ ├── ResendCandidateFailedRetakeExamNotificationController.php
│ │ ├── resend-candidate-failed-retake-exam-notification.twig
│ │ ├── ResendCandidateRegistrationInvitationController.php
│ │ ├── ResendCandidateSuccessNotificationController.php
│ │ ├── resend-candidate-success-notification.twig
│ │ ├── SendCandidateRegistrationToNewEmailFormController.php
│ │ ├── SendCandidateRegistrationToNewEmailForm.php
│ │ ├── send-candidate-registration-to-new-email-form.twig
│ │ └── SendFirstExamInvitationToCandidateController.php
│ ├── ChartController.php
│ ├── Chart.twig
│ ├── Development
│ │ ├── CanManageAppDevelopment.php
│ │ ├── ChartTestController.php
│ │ ├── Dashboard
│ │ │ ├── DashboardController.php
│ │ │ └── dashboard.twig
│ │ ├── DeveloperNoteListingController.php
│ │ ├── DeveloperNoteListing.twig
│ │ ├── DevelopmentRoutes.php
│ │ ├── DocumentationController.php
│ │ ├── Documentation.twig
│ │ ├── DomainEventFeederController.php
│ │ ├── DomainEventFeederForm.php
│ │ ├── domain-event-feeder-form.twig
│ │ ├── DomainEventListController.php
│ │ ├── domain-event-list.twig
│ │ ├── DomainEventViewerController.php
│ │ ├── domain-event-viewer.twig
│ │ ├── EndpointTestController.php
│ │ ├── LeaveDeveloperNoteController.php
│ │ ├── LeaveDeveloperNoteForm.twig
│ │ ├── MailingEventListingController.php
│ │ ├── mailing-event-listing.twig
│ │ ├── MailingEventsToRecipientController.php
│ │ ├── mailing-events-to-recipient.twig
│ │ ├── mailing-event.twig
│ │ ├── nord-syntax-highlighting.twig
│ │ ├── PhpInfoController.php
│ │ ├── ProcessManagement
│ │ │ ├── ProcessListingController.php
│ │ │ ├── ProcessListing.twig
│ │ │ └── UnpaidInvoiceReminders
│ │ │ ├── IdentifyUnpaidInvoiceProcessController.php
│ │ │ ├── IdentifyUnpaidInvoiceProcess.twig
│ │ │ ├── MonitorTitoInvoiceOrdersProcessController.php
│ │ │ ├── MonitorTitoInvoiceOrdersProcess.twig
│ │ │ ├── ProcessOverviewController.php
│ │ │ ├── ProcessOverview.twig
│ │ │ ├── SendUnpaidInvoiceReminderProcessController.php
│ │ │ └── SendUnpaidInvoiceReminderProcess.twig
│ │ ├── TestProveSourceIntegrationController.php
│ │ ├── TimeoutTestController.php
│ │ └── WebsocketTestControllers.php
│ ├── EventManagement
│ │ ├── EventManagementRoutes.php
│ │ └── SalesChartController.php
│ ├── formatted-event-stream.twig
│ ├── Forms
│ │ ├── CannotRenderForm.php
│ │ ├── Field.php
│ │ ├── Form.php
│ │ ├── Old
│ │ │ ├── Field.php
│ │ │ ├── FormFieldNotFound.php
│ │ │ ├── FormModelController.php
│ │ │ ├── FormModel.php
│ │ │ └── Form.php
│ │ ├── Outcome.php
│ │ ├── Rules
│ │ │ └── Required.php
│ │ └── Validation.php
│ ├── form.twig
│ ├── Freshdesk
│ │ ├── CanUseFreshdeskPlugin.php
│ │ ├── CertificationSupport.twig
│ │ ├── CustomerSupport.twig
│ │ ├── FreshdeskCertificationSupportController.php
│ │ ├── FreshdeskCustomerSupportController.php
│ │ ├── FreshdeskPluginLoadingController.php
│ │ ├── FreshdeskRoutes.php
│ │ └── FreshdeskTicketingSupportController.php
│ ├── functions.php
│ ├── Global
│ │ ├── Layouts
│ │ │ ├── admin-with-sidebar-layout.twig
│ │ │ ├── DefaultAdmin.twig
│ │ │ ├── DefaultAdminWithSidebar.twig
│ │ │ └── plain-no-sidebar-layout.twig
│ │ └── Partials
│ │ ├── AdminPageFooter.twig
│ │ ├── KitchenSink.twig
│ │ ├── Logo.twig
│ │ └── WIP
│ │ ├── 3-Forms.css
│ │ └── Progress.twig
│ ├── Google
│ │ ├── GoogleOauthAuthorizationController.php
│ │ ├── GoogleOauthCallbackController.php
│ │ ├── GoogleRoutes.php
│ │ └── oauth.twig
│ ├── LaraconEu
│ │ ├── LaraconEuRoutes.php
│ │ └── Online
│ │ ├── BulkPurchasesController.php
│ │ ├── bulk-purchases.twig
│ │ ├── CreatedTicketsController.php
│ │ ├── created-tickets.twig
│ │ ├── CreateTicketForm.php
│ │ ├── CreateTicketFromCsvForm.php
│ │ ├── CreateTicketsController.php
│ │ ├── CreateTicketsFromCsvController.php
│ │ ├── create-tickets-from-csv.twig
│ │ ├── create-tickets.twig
│ │ ├── DownloadCreatedTicketsCsv.php
│ │ ├── GenerateInvoiceForBulkOrderController.php
│ │ ├── generate-invoice-for-bulk-order.twig
│ │ ├── GenerateTicketsForBulkOrderController.php
│ │ ├── generate-tickets-for-bulk-order.twig
│ │ ├── HopinInvoicesController.php
│ │ ├── hopin-invoices.twig
│ │ ├── HopinRegistrationsController.php
│ │ ├── hopin-registrations.twig
│ │ ├── InvoiceRequestsController.php
│ │ ├── invoice-requests.twig
│ │ ├── RetryInvoiceCreationForHopinOrderController.php
│ │ ├── retry-invoice-creation-for-hopin-order-error.twig
│ │ ├── retry-invoice-creation-for-hopin-order.twig
│ │ ├── SendHopinInvoiceRequestEmailController.php
│ │ ├── send-hopin-invoice-request-form.twig
│ │ ├── SendTicketsFromCsvController.php
│ │ ├── send-tickets-from-csv.twig
│ │ ├── TriggerBulkPurchaseEmailSendController.php
│ │ └── trigger-bulk-purchase-email-send.twig
│ ├── Methods
│ │ ├── AllowCorsController.php
│ │ ├── OptionsController.php
│ │ └── OptionsMethod.php
│ ├── Moneybird
│ │ ├── MoneybirdOauthAuthorizationController.php
│ │ ├── MoneybirdOauthCallbackController.php
│ │ ├── MoneybirdRoutes.php
│ │ └── oauth.twig
│ ├── Pagination
│ │ ├── Page.php
│ │ ├── PaginationBuilder.php
│ │ └── Pagination.php
│ ├── Routes.php
│ ├── UserManagement
│ │ ├── AddUserController.php
│ │ ├── AddUserForm.twig
│ │ ├── CanManageUsers.php
│ │ ├── ChangePasswordController.php
│ │ ├── ChangePasswordForm.php
│ │ ├── change-password-form.twig
│ │ ├── LoginAsController.php
│ │ ├── ManageGlobalCapabilitiesController.php
│ │ ├── ManageGlobalCapabilitiesForm.twig
│ │ ├── UserListingController.php
│ │ ├── user-listing.twig
│ │ ├── UserManagementRoutes.php
│ │ ├── UsersOnly.php
│ │ ├── ViewUserController.php
│ │ └── view-user.twig
│ ├── WebBootstrap.php
│ └── Webhooks
│ ├── CertPlatformWebhookController.php
│ ├── CertPracticeExamWebhookController.php
│ ├── ForgeWebhookController.php
│ ├── FreshdeskWebhookController.php
│ ├── HopinWebhookController.php
│ ├── MailchimpWebhookController.php
│ ├── MoneybirdWebhookController.php
│ ├── PostmarkWebhookController.php
│ ├── ProctorExamWebhookController.php
│ ├── QuadernoWebhookController.php
│ ├── StripeWebhookController.php
│ ├── TitoWebhookController.php
│ ├── TypeformWebhookController.php
│ ├── WebhookListingController.php
│ ├── webhook-listing.twig
│ ├── WebhooksReceiveController.php
│ └── WebhooksRoutes.php
├── Webhooks
│ ├── ReceiveWebhook.php
│ ├── WebhookId.php
│ ├── WebhookListingProjection.php
│ ├── WebhooksBootstrap.php
│ └── WebhookWasReceived.php
└── WebTokens
├── CanNotFindWebTokenById.php
├── EntityId.php
├── EntityType.php
├── GenerateWebToken.php
├── NewWebTokenWasGenerated.php
├── WebTokenBootstrap.php
├── WebTokenId.php
├── WebTokenListing.php
├── WebTokenListingProjection.php
└── WebToken.php
120 directories, 932 files