Exemplo n.º 1
0
        public void PaymentEdit_AllocateUnearned_NoLinkToOriginalPrepayment()
        {
            Patient pat = PatientT.CreatePatient(MethodBase.GetCurrentMethod().Name);
            //create prepayment of $100
            long   provNum = ProviderT.CreateProvider("SG");
            Clinic clinic1 = ClinicT.CreateClinic("Clinic1");
            //create original prepayment.
            PaySplit prePay = PaySplitT.CreatePrepayment(pat.PatNum, 100, DateTime.Today.AddDays(-1), provNum, clinic1.ClinicNum);
            //complete a procedure
            Procedure proc1 = ProcedureT.CreateProcedure(pat, "D1110", ProcStat.C, "", 50, provNum: provNum);

            //Manually allocate prepayment without linking to the original prepayment.
            //We want to do it manually so we don't link this to the orginal prepayment correctly.
            //Not linking correctly will test that the AllocateUnearned method is implicitly linking prepayments correctly.
            PaySplitT.CreatePaySplitsForPrepayment(proc1, 50, prov: provNum, clinic: clinic1);
            //Create new procedure
            Procedure proc2 = ProcedureT.CreateProcedure(pat, "D1110", ProcStat.C, "", 100, provNum: provNum);
            //test the PaymentEdit.AllocateUnearned() method.
            Family          fam = Patients.GetFamily(pat.PatNum);
            List <PaySplit> listFamPrePaySplits = PaySplits.GetPrepayForFam(fam);
            //Should be $100
            double unearnedAmt = (double)PaySplits.GetUnearnedForFam(fam, listFamPrePaySplits);

            Assert.AreEqual(100, unearnedAmt);
            List <PaySplit> listPaySplitsUnearned = new List <PaySplit>();
            Payment         pay = PaymentT.MakePaymentForPrepayment(pat, clinic1);
            List <PaySplits.PaySplitAssociated> retVal = PaymentEdit.AllocateUnearned(new List <Procedure> {
                proc2
            }, ref listPaySplitsUnearned, pay, unearnedAmt, fam);

            Assert.AreEqual(2, retVal.Count);
            //After running the AllocateUnearned, we should implicitly link the incorrect prepayment made when we call CreatePaySplitsForPrepayment above.
            Assert.AreEqual(-50, listPaySplitsUnearned.Where(x => x.UnearnedType != 0).Sum(x => x.SplitAmt));
        }
Exemplo n.º 2
0
        ///<summary>Transfers unallocated to unearned (if present) and inserts those results into the database. Then performs transfer.
        ///This is the best representation of what the income transfer window currently does.</summary>
        public static PaymentEdit.IncomeTransferData BalanceAndIncomeTransfer(long patNum, Family fam, Payment regularTransferPayment
                                                                              , List <PayPlanCharge> payPlanCharges = null)
        {
            //get all paysplits associated to the family passed in
            List <PaySplit> listSplitsForPat = PaySplits.GetForPats(fam.ListPats.Select(x => x.PatNum).ToList());
            //perform unallocated transfer
            Payment unallocatedTransfer = MakePaymentNoSplits(patNum, 0, payDate: DateTime.Today);

            PaymentEdit.IncomeTransferData unallocatedResults = PaymentEdit.TransferUnallocatedSplitToUnearned(listSplitsForPat, unallocatedTransfer.PayNum);
            foreach (PaySplit split in unallocatedResults.ListSplitsCur)
            {
                if (split.SplitAmt.IsZero())
                {
                    continue;
                }
                PaySplits.Insert(split);
            }
            foreach (PaySplits.PaySplitAssociated splitAssociated in unallocatedResults.ListSplitsAssociated)
            {
                if (splitAssociated.PaySplitOrig != null && splitAssociated.PaySplitLinked != null)
                {
                    PaySplits.UpdateFSplitNum(splitAssociated.PaySplitOrig.SplitNum, splitAssociated.PaySplitLinked.SplitNum);
                }
            }
            if (payPlanCharges == null)
            {
                payPlanCharges = new List <PayPlanCharge>();
            }
            #region claim fix and transfer
            //both of these methods have objects that get immediately inserted into the database. While testing, a spcific call wil need to be made to delete.
            ClaimProcs.FixClaimsNoProcedures(fam.ListPats.Select(x => x.PatNum).ToList());             //make dummy procedures and claimprocs for claims missing procs.
            ClaimProcs.TransferClaimsAsTotalToProcedures(fam.ListPats.Select(x => x.PatNum).ToList()); //transfer AsTotals into claim procedures
            #endregion
            return(IncomeTransfer(patNum, fam, regularTransferPayment, payPlanCharges));
        }
