コード例 #1
0
        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);
        }
コード例 #2
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);
        }