Estou confuso em uma funcionalidade de sistema de agendamento...
Basicamente estou criando um sistema de agendamento, aonde tem um serviço, uma data disponível, e os horários disponiveis nessa data, mas o administrador pode escolher tornar a data disponivel ou não, minha questão é como estruturar isso, estou bem confuso de como fazer, na minha cabeça vem a opção de cadastrar todas as data do ano,e criar horarios fixos de 1h em 1h e deixar vinculados esses horarios padrão nas data, se alguem já fez isso poderia me dar uma luz, obrigado
Eu estou com preguiça de fazer resposta decente agora, mas vou te dar uma luz.
Leia a RFC5545, especialmente a parte de rrules.
Pesquise no GitHub implementações na linguagem que estiver usando que deve ter algo. Tem extensões para o Postgres também ou você pode implementar o padrão como descrito na RFC usando tsrange com poucas linhas.
Por padrão, sua agenda é aberta ou fechada?
Se for aberta, você pode simplesmente colocar entradas na sua agenda com uma flag indicando que o horário está bloqueado.
Se for fechada, faz-se ao contrário: cria apenas os horários liberados, e tudo o que não estiver liberado, está bloqueado :-)
Antes de tudo tem que refinar os requisitos, exemplo feriados, datas comemorativas, cancelamentos, recolocação de horário, mudança de datas e horários. A rocketseat fez um projeto integrando junto ao google calendar: https://github.com/rocketseat-education/06-ignite-call, você pode seguir esse exemplo e adaptar para sua realidade, acredito que será um bom caminho para você
Rapaz, este é um assunto que parece fácil, mas tem muita complexidade envolvida. Eu vou deixar aqui algumas observações para você ponderar sobre o assunto.
na minha cabeça vem a opção de cadastrar todas as data do ano,e criar horarios fixos de 1h em 1h
Eu não faria isso, pois deixa o sistema muito inflexível. O que acontece se a regra de negócios mudar? E se você tiver que abrir algumas exceções?
Eu acho que vai ajudar se você pensar no conceito matemático de intervalos.
Pense assim: um agendamento é um intervalo contendo a data, hora e minuto do início e do fim. Então, você pode apresentar para o usuário um calendário com os agendamentos (intervalos) reservados.
Pensar em intervalos também vai ajudar na hora de detectar conflitos, pois basta verificar os intervalos que se sobrepõem.
Espero ter ajudado.