/// <summary>
        /// Thêm điều chỉnh chi tiết cho quy
        /// </summary>
        /// <param name="dcId">Id điều chỉnh quý</param>
        /// <param name="LoaiDieuChinh">Loại điều chỉnh - Enums.KeHoachXuatBan</param>
        /// <param name="config">Thiết lập điều chỉnh chi tiết</param>
        /// <param name="lstThongTin">Danh sách điều chỉnh thông tin báo</param>
        /// <param name="GhiChu"></param>
        /// <param name="userCreate">Id người tạo</param>
        /// <returns></returns>
        /// <modify>
        /// Author  Date    comment
        /// Thang   ?       Tạo mới
        /// Anhhn   3/8/15  Sửa-Tách các loại điểu chỉnh ra thành các hàm riêng
        /// </modify>
        public ErrorObject CreateDieuChinhKHXBDetail(string dcId, int LoaiDieuChinh, string config, List<DCThongTinBaoModel> lstThongTin, string GhiChu, string userCreate)
        {
            ErrorObject err = new ErrorObject();
            lstThongTin = lstThongTin ?? new List<DCThongTinBaoModel>();
            BDieuChinhKHXB _dieuchinh = getDieuChinhKHXB(dcId);
            //Không tìm thấy điểu chỉnh
            if(_dieuchinh == null)
            {
                err.HasError = true;
                err.LstError.Add("", "Không có điều chỉnh");
                return err;
            }

            //Gán dữ liệu điều chỉnh detail
            BDieuChinhKHXBDetail _dieuchinhDetail = new BDieuChinhKHXBDetail();
            _dieuchinhDetail.Id = Guid.NewGuid().ToString();
            _dieuchinhDetail.DieuChinhKHXBId = _dieuchinh.Id;
            _dieuchinhDetail.Config = config;
            _dieuchinhDetail.CreateBy = userCreate;
            _dieuchinhDetail.CreateDate = DateTime.Now;
            _dieuchinhDetail.ModifyBy = userCreate;
            _dieuchinhDetail.ModifyDate = _dieuchinhDetail.CreateDate;

            _dieuchinhDetail.GhiChu = GhiChu;
            _dieuchinhDetail.LoaiDieuChinh = LoaiDieuChinh;
            _dieuchinhDetail.NoiDung = JsonConvert.SerializeObject(lstThongTin);
            //
            if (lstThongTin.Where(d => d.Key.Equals("GiaBia")).Count() > 0)
                _dieuchinhDetail.GiaBao = Convert.ToInt32(lstThongTin.Where(d => d.Key.Equals("GiaBia")).FirstOrDefault().Value);
            if (lstThongTin.Where(d => d.Key.Equals("TrongLuong")).Count() > 0)
                _dieuchinhDetail.TrongLuong = Convert.ToInt32(lstThongTin.Where(d => d.Key.Equals("TrongLuong")).FirstOrDefault().Value);
            if (lstThongTin.Where(d => d.Key.Equals("SoTrang")).Count() > 0)
                _dieuchinhDetail.SoTrang = Convert.ToInt32(lstThongTin.Where(d => d.Key.Equals("SoTrang")).FirstOrDefault().Value);
            if (lstThongTin.Where(d => d.Key.Equals("KichThuoc")).Count() > 0)
                _dieuchinhDetail.KichThuoc = lstThongTin.Where(d => d.Key.Equals("KichThuoc")).FirstOrDefault().Value;

            //Hủy số
            if (LoaiDieuChinh == (int)Enums.KeHoachXuatBan.cancel)
            {
                DCHuySo(_dieuchinhDetail, _dieuchinh);
            }
            //Dồn số
            else if (LoaiDieuChinh == (int)Enums.KeHoachXuatBan.group)
            {
                DCDonSo(_dieuchinhDetail, _dieuchinh);
            }
            //Số ra riêng
            else if (LoaiDieuChinh == (int)Enums.KeHoachXuatBan.add)
            {
                DCSoRaRieng(_dieuchinhDetail, _dieuchinh);
            }
            //Thay đổi thông tin báo
            else
            {
                DCThongTinBao(_dieuchinhDetail, _dieuchinh);
            }
            return err;
        }
 /// <summary>
 /// Điều chỉnh thay đổi thông tin báo
 /// </summary>
 /// <param name="_dieuchinhDetail"></param>
 /// <param name="_dieuchinh"></param>
 /// <param name="_config"></param>
 /// <modify>
 /// Author  Date    Comment
 /// Anhhn   3/8/15  Tách từ CreateDieuChinhKHXBDetail
 /// </modify>
 private void DCThongTinBao(BDieuChinhKHXBDetail _dieuchinhDetail, BDieuChinhKHXB _dieuchinh)
 {
     //Đọc dữ liệu thiếp lập điều chỉnh
     dynamic _config = JsonConvert.DeserializeObject<ExpandoObject>(_dieuchinhDetail.Config);
     //Nếu là thay đổi định kỳ thì lưu thứ, hoạc ngày điều chỉnh định kỳ
     if (_config.config.type == 1)
     {
         int[] numberConfig = ((List<dynamic>)_config.config.data).Select(d => d).ToList().ConvertAll(d => (int)Convert.ToInt32(d.ToString())).ToArray();
         _dieuchinhDetail.NgayOrThu = JsonConvert.SerializeObject(numberConfig);
     }
     string[] numberSoBao = ((List<dynamic>)_config.content.data).Select(d => d.number).ToList().ConvertAll(d => (string)d.ToString()).ToArray();
     _dieuchinhDetail.SoBao = JsonConvert.SerializeObject(numberSoBao);
     List<BKeHoachXuatBanDetail> _kehoach = getKeHoachXuatBanDetail(_dieuchinh.ThongTinBaoId, _dieuchinh.Nam, _dieuchinh.Quy).ToList();
     foreach (var item in _kehoach.Where(d => numberSoBao.Contains(d.SoBao)))
     {
         item.GiaBao = _dieuchinhDetail.GiaBao;
         item.TrongLuong = _dieuchinhDetail.TrongLuong;
         item.SoTrang = _dieuchinhDetail.SoTrang;
         item.KichThuoc = _dieuchinhDetail.KichThuoc;
         item.GhiChu = _dieuchinhDetail.GhiChu;
         item.Details = _dieuchinhDetail.NoiDung;
         if (item.status == (int)Enums.KeHoachXuatBan.approved)
             item.status = (int)Enums.KeHoachXuatBan.changed;
     }
     db.BDieuChinhKHXBDetails.Add(_dieuchinhDetail);
     db.SaveChanges();
 }
        /// <summary>
        /// Điều chỉnh số ra riêng
        /// </summary>
        /// <param name="_dieuchinhDetail"></param>
        /// <param name="_dieuchinh"></param>
        /// <param name="_config"></param>
        /// <modify>
        /// Author  Date    Comment
        /// Anhhn   3/8/15  Tách từ CreateDieuChinhKHXBDetail
        /// </modify>
        private void DCSoRaRieng(BDieuChinhKHXBDetail _dieuchinhDetail, BDieuChinhKHXB _dieuchinh)
        {
            //Đọc dữ liệu thiếp lập điều chỉnh
            dynamic _config = JsonConvert.DeserializeObject<ExpandoObject>(_dieuchinhDetail.Config);

            BKeHoachXuatBanDetail _detailNew = new BKeHoachXuatBanDetail();
            _detailNew.ThongTinBaoId = _dieuchinh.ThongTinBaoId;
            _detailNew.Nam = _dieuchinh.Nam;
            _detailNew.Quy = _dieuchinh.Quy;

            _detailNew.GiaBao = _dieuchinhDetail.GiaBao;
            _detailNew.TrongLuong = _dieuchinhDetail.TrongLuong;
            _detailNew.SoTrang = _dieuchinhDetail.SoTrang;
            _detailNew.KichThuoc = _dieuchinhDetail.KichThuoc;
            _detailNew.GhiChu = _dieuchinhDetail.GhiChu;
            _detailNew.Details = _dieuchinhDetail.NoiDung;
            _detailNew.status = (int)Enums.KeHoachXuatBan.add;

            int[] _dateS = ((string)_config.content.data.time).Split('/').Select(d => Convert.ToInt32(d)).ToArray();
            DateTime _time = new DateTime(_dateS[2], _dateS[1], _dateS[0]);
            _detailNew.Number = -1;
            _detailNew.SoXuatBan = _config.content.data.data;
            _detailNew.Thang = _dateS[1];
            _detailNew.Ngay = _dateS[0];
            _detailNew.Thu = ((int)_time.DayOfWeek) == 0 ? 8 : ((int)_time.DayOfWeek) + 1;
            _detailNew.SoBao = Guid.NewGuid().ToString().Trim();
            _dieuchinhDetail.SoBao = "[\"" + _detailNew.SoBao + "\"]";

            db.BDieuChinhKHXBDetails.Add(_dieuchinhDetail);
            db.BKeHoachXuatBanDetails.Add(_detailNew);
            db.SaveChanges();
        }
        /// <summary>
        /// Điều chỉnh hủy số
        /// </summary>
        /// <param name="_dieuchinhDetail"></param>
        /// <param name="_dieuchinh"></param>
        /// <param name="_config"></param>
        /// <modify>
        /// Author  Date    Comment
        /// Anhhn   3/8/15  Tách từ CreateDieuChinhKHXBDetail
        /// </modify>
        private void DCHuySo(BDieuChinhKHXBDetail _dieuchinhDetail, BDieuChinhKHXB _dieuchinh)
        {
            //Đọc dữ liệu thiếp lập điều chỉnh
            dynamic _config = JsonConvert.DeserializeObject<ExpandoObject>(_dieuchinhDetail.Config);

            if (_config.config.type == 1)
            {
                int[] numberConfig = ((List<dynamic>)_config.config.data).Select(d => d).ToList().ConvertAll(d => (int)Convert.ToInt32(d.ToString())).ToArray();
                _dieuchinhDetail.NgayOrThu = JsonConvert.SerializeObject(numberConfig);
            }
            string[] numberSoBao = ((List<dynamic>)_config.content.data).Select(d => d.number).ToList().ConvertAll(d => (string)d.ToString()).ToArray();
            _dieuchinhDetail.SoBao = JsonConvert.SerializeObject(numberSoBao);
            List<BKeHoachXuatBanDetail> _kehoach = getKeHoachXuatBanDetail(_dieuchinh.ThongTinBaoId, _dieuchinh.Nam, _dieuchinh.Quy).ToList();
            foreach (var item in _kehoach.Where(d => numberSoBao.Contains(d.SoBao)))
            {
                item.status = (int)Enums.KeHoachXuatBan.cancel;
                item.GhiChu = _dieuchinhDetail.GhiChu;
            }
            var _keHoachNoGroup = _kehoach.Where(d => d.Number != -1).ToList();
            List<BKeHoachXuatBanDetail> _kehoachUpateNumber = _keHoachNoGroup.Where(d => d.status != (int)Enums.KeHoachXuatBan.cancel).ToList();
            if (_kehoachUpateNumber.Count > 0)
            {
                int numberCancelFirst = _keHoachNoGroup.Where(d => d.status == (int)Enums.KeHoachXuatBan.group).Count() > 0 ? _keHoachNoGroup.Where(d => d.status == (int)Enums.KeHoachXuatBan.group).FirstOrDefault().Number : -1;
                int numberStart = numberCancelFirst == -1 ? _kehoachUpateNumber[0].Number : numberCancelFirst < _kehoachUpateNumber[0].Number ? numberCancelFirst : _kehoachUpateNumber[0].Number;
                foreach (var item in _kehoachUpateNumber)
                {
                    item.Number = numberStart;
                    numberStart++;
                }
                foreach (var item in _kehoach.Where(d => d.Number == -1 && d.status == (int)Enums.KeHoachXuatBan.group).ToList())
                {
                    item.SoXuatBan = string.Join(",", _kehoachUpateNumber.Where(d => d.DonSo != null && d.DonSo.Equals(item.SoBao)).Select(d => d.Number));
                }
            }
            db.BDieuChinhKHXBDetails.Add(_dieuchinhDetail);
            db.SaveChanges();
        }
        /// <summary>
        /// Điểu chỉnh dồn số
        /// </summary>
        /// <param name="_dieuchinhDetail"></param>
        /// <param name="_dieuchinh"></param>
        /// <param name="_config"></param>
        /// <modify>
        /// Author  Date    Comment
        /// Anhhn   3/8/15  Tách từ CreateDieuChinhKHXBDetail
        /// </modify>
        private void DCDonSo(BDieuChinhKHXBDetail _dieuchinhDetail, BDieuChinhKHXB _dieuchinh)
        {
            //Đọc dữ liệu thiếp lập điều chỉnh
            dynamic _config = JsonConvert.DeserializeObject<ExpandoObject>(_dieuchinhDetail.Config);

            if (_config.config.type == 1)
            {
                int[] numberConfig = ((List<dynamic>)_config.config.data).Select(d => d).ToList().ConvertAll(d => (int)Convert.ToInt32(d.ToString())).ToArray();
                _dieuchinhDetail.NgayOrThu = JsonConvert.SerializeObject(numberConfig);
            }
            List<BKeHoachXuatBanDetail> _kehoach = getKeHoachXuatBanDetail(_dieuchinh.ThongTinBaoId, _dieuchinh.Nam, _dieuchinh.Quy).ToList();
            List<BKeHoachXuatBanDetail> khxbdetailAdd = new List<BKeHoachXuatBanDetail>();
            List<string> numberSoBao = new List<string>();
            foreach (var item in _config.content.data)
            {
                string[] arNum = ((List<object>)item.data).Select(d => d.ToString()).ToArray();
                numberSoBao.AddRange(arNum);
                BKeHoachXuatBanDetail _detailNew = new BKeHoachXuatBanDetail();
                foreach (var itemNumber in _kehoach.Where(d => arNum.Contains(d.SoBao)))
                {
                    itemNumber.DonSo = item.id;
                    itemNumber.GiaBao = _dieuchinhDetail.GiaBao;
                    itemNumber.TrongLuong = _dieuchinhDetail.TrongLuong;
                    itemNumber.SoTrang = _dieuchinhDetail.SoTrang;
                    itemNumber.KichThuoc = _dieuchinhDetail.KichThuoc;
                    itemNumber.GhiChu = _dieuchinhDetail.GhiChu;
                    itemNumber.Details = _dieuchinhDetail.NoiDung;
                    itemNumber.status = (int)Enums.KeHoachXuatBan.group;

                    _detailNew.ThongTinBaoId = itemNumber.ThongTinBaoId;
                    _detailNew.Nam = itemNumber.Nam;
                    _detailNew.Quy = itemNumber.Quy;
                    _detailNew.DonSo = item.id;

                    _detailNew.GiaBao = _dieuchinhDetail.GiaBao;
                    _detailNew.TrongLuong = _dieuchinhDetail.TrongLuong;
                    _detailNew.SoTrang = _dieuchinhDetail.SoTrang;
                    _detailNew.KichThuoc = _dieuchinhDetail.KichThuoc;

                    _detailNew.GhiChu = _dieuchinhDetail.GhiChu;
                    _detailNew.Details = _dieuchinhDetail.NoiDung;
                    _detailNew.status = (int)Enums.KeHoachXuatBan.group;
                    _detailNew.SoBao = item.id;

                }
                int[] _dateS = ((string)item.time).Split('/').Select(d => Convert.ToInt32(d)).ToArray();
                DateTime _time = new DateTime(_dateS[2], _dateS[1], _dateS[0]);
                _detailNew.Number = -1;
                _detailNew.SoXuatBan = string.Join(",", arNum);
                _detailNew.Thang = _dateS[1];
                _detailNew.Ngay = _dateS[0];
                _detailNew.Thu = ((int)_time.DayOfWeek) == 0 ? 8 : ((int)_time.DayOfWeek) + 1;
                khxbdetailAdd.Add(_detailNew);
            }
            _dieuchinhDetail.SoBao = JsonConvert.SerializeObject(numberSoBao);
            db.BDieuChinhKHXBDetails.Add(_dieuchinhDetail);
            db.BKeHoachXuatBanDetails.AddRange(khxbdetailAdd);
            db.SaveChanges();
        }
 public void updateOldChiTiet(BKeHoachXuatBanDetail item, BDieuChinhKHXBDetail dieuChinhOld)
 {
     BDieuChinhKHXBDetail _dieuchinhDetail = db.BDieuChinhKHXBDetails.Where(d => !d.Id.Equals(dieuChinhOld.Id) && !d.DieuChinhKHXBId.Equals(dieuChinhOld.DieuChinhKHXBId) && d.SoBao.IndexOf("\"" + item.SoBao + "\"") > -1 && (d.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.changed || d.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.add || d.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.group)).OrderByDescending(d => d.ModifyDate).FirstOrDefault();
     if (_dieuchinhDetail == null)
     {
         item.GiaBao = null;
         item.TrongLuong = null;
         item.SoTrang = null;
         item.KichThuoc = null;
         item.GhiChu = null;
         item.Details = null;
     }
     else
     {
         item.GiaBao = _dieuchinhDetail.GiaBao;
         item.TrongLuong = _dieuchinhDetail.TrongLuong;
         item.SoTrang = _dieuchinhDetail.SoTrang;
         item.KichThuoc = _dieuchinhDetail.KichThuoc;
         item.GhiChu = _dieuchinhDetail.GhiChu;
         item.Details = _dieuchinhDetail.NoiDung;
     }
 }
        /// <summary>
        /// Copy điều chỉnh cùng kỳ năm trước
        /// </summary>
        /// <param name="dcId">Id điều chỉnh của quý đang điều chỉnh</param>
        /// <param name="baoId">Id của báo đang điều chỉnh</param>
        /// <param name="year">Nam điều chỉnh</param>
        /// <param name="quy">Tháng điều chỉnh</param>
        /// <param name="userId">Người điều chỉnh</param>
        /// <modify>
        /// Author  Date    Commnet
        /// Anhhn   3/8/15  Tạo mới    
        /// </modify>
        private void CopyDCCungKyNamTruoc(BDieuChinhKHXB _dieuchinh, string userId)
        {
            //Lấy điều chỉnh cùng ký năm trước
            BDieuChinhKHXB dcOld = db.BDieuChinhKHXBs.Include(dc => dc.BDieuChinhKHXBDetails).Where(dc => dc.ThongTinBaoId == _dieuchinh.ThongTinBaoId
                && dc.Nam == (_dieuchinh.Nam - 1) && dc.Quy == _dieuchinh.Quy).FirstOrDefault();
            if (dcOld == null || dcOld.BDieuChinhKHXBDetails == null || dcOld.BDieuChinhKHXBDetails.Count == 0)
                return;
            foreach (BDieuChinhKHXBDetail dcDeatil in dcOld.BDieuChinhKHXBDetails)
            {
                BDieuChinhKHXBDetail newDCDetail = new BDieuChinhKHXBDetail()
                {
                    Id = Guid.NewGuid().ToString(),
                    DieuChinhKHXBId = _dieuchinh.Id,
                    LoaiDieuChinh = dcDeatil.LoaiDieuChinh,
                    GiaBao = dcDeatil.GiaBao,
                    KichThuoc = dcDeatil.KichThuoc,
                    TrongLuong = dcDeatil.TrongLuong,
                    SoTrang = dcDeatil.SoTrang,
                    GhiChu = dcDeatil.GhiChu,
                    Config = dcDeatil.Config,
                    NoiDung = dcDeatil.NoiDung,
                    NgayOrThu = dcDeatil.NgayOrThu,
                    SoBao = dcDeatil.SoBao
                };

                //Hủy số
                if (newDCDetail.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.cancel)
                {
                    DCHuySo(newDCDetail, _dieuchinh);
                }
                //Dồn số
                else if (newDCDetail.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.group)
                {
                    DCDonSo(newDCDetail, _dieuchinh);
                }
                //Số ra riêng
                else if (newDCDetail.LoaiDieuChinh == (int)Enums.KeHoachXuatBan.add)
                {
                    DCSoRaRieng(newDCDetail, _dieuchinh);
                }
                //Thay đổi thông tin báo
                else
                {
                    DCThongTinBao(newDCDetail, _dieuchinh);
                }
            }
        }