Ejemplo n.º 1
0
 //[ValidateAntiForgeryToken]
 public IActionResult Create([Bind("PaymentId,PaymentDate,MovementTypeId,QuantityMovmentType,Amount,PaymentMediaId,UserId,LimitUsableDate")] Payment payment)
 {
     if (ModelState.IsValid)
     {
         if (_paymentLogic.ProcessPayment(payment,
                                          _context.User.Where(u => u.UserId == payment.UserId).First().FullName,
                                          _context.User.Where(u => u.UserId == payment.UserId).First().Email))
         {
             CashMovement cashMov = new CashMovement
             {
                 Amount              = payment.Amount,
                 PaymentMediaId      = payment.PaymentMediaId,
                 CashMovementDate    = payment.PaymentDate,
                 CashMovementDetails = "Movimiento de Pago",
                 CashMovementTypeId  = 1,//1 es de tipo entrada
                 CashCategoryId      = _context.CashCategory.Where(x => x.CashCategoryDescription == "Movimiento de pago").FirstOrDefault().CashCategoryId,
                 CashSubcategoryId   = _context.CashSubcategory.Where(x => x.CashSubcategoryDescription == "Movimiento de pago").FirstOrDefault().CashSubcategoryId,
                 SupplierId          = _context.Supplier.Where(x => x.SupplierDescription == "Movimiento de pago").FirstOrDefault().SupplierId,
                 PaymentId           = payment.PaymentId
             };
             _context.Add(cashMov);
             _context.SaveChanges();
             return(RedirectToAction(nameof(Index)));
         }
     }
     ViewData["MovementTypeId"] = new SelectList(_context.MovementType, "MovementTypeId", "Description", payment.MovementTypeId);
     ViewData["PaymentMediaId"] = new SelectList(_context.PaymentMedia, "PaymentMediaId", "PaymentMediaDescription", payment.PaymentMediaId);
     ViewData["UserId"]         = new SelectList(_context.User, "UserId", "FullName", payment.UserId);
     return(View(payment));
 }
