
/*
 * Instruções para banco de gestão administrativa
 */
create schema if not exists geral;

create table if not exists geral.usuarios (id serial not null,
										   nome text not null,
										   email text not null,
										   senha text not null,
                                           cpf_cnpj text null,
										   status char(1) null,
										   created_at timestamp null,
										   updated_at timestamp null,
                                           constraint usuario_pk primary key (id));
                                           
create table if not exists geral.clinicas (id serial not null,
										   nome_fantasia text null,
										   razao_social text null,
										   endereco text null,
										   email text null,
										   telefone text null,
                                           cpf_cnpj text null,
                                           nome_link text null,
                                           nome_db text not null,
										   status char(1) null,
										   created_at timestamp null,
										   updated_at timestamp null,
                                           constraint clinica_pk primary key (id));



## Schemas e Tabelas abaixo são replicadas para cada nova base de dados criada



/*
 * Tabelas de uso comum
 */
create schema if not exists compartilhado;

create table if not exists compartilhado.fontes_como_soube (id serial not null,
													        nome text null,
													        descricao text null,
													        status char(1) null,
													        created_at timestamp null,
													        updated_at timestamp null,
			                                                constraint fcs_pk primary key (id));

create table if not exists compartilhado.generos_opcionais (id serial not null,
													        nome text null,
													        descricao text null,
													        status char(1) null,
													        created_at timestamp null,
													        updated_at timestamp null,
			                                                constraint go_pk primary key (id));

create table if not exists compartilhado.paises (id serial not null,
										         nome text null,
										         sigla text null,
										         status char(1) null,
										         created_at timestamp null,
										         updated_at timestamp null,
                                                 constraint pais_pk primary key (id));

create table if not exists compartilhado.estados (id serial not null,
												  id_pais int8 null,
										          nome text null,
										          sigla text null,
										          status char(1) null,
										          created_at timestamp null,
										          updated_at timestamp null,
                                                  constraint estado_pk primary key (id),
                                                  constraint estado_pais_fk foreign key (id_pais) references compartilhado.paises(id));
create index estado_pais_ifk on compartilhado.estados using btree (id_pais);

create table if not exists compartilhado.etnias (id serial not null,
										         nome text null,
										         descricao text null,
										         status char(1) null,
										         created_at timestamp null,
										         updated_at timestamp null,
                                                 constraint etnia_pk primary key (id));

create table if not exists compartilhado.estados_civis (id serial not null,
												         nome text null,
												         status char(1) null,
												         created_at timestamp null,
												         updated_at timestamp null,
		                                                 constraint ec_pk primary key (id));

create table if not exists compartilhado.niveis_escolaridade (id serial not null,
													         nome text null,
													         status char(1) null,
													         created_at timestamp null,
													         updated_at timestamp null,
			                                                 constraint ne_pk primary key (id));

create table if not exists compartilhado.graus_parentesco (id serial not null,
													       nome text null,
													       status char(1) null,
													       created_at timestamp null,
													       updated_at timestamp null,
			                                               constraint grau_parentesco_pk primary key (id));



/*
 * Tabelas referentes a Rotinas da Clínica
 */
create schema if not exists clinica;

create table if not exists clinica.dias_atendimento (id serial not null,
											         numero int4 not null,
											         nome text not null,
											         status char(1) null,
											         created_at timestamp null,
											         updated_at timestamp null,
	                                                 constraint dia_atendimento_pk primary key (id));

create table if not exists clinica.especialidades (id serial not null,
											       nome text null,
											       descricao text null,
										           status char(1) null,
										           created_at timestamp null,
										           updated_at timestamp null,
                                                   constraint especialidade_pk primary key (id));

create table if not exists clinica.medicos (id serial not null,
											nome text null,
									        cpf_cnpj text null,
									        telefone text null,
									        email text null,
									        data_nascimento date null,
									        termo_tratamento text null,
									        senha text null,
								            status char(1) null,
								            created_at timestamp null,
								            updated_at timestamp null,
                                            constraint medico_pk primary key (id));

