// GET: CardLogs/Details/5
        public JsonResult Details(int?id)
        {
            if (id == null)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return(Json("Could not find object", JsonRequestBehavior.AllowGet));
            }
            CardLog CardLog = db.CardLogs.Find(id);

            if (CardLog == null)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return(Json("Could not find object", JsonRequestBehavior.AllowGet));
            }
            return(Json(new CardLog {
                Id = CardLog.Id,
                CardId = CardLog.CardId,
                Time = CardLog.Time,
                CardInfo = new CardInfo {
                    Id = CardLog.Id,
                    IdNumber = CardLog.CardInfo.IdNumber,
                    Number = CardLog.CardInfo.Number
                },
                DeviceId = CardLog.DeviceId,
                Device = new Device
                {
                    Id = CardLog.Device.Id,
                    Name = CardLog.Device.Name
                }
            }, JsonRequestBehavior.AllowGet));
        }
 public JsonResult Edit(CardLog cardLog)
 {
     if (ModelState.IsValid)
     {
         db.Entry(cardLog).State = EntityState.Modified;
         db.SaveChanges();
         return(Json(cardLog));
     }
     Response.StatusCode = (int)HttpStatusCode.BadRequest;
     return(Json("Invalid Model State"));
 }
 public JsonResult Create(CardLog cardLog)
 {
     cardLog.Time = DateTime.Now;
     if (ModelState.IsValid)
     {
         db.CardLogs.Add(cardLog);
         db.SaveChanges();
         return(Json(cardLog));
     }
     Response.StatusCode = (int)HttpStatusCode.BadRequest;
     return(Json("Invalid Model State"));
 }
        public ActionResult Delete(int id)
        {
            CardLog cardLog = db.CardLogs.Find(id);

            if (cardLog == null)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return(Json(new { jobId = -1 }));
            }
            db.CardLogs.Remove(cardLog);
            db.SaveChanges();
            return(Json(cardLog));
        }
