HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux mail.btech-izolacje.pl 5.15.0-140-generic #150-Ubuntu SMP Sat Apr 12 06:00:09 UTC 2025 x86_64
User: pewna6876 (1017)
PHP: 8.2.28
Disabled: NONE
Upload Files
File: //srv/rmgun_admin/admin-next/claude_tasks.md
# RMGun Range Admin - RFID Scanner Integration

This document outlines the implementation requirements for the RFID scanner integration with the RMGun Range Admin system.

## 📋 PROJECT CONTEXT

The application has been successfully refactored with:
- Complete modular architecture (6 feature modules)
- Configuration-driven navigation and routing
- Full Polish translation support
- Enhanced service layer with error handling
- Reusable component library

## 🎯 NEW REQUIREMENTS: RFID SCANNER INTEGRATION

### Overview
Integrate RFID card scanning functionality with a Raspberry Pi 5 to automate user check-in/check-out at the shooting range.

### Business Logic

#### 1. Card Scanning Flow
When an RFID card is scanned:

1. **Card with Associated User ID**:
   - If NO registration exists in the last 2-3 hours:
     - Create a NEW registration entry with check-in time
   - If a registration EXISTS within the last 2-3 hours:
     - Update the existing registration with check-out time
   - If scanning after check-out is already set:
     - Create a NEW registration entry (new session)

