How to make a Useful days rule in Asp.net and C#?

Asked

Viewed 1,009 times

0

good afternoon I am wanting to create a billing email sending rule that when there is a holiday he considers the next day and if it is Sunday he performs the task on Tuesday. Today the system uses a bank where it checks the Customers who are with the account situation to receive in open and our system in ERP and sends an e-mail warning after a certain time of days of delay, but on the days falling on holidays I wanted to add one more day not to generate the charge on it.

I’m using a code I picked up on a forum but it doesn’t load the dates as true or false

 public static class testeferiado
    {
        public static DateTime Holiday(DateTime data)
        {
            while (true)
            {
                if (Feriado(data))
                {

                    if (data.DayOfWeek == DayOfWeek.Sunday)
                    {
                        data = data.AddDays(2);
                    }
                    data = data.AddDays(1);
                    return Holiday(data);
                }


                return data;
            }
        }

        readonly static SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        static SqlCommand command = new SqlCommand();
        static string result;
        public static bool Feriado(DateTime dt)
        {

            command.CommandText = "select * from [mia].dbo.feriado where dtferiado = '" + dt.ToString("dd/MM/yyyy") + "'";

            con.Open();

            command.Connection = con;

            SqlDataReader reader = command.ExecuteReader();

            if (reader.Read())
            {
                return true;
            }
            else
            {
                return false;
            }

        }
    }
}

