# Gym Khana Management System - MongoDB Edition

A comprehensive management system for club/gym khanas built with Node.js, Express, and MongoDB.

## 🎯 Features

- ✅ **User Management** - Multi-role system (admin, front desk, restaurant staff, etc.)
- ✅ **Member Management** - Member registration with family member support
- ✅ **Restaurant Module** - Menu, tables, orders, and payments
- ✅ **Warehouse Module** - Inventory management, stock tracking, suppliers
- ✅ **Sports Facilities** - Booking and usage tracking
- ✅ **Financial Management** - Transactions, credit limits, account balances
- ✅ **Reports & Analytics** - Sales reports, usage statistics

## 🗄️ Database Migration

This project has been migrated from **PostgreSQL to MongoDB** to leverage:
- Better scalability for document-based data
- Flexible schema for evolving requirements
- Simplified relationships with embedded documents
- Better performance for read-heavy operations

See [MIGRATION_PROGRESS.md](./MIGRATION_PROGRESS.md) for detailed migration status.

## 🚀 Quick Start

### Prerequisites
- Node.js v22+ (originally v24.11.1+)
- MongoDB (local or Atlas)
- npm or yarn

### Installation

1. **Clone the repository**
```bash
git clone <repository-url>
cd gym-khana-new-backend
```

2. **Install dependencies**
```bash
npm install
```

3. **Configure environment**

Create a `.env` file in the root directory:
```env
# Server Configuration
NODE_ENV=development
PORT=3000
API_VERSION=v1

# MongoDB Configuration
MONGODB_URI=mongodb://localhost:27017/gym_khana_db
# For MongoDB Atlas:
# MONGODB_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/gym_khana_db

# JWT Configuration
JWT_SECRET=your_super_secret_jwt_key_change_this_in_production
JWT_EXPIRES_IN=24h
JWT_REFRESH_SECRET=your_super_secret_refresh_key
JWT_REFRESH_EXPIRES_IN=7d

# Security
BCRYPT_ROUNDS=10
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100

# Business Configuration
DEFAULT_CREDIT_LIMIT=10000
NEAR_LIMIT_THRESHOLD=8000
TAX_PERCENTAGE=16
CURRENCY=PKR

# File Upload
UPLOAD_PATH=./uploads
MAX_FILE_SIZE=5242880

# Logging
LOG_LEVEL=info
LOG_FILE_PATH=./logs

# CORS
CORS_ORIGIN=*
```

4. **Seed the database**
```bash
npm run seed
```

This will create:
- All user roles
- Membership types
- Super admin account
- Test member accounts (primary + dependent)
- Sample menu items, tables, facilities, etc.

5. **Start the server**
```bash
# Development mode (with auto-reload)
npm run dev

# Production mode
npm start
```

Server will start on `http://localhost:3000`

## 🔐 Default Login Credentials

After running the seed script:

### Super Admin
- **Endpoint**: `POST /api/v1/auth/login`
- **Username**: `admin`
- **Password**: `Admin@123`

### Primary Member
- **Endpoint**: `POST /api/v1/auth/member/login`
- **Member ID**: `1000`
- **Name**: Ahmed Khan
- **Password**: `Member@123`

### Dependent Member (Wife)
- **Endpoint**: `POST /api/v1/auth/member/login`
- **Member ID**: `1000-w`
- **Name**: Sara Khan (Wife)
- **Password**: `Member@123`

## 📡 API Endpoints

### Authentication
```
POST   /api/v1/auth/login              # Staff login
POST   /api/v1/auth/member/login        # Member login
GET    /api/v1/auth/me                  # Get current user profile
PUT    /api/v1/auth/change-password     # Change password
```

### Users (Admin only)
```
POST   /api/v1/users                    # Create user
GET    /api/v1/users                    # Get all users
GET    /api/v1/users/:userId            # Get user by ID
PUT    /api/v1/users/:userId            # Update user
DELETE /api/v1/users/:userId            # Deactivate user
POST   /api/v1/users/:userId/reset-password  # Reset password
GET    /api/v1/users/roles              # Get all roles
```

### Members
```
POST   /api/v1/members/register         # Register new member
POST   /api/v1/members/:id/family       # Add family member
GET    /api/v1/members                  # Get all members
GET    /api/v1/members/search           # Search members
GET    /api/v1/members/:memberId        # Get member details
PUT    /api/v1/members/:memberId/profile    # Update profile
PUT    /api/v1/members/:memberId/status     # Update status
GET    /api/v1/members/:memberId/family     # Get family members
DELETE /api/v1/members/:memberId/family/:familyId  # Remove family member
```

### Restaurant Module
```
GET    /api/v1/restaurant/menu          # Get menu items
POST   /api/v1/restaurant/menu          # Add menu item
PUT    /api/v1/restaurant/menu/:id      # Update menu item
DELETE /api/v1/restaurant/menu/:id      # Delete menu item

GET    /api/v1/restaurant/tables        # Get all tables
PUT    /api/v1/restaurant/tables/:id/status  # Update table status

POST   /api/v1/restaurant/orders        # Create order
```

