El modelo relacional presentado, consiste en un Marketplace que gestiona la creación de archivos digitales, texto, audio, video, etcétera.
Existen dos roles principales que son clientes 👫 y proveedores 🏭 estos proveedores estarán categorizados.
Los clientes generan solicitudes con el requerimiento específico del tipo de archivo necesitado y lo categorizan de tal manera que esas categorías son las que atenderán los proveedores.
La solicitud contendrá, el lenguaje en el que se requiere el archivo, un estado para manejo interno, se podrán adjuntar archivos, una descripción, la fecha requerida de entrega, y como la propuesta se genera en varios pasos, se almacena el paso en la cual el cliente ha dejado una solicitud.
Luego el cliente escoge de entre todas las propuestas presentadas por los proveedores la que más le convenga, convirtiendo esa propuesta en ganadora y por ende el proveedor de esa propuesta será el seleccionado.
Este es un Marketplace basado en saldo, el cual los clientes cargaran a través del sistema desarrollado y el mismo será administrado dentro del Marketplace.
Incluye el diagrama - entidad - relación
Tablas:
-
Usuarios (users): almacena todos los usuarios de la plataforma, clientes y proveedores.
-
Tipos de usuarios (types_user): almacena el tipo de usuario, clientes y proveedores.
-
Información de usuario (user_information): almacena toda la información relacionada con el usuario ya sea proveedor o cliente.
-
Créditos (credits): almacena la información del saldo o créditos del cliente.
-
Operaciones de crédito o saldo (credit_transaction): se almacenan las operaciones de crédito o débito relacionadas al saldo del usuario.
-
Tipo de crédito (credit_type): almacena el tipo de operación ya sea crédito o débito.
-
Propuestas (proposal): almacena las propuestas hechas por los proveedores, una solicitud puede tener más de una propuesta, además esta tabla contiene un campo porcentaje para uso interno el cual determina la ganancia para el operador de la plataforma, en las propuestas se podrán ir colocando archivos adjuntos para mostrar el desarrollo del trabajo y finalmente el archivo solicitado por el cliente.
-
Adjuntos (attachment): almacena los archivos tanto de ejemplos de clientes, como de desarrollo y final por parte del proveedor.
-
Orden adjunto (order_attach): tabla que relaciona el archivo con la propuesta (1:M)
-
Estados del Marketplace (states_marketplace): tabla para manejo interno de los distintos estados dentro del Marketplace.
-
Ordenes ó Solicitudes (orders): tabla que maneja la información principal de una solicitud tanto para el cliente como para el proveedor.
-
Orden Adjunto (order_attach): relación (1:M) entre la orden y la tabla adjuntos.
-
Lenguajes (languages): almacena los distintos idiomas disponibles para las solicitudes.
-
Tipos de orden (types_order): almacena si la orden va por concurso o a un proveedor favorito.
-
Orden categoría (order_catgory): almacena una o varias categorías de la orden.
-
Orden país (order_country): almacena el o los países a los que va dirigida la solicitud.
-
País (countries): almacena la información de los países.
-
Items (items): almacena el tipo de formato requerido y todas sus características requeridas.
-
Formato de archivo (formats_file): Tipos de archivos, digitales, texto, audio, video, etcétera, que maneja la plataforma y pueden ser desarrollados por los proveedores.
-
Categorías de formato de archivo (category_format): almacena las categorías en las que puede estar dividida un formato.
La carga de creditos consiste en actualizar el balance actual del usuario, este se lleva a cabo de la siguinte manera: cuando el usuario necesita cargar creditos o saldo va a la aplicación y selecciona cargar, acá entra en juego la tabla credit_type, cuando se hace la operación de insert en la tabla credit_transaction se dispara un trigger que llama a un procedimiento almacenado (store_procedure) dentro de la base de datos.
La secuencia seria la siguiente:
INSERT
INTO credit_transaction
(credit_type_id, user_id, amount, description)
VALUES
(1, 1, 35, 'Recarga de $35');
Al hacer el insert se ejecuta el trigger trigger_CreditTransactions, que a su vez llama al store_procedure sp_CreditsUpdate el procedmiento almacenado recibe los parametros generados por el trigger y se ejecuta la operación de cálculo de credito. Esta operación sera de suma o resta dependiendo del tipo de transacción que se este llevando a cabo, para credito sera 1 y para debito sera 2.
El código del procedimiento almacenado es el siguiente:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_CreditsUpdate`(
IN `p_credit_type_id` INT,
IN `p_user_id` INT,
IN `p_amount` DECIMAL(10,2),
IN `p_description` VARCHAR(500)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Actualiza los creditos del Usuario Cliente'
BEGIN
IF p_credit_type_id = 1 THEN
UPDATE
credits
SET
credits.balance = credits.balance - p_amount
WHERE
credits.user_id = p_user_id;
ELSE
UPDATE
credits
SET
credits.balance = credits.balance + p_amount
WHERE
credits.user_id = p_user_id;
END IF;
END