And then a code to perform the check, where I use Quartz and at that moment I can’t make him understand the day in Checkhelper.Holiday(),

  public class ScheduleHelper : IJob
    {
        public void Execute(IJobExecutionContext context)
        {

            //Delimita o tempo de execução até às 18h
            if (DateTime.Now.Hour < 18)
            {
                if (DateTime.Today == CheckHelper.Holiday())
                {


                    //Se horário é = 12h aplica-se a régua do setor financeiro
                    if (DateTime.Now.Hour == 10 && DateTime.Now.Minute == 55)
                    {


                        //Se o dia da semana for = terça feira é necessário checar envios agendados
                        if (DateTime.Today.DayOfWeek == DayOfWeek.Tuesday)
                        {
                            CheckHelper.CheckEnviosAgendados();
                        }

                        CheckHelper.CheckReguaFiananceiro();


                    }
                }
}

3 answers

1


i implemented something very similar to what you want. I have a method to catch the next business day of a certain date. Follow the code:

    /// <summary>
    /// Pega o próximo dia útil da data informada. Considera feriados nacionais.
    /// </summary>
    /// <param name="dateTime"></param>
    /// <returns></returns>
    public static DateTime GetNextDiaUtil(DateTime dateTime)
    {
        try
        {
            while (true)
            {
                if (dateTime.DayOfWeek == DayOfWeek.Saturday)
                    dateTime = dateTime.AddDays(2);
                else if (dateTime.DayOfWeek == DayOfWeek.Sunday)
                    dateTime = dateTime.AddDays(1);

                //if (dateTime.Day == 31 && dateTime.Month == 12) //----- Feriado bancário
                //    dateTime.AddDays(1);

                var publicHolidays = DateSystem.GetPublicHoliday(dateTime, dateTime, CountryCode.BR);

                if (publicHolidays.Count() > 0)
                    dateTime = dateTime.AddDays(1);
                else
                    return dateTime;
            }
        }
        catch (Exception E)
        {
            throw new Exception("Buscar próximo dia útil", E);
        }
    }

Above you observe a method that deals with the issue of holidays(DateSystem.GetPublicHoliday), I use the Nager.Date that already does it for us. You can download it by nuget. With this I no longer use the holidays saved in the database.

I hope it helped you.

  • I believe that your tip will help me a lot, but I leave a log in the bank to send the next day

0

 public static List<Cliente> CheckRCEmail(string empresa, string data)
    {
        List<Cliente> clientes = new List<Cliente>();
        LeadLoversAPI llapi = new LeadLoversAPI();

        var contasReceber = api.ListaContasReceber(empresa, "aberto", data, data);

        foreach (var item in contasReceber)
        {
            var pre_cliente = api.ObterContaReceber(item.id_conta_tiny, empresa).cliente;
            string cnpj_cliente = "";

            if (pre_cliente != null)
            {
                cnpj_cliente = pre_cliente.cpf_cnpj;
            }

            var cliente = api.PesquisaPessoaByCnpj(cnpj_cliente, empresa);
            cliente.contatos = new List<Contato>();

            //Pega o contato financeiro, caso exista
            cliente.contatos.Add(api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Financeiro"));
            if (cliente.contatos[0] == null)
            {
                //Pega o contato Proprietário, caso exista
                cliente.contatos[0] = (api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Proprietario"));
                if (cliente.contatos[0] == null)
                {
                    //Pega o contato Proprietaria, caso exista
                    cliente.contatos[0] = (api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Proprietaria"));
                }
            }

            if (cliente.contatos != null)
            {
                if (cliente.contatos[0] != null)
                {
                    LogFinanceiro log;
                    //Gravação de Log
                    log = new LogFinanceiro();
                    log.nome_cliente = cliente.nome;
                    log.contato_cliente = cliente.contatos[0].nome;
                    log.celular_cliente = cliente.contatos[0].celularddd + cliente.contatos[0].celularnumero;
                    log.email_cliente = cliente.contatos[0].email;
                    log.tipo_envio = "E-mail";
                    log.data_acao = DateTime.Now;
                    log.conta_receber_id = item.id_conta_tiny;
                    log.data_agendamento = Convert.ToDateTime("01-01-1900");





                    if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday)
                        {
                            log.data_agendamento = DateTime.Today.AddDays(2);
                            cliente.nome += " (agendado)";
                        }
                        else
                        {
                            if (DateTime.Today.DayOfWeek == DayOfWeek.Monday)
                            {
                                log.data_agendamento = DateTime.Today.AddDays(1);
                                cliente.nome += " (agendado)";
                            }
                            else
                            {
                                llapi.InsertLead(cliente.contatos[0], new Maquina() { MachineCode = "278620", MachineName = "Regua de cobranca" });
                            }
                        }



                    db.LogFinanceiroes.Add(log);
                    db.SaveChanges();

                    //Adicionao o cliente à lista de clientes enviados ao LeadLovers
                    clientes.Add(cliente);
                }
            }

        }

        return clientes;
    }

To insert the

var publicHolidays = DateSystem.GetPublicHoliday(dateTime, dateTime, CountryCode.BR);

                if (publicHolidays.Count() > 0)
                    dateTime = dateTime.AddDays(1);`

I will need to adapt it to log into the bank, as they are financial email and cannot be sent on holiday days. But thank you so much for your help.

  • I adapted it but when he sees the holidays, even being 10/07/2019, he add one day

0

 public static List<Cliente> CheckRCEmail(string empresa, string data)
        {
            List<Cliente> clientes = new List<Cliente>();
            LeadLoversAPI llapi = new LeadLoversAPI();

            var ano = DateTime.Now.Year;


            var contasReceber = api.ListaContasReceber(empresa, "aberto", data, data);

            foreach (var item in contasReceber)
            {
                var pre_cliente = api.ObterContaReceber(item.id_conta_tiny, empresa).cliente;
                string cnpj_cliente = "";

                if (pre_cliente != null)
                {
                    cnpj_cliente = pre_cliente.cpf_cnpj;
                }

                var cliente = api.PesquisaPessoaByCnpj(cnpj_cliente, empresa);
                cliente.contatos = new List<Contato>();

                //Pega o contato financeiro, caso exista
                cliente.contatos.Add(api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Financeiro"));
                if (cliente.contatos[0] == null)
                {
                    //Pega o contato Proprietário, caso exista
                    cliente.contatos[0] = (api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Proprietario"));
                    if (cliente.contatos[0] == null)
                    {
                        //Pega o contato Proprietaria, caso exista
                        cliente.contatos[0] = (api.ObterPessoa(cliente.id_cliente_tiny, empresa, "Proprietaria"));
                    }
                }

                if (cliente.contatos != null)
                {
                    if (cliente.contatos[0] != null)
                    {
                        LogFinanceiro log;
                        //Gravação de Log
                        log = new LogFinanceiro();
                        log.nome_cliente = cliente.nome;
                        log.contato_cliente = cliente.contatos[0].nome;
                        log.celular_cliente = cliente.contatos[0].celularddd + cliente.contatos[0].celularnumero;
                        log.email_cliente = cliente.contatos[0].email;
                        log.tipo_envio = "E-mail";
                        log.data_acao = DateTime.Now;
                        log.conta_receber_id = item.id_conta_tiny;
                        log.data_agendamento = Convert.ToDateTime("01-01-1900");

                         /*Variavel do NuGet Nager.Date, biblioteca trabalha com feriado Fixos e que são alterados de acordo com o ano,
                     porem somente com feriados Federais*/

                    var publicHolidays = DateSystem.GetPublicHoliday(ano, "BR") ;

                    if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday)
                    {
                        log.data_agendamento = DateTime.Today.AddDays(2);
                        cliente.nome += " (agendado)";
                    }
                    else
                    {
                        if (DateTime.Today.DayOfWeek == DayOfWeek.Monday)
                        {
                            log.data_agendamento = DateTime.Today.AddDays(1);
                            cliente.nome += " (agendado)";
                        }
                        if (publicHolidays.Count() > 0)
                        {
                            log.data_agendamento = DateTime.Today.AddDays(1);
                            cliente.nome += " (agendado)";
                        }
                        else
                        {
                            llapi.InsertLead(cliente.contatos[0], new Maquina() { MachineCode = "278620", MachineName = "Regua de cobranca" });
                        }

                        }                                    
                        db.LogFinanceiroes.Add(log);
                        db.SaveChanges();

                        //Adicionao o cliente à lista de clientes enviados ao LeadLovers
                        clientes.Add(cliente);
                    }
                }

            }

            return clientes;
        }

he’s like this now

Browser other questions tagged

You are not signed in. Login or sign up in order to post.