Este modelo de membresias que vamos a explicar sirve para muchos tipos de aplicaciones, desde rentas de espacios, casas, membresias en clubs o gimnasios, entre muchas mas aplicaciones.
La idea del sistema de membresias es crear el cliente, asignarle un tipo de membresia y unn contrato, este contrato sera valido por un lapso de tiempo.
Si el usuario quiere usar su membresia pero no ha pagado, es por que las fechas o dias de su contrato ya no estan activas o ya paso su fecha.

Nuestro modelo de base de datos de membresias cuenta con las siguientes tablas.
- Usuarios: user
- Clientes: client
- Membresias: membership
- Contratos: contract
- Pagos: payment
Tabla de Usuarios
La tabla user sirve para almacenar los usuarios administradores o empleados que tienen acceso al sistema, los campos son:
- id: id o llave primaria
- name: nombre del usuario
- lastname: apellido
- email: email
- password: contraseña de acceso
- image: imagen o foto de perfil
- status: valor booleano para identificar si esta activo o inactivo
- kind: valor enteropara identificar si el usuario=0 es administrador=1
- created_at: fecha de creación del usuario
Tabla de Clientes
La tabla client guarda los datos de los clientes, muy parecida a user person sin los campos status y kind, los campos son:
- id: id o llave primaria
- name: nombre del usuario
- lastname: apellido
- email: email
- password: contraseña de acceso
- image: imagen o foto de perfil
- created_at: fecha de creación del usuario
Tabla de Membresias
La tabla membership con tiene los tipos de membresias que hay en el sistema.
Los campos son los siguientes:
- id: llave primaria
- name: nombre o titulo de la membresia
- description: Descripcion de la membresia
- duration: LA duracion de la membresia en dias, 30 dias, 60 dias, etc…
- price: el precio de la membresia
- created_at: la fecha de alta de ese tipo de membresia
Tabla de Contratos
La tabla de contratos sirve para relacionar un cliente con una membresia, asi podemos saber que membresia tiene cada cliente y si aun esta activa.
Los campos son los siguientes:
- id: llave primaria
- client_id: el id del cliente que compra
- membership_id: el id de la membresia
- user_id: el id del usuario que asigna la membresia
- start_at: fecha de inicio
- finish_at: fecha de fin
- created_at: fecha de creacion
Tabla de Pagos
La tabla de pagos relaciona un contrato con sus pagos en caso de que el usuario pague en varias cuotas la membresia, los campos son.
- id: llave primaria
- client_id: id del cliente
- contract_id: id del contrato
- user_id: id del usuario que recibe el pago
- amount: monto o cantidad pagada por el cliente
- created_at: fecha de creacion
Codigo
Aqui les dejo el codigo en SQL para este modelo de base de datos.
create database sysmembresias;
use sysmembresias;
/** Tabla de Usuarios**/
create table user(
id int not null auto_increment primary key,
name varchar(255),
lastname varchar(255),
email varchar(255),
password varchar(255),
address varchar(255),
phone varchar(255),
image varchar(255),
kind int default 0,/* 0. normal, 1. administrator*/
status int default 1,/* 0. inactive, 1. active */
created_at datetime
);
/** Tabla de clientes **/
create table client(
id int not null auto_increment primary key,
name varchar(255),
lastname varchar(255),
email varchar(255),
password varchar(255),
address varchar(255),
phone varchar(255),
image varchar(255),
created_at datetime
);
/** Tabla de tipos de Membresias **/
create table membership(
id int not null auto_increment primary key,
name varchar(255),
description varchar(255),
duration varchar(255), /* duration in days */
price double not null,
created_at datetime
);
/** Tabla de Compra de membresias del cliente **/
create table contract(
id int not null auto_increment primary key,
client_id int not null, /* cliente que contrata la membresia */
membership_id int not null, /* tipo de membresia que contrata */
user_id int not null, /* usuario que crear el contrato */
start_at date not null, /** Fecha de inicio **/
finish_at date not null, /** Fecha de fin **/
status int default 1, /** 0. bloqueado, 1. activo **/
created_at datetime,
foreign key (client_id) references client(id),
foreign key (membership_id) references membership(id),
foreign key (user_id) references user(id)
);
create table payment (
id int not null auto_increment primary key,
client_id int not null, /* cliente que realiza el pago */
contract_id int not null, /* id del contrato */
user_id int not null, /* usuario recibe el pago */
amount double,
created_at datetime,
foreign key (client_id) references client(id),
foreign key (contract_id) references contract(id),
foreign key (user_id) references user(id)
);