//// tablas independientes
'Tipo',
    {
      Name: DataTypes.TEXT
    },
'Tipodos',
    {
      Name: DataTypes.TEXT
    },
'Duracion',
    {
      Name: DataTypes.TEXT,
    },
'Diagnostico',
    {
    CodigoCIE: {DataTypes.TEXT, unique: 'diagnostico_codigocie_unique'}
      Title: DataTypes.TEXT,
      Detail: DataTypes.TEXT
    }
'Empresa',
    {
      Name: DataTypes.STRING(100),
      BusinessName: DataTypes.TEXT,
      Address: DataTypes.TEXT,
      Email: DataTypes.TEXT,
      Phone: DataTypes.TEXT,
      Phone2: DataTypes.TEXT,
      Logo: DataTypes.TEXT,
      History: DataTypes.TEXT,
      Mision: DataTypes.TEXT,
      Vision: DataTypes.TEXT
    }
'Especialidad',
    {
      Name: DataTypes.STRING(100),
      Resume: DataTypes.TEXT,
      Price: DataTypes.DECIMAL,
      Icon: DataTypes.TEXT,
      Image: DataTypes.TEXT
    }
'Antecedenteheredofamiliar',
    {
      Name: DataTypes.TEXT
    }
'Antecedentenopatologico',
    {
      Name: DataTypes.TEXT
    }
'Antecedentepatologico',
    {
      Name: DataTypes.TEXT
    }
'Admin',
      {
        Name: DataTypes.STRING(100),
        LastName: DataTypes.STRING(100),
        Phone: DataTypes.STRING(15),
        Email: {
          type: DataTypes.STRING(200),
          unique: 'admin_email_unique'
        },
        Password: DataTypes.TEXT,
        Condition: DataTypes.TEXT,
        ConditionMin: DataTypes.TEXT,
        Photo: DataTypes.TEXT,
        Code: DataTypes.TEXT
      }, 
'Doctor',
    {
    Name: DataTypes.STRING(100),
    LastName: DataTypes.STRING(100),
    MedicalSchoolNumber: DataTypes.STRING(50),
    Email: {
      type: DataTypes.STRING(200),
      unique: 'doctor'
    },
    Password: DataTypes.TEXT,
    Photo: DataTypes.TEXT,
    Code: DataTypes.TEXT,
    Condition: DataTypes.TEXT
  },
'Cliente',
    {
    Name: DataTypes.STRING(100),
    LastName: DataTypes.STRING(100),
    BirthDate: DataTypes.DATE,
    Job: DataTypes.STRING(100),
    Direction: DataTypes.STRING(100),
    Phone: DataTypes.STRING(15),
    Gender: DataTypes.STRING(10),
    CivilStatus: DataTypes.STRING(25),
    DocumentNumber: {
      type: DataTypes.STRING(15),
      unique: 'cliente_docnumber_unique'
    },
    Email: DataTypes.STRING(200),
    Password: DataTypes.TEXT,
    Photo: DataTypes.TEXT,
    Google: DataTypes.TEXT,
    Code: DataTypes.TEXT,
    Condition: DataTypes.TEXT,
    G: DataTypes.TEXT,
    P: DataTypes.TEXT,
    A: DataTypes.TEXT,
    C: DataTypes.TEXT,
    Fum: DataTypes.DATE,
    Papsmear: DataTypes.TEXT,
    Bloodtype: DataTypes.TEXT,
    Others: DataTypes.TEXT,
    Othershereditary: DataTypes.TEXT,
    Otherspathological: DataTypes.TEXT,
    Medicine: DataTypes.TEXT,
    PreviousSurgeries: DataTypes.TEXT (defaultValue: 'Ninguna')
  },
//// tablas dependientes
'Especialista',
    {
      Turn: DataTypes.TEXT,
      models.Doctor,
      { 
        foreignKey: 'DoctorId',
        as: 'doctor'
      }
      models.Especialidad,
      { 
        foreignKey: 'EspecialidadId',
        as: 'especialidad'
      }
    },

