public JournalRunResult Run(IDataContext db, Journal journal) { JournalRunResult result = new JournalRunResult(); foreach (var journalTxn in journal.JournalTxns) { foreach (var posting in journalTxn.JournalTemplateTxn.Postings) { LedgerTxn ledgerTxn = new LedgerTxn(); ledgerTxn.LedgerAccount = posting.LedgerAccount; if ((posting.CoverageExpenseAccount) && (journalTxn.PolicyCoverage != null)) { ledgerTxn.LedgerAccount = ResolveCoverageExpenseAccount(journal.ReportingEntity, journalTxn.PolicyCoverage); } if ((posting.CoverageIncomeAccount) && (journalTxn.PolicyCoverage != null)) { ledgerTxn.LedgerAccount = ResolveCoverageIncomeAccount(journal.ReportingEntity, journalTxn.PolicyCoverage); } if (ledgerTxn.LedgerAccount == null) { throw new Exception("Ledger account not specified"); } ledgerTxn.TxnDate = journalTxn.TxnDate; //ledgerTxn.TransactionOrigin = journal.TransactionOrigin; ledgerTxn.ReportingEntityID = journal.ReportingEntityID; ledgerTxn.ReportingEntityBranch = journalTxn.ReportingEntityBranch; ledgerTxn.Agent = journalTxn.Agent; if (posting.InheritPolicy) { ledgerTxn.Policy = journalTxn.Policy; } if (posting.InheritPublic) { ledgerTxn.Public = journalTxn.Public; } int multiplier = 0; if (ledgerTxn.LedgerAccount.LedgerAccountType.CreditPositive) { if (posting.PostType == "C") { multiplier = 1; } else { multiplier = -1; } } else { if (posting.PostType == "D") { multiplier = 1; } else { multiplier = -1; } } decimal amount = 0; if (posting.AddBaseAmount) { amount += journalTxn.Amount; } ledgerTxn.Amount = (amount * multiplier); journalTxn.LedgerTxns.Add(ledgerTxn); } } return(result); }
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); }