public JournalRunResult Run(IDataContext db, TransactionTrigger transactionTrigger) { JournalRunResult result = new JournalRunResult(); if (transactionTrigger.ReportingEntityTransactionTrigger != null) { var resolvedPublic = transactionTrigger.Public; if (transactionTrigger.JournalTemplate.PublicRequirement != null) { if (transactionTrigger.JournalTemplate.PublicRequirement.IsServiceProvider) { resolvedPublic = transactionTrigger.ServiceProvider.Public; } if (transactionTrigger.JournalTemplate.PublicRequirement.IsAgent) { resolvedPublic = transactionTrigger.Agent.Public; } } Journal journal = BuildJournal(db, transactionTrigger, resolvedPublic, transactionTrigger.ServiceProvider, transactionTrigger.Agent, 1); _journalPoster.Run(db, journal); result.Journals.Add(journal); } if (transactionTrigger.AgentTransactionTrigger != null) { var resolvedPublic = transactionTrigger.AgentTransactionTrigger.Agent.Public; Journal journal = BuildJournal(db, transactionTrigger, resolvedPublic, transactionTrigger.ServiceProvider, transactionTrigger.AgentTransactionTrigger.Agent, 1); _journalPoster.Run(db, journal); result.Journals.Add(journal); } if (transactionTrigger.PolicyTransactionTrigger != null) { var policyTransactionTrigger = (transactionTrigger.PolicyTransactionTrigger); if (transactionTrigger.JournalTemplate.PublicRequirement != null) { if (transactionTrigger.JournalTemplate.PublicRequirement.IsPolicyHolder) { decimal totalPerc = 0; foreach (var policyHolder in policyTransactionTrigger.Policy.PolicyHolders) { if (policyHolder.BillingPercent.HasValue) { if (policyHolder.BillingPercent.Value != 0) { Journal journal = BuildJournal(db, transactionTrigger, policyHolder.Public, null, null, policyHolder.BillingPercent.Value); _journalPoster.Run(db, journal); result.Journals.Add(journal); } totalPerc += policyHolder.BillingPercent.Value; } } if (totalPerc != 1) { throw new Exception("Policy holder split does not add up to 100%"); } } if (transactionTrigger.JournalTemplate.PublicRequirement.IsServiceProvider) { decimal totalPerc = 0; foreach (var sp in policyTransactionTrigger.Policy.ServiceProviders.Where(x => x.ServiceProviderTypeID == transactionTrigger.JournalTemplate.ServiceProviderTypeID)) { if (sp.Percentage != 0) { Journal journal = BuildJournal(db, transactionTrigger, sp.ServiceProvider.Public, sp.ServiceProvider, null, sp.Percentage); _journalPoster.Run(db, journal); result.Journals.Add(journal); } totalPerc += sp.Percentage; } if ((totalPerc != 1) && (totalPerc != 0)) { throw new Exception("Service Provider split does not add up to 100%"); } } if (transactionTrigger.JournalTemplate.PublicRequirement.IsAgent) { decimal totalPerc = 0; foreach (var agent in policyTransactionTrigger.Policy.Agents.Where(x => x.AgentTypeID == transactionTrigger.JournalTemplate.AgentTypeID)) { if (agent.Percentage != 0) { Journal journal = BuildJournal(db, transactionTrigger, agent.Agent.Public, null, agent.Agent, agent.Percentage); _journalPoster.Run(db, journal); result.Journals.Add(journal); } totalPerc += agent.Percentage; } if ((totalPerc != 1) && (totalPerc != 0)) { throw new Exception("Agent split does not add up to 100%"); } } } else { Journal journal = BuildJournal(db, transactionTrigger, transactionTrigger.Public, transactionTrigger.ServiceProvider, transactionTrigger.Agent, 1); _journalPoster.Run(db, journal); result.Journals.Add(journal); } } IncrementTrigger(db, transactionTrigger); return(result); }