コード例 #1
0
        public void SetTo(PayFx pfx)
        {
            pfx.Ir  = IIN_RATE / 100.0M;
            pfx.Ir2 = IIN_RATE2 / 100.0M;
            pfx.Sr  = SI_RATE / 100.0M;
            pfx.IM  = PayFx.GetIINMargin(DT1);

            pfx.IinEx =
                UNTAXED_MINIMUM +
                IINEX_DEPENDANTS +
                IINEX2 +
                IINEX_EXP;

            pfx.UsedIinEx = pfx.IinEx;

            pfx.HasProgressiveIIN = DT1 >= PayFx.ProgressiveIINStartDate;
            if (HAS_TAXDOC == null)
            {
                pfx.HasTaxDoc = pfx.IinEx > 0.0M;
            }
            else
            {
                pfx.HasTaxDoc = HAS_TAXDOC.Value;
            }

            pfx.Pay   = PAY_TAXED;
            pfx.PayNs = PAY_NOSAI;
            pfx.PayNt = PAY_NOTTAXED;

            pfx.DNS = DNSI;

            pfx.IIN  = IIN;
            pfx.Cash = CASH;
        }
コード例 #2
0
ファイル: PayFxA.cs プロジェクト: Camel-RD/Klons
        public void AddEqallyAndRound(PayFx2[] rows)
        {
            var p1 = new PayFx();

            p1.SetFrom(this);
            foreach (var pr in rows)
            {
                AddPayRound(pr);
                pr.DNS = RoundA(pr.Pay * pr.Sr);
            }
            CalcAllAndRound();
            var p2 = new PayFx();

            p2.SetFrom(this);
            p2.Subtract(p1);

            MakeExactSum(p2.DNS, rows, d => d.DNS, (d, dval) => d.DNS = dval);
            decimal fulliinbase = rows.Sum(pr => pr.Pay + pr.PayNs - pr.DNS);

            foreach (var pr in rows)
            {
                decimal iinbase = pr.Pay + pr.PayNs - pr.DNS;
                pr.UsedIinEx = RoundA(p2.UsedIinEx * iinbase / fulliinbase);
                pr.IIN       = RoundA(p2.IIN * iinbase / fulliinbase);
                pr.Cash      = iinbase + pr.PayNt - pr.IIN;
            }
            MakeExactSum(p2.Cash, rows, d => d.Cash, (d, dval) => d.Cash = dval);
            MakeExactSum(p2.UsedIinEx, rows, d => d.UsedIinEx, (d, dval) => d.UsedIinEx = dval);
            foreach (var pr in rows)
            {
                pr.IIN = pr.Pay + pr.PayNs + pr.PayNt - pr.DNS - pr.Cash;
            }
            Rows.AddRange(rows);
        }
コード例 #3
0
ファイル: PayFxA.cs プロジェクト: Camel-RD/Klons
        public void AddEqally(PayFx2[] rows)
        {
            var p1 = new PayFx();

            p1.SetFrom(this);
            decimal fulliinbase = 0.0M;

            foreach (var pr in rows)
            {
                AddPay(pr);
                pr.DNS       = pr.Pay * pr.Sr;
                fulliinbase += pr.Pay + pr.PayNs - pr.DNS;
            }
            CalcAll();
            var p2 = new PayFx();

            p2.SetFrom(this);
            p2.Subtract(p1);
            foreach (var pr in rows)
            {
                decimal iinbase = pr.Pay + pr.PayNs - pr.DNS;
                pr.UsedIinEx = p2.UsedIinEx * iinbase / fulliinbase;
                pr.IIN       = p2.IIN * iinbase / fulliinbase;
                pr.Cash      = iinbase + pr.PayNt - pr.IIN;
            }
            Rows.AddRange(rows);
        }