Exemplo n.º 3
0
        public static Payment MakePayment(long patNum, double payAmt, DateTime payDate, long payPlanNum = 0, long provNum = 0, long procNum = 0, long payType = 0,
                                          long clinicNum = 0, long unearnedType = 0, bool isRecurringCharge = false, DateTime recurringChargeDate             = default(DateTime), string externalId = ""
                                          , long adjNum  = 0)
        {
            Payment payment = new Payment();

            payment.PatNum              = patNum;
            payment.PayDate             = payDate;
            payment.PayAmt              = payAmt;
            payment.PayType             = payType;
            payment.ClinicNum           = clinicNum;
            payment.DateEntry           = payDate;
            payment.IsRecurringCC       = isRecurringCharge;
            payment.RecurringChargeDate = recurringChargeDate;
            payment.ExternalId          = externalId;
            Payments.Insert(payment);
            PaySplit split = new PaySplit();

            split.PayNum       = payment.PayNum;
            split.PatNum       = payment.PatNum;
            split.DatePay      = payDate;
            split.ClinicNum    = payment.ClinicNum;
            split.PayPlanNum   = payPlanNum;
            split.AdjNum       = adjNum;
            split.ProvNum      = provNum;
            split.ProcNum      = procNum;
            split.SplitAmt     = payAmt;
            split.DateEntry    = payDate;
            split.UnearnedType = unearnedType;
            PaySplits.Insert(split);
            return(payment);
        }
Exemplo n.º 4
0
        public static Payment MakePayment(long patNum, double payAmt, DateTime payDate, long payPlanNum = 0, long provNum = 0, long procNum = 0, long payType = 0,
                                          long clinicNum = 0, long unearnedType = 0)
        {
            Payment payment = new Payment();

            payment.PatNum    = patNum;
            payment.PayDate   = payDate;
            payment.PayAmt    = payAmt;
            payment.PayType   = payType;
            payment.ClinicNum = clinicNum;
            payment.DateEntry = payDate;
            Payments.Insert(payment);
            PaySplit split = new PaySplit();

            split.PayNum       = payment.PayNum;
            split.PatNum       = payment.PatNum;
            split.DatePay      = payDate;
            split.ClinicNum    = payment.ClinicNum;
            split.PayPlanNum   = payPlanNum;
            split.ProvNum      = provNum;
            split.ProcNum      = procNum;
            split.SplitAmt     = payAmt;
            split.DateEntry    = payDate;
            split.UnearnedType = unearnedType;
            PaySplits.Insert(split);
            return(payment);
        }
Exemplo n.º 5
0
        private void ResetPrepayments(Patient pat)
        {
            Family fam = Patients.GetFamily(pat.PatNum);

            _listFamPrePaySplits = PaySplits.GetPrepayForFam(fam);
            _listPosPrePay       = _listFamPrePaySplits.FindAll(x => x.SplitAmt.IsGreaterThan(0));
            _listNegPrePay       = _listFamPrePaySplits.FindAll(x => x.SplitAmt.IsLessThan(0));
        }
Exemplo n.º 6
0
 private void UpdatePaySplitHelper(PaySplit ps, long patNum, long provNum, long clinicNum, long payNum)
 {
     if (payNum != 0 && payNum == ps.PayNum)
     {
         ps.PatNum    = patNum;
         ps.ProvNum   = provNum;
         ps.ClinicNum = clinicNum;
         PaySplits.Update(ps);
     }
 }