### Warehouse Module
```
GET    /api/v1/warehouse/items          # Get warehouse items
POST   /api/v1/warehouse/items          # Add warehouse item
GET    /api/v1/warehouse/items/:id      # Get item details
PUT    /api/v1/warehouse/items/:id      # Update item
DELETE /api/v1/warehouse/items/:id      # Delete item
GET    /api/v1/warehouse/low-stock      # Get low stock items

POST   /api/v1/warehouse/stock/in       # Record stock IN
POST   /api/v1/warehouse/stock/out      # Record stock OUT
POST   /api/v1/warehouse/stock/adjustment   # Adjust stock

GET    /api/v1/warehouse/suppliers      # Get suppliers
POST   /api/v1/warehouse/suppliers      # Add supplier
GET    /api/v1/warehouse/suppliers/:id  # Get supplier details
PUT    /api/v1/warehouse/suppliers/:id  # Update supplier

GET    /api/v1/warehouse/purchase-orders     # Get purchase orders
POST   /api/v1/warehouse/purchase-orders     # Create PO
GET    /api/v1/warehouse/purchase-orders/:id # Get PO details
PUT    /api/v1/warehouse/purchase-orders/:id # Update PO
```

## 📦 API Response Format

All APIs return a standardized response format:

### Success Response
```json
{
  "success": true,
  "message": "Operation successful",
  "timestamp": "2026-01-19T12:00:00.000Z",
  "data": {
    // Response data here
  },
  "meta": {
    // Optional pagination or additional metadata
    "page": 1,
    "limit": 20,
    "total": 100
  }
}
```

### Error Response
```json
{
  "success": false,
  "message": "Error message",
  "timestamp": "2026-01-19T12:00:00.000Z",
  "errors": [
    {
      "field": "fieldName",
      "message": "Specific error message"
    }
  ]
}
```

## 🔐 Authentication

The API uses JWT (JSON Web Tokens) for authentication.

### Getting a Token
1. Login via `/api/v1/auth/login` or `/api/v1/auth/member/login`
2. Receive `accessToken` and `refreshToken` in response
3. Include token in subsequent requests

### Using the Token
Add to request headers:
```
Authorization: Bearer <your_access_token>
```

### Token Expiry
- Access Token: 24 hours (configurable)
- Refresh Token: 7 days (configurable)

## 👥 User Roles & Permissions

| Role | Description | Access |
|------|-------------|--------|
| **admin** | System administrator | Full access to all modules |
| **front_desk** | Reception staff | Member management, check-in |
| **restaurant_staff** | Restaurant operations | Menu, orders, tables |
| **warehouse_manager** | Inventory management | Stock, suppliers, POs |
| **accountant** | Financial operations | Reports, transactions |
| **sports_manager** | Sports facilities | Bookings, usage tracking |
| **member** | Club member | Self-service portal |

## 💳 Member Account System

### Credit Limit System
- Default credit limit: PKR 10,000
- Members can use services on credit
- System blocks services when limit is exceeded

### Account Status
- **Normal**: Balance < PKR 8,000
- **Near Limit**: Balance between PKR 8,000 - 10,000
- **Exceeded**: Balance >= PKR 10,000 (service blocked)

### Family Member System
Member IDs follow a pattern:
- **Primary Member**: `1000`
- **Wife/Spouse**: `1000-w`
- **Son 1**: `1000-s1`
- **Son 2**: `1000-s2`
- **Daughter 1**: `1000-d1`

## 🏗️ Project Structure

```
gym-khana-new-backend/
├── src/
│   ├── config/          # Configuration files (database, logger, app)
│   ├── controllers/     # Business logic
│   │   ├── restaurant/  # Restaurant module controllers
│   │   ├── warehouse/   # Warehouse module controllers
│   │   ├── authController.js
│   │   ├── userController.js
│   │   └── memberController.js
│   ├── middleware/      # Express middleware
│   ├── models/          # Mongoose models
│   ├── routes/          # API routes
│   ├── utils/           # Helper utilities
│   └── server.js        # Express app entry point
├── scripts/
│   └── seed.js          # Database seeding script
├── database/
│   └── schema.sql       # Original PostgreSQL schema (reference)
├── .env.example         # Environment variables template
├── package.json
└── README_MONGODB.md
```

## 🛠️ Development

### Available Scripts
```bash
npm run dev      # Start development server with auto-reload
npm start        # Start production server
npm run seed     # Seed database with sample data
```

### Adding New Features
1. Create Mongoose model in `src/models/`
2. Create controller in `src/controllers/`
3. Add routes in `src/routes/`
4. Use standardized response format (see `src/utils/helpers.js`)

## 🐛 Troubleshooting

### MongoDB Connection Issues
```bash
# Check if MongoDB is running
sudo systemctl status mongod

# Start MongoDB
sudo systemctl start mongod
```

### Port Already in Use
Change `PORT` in `.env` file or kill existing process:
```bash
lsof -ti:3000 | xargs kill -9
```

### Seed Script Errors
Ensure MongoDB is running and accessible:
```bash
mongosh "mongodb://localhost:27017/gym_khana_db"
```

## 📝 Migration Status

Current migration progress: **~25%**

**Completed**:
- ✅ All MongoDB models (20 models)
- ✅ Authentication system
- ✅ Middleware (auth, error handling)
- ✅ Database seeding

**In Progress**:
- 🟡 User Management controller
- 🟡 Member Management controller
- 🟡 Restaurant controllers
- 🟡 Warehouse controllers

See [MIGRATION_PROGRESS.md](./MIGRATION_PROGRESS.md) for details.

## 📄 License

ISC

## 👨‍💻 Author

Gym Khana Management Team

---

**Happy Coding! 🚀**
