public void TaoCaTuDo(int ID, DateTime CheckInTime, out cCa Ca)
        {
            //var temp = CheckInTime.TimeOfDay;//ver 4.0.0.0//tbd xem lại ngày công
            Ca = new cCa {
                ID = ID
            };
            var gioVaoLamTron = MyUtility.LamTronPhut(CheckInTime.TimeOfDay);            //ver 4.0.0.1 bỏ phần giây, chỉ giữ phần giờ, phút

            //if (CheckInTime.TimeOfDay < GlobalVariables._03gio) temp = Ca.Duty.From.Add(GlobalVariables._1ngay); //ca 3 , ca 3 va 1 vẫn giữ nguyên vì 21h > 4h//tbd xem lại ngày công
            if (Ca.ID == int.MinValue + 0)
            {
                Ca.Duty = new FromToTimeSpan {
                    From = gioVaoLamTron, To = gioVaoLamTron.Add(GlobalVariables._08gio)
                };
                Ca.WorkingTimeTS = GlobalVariables._08gio;
                Ca.Workingday    = 1f;
                Ca.Code          = Properties.Settings.Default.shiftCodeCa8h;                //todo xem lại
                Ca.MoTa          = string.Format(Properties.Settings.Default.MoTaCaTuDo, 8); //todo xem lauị
                Ca.KyHieuCC      = Properties.Settings.Default.kyHieuCCCa8h;
            }
            Ca.Is_CaTuDo    = true;
            Ca.TachCaDem    = false;
            Ca.NightTime    = GlobalVariables.NightTime22h;
            Ca.LateeMin     = GlobalVariables.default_LateMin;
            Ca.EarlyMin     = GlobalVariables.default_EarlyMin;
            Ca.AfterOTMin   = GlobalVariables.default_AfterOTMin;
            Ca.LunchMin     = GlobalVariables.default_LunchMin;
            Ca.DayCount     = Ca.Duty.To.Days;
            Ca.QuaDem       = (Ca.Duty.To.Days == 1);
            Ca.OnTimeInMin  = 5;        //setting nhưng ko ý nghĩa
            Ca.CutInMin     = 5;        //setting nhưng ko ý nghĩa
            Ca.OnTimeOutMin = 5;        //setting nhưng ko ý nghĩa
            Ca.CutOutMin    = 5;        //setting nhưng ko ý nghĩa
        }
        public void XacDinh_TD_BDLV(DateTime ThuocNgayCong, DateTime TD_Vao, TimeSpan BDCa_TOD, TimeSpan ChoPhepTre_TimeOfDay, bool ChoPhepTre,
                                    out DateTime TD_Vao_lamTron, out DateTime TD_BD_LV, out TimeSpan VaoSauCa, out TimeSpan TGVaoTreVR)
        {
            TD_Vao_lamTron = MyUtility.LamTronPhut(TD_Vao);
            var TD_BD_Ca            = ThuocNgayCong.Add(BDCa_TOD);
            var thoidiem_BD_tinhtre = ThuocNgayCong.Add(ChoPhepTre_TimeOfDay);

            XacDinh_TD_BDLV(TD_Vao_lamTron, TD_BD_Ca, thoidiem_BD_tinhtre, ChoPhepTre, out TD_BD_LV, out VaoSauCa, out TGVaoTreVR);
        }
 public void XacDinh_TD_KTLV_TrongCa(DateTime TD_Raa_LamTron, DateTime TD_KTCa, DateTime TD_chophepsom, bool ChoPhepSom,
                                     out DateTime TD_KTLVTrongCa, out TimeSpan RaTruocCa, out TimeSpan TGRaSom)
 {
     if (ChoPhepSom == false && (TD_KTCa - TD_Raa_LamTron > TimeSpan.Zero))
     {
         RaTruocCa = TD_KTCa - TD_Raa_LamTron;
         RaTruocCa = MyUtility.LamTronPhut(RaTruocCa);
     }
     else
     {
         RaTruocCa = TimeSpan.Zero;
     }
     // ra ... choPhép sớm --> ra sớm, lấy giờ ra làm tròn
     // cho phép sớm .. ra --> ko sớm, lấy giờ kt ca
     TD_KTLVTrongCa = (TD_Raa_LamTron < TD_chophepsom /*&& TD_chophepsom - TD_Raa_LamTron > TimeSpan.Zero*/) ? TD_Raa_LamTron : TD_KTCa;
     XacDinhSoPhutSom(TD_Raa_LamTron, TD_KTCa, TD_chophepsom, ChoPhepSom, out TGRaSom);
 }
 public void XacDinh_TD_BDLV(DateTime TD_VaoLamTron, DateTime TD_BDCa, DateTime TD_Chopheptre, bool ChoPhepTre,
                             out DateTime TD_BDLV, out TimeSpan VaoSauCa, out TimeSpan TGVaoTre)
 {
     if (ChoPhepTre == false && (TD_VaoLamTron - TD_BDCa > TimeSpan.Zero))
     {
         VaoSauCa = TD_VaoLamTron - TD_BDCa;
         VaoSauCa = MyUtility.LamTronPhut(VaoSauCa);
     }
     else
     {
         VaoSauCa = TimeSpan.Zero;
     }
     //cho trễ ... vào --> trễ , lấy vào làm tròn;
     // vào ... cho trễ --> ko trễ, lấy bđ ca
     TD_BDLV = (TD_Chopheptre < TD_VaoLamTron /*&& TD_VaoLamTron - TD_Chopheptre > TimeSpan.Zero*/) ? TD_VaoLamTron : TD_BDCa;
     XacDinhSoPhutTre(TD_VaoLamTron, TD_BDCa, TD_Chopheptre, ChoPhepTre, out TGVaoTre);
 }
        public void XacDinh_TD_KTLV(DateTime ThuocNgayCong, DateTime TD_Raa, TimeSpan KTCa_TOD,
                                    TimeSpan ChophepSom_TimeOfDay, bool ChoPhepSom,
                                    TimeSpan BatdauOT_TimeOfDay, bool TinhTG_OT, TimeSpan SoPhutOT_DaXN,
                                    out DateTime TD_Raa_LamTron, out DateTime TD_KTLVTrongCa, out DateTime TD_KTLV, out TimeSpan RaTruocCa, out TimeSpan TGRaaSomVR, out TimeSpan TG_OLai_VR)
        {
            TD_Raa_LamTron = MyUtility.LamTronPhut(TD_Raa);
            var TD_KT_Ca             = ThuocNgayCong.Add(KTCa_TOD);//off duty này đã bao gồm daycount được công bên trong
            var thoidiem_BD_tinhsom  = ThuocNgayCong.Add(ChophepSom_TimeOfDay);
            var thoidiem_BD_tinhOLai = ThuocNgayCong.Add(BatdauOT_TimeOfDay);

            TG_OLai_VR = TimeSpan.Zero;
            XacDinh_TD_KTLV_TrongCa(TD_Raa_LamTron, TD_KT_Ca, thoidiem_BD_tinhsom, ChoPhepSom, out TD_KTLVTrongCa, out RaTruocCa, out TGRaaSomVR);
            if (TinhTG_OT == false)
            {
                XacDinh_KTG_OLai(TD_Raa_LamTron, TD_KT_Ca, thoidiem_BD_tinhOLai, out TG_OLai_VR);
                TD_KTLV = TD_KTLVTrongCa;
            }
            else
            {
                TD_KTLV = TD_KTLVTrongCa.Add(SoPhutOT_DaXN);
            }
        }
        public void TinhTG_LV_LVCa3_LamThem1Ca(DateTime ThuocNgayCong, TrangThaiCheck CheckVT,
                                               DateTime TD_Vao, DateTime TD_Raa,
                                               TimeSpan BDCa_TOD, TimeSpan KTCa_TOD, TimeSpan ChoPhepTre_TimeOfDay, TimeSpan ChophepSom_TimeOfDay, TimeSpan BatdauOT_TimeOfDay,
                                               TimeSpan Phut_NghiTrua, FromToTimeSpan NightTime,
                                               out DateTime TD_Vao_lamTron, out DateTime TD_Raa_lamTron,
                                               out DateTime TD_BD_LV, out DateTime TD_KT_LV_TrongCa, out DateTime TD_KT_LV, out DateTime TD_BD_LV_Ca3, out DateTime TD_KT_LV_Ca3,
                                               out TimeSpan TGHienDien, out TimeSpan TGVaoSauCa, out TimeSpan TGRaTruocCa,
                                               out TimeSpan TGVaoTreVR, out TimeSpan TGRaaSomVR, out TimeSpan TG_OLai_VR,
                                               out TimeSpan TGLamViecTrongCa, /*out TimeSpan TGLamViecNgoaiGio, ko có TGLamViecNgoaiGio vì chưa xử lý*/
                                               out TimeSpan TGLamDem, out bool QuaDem)
        {
            TD_Vao_lamTron   = MyUtility.LamTronPhut(TD_Vao);
            TD_Raa_lamTron   = MyUtility.LamTronPhut(TD_Raa);
            TD_BD_LV         = ThuocNgayCong;
            TD_KT_LV_TrongCa = ThuocNgayCong;
            TD_KT_LV         = ThuocNgayCong;
            TD_BD_LV_Ca3     = ThuocNgayCong;
            TD_KT_LV_Ca3     = ThuocNgayCong;
            TGHienDien       = TimeSpan.Zero;
            TGVaoSauCa       = TimeSpan.Zero;
            TGRaTruocCa      = TimeSpan.Zero;
            TGVaoTreVR       = TimeSpan.Zero;
            TGRaaSomVR       = TimeSpan.Zero;
            TG_OLai_VR       = TimeSpan.Zero;
            TGLamViecTrongCa = TimeSpan.Zero;             //ko có TG làm việc ngoài giờ
            TGLamDem         = TimeSpan.Zero;
            QuaDem           = false;

            if (CheckVT != TrangThaiCheck.CheckDayDu)
            {
                return;
            }

            var TD_BD_Ca = ThuocNgayCong.Add(BDCa_TOD);
            var TD_KT_Ca = ThuocNgayCong.Add(KTCa_TOD);            //off duty này đã bao gồm daycount được công bên trong
            //var thoidiem_BD_tinhtre = ThuocNgayCong.Add(ChoPhepTre_TimeOfDay);
            var thoidiem_BD_tinhsom      = ThuocNgayCong.Add(ChophepSom_TimeOfDay);
            var thoidiem_BD_tinhOLai     = ThuocNgayCong.Add(BatdauOT_TimeOfDay);
            var thoidiem_QuyDinhBDLamDem = ThuocNgayCong.Add(NightTime.From);          //ver 4.0.0.4
            var thoidiem_QuyDinhKTLamDem = ThuocNgayCong.Add(NightTime.To);            //ver 4.0.0.4 //todo lưu ý đã có 1 ngày vì Global Variable =6gHôm sau

            bool quadem;

            TGHienDien = TD_Raa_lamTron - TD_Vao_lamTron;
            // kiểm tra giờ ra ko được nhỏ hơn vào ca, giờ vào ko được nhỏ hơn ra ca
            if (TD_Raa_lamTron <= TD_BD_Ca || TD_Vao_lamTron >= TD_KT_Ca)
            {
                return;
            }
            XacDinh_TD_BDLV(ThuocNgayCong, TD_Vao, BDCa_TOD, ChoPhepTre_TimeOfDay, false, out TD_Vao_lamTron, out TD_BD_LV, out TGVaoSauCa, out TGVaoTreVR);
            //XacDinh_TD_BDLV(TD_Vao_lamTron, TD_BD_Ca, thoidiem_BD_tinhtre, false, out TD_BD_LV, out TGVaoSauCa, out TGVaoTreVR);
            //TGVaoTreVR = (thoidiem_BD_tinhtre < TD_Vao_lamTron) ? (TD_Vao_lamTron - TD_BD_Ca) : TimeSpan.Zero;
            XacDinh_TD_KTLV(ThuocNgayCong, TD_Raa, KTCa_TOD, ChophepSom_TimeOfDay, false, BatdauOT_TimeOfDay, false, TimeSpan.Zero,
                            out TD_Raa_lamTron, out TD_KT_LV_TrongCa, out TD_KT_LV, out TGRaTruocCa, out TGRaaSomVR, out TG_OLai_VR);    //Do chưa xác nhận nên giờ làm thêm nên TD_KT_LV = TD_KT_LV_TrongCa
            //XacDinh_TD_KTLV_TrongCa(TD_Raa_lamTron, TD_KT_Ca, thoidiem_BD_tinhsom, false, out TD_KT_LV_TrongCa, out TGRaTruocCa, out TGRaaSomVR);
            //TGRaaSomVR = (TD_Raa_lamTron < thoidiem_BD_tinhsom) ? (TD_KT_Ca - TD_Raa_lamTron) : TimeSpan.Zero;
            //XacDinh_KTG_OLai(TD_Raa_lamTron, TD_KT_Ca, thoidiem_BD_tinhOLai, out TG_OLai_VR);
            Tinh_TGLamViecTrongCa(TD_BD_LV, TD_KT_LV_TrongCa, Phut_NghiTrua, out TGLamViecTrongCa);
            //TD_KT_LV = TD_KT_LV_TrongCa;
            Tinh_TGLamViec_Ca3(TD_BD_LV, TD_KT_LV, thoidiem_QuyDinhBDLamDem, thoidiem_QuyDinhKTLamDem, out TD_BD_LV_Ca3, out TD_KT_LV_Ca3, out TGLamDem, out quadem);
            QuaDem = quadem;
        }