8.8 KiB
Development Guide: Bank Transactions & Payment Recording
Complete implementation of bank transaction CSV import and AR invoice payment recording for the ERP platform.
Quick Links
Documentation
- API_ENDPOINTS.md - Complete API reference with examples
- IMPLEMENTATION_SUMMARY.md - Technical architecture and implementation details
- EXAMPLE_CSVs.md - Sample CSV files and testing guide
- FRONTEND_INTEGRATION_GUIDE.md - Frontend code examples and patterns
Code Files
- API: Bank Transaction Import -
/src/app/api/bank-transactions/import/route.ts - API: CSV Parser -
/src/app/api/bank-transactions/parse-csv/route.ts - UI: AR Invoice Detail -
/src/app/(dashboard)/finance/ar/invoice/[invoiceId]/page.tsx - UI: AR List Page -
/src/app/(dashboard)/finance/ar/page.tsx
What Was Built
Task 1: Bank Transaction CSV Import Endpoint
Two new API endpoints for importing bank transactions from CSV files:
-
POST
/api/bank-transactions/parse-csv- Accept CSV file upload
- Parse and validate
- Return preview of transactions
- No external dependencies (pure TypeScript CSV parser)
-
POST
/api/bank-transactions/import- Bulk import validated transactions
- Atomic operation (all or nothing)
- Verify bank account ownership
- Return count of imported transactions
Features:
- Supports 2 CSV formats (Amount or Debit/Credit columns)
- Handles quoted fields with commas
- Handles escaped quotes
- Auto-detects CSV format
- Comprehensive validation
- Organization isolation
Task 2: AR Invoice Payment Recording
Enhanced AR invoice detail page with payment recording capability:
-
Payment Recording Modal
- Form for entering payment details
- Payment amount (validated > 0)
- Payment date (date picker)
- Payment method (dropdown with 7 options)
- Error handling and loading states
-
Integration with Existing Payment API
- Uses existing
/api/paymentsendpoint - Automatically updates invoice balances
- Updates invoice status (PAID or PARTIALLY_PAID)
- Creates payment allocations
- Uses existing
-
AR List Page Integration
- "Record Payment" action in context menu
- Navigates to invoice detail with auto-opening modal
- Direct payment entry from list
Features:
- Modal auto-opens with query parameter
?action=payment - Form validation on client and server
- Error display with helpful messages
- Loading state during submission
- Auto-refresh after successful payment
- Maintains invoice context
Architecture
Authentication & Multi-Tenancy
- All endpoints use
getOrganization()for tenant isolation - Bank account ownership verified before import
- Organization ID included in all queries
Error Handling
- Standard HTTP status codes
- Descriptive error messages
- Input validation on both client and server
- Proper exception handling with try-catch
Data Flow
CSV Import
User uploads CSV
↓
Parse endpoint validates and extracts transactions
↓
UI displays preview of parsed transactions
↓
User confirms import
↓
Import endpoint validates and bulk inserts
↓
Success response with transaction count
↓
Transactions appear in bank account
Payment Recording
User clicks "Record Payment" button
↓
Modal form opens
↓
User enters payment details
↓
User submits form
↓
Payment endpoint creates payment record
↓
Invoice balances updated
↓
Invoice status updated
↓
Modal closes, page refreshes
API Reference
Parse CSV
POST /api/bank-transactions/parse-csv
Content-Type: multipart/form-data
file: [CSV file]
Response:
{
"success": true,
"count": 100,
"transactions": [
{
"transactionDate": "2024-01-15",
"description": "Office Supplies",
"transactionType": "DEBIT",
"amount": 150.50
}
]
}
Import Transactions
POST /api/bank-transactions/import
Content-Type: application/json
{
"bankAccountId": "uuid",
"transactions": [...]
}
Response:
{
"success": true,
"imported": 100,
"message": "Successfully imported 100 transaction(s)"
}
Record Payment
POST /api/payments
Content-Type: application/json
{
"paymentDate": "2024-01-20",
"paymentMethod": "ACH",
"paymentAmount": 1500.00,
"customerId": "uuid",
"invoiceId": "uuid",
"paymentAllocations": [...]
}
Response: Created payment object with payment number and allocations
Development Workflow
1. Testing CSV Import
Prepare Test Data:
- Create or download CSV file (see EXAMPLE_CSVs.md)
- Ensure correct format with Date, Description, Amount columns
- Verify bank account exists in system
Test Parse Endpoint:
curl -X POST http://localhost:3000/api/bank-transactions/parse-csv \
-F "file=@test.csv"
Test Import Endpoint:
curl -X POST http://localhost:3000/api/bank-transactions/import \
-H "Content-Type: application/json" \
-d '{
"bankAccountId": "your-account-id",
"transactions": [... parsed transactions ...]
}'
2. Testing Payment Recording
Manual Testing:
- Log into application
- Navigate to AR invoices
- Click on any open invoice
- Click "Record Payment" button
- Enter payment details
- Submit form
- Verify invoice status updates
Test with Query Parameter:
/finance/ar/invoice/{invoiceId}?action=payment
Should auto-open payment modal.
3. Frontend Integration
Build the CSV import UI using FRONTEND_INTEGRATION_GUIDE.md as reference:
- File upload component
- CSV preview table
- Bank account selector
- Import confirmation
CSV Format Examples
Format 1: Date, Description, Amount
Date,Description,Amount
2024-01-15,Office Supplies,150.50
2024-01-16,Client Payment,2500.00
Format 2: Date, Description, Debit, Credit
Date,Description,Debit,Credit
2024-01-15,Office Supplies,150.50,0
2024-01-16,Client Payment,0,2500.00
Format 3: With Quoted Descriptions
Date,Description,Amount
2024-01-15,"Office Supplies, Inc., Springfield",150.50
2024-01-16,"Client Payment, Invoice #INV-123",2500.00
See EXAMPLE_CSVs.md for more examples and bank-specific formats.
Common Issues & Troubleshooting
CSV Not Parsing
- Check column headers (Date, Description required)
- Verify file is valid CSV format
- Check for special characters in descriptions
- Ensure amounts are numeric without currency symbols
Import Fails
- Verify bank account ID is correct
- Check organization ownership
- Validate transaction types are DEBIT or CREDIT
- Ensure amounts are positive numbers
Payment Not Recording
- Verify customer exists
- Verify invoice exists and belongs to customer
- Check invoice status (some statuses may be readonly)
- Verify payment amount is greater than 0
Modal Not Opening
- Check URL has
?action=paymentquery parameter - Verify invoice detail page loads successfully
- Check browser console for JavaScript errors
- Clear browser cache and reload
Performance Considerations
CSV Import
- Supports files up to 10MB (50,000+ transactions)
- Bulk import in single database operation
- No row-by-row processing overhead
- Consider pagination for preview if 1000+ transactions
Payment Recording
- Modal form lightweight component
- Single API call per payment
- Invoice refetch may take few seconds
- Fallback to page refresh if needed
Security Notes
Authentication
- All endpoints require valid session
- Organization isolation enforced
- Bank account ownership verified
Input Validation
- Transaction amounts must be positive
- Transaction types must be valid enum
- Bank account must belong to organization
- Customer and invoice must exist and match organization
Data Protection
- CSV data validated before import
- Transactions created with status PENDING
- Organization ID required for all queries
- Proper HTTP status codes for errors
Future Enhancements
-
CSV Column Mapping
- Allow users to map custom CSV columns
- Save mappings for future imports
-
Batch Payment Import
- Import payments from CSV
- Auto-match to invoices
- Reconciliation matching
-
Payment Verification
- Confirm payment details (routing numbers, etc.)
- Store payment references
- Payment reconciliation workflow
-
Webhook Support
- Receive payment notifications
- Auto-create payment records
- Real-time reconciliation
-
Advanced Reporting
- Import history and audit trail
- Failed transaction log
- Reconciliation reports
Support & Questions
For questions about implementation, refer to:
- API_ENDPOINTS.md - API specifications
- IMPLEMENTATION_SUMMARY.md - Technical details
- FRONTEND_INTEGRATION_GUIDE.md - Code examples
- EXAMPLE_CSVs.md - CSV format guide
All code follows existing ERP platform patterns and conventions.