Projeto 1 - Sistema de Gestão de Clínica Médica 

Componentes: Leonardo Feijó Silva e Roda e Heloisa do Amaral 

Objetivos: Este projeto visa desenvolver um sistema automatizado para a gestão de consultas em uma clínica médica. O sistema facilita o cadastro de pacientes e médicos, permite o agendamento de consultas, além da listagem e remoção das mesmas. Um dos requisitos críticos é garantir a validação de dados importantes, como o CPF dos pacientes, para assegurar a integridade e a autenticidade das informações. 

Metodologia de desenvolvimento:  O desenvolvimento do sistema baseou-se em uma abordagem orientada a objetos (OO), uma metodologia que facilita a criação de sistemas modulares, escaláveis e de fácil manutenção. Inicialmente, foram identificadas as funcionalidades principais necessárias para o funcionamento da clínica: cadastro de pacientes e médicos, agendamento de consultas, listagem de consultas e a possibilidade de remoção das mesmas. Em seguida, foram definidas as interações esperadas entre os diferentes tipos de usuários do sistema, nomeadamente os médicos e os pacientes. 

Projeto 1 - código fonte

import os


class Pessoa:

    def __init__(self, nome, idade, sexo):

        self.__nome = nome

        self.__idade = idade

        self.__sexo = sexo


    @property

    def nome(self):

        return self.__nome


    @property

    def idade(self):

        return self.__idade


    @property

    def sexo(self):

        return self.__sexo


class Paciente(Pessoa):

    def __init__(self, cpf, nome, idade, sexo):

        super().__init__(nome, idade, sexo)

        self.__cpf = cpf

        self.__historico = []


    @property

    def cpf(self):

        return self.__cpf


    def adicionar_historico(self, consulta):

        self.__historico.append(consulta)


    def remover_historico(self, consulta):

        if consulta in self.__historico:

            self.__historico.remove(consulta)


    def get_historico(self):

        return self.__historico


class Medico(Pessoa):

    def __init__(self, nome, idade, sexo, especialidade, crm):

        super().__init__(nome, idade, sexo)

        self.__especialidade = especialidade

        self.__crm = crm


    @property

    def especialidade(self):

        return self.__especialidade


    @property

    def crm(self):

        return self.__crm


    def __str__(self):

        return f"{self.nome} ({self.especialidade})"


class Consulta:

    def __init__(self, paciente, medico, data, horario, motivo):

        self.__paciente = paciente

        self.__medico = medico

        self.__data = data

        self.__horario = horario

        self.__motivo = motivo


    @property

    def paciente(self):

        return self.__paciente


    @property

    def medico(self):

        return self.__medico


    @property

    def data(self):

        return self.__data


    @property

    def horario(self):

        return self.__horario


    @property

    def motivo(self):

        return self.__motivo


    def __str__(self):

        return f"{self.data} {self.horario} - {self.motivo} com {self.medico.nome} ({self.medico.especialidade})"


class Verificador:

    @staticmethod

    def verificador_cpf(cpf):

        nove_digitos = cpf[:9]

        contador_regressivo_1 = 10

        resultado_digito_1 = 0


        try:

            for digito in nove_digitos:

                resultado_digito_1 += int(digito) * contador_regressivo_1

                contador_regressivo_1 -= 1

            digito_1 = (resultado_digito_1 * 10) % 11

            digito_1 = str(digito_1 if digito_1 <= 9 else 0)


            contador_regressivo_2 = 11

            resultado_digito_2 = 0


            for digito_2 in nove_digitos + str(digito_1):

                resultado_digito_2 += int(digito_2) * contador_regressivo_2

                contador_regressivo_2 -= 1


            digito_2 = (resultado_digito_2 * 10) % 11

            digito_2 = str(digito_2 if digito_2 <= 9 else 0)


            cpf_verdadeiro = nove_digitos + digito_1 + digito_2


            return cpf_verdadeiro == cpf

        except ValueError:

            return False


class Clinica:

    def __init__(self):

        self.__pacientes = []

        self.__medicos = [

            Medico('Dr. Carlos', 45, 'M', 'Ortopedista', '1234'),

            Medico('Dr. Mariano', 50, 'M', 'Pediatra', '5678'),

            Medico('Dra. Letícia', 40, 'F', 'Otorrinolaringologista', '9101'),

            Medico('Dra. Patrícia', 35, 'F', 'Neurologista', '1121')

        ]

        self.__consultas = []


    @property

    def pacientes(self):

        return self.__pacientes


    @property

    def medicos(self):

        return self.__medicos


    @property

    def consultas(self):

        return self.__consultas


    def cadastrar_paciente(self, paciente):

        self.__pacientes.append(paciente)


    def listar_medicos(self):

        for i, medico in enumerate(self.__medicos, 1):

            print(f"{i}) {medico.nome} ({medico.especialidade})")


    def agendar_consulta(self, paciente, medico, data, horario, motivo):

        consulta = Consulta(paciente, medico, data, horario, motivo)

        self.__consultas.append(consulta)

        paciente.adicionar_historico(consulta)


    def listar_consultas(self):

        if self.__consultas:

            for i, consulta in enumerate(self.__consultas, 1):

                print(f"{i}) {consulta}")

        else:

            print("Nenhuma consulta cadastrada.")


    def listar_consultas_paciente(self, paciente):

        historico = [consulta for consulta in self.__consultas if consulta.paciente == paciente]

        if historico:

            for i, consulta in enumerate(historico, 1):

                print(f"{i}) {consulta}")

        else:

            print("Nenhuma consulta encontrada para este paciente.")


    def remover_consulta(self, paciente, consulta):

        if consulta in self.__consultas:

            self.__consultas.remove(consulta)

            paciente.remover_historico(consulta)

            os.system('cls')

            print("Consulta removida com sucesso!")

        else:

            print("Consulta não encontrada.")


