Esempio n. 1
0
        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);
        }