Example #1
0
        public List <cNgayCong> TinhCongTheoNgay(List <cChkInOut> pDSVaoRa, DateTime ngayBD, DateTime ngayKT, bool macdinhtinhpc50)
        {
            List <cNgayCong> kq = new List <cNgayCong>();
            DateTime         ngaydem;

            if (pDSVaoRa.Count == 0)
            {
                ngaydem = ngayBD.Date;
                while (ngaydem <= ngayKT)                   // <= vì lấy luôn ngày KT : vắng mặt
                {
                    cNgayCong ngayKOcheck = new cNgayCong()
                    {
                        NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(),
                    };
                    kq.Add(ngayKOcheck);
                    ngaydem = ngaydem.AddDays(1d);
                }
                return(kq);
            }

            int vtriBD = 0;

            ngaydem = ngayBD.Date;

            while (ngaydem <= ngayKT.Date)
            {
                if (vtriBD >= pDSVaoRa.Count)                   // hết DS nhưng ngaydem <= ngày KT ==> ghi lại những ngày sau là vắng mặt
                {
                    while (ngaydem <= ngayKT.Date)
                    {
                        cNgayCong ngayKOcheck = new cNgayCong()
                        {
                            NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(),
                        };
                        kq.Add(ngayKOcheck);
                        ngaydem = ngaydem.AddDays(1d);
                    }
                    continue;
                }

                // chưa hết DS, bắt đầu từ ngày của DSVaoRa tại vtbd, đó là ngày có mặt
                cChkInOut CIO = pDSVaoRa[vtriBD];
                XL.TinhCongTheoCa(CIO, CIO.ThuocCa);
                DateTime ngayCoMat = CIO.ThuocNgayCong;

                // ghi lại những ngày vắng mặt trước ngày có mặt
                while (ngaydem < ngayCoMat)                   // ko có = vì chỉ chạy đến trước ngày của tmpVaoRa thôi
                {
                    cNgayCong ngayKOcheck = new cNgayCong()
                    {
                        NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(),
                    };
                    kq.Add(ngayKOcheck);
                    ngaydem = ngaydem.AddDays(1d);
                }
                //ngaydem = ngày có mặt. stop, tmpVaoRa là vào ra đầu tiên trong ngày
                #region collapse

                double    pcdem       = Convert.ToDouble(Properties.Settings.Default.PCDem / 100);
                double    pctc        = Convert.ToDouble(Properties.Settings.Default.PCTangCuong / 100);
                cNgayCong ngayCOcheck = new cNgayCong()
                {
                    HasCheck  = true,
                    NgayCong  = ngayCoMat,
                    TinhPC150 = macdinhtinhpc50,                    // mặc định khởi tạo ngày có tính PC 50%, nếu tồn tại ít nhất 1 ca nào ko tính pc 50% thì set cả ngày ko tính pc 50%
                    TG        = new ThoiGian()
                    {
                        LamTinhCong = CIO.TG.LamTinhCong, LamTinhPC30 = CIO.TG.LamTinhPC30
                    },
                    TongGioThuc = CIO.TongGioThuc,
                    TongTre     = CIO.VaoTre,
                    TongSom     = CIO.RaaSom,
                    TongCong    = Math.Round(CIO.Cong, 2),
                    PhuCap30    = Math.Round(((CIO.TG.LamTinhPC30.TotalHours > 0d)
                                        ? ((CIO.TG.LamTinhPC30.TotalHours / 8d) * pcdem)
                                        : 0d), 2)
                                  // công thức cũ (tính phụ cấp tăng ca theo công) là : + (((tmpVaoRa.Cong > 1f) ? (tmpVaoRa.Cong - 1f) * 0.5f : 0f))
                                  // đổi lại công thức mới (tính phụ cấp theo giờ) là : + (((tmpVaoRa.TGLamTinhCong.TotalHours > 8f) ? (((float)tmpVaoRa.TGLamTinhCong.TotalHours - 8f) / 8f) * 0.5f : 0f))
                };

                if (CIO.QuaDem == true)
                {
                    ngayCOcheck.QuaDem = true;                                     // set qua đêm nếu có
                }
                if (CIO.TinhPC150 != macdinhtinhpc50)
                {
                    ngayCOcheck.TinhPC150 = CIO.TinhPC150;
                }
                if (ngayCOcheck.TinhPC150)
                {
                    ngayCOcheck.PhuCap50 = Math.Round((((CIO.TG.LamTinhCong.TotalHours > 8d)
                                                                                                                   ? (((CIO.TG.LamTinhCong.TotalHours - 8d) / 8d) * pctc)
                                                                                                                   : 0d)), 2);
                }
                else
                {
                    ngayCOcheck.PhuCap50 = 0d;
                }

                ngayCOcheck.TongPhuCap = Math.Round((ngayCOcheck.PhuCap30 + ngayCOcheck.PhuCap50), 2);
                ngayCOcheck.them(CIO);
                #endregion


                // sau khi tạo ngày công mới vào ra đó là vào ra đầu tiên thì chuyển sang VAORA next
                vtriBD++;
                // nếu hết ds thì ngưng, add tmpNgayCong1 vào danh sách ngày công (do chưa add)
                if (vtriBD >= pDSVaoRa.Count)
                {
                    kq.Add(ngayCOcheck);
                    ngaydem = ngayCOcheck.NgayCong.AddDays(1d);
                    while (ngaydem <= ngayKT.Date)
                    {
                        cNgayCong ngayKOcheck = new cNgayCong()
                        {
                            NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(),
                        };
                        kq.Add(ngayKOcheck);
                        ngaydem = ngaydem.AddDays(1.0d);
                    }
                    continue;
                }
                // chưa hết DSVàoRa, xem các vào ra kế tiếp, nếu cùng ngày công thì add thêm vào tmpNgayCong1
                while (vtriBD < pDSVaoRa.Count && ThamSo.GetDate(pDSVaoRa[vtriBD].TimeStrDaiDien) == ngayCOcheck.NgayCong)
                {
                    cChkInOut CIO_1 = pDSVaoRa[vtriBD];
                    XL.TinhCongTheoCa(CIO_1, CIO_1.ThuocCa);

                    #region collapse
                    ngayCOcheck.TongGioThuc    += CIO_1.TongGioThuc;
                    ngayCOcheck.TG.LamTinhCong += CIO_1.TG.LamTinhCong;
                    ngayCOcheck.TG.LamTinhPC30 += CIO_1.TG.LamTinhPC30;
                    ngayCOcheck.TongTre        += CIO_1.VaoTre;
                    ngayCOcheck.TongSom        += CIO_1.RaaSom;
                    ngayCOcheck.TongCong       += Math.Round(CIO_1.Cong, 2);

                    ngayCOcheck.PhuCap30 = Math.Round(((ngayCOcheck.TG.LamTinhPC30.TotalHours > 0d)
                                                                                                   ? ((ngayCOcheck.TG.LamTinhPC30.TotalHours / 8d) * pcdem)
                                                                                                   : 0d), 2);
                    #endregion
                    if (CIO_1.QuaDem == true)
                    {
                        ngayCOcheck.QuaDem = true;                                           // set qua đêm nếu có
                    }
                    if (CIO_1.TinhPC150 != macdinhtinhpc50)
                    {
                        ngayCOcheck.TinhPC150 = CIO_1.TinhPC150;
                    }
                    if (ngayCOcheck.TinhPC150)
                    {
                        ngayCOcheck.PhuCap50 = Math.Round((((ngayCOcheck.TG.LamTinhCong.TotalHours > 8d)
                                                                                                                           ? (((ngayCOcheck.TG.LamTinhCong.TotalHours - 8d) / 8d) * pctc)
                                                                                                                           : 0d)), 2);
                    }
                    else
                    {
                        ngayCOcheck.PhuCap50 = 0d;
                    }

                    ngayCOcheck.TongPhuCap = Math.Round((ngayCOcheck.PhuCap30 + ngayCOcheck.PhuCap50), 2);
                    ngayCOcheck.them(CIO_1);

                    vtriBD++;
                }
                //thoát khỏi vòng lặp: hoặc hết ds hoặc chuyển sang ngày mới
                if (vtriBD >= pDSVaoRa.Count)
                {
                    kq.Add(ngayCOcheck);
                    ngaydem = ngayCOcheck.NgayCong.AddDays(1d);
                    while (ngaydem <= ngayKT.Date)
                    {
                        cNgayCong tmpNgayCong = new cNgayCong()
                        {
                            NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(),
                        };
                        kq.Add(tmpNgayCong);
                        ngaydem = ngaydem.AddDays(1d);
                    }
                }
                else
                {
                    kq.Add(ngayCOcheck);
                    ngaydem = ngaydem.AddDays(1d);
                }
            }

            return(kq);
        }