コード例 #4
0
        public void SetFrom(PayFx pfx)
        {
            PAY_TAXED    = pfx.Pay;
            PAY_NOSAI    = pfx.PayNs;
            PAY_NOTTAXED = pfx.PayNt;

            DNSI = pfx.DNS;

            decimal d1 =
                UNTAXED_MINIMUM +
                IINEX_DEPENDANTS +
                IINEX2 +
                IINEX_EXP;

            if (d1 > 0.0M)
            {
                decimal r = pfx.UsedIinEx / d1;
                UNTAXED_MINIMUM  *= r;
                IINEX_DEPENDANTS *= r;
                IINEX2           *= r;
                IINEX_EXP        *= r;
            }

            IIN  = pfx.IIN;
            CASH = pfx.Cash;

            HAS_TAXDOC = pfx.HasTaxDoc;
        }
コード例 #5
0
 public void AddPayRound(PayFx pfrom)
 {
     pfrom.Pay   = RoundA(pfrom.Pay);
     pfrom.PayNs = RoundA(pfrom.PayNs);
     pfrom.PayNt = RoundA(pfrom.PayNt);
     Pay        += pfrom.Pay;
     PayNs      += pfrom.PayNs;
     PayNt      += pfrom.PayNt;
 }
コード例 #6
0
        public static void SplitAndRound(PayFx rowt, PayFx[] rows)
        {
            var erows = rows.Where(d => d != null);

            decimal dnsbase = erows.Sum(pr => pr.Pay);

            if (dnsbase == 0.0M)
            {
                int ct = erows.Count();
                foreach (var pr in erows)
                {
                    pr.DNS = RoundA(rowt.DNS / ct);
                }
            }
            else
            {
                foreach (var pr in erows)
                {
                    pr.DNS = RoundA(rowt.DNS * pr.Pay / dnsbase);
                }
            }

            MakeExactSum(rowt.DNS, rows, d => d.DNS, (d, dval) => d.DNS = dval);

            decimal fulliinbase = erows
                                  .Sum(pr => pr.Pay + pr.PayNs - pr.DNS);


            if (fulliinbase == 0.0M)
            {
                int ct = erows.Count();
                foreach (var pr in erows)
                {
                    pr.UsedIinEx = RoundA(rowt.UsedIinEx / ct);
                    pr.IIN       = RoundA(rowt.IIN / ct);
                    pr.Cash      = RoundA(rowt.Cash / ct);
                }
            }
            else
            {
                foreach (var pr in erows)
                {
                    decimal iinbase = pr.Pay + pr.PayNs - pr.DNS;
                    pr.UsedIinEx = RoundA(rowt.UsedIinEx * iinbase / fulliinbase);
                    pr.IIN       = RoundA(rowt.IIN * iinbase / fulliinbase);
                    pr.Cash      = iinbase + pr.PayNt - pr.IIN;
                }
            }

            MakeExactSum(rowt.Cash, rows, d => d.Cash, (d, dval) => d.Cash = dval);
            MakeExactSum(rowt.UsedIinEx, rows, d => d.UsedIinEx, (d, dval) => d.UsedIinEx = dval);
            foreach (var pr in erows)
            {
                pr.IIN = pr.Pay + pr.PayNs + pr.PayNt - pr.DNS - pr.Cash;
            }
        }
コード例 #7
0
ファイル: BonusCalcInfo.cs プロジェクト: Camel-RD/Klons
        public decimal CalcFromEndC(SalaryInfo si,
                                    decimal totalinex,
                                    decimal curbruto, decimal brutonosai,
                                    decimal brutomargin,
                                    bool useprogressiveiin, bool hastaxdoc,
                                    decimal iinrate1, decimal iinrate2, decimal dnsrate, int divby,
                                    out List <PayFx2> rpfx)
        {
            rpfx = new List <PayFx2>();
            decimal ret = 0.0M;

            if (PlusFromEnd <= 0.0M)
            {
                return(ret);
            }

            decimal calcbruto = curbruto;

            var p1 = new PayFx(useprogressiveiin);

            p1.Ir        = iinrate1 / 100.0M;
            p1.Ir2       = iinrate2 / 100.0M;
            p1.Sr        = dnsrate / 100.0M;
            p1.IM        = brutomargin;
            p1.HasTaxDoc = hastaxdoc;
            p1.Pay       = curbruto;
            p1.PayNs     = brutonosai;
            p1.IinEx     = totalinex;

            for (int i = 0; i < DataRows.Length; i++)
            {
                var dr = DataRows[i];
                if (dr.XRateType != EBonusRateType.Money ||
                    dr.XBonusType != EBonusType.ReverseCalc)
                {
                    continue;
                }

                decimal v = dr.RATE;

                calcbruto = p1.GetPayByIncCash(v);
                calcbruto = KlonsData.RoundA(calcbruto, 2);
                v         = calcbruto - curbruto;
                p1.Pay    = calcbruto;
                curbruto  = calcbruto;
                if (dr.AMOUNT != v)
                {
                    dr.AMOUNT = v;
                }
                var rpfx1 = AddRow(si, dr, dr.RATE, v, 1);
                rpfx.Add(rpfx1);
                ret += v;
            }

            return(ret);
        }