class SistemaClinica:

    def __init__(self):

        self.clinica = Clinica()

        self.menu_principal()


    def menu_principal(self):

        while True:

            login = input('Login: [Medico/Paciente] ').strip().upper()

            if login == "PACIENTE":

                self.menu_paciente()

            elif login == "MEDICO":

                self.menu_medico()

            else:

                os.system('cls')

                print("Opção inválida. Tente novamente.")


    def menu_paciente(self):

        cpf = input('Insira seu CPF: ')

        if Verificador.verificador_cpf(cpf):

            paciente = next((p for p in self.clinica.pacientes if p.cpf == cpf), None)

            if not paciente:

                nome = input("Insira seu nome: ")

                idade = input("Insira sua idade: ")

                sexo = input("Insira seu sexo: ")

                paciente = Paciente(cpf, nome, idade, sexo)

                self.clinica.cadastrar_paciente(paciente)


            while True:

                os.system('cls')

                print('--------------------------------------------------')

                resposta = input(

                    '1 - Agendar consulta\n'

                    '2 - Ver consultas\n'

                    '3 - Remover consulta\n'

                    '4 - Sair\n'

                ).strip()


                if resposta == "1":

                    os.system('cls')

                    self.agendar_consulta(paciente)

                elif resposta == "2":

                    os.system('cls')

                    self.clinica.listar_consultas_paciente(paciente)

                elif resposta == "3":

                    os.system('cls')

                    self.remover_consulta(paciente)

                elif resposta == "4":

                    os.system('cls')

                    break

                else:

                    os.system('cls')

                    print("Opção inválida. Tente novamente.")


        else:

            os.system('cls')

            print("O CPF digitado não está correto. Por gentileza, refaça o login e insira um CPF válido")


    def agendar_consulta(self, paciente):

        self.clinica.listar_medicos()

        while True:

            try:

                medico_index = int(input("Escolha o médico pelo número: ")) - 1

                if 0 <= medico_index < len(self.clinica.medicos):

                    break

                else:

                    print("Número inválido. Tente novamente.")

            except ValueError:

                print("Entrada inválida. Digite um número.")


        medico = self.clinica.medicos[medico_index]

        data = input("Data da consulta (dd/mm/yyyy): ")

        horario = input("Horário da consulta (hh:mm): ")

        motivo = input("Motivo da consulta: ")

        self.clinica.agendar_consulta(paciente, medico, data, horario, motivo)

        os.system('cls')

        print("Consulta agendada com sucesso!")


    def remover_consulta(self, paciente):

        self.clinica.listar_consultas_paciente(paciente)

        while True:

            try:

                consulta_index = int(input("Escolha a consulta pelo número: ")) - 1

                if 0 <= consulta_index < len(self.clinica.consultas):

                    consulta = self.clinica.consultas[consulta_index]

                    self.clinica.remover_consulta(paciente, consulta)

                    break

                else:

                    print("Número inválido. Tente novamente.")

            except ValueError:

                print("Entrada inválida. Digite um número.")


    def menu_medico(self):

        while True:

            print('--------------------------------------------------')

            resposta = input(

                '1 - Ver consultas\n'

                '2 - Remover consulta\n'

                '3 - Sair\n'

            ).strip()


            if resposta == "1":

                os.system('cls')

                self.clinica.listar_consultas()

            elif resposta == "2":

                os.system('cls')

                self.remover_consulta_medico()

            elif resposta == "3":

                os.system('cls')

                break

            else:

                os.system('cls')

                print("Opção inválida. Tente novamente.")


    def remover_consulta_medico(self):

        self.clinica.listar_consultas()

        while True:

            try:

                consulta_index = int(input("Escolha a consulta pelo número: ")) - 1

                if 0 <= consulta_index < len(self.clinica.consultas):

                    consulta = self.clinica.consultas[consulta_index]

                    paciente = consulta.paciente

                    self.clinica.remover_consulta(paciente, consulta)

                    break

                else:

                    print("Número inválido. Tente novamente.")

            except ValueError:

                print("Entrada inválida. Digite um número.")


if __name__ == "__main__":

    SistemaClinica()