Exemplo n.º 7
0
        public void PaymentEdit_AllocateUnearned_LinkToOriginalPrepayment()
        {
            Patient pat = PatientT.CreatePatient(MethodBase.GetCurrentMethod().Name);
            //create prepayment of $100
            long   provNum = ProviderT.CreateProvider("SG");
            Clinic clinic1 = ClinicT.CreateClinic("Clinic1");
            Family fam     = Patients.GetFamily(pat.PatNum);
            //create original prepayment.
            PaySplit prePay = PaySplitT.CreatePrepayment(pat.PatNum, 100, DateTime.Today.AddDays(-1), provNum, clinic1.ClinicNum);
            //complete a procedure
            Procedure proc1 = ProcedureT.CreateProcedure(pat, "D1110", ProcStat.C, "", 50, provNum: provNum);
            //Setup to run the PaymentEdit.AllocateUnearned
            List <PaySplit> listPaySplits       = new List <PaySplit>();
            List <PaySplit> listFamPrePaySplits = PaySplits.GetPrepayForFam(fam);
            //Unearned amount should be $100.
            double unearnedAmt = (double)PaySplits.GetUnearnedForFam(fam, listFamPrePaySplits);

            Assert.AreEqual(100, unearnedAmt);
            //Create the payment we will use to allocate some of the $100 prepayment.
            Payment pay = PaymentT.MakePaymentForPrepayment(pat, clinic1);
            //Run the AllocateUnearned method. This a list of paysplitAssociated.
            //The ref list of paysplits should also have the new paysplits that are associated to the original prepayment.
            List <PaySplits.PaySplitAssociated> listPaySplitAssociated = PaymentEdit.AllocateUnearned(new List <Procedure> {
                proc1
            }, ref listPaySplits, pay, unearnedAmt, fam);

            //Insert the paysplits and link the prepayment paysplits. This is similar to what is done when a user creates a payment from FormPayment.cs.
            PaySplitT.InsertPrepaymentSplits(listPaySplits, listPaySplitAssociated);
            //The ref list of paysplits should have the correct allocated prepayment amount.
            Assert.AreEqual(-50, listPaySplits.Where(x => x.UnearnedType != 0).Sum(x => x.SplitAmt));
            //Create new procedure
            Procedure proc2 = ProcedureT.CreateProcedure(pat, "D1110", ProcStat.C, "", 100, provNum: provNum);

            //Now do what we just did again for a new procedure. The unallocated amount should be $50.
            listFamPrePaySplits = PaySplits.GetPrepayForFam(fam);
            unearnedAmt         = (double)PaySplits.GetUnearnedForFam(fam, listFamPrePaySplits);
            Assert.AreEqual(50, unearnedAmt);
            List <PaySplit> listPaySplitsUnearned = new List <PaySplit>();

            pay = PaymentT.MakePaymentForPrepayment(pat, clinic1);
            List <PaySplits.PaySplitAssociated> retVal = PaymentEdit.AllocateUnearned(new List <Procedure> {
                proc2
            }, ref listPaySplitsUnearned, pay, unearnedAmt, fam);

            Assert.AreEqual(2, retVal.Count);
            Assert.AreEqual(-50, listPaySplitsUnearned.Where(x => x.UnearnedType != 0).Sum(x => x.SplitAmt));
        }
Exemplo n.º 8
0
 public static void InsertPrepaymentSplits(List <PaySplit> listPaysplits, List <PaySplits.PaySplitAssociated> listPaySplitsAssociated)
 {
     //Insert paysplits
     foreach (PaySplit ps in listPaysplits)
     {
         PaySplits.Insert(ps);
     }
     //Associate prepayments
     foreach (PaySplits.PaySplitAssociated split in listPaySplitsAssociated)
     {
         //Update the FSplitNum after inserts are made.
         if (split.PaySplitLinked != null && split.PaySplitOrig != null)
         {
             PaySplits.UpdateFSplitNum(split.PaySplitOrig.SplitNum, split.PaySplitLinked.SplitNum);
         }
     }
 }