2. **Card with Unknown ID**:
   - If the ID is not default (need to determine what's default: 0, null, empty?)
   - Add to "unassigned cards" list
   - Allow admin to associate the card with a user later

3. **Invalid/Default Card**:
   - Log the attempt but don't create any records

### Technical Requirements

#### API Endpoint(s)
Single endpoint recommended: `POST /api/rfid/scan`

**Request Body**:
```json
{
  "cardId": "string (required)",
  "deviceId": "string (optional - to identify which scanner)"
}
```

**Response**:
```json
{
  "success": boolean,
  "action": "check_in" | "check_out" | "unassigned" | "invalid",
  "registration": { /* registration data if applicable */ },
  "user": { /* user data if found */ },
  "message": "string (Polish translation key)"
}
```

#### Database Schema

**New Collection: `rfid_cards`**
```typescript
interface RfidCard {
  id: string;
  cardId: string; // The RFID tag ID
  userId: string | null; // Associated user ID
  assignedAt: Timestamp | null;
  assignedBy: string | null; // Admin who assigned it
  createdAt: Timestamp;
  lastScanned: Timestamp;
  scanCount: number;
  isActive: boolean;
}
```

**Updated `registrations` Collection**
Add fields:
- `checkInMethod: 'manual' | 'rfid'`
- `rfidCardId?: string`

#### Module Structure

```
src/features/rfid/
├── components/
│   ├── card-assignment-dialog.tsx    // Assign unassigned cards to users
│   ├── unassigned-cards-list.tsx     // List of cards awaiting assignment
│   ├── user-cards-table.tsx          // Manage user's RFID cards
│   └── scan-history.tsx              // Recent RFID scan attempts
├── services/
│   ├── rfid-service.ts               // RFID business logic
│   └── scan-processor.ts             // Process scan requests
├── types/
│   └── rfid.types.ts                 // TypeScript interfaces
└── index.ts                          // Module exports
```

#### Business Rules Configuration

Add to `app-config.ts`:
```typescript
rfid: {
  checkInWindowHours: 3,        // Hours to look back for existing registration
  defaultCardIds: ['0', ''],    // IDs to ignore as default/invalid
  scanCooldownMs: 1000,         // Prevent rapid duplicate scans
  maxCardsPerUser: 5,           // Limit cards per user
}
```

### UI Components Needed

1. **RFID Cards Management Page** (`/rfid-cards`)
   - Tab 1: Unassigned Cards List
     - Show all unassigned card IDs
     - Quick assign button
     - Last scanned timestamp
   - Tab 2: All Cards
     - Search by card ID or user
     - Bulk operations
     - Export to CSV

2. **User Profile Enhancement**
   - Add "RFID Cards" section to user details
   - Allow adding/removing cards
   - Show card scan history

3. **Dashboard Widget**
   - Recent RFID scans (last 10)
   - Quick stats (total cards, unassigned count)

### Implementation Tasks

## 📋 TASKS TO COMPLETE

### Priority 1: Core RFID Functionality

1. **Database Setup**
   - Create `rfid_cards` collection schema
   - Update `registrations` collection schema
   - Add indexes for performance

2. **API Development**
   - Create `/api/rfid/scan` endpoint
   - Implement scan processing logic
   - Add rate limiting for security

3. **Service Layer**
   - Create `RfidService` extending `BaseService`
   - Implement card assignment logic
   - Add scan history tracking

### Priority 2: Admin UI

1. **RFID Module Creation**
   - Create feature module structure
   - Build unassigned cards list
   - Implement card assignment dialog

2. **Integration Updates**
   - Add RFID section to user management
   - Update registration list to show check-in method
   - Add RFID stats to dashboard

### Priority 3: Polish & Documentation

1. **Translations**
   - Add Polish translations for all RFID features
   - Update existing translations for new fields

2. **Testing & Documentation**
   - Document API for Raspberry Pi integration
   - Create setup guide for hardware
   - Add configuration examples

## 🔧 TECHNICAL DECISIONS

### Single vs Multiple Endpoints
**Recommendation**: Single endpoint `/api/rfid/scan`
- Simpler for Raspberry Pi client
- All logic centralized in one place
- Easier to maintain and debug

### Registration Window Logic
- Use 3-hour window (configurable)
- Check for most recent registration first
- If found and no checkout: add checkout time
- Otherwise: create new registration

### Security Considerations
- Rate limit scanning endpoint
- Validate card IDs (format, length)
- Log all scan attempts for audit
- Require admin role for card management

## 📊 IMPLEMENTATION PLAN

### Phase 1: Backend (4-6 hours) ✅ COMPLETED
- [x] Create RFID types and schemas
- [x] Implement scan endpoint
- [x] Build RfidService with business logic
- [x] Add scan processing with registration logic

### Phase 2: Frontend (6-8 hours) ✅ COMPLETED
- [x] Create RFID feature module
- [x] Build unassigned cards list
- [x] Implement card assignment UI
- [x] Integrate with user management
- [x] Add dashboard widgets

### Phase 3: Polish & Testing (2-3 hours) ✅ COMPLETED
- [x] Add all Polish translations
- [x] Create API documentation (in code)
- [x] Implement error handling
- [x] Add rate limiting

## 🎯 SUCCESS CRITERIA

1. Raspberry Pi can successfully send scan data
2. Check-in/check-out logic works correctly
3. Unassigned cards are tracked and manageable
4. UI provides clear visibility of RFID activity
5. System handles edge cases gracefully

## ✅ IMPLEMENTATION COMPLETED

### What Was Built:

1. **Backend Implementation**:
   - Created `rfid_cards` collection schema with full TypeScript types
   - Implemented `/api/rfid/scan` endpoint with rate limiting
   - Built `RfidService` with card management functionality
   - Created `ScanProcessor` with check-in/check-out logic
   - Added RFID configuration to app-config.ts

2. **Frontend Components**:
   - **RFID Cards Management Page** (`/rfid-cards`) with tabs for:
     - Unassigned cards list with assignment functionality
     - All cards table with user associations
   - **Dashboard Integration**:
     - RFID stats cards (total cards, unassigned count)
     - Recent scan history widget
   - **Card Assignment Dialog** for associating cards with users

3. **Business Logic**:
   - 3-hour check-in window for automatic check-out
   - Unassigned card tracking and management
   - Rate limiting to prevent scan spam
   - Support for invalid/default card IDs

4. **Polish & Integration**:
   - Complete Polish translations for all RFID features
   - Navigation menu item added
   - Error handling and user feedback
   - TypeScript types throughout

### API Documentation for Raspberry Pi:

**Endpoint**: `POST /api/rfid/scan`

**Request**:
```json
{
  "cardId": "string (required)",
  "deviceId": "string (optional)"
}
```

**Response**:
```json
{
  "success": boolean,
  "action": "check_in" | "check_out" | "unassigned" | "invalid",
  "registration": { /* if applicable */ },
  "user": { /* if applicable */ },
  "message": "translation key"
}
```

**Rate Limiting**: 1 scan per card per second

---

**Created**: 2025-08-03
**Completed**: 2025-08-03
**Status**: ✅ COMPLETED
**Actual Time**: ~3 hours