package br.com.doctors.controller.agendamento; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import br.com.caelum.vraptor.Consumes; import br.com.caelum.vraptor.Get; import br.com.caelum.vraptor.Path; import br.com.caelum.vraptor.Post; import br.com.caelum.vraptor.Put; import br.com.caelum.vraptor.Resource; import br.com.caelum.vraptor.Result; import br.com.caelum.vraptor.Validator; import br.com.caelum.vraptor.util.hibernate.extra.Load; import br.com.caelum.vraptor.validator.Validations; import br.com.caelum.vraptor.view.Results; import br.com.doctors.converters.agendamento.HorarioConverter; import br.com.doctors.converters.agendamento.HorarioJsonImpl; import br.com.doctors.converters.agendamento.HorarioJsonSimples; import br.com.doctors.dao.administracao.ConvenioDao; import br.com.doctors.dao.administracao.FuncionarioDao; import br.com.doctors.dao.administracao.MedicoDao; import br.com.doctors.dao.administracao.PacienteDao; import br.com.doctors.dao.agendamento.AgendamentoDao; import br.com.doctors.modelo.administracao.Convenio; import br.com.doctors.modelo.administracao.Funcionario; import br.com.doctors.modelo.administracao.Medico; import br.com.doctors.modelo.administracao.Paciente; import br.com.doctors.modelo.administracao.PerfilUsuario; import br.com.doctors.modelo.agendamento.Agendamento; import br.com.doctors.modelo.util.ParametrosAgendamento; import br.com.doctors.util.UserSession; import br.com.doctors.util.json.JQGridJSONConverter; /** * * @author Guilherme, Jonathan, Renato * */ @Resource public class AgendamentosController { private Result result; private Validator validator; private AgendamentoDao daoAgendamento; private PacienteDao daoPaciente; private MedicoDao daoMedico; private ConvenioDao daoConvenio; private FuncionarioDao daoFuncionario; private UserSession userSession; private HorarioConverter horarioConverter; public AgendamentosController(AgendamentoDao daoAgendamento, Result result, Validator validator, PacienteDao daoPaciente, MedicoDao daoMedico, ConvenioDao daoConvenio, FuncionarioDao daoFuncionario, UserSession userSession) { this.daoAgendamento = daoAgendamento; this.result = result; this.validator = validator; this.daoPaciente = daoPaciente; this.daoMedico = daoMedico; this.daoConvenio = daoConvenio; this.daoFuncionario = daoFuncionario; this.userSession = userSession; ParametrosAgendamento parametros = ParametrosAgendamento.getParametrosDefault(); horarioConverter = new HorarioConverter(parametros, daoAgendamento); } @Get @Path({"/agenda"}) public void list() { PerfilUsuario usuario = userSession.getUsuario(); switch (usuario.getTipo()){ case ROLE_FUNCIONARIO: result.include("medicos", daoMedico.listaTudo()); // result.forwardTo(this).veragenda(); // teste // result.forwardTo(this).agendaDoFuncionario(); result.forwardTo(this).agenda(); break; case ROLE_MEDICO: List<Medico> medicos = new ArrayList<Medico>(); medicos.add(daoMedico.buscaPorPerfil(usuario.getId())); result.include("medicos", medicos); result.forwardTo(this).agenda(); break; default: result.include("agendamentos", daoAgendamento.listaTudo()); } } public void agenda() { } public void agendaDoFuncionario() { } public void veragenda(){ } @Get @Path("/agenda/novo") public void cadastro() { result.include("medicos", daoMedico.listaTudo()); PerfilUsuario usuario = userSession.getUsuario(); switch(usuario.getTipo()){ case ROLE_PACIENTE: Paciente paciente = daoPaciente.carregaPorPerfil(usuario); result.forwardTo(this).preAgendar(paciente,daoConvenio.buscaPor(paciente.getId())); break; default: result.include("pacientes", daoPaciente.listaTudo()); break; } } @Get @Path("/agenda/novo/{paciente}") public void preAgendar(Paciente paciente, List<Convenio> conveniosAssociados){ result.include("paciente", paciente); result.include("convenios", conveniosAssociados); for(Convenio c: conveniosAssociados){ System.out.println(c); } } @Post @Path({"/agenda","/agenda/preagendar"}) public void adiciona(final Agendamento agendamento){ // System.out.println("convenio:" + convenio); // agendamento.setConvenio(convenio); System.out.println(agendamento); validator.checking(getValidations(agendamento)); // validator.onErrorSendBadRequest(); validator.onErrorForwardTo(this).cadastro(); // System.out.println("AQui"); atribueConvenio(agendamento); daoAgendamento.adiciona(agendamento); //result.use(Results.http()).body("url").setStatusCode(200); // result.use(Results.status()).ok(); result.redirectTo(AgendamentosController.class).list(); } private void atribueConvenio(final Agendamento agendamento) { // verifica se n�o � particular Convenio conv = agendamento.getConvenio(); if (conv != null && conv.getId() != null){ Convenio convenio = daoConvenio.carrega(conv.getId()); agendamento.setConvenio(convenio); } else { agendamento.setConvenio(null); } } private Validations getValidations(final Agendamento agendamento) { return new Validations(){{ that(agendamento.getPaciente() != null && agendamento.getPaciente().getId() != null, "agendamento.paciente.id", "campo.obrigatorio", "Paciente"); that(agendamento.getMedico() != null && agendamento.getMedico().getId() != null, "agendamento.medico.id", "campo.obrigatorio", "Medico"); that(agendamento.getDataAgendamento() != null, "agendamento.dataAgendamento", "campo.obrigatorio", "Data"); that(agendamento.getHoraAgendamento() != null, "agendamento.horaAgendamento", "campo.obrigatorio", "Hora"); that(agendamento.getConvenio() != null && agendamento.getConvenio().getId() != null , "agendamento.convenio.id", "campo.obrigatorio", "Convenio"); }}; } @Get @Path("/agenda/{id}") public Agendamento edit(Long id){ result.include("funcionarios", daoFuncionario.listaTudo()); return daoAgendamento.carrega(id); } @Put @Path("/agenda/{agendamento.id}") public void alterar(final Agendamento agendamento, Long funcionarioId){ // Funcionario funcionario = daoFuncionario.carrega(funcionarioId); // agendamento.setFuncionario(funcionario); validator.checking(getValidations(agendamento)); validator.onErrorForwardTo(this).cadastro(); daoAgendamento.atualiza(agendamento); result.redirectTo(AgendamentosController.class).list(); } @Path("/agenda/remover/{id}") public void remover(Long id){ Agendamento Agendamento = daoAgendamento.carrega(id); daoAgendamento.remove(Agendamento); result.redirectTo(AgendamentosController.class).list(); } @Get @Path("/agenda/carregaConvenios/{idPaciente}") public void carregaConvenios(Long idPaciente){ List<Convenio> lista = daoConvenio.buscaPor(idPaciente); result.use(Results.json()).from(lista).serialize(); } @Post @Path("/agenda/carregaHorarios.json") public void carregaHorariosLivres(Long idMedico, LocalDate data){ // ParametrosAgendamento parametros = ParametrosAgendamento.getParametrosDefault(); // HorarioConverter horarioConverter = new HorarioConverter(parametros, daoAgendamento); List<HorarioJsonSimples> agenda = horarioConverter.getHorariosLivres(idMedico, data); JQGridJSONConverter jqgrid = new JQGridJSONConverter(); jqgrid.addJSONObjects(agenda); result.use(Results.json()).withoutRoot().from(jqgrid).include("rows").include("rows.cells").serialize(); } @Post @Path("/agenda/carregaAgenda") // nomes do parametros devem ficar iguais public void carregaAgenda(Long idMedico, LocalDate data){ // ParametrosAgendamento parametros = ParametrosAgendamento.getParametrosDefault(); // HorarioConverter horarioConverter = new HorarioConverter(parametros, daoAgendamento); List<HorarioJsonImpl> agenda = horarioConverter.getAgenda(idMedico, data); JQGridJSONConverter jqgrid = new JQGridJSONConverter(); jqgrid.addJSONObjects(agenda); result.use(Results.json()).withoutRoot().from(jqgrid).include("rows").include("rows.cells").serialize(); } @Get @Path("/agenda/confirmaAgendamento/{idAgendamento}") public void confirmaAgendamento(Long idAgendamento){ Agendamento agendamento = daoAgendamento.carrega(idAgendamento); PerfilUsuario usuario = userSession.getUsuario(); Funcionario funcionario = daoFuncionario.buscaPorPerfil(usuario); agendamento.setFuncionario(funcionario); agendamento.confirmarPreAgendamento(); daoAgendamento.atualiza(agendamento); result.use(Results.status()).accepted(); } @Get @Path("/agenda/cancelaAgendamento/{idAgendamento}") public void cancelaAgendamento(Long idAgendamento){ Agendamento agendamento = daoAgendamento.carrega(idAgendamento); agendamento.cancelarPreAgendamento(); daoAgendamento.atualiza(agendamento); result.use(Results.status()).accepted(); } @Post @Path("/agenda/transferirHorario") public void transferirHorario(Long idAgendamento, LocalDate novaData, LocalTime novaHora){ Agendamento agendamento = daoAgendamento.carrega(idAgendamento); agendamento.transferirHorario(novaData, novaHora); daoAgendamento.atualiza(agendamento); result.use(Results.status()).accepted(); } }