Example #1
0
 public IEnumerable<DetalleHorarioDTO> AgregarDetalleHorario(List<DetalleHorarioDTO> listahorarios, long id, DateTime fechadesde, DateTime fechahasta, TimeSpan? horaentrada, TimeSpan? horasalidaparcial, TimeSpan? horaentradaparcial, TimeSpan? horasalida, bool lunes, bool martes, bool miercoles, bool jueves, bool viernes, bool sabado, bool domingo)
 {
     var nuevoHorario = new DetalleHorarioDTO();
     nuevoHorario.AgenteId = id;
     nuevoHorario.FechaDesde = fechadesde;
     nuevoHorario.FechaHasta = fechahasta;
     nuevoHorario.HoraEntrada = horaentrada;
     nuevoHorario.HoraSalidaParcial = horasalidaparcial;
     nuevoHorario.HoraEntradaParcial = horaentradaparcial;
     nuevoHorario.HoraSalida = horasalida;
     nuevoHorario.Lunes = lunes;
     nuevoHorario.Martes = martes;
     nuevoHorario.Miercoles = miercoles;
     nuevoHorario.Jueves = jueves;
     nuevoHorario.Viernes = viernes;
     nuevoHorario.Sabado = sabado;
     nuevoHorario.Domingo = domingo;
     listahorarios.Add(nuevoHorario);
     return listahorarios;
 }
        public List<ReporteMensualDTO> ObtenerPorId(long agenteId, int año, int mes)
        {
            var lista = new List<ReporteMensualDTO>();

            for (int i = 1; i <= _diasDelMes; i++)
            {
                var dia = new DateTime(año, mes, i);
                _horarioDia = HorarioDelDia(dia);
                var _finMes = new DateTime(_fecha.Year, _fecha.Month, _diasDelMes);
                var reporte = new ReporteMensualDTO();
                bool? porLlegarTarde = null;
                var listaAccesosDelDia = ListaAccesosDelDia(dia);
                _diasDelMes = DateTime.DaysInMonth(dia.Year, dia.Month);

                if (_horarioDia != null)
                {
                    reporte.AgenteId = _agenteId;
                    reporte.Numero = i;

                    // Listas para las grillas de abajo

                    reporte.Comisiones = ComisionesEnElMes(dia) ?? new List<ComisionServicioDTO>();
                    reporte.Lactancias = LactanciasEnElMes(dia) ?? new List<LactanciaDTO>();
                    reporte.Novedades = NovedadesEnElMes(dia) ?? new List<NovedadAgenteDTO>();

                    reporte.Fecha = dia;
                    reporte.Dia = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(dia.ToString("dddd", new CultureInfo("es-Ar")));

                    // Horas de los accesos

                    reporte.HoraEntrada = listaAccesosDelDia == null ? null : listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "Entrada").Any() ? listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "Entrada").Last().Hora : (TimeSpan?)null;
                    reporte.HoraEntradaParcial = listaAccesosDelDia == null ? null : _horarioDia.HoraEntradaParcial == null ? null : listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "EntradaParacial").Any() ? listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "EntradaParacial").Last().Hora : (TimeSpan?)null;
                    reporte.HoraSalida = listaAccesosDelDia == null ? null : listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "Salida").Any() ? listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "Salida").Last().Hora : (TimeSpan?)null;
                    reporte.HoraSalidaParcial = listaAccesosDelDia == null ? null : _horarioDia.HoraSalidaParcial == null ? null : listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "SalidaParcial").Any() ? listaAccesosDelDia.Where(acceso => acceso.TipoAcceso == "SalidaParcial").Last().Hora : (TimeSpan?)null;

                    // Minutos tarde y minutos faltantes

                    reporte.MinutosTarde = listaAccesosDelDia == null ? null : Tardanza(listaAccesosDelDia, _horarioDia);
                    reporte.MinutosTardeExtension = listaAccesosDelDia == null ? null : _horarioDia.HoraEntradaParcial == null ? null : TardanzaExtension(listaAccesosDelDia, _horarioDia);
                    reporte.MinutosFaltantes = listaAccesosDelDia == null ? null : (reporte.HoraSalidaParcial != null && reporte.HoraEntrada != null) ? Diff((TimeSpan)reporte.HoraSalidaParcial, (TimeSpan)reporte.HoraEntrada) : (TimeSpan?)null;
                    reporte.MinutosFaltantesExtension = listaAccesosDelDia == null ? null : _horarioDia.HoraEntradaParcial == null ? ((reporte.HoraSalida != null && reporte.HoraEntrada != null) ? Diff(Diff((TimeSpan)reporte.HoraSalida, (TimeSpan)reporte.HoraEntrada), Diff((TimeSpan)_horarioDia.HoraSalida, (TimeSpan)_horarioDia.HoraEntrada)) : (TimeSpan?)null) : ((reporte.HoraSalida != null && reporte.HoraEntradaParcial != null) ? Diff(Diff((TimeSpan)reporte.HoraSalida, (TimeSpan)reporte.HoraEntradaParcial), Diff((TimeSpan)_horarioDia.HoraSalida, (TimeSpan)_horarioDia.HoraEntradaParcial)) : (TimeSpan?)null);

                    reporte.Ausente = listaAccesosDelDia == null ? (bool?)null : Ausente(dia, _horarioDia, listaAccesosDelDia, out porLlegarTarde) || ((reporte.MinutosTarde != null) && ((TimeSpan)reporte.MinutosTarde).TotalMinutes > _minutosToleranciaAusente ? true : false);
                    reporte.AusentePorLlegarTarde = listaAccesosDelDia == null ? (bool?)null : porLlegarTarde;
                }
                else
                {
                    reporte.AgenteId = _agenteId;
                    reporte.Numero = i;
                    reporte.Ausente = null;

                    // Listas para las grillas de abajo

                    reporte.Comisiones = ComisionesEnElMes(dia) ?? new List<ComisionServicioDTO>();
                    reporte.Lactancias = LactanciasEnElMes(dia) ?? new List<LactanciaDTO>();
                    reporte.Novedades = NovedadesEnElMes(dia) ?? new List<NovedadAgenteDTO>();

                    reporte.Fecha = dia;
                    reporte.Dia = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(dia.ToString("dddd", new CultureInfo("es-Ar")));

                    // Horas de los accesos

                    reporte.HoraEntrada = null;
                    reporte.HoraEntradaParcial = null;
                    reporte.HoraSalida = null;
                    reporte.HoraSalidaParcial = null;

                    // Minutos tarde y minutos faltantes

                    reporte.MinutosTarde = null;
                    reporte.MinutosTardeExtension = null;
                    reporte.MinutosFaltantes = null;
                    reporte.MinutosFaltantesExtension = null;

                    reporte.AusentePorLlegarTarde = null;
                }

                lista.Add(reporte);
            }

            return lista;
        }
        private TimeSpan? Tardanza(List<AccesoDTO> accesosDia, DetalleHorarioDTO horarioDia)
        {
            TimeSpan? _horaEntradaAcceso = accesosDia.Where(acceso => acceso.TipoAcceso.Equals("Entrada")).Any() ? accesosDia.Where(acceso => acceso.TipoAcceso.Equals("Entrada")).Last().Hora : (TimeSpan?)null;
            TimeSpan _horaEntradaHorario = (TimeSpan)horarioDia.HoraEntrada;

            if (_horaEntradaAcceso != null && ((TimeSpan)_horaEntradaAcceso).TotalMinutes > _horaEntradaHorario.TotalMinutes)
            {
                return Diff(_horaEntradaHorario, (TimeSpan)_horaEntradaAcceso);
            }
            else return null;
        }
        private TimeSpan? TardanzaExtension(List<AccesoDTO> accesosDia, DetalleHorarioDTO horarioDia)
        {
            TimeSpan? _horaEntradaParcialAcceso = accesosDia.Where(acceso => acceso.TipoAcceso.Equals("EntradaParacial")).Any() ? accesosDia.Where(acceso => acceso.TipoAcceso.Equals("EntradaParacial")).Last().Hora : (TimeSpan?)null;
            TimeSpan _horaEntradaParcialHorario = (TimeSpan)horarioDia.HoraEntradaParcial;

            if (_horaEntradaParcialAcceso > _horaEntradaParcialHorario && _horaEntradaParcialAcceso != null)
            {
                return Diff(_horaEntradaParcialHorario, (TimeSpan)_horaEntradaParcialAcceso);
            }
            else return null;
        }
        private bool Ausente(DateTime fecha, DetalleHorarioDTO horarioDia, List<AccesoDTO> _listaAccesosDía, out bool? porLlegarTarde)
        {
            bool _hayNovedadHoraEntrada;
            bool _hayComisionServicioHoraEntrada;

            var listaComisonesServicioDelDia = ComisionesEnElMes(fecha).Where(comision => (comision.FechaDesde <= fecha) && (comision.FechaHasta >= fecha)).AsParallel().ToList();
            var listaNovedadesDelDia = NovedadesEnElMes(fecha).Where(novedad => (novedad.FechaDesde <= fecha) && (novedad.FechaHasta >= fecha)).AsParallel().ToList(); ;
            porLlegarTarde = false;

            _hayNovedadHoraEntrada = listaNovedadesDelDia.Any() ? (listaNovedadesDelDia.Where(novedad => ((novedad.HoraDesde <= horarioDia.HoraEntrada) && (novedad.HoraHasta >= horarioDia.HoraEntrada))).Any() ? true : false) : false;
            _hayComisionServicioHoraEntrada = listaComisonesServicioDelDia.Any() ? (listaComisonesServicioDelDia.Where(comision => (((comision.HoraInicio <= horarioDia.HoraEntrada) && (comision.HoraFin >= horarioDia.HoraEntrada)) || comision.JornadaCompleta)).Any() ? true : false) : false;

            if (_hayNovedadHoraEntrada || _hayComisionServicioHoraEntrada) // Primer check (novedades y comision de servicio)
            {
                return false;
            }
            else if (_listaAccesosDía.Any()) // Segundo check (horarios y accesos)
            {
                if (TardanzaSuperaLimite(Tardanza(_listaAccesosDía, horarioDia), _minutosToleranciaAusente)) // Tercer check (tardanza)
                {
                    porLlegarTarde = true;
                    return true;
                }
                return false;
            }
            else if (fecha.Date <= DateTime.Now.Date) return true;
            return false;
        }