Ejemplo n.º 2
0
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new GymTestContext(
                       serviceProvider.GetRequiredService <DbContextOptions <GymTestContext> >()))
            {
                LoadMoveTypes(context);

                LoadPaymentMedia(context);

                LoadCashCategories(context);

                LoadCashSubcategories(context);

                LoadSuppliers(context);

                LoadCashMovementTypes(context);

                LoadMedicalEmergencies(context);

                context.SaveChanges();
            }
        }
        public void NotifyUsers()
        {
            try
            {
                AutomaticProcess automaticSendMailProcess = _context.AutomaticProcess.
                                                            Where(x => x.AutomaticProcessId == int.Parse(_appSettings.Value.PaymentNotificationProcessId)).FirstOrDefault();
                if (automaticSendMailProcess != null && automaticSendMailProcess.NextProcessDate <= _timeZone.GetCurrentDateTime(DateTime.Now).Date)
                {
                    string notifyByDate = _appSettings.Value.PaymentNotificationByDate;
                    if (bool.Parse(notifyByDate))
                    {
                        NotifyByDate();
                    }

                    string notifyByExp = _appSettings.Value.PaymentNotificationByExpiration;
                    if (bool.Parse(notifyByExp))
                    {
                        NotifyByExpiration();
                    }

                    automaticSendMailProcess.NextProcessDate = _timeZone.GetCurrentDateTime(DateTime.Now).Date.AddDays(int.Parse(_appSettings.Value.PaymentNotificationProcessAddDays));

                    _context.Update(automaticSendMailProcess);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                var messageError = ex.Message;
                _logger.LogError("Error Processing Payment. Detail: " + messageError);
                if (ex.InnerException != null)
                {
                    _logger.LogError("Error Processing Payment. Detail: " + ex.InnerException.Message);
                }
            }
        }
Ejemplo n.º 4
0
        public AssistanceInformation ProcessAssistance(string userToken, DateTime?assistanceDate = null)
        {
            var objectToReturn = new AssistanceInformation();
            var users          = from m in _context.User
                                 select m;

            users = users.Where(s => s.Token.ToLower().Equals(userToken.ToLower()));

            if (users.Count() == 1)
            {
                objectToReturn.User = users.First();

                var payments = from m in _context.Payment
                               select m;
                payments = payments.Where(p => p.UserId == objectToReturn.User.UserId);

                if (payments.Count() > 0)
                {
                    var newestPayment = payments.OrderByDescending(p => p.PaymentDate).First();
                    if (newestPayment.MovementTypeId > 0)
                    {
                        if (newestPayment.LimitUsableDate.Date < DateTime.Now.Date)
                        {
                            objectToReturn.Message = "Fecha límite de uso sobrepasada. La misma es " + newestPayment.LimitUsableDate.Date.ToShortDateString() + ".";
                            ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email,
                                                        newestPayment.PaymentDate.ToString("dd/MM/yyyy HH:mm"));
                            return(objectToReturn); // se venció el tiempo de uso del ultimo pago
                        }

                        switch (newestPayment.MovementTypeId)
                        {
                            #region Mensual
                        case (int)PaymentTypeEnum.Monthly:
                            var monthsPayed = newestPayment.QuantityMovmentType;

                            var monthsUsed = DateTime.Now.Month - newestPayment.PaymentDate.Month;

                            if (DateTime.Now.Year > newestPayment.PaymentDate.Year)
                            {
                                monthsUsed += 12;
                            }

                            if (monthsUsed > monthsPayed)
                            {
                                objectToReturn.Message = "Pago mensual vencido. Su último fue por " + monthsPayed + " mes(es) y se utilizaron " + monthsUsed + " mes(es).";
                                ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email,
                                                            newestPayment.PaymentDate.ToString("dd/MM/yyyy HH:mm"));
                                return(objectToReturn);    // el pago actual ya no es válido
                            }

                            objectToReturn.AdditionalData = "Su último pago fue por " + monthsPayed + " mes(es) y se utilizaron " + monthsUsed + " mes(es).";;
                            break;

                            #endregion
                            #region Por asistencias
                        case (int)PaymentTypeEnum.ByAssistances:
                            var ass = from a in _context.Assistance select a;

                            ass = ass.Where(a => a.UserId == objectToReturn.User.UserId &&
                                            a.AssistanceDate.Date >= newestPayment.PaymentDate.Date);

                            if (ass.Count() >= newestPayment.QuantityMovmentType)
                            {
                                objectToReturn.Message = "Pago por asistencias consumido. Se habilitaron " + newestPayment.QuantityMovmentType + " asistencia(s) y se utilizaron " + ass.Count() + " asistencia(s).";
                                ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email,
                                                            newestPayment.PaymentDate.ToString("dd/MM/yyyy HH:mm"));
                                return(objectToReturn);    // ya se consumieron todas las asistencias
                            }

                            objectToReturn.AdditionalData = "Cantidad de asistencias restantes: " + (newestPayment.QuantityMovmentType - ass.Count()) + ".";
                            break;
                            #endregion

                        default:
                            objectToReturn.Message = "Formato de pago no procesable.";
                            ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email,
                                                        newestPayment.PaymentDate.ToString("dd/MM/yyyy HH:mm"));
                            return(objectToReturn);
                        }

                        var lastAsistance = _context.Assistance.
                                            Where(a => a.UserId == objectToReturn.User.UserId).
                                            OrderByDescending(a => a.AssistanceDate).FirstOrDefault();

                        DateTime realAssistanceDate = assistanceDate.HasValue ? (DateTime)assistanceDate : DateTime.Now;

                        double diffTimeSecs = int.Parse(_appSettings.Value.AssistanceConfiguration_DiffHours) * 60 * 60
                                              + int.Parse(_appSettings.Value.AssistanceConfiguration_DiffMins) * 60
                                              + int.Parse(_appSettings.Value.AssistanceConfiguration_DiffSecs);

                        if (lastAsistance == null ||
                            (realAssistanceDate - lastAsistance.AssistanceDate).TotalSeconds > diffTimeSecs)
                        {
                            //Creamos asistencia en caso de que el usuario pueda entrar. Caso contrario, queda a criterio del lugar si pasa o no.
                            Assistance assistance = new Assistance
                            {
                                User           = users.First(),
                                AssistanceDate = realAssistanceDate
                            };
                            _context.Assistance.Add(assistance);
                            _context.SaveChanges();

                            if (newestPayment.MovementTypeId == (int)PaymentTypeEnum.ByAssistances)
                            {
                                var ass = from a in _context.Assistance select a;

                                ass = ass.Where(a => a.UserId == objectToReturn.User.UserId &&
                                                a.AssistanceDate.Date >= newestPayment.PaymentDate.Date);
                                objectToReturn.AdditionalData = "Cantidad de asistencias restantes: " + (newestPayment.QuantityMovmentType - ass.Count()) + ".";
                            }

                            objectToReturn.Message = "Bienvenido. Disfrute de su jornada. Asistencia generada con fecha " + DateTime.Now + ".";

                            ProcessAssistanceNotification(objectToReturn.User.UserId);
                        }
                        else
                        {
                            objectToReturn.Message = "Bienvenido nuevamente. Su token ya fue ingresado " + (DateTime.Now - lastAsistance.AssistanceDate).TotalMinutes.ToString("0") + " minutos antes.";
                        }

                        objectToReturn.AdditionalData = objectToReturn.AdditionalData + "Fecha límite de uso del pago: " + newestPayment.LimitUsableDate.ToShortDateString() + ".";
                    }
                    else//error: ultimo pago sin tipo de membresía
                    {
                        objectToReturn.Message = "Último pago sin tipo de membresía.";
                        ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email,
                                                    newestPayment.PaymentDate.ToString("dd/MM/yyyy HH:mm"));

                        return(objectToReturn);
                    }
                }
                else//error: usuario sin pagos
                {
                    objectToReturn.Message = "Usuario sin pagos.";
                    ProcessNotEntryNotification(objectToReturn.User.FullName, objectToReturn.Message, objectToReturn.User.Email, string.Empty);
                    return(objectToReturn);
                }
            }
            else if (users.Count() > 1)
            {
                //error: solo 1 usuario deber identificado por token
                objectToReturn.Message = "Existen " + users.Count() + " usuarios registrados para el mismo token. Los usuarios son: ";
                foreach (var user in users)
                {
                    objectToReturn.Message = objectToReturn.Message + user.FullName + ",";
                }
                objectToReturn.Message.Remove(objectToReturn.Message.Length - 1);
                objectToReturn.Message = objectToReturn.Message + ".";
                return(objectToReturn);
            }

            if (objectToReturn.User == null)
            {
                objectToReturn.Message = "Usuario no encontrado.";
            }

            return(objectToReturn);
        }