'Cita',
    {
      Appointment: DataTypes.DATE,
      Reason: DataTypes.TEXT,
      Amount: DataTypes.TEXT,
      Pay: DataTypes.TEXT,
      Paymentstatus: DataTypes.TEXT,
      Condition: DataTypes.TEXT,
      Type: DataTypes.TEXT,
      Referred: DataTypes.TEXT,
      Companion: DataTypes.TEXT,
      Relationship: DataTypes.STRING(20),
      BloodPressure: DataTypes.TEXT,
      HeartRate: DataTypes.TEXT,
      BreathingFrequency: DataTypes.TEXT,
      Temperature: DataTypes.TEXT,
      Saturation: DataTypes.TEXT,
      SickTime: DataTypes.TEXT,
      CurrentEpisode: DataTypes.TEXT,
      StartWay: DataTypes.TEXT,
      SignsandSymptoms: DataTypes.TEXT,
      DescriptionProblem: DataTypes.TEXT,
      SurgicalHistory: DataTypes.TEXT,
      MedicalHistory: DataTypes.TEXT,
      AllergicHistory: DataTypes.TEXT,
      PhysicalExam: DataTypes.TEXT,
      Diagnosis: DataTypes.TEXT,
      LaboratoryExam: DataTypes.TEXT,
      Creatininevalue: DataTypes.TEXT,
      Urea: DataTypes.TEXT,
      ETS: DataTypes.BOOLEAN,
      Specifyothers: DataTypes.TEXT,
      Labamount: DataTypes.TEXT,
      Labpay: DataTypes.TEXT,
      Labpaymentstatus: DataTypes.TEXT,
      Labstatus: DataTypes.TEXT,
      Labreceptiondate: DataTypes.DATE,
      Labresultdate: DataTypes.DATE,
      AgendaId: DataTypes.INTEGER (foranea de agenda)
      models.Admin, 
      { 
        foreignKey: 'AdminId',
        as: 'admin'
      },
      models.Cliente,
      { 
        foreignKey: 'ClienteId',
        as: 'cliente'
      }
    },

'Detallecita',
  {
    Othersduration: DataTypes.TEXT,
    Startdate: DataTypes.DATE,
    Frequency: DataTypes.TEXT,
    Datethatbecameimportant: DataTypes.DATE,
    Perday: DataTypes.TEXT,
    Perweek: DataTypes.TEXT,
    Permonth: DataTypes.TEXT,
    Byyear: DataTypes.TEXT,
    Scale: DataTypes.TEXT,
    Datescale: DataTypes.DATE,
    Treatment: DataTypes.TEXT,
    Observations: DataTypes.TEXT,
    Protocol: DataTypes.BOOLEAN,
    Protocoltype: DataTypes.TEXT,
    models.Cita,
    { 
      foreignKey: 'CitaId',
      as: 'cita'
    }
  },

'Dermatomafrontal',
    {
      DFC1: DataTypes.BOOLEAN,
      DFC21: DataTypes.BOOLEAN,
      DFC22: DataTypes.BOOLEAN,
      DFC3: DataTypes.BOOLEAN,
      DFC4: DataTypes.BOOLEAN,
      DFC51: DataTypes.BOOLEAN,
      DFC52: DataTypes.BOOLEAN,
      DFC61: DataTypes.BOOLEAN,
      DFC62: DataTypes.BOOLEAN,
      DFC71: DataTypes.BOOLEAN,
      DFC72: DataTypes.BOOLEAN,
      DFC81: DataTypes.BOOLEAN,
      DFC82: DataTypes.BOOLEAN,
      DFD101: DataTypes.BOOLEAN,
      DFD102: DataTypes.BOOLEAN,
      DFD103: DataTypes.BOOLEAN,
      DFD2: DataTypes.BOOLEAN,
      DFD3: DataTypes.BOOLEAN,
      DFD4: DataTypes.BOOLEAN,
      DFD5: DataTypes.BOOLEAN,
      DFD6: DataTypes.BOOLEAN,
      DFD7: DataTypes.BOOLEAN,
      DFD8: DataTypes.BOOLEAN,
      DFD9: DataTypes.BOOLEAN,
      DFD10: DataTypes.BOOLEAN,
      DFD11: DataTypes.BOOLEAN,
      DFD12: DataTypes.BOOLEAN,
      DFL1: DataTypes.BOOLEAN,
      DFL21: DataTypes.BOOLEAN,
      DFL22: DataTypes.BOOLEAN,
      DFL31: DataTypes.BOOLEAN,
      DFL32: DataTypes.BOOLEAN,
      DFL41: DataTypes.BOOLEAN,
      DFL42: DataTypes.BOOLEAN,
      DFL51: DataTypes.BOOLEAN,
      DFL52: DataTypes.BOOLEAN,
      DFS11: DataTypes.BOOLEAN,
      DFS12: DataTypes.BOOLEAN,
      DFS2: DataTypes.BOOLEAN,
      DFS3: DataTypes.BOOLEAN,
      models.Cita,
      { 
        foreignKey: 'CitaId',
        as: 'cita'
      }
    },