Exemplo n.º 9
0
        public static List <PaySplit> CreatePaySplitsForPrepayment(Procedure proc, double amtToUse, PaySplit prePaySplit = null, Clinic clinic = null, long prov = 0)
        {
            List <PaySplit> retVal    = new List <PaySplit>();
            long            clinicNum = prePaySplit?.ClinicNum ?? clinic?.ClinicNum ?? proc.ClinicNum;
            long            provNum   = prePaySplit?.ProvNum ?? prov;

            if (clinic != null)
            {
                clinicNum = clinic.ClinicNum;
            }
            if (prov != 0)
            {
                provNum = prov;
            }
            Def      unearnedType = Defs.GetDefByExactName(DefCat.PaySplitUnearnedType, "PrePayment") ?? DefinitionT.CreateDefinition(DefCat.PaySplitUnearnedType, "PrePayment");
            Def      payType      = Defs.GetDefByExactName(DefCat.PaymentTypes, "Check") ?? DefinitionT.CreateDefinition(DefCat.PaymentTypes, "Check");
            Payment  pay          = PaymentT.MakePaymentNoSplits(proc.PatNum, amtToUse, payDate: DateTime.Now, clinicNum: clinicNum, payType: unearnedType.DefNum);
            PaySplit splitNeg     = new PaySplit();

            splitNeg.PatNum       = prePaySplit?.PatNum ?? proc.PatNum;
            splitNeg.PayNum       = pay.PayNum;
            splitNeg.FSplitNum    = prePaySplit?.SplitNum ?? 0;
            splitNeg.ClinicNum    = clinicNum;
            splitNeg.ProvNum      = provNum;
            splitNeg.SplitAmt     = 0 - amtToUse;
            splitNeg.UnearnedType = prePaySplit?.UnearnedType ?? unearnedType.DefNum;
            splitNeg.DatePay      = DateTime.Now;
            PaySplits.Insert(splitNeg);
            retVal.Add(splitNeg);
            //Make a different paysplit attached to proc and prov they want to use it for.
            PaySplit splitPos = new PaySplit();

            splitPos.PatNum    = prePaySplit?.PatNum ?? proc.PatNum;
            splitPos.PayNum    = pay.PayNum;
            splitPos.FSplitNum = splitNeg.SplitNum;
            splitPos.ProvNum   = provNum;
            splitPos.ClinicNum = clinicNum;
            splitPos.SplitAmt  = amtToUse;
            splitPos.DatePay   = DateTime.Now;
            splitPos.ProcNum   = proc.ProcNum;
            PaySplits.Insert(splitPos);
            retVal.Add(splitPos);
            return(retVal);
        }
Exemplo n.º 10
0
        public static PaySplit CreateSplit(long clinicNum, long patNum, long payNum, long payplanNum, DateTime procDate, long procNum, long provNum
                                           , double splitAmt, long unearnedType)
        {
            PaySplit paysplit = new PaySplit()
            {
                ClinicNum    = clinicNum,
                PatNum       = patNum,
                PayNum       = payNum,
                PayPlanNum   = payplanNum,
                ProcDate     = procDate,
                ProcNum      = procNum,
                ProvNum      = provNum,
                SplitAmt     = splitAmt,
                UnearnedType = unearnedType
            };

            PaySplits.Insert(paysplit);
            return(paysplit);
        }
Exemplo n.º 11
0
        public static PaySplit CreatePrepayment(long patNum, int amt, DateTime datePay, long provNum = 0, long clinicNum = 0)
        {
            Def      unearnedType = Defs.GetDefByExactName(DefCat.PaySplitUnearnedType, "PrePayment") ?? DefinitionT.CreateDefinition(DefCat.PaySplitUnearnedType, "PrePayment");
            Def      payType      = Defs.GetDefByExactName(DefCat.PaymentTypes, "Check") ?? DefinitionT.CreateDefinition(DefCat.PaymentTypes, "Check");
            Payment  pay          = PaymentT.MakePaymentNoSplits(patNum, amt, datePay, clinicNum: clinicNum, payType: payType.DefNum);
            PaySplit split        = new PaySplit();

            split.PayNum       = pay.PayNum;
            split.PatNum       = pay.PatNum;
            split.DatePay      = datePay;
            split.ClinicNum    = pay.ClinicNum;
            split.PayPlanNum   = 0;
            split.ProvNum      = provNum;
            split.ProcNum      = 0;
            split.SplitAmt     = amt;
            split.DateEntry    = datePay;
            split.UnearnedType = unearnedType.DefNum;
            PaySplits.Insert(split);
            return(split);
        }