/*create table if not exists clinica.tpl_medicos_especialidades(id_medico int8 not null,
															  id_especialidade int8 not null,
															  created_at timestamp null,
															  updated_at timestamp null,
															  constraint tpl_me_pk primary key (id_medico,id_especialidade),
															  constraint tpl_me_medico_fk foreign key (id_medico) references clinica.medicos(id),
															  constraint tpl_me_especialidade_fk foreign key (id_especialidade) references clinica.especialidades(id));
create index tpl_me_medico_ifk on clinica.tpl_medicos_especialidades using btree (id_medico);
create index tpl_me_especialidade_ifk on clinica.tpl_medicos_especialidades using btree (id_especialidade);*/

create table if not exists clinica.procedimentos (id serial not null,
												  id_especialidade int8 null,
										          nome text null,
										          descricao text null,
										          sigla text null,
										          status char(1) null,
										          created_at timestamp null,
										          updated_at timestamp null,
                                                  constraint procedimento_pk primary key (id),
                                                  constraint procedimento_especialidade_fk foreign key (id_especialidade) references clinica.especialidades(id));
create index procedimento_especialidade_ifk on clinica.procedimentos using btree (id_especialidade);

create table if not exists clinica.modelos_documentos (id serial not null,
												  	   id_procedimento int8 null,
										          	   nome text null,
											           modelo text null,
											           sigla text null,
											           status char(1) null,
											           created_at timestamp null,
											           updated_at timestamp null,
	                                                   constraint moddoc_pk primary key (id),
	                                                   constraint moddoc_procedimento_fk foreign key (id_procedimento) references clinica.procedimentos(id));
create index moddoc_procedimento_ifk on clinica.modelos_documentos using btree (id_procedimento);

create table if not exists clinica.convenios (id serial not null,
											  nome text null,
									          descricao text null,
								              status char(1) null,
								              created_at timestamp null,
								              updated_at timestamp null,
                                              constraint convenio_pk primary key (id));

create table if not exists clinica.planos_convenio (id serial not null,
													nome text null,
											        descricao text null,
										            status char(1) null,
										            created_at timestamp null,
										            updated_at timestamp null,
		                                            constraint plano_convenio_pk primary key (id));

create table if not exists clinica.colaboradores (id serial not null,
												  nome text null,
										          cpf_cnpj text null,
										          telefone text null,
										          email text null,
										          data_nascimento date null,
										          senha text null,
									              status char(1) null,
									              perfil char(1) null,
									              created_at timestamp null,
									              updated_at timestamp null,
	                                              constraint colaborador_pk primary key (id));



/*
 * Tabelas que envolvem Rotinas de Pacientes
 */
create schema if not exists paciente;

create table if not exists paciente.pacientes ( id serial not null,
												id_fonte_como_soube int8 null,
												id_genero_opcional int8 null,
												nome text null,
												nome_civil text null,
										        data_nascimento date null,
										        sexo_biologico char(1) null,
												cpf text null,
												rg text null,
										        telefone text null,
										        email text null,
										        observacoes text null,
										        senha text null,
										        obito char(1) null,
									            status char(1) null,
									            created_at timestamp null,
									            updated_at timestamp null,
	                                            constraint paciente_pk primary key (id),
 	                                            constraint paciente_fcs_fk foreign key (id_fonte_como_soube) references compartilhado.fontes_como_soube(id),
 	                                            constraint paciente_go_fk foreign key (id_genero_opcional) references compartilhado.generos_opcionais(id));
create index paciente_fcs_ifk on paciente.pacientes using btree (id_fonte_como_soube);
create index paciente_go_ifk on paciente.pacientes using btree (id_genero_opcional);

create table if not exists paciente.familiares_paciente (id serial not null,
														 id_paciente_origem int8 null,
														 id_familiar_paciente int8 null,
														 nome text null,
												         observacoes text null,
											             status char(1) null,
											             created_at timestamp null,
											             updated_at timestamp null,
			                                             constraint fp_pk primary key (id),
		 	                                             constraint fp_paciente_o_fk foreign key (id_paciente_origem) references paciente.pacientes(id),
		 	                                             constraint fp_paciente_f_fk foreign key (id_familiar_paciente) references paciente.pacientes(id));
create index fp_paciente_o_ifk on paciente.familiares_paciente using btree (id_paciente_origem);
create index fp_paciente_f_ifk on paciente.familiares_paciente using btree (id_familiar_paciente);