コード例 #8
0
 public void Subtract(PayFx from)
 {
     Pay       -= from.Pay;
     PayNs     -= from.PayNs;
     PayNt     -= from.PayNt;
     UsedIinEx -= from.UsedIinEx;
     DNS       -= from.DNS;
     IIN       -= from.IIN;
     Cash      -= from.Cash;
 }
コード例 #9
0
ファイル: PayFxA.cs プロジェクト: Camel-RD/Klons
        public void AddIncrementallyAndRound(PayFx2 row)
        {
            var p1 = new PayFx();

            p1.SetFrom(this);
            AddPayRound(row);
            CalcAllAndRound();
            row.SetFrom(this);
            row.Subtract(p1);
            Rows.Add(row);
        }
コード例 #10
0
ファイル: PayFxA.cs プロジェクト: Camel-RD/Klons
        public void AddIncrementallySplitAndRound(PayFx2 rowt, PayFx2[] rows)
        {
            var p1 = new PayFx();

            p1.SetFrom(this);
            AddPayRound(rowt);
            CalcAllAndRound();
            rowt.SetFrom(this);
            rowt.Subtract(p1);

            SplitAndRound(rowt, rows);

            Rows.Add(rowt);
        }
コード例 #11
0
 public void Add(PayFx from)
 {
     if (from == null)
     {
         return;
     }
     Pay   += from.Pay;
     PayNs += from.PayNs;
     PayNt += from.PayNt;
     //IinEx += from.IinEx;
     UsedIinEx += from.UsedIinEx;
     DNS       += from.DNS;
     IIN       += from.IIN;
     Cash      += from.Cash;
 }
コード例 #12
0
        public void RecalcAndRound()
        {
            PAY_TAXED        = KlonsData.RoundA(PAY_TAXED, 2);
            PAY_NOSAI        = KlonsData.RoundA(PAY_NOSAI, 2);
            PAY_NOTTAXED     = KlonsData.RoundA(PAY_NOTTAXED, 2);
            NOTPAID_TAXED    = KlonsData.RoundA(NOTPAID_TAXED, 2);
            NOTPAID_NOSAI    = KlonsData.RoundA(NOTPAID_NOSAI, 2);
            NOTPAID_NOTTAXED = KlonsData.RoundA(NOTPAID_NOTTAXED, 2);
            PFNT             = KlonsData.RoundA(PFNT, 2);
            LIT  = KlonsData.RoundA(LIT, 2);
            HIT  = KlonsData.RoundA(HIT, 2);
            PFT  = KlonsData.RoundA(PFT, 2);
            LINT = KlonsData.RoundA(LINT, 2);
            HINT = KlonsData.RoundA(HINT, 2);

            var pfx = new PayFx();

            SetTo(pfx);
            pfx.CalcAllAndRound();
            SetFrom(pfx);

            if (pfx.IinEx > 0.0M)
            {
                UNTAXED_MINIMUM  = KlonsData.RoundA(UNTAXED_MINIMUM, 2);
                IINEX_DEPENDANTS = KlonsData.RoundA(IINEX_DEPENDANTS, 2);
                IINEX2           = KlonsData.RoundA(IINEX2, 2);
                IINEX_EXP        = KlonsData.RoundA(IINEX_EXP, 2);
                var dd = new decimal[] { UNTAXED_MINIMUM, IINEX_DEPENDANTS, IINEX2, IINEX_EXP };
                PayFxA.MakeExactSum(pfx.UsedIinEx, dd);
                UNTAXED_MINIMUM  = dd[0];
                IINEX_DEPENDANTS = dd[1];
                IINEX2           = dd[2];
                IINEX_EXP        = dd[3];
            }

            CASH_NOTPAID = 0.0M;
            if (NOTPAID_TAXED == 0.0M && NOTPAID_NOSAI == 0.0M && NOTPAID_NOTTAXED == 0.0M)
            {
                return;
            }

            pfx.Pay   = Math.Min(PAY_TAXED, NOTPAID_TAXED);
            pfx.PayNs = Math.Min(PAY_NOSAI, NOTPAID_NOSAI);
            pfx.PayNt = Math.Min(PAY_NOTTAXED, NOTPAID_NOTTAXED);
            pfx.CalcAllAndRound();
            CASH_NOTPAID = pfx.Cash;
        }