示例#5
0
        public void Execute(IJobExecutionContext context)
        {
            try
            {
                AutoSubscribJob autosubscr = new AutoSubscribJob();
                autosubscr.Execute(null);
            }
            catch (Exception ex)
            {
            }
            int coeff = 30;// DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);

            using (DataContext _db = new DataContext())
            {
                _db.Database.CommandTimeout = 10000;
                using (DbContextTransaction tran = _db.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
                {
                    try
                    {
                        var      _params                   = _db.Params.ToList();
                        string[] charge_vals               = _params.First(c => c.Name == "CardCharge").Value.Split(':');
                        string[] address                   = _params.Where(c => c.Name == "CASAddress").Select(c => c.Value).First().Split(':');
                        int      closed_card_days          = int.Parse(_params.First(c => c.Name == "ClosedCardDays").Value);
                        decimal  closed_daily_amount       = decimal.Parse(_params.First(c => c.Name == "CloseCardDailyAmount").Value);
                        int      closed_daily_amount_limit = int.Parse(_params.First(c => c.Name == "CloseCardDailyAmountLimit").Value);
                        decimal  jurid_limit_months        = decimal.Parse(_params.First(c => c.Name == "JuridLimitMonths").Value);
                        int      service_days              = int.Parse(_params.First(c => c.Name == "ServiceDays").Value);
                        decimal  close_amount              = decimal.Parse(_params.First(p => p.Name == "CloseCardAmount").Value);
                        int      free_days                 = Convert.ToInt32(_params.First(p => p.Name == "FreeDays").Value);
                        int      block_card_days           = Convert.ToInt32(_params.First(p => p.Name == "BlockCardDays").Value);
                        coeff = Convert.ToInt32(_db.Params.First(p => p.Name == "ServiceDays").Value);
                        int?closed_card_limit = Convert.ToInt32(_db.Params.First(p => p.Name == "ClosedCardsLimit").Value);

                        if (closed_card_limit == null)
                        {
                            closed_card_limit = 60;
                        }

                        File.AppendAllText(@"C:\DigitalTV\log.txt", "start: " + DateTime.Now.ToString() + "\r\n");

                        DateTime today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, int.Parse(charge_vals[0]), int.Parse(charge_vals[1]), 0); //DateTime.Parse("2016-12-16 00:01:00", CultureInfo.InvariantCulture);//
                        //if (_db.CardCharges.Any(c => c.Tdate == today))
                        //{
                        //    File.AppendAllText(@"C:\TVMobile\log.txt", "return ");
                        //    return;
                        //}
                        var _blocked_cards = _db.Customers.Select(c => new { Cards = c.Cards.Where(p => p.CardStatus != CardStatus.Canceled && p.CardStatus != CardStatus.Blocked) })
                                             .Where(c => c.Cards.Any(s => (s.Payments.Select(p => p.Amount).DefaultIfEmpty().Sum() - s.CardCharges.Select(p => p.Amount).DefaultIfEmpty().Sum() < 0 && c.Cards.Any(p => p.CardStatus == CardStatus.Closed))))
                                             .SelectMany(c => c.Cards).GroupBy(c => c.CustomerId).ToList();

                        SendMiniSMS sendMiniSMS = new SendMiniSMS();
                        CASSocket   _socket     = new CASSocket()
                        {
                            IP = address[0], Port = int.Parse(address[1])
                        };
                        //_socket.Connect();

                        //foreach (var group in _blocked_cards)
                        //{
                        //    if (!group.Any(g => g.CardStatus == CardStatus.Closed && (today - g.CloseDate).Days == block_card_days))
                        //        continue;
                        //    foreach (Card _card in group)
                        //    {
                        //        if (_card.CardStatus == CardStatus.Active)
                        //        {
                        //            //original code
                        //            //decimal amount = (decimal)(_db.Subscribtions.Include("SubscriptionPackages.Package").Where(s => s.CardId == _card.Id).FirstOrDefault(s => s.Status).Amount / coeff);

                        //            decimal amount = (decimal)(_db.Subscribtions.Include("SubscriptionPackages.Package").Where(s => s.CardId == _card.Id).FirstOrDefault(s => s.Status).Amount / coeff/ Utils.Utils.divide_card_charge_interval);
                        //            amount -= (amount * (decimal)_card.Discount / 100);
                        //            if (amount <= 0)
                        //                continue;
                        //            _db.CardCharges.Add(new CardCharge() { CardId = _card.Id, Amount = amount, Tdate = today, Status = CardChargeStatus.Daily });
                        //        }

                        //        _db.CardLogs.Add(new CardLog() { CardId = _card.Id, Date = today, Status = CardLogStatus.BlockToMinusBalance, UserId = 1, CardStatus = _card.CardStatus });

                        //        _card.CardStatus = CardStatus.Blocked;
                        //        _db.Entry(_card).State = System.Data.Entity.EntityState.Modified;

                        //        if (!_socket.SendCardStatus(Convert.ToInt32(_card.CardNum), false, DateTime.SpecifyKind(today, DateTimeKind.Utc)))
                        //        {
                        //            _db.ChargeCrushLogs.Add(new ChargeCrushLog
                        //            {
                        //                Date = today,
                        //                CardNum = _card.CardNum,
                        //                ChargeCrushLogType = Models.ChargeCrushLogType.Block,
                        //                Text = "ბარათი: " + _card.CardNum + ";" + _card.AbonentNum
                        //            });
                        //        }
                        //    }
                        //}

                        _db.SaveChanges();
                        //_socket.Disconnect();


                        var _cards = _db.Cards.Where(c => c.CardStatus != CardStatus.Canceled).Select(c => new CardDetailData
                        {
                            CustomerType         = c.Customer.Type,
                            IsBudget             = c.Customer.IsBudget,
                            SubscribAmount       = c.Subscribtions.FirstOrDefault(s => s.Status).Amount,
                            CasIds               = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Select(sp => (short)sp.Package.CasId),
                            PaymentAmount        = c.Payments.Sum(p => (decimal?)p.Amount) ?? 0,
                            ChargeAmount         = c.CardCharges.Select(s => (decimal?)s.Amount).Sum() ?? 0,
                            Card                 = c,
                            MinPrice             = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Sum(p => p.Package.MinPrice),
                            ServiceAmount        = c.CardCharges.Where(s => s.Status == CardChargeStatus.Service).Select(s => (decimal?)s.Amount).Sum() ?? 0,
                            WithoutServiceAmount = c.CardCharges.Where(s => s.Status != CardChargeStatus.Service).Select(s => (decimal?)s.Amount).Sum() ?? 0,
                            CardServices         = c.CardServices.ToList()
                        }).ToList();

                        _socket.Connect();
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Closed))
                        {
                            //if(_card.Card.ClosedIsPen != null)
                            //if ((bool)_card.Card.ClosedIsPen)
                            //{
                            //    if (!(_card.CustomerType == CustomerType.Juridical && _card.IsBudget))
                            //    {
                            //        if (closed_daily_amount > 0)
                            //        {
                            //            if ((today - _card.Card.CloseDate).Days <= closed_daily_amount_limit)
                            //            {
                            //                _db.CardCharges.Add(new CardCharge() { CardId = _card.Card.Id, Amount = closed_daily_amount, Tdate = today, Status = CardChargeStatus.PenDaily });
                            //            }
                            //        }
                            //    }

                            //    if ((today - _card.Card.CloseDate).Days == closed_card_days)
                            //    {
                            //        _db.CardCharges.Add(new CardCharge() { CardId = _card.Card.Id, Amount = close_amount, Tdate = today, Status = CardChargeStatus.Pen });
                            //    }
                            //}

                            Subscribtion sb = _db.Subscribtions.Where(s => s.CardId == _card.Card.Id && s.Status == true).First();
                            List <SubscriptionPackage> sbp = _db.SubscriptionPackages.Include("Package").Where(s => s.SubscriptionId == sb.Id).ToList();
                            //Package package = _db.Packages.Where(p => p.Id == sbp.PackageId).First();

                            //if (_card.CustomerType != CustomerType.Juridical)
                            {
                                //Subscribtion subscribe = _card.Card.Subscribtions.Where(s => s.Status == true).FirstOrDefault();
                                //if(subscribe != null)
                                //{
                                //    if(subscribe.SubscriptionPackages.Any(s => s.Package.Name.Contains("აქცია 8")) && (subscribe.Tdate.Day == today.Day && subscribe.Tdate.Month == today.Month && subscribe.Tdate.Year == today.Year))
                                //    {
                                //        continue;
                                //    }
                                //}

                                if (sbp.Any(p => p.Package.RentType == RentType.rent))
                                {
                                    if ((today - _card.Card.CloseDate).Days <= closed_card_limit)
                                    {
                                        _db.CardCharges.Add(new CardCharge()
                                        {
                                            CardId = _card.Card.Id, Amount = Math.Round((decimal)0.10, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                        });
                                    }
                                    else
                                    {
                                        //this.AddLoging(_db,
                                        //     LogType.Card,
                                        //     LogMode.CardDeal,
                                        //     user_id,
                                        //     _card.Card.Id,
                                        //     _card.Card.AbonentNum + " - ბარათი დაიბლოკა",
                                        //     new List<LoggingData>() { new LoggingData { field = "", new_val = "ბარათი დაიბლოკა", old_val = "" } }
                                        //  );


                                        if (!_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), false, DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc)))
                                        {
                                            //throw new Exception(_card.Card.CardNum + ": ბარათი ვერ დაიბლოკა!");

                                            _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                            {
                                                Date               = today,
                                                CardNum            = _card.Card.CardNum,
                                                ChargeCrushLogType = ChargeCrushLogType.Block,
                                                Text               = _card.Card.CardNum + ": ბარათი ვერ დაიბლოკა! Cas შეცდომის კოდი: " + _socket.error_code + " , Exeption Message: " + _socket.ErrorEx
                                            });
                                        }
                                        else
                                        {
                                            CardLog _log = new CardLog()
                                            {
                                                CardId = _card.Card.Id, Date = DateTime.Now, Status = CardLogStatus.Blocked, UserId = 1, CardStatus = _card.Card.CardStatus
                                            };
                                            _db.CardLogs.Add(_log);

                                            _card.Card.CardStatus       = CardStatus.Blocked;
                                            _db.Entry(_card.Card).State = EntityState.Modified;

                                            Logging _logging = new Logging
                                            {
                                                Tdate     = DateTime.Now,
                                                Type      = LogType.Card,
                                                UserId    = 1,
                                                Mode      = LogMode.CardDeal,
                                                TypeId    = _card.Card.Id,
                                                TypeValue = _card.Card.AbonentNum + " - ბარათი დაიბლოკა(სისტემა)"
                                            };
                                            _db.Loggings.Add(_logging);
                                            _db.SaveChanges();

                                            _db.LoggingItems.AddRange(new List <LoggingData>()
                                            {
                                                new LoggingData {
                                                    field = "", new_val = "ბარათი დაიბლოკა(სისტემა)", old_val = ""
                                                }
                                            }.Where(c => c.field != null).Select(c => new LoggingItem
                                            {
                                                LoggingId     = _logging.Id,
                                                ColumnDisplay = c.field.Replace(':', ' ').Trim(),
                                                NewValue      = c.new_val,
                                                OldValue      = c.old_val
                                            }));

                                            decimal balance = (_card.PaymentAmount - _card.ChargeAmount);
                                            string  phone   = _db.Customers.Where(c => c.Id == _card.Card.CustomerId).First().Phone1;
                                            //MessageTemplate message = _db.MessageTemplates.Single(m => m.Name == "OnBlock");
                                            //string message_desc = message.Desc; // String.Format(message.Desc, Math.Round((balance), 2));
                                            //Task.Run(async () => { await Utils.Utils.sendMessage(phone, message_desc); }).Wait();
                                        }
                                    }
                                }
                            }
                        }
                        _db.SaveChanges();
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Rent))
                        {
                            if (_card.Card.RentFinishDate <= today && _card.CustomerType != CustomerType.Technic)
                            {
                                _card.Card.CardStatus       = CardStatus.Closed;
                                _card.Card.CloseDate        = today;
                                _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                _db.CardCharges.Add(new CardCharge()
                                {
                                    CardId = _card.Card.Id, Amount = Math.Round((decimal)0.10, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                });
                                _db.CardLogs.Add(new CardLog()
                                {
                                    CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                });
                            }
                            else
                            {
                                RentAccrualsPresentation rentAccrualsPresentation = new RentAccrualsPresentation(_db);
                                if (rentAccrualsPresentation.RentBalance(_card.Card.Id) >= rentAccrualsPresentation.RentDayAmount())
                                {
                                    rentAccrualsPresentation.CardAccruals(_card);
                                }
                            }
                        }
                        _db.SaveChanges();
                        //paused_cards
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Paused))
                        {
                            if (_card.Card.PauseDate.AddDays(_card.Card.PauseDays) <= today)
                            {
                                bool status_sign = (_card.PaymentAmount - _card.ChargeAmount) >= (decimal)_card.MinPrice / 30m;

                                _card.Card.CardStatus = status_sign ? CardStatus.Active : CardStatus.Closed;
                                _card.Card.PauseDays  = 0;


                                CardLog _log = new CardLog(); /*{ CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Open, UserId = 1 };*/
                                RentAccrualsPresentation rentAccrualsPresentation = new RentAccrualsPresentation(_db);
                                if (_card.Card.CardStatus == CardStatus.Closed && rentAccrualsPresentation.RentBalance(_card.Card.Id) >= rentAccrualsPresentation.RentDayAmount())
                                {
                                    rentAccrualsPresentation.CardAccruals(_card);
                                    rentAccrualsPresentation.RentFinishDat(_card);
                                }
                                if (_card.Card.CardStatus == CardStatus.Closed)
                                {
                                    _log.CardId = _card.Card.Id;
                                    _log.Date   = today;
                                    _log.Status = CardLogStatus.Close;
                                    _log.UserId = 1;

                                    _card.Card.CloseDate = today;
                                }
                                else if (_card.Card.CardStatus == CardStatus.Active)
                                {
                                    _log.CardId = _card.Card.Id;
                                    _log.Date   = today;
                                    _log.Status = CardLogStatus.Open;
                                    _log.UserId = 1;
                                }


                                _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                _db.CardLogs.Add(_log);

                                if (!_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), true, DateTime.SpecifyKind(today, DateTimeKind.Utc)))
                                {
                                    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                    {
                                        Date               = today,
                                        CardNum            = _card.Card.CardNum,
                                        ChargeCrushLogType = Models.ChargeCrushLogType.Open,
                                        Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                    });
                                }

                                //if (status_sign)
                                //{
                                //    if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.SpecifyKind(_card.Card.CasDate, DateTimeKind.Utc), false))
                                //    {
                                //        _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                //        {
                                //            Date = today,
                                //            CardNum = _card.Card.CardNum,
                                //            ChargeCrushLogType = Models.ChargeCrushLogType.EntitlementClose,
                                //            Text = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                //        });
                                //    }

                                //    System.Threading.Thread.Sleep(2000);
                                //    if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.SpecifyKind(_card.Card.CasDate, DateTimeKind.Utc), true))
                                //    {
                                //        _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                //        {
                                //            Date = today,
                                //            CardNum = _card.Card.CardNum,
                                //            ChargeCrushLogType = Models.ChargeCrushLogType.EntitlementOpen,
                                //            Text = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                //        });
                                //    }
                                //}
                            }
                        }
                        _db.SaveChanges();

                        //montaged c
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.FreeDays))
                        {
                            bool is_open = true;
                            if (_card.Card.Tdate.AddDays(free_days) < today)
                            {
                                decimal balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                double  amount  = _card.SubscribAmount - (_card.SubscribAmount * (double)_card.Card.Discount / 100);
                                if ((double)balance >= amount || _card.IsBudget || _card.CustomerType == CustomerType.Technic)
                                {
                                    _card.Card.CardStatus = CardStatus.Active;
                                    _db.CardLogs.Add(new CardLog()
                                    {
                                        CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Open, UserId = 1
                                    });
                                    _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                    Utils.Utils.SetFinishDate(_db, jurid_limit_months, _card.Card.Id);

                                    //original code
                                    //if (!_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), true, DateTime.Now))
                                    //{

                                    //}
                                }
                                else
                                {
                                    is_open = false;
                                    _card.Card.CardStatus       = CardStatus.Closed;
                                    _card.Card.CloseDate        = today;
                                    _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                    _db.CardLogs.Add(new CardLog()
                                    {
                                        CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                    });
                                }

                                if (is_open)
                                {
                                    if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.Now.AddHours(-4), _card.Card.FinishDate.AddHours(-4), true))
                                    {
                                        //throw new Exception("ბარათი ვერ გააქტიურდა:" + _card.Card.CardNum);
                                        _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                        {
                                            Date               = today,
                                            CardNum            = _card.Card.CardNum,
                                            ChargeCrushLogType = is_open ? ChargeCrushLogType.EntitlementOpen : ChargeCrushLogType.EntitlementClose,
                                            Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                        });
                                    }

                                    //if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.SpecifyKind(_card.Card.CasDate, DateTimeKind.Utc), false))
                                    //{
                                    //    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                    //    {
                                    //        Date = today,
                                    //        CardNum = _card.Card.CardNum,
                                    //        ChargeCrushLogType = is_open ? ChargeCrushLogType.EntitlementOpen : ChargeCrushLogType.EntitlementClose,
                                    //        Text = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                    //    });
                                    //}
                                }
                            }
                            else
                            {
                                foreach (var c_s in _card.CardServices)
                                {
                                    if (c_s.IsActive || Utils.Utils.GetServiceBalance(_card.PaymentAmount, _card.ServiceAmount, _card.WithoutServiceAmount) < 0)
                                    {
                                        if (c_s.Date.AddDays(service_days).Date <= today.Date)
                                        {
                                            decimal balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                            if (c_s.IsActive)
                                            {
                                                CardCharge _charge = new CardCharge {
                                                    Tdate = today, CardId = _card.Card.Id, Status = CardChargeStatus.Service, Amount = c_s.Amount
                                                };
                                                balance -= _charge.Amount;
                                                _db.CardCharges.Add(_charge);

                                                c_s.IsActive         = false;
                                                _db.Entry(c_s).State = EntityState.Modified;
                                            }

                                            if (balance < 0)
                                            {
                                                _card.Card.CardStatus       = CardStatus.Blocked;
                                                _db.Entry(_card.Card).State = EntityState.Modified;

                                                _db.CardLogs.Add(new CardLog()
                                                {
                                                    CardId = _card.Card.Id, Date = today, Status = CardLogStatus.BlockToService, UserId = 1
                                                });

                                                if (!_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), false, DateTime.SpecifyKind(today, DateTimeKind.Utc)))
                                                {
                                                    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                                    {
                                                        Date               = today,
                                                        CardNum            = _card.Card.CardNum,
                                                        ChargeCrushLogType = ChargeCrushLogType.Block,
                                                        Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                                    });
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        _db.SaveChanges();

                        //active cards
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Active))
                        {
                            bool has_s = false;
                            foreach (var c_s in _card.CardServices.Where(c => c.IsActive))
                            {
                                if (c_s.Date.AddDays(service_days).Date <= today.Date)
                                {
                                    _db.CardCharges.Add(new CardCharge {
                                        Tdate = today, CardId = _card.Card.Id, Status = CardChargeStatus.Service, Amount = c_s.Amount
                                    });

                                    c_s.IsActive         = false;
                                    _db.Entry(c_s).State = EntityState.Modified;
                                }
                                has_s = true;
                            }
                            _db.SaveChanges();

                            if (has_s)
                            {
                                Utils.Utils.SetFinishDate(_db, jurid_limit_months, _card.Card.Id);
                            }

                            if (_card.CustomerType != CustomerType.Juridical)
                            {
                                if (_card.Card.FinishDate <= today && _card.CustomerType != CustomerType.Technic) //&& _card.CustomerType != CustomerType.Technic
                                {
                                    RentAccrualsPresentation rentAccrualsPresentation = new RentAccrualsPresentation(_db);
                                    if (rentAccrualsPresentation.RentBalance(_card.Card.Id) >= rentAccrualsPresentation.RentDayAmount())
                                    {
                                        rentAccrualsPresentation.CardAccruals(_card);
                                        rentAccrualsPresentation.RentFinishDat(_card);
                                    }
                                    else
                                    {
                                        if (_card.SubscribAmount != 12)
                                        {
                                            _db.CardCharges.Add(new CardCharge()
                                            {
                                                CardId = _card.Card.Id, Amount = Math.Round((decimal)0.10, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                            });
                                        }
                                        _card.Card.CardStatus       = CardStatus.Closed;
                                        _card.Card.CloseDate        = today;
                                        _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;

                                        foreach (var c_s in _card.CardServices.Where(c => c.IsActive))
                                        {
                                            if (c_s.Date.AddDays(service_days).Date > today.Date)
                                            {
                                                _db.CardCharges.Add(new CardCharge {
                                                    Tdate = today, CardId = _card.Card.Id, Status = CardChargeStatus.Service, Amount = c_s.Amount
                                                });
                                                _db.CardLogs.Add(new CardLog()
                                                {
                                                    CardId = _card.Card.Id, Date = today, Status = CardLogStatus.CloseToService, UserId = 1
                                                });

                                                c_s.IsActive         = false;
                                                _db.Entry(c_s).State = EntityState.Modified;
                                            }
                                        }

                                        _db.CardLogs.Add(new CardLog()
                                        {
                                            CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                        });

                                        //if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), _card.Card.FinishDate.AddHours(-4), _card.Card.FinishDate.AddHours(-4), true))
                                        ////if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.SpecifyKind(_card.Card.CasDate, DateTimeKind.Utc), false))
                                        //{
                                        //    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                        //    {
                                        //        Date = today,
                                        //        CardNum = _card.Card.CardNum,
                                        //        ChargeCrushLogType = ChargeCrushLogType.EntitlementClose,
                                        //        Text = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                        //    });
                                        //}
                                    }
                                }

                                if (_card.Card.CardStatus == CardStatus.Active && _card.CustomerType != CustomerType.Technic)  //&& _card.CustomerType != CustomerType.Technic
                                {
                                    //original code
                                    //decimal amount = (decimal)(_card.SubscribAmount / coeff);

                                    decimal amount = (decimal)(_card.SubscribAmount / coeff / Utils.Utils.divide_card_charge_interval);

                                    amount -= (amount * (decimal)_card.Card.Discount / 100);
                                    if (amount <= 0)
                                    {
                                        continue;
                                    }
                                    _db.CardCharges.Add(new CardCharge()
                                    {
                                        CardId = _card.Card.Id, Amount = amount, Tdate = today, Status = CardChargeStatus.Daily
                                    });
                                }
                            }
                            else
                            {
                                bool   has_inough = false;
                                int    pay_count  = _db.Payments.Where(p => p.CardId == _card.Card.Id).Count();
                                double min_price  = pay_count == 1 ? _card.SubscribAmount : _card.MinPrice;
                                min_price -= (min_price * (double)_card.Card.Discount / 100);

                                decimal  balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                DateTime _dt     = DateTime.Now;

                                if ((double)balance >= min_price)
                                {
                                    has_inough = true;
                                }

                                if (_dt.Day == 1)
                                {
                                    balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                    if (balance >= 0)
                                    {
                                        Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                    }
                                }

                                int diff_days = (_card.Card.FinishDate - _dt).Days;

                                if (_dt.Day > 1 && _dt.Day < 10 /*6*/)
                                {
                                    if (diff_days < 25)
                                    {
                                        balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                        if (balance >= 0)
                                        {
                                            Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                        }
                                    }
                                }

                                if (_dt.Day == 10 /*6*/)
                                {
                                    if (diff_days < 25)
                                    {
                                        DateTime f_datefrom         = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1, 0, 0, 0);
                                        DateTime f_dateto           = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 10, 0, 0, 0);
                                        var      CardCahrge_Balance = _db.CardCharges.Where(c => c.CardId == _card.Card.Id && c.Tdate >= f_datefrom && c.Tdate <= f_dateto).Select(s => s.Amount).Sum();
                                        balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                        balance = balance + CardCahrge_Balance;
                                        if (balance >= 0)
                                        {
                                            Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                        }
                                        else
                                        {
                                            RentAccrualsPresentation rentAccrualsPresentation = new RentAccrualsPresentation(_db); // ijara daricxva qartuli arxebi
                                            if (rentAccrualsPresentation.RentBalance(_card.Card.Id) >= rentAccrualsPresentation.RentDayAmount())
                                            {
                                                rentAccrualsPresentation.CardAccruals(_card);
                                                rentAccrualsPresentation.RentFinishDat(_card);
                                            }
                                            else
                                            {
                                                if (_card.SubscribAmount != 12)
                                                {
                                                    _db.CardCharges.Add(new CardCharge()
                                                    {
                                                        CardId = _card.Card.Id, Amount = Math.Round((decimal)0.10, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                                    });
                                                }
                                                _card.Card.CardStatus       = CardStatus.Closed;
                                                _card.Card.CloseDate        = today;
                                                _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                                _db.CardLogs.Add(new CardLog()
                                                {
                                                    CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                                });
                                            }
                                        }
                                    }
                                }

                                if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), _card.Card.CloseDate.AddHours(-4), _card.Card.FinishDate.AddHours(-4), true))
                                //if (!_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.SpecifyKind(_card.Card.CasDate, DateTimeKind.Utc), false))
                                {
                                    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                    {
                                        Date               = today,
                                        CardNum            = _card.Card.CardNum,
                                        ChargeCrushLogType = ChargeCrushLogType.EntitlementClose,
                                        Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                    });
                                }
                                //miniSMS
                                sendMiniSMS.SaveMiniSMSData(Convert.ToInt32(_card.Card.CardNum), _card.Card.Id, _card.CasIds.ToArray(), _card.Card.CloseDate.AddHours(-4), _card.Card.FinishDate.AddHours(-4), (int)CardStatus.Active, true, (int)StatusMiniSMS.Charges);

                                if (_card.Card.CardStatus == CardStatus.Active && _card.CustomerType != CustomerType.Technic)  //&& _card.CustomerType != CustomerType.Technic
                                {
                                    //original code
                                    //decimal amount = (decimal)(_card.SubscribAmount / coeff);

                                    decimal amount = (decimal)(_card.SubscribAmount / coeff / Utils.Utils.divide_card_charge_interval);

                                    amount -= (amount * (decimal)_card.Card.Discount / 100);
                                    if (amount <= 0)
                                    {
                                        continue;
                                    }
                                    _db.CardCharges.Add(new CardCharge()
                                    {
                                        CardId = _card.Card.Id, Amount = amount, Tdate = today, Status = CardChargeStatus.Daily
                                    });
                                }
                            }

                            //if (has_s)
                            //{
                            //    Utils.Utils.SetFinishDate(_db, jurid_limit_months, _card.Card.Id);
                            //}
                        }
                        _db.SaveChanges();

                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Blocked))
                        {
                            Subscribtion sb = _db.Subscribtions.Where(s => s.CardId == _card.Card.Id && s.Status == true).First();
                            List <SubscriptionPackage> sbp = _db.SubscriptionPackages.Include("Package").Where(s => s.SubscriptionId == sb.Id).ToList();
                            //Package package = _db.Packages.Where(p => p.Id == sbp.PackageId).First();

                            //if (_card.CustomerType != CustomerType.Juridical)
                            {
                                if (sbp.Any(p => p.Package.RentType == RentType.rent))
                                {
                                    _db.CardCharges.Add(new CardCharge()
                                    {
                                        CardId = _card.Card.Id, Amount = Math.Round((decimal)0.10, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                    });
                                }
                            }
                        }
                        _db.SaveChanges();

                        _socket.Disconnect();
                        tran.Commit();
                        Task.Run(async() => { await Utils.Utils.sendMessage(_db.Customers.Where(c => c.Code == "01025019391").FirstOrDefault().Phone1, "daricxva - " + DateTime.Now.ToString()); }).Wait();
                        Task.Run(async() => { await Utils.Utils.sendMessage("598733767", "daricxva - " + DateTime.Now.ToString()); }).Wait();
                        Task.Run(async() => { await Utils.Utils.sendMessage("593668668", "daricxva - " + DateTime.Now.ToString()); }).Wait();
                        //Utils.Utils.OnSendAutorizeSMS("599610949", "shesrulda", _params.First(p => p.Name == "SMSUsername").Value, _params.First(p => p.Name == "SMSPassword").Value);
                        //Utils.Utils.OnSendAutorizeSMS("598894533", "shesrulda", _params.First(p => p.Name == "SMSUsername").Value, _params.First(p => p.Name == "SMSPassword").Value);
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        Utils.Utils.ErrorLogging(ex, @"C:\DigitalTV\ChargeCardLog.txt");
                        File.AppendAllText(@"C:\DigitalTV\log.txt", "\r\n" + (ex.Message != null?ex.Message:"null") + "\r\n");
                        File.AppendAllText(@"C:\DigitalTV\log.txt", (ex.InnerException != null ? ex.InnerException.Message : "null") + "\r\n");
                        File.AppendAllText(@"C:\DigitalTV\log.txt", (ex.InnerException != null && ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : "null") + ": Rollback at - " + DateTime.Now.ToString() + "\r\n");
                        File.AppendAllText(@"C:\DigitalTV\log.txt", "\r\n" + (ex.StackTrace != null ? ex.StackTrace : "null") + "\r\n");
                        using (DataContext _db_log = new DataContext())
                        {
                            _db_log.ChargeCrushLogs.Add(new ChargeCrushLog
                            {
                                Date               = DateTime.Now,
                                CardNum            = "",
                                ChargeCrushLogType = ChargeCrushLogType.Crush,
                                Text               = (ex.Message != null ? ex.Message : "null")
                            });
                            _db_log.SaveChanges();
                        }
                    }
                }

                File.AppendAllText(@"C:\DigitalTV\log.txt", "\r\n end: " + DateTime.Now.ToString() + "\r\n");
            }
        }
        public void Execute(IJobExecutionContext context)
        {
            using (DataContext _db = new DataContext())
            {
                _db.Database.CommandTimeout = 10000;
                using (DbContextTransaction tran = _db.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
                {
                    try
                    {
                        //var _cards = _db.Cards.Where(c => c.CardStatus != CardStatus.Canceled).Select(c => new CardDetailData
                        //{
                        //    CustomerType = c.Customer.Type,
                        //    IsBudget = c.Customer.IsBudget,
                        //    SubscribAmount = c.Subscribtions.FirstOrDefault(s => s.Status).Amount,
                        //    CasIds = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Select(sp => (short)sp.Package.CasId),
                        //    PaymentAmount = c.Payments.Sum(p => (decimal?)p.Amount) ?? 0,
                        //    ChargeAmount = c.CardCharges.Select(s => (decimal?)s.Amount).Sum() ?? 0,
                        //    Card = c,
                        //    MinPrice = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Sum(p => p.Package.MinPrice),
                        //    ServiceAmount = c.CardCharges.Where(s => s.Status == CardChargeStatus.Service).Select(s => (decimal?)s.Amount).Sum() ?? 0,
                        //    WithoutServiceAmount = c.CardCharges.Where(s => s.Status != CardChargeStatus.Service).Select(s => (decimal?)s.Amount).Sum() ?? 0,
                        //    CardServices = c.CardServices.ToList()
                        //}).ToList();

                        var _cards             = _db.Cards.Where(c => c.CardStatus != CardStatus.Canceled).ToList();
                        int?closed_card_limit  = Convert.ToInt32(_db.Params.First(p => p.Name == "ClosedCardsLimit").Value);
                        int?blocked_card_limit = Convert.ToInt32(_db.Params.First(p => p.Name == "BlockedCardsLimit").Value);

                        if (closed_card_limit == null)
                        {
                            closed_card_limit = 60;
                        }

                        //foreach (Card _card in _cards.Where(c => c.CardStatus == CardStatus.Closed).ToList())
                        //{
                        //    DateTime dtnow = DateTime.Now;

                        //    if (_card != null)
                        //    {
                        //        TimeSpan diffSpan = dtnow - _card.CloseDate;
                        //        if(diffSpan.Days >= closed_card_limit)
                        //        {
                        //        CardLog _log = new CardLog() { CardId = _card.Id, Date = DateTime.Now, Status = CardLogStatus.Blocked, UserId = 1, CardStatus = _card.CardStatus };
                        //        _db.CardLogs.Add(_log);

                        //        _card.CardStatus = CardStatus.Blocked;
                        //        _db.Entry(_card).State = EntityState.Modified;

                        //        //this.AddLoging(_db,
                        //        //     LogType.Card,
                        //        //     LogMode.CardDeal,
                        //        //     0,
                        //        //     _card.Card.Id,
                        //        //     _card.Card.AbonentNum + " - ბარათი დაიბლოკა",
                        //        //     new List<LoggingData>() { new LoggingData { field = "", new_val = "ბარათი დაიბლოკა", old_val = "" } }
                        //        //  );

                        //        //public long AddLoging(DataContext _db, LogType type, LogMode mode, int user_id, long type_id, string type_value, List<LoggingData> items)
                        //        Logging _logging = new Logging
                        //        {
                        //            Tdate = DateTime.Now,
                        //            Type = LogType.Card,
                        //            UserId = 1,
                        //            Mode = LogMode.CardDeal,
                        //            TypeId = _card.Id,
                        //            TypeValue = _card.AbonentNum + " - ბარათი დაიბლოკა"
                        //        };
                        //        _db.Loggings.Add(_logging);
                        //        _db.SaveChanges();

                        //        _db.LoggingItems.AddRange(new List<LoggingData>() { new LoggingData { field = "", new_val = "ბარათი დაიბლოკა", old_val = "" } }.Where(c => c.field != null).Select(c => new LoggingItem
                        //        {
                        //            LoggingId = _logging.Id,
                        //            ColumnDisplay = c.field.Replace(':', ' ').Trim(),
                        //            NewValue = c.new_val,
                        //            OldValue = c.old_val
                        //        }));

                        //        string[] address = _db.Params.Where(c => c.Name == "CASAddress").Select(c => c.Value).First().Split(':');
                        //        CASSocket _socket = new CASSocket() { IP = address[0], Port = int.Parse(address[1]) };
                        //        _socket.Connect();
                        //        if (!_socket.SendCardStatus(Convert.ToInt32(_card.CardNum), false, DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc)))
                        //        {
                        //            throw new Exception();
                        //        }
                        //        _socket.Disconnect();
                        //        }
                        //    }


                        //}

                        foreach (Card _card in _cards.Where(c => c.CardStatus == CardStatus.Blocked).ToList())
                        {
                            DateTime dtnow = DateTime.Now;

                            if (_card != null)
                            {
                                TimeSpan diffSpan = dtnow - _card.CloseDate;

                                if (diffSpan.Days >= blocked_card_limit)
                                {
                                    _card.CardStatus       = CardStatus.Discontinued;
                                    _db.Entry(_card).State = EntityState.Modified;

                                    CardLog _log = new CardLog()
                                    {
                                        CardId = _card.Id, Date = DateTime.Now, Status = CardLogStatus.Discontinued, UserId = 1
                                    };
                                    _db.CardLogs.Add(_log);

                                    //this.AddLoging(_db,
                                    //    LogType.Card,
                                    //    LogMode.CardDeal,
                                    //    user_id,
                                    //    _card.Id,
                                    //    _card.CardNum + " ის გაუქმება",
                                    //    new List<LoggingData>() { new LoggingData { field = "", new_val = "ბარათის გაუქმება", old_val = "" } }
                                    // );

                                    Logging _logging = new Logging
                                    {
                                        Tdate     = DateTime.Now,
                                        Type      = LogType.Card,
                                        UserId    = 2,
                                        Mode      = LogMode.CardDeal,
                                        TypeId    = _card.Id,
                                        TypeValue = _card.CardNum + " ის შეწყვეტა"
                                    };
                                    _db.Loggings.Add(_logging);
                                    _db.SaveChanges();

                                    _db.LoggingItems.AddRange(new List <LoggingData>()
                                    {
                                        new LoggingData {
                                            field = "", new_val = "ბარათის შეწყევტა", old_val = ""
                                        }
                                    }.Where(c => c.field != null).Select(c => new LoggingItem
                                    {
                                        LoggingId     = _logging.Id,
                                        ColumnDisplay = c.field.Replace(':', ' ').Trim(),
                                        NewValue      = c.new_val,
                                        OldValue      = c.old_val
                                    }));

                                    _db.SaveChanges();
                                }
                            }
                        }

                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();

                        File.AppendAllText(@"C:\DigitalTVBilling\log.txt", "DisableCardsJob error: " + ex.InnerException.InnerException.Message);
                        //using (DataContext _db_log = new DataContext())
                        //{
                        //    _db_log.ChargeCrushLogs.Add(new ChargeCrushLog
                        //    {
                        //        Date = DateTime.Now,
                        //        CardNum = "",
                        //        ChargeCrushLogType = ChargeCrushLogType.Crush,
                        //        Text = ex.Message
                        //    });
                        //    _db_log.SaveChanges();
                        //}
                    }
                }
            }
        }
示例#7
0
        public void Execute(IJobExecutionContext context)
        {
            using (DataContext _db = new DataContext())
            {
                _db.Database.CommandTimeout = 10000;
                using (DbContextTransaction tran = _db.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
                {
                    try
                    {
                        //get parameters
                        var      parameters                = _db.Params.ToList();
                        string[] charge_vals               = parameters.First(c => c.Name == "CardCharge").Value.Split(':');
                        string[] address                   = parameters.Where(c => c.Name == "CASAddress").Select(c => c.Value).First().Split(':');
                        int      closed_card_days          = int.Parse(parameters.First(c => c.Name == "ClosedCardDays").Value);
                        decimal  closed_daily_amount       = decimal.Parse(parameters.First(c => c.Name == "CloseCardDailyAmount").Value);
                        int      closed_daily_amount_limit = int.Parse(parameters.First(c => c.Name == "CloseCardDailyAmountLimit").Value);
                        decimal  jurid_limit_months        = decimal.Parse(parameters.First(c => c.Name == "JuridLimitMonths").Value);
                        int      service_days              = int.Parse(parameters.First(c => c.Name == "ServiceDays").Value);
                        decimal  close_amount              = decimal.Parse(parameters.First(p => p.Name == "CloseCardAmount").Value);
                        int      free_days                 = Convert.ToInt32(parameters.First(p => p.Name == "FreeDays").Value);
                        int      block_card_days           = Convert.ToInt32(parameters.First(p => p.Name == "BlockCardDays").Value);
                        int?     closed_card_limit         = Convert.ToInt32(parameters.First(p => p.Name == "ClosedCardsLimit").Value);
                        int      jurid_pay_waiting_day     = Convert.ToInt32(parameters.First(p => p.Name == "JuridPayWaitingDay").Value);
                        decimal  rent_amount               = Convert.ToInt32(parameters.First(p => p.Name == "RentAmount").Value);
                        decimal  pen_daily_amount          = rent_amount / (decimal)service_days;
                        DateTime today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, int.Parse(charge_vals[0]), int.Parse(charge_vals[1]), 0);

                        CASSocket cas_socket = new CASSocket()
                        {
                            IP = address[0], Port = int.Parse(address[1])
                        };

                        var _cards = _db.Cards.Where(c => c.CardStatus != CardStatus.Canceled).Select(c => new CardDetailData
                        {
                            CustomerType   = c.Customer.Type,
                            SubscribAmount = c.Subscribtions.FirstOrDefault(s => s.Status).Amount,
                            CasIds         = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Select(sp => (short)sp.Package.CasId),
                            PaymentAmount  = c.Payments.Sum(p => (decimal?)p.Amount) ?? 0,
                            ChargeAmount   = c.CardCharges.Select(s => (decimal?)s.Amount).Sum() ?? 0,
                            Card           = c,
                            MinPrice       = c.Subscribtions.FirstOrDefault(s => s.Status).SubscriptionPackages.Sum(p => p.Package.MinPrice)
                        }).ToList();

                        cas_socket.Connect();
                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Closed))
                        {
                            Subscribtion sb = _db.Subscribtions.Where(s => s.CardId == _card.Card.Id && s.Status == true).First();
                            List <SubscriptionPackage> sbp = _db.SubscriptionPackages.Include("Package").Where(s => s.SubscriptionId == sb.Id).ToList();
                            {
                                if (sbp.Any(p => p.Package.RentType == RentType.rent))
                                {
                                    if ((today - _card.Card.CloseDate).Days <= closed_card_limit)
                                    {
                                        _db.CardCharges.Add(new CardCharge()
                                        {
                                            CardId = _card.Card.Id, Amount = Math.Round((decimal)pen_daily_amount, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                        });
                                    }
                                    else
                                    {
                                        if (!cas_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), false, DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc)))
                                        {
                                            _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                            {
                                                Date               = today,
                                                CardNum            = _card.Card.CardNum,
                                                ChargeCrushLogType = ChargeCrushLogType.Block,
                                                Text               = _card.Card.CardNum + ": ბარათი ვერ დაიბლოკა! Cas შეცდომის კოდი: " + cas_socket.error_code + " , Exeption Message: " + cas_socket.ErrorEx
                                            });
                                        }
                                        else
                                        {
                                            CardLog _log = new CardLog()
                                            {
                                                CardId = _card.Card.Id, Date = DateTime.Now, Status = CardLogStatus.Blocked, UserId = 1, CardStatus = _card.Card.CardStatus
                                            };
                                            _db.CardLogs.Add(_log);

                                            _card.Card.CardStatus       = CardStatus.Blocked;
                                            _db.Entry(_card.Card).State = EntityState.Modified;

                                            Logging _logging = new Logging
                                            {
                                                Tdate     = DateTime.Now,
                                                Type      = LogType.Card,
                                                UserId    = 1,
                                                Mode      = LogMode.CardDeal,
                                                TypeId    = _card.Card.Id,
                                                TypeValue = _card.Card.AbonentNum + " - ბარათი დაიბლოკა"
                                            };
                                            _db.Loggings.Add(_logging);
                                            _db.SaveChanges();

                                            _db.LoggingItems.AddRange(new List <LoggingData>()
                                            {
                                                new LoggingData {
                                                    field = "", new_val = "ბარათი დაიბლოკა", old_val = ""
                                                }
                                            }.Where(c => c.field != null).Select(c => new LoggingItem
                                            {
                                                LoggingId     = _logging.Id,
                                                ColumnDisplay = c.field.Replace(':', ' ').Trim(),
                                                NewValue      = c.new_val,
                                                OldValue      = c.old_val
                                            }));
                                        }
                                    }
                                }
                            }
                        }
                        _db.SaveChanges();

                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Paused))
                        {
                            if (_card.Card.PauseDate.AddDays(_card.Card.PauseDays) <= today)
                            {
                                bool status_sign = (_card.PaymentAmount - _card.ChargeAmount) >= (decimal)_card.MinPrice / 30m;

                                _card.Card.CardStatus = status_sign ? CardStatus.Active : CardStatus.Closed;
                                _card.Card.PauseDays  = 0;


                                CardLog _log = new CardLog();

                                if (_card.Card.CardStatus == CardStatus.Closed)
                                {
                                    _log.CardId = _card.Card.Id;
                                    _log.Date   = today;
                                    _log.Status = CardLogStatus.Close;
                                    _log.UserId = 1;

                                    _card.Card.CloseDate = today;
                                }
                                else if (_card.Card.CardStatus == CardStatus.Active)
                                {
                                    _log.CardId = _card.Card.Id;
                                    _log.Date   = today;
                                    _log.Status = CardLogStatus.Open;
                                    _log.UserId = 1;
                                }

                                _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                _db.CardLogs.Add(_log);

                                if (!cas_socket.SendCardStatus(Convert.ToInt32(_card.Card.CardNum), true, DateTime.SpecifyKind(today, DateTimeKind.Utc)))
                                {
                                    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                    {
                                        Date               = today,
                                        CardNum            = _card.Card.CardNum,
                                        ChargeCrushLogType = Models.ChargeCrushLogType.Open,
                                        Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                    });
                                }
                            }
                        }
                        _db.SaveChanges();


                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.FreeDays))
                        {
                            bool is_open = true;
                            if (_card.Card.Tdate.AddDays(free_days) < today)
                            {
                                decimal balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                double  amount  = _card.SubscribAmount - (_card.SubscribAmount * (double)_card.Card.Discount / 100);
                                if ((double)balance >= amount || _card.CustomerType == CustomerType.Technic)
                                {
                                    _card.Card.CardStatus = CardStatus.Active;
                                    _db.CardLogs.Add(new CardLog()
                                    {
                                        CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Open, UserId = 1
                                    });
                                    _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                    Utils.Utils.SetFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                }
                                else
                                {
                                    is_open = false;
                                    _card.Card.CardStatus       = CardStatus.Closed;
                                    _card.Card.CloseDate        = today;
                                    _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                    _db.CardLogs.Add(new CardLog()
                                    {
                                        CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                    });
                                }

                                if (is_open)
                                {
                                    if (!cas_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), DateTime.Now.AddHours(-4), _card.Card.FinishDate.AddHours(-4), true))
                                    {
                                        _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                        {
                                            Date               = today,
                                            CardNum            = _card.Card.CardNum,
                                            ChargeCrushLogType = is_open ? ChargeCrushLogType.EntitlementOpen : ChargeCrushLogType.EntitlementClose,
                                            Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                        });
                                    }
                                }
                            }
                        }
                        _db.SaveChanges();


                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Active))
                        {
                            if (_card.CustomerType != CustomerType.Juridical)
                            {
                                if (_card.Card.FinishDate <= today && _card.CustomerType != CustomerType.Technic)
                                {
                                    _card.Card.CardStatus       = CardStatus.Closed;
                                    _card.Card.CloseDate        = today;
                                    _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;

                                    _db.CardLogs.Add(new CardLog()
                                    {
                                        CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                    });
                                }

                                if (_card.Card.CardStatus == CardStatus.Active && _card.CustomerType != CustomerType.Technic)
                                {
                                    decimal amount = (decimal)(_card.SubscribAmount / service_days / Utils.Utils.divide_card_charge_interval);

                                    amount -= (amount * (decimal)_card.Card.Discount / 100);
                                    if (amount <= 0)
                                    {
                                        continue;
                                    }
                                    _db.CardCharges.Add(new CardCharge()
                                    {
                                        CardId = _card.Card.Id, Amount = amount, Tdate = today, Status = CardChargeStatus.Daily
                                    });
                                }
                            }
                            else
                            {
                                int    pay_count = _db.Payments.Where(p => p.CardId == _card.Card.Id).Count();
                                double min_price = pay_count == 1 ? _card.SubscribAmount : _card.MinPrice;
                                min_price -= (min_price * (double)_card.Card.Discount / 100);

                                decimal  balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                DateTime _dt     = DateTime.Now;

                                if (_dt.Day == 1)
                                {
                                    balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                    if (balance >= 0)
                                    {
                                        Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                    }
                                }

                                int diff_days = (_card.Card.FinishDate - _dt).Days;

                                if (_dt.Day > 1 && _dt.Day < jurid_pay_waiting_day)
                                {
                                    if (diff_days < 30)
                                    {
                                        balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                        if (balance >= 0)
                                        {
                                            Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                        }
                                    }
                                }

                                if (_dt.Day == jurid_pay_waiting_day)
                                {
                                    if (diff_days < 30)
                                    {
                                        DateTime f_datefrom         = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1, 0, 0, 0);
                                        DateTime f_dateto           = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 10, 0, 0, 0);
                                        var      CardCahrge_Balance = _db.CardCharges.Where(c => c.CardId == _card.Card.Id && c.Tdate >= f_datefrom && c.Tdate <= f_dateto).Select(s => s.Amount).Sum();
                                        balance = Utils.Utils.GetBalance(_card.PaymentAmount, _card.ChargeAmount);
                                        balance = balance - CardCahrge_Balance;
                                        if (balance >= 0)
                                        {
                                            Utils.Utils.SetJuridFinishDate(_db, jurid_limit_months, _card.Card.Id);
                                        }
                                        else
                                        {
                                            _card.Card.CardStatus       = CardStatus.Closed;
                                            _card.Card.CloseDate        = today;
                                            _db.Entry(_card.Card).State = System.Data.Entity.EntityState.Modified;
                                            _db.CardLogs.Add(new CardLog()
                                            {
                                                CardId = _card.Card.Id, Date = today, Status = CardLogStatus.Close, UserId = 1
                                            });
                                        }
                                    }
                                }

                                if (!cas_socket.SendEntitlementRequest(Convert.ToInt32(_card.Card.CardNum), _card.CasIds.ToArray(), _card.Card.CloseDate.AddHours(-4), _card.Card.FinishDate.AddHours(-4), true))
                                {
                                    _db.ChargeCrushLogs.Add(new ChargeCrushLog
                                    {
                                        Date               = today,
                                        CardNum            = _card.Card.CardNum,
                                        ChargeCrushLogType = ChargeCrushLogType.EntitlementClose,
                                        Text               = "ბარათი: " + _card.Card.CardNum + ";" + _card.Card.AbonentNum
                                    });
                                }

                                if (_card.Card.CardStatus == CardStatus.Active && _card.CustomerType != CustomerType.Technic)
                                {
                                    decimal amount = (decimal)(_card.SubscribAmount / service_days / Utils.Utils.divide_card_charge_interval);

                                    amount -= (amount * (decimal)_card.Card.Discount / 100);
                                    if (amount <= 0)
                                    {
                                        continue;
                                    }
                                    _db.CardCharges.Add(new CardCharge()
                                    {
                                        CardId = _card.Card.Id, Amount = amount, Tdate = today, Status = CardChargeStatus.Daily
                                    });
                                }
                            }
                        }
                        _db.SaveChanges();

                        foreach (CardDetailData _card in _cards.Where(c => c.Card.CardStatus == CardStatus.Blocked))
                        {
                            Subscribtion sb = _db.Subscribtions.Where(s => s.CardId == _card.Card.Id && s.Status == true).First();
                            List <SubscriptionPackage> sbp = _db.SubscriptionPackages.Include("Package").Where(s => s.SubscriptionId == sb.Id).ToList();

                            if (sbp.Any(p => p.Package.RentType == RentType.rent))
                            {
                                _db.CardCharges.Add(new CardCharge()
                                {
                                    CardId = _card.Card.Id, Amount = Math.Round((decimal)pen_daily_amount, 2), Tdate = DateTime.Now, Status = CardChargeStatus.PenDaily
                                });
                            }
                        }
                        _db.SaveChanges();

                        cas_socket.Disconnect();
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        using (StreamWriter writer = new StreamWriter("../path_to_error_log_file", true))
                        {
                            writer.WriteLine("Message :" + ex.Message + "<br/>" + Environment.NewLine + "StackTrace :" + ex.StackTrace +
                                             "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
                            writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
                        }
                        using (DataContext _db_log = new DataContext())
                        {
                            _db_log.ChargeCrushLogs.Add(new ChargeCrushLog
                            {
                                Date               = DateTime.Now,
                                CardNum            = "",
                                ChargeCrushLogType = ChargeCrushLogType.Crush,
                                Text               = (ex.Message != null ? ex.Message : "null")
                            });
                            _db_log.SaveChanges();
                        }
                    }
                }
            }
        }