Ejemplo n.º 5
0
        public bool ProcessPayment(Payment payment, string userName, string userEmail)
        {
            var isEdit = false;

            if (payment.PaymentId > 0)
            {
                isEdit = true;
            }

            try
            {
                if (isEdit)
                {
                    _context.Update(payment);
                    _context.SaveChanges();
                }
                else
                {
                    _context.Add(payment);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                var messageError = ex.Message;
                _logger.LogError("Error Processing Payment. Detail: " + messageError);
                if (ex.InnerException != null)
                {
                    _logger.LogError("Error Processing Payment. Detail: " + ex.InnerException.Message);
                }
                return(false);
            }

            try
            {
                var bodyData = new System.Collections.Generic.Dictionary <string, string>
                {
                    { "UserName", userName },
                    { "Title", "Notificación de pago realizado." },
                    { "amount", payment.Amount.ToString() },
                    { "paymentDate", payment.PaymentDate.ToShortDateString() },
                    { "limitDate", payment.LimitUsableDate.ToShortDateString() },
                    { "quantity", payment.QuantityMovmentType.ToString() }
                };

                switch (payment.MovementTypeId)
                {
                    #region Mensual
                case (int)PaymentTypeEnum.Monthly:
                    if (payment.QuantityMovmentType > 1)
                    {
                        bodyData.Add("type", "meses");
                    }
                    else
                    {
                        bodyData.Add("type", "mes");
                    }
                    break;

                    #endregion
                    #region Por asistencias
                case (int)PaymentTypeEnum.ByAssistances:
                    if (payment.QuantityMovmentType > 1)
                    {
                        bodyData.Add("type", "asistencias");
                    }
                    else
                    {
                        bodyData.Add("type", "asistencia");
                    }
                    break;
                    #endregion
                }

                if (isEdit)
                {
                    bodyData.Add("action", "editado");
                    bodyData.Add("paymentId", payment.PaymentId + " ");
                }
                else
                {
                    bodyData.Add("action", "registrado");
                    bodyData.Add("paymentId", string.Empty);
                }

                _sendEmail.SendEmail(bodyData,
                                     "PaymentTemplate",
                                     "Notificación de pago realizado",
                                     new System.Collections.Generic.List <string>()
                {
                    userEmail
                }
                                     );
            }
            catch (Exception ex)
            {
                var messageError = ex.Message;
                _logger.LogError("Error Sending email. Detail: " + messageError);
                if (ex.InnerException != null)
                {
                    _logger.LogError("Error Sending email. Detail: " + ex.InnerException.Message);
                }
            }

            return(true);
        }