コード例 #13
0
        public decimal RecalcCashNotPaid()
        {
            CASH_NOTPAID = 0.0M;
            if (NOTPAID_TAXED == 0.0M && NOTPAID_NOSAI == 0.0M && NOTPAID_NOTTAXED == 0.0M)
            {
                return(0.0M);
            }
            var pfx = new PayFx();

            SetTo(pfx);
            pfx.Pay   = Math.Min(PAY_TAXED, NOTPAID_TAXED);
            pfx.PayNs = Math.Min(PAY_NOSAI, NOTPAID_NOSAI);
            pfx.PayNt = Math.Min(PAY_NOTTAXED, NOTPAID_NOTTAXED);
            pfx.CalcAll();
            CASH_NOTPAID = pfx.Cash;
            return(CASH_NOTPAID);
        }
コード例 #14
0
        public virtual void SetFrom(PayFx from)
        {
            Pay       = from.Pay;
            PayNs     = from.PayNs;
            PayNt     = from.PayNt;
            IinEx     = from.IinEx;
            UsedIinEx = from.UsedIinEx;
            DNS       = from.DNS;
            IIN       = from.IIN;
            Cash      = from.Cash;

            Ir                = from.Ir;
            Ir2               = from.Ir2;
            Sr                = from.Sr;
            IM                = from.IM;
            HasTaxDoc         = from.HasTaxDoc;
            HasProgressiveIIN = from.HasProgressiveIIN;
        }
コード例 #15
0
ファイル: PayFxA.cs プロジェクト: Camel-RD/Klons
        public void AddIncrementally(PayFx2 row)
        {
            var p1 = new PayFx();

            p1.SetFrom(this);
            AddPay(row);
            CalcAll();
            var p2 = new PayFx();

            p2.SetFrom(this);
            p2.Subtract(p1);

            row.DNS       = p2.DNS;
            row.UsedIinEx = p2.UsedIinEx;
            row.IIN       = p2.IIN;
            row.Cash      = p2.Cash;

            Rows.Add(row);
        }
コード例 #16
0
        public void RecalcA()
        {
            var pfx = new PayFx();

            SetTo(pfx);
            pfx.CalcAll();
            SetFrom(pfx);

            CASH_NOTPAID = 0.0M;
            if (NOTPAID_TAXED == 0.0M && NOTPAID_NOSAI == 0.0M && NOTPAID_NOTTAXED == 0.0M)
            {
                return;
            }

            pfx.Pay   = Math.Min(PAY_TAXED, NOTPAID_TAXED);
            pfx.PayNs = Math.Min(PAY_NOSAI, NOTPAID_NOSAI);
            pfx.PayNt = Math.Min(PAY_NOTTAXED, NOTPAID_NOTTAXED);
            pfx.CalcAll();
            CASH_NOTPAID = pfx.Cash;
        }
