private async void btnProgramarServicios_Click(object sender, EventArgs e)
        {
            if (ProgramacionServicioClienteActual.ProgramacionServiciosClienteId > 0)
            {
                IServiciosProgramados serviciosProgramados = CommonServiceLocator.ServiceLocator.Current.GetInstance <IServiciosProgramados>();

                Programacionservicioscliente programacionServicio = ProgramacionServicioClienteActual;

                await serviciosProgramados.ProgramarServicios(programacionServicio);

                programacionserviciosclienteBindingSource.ResetBindings(false);
            }
            else
            {
                MessageBox.Show("Se debe guardar primeramente la programación de los servicios", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }
        public async Task ProgramarServicios(Programacionservicioscliente programacionServicio)
        {
            DateTime fechaActual = programacionServicio.FechaInicio;

            int[] ds = programacionServicio.Programacionservicio.Dias.Split(',').Select(s => Convert.ToInt32(s.Replace("7", "0"))).ToArray();

            //El conteo siempre comeinza a partir del proximo lunes.

            //Si hay dias especificados, sin semanas ni meses, entonces el ciclo se repite cada x dias
            //Ej. D=15,S=0,M=0 el ciclo se repite cada 15 dias.

            //Si hay varios dias especificados, sin semanas ni meses, entonces el ciclo se repite cada x dias
            //Ej. D=7,15 ,S=0,M=0 el ciclo se repite cada 15 dias (Se toma el último).

            //Si hay semanas especificadas, entonces el ciclo se repite cada x semanas * 7

            //Si hay meses especificados, entonces el ciclo se repite cada cambio de mes

            int  dia         = 1;
            int  mes         = 1;
            int  diasCiclo   = 0;
            int  mesCiclo    = 0;
            bool cambioDeMes = false;

            int i = 0;

            if (fechaActual.DayOfWeek != DayOfWeek.Monday)
            {
                while (fechaActual.AddDays(i).DayOfWeek != DayOfWeek.Monday)
                {
                    i++;
                }
                ;

                dia = dia - i;
            }

            if (!programacionServicio.Programacionservicio.Semana.HasValue || programacionServicio.Programacionservicio.Semana.Value == 0)
            {
                diasCiclo = ds.Max();
            }
            else
            {
                diasCiclo = programacionServicio.Programacionservicio.Semana.Value * 7;
            }

            cambioDeMes = programacionServicio.Programacionservicio.Mes.HasValue && programacionServicio.Programacionservicio.Mes.Value > 0;


            while (fechaActual <= programacionServicio.FechaTermino)
            {
                if (ds.Any(a => a == dia))
                {
                    Entidades.Serviciosprogramado servicio = new Serviciosprogramado()
                    {
                        ServicioProgramadoId = 0,
                        ClienteId            = programacionServicio.ClienteId,
                        Cancelado            = false,
                        Tipo          = "Programado",
                        ServicioId    = programacionServicio.ServicioId,
                        FechaServicio = fechaActual,
                        Servicio      = programacionServicio.Servicio,
                        Clientes      = programacionServicio.Clientes
                    };


                    await CrearAsync(servicio);
                }

                //Se agrega un dia a la fecha actual.
                //El contador de días se reinicia si se alcanza el ciclo de días o de mes
                dia++;
                if (cambioDeMes)
                {
                    if (fechaActual.AddDays(1).Month != fechaActual.Month)
                    {
                        mes++;
                    }
                    if (mes > mesCiclo)
                    {
                        mes = 1;
                        dia = 1;
                    }
                }
                else if (dia > diasCiclo)
                {
                    dia = 1;
                }
                fechaActual = fechaActual.AddDays(1);
            }

            //Se indica que ya se tienen servicios programados
            programacionServicio.ServiciosProgramados = true;
            await programacionServiciosClienteOperaciones.ActualizarAsync(programacionServicio);
        }