/// <summary>
        /// Clones an adjustment, useful when adding a reversing entry
        /// </summary>
        /// <returns>Your cloned object</returns>
        public MLFSDebtorAdjustment Clone()
        {
            MLFSDebtorAdjustment adj = new MLFSDebtorAdjustment
            {
                Amount            = Amount,
                Debtor            = Debtor,
                DebtorId          = DebtorId,
                IsVariance        = IsVariance,
                NotTakenUp        = NotTakenUp,
                ReportingPeriod   = ReportingPeriod,
                ReportingPeriodId = ReportingPeriodId
            };

            return(adj);
        }
        /// <summary>
        /// "writes off" anyoutstanding balance as a variance
        /// </summary>
        public MLFSDebtorAdjustment ClearToVariance(MLFSReportingPeriod period)
        {
            MLFSDebtorAdjustment variance = new MLFSDebtorAdjustment()
            {
                ReportingPeriodId = period.Id,
                ReportingPeriod   = period,
                Debtor            = this,
                DebtorId          = (int)Id,
                Amount            = Outstanding * -1,
                IsVariance        = true,
                NotTakenUp        = false
            };

            Adjustments.Add(variance);
            return(variance);
        }
        /// <summary>
        /// Creates an NTU adjustment to reverse out a debtor when the transaction never happens
        /// </summary>
        /// <param name="period">the period in which the plan is marked as NTU</param>
        /// <returns></returns>
        public MLFSDebtorAdjustment CreateNTU(MLFSReportingPeriod period)
        {
            MLFSDebtorAdjustment adj = new MLFSDebtorAdjustment
            {
                DebtorId          = (int)Id,
                Amount            = GrossAmount * -1,
                Debtor            = this,
                IsVariance        = false,
                NotTakenUp        = true,
                ReportingPeriod   = period,
                ReportingPeriodId = period.Id
            };

            Adjustments.Add(adj);
            return(adj);
        }
        /// <summary>
        /// Runs through a a bathc of receipts and compares it to the debtors using IORefernece and adds a receipt entry where a match is found
        /// </summary>
        /// <param name="debtors">The current debtors</param>
        /// <param name="receipts">The batch of receipts</param>
        /// <returns>A list of the adjustments (receipts) to be added</returns>
        public static List <MLFSDebtorAdjustment> CheckForReceipts(List <MLFSSale> debtors, List <MLFSIncome> receipts)
        {
            receipts = receipts.Where(x => x.IsNewBusiness && x.Amount != 0).ToList();
            List <MLFSDebtorAdjustment> adjs = new List <MLFSDebtorAdjustment>();

            for (int i = 0; i < debtors.Count; i++)
            {
                MLFSSale debtor = debtors[i];
                for (int j = 0; j < receipts.Count; j++)
                {
                    MLFSIncome receipt = receipts[j];
                    if (receipt.IOReference == debtor.IOReference || (receipt.IOReference == debtor.PlanReference && receipt.Amount == debtor.GrossAmount))
                    {
                        MLFSDebtorAdjustment adj = new MLFSDebtorAdjustment(debtor, receipt);
                        receipts.Remove(receipt);
                        debtor.Adjustments.Add(adj);
                        adjs.Add(adj);
                    }
                }
            }
            return(adjs);
        }