Exemplo n.º 12
0
        ///<summary>Use when creating a TP prepayment or a hidden prepayment split (that does not necessariliy need to have a proc) </summary>
        public static PaySplit CreateTpPrepayment(long patNum, int amt, DateTime datePay, long provNum = 0, long clinicNum = 0, long procNum = 0, bool isHidden = false)
        {
            Def      unearnedType = Defs.GetDefsForCategory(DefCat.PaySplitUnearnedType).First(x => isHidden?x.ItemValue != "":x.ItemValue == "");
            Def      payType      = Defs.GetDefByExactName(DefCat.PaymentTypes, "Check") ?? DefT.CreateDefinition(DefCat.PaymentTypes, "Check");
            Payment  pay          = PaymentT.MakePaymentNoSplits(patNum, amt, datePay, clinicNum: clinicNum, payType: payType.DefNum);
            PaySplit split        = new PaySplit();

            split.PayNum       = pay.PayNum;
            split.PatNum       = pay.PatNum;
            split.DatePay      = datePay;
            split.ClinicNum    = pay.ClinicNum;
            split.PayPlanNum   = 0;
            split.ProvNum      = provNum;
            split.ProcNum      = procNum;
            split.SplitAmt     = amt;
            split.DateEntry    = datePay;
            split.UnearnedType = unearnedType.DefNum;
            PaySplits.Insert(split);
            return(split);
        }
Exemplo n.º 13
0
        public void PaymentEdit_ImplicitlyLinkPrepaymentsHelper()
        {
            Patient pat       = PatientT.CreatePatient(MethodBase.GetCurrentMethod().Name);
            Patient patFam    = PatientT.CreatePatient(MethodBase.GetCurrentMethod().Name);
            Patient patFamOld = patFam.Copy();

            patFam.Guarantor = pat.PatNum;
            Patients.Update(patFam, patFamOld);
            //create prepayment of $100
            long   provNum = ProviderT.CreateProvider("SG");
            Clinic clinic1 = ClinicT.CreateClinic("Clinic1");
            //create original prepayment.
            PaySplit prePay = PaySplitT.CreatePrepayment(pat.PatNum, 100, DateTime.Today.AddDays(-1), provNum, clinic1.ClinicNum);
            //complete a procedure
            Procedure proc1 = ProcedureT.CreateProcedure(pat, "D1110", ProcStat.C, "", 50, provNum: provNum);
            //Manually allocate prepayment without linking to the original prepayment.
            List <PaySplit> listPaySplits = PaySplitT.CreatePaySplitsForPrepayment(proc1, 50, prov: provNum, clinic: clinic1);

            ResetPrepayments(pat);
            long nonMatch = 100000;
            //test the PaymentEdit.AllocateUnearned() method.
            double unearnedAmt = (double)PaySplits.GetUnearnedForFam(Patients.GetFamily(pat.PatNum), _listFamPrePaySplits);
            //Logic check PatNum - match, ProvNum - match, ClinicNum - match
            double retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumMatch: true, isClinicNumMatch: true);

            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - match, ClinicNum - zero
            ResetPrepayments(pat);
            //update the clinicnum to 0
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, provNum, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumMatch: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //previous Test one should be $100
            ResetPrepayments(pat);
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumMatch: true, isClinicNumMatch: true);
            Assert.AreEqual(100, retVal);
            //Logic check PatNum - match, ProvNum - match, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, provNum, 100000, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumMatch: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - zero, ClinicNum - match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, 0, clinic1.ClinicNum, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumZero: true, isClinicNumMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - zero, ClinicNum - zero
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, 0, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumZero: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - zero, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, 0, nonMatch, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumZero: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - non zero & non match, ClinicNum - match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, nonMatch, clinic1.ClinicNum, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNonZeroNonMatch: true, isClinicNumMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - non zero & non match, ClinicNum - zero
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, nonMatch, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNonZeroNonMatch: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - match, ProvNum - non zero & non match, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, pat.PatNum, nonMatch, nonMatch, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNonZeroNonMatch: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - match, ClinicNum - match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, provNum, clinic1.ClinicNum, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumMatch: true, isClinicNumMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - match, ClinicNum - zero
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, provNum, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumMatch: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - match, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, provNum, nonMatch, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumMatch: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - zero, ClinicNum - match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, 0, clinic1.ClinicNum, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumZero: true, isClinicNumMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - zero, ClinicNum - zero
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, 0, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumZero: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //Logic checkPatNum - other family members, ProvNum - zero, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, 0, nonMatch, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNumZero: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
            //Old test from above
            ResetPrepayments(pat);
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isPatMatch: true, isProvNumMatch: true, isClinicNumMatch: true);
            Assert.AreEqual(100, retVal);
            //Logic checkPatNum - other family members, ProvNum - non zero & non match, ClinicNum - match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, nonMatch, clinic1.ClinicNum, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNonZeroNonMatch: true, isClinicNumMatch: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - non zero & non match, ClinicNum - zero
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, nonMatch, 0, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNonZeroNonMatch: true, isClinicNumZero: true);
            Assert.AreEqual(50, retVal);
            //Logic check PatNum - other family members, ProvNum - non zero & non match, ClinicNum - non zero & non match
            ResetPrepayments(pat);
            _listFamPrePaySplits.ForEach(x => UpdatePaySplitHelper(x, patFam.PatNum, nonMatch, nonMatch, _listNegPrePay.First().PayNum));
            retVal = PaymentEdit.ImplicitlyLinkPrepaymentsHelper(_listPosPrePay, _listNegPrePay, unearnedAmt, isFamMatch: true, isProvNonZeroNonMatch: true, isClinicNonZeroNonMatch: true);
            Assert.AreEqual(50, retVal);
        }