コード例 #17
0
        public string Calc1(PayCalcRow sr, PayCalcRow paid, decimal pay, out PayCalcRow rpay)
        {
            rpay = new PayCalcRow();

            rpay.SetFrom(sr);
            rpay.SubtractThat(paid);
            rpay.CASH_REQ = pay;

            if (rpay.CASH == 0.0M)
            {
                return("OK");
            }
            if (rpay.PAY_TAXED == 0.0M && rpay.PAY_NOSAI == 0.0M && rpay.PAY_NOTTAXED == 0.0M)
            {
                return("OK");
            }

            var pfx  = new PayFx();
            var pfx2 = new PayFx();
            var pfx3 = new PayFx();

            paid.SetTo(pfx, sr);
            pfx2.SetFrom(pfx);
            pfx.IncPayByIncCash(pay, rpay.PAY_TAXED, rpay.PAY_NOSAI, rpay.PAY_NOTTAXED);
            pfx3.SetFrom(pfx);
            pfx.CalcAll();
            pfx.Subtract(pfx2);
            rpay.SetFrom(pfx);

            pfx3.Pay   = Math.Min(pfx3.Pay, sr.NOTPAID_TAXED);
            pfx3.PayNs = Math.Min(pfx3.PayNs, sr.NOTPAID_NOSAI);
            pfx3.PayNt = Math.Min(pfx3.PayNt, sr.NOTPAID_NOTTAXED);

            pfx3.CalcAll();
            rpay.CASH_NOTPAID = pfx3.Cash - paid.CASH_NOTPAID;

            return("OK");
        }
コード例 #18
0
        public PayFx CalcAll(SalarySheetRowInfo sr, VacationCalcRow v, int calcver)
        {
            var cri = new CalcRInfo(false, calcver);

            cri.CalcR(sr, v.DateStart, v.DateEnd);
            var pfx = new PayFx(cri);

            if (cri.UseProgresiveIINRate)
            {
                pfx.IinEx = 0.0M;
            }
            else
            {
                pfx.IinEx = cri.ExMax2.SumIINExempts();
            }
            pfx.Pay = v.Pay;
            pfx.CalcAllAndRound();
            v.DNS   = pfx.DNS;
            v.IINEX = pfx.UsedIinEx;
            v.IIN   = pfx.IIN;
            v.Cash  = pfx.Cash;
            return(pfx);
        }
コード例 #19
0
 public void AddPay(PayFx pfrom)
 {
     Pay   += pfrom.Pay;
     PayNs += pfrom.PayNs;
     PayNt += pfrom.PayNt;
 }
コード例 #20
0
        public void CalcAll(SalarySheetRowInfo sr, VacationCalcInfo[] vcs, int calcver)
        {
            Days  = 0.0f;
            Hours = 0.0f;
            Pay   = 0.0M;
            DNS   = 0.0M;
            IINEX = 0.0M;
            IIN   = 0.0M;
            Cash  = 0.0M;

            foreach (var v in PerMonth)
            {
                CalcAll(sr, v.Value, calcver);
                Add(v.Value);
            }

            if (vcs == null)
            {
                return;
            }


            var pfx = new PayFx();

            pfx.Pay       = Pay;
            pfx.DNS       = DNS;
            pfx.UsedIinEx = IINEX;
            pfx.IIN       = IIN;
            pfx.Cash      = Cash;

            var vcrms = new VacationCalcRow[vcs.Length];
            var pfxs  = new PayFx[vcs.Length];

            for (int i = 0; i < vcs.Length; i++)
            {
                var vci = vcs[i];
                if (vci == null)
                {
                    continue;
                }
                var vcri = vci.VcrCompensation;
                vcrms[i] = vcri;
                var pfx1 = new PayFx();
                pfx1.Pay = vcri.Pay;
                pfxs[i]  = pfx1;
            }

            PayFx.SplitAndRound(pfx, pfxs);

            for (int i = 0; i < vcs.Length; i++)
            {
                var vci = vcs[i];
                if (vci == null)
                {
                    continue;
                }
                var vcrm = vcrms[i];
                var pfx1 = pfxs[i];
                vcrm.DNS   = pfx1.DNS;
                vcrm.IINEX = pfx1.UsedIinEx;
                vcrm.IIN   = pfx1.IIN;
                vcrm.Cash  = pfx1.Cash;
            }
        }