'Dermatomaposterior',
    {
      DDC2: DataTypes.BOOLEAN,
      DDC3: DataTypes.BOOLEAN,
      DDC4: DataTypes.BOOLEAN,
      DDC51: DataTypes.BOOLEAN,
      DDC52: DataTypes.BOOLEAN,
      DDC53: DataTypes.BOOLEAN,
      DDC61: DataTypes.BOOLEAN,
      DDC62: DataTypes.BOOLEAN,
      DDC63: DataTypes.BOOLEAN,
      DDC71: DataTypes.BOOLEAN,
      DDC72: DataTypes.BOOLEAN,
      DDC73: DataTypes.BOOLEAN,
      DDC81: DataTypes.BOOLEAN,
      DDC82: DataTypes.BOOLEAN,
      DDC83: DataTypes.BOOLEAN,
      DDD101: DataTypes.BOOLEAN,
      DDD102: DataTypes.BOOLEAN,
      DDD103: DataTypes.BOOLEAN,
      DDD2: DataTypes.BOOLEAN,
      DDD3: DataTypes.BOOLEAN,
      DDD4: DataTypes.BOOLEAN,
      DDD5: DataTypes.BOOLEAN,
      DDD6: DataTypes.BOOLEAN,
      DDD7: DataTypes.BOOLEAN,
      DDD8: DataTypes.BOOLEAN,
      DDD9: DataTypes.BOOLEAN,
      DDD10: DataTypes.BOOLEAN,
      DDD11: DataTypes.BOOLEAN,
      DDD12: DataTypes.BOOLEAN,
      DDL1: DataTypes.BOOLEAN,
      DDL2: DataTypes.BOOLEAN,
      DDL31: DataTypes.BOOLEAN,
      DDL32: DataTypes.BOOLEAN,
      DDL41: DataTypes.BOOLEAN,
      DDL42: DataTypes.BOOLEAN,
      DDL51: DataTypes.BOOLEAN,
      DDL52: DataTypes.BOOLEAN,
      DDL53: DataTypes.BOOLEAN,
      DDL54: DataTypes.BOOLEAN,
      DDS11: DataTypes.BOOLEAN,
      DDS12: DataTypes.BOOLEAN,
      DDS13: DataTypes.BOOLEAN,
      DDS14: DataTypes.BOOLEAN,
      DDS21: DataTypes.BOOLEAN,
      DDS22: DataTypes.BOOLEAN,
      DDS3: DataTypes.BOOLEAN,
      DDS4: DataTypes.BOOLEAN,
      DDS5: DataTypes.BOOLEAN,
      models.Cita,
      { 
        foreignKey: 'CitaId',
        as: 'cita'
      }
    },
'Laboratorio',
    {
      Name: DataTypes.TEXT,
      Detail: DataTypes.TEXT,
      Price: DataTypes.DECIMAL,
      models.Tipo,
      {
        foreignKey: 'TipoId',
        as: 'tipo'
      }
    },
'Laboratoriodos',
    {
      Name: DataTypes.TEXT,
      Detail: DataTypes.TEXT,
      Price: DataTypes.DECIMAL,
      Plurality: DataTypes.STRING(6),
      Code: DataTypes.STRING(5),
      models.Tipodos,
      {
        foreignKey: 'TipodosId',
        as: 'tipodos'
      }
    },
'ItemLaboratorio',
    {
      Name: DataTypes.TEXT,
      Method: DataTypes.TEXT,
      Measurement: DataTypes.STRING(20),
      ReferentialRange: DataTypes.TEXT,
      models.Laboratorio,
      {
        foreignKey: 'LaboratorioId',
        as: 'laboratorio'
      }
    },
'Laboratoriodoscita',
    {
      Value: DataTypes.BOOLEAN,
      Location: DataTypes.STRING(15),
      Amount: DataTypes.STRING(3),
      Condition: DataTypes.STRING(100),
      models.Cita,
      { 
        foreignKey: 'CitaId',
        as: 'cita'
      },
      models.Laboratoriodos,
      { 
        foreignKey: 'LaboratoriodosId',
        as: 'laboratoriodos'
      }
    },
'Analisis',
    {
      Value: DataTypes.BOOLEAN,
      Condition: DataTypes.STRING(25),
      models.Cita,
      { 
        foreignKey: 'CitaId',
        as: 'cita'
      },
      models.Laboratorio,
      { 
        foreignKey: 'LaboratorioId',
        as: 'laboratorio'
      }
    },
'Resultado',
    {
      Value: DataTypes.STRING(20),
      Condition: DataTypes.STRING(25),
      Detail: DataTypes.TEXT,
      models.ItemLaboratorio,
      {
        foreignKey: 'ItemLaboratorioId',
        as: 'itemlaboratorio'
      },
       models.Cita,
      {
        foreignKey: 'CitaId',
        as: 'cita'
      }
    },