Exemplo n.º 14
0
        public void PaymentEdit_AutoSplitForPayment_NoNegativeAutoSplits()
        {
            long      provNumA = ProviderT.CreateProvider("provA");
            Patient   pat      = PatientT.CreatePatient(MethodBase.GetCurrentMethod().Name);
            Procedure proc1    = ProcedureT.CreateProcedure(pat, "D0120", ProcStat.C, "", 70);
            Procedure proc2    = ProcedureT.CreateProcedure(pat, "D0150", ProcStat.C, "", 20);
            //make an overpayment for one of the procedures so it spills over.
            DateTime payDate = DateTime.Today;
            Payment  pay     = PaymentT.MakePayment(pat.PatNum, 71, payDate, procNum: proc1.ProcNum); //pre-existing payment
            //attempt to make another payment. Auto splits should not suggest a negative split.
            Payment newPayment = PaymentT.MakePaymentNoSplits(pat.PatNum, 2, payDate, isNew: true,
                                                              payType: Defs.GetDefsForCategory(DefCat.PaymentTypes, true)[0].DefNum);//current payment we're trying to make

            PaymentEdit.LoadData loadData = PaymentEdit.GetLoadData(pat, newPayment, new List <long>()
            {
                pat.PatNum
            }, true, false);
            PaymentEdit.ConstructChargesData chargeData = PaymentEdit.GetConstructChargesData(new List <long> {
                pat.PatNum
            }, pat.PatNum,
                                                                                              PaySplits.GetForPayment(pay.PayNum), pay.PayNum, false);
            PaymentEdit.ConstructResults constructResults = PaymentEdit.ConstructAndLinkChargeCredits(new List <long> {
                pat.PatNum
            }, pat.PatNum
                                                                                                      , chargeData.ListPaySplits, newPayment, new List <Procedure> ());
            PaymentEdit.AutoSplit autoSplits = PaymentEdit.AutoSplitForPayment(constructResults);
            Assert.AreEqual(0, autoSplits.ListAutoSplits.FindAll(x => x.SplitAmt < 0).Count);        //assert no negative auto splits were made.
            Assert.AreEqual(0, autoSplits.ListSplitsCur.FindAll(x => x.SplitAmt < 0).Count);         //auto splits not catching everything
        }