コード例 #21
0
ファイル: CalcRInfo.cs プロジェクト: Camel-RD/Klons
        public void CalcR(SalarySheetRowInfo sr, DateTime dt1, DateTime dt2)
        {
            if (dt1 > dt2 || dt1.Month != dt2.Month)
            {
                throw new ArgumentException("Bad call.");
            }

            IINMargin = PayFx.GetIINMargin(dt1);

            var fPersonR   = sr.PersonR.FilterListWithDates(dt1, dt2);
            var fHireFire  = sr.Events.HireFire.FilterListWithDates(dt1, dt2);
            var sickleaveb = sr.Events.SickDays.LinkedPeriods
                             .Where(d => d.EEventId == EEventId.Slimības_lapa_B)
                             .ToArray();

            fPersonR = fPersonR.FilterWithList(fHireFire);
            fPersonR = fPersonR.SubtractList(sickleaveb);

            DaysInMonth  = dt1.DaysInMonth();
            CalendarDays = 0;

            var dr_likmes = dt1.Month == sr.SalarySheet.MT ?
                            sr.SalarySheet.DR_Likmes : null;

            if (dr_likmes == null)
            {
                dr_likmes = DataTasks.GetRates(dt1.FirstDayOfMonth());
            }

            if (fPersonR.LinkedPeriods.Count == 0)
            {
                return;
            }

            var wt1 = new CalcRRow2();
            var pr1 = fPersonR.LinkedPeriods[0].Item1 as KlonsADataSet.PERSONS_RRow;

            IsPensioner          = pr1.PENSIONER == 1;
            HasTaxDoc            = !string.IsNullOrEmpty(pr1.TAXDOC_NO);
            UseProgresiveIINRate = (dt1 >= ProgressiveIINStartDate);

            GetRatesForPerson(wt1, pr1, dr_likmes, dt1);

            RateDDSN             = wt1.RateDDSN;
            RateDNSN             = wt1.RateDNSN;
            RateIIN              = wt1.RateIIN;
            RateIIN2             = wt1.RateIIN2;
            IINMargin            = wt1.IINMargin;
            HasTaxDoc            = wt1.HasTaxDoc;
            UseProgresiveIINRate = wt1.UseProgresiveIINRate;

            for (int i = 0; i < fPersonR.LinkedPeriods.Count; i++)
            {
                var pri     = fPersonR.LinkedPeriods[i];
                var dt1x    = pri.DateFirst;
                var dt2x    = pri.DateLast;
                int caldays = dt2x.Subtract(dt1x).Days + 1;
                CalendarDays += caldays;

                GetIINDeductionsForPerson(wt1, pri.Item1 as KlonsADataSet.PERSONS_RRow, dr_likmes, dt1x, dt2x, CalcVer);

                ExFull.AddForExFull(wt1);

                if (PreparingReport)
                {
                    SaveStateForMonth(wt1);
                    SaveStateDays(caldays);
                }

                decimal rt = (decimal)caldays / (decimal)DaysInMonth;

                wt1.Multiply(rt);

                ExForDays.Add(wt1);

                if (PreparingReport)
                {
                    SaveStateForDays(wt1);
                    AddToList(dt1x, dt2x);
                }
            }

            ExFull.Round();
            ExForDays.Round();
            ExMax2.SetFrom(ExForDays);

            if (!sr.IsSingleRow() && sr.TotalPositionPay.IINExempt2Kind != EIINExempt2Kind.None &&
                sr.SalarySheet.MT == dt1.Month)
            {
                SetMax(sr.TotalPositionPay.IINExempt2Kind);
            }
            else
            {
                FindMax();
            }

            ExDivided.SetFrom(ExMax2);
            ExCorrect.SetFrom(ExMax2);

            if (PreparingReport)
            {
                SaveStateForMonth(ExFull);
                SaveStateForDays(ExForDays);
                SaveStateForMax(ExMax2);
            }
        }