create table if not exists paciente.convenios_paciente (id serial not null,
														id_paciente int8 null,
														id_convenio int8 null,
														id_convenio_plano int8 null,
														numero_carteira text null,
												        data_validade date null,
											            acomodacao text null,
											            indeterminado char(1) null,
														status char(1) null,
											            created_at timestamp null,
											            updated_at timestamp null,
			                                            constraint cp_pk primary key (id),
		 	                                            constraint cp_paciente_fk foreign key (id_paciente) references paciente.pacientes(id),
		 	                                            constraint cp_convenio_fk foreign key (id_convenio) references clinica.convenios(id),
		 	                                            constraint cp_convenio_a_fk foreign key (id_convenio_plano) references clinica.planos_convenio(id));
create index cp_paciente_ifk on paciente.convenios_paciente using btree (id_paciente);
create index cp_convenio_ifk on paciente.convenios_paciente using btree (id_convenio);
create index cp_convenio_a_ifk on paciente.convenios_paciente using btree (id_convenio_plano);

create table if not exists paciente.dados_complementares_paciente (id serial not null,
																   id_paciente int8 null,
																   id_pais int8 null,
																   id_estado int8 null,
																   id_etnia int8 null,
																   id_estado_civil int8 null,
																   id_escolaridade int8 null,
																   naturalidade text null,
																   religiao text null,
																   profissao text null,
																   cns text null,
																   informacoes_adicionais text null,
																   status char(1) null,
														           created_at timestamp null,
														           updated_at timestamp null,
						                                           constraint dcp_pk primary key (id),
					 	                                           constraint dcp_paciente_fk foreign key (id_paciente) references paciente.pacientes(id),
					 	                                           constraint dcp_pais_fk foreign key (id_pais) references compartilhado.paises(id),
					 	                                           constraint dcp_estado_fk foreign key (id_estado) references compartilhado.estados(id),
					 	                                           constraint dcp_etnia_fk foreign key (id_etnia) references compartilhado.etnias(id),
					 	                                           constraint dcp_estado_civil_fk foreign key (id_estado_civil) references compartilhado.estados_civis(id),
					 	                                           constraint dcp_escolaridade_fk foreign key (id_escolaridade) references compartilhado.niveis_escolaridade(id) );
create index dcp_paciente_ifk on paciente.dados_complementares_paciente using btree (id_paciente);
create index dcp_pais_ifk on paciente.dados_complementares_paciente using btree (id_pais);
create index dcp_estado_ifk on paciente.dados_complementares_paciente using btree (id_estado);
create index dcp_etnia_ifk on paciente.dados_complementares_paciente using btree (id_etnia);
create index dcp_estado_civil_ifk on paciente.dados_complementares_paciente using btree (id_estado_civil);
create index dcp_escolaridade_ifk on paciente.dados_complementares_paciente using btree (id_escolaridade);



/*
 * Tabelas que envolvem Rotinas de Agendamentos
 */
create schema if not exists agendamento;

create table if not exists agendamento.agenda_medico (id serial not null,
													  id_medico int8 null,
													  id_procedimento_padrao int8 null,
													  tempo_padrao_atendimento int4 null,
													  visualizacao_padrao char(1) null,
													  horario_inicio_atendimento time null,
													  horario_fim_atendimento time null,
													  horario_inicio_intervalo time null,
													  horario_fim_intervalo time null,
												      observacoes text null,
											          status char(1) null,
											          created_at timestamp null,
											          updated_at timestamp null,
			                                          constraint agenda_medico_pk primary key (id),
		 	                                          constraint agenda_medico_medico_fk foreign key (id_medico) references clinica.medicos(id),
		 	                                          constraint agenda_medico_procedimento_fk foreign key (id_procedimento_padrao) references clinica.procedimentos(id));
create index agenda_medico_medico_ifk on agendamento.agenda_medico using btree (id_medico);
create index agenda_medico_procedimento_ifk on agendamento.agenda_medico using btree (id_procedimento_padrao);

create table if not exists agendamento.tpl_agenda_medico_dias_atendimento(id_agenda_medico int8 not null,
																  	      id_dia_atendimento int8 not null,
																		  created_at timestamp null,
																		  updated_at timestamp null,
																	  	  constraint tpl_amda_pk primary key (id_agenda_medico,id_dia_atendimento),
																	  	  constraint tpl_amda_agenda_medico_fk foreign key (id_agenda_medico) references agendamento.agenda_medico(id),
																	  	  constraint tpl_amda_dia_atendimento_fk foreign key (id_dia_atendimento) references clinica.dias_atendimento(id));