Exemplo n.º 15
0
        ///<summary>Most of the logic for breaking an appointment. Pass in the brokenFee (the number the user enters in the brokenAppointment window),
        ///Optionally pass in if the brokenappointment procedure is being deleted. Returns the broken procedure that was created.</summary>
        public static Procedure BreakAppointment(Appointment appt, Patient pat, ProcedureCode procCode, double feeOverride, bool isDeleteBrokenProc = false)
        {
            //suppressHistory is true due to below logic creating a log with a specific HistAppointmentAction instead of the generic changed.
            DateTime datePrevious    = appt.DateTStamp;
            bool     suppressHistory = false;

            if (procCode != null)
            {
                suppressHistory = procCode.ProcCode == "D9986" || procCode.ProcCode == "D9987";
            }
            Appointments.SetAptStatus(appt, ApptStatus.Broken, suppressHistory); //Appointments S-Class handles Signalods
            if (appt.AptStatus != ApptStatus.Complete)                           //seperate log entry for completed appointments.
            {
                SecurityLogs.MakeLogEntry(Permissions.AppointmentEdit, pat.PatNum,
                                          appt.ProcDescript + ", " + appt.AptDateTime.ToString()
                                          + ", Broken from the Appts module.", appt.AptNum, datePrevious);
            }
            else
            {
                SecurityLogs.MakeLogEntry(Permissions.AppointmentCompleteEdit, pat.PatNum,
                                          appt.ProcDescript + ", " + appt.AptDateTime.ToString()
                                          + ", Broken from the Appts module.", appt.AptNum, datePrevious);
            }
            List <Procedure> listProcedures = Procedures.GetProcsForSingle(appt.AptNum, false);
            //splits should only exist on procs if they are using tp pre-payments
            List <PaySplit> listSplitsForApptProcs = new List <PaySplit>();
            bool            isNonRefundable        = false;
            double          brokenProcAmount       = 0;

            if (listProcedures.Count > 0)
            {
                listSplitsForApptProcs = PaySplits.GetPaySplitsFromProcs(listProcedures.Select(x => x.ProcNum).ToList());
            }
            Procedure brokenProcedure = new Procedure();

            #region Charting the proc
            if (procCode != null)
            {
                switch (procCode.ProcCode)
                {
                case "D9986":                        //Missed
                    HistAppointments.CreateHistoryEntry(appt.AptNum, HistAppointmentAction.Missed);
                    break;

                case "D9987":                        //Cancelled
                    HistAppointments.CreateHistoryEntry(appt.AptNum, HistAppointmentAction.Cancelled);
                    break;
                }
                brokenProcedure.PatNum       = pat.PatNum;
                brokenProcedure.ProvNum      = (procCode.ProvNumDefault > 0 ? procCode.ProvNumDefault : appt.ProvNum);
                brokenProcedure.CodeNum      = procCode.CodeNum;
                brokenProcedure.ProcDate     = DateTime.Today;
                brokenProcedure.DateEntryC   = DateTime.Now;
                brokenProcedure.ProcStatus   = ProcStat.C;
                brokenProcedure.ClinicNum    = appt.ClinicNum;
                brokenProcedure.UserNum      = Security.CurUser.UserNum;
                brokenProcedure.Note         = Lans.g("AppointmentEdit", "Appt BROKEN for") + " " + appt.ProcDescript + "  " + appt.AptDateTime.ToString();
                brokenProcedure.PlaceService = (PlaceOfService)PrefC.GetInt(PrefName.DefaultProcedurePlaceService);              //Default proc place of service for the Practice is used.
                List <InsSub>  listInsSubs    = InsSubs.RefreshForFam(Patients.GetFamily(pat.PatNum));
                List <InsPlan> listInsPlans   = InsPlans.RefreshForSubList(listInsSubs);
                List <PatPlan> listPatPlans   = PatPlans.Refresh(pat.PatNum);
                InsPlan        insPlanPrimary = null;
                InsSub         insSubPrimary  = null;
                if (listPatPlans.Count > 0)
                {
                    insSubPrimary  = InsSubs.GetSub(listPatPlans[0].InsSubNum, listInsSubs);
                    insPlanPrimary = InsPlans.GetPlan(insSubPrimary.PlanNum, listInsPlans);
                }
                double procFee;
                long   feeSch;
                if (insPlanPrimary == null || procCode.NoBillIns)
                {
                    feeSch = FeeScheds.GetFeeSched(0, pat.FeeSched, brokenProcedure.ProvNum);
                }
                else                  //Only take into account the patient's insurance fee schedule if the D9986 procedure is not marked as NoBillIns
                {
                    feeSch = FeeScheds.GetFeeSched(insPlanPrimary.FeeSched, pat.FeeSched, brokenProcedure.ProvNum);
                }
                procFee = Fees.GetAmount0(brokenProcedure.CodeNum, feeSch, brokenProcedure.ClinicNum, brokenProcedure.ProvNum);
                if (insPlanPrimary != null && insPlanPrimary.PlanType == "p" && !insPlanPrimary.IsMedical)         //PPO
                {
                    double provFee = Fees.GetAmount0(brokenProcedure.CodeNum, Providers.GetProv(brokenProcedure.ProvNum).FeeSched, brokenProcedure.ClinicNum,
                                                     brokenProcedure.ProvNum);
                    brokenProcedure.ProcFee = Math.Max(provFee, procFee);
                }
                else
                {
                    brokenProcedure.ProcFee = procFee;
                }
                if (!PrefC.GetBool(PrefName.EasyHidePublicHealth))
                {
                    brokenProcedure.SiteNum = pat.SiteNum;
                }
                Procedures.Insert(brokenProcedure);
                Procedure procOld = brokenProcedure.Copy();
                //Now make a claimproc if the patient has insurance.  We do this now for consistency because a claimproc could get created in the future.
                List <Benefit>   listBenefits          = Benefits.Refresh(listPatPlans, listInsSubs);
                List <ClaimProc> listClaimProcsForProc = ClaimProcs.RefreshForProc(brokenProcedure.ProcNum);
                Procedures.ComputeEstimates(brokenProcedure, pat.PatNum, listClaimProcsForProc, false, listInsPlans, listPatPlans, listBenefits, pat.Age, listInsSubs);
                if (listSplitsForApptProcs.Count > 0 && PrefC.GetBool(PrefName.TpPrePayIsNonRefundable) && procCode.ProcCode == "D9986")
                {
                    //if there are pre-payments, non-refundable pre-payments is turned on, and the broken appointment is a missed code then auto-fill
                    //the window with the sum of the procs for the appointment. Transfer money below after broken procedure is confirmed by the user.
                    //normally goes to the form to let the user speficy, this is the auto filled amount for the form.
                    brokenProcedure.ProcFee = feeOverride;                  //listSplitsForApptProcs.Sum(x => x.SplitAmt);
                    isNonRefundable         = true;
                }
                if (isDeleteBrokenProc)
                {
                    brokenProcedure.ProcStatus = ProcStat.D;
                }
                brokenProcedure.ProcFee = feeOverride;
                brokenProcAmount        = feeOverride;
                Procedures.Update(brokenProcedure, procOld);
            }
            #endregion
            //Note this MUST come after FormProcBroken since clicking cancel in that window will delete the procedure.
            if (isNonRefundable && !isDeleteBrokenProc && listSplitsForApptProcs.Count > 0)
            {
                //transfer what the user specified in the broken appointment window.
                //transfer up to the amount specified by the user
                foreach (Procedure proc in listProcedures)
                {
                    if (brokenProcAmount == 0)
                    {
                        break;
                    }
                    List <PaySplit> listSplitsForAppointmentProcedure = listSplitsForApptProcs.FindAll(x => x.ProcNum == proc.ProcNum);
                    foreach (PaySplit split in listSplitsForAppointmentProcedure)
                    {
                        if (brokenProcAmount == 0)
                        {
                            break;
                        }
                        double amt = Math.Min(brokenProcAmount, split.SplitAmt);
                        Payments.CreateTransferForTpProcs(proc, new List <PaySplit> {
                            split
                        }, brokenProcedure, amt);
                        brokenProcAmount -= amt;
                    }
                }
            }
            return(brokenProcedure);
        }