'Examepaciente',
    {
      Burning: DataTypes.BOOLEAN,
      Painfulcoldsensation: DataTypes.BOOLEAN,
      Electricshocks: DataTypes.BOOLEAN,
      Tingle: DataTypes.BOOLEAN,
      Sensationofpinsandneedles: DataTypes.BOOLEAN,
      Numbness: DataTypes.BOOLEAN,
      Itch: DataTypes.BOOLEAN,
      Hypoaesthesiatotouch: DataTypes.BOOLEAN,
      Hypoaesthesiatopunctures: DataTypes.BOOLEAN,
      Brushed: DataTypes.BOOLEAN,
      Fecha: DataTypes.DATE,
      Punctuacion: DataTypes.STRING(2),
      models.Detallecita,
      { 
        foreignKey: 'DetallecitaId',
        as: 'detallecita'
      }
    },
'Duracioncita',
    {
      Condition: DataTypes.STRING(10),
      models.Detallecita,
      { 
        foreignKey: 'DetallecitaId',
        as: 'detallecita'
      },
      models.Duracion,
      { 
        foreignKey: 'DuracionId',
        as: 'duracion'
      }
},
'Cartilla'
{
    Therapy: DataTypes.STRING(200),
    Session: DataTypes.INTEGER,
    Patient: DataTypes.TEXT,
    Diagnosis: DataTypes.TEXT,
    Status: DataTypes.STRING(50)
}
'ItemCartilla'
{
    SessionNumber: DataTypes.INTEGER,
    Fecha: DataTypes.DATE,
    Hora: DataTypes.STRING(20),
    AdverseReaction: DataTypes.TEXT,
    CartillaId: DataTypes.INTEGER (foranea de Cartilla),
    AgendaId: DataTypes.INTEGER (foranea de agenda)
}

'Auditoria', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    UsuarioId: {
        type: DataTypes.INTEGER,
        allowNull: true,
    },
    Registroid: {
        type: DataTypes.INTEGER,
        allowNull: true,
    },
    Accion: {
        type: DataTypes.STRING,
        allowNull: true,
    },
    Tabla: {
        type: DataTypes.STRING,
        allowNull: true,
    },
    Resumen: {
        type: DataTypes.STRING,
        allowNull: true,
    },
    Detalle: {
        type: DataTypes.TEXT,
        allowNull: true,
    },
    Interaccion: {
        type: DataTypes.DATE,
        allowNull: true,
    },
}

'Agendamiento', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    FechayHoraInicio: {
        type: DataTypes.STRING,
        allowNull: false
    },
    FechayHoraFin: {
        type: DataTypes.STRING,
        allowNull: false
    },
    Type:{ DataTypes.TEXT,
        allowNull: false},
    Referidopor: {
        type: DataTypes.STRING,
        allowNull: false
    },
    PacienteAgendado: {
        type: DataTypes.STRING,
        allowNull: false
    },
    DoctorAsignado: {
        type: DataTypes.STRING,
        allowNull: false
    },
    Servicio: {
        type: DataTypes.STRING,
        allowNull: false
    },
    UsuarioIdentificador: {
        type: DataTypes.INTEGER,
        allowNull: false
    },
    Estado: {
        type: DataTypes.STRING,
        allowNull: false
    },
    PacienteId: {
        type: DataTypes.INTEGER,
        allowNull: false
    },
    DoctorId: {
        type: DataTypes.INTEGER,
        allowNull: false
    }
}
'Antecedenteheredofamiliarhistoria',
    {
      Condition: DataTypes.STRING(15),
      models.Cliente,
      { 
        foreignKey: 'ClienteId',
        as: 'cliente'
      },
      models.Antecedenteheredofamiliar,
      { 
        foreignKey: 'AntecedenteheredofamiliarId',
        as: 'antecedenteheredofamiliar'
      }
    },
'Antecedentenopatologicohistoria',
    {
      Condition: DataTypes.STRING(15),
      models.Cliente,
      { 
        foreignKey: 'ClienteId',
        as: 'cliente'
      },
      models.Antecedentenopatologico,
      { 
        foreignKey: 'AntecedentenopatologicoId',
        as: 'antecedentenopatologico'
      }
    },
'Antecedentepatologicohistoria',
    {
      Condition: DataTypes.STRING(10),
      models.Cliente,
      { 
        foreignKey: 'ClienteId',
        as: 'cliente'
      },
      models.Antecedentepatologico,
      { 
        foreignKey: 'AntecedentepatologicoId',
        as: 'antecedentepatologico'
      }
    },


con node js, sequelize, teniendo como base de datos posgresql
creame un crud simple de cada tablas
filtros y busquedas para las tablas dependientes
si hace falta mas busquedas y filtros mas rebuscados, te los estare pidiendo


✅ Todos los modelos (33 tablas) listo
✅ Controladores CRUD para cada tabla
✅ Rutas con filtros y búsquedas
✅ Middlewares (auth, validación, error handling)
✅ Configuración de Swagger
✅ Server principal con todas las configuraciones

login para los admin y doctor