A full-stack application developed for ExpertSoft to centralize and manage financial data from Fintech platforms like Nequi and Daviplata. This project transforms disorganized spreadsheet data into a structured, normalized relational database and provides a robust API and a user-friendly dashboard for data management.
The system features a decoupled backend built with Node.js, Express, and MySQL, and a dynamic frontend built with Vanilla JavaScript, Vite, and Bootstrap. It demonstrates a professional tier architecture, advanced database querying, and a full CRUD interface for customer management.
- Name: Antonio Santiago
- Clan: Macondo
- Email: santiagor.acarlos@gmail.com
- ✅ Database Normalization (1NF, 2NF, 3NF): Raw Excel data was analyzed and structured into a relational model, eliminating redundancy and ensuring data integrity.
- ✅ Decoupled Architecture: A clear separation between the RESTful API backend and the Single-Page Application (SPA) frontend.
- ✅ Professional Backend Structure: Implements a 3-tier architecture (Controllers, Services, Routes) for high maintainability and separation of concerns.
- ✅ Full CRUD Functionality: Complete Create, Read, Update, and Delete operations for managing customer data through the API and a visual dashboard.
- ✅ Advanced Reporting API: Includes complex endpoints to generate key business insights:
- Total amount paid per customer.
- List of all invoices with a pending balance.
- All transactions filtered by payment platform.
- ✅ Efficient Data Seeding: A reusable script allows for bulk data population from normalized CSV files, ensuring a ready-to-use environment.
- ✅ Dynamic & Responsive Frontend: A fast, modern frontend built with Vite, featuring a modular structure (
api.js,ui.js,app.js) and a clean UI styled with Bootstrap.
- Backend: Node.js, Express.js, MySQL (with
mysql2),dotenv,cors,morgan,cross-env. - Frontend: Vanilla JavaScript (ES6+), Vite, Bootstrap 5.
- API Testing: Postman.
- Database Design: Mermaid language and preview for the ERD, MySQL Workbench for implementation.
The initial Excel data was denormalized, with significant data repetition. The normalization process resulted in four distinct entities to ensure data integrity and eliminate redundancy.
- Customers: Stores unique information for each client.
- Payment Platforms: A catalog table for payment methods (e.g., Nequi, Daviplata).
- Invoices: Contains invoice-specific data, linked to a single customer.
- Transactions: Stores individual payment records, linked to a single invoice and a payment platform.
- Transaction-types: Stores type of transactions, linked to a single transaction.
Prerequisites: Node.js v20+, npm, and a running MySQL server.
-
Navigate to the backend directory:
cd backend -
Install dependencies:
npm install
-
Configure Environment:
- In the root of the
backenddirectory, create a file named.env. - Copy the content below and paste it into your new
.envfile. Adjust the values to match your local MySQL setup.
# .env - Example Configuration DB_HOST=localhost DB_USER=root DB_PASSWORD=your_mysql_password DB_NAME=experts_fintech_db DB_PORT=3306 PORT=3000
Note: For a standard local setup, you might only need to fill in
DB_PASSWORD.DB_NAMEmust match the database you create in the next step. - In the root of the
-
Create Database Schema:
- Import the
database.sqlscript into your MySQL server. This will create the database (experts_fintech_db) and all necessary tables.
- Import the
-
Run the Data Seeding Script:
- This script will load the data from the CSV files in
backend/server/data/into your newly created tables.
npm run seed
- This script will load the data from the CSV files in
-
Start Backend Server:
npm run dev
The API will be running at
http://localhost:3000.
- Open a new terminal and navigate to the frontend directory:
cd frontend - Install dependencies:
npm install
- Start Vite Dev Server:
The application will be accessible at
npm run dev
http://localhost:5173.
The Postman collection with all endpoints is included in the repository.
| Method | Path | Description |
|---|---|---|
GET |
/customers |
Get all customers. |
POST |
/customers |
Create a new customer. |
GET |
/customers/:id |
Get a customer by ID. |
PUT |
/customers/:id |
Update a customer. |
DELETE |
/customers/:id |
Delete a customer. |
| Method | Path | Description |
|---|---|---|
GET |
/customers/total-paid |
Get total amount paid per customer. |
GET |
/invoices/pending |
Get all invoices with an outstanding balance. |
GET |
/transactions/platform/:platformId |
Get all transactions for a specific platform. |
- Modular Design: Code is organized into logical modules following the Single Responsibility Principle.
- Asynchronous JavaScript: Modern
async/awaitsyntax is used for clean and readable asynchronous operations. - Separation of Concerns: A clear separation between HTTP logic (Controllers) and database logic (Services).
- DRY Principle: Repetitive logic, such as API request handling and error responses, is centralized in helper functions and middleware.