create index tpl_amda_agenda_medico_ifk on agendamento.tpl_agenda_medico_dias_atendimento using btree (id_agenda_medico);
create index tpl_amda_dia_atendimento_ifk on agendamento.tpl_agenda_medico_dias_atendimento using btree (id_dia_atendimento);

create table if not exists agendamento.agendamentos (id serial not null,
													 id_agenda_medico int8 null,
													 id_paciente int8 null,
													 id_paciente_convenio int8 null,
													 dia date null,
													 hora time null,
												     telefone_opcional text null,
												     email_opcional text null,
												     observacoes text null,
											         status char(1) null,
											         created_at timestamp null,
											         updated_at timestamp null,
			                                         constraint agendamento_pk primary key (id),
		 	                                         constraint agendamento_age_medico_fk foreign key (id_agenda_medico) references agendamento.agenda_medico(id),
		 	                                         constraint agendamento_paciente_fk foreign key (id_paciente) references paciente.pacientes(id),
		 	                                         constraint agendamento_paciente_convenio_fk foreign key (id_paciente_convenio) references paciente.convenios_paciente(id));
create index agendamento_age_medico_ifk on agendamento.agendamentos using btree (id_agenda_medico);
create index agendamento_paciente_ifk on agendamento.agendamentos using btree (id_paciente);
create index agendamento_paciente_convenio_ifk on agendamento.agendamentos using btree (id_paciente_convenio);

create table if not exists agendamento.tpl_agendamento_procedimentos(id_agendamento int8 not null,
													  	             id_procedimento int8 not null,
															         created_at timestamp null,
															         updated_at timestamp null,
														  	         constraint tpl_ap_pk primary key (id_agendamento,id_procedimento),
														  		     constraint tpl_ap_agendamento_fk foreign key (id_agendamento) references agendamento.agendamentos(id),
														  		     constraint tpl_ap_procedimento_fk foreign key (id_procedimento) references clinica.procedimentos(id));
create index tpl_ap_agendamento_ifk on agendamento.tpl_agendamento_procedimentos using btree (id_agendamento);
create index tpl_ap_procedimento_ifk on agendamento.tpl_agendamento_procedimentos using btree (id_procedimento);

create table if not exists agendamento.tags (id serial not null,
											 nome text null,
											 status char(1) null,
											 created_at timestamp null,
											 updated_at timestamp null,
			                                 constraint tag_pk primary key (id));

create table if not exists agendamento.tpl_agendamento_tags(id_agendamento int8 not null,
													  	    id_tag int8 not null,
													        created_at timestamp null,
													        updated_at timestamp null,
												  	        constraint tpl_at_pk primary key (id_agendamento,id_tag),
												  		    constraint tpl_at_agendamento_fk foreign key (id_agendamento) references agendamento.agendamentos(id),
												  		    constraint tpl_at_tag_fk foreign key (id_tag) references agendamento.tags(id));
create index tpl_at_agendamento_ifk on agendamento.tpl_agendamento_tags using btree (id_agendamento);
create index tpl_at_tag_ifk on agendamento.tpl_agendamento_tags using btree (id_tag);

create table if not exists agendamento.agendamento_situacoes (id serial not null,
															  nome text null,
															  descricao text null,
															  status char(1) null,
															  created_at timestamp null,
															  updated_at timestamp null,
							                                  constraint agendamento_situacao_pk primary key (id));

create table if not exists agendamento.tpl_agendamento_situacoes(id_agendamento int8 not null,
														  	     id_agendamento_situacao int8 not null,
														         created_at timestamp null,
														         updated_at timestamp null,
													  	         constraint tpl_as_pk primary key (id_agendamento,id_agendamento_situacao),
													  		     constraint tpl_as_agendamento_fk foreign key (id_agendamento) references agendamento.agendamentos(id),
													  		     constraint tpl_as_agesituacao_fk foreign key (id_agendamento_situacao) references agendamento.agendamento_situacoes(id));
create index tpl_as_agendamento_ifk on agendamento.tpl_agendamento_situacoes using btree (id_agendamento);
create index tpl_as_agesituacao_ifk on agendamento.tpl_agendamento_situacoes using btree (id_agendamento_situacao);