Commit Graph

536 Commits

Author SHA1 Message Date
Dries Peeters 1596537512 Complete translation system implementation and fixes
This commit implements comprehensive internationalization (i18n) support
across the entire TimeTracker application, ensuring all user-facing strings
are properly translatable.

## Translation Implementation

### Route Files (Flash Messages)
- Fixed all untranslated flash messages in route files:
  * app/routes/admin.py (36 messages)
  * app/routes/tasks.py (43 messages)
  * app/routes/timer.py (44 messages)
  * app/routes/projects.py (33 messages)
  * app/routes/payments.py (28 messages)
  * app/routes/clients.py (25 messages)
  * app/routes/invoices.py (24 messages)
  * Plus all other route files (recurring_invoices, kanban, reports, etc.)
- Added missing `from flask_babel import _` imports to:
  * app/routes/setup.py
  * app/routes/budget_alerts.py
  * app/routes/saved_filters.py
  * app/routes/reports.py
  * app/routes/time_entry_templates.py

### Template Files
- Fixed headers and labels in templates:
  * admin/user_form.html
  * audit_logs/view.html
  * timer/timer_page.html
  * reports/index.html
  * reports/user_report.html
  * time_entry_templates/view.html
  * recurring_invoices/view.html
- Fixed form placeholders in:
  * expense_categories/form.html
  * expenses/form.html
  * mileage/form.html
  * per_diem/form.html
  * per_diem/rate_form.html
- Fixed button and link text in list views:
  * invoices/list.html
  * payments/list.html
  * expenses/list.html
  * per_diem/list.html
  * projects/list.html
- Fixed title attributes for accessibility

### Email Templates
- Added translation support to all email templates:
  * quote_sent.html, quote_rejected.html, quote_expired.html
  * quote_expiring.html, quote_approved.html, quote_accepted.html
  * quote_approval_request.html, quote_approval_rejected.html
  * invoice.html, overdue_invoice.html
  * task_assigned.html, comment_mention.html
  * client_portal_password_setup.html
  * weekly_summary.html, test_email.html
  * quote.html

### Component Templates
- Fixed save_filter_widget.html with translated text
- Updated JavaScript strings in quote_pdf_layout.html

## Translation Files

### Extraction and Updates
- Extracted all new translatable strings using pybabel
- Updated all language catalogs (.po files) with new strings
- Languages updated: en, nl, de, fr, it, fi, es, ar, he, nb, no

### Automatic Translation
- Created scripts/complete_all_translations.py for automatic translation
- Translated ~3,100 strings per language using Google Translate API
- Translation completion rates:
  * Dutch (NL): 99.97% (3,098/3,099)
  * German (DE): 99.94% (3,097/3,099)
  * French (FR): 99.97% (3,098/3,099)
  * Italian (IT): 99.90% (3,096/3,099)
  * Finnish (FI): 99.06% (3,070/3,099)
  * Spanish (ES): 99.97% (3,098/3,099)
  * Arabic (AR): 99.97% (3,098/3,099)
  * Hebrew (HE): 99.90% (3,096/3,099)
  * Norwegian Bokmål (NB): 99.94% (3,097/3,099)
  * Norwegian (NO): 99.94% (3,097/3,099)

### Placeholder Fixes
- Created scripts/fix_translation_placeholders.py
- Fixed 281 placeholder name errors across all languages
- Preserved original English placeholder names (e.g., %(error)s, %(rate)s)
- Fixed format specifier issues (e.g., %(rate).2f%%)

## Bug Fixes

### Code Fixes
- Fixed indentation error in app/routes/timer.py (line 458)
- Fixed missing translation function imports in route files

### Translation Compilation
- All translation catalogs now compile successfully
- No compilation errors remaining
- All .mo files generated correctly

## Scripts Added

- scripts/complete_all_translations.py: Automatic translation using deep-translator
- scripts/fix_translation_placeholders.py: Fix placeholder names in translations

## Impact

- All user-facing strings are now translatable
- Application supports 11 languages with >99% translation coverage
- Improved user experience for non-English speakers
- Consistent translation system across all application components
2025-11-24 14:01:31 +01:00
Dries Peeters 0c2a1e25b8 Merge pull request #298 from DRYTRIX/Feat-Completeness
Feat completeness
2025-11-23 20:39:57 +01:00
Dries Peeters 25ea52c029 feat: Implement CRM features and fix migration issues
- Add CRM models: Contact, ContactCommunication, Deal, DealActivity, Lead, LeadActivity
  - Support multiple contacts per client with primary contact designation
  - Track sales pipeline with deals and opportunities
  - Manage leads with conversion tracking
  - Record communication history with contacts

- Add CRM routes and templates
  - Contact management (list, create, view, edit, delete)
  - Deal management with pipeline view
  - Lead management with conversion workflow
  - Communication history tracking

- Fix SQLAlchemy relationship conflicts
  - Specify foreign_keys for Deal.lead relationship to resolve ambiguity
  - Remove duplicate backref definitions in DealActivity and LeadActivity

- Improve migration 062 robustness
  - Add index existence checks before creation
  - Handle partial migration states gracefully
  - Support both assigned_to and assignee_id column names

- Add error handling for missing CRM tables
  - Gracefully handle cases where migration 063 hasn't run yet
  - Prevent application crashes when CRM tables don't exist

- Add database migration 063 for CRM features
  - Create contacts, contact_communications, deals, deal_activities, leads, lead_activities tables
  - Set up proper foreign key relationships and indexes

- Update documentation
  - Add CRM features to FEATURES_COMPLETE.md
  - Create CRM implementation documentation
  - Add feature gap analysis documentation
2025-11-23 20:38:35 +01:00
Dries Peeters 9d1ece5263 feat: Implement comprehensive architectural improvements and new features
This commit implements a complete architectural transformation of the TimeTracker
application, introducing modern design patterns and comprehensive feature set.

## Architecture Improvements

### Service Layer (18 Services)
- TimeTrackingService: Time entry management with timer functionality
- ProjectService: Project operations and lifecycle management
- InvoiceService: Invoice creation, management, and status tracking
- TaskService: Task management and workflow
- ExpenseService: Expense tracking and categorization
- ClientService: Client relationship management
- PaymentService: Payment processing and invoice reconciliation
- CommentService: Comment system for projects, tasks, and quotes
- UserService: User management and role operations
- NotificationService: Notification delivery system
- ReportingService: Report generation and analytics
- AnalyticsService: Event tracking and analytics
- ExportService: CSV export functionality
- ImportService: CSV import with validation
- EmailService: Email operations and invoice delivery
- PermissionService: Role-based permission management
- BackupService: Database backup operations
- HealthService: System health checks and monitoring

### Repository Layer (9 Repositories)
- BaseRepository: Generic CRUD operations
- TimeEntryRepository: Time entry data access
- ProjectRepository: Project data access with filtering
- InvoiceRepository: Invoice queries and status management
- TaskRepository: Task data access
- ExpenseRepository: Expense data access
- ClientRepository: Client data access
- UserRepository: User data access
- PaymentRepository: Payment data access
- CommentRepository: Comment data access

### Schema Layer (9 Schemas)
- Marshmallow schemas for validation and serialization
- Create, update, and full schemas for all entities
- Input validation and data transformation

### Utility Modules (15 Utilities)
- api_responses: Standardized API response helpers
- validation: Input validation utilities
- query_optimization: N+1 query prevention and eager loading
- error_handlers: Centralized error handling
- cache: Caching foundation (Redis-ready)
- transactions: Transaction management decorators
- event_bus: Domain event system
- performance: Performance monitoring decorators
- logger: Enhanced structured logging
- pagination: Pagination utilities
- file_upload: Secure file upload handling
- search: Full-text search utilities
- rate_limiting: Rate limiting helpers
- config_manager: Configuration management
- datetime_utils: Enhanced date/time utilities

## Database Improvements
- Performance indexes migration (15+ indexes)
- Query optimization utilities
- N+1 query prevention patterns

## Testing Infrastructure
- Comprehensive test fixtures (conftest.py)
- Service layer unit tests
- Repository layer unit tests
- Integration test examples

## CI/CD Pipeline
- GitHub Actions workflow
- Automated linting (Black, Flake8, Pylint)
- Security scanning (Bandit, Safety, Semgrep)
- Automated testing with coverage
- Docker image builds

## Documentation
- Architecture migration guide
- Quick start guide
- API enhancements documentation
- Implementation summaries
- Refactored route examples

## Key Benefits
- Separation of concerns: Business logic decoupled from routes
- Testability: Services and repositories can be tested in isolation
- Maintainability: Consistent patterns across codebase
- Performance: Database indexes and query optimization
- Security: Input validation and security scanning
- Scalability: Event-driven architecture and health checks

## Statistics
- 70+ new files created
- 8,000+ lines of code
- 18 services, 9 repositories, 9 schemas
- 15 utility modules
- 5 test files with examples

This transformation establishes a solid foundation for future development
and follows industry best practices for maintainable, scalable applications.
2025-11-23 20:00:10 +01:00
Dries Peeters 01b12687ae Merge pull request #297 from DRYTRIX/Feat-Inventory
feat: Complete inventory management system implementation
2025-11-23 18:41:07 +01:00
Dries Peeters 73dfeecbaa feat: Complete inventory management system implementation
Add comprehensive inventory management system with full feature set including
stock tracking, warehouse management, supplier management, purchase orders,
transfers, adjustments, and reporting.

Core Features:
- Stock Items: Full CRUD operations with categories, SKU, barcodes, pricing
- Warehouse Management: Multi-warehouse support with stock level tracking
- Supplier Management: Multi-supplier support with supplier-specific pricing
- Purchase Orders: Complete PO lifecycle (draft, sent, received, cancelled)
- Stock Transfers: Transfer stock between warehouses with audit trail
- Stock Adjustments: Dedicated interface for stock corrections
- Stock Reservations: Reserve stock for quotes/invoices/projects
- Movement History: Complete audit trail for all stock movements
- Low Stock Alerts: Automated alerts when items fall below reorder point

Reports & Analytics:
- Inventory Dashboard: Overview with key metrics and statistics
- Stock Valuation: Calculate total inventory value by warehouse/category
- Movement History Report: Detailed movement log with filters
- Turnover Analysis: Inventory turnover rates and sales analysis
- Low Stock Report: Comprehensive low stock items listing

Integration:
- Quote Integration: Stock reservation when quotes are created
- Invoice Integration: Automatic stock reduction on invoice payment
- Project Integration: Stock allocation for project requirements
- API Endpoints: RESTful API for suppliers, purchase orders, and inventory

Technical Implementation:
- 9 new database models with proper relationships
- 3 Alembic migrations for schema changes
- 60+ new routes for inventory management
- 20+ templates for all inventory features
- Comprehensive permission system integration
- CSRF protection on all forms
- Full menu navigation integration

Testing:
- Unit tests for inventory models
- Route tests for inventory endpoints
- Integration tests for quote/invoice stock integration

Documentation:
- Implementation plan document
- Missing features analysis
- Implementation status tracking
2025-11-23 18:39:22 +01:00
Dries Peeters f184020c1e Merge pull request #296 from DRYTRIX/Feat-Offers
feat: implement comprehensive quote management system with PDF editor
2025-11-23 16:09:26 +01:00
Dries Peeters acd30bc015 feat: implement comprehensive quote management system with PDF editor
Major Features:
- Complete quote management system with CRUD operations
- Quote items management with dynamic add/remove functionality
- Discount system (percentage and fixed amount)
- Payment terms integration with invoice creation
- Approval workflow with status tracking
- Quote attachments with client visibility control
- Quote templates for reusable configurations
- Quote versioning for revision history
- Email notifications for quote lifecycle events
- Scheduled tasks for expiring quote reminders
- Client portal integration for quote viewing/acceptance
- Bulk actions for quote management
- Analytics dashboard for quote metrics

UI/UX Improvements:
- Consistent table layout matching projects/clients pages
- Professional quote view page with improved action buttons
- Enhanced create/edit forms with organized sections
- Dynamic line items management in quote forms
- PDF template editor accessible via admin menu
- PDF submenu under Admin with Invoice and Quote options
- Fixed admin menu collapse when opening nested dropdowns

PDF Template System:
- Quote PDF layout editor with visual design tools
- Separate preview route for quote PDF templates
- Template reset functionality
- Support for multiple page sizes (A4, Letter, Legal, A3, A5, Tabloid)

Bug Fixes:
- Fixed 405 Method Not Allowed error on quote PDF save
- Fixed UnboundLocalError with translation function shadowing
- Fixed quote preview template context (quote vs invoice)
- Updated template references from invoice to quote variables

Database:
- Added 9 Alembic migrations for quote system schema
- Support for quotes, quote_items, quote_attachments, quote_templates, quote_versions
- Integration with existing comments system

Technical:
- Added Quote, QuoteItem, QuoteAttachment, QuoteTemplate, QuoteVersion models
- Extended comment routes to support quotes
- Integrated payment terms from quotes to invoices
- Email notification system for quote events
- Scheduled task for expiring quote checks
2025-11-23 16:08:31 +01:00
Dries Peeters 0e9f461e90 fix: improve rich text rendering and invoice editor preview functionality
This commit addresses several issues with rich text display and the invoice
PDF layout editor:

Rich Text Rendering:
- Enhanced markdown filter to properly detect and preserve HTML content
  from WYSIWYG editor, allowing full rich text styling (colors, fonts,
  alignment) to be displayed correctly
- Improved HTML detection logic to distinguish between HTML and markdown
  content, ensuring markdown lists are properly processed
- Added support for style, class, and id attributes on all rich text
  elements (p, div, span, headings, lists, tables, etc.)
- Fixed list rendering in project/task descriptions with improved CSS:
  - Added explicit display properties for lists
  - Set proper list-style-type (disc for ul, decimal for ol)
  - Improved spacing and nested list support

Invoice Editor Improvements:
- Fixed table header text extraction: now reads actual header text from
  canvas elements instead of hardcoding English text, supporting
  internationalization (e.g., German headers)
- Preserved text alignment (left, center, right) in generated preview
  by reading Konva Text align attribute and applying text-align CSS
- Fixed PDF preview to show updated template:
  - Changed generateCode() to return template body content instead of
    full HTML document (matches preview endpoint expectations)
  - Added cache-busting to preview requests to prevent stale content
  - Improved error handling in preview fetch

Files changed:
- app/utils/template_filters.py: Enhanced markdown filter with HTML
  detection and style preservation
- app/static/enhanced-ui.css: Improved list styling for prose content
- templates/admin/pdf_layout.html: Fixed table header extraction, text
  alignment preservation, and preview generation format
2025-11-20 21:23:14 +01:00
Dries Peeters 60fb259f9e Fix scheduled task errors and improve error handling
- Fix webhook retry scheduled task app context issue
  * Update retry_failed_webhooks() to properly capture and use app instance
  * Pass app instance when registering scheduled tasks
  * Prevents 'Working outside of application context' errors

- Improve timezone function error handling
  * Add app context check before database access in get_app_timezone()
  * Gracefully fallback to environment variable when app context unavailable
  * Prevents RuntimeError when accessing database outside app context

- Add error deduplication to prevent stacked error messages
  * Track recent errors to prevent duplicate notifications within 1 minute
  * Reduces error message stacking when same error occurs repeatedly
  * Still logs all errors to console for debugging

- Fix theme toggle endpoint error
  * Change from /api/preferences (PATCH) to /api/theme (POST)
  * Add proper error handling to prevent unhandled promise rejections
  * Fixes 405 Method Not Allowed error when changing theme

- Bump version to 3.10.3
2025-11-20 20:51:53 +01:00
Dries Peeters 4e8b42ad56 Fix SQLAlchemy session attachment errors in client portal tests
Replace db.session.refresh() with User.query.get() to query for user
objects fresh in the current session context. This prevents 'Object is
already attached to session X (this is Y)' errors that occur when the
user fixture object from one session is used in different session
contexts, particularly when making requests through the test client.

Fixes 8 failing tests:
- test_get_client_portal_data_with_invoices
- test_get_client_portal_data_with_time_entries
- test_client_portal_dashboard_with_access
- test_client_portal_projects_route
- test_client_portal_invoices_route
- test_client_portal_time_entries_route
- test_view_invoice_belongs_to_client
- test_admin_can_disable_client_portal
2025-11-18 12:49:01 +01:00
Dries Peeters eda3e64a55 Fix code quality, route tests, and database locked errors
- Fix missing jsonify import in app/routes/main.py
  - Added jsonify to Flask imports to resolve F821 undefined name errors
  - Fixes flake8 code quality check failures

- Fix client portal access check in app/routes/client_portal.py
  - Ensure client relationship is properly loaded when checking portal access
  - Query client directly if relationship not loaded to prevent 403 errors
  - Resolves route test failures where tests expected 200 but got 403

- Fix database locked errors in test_client_portal.py
  - Use db.session.no_autoflush blocks when modifying user client portal settings
  - Prevents audit logging from interfering with test transactions
  - Add db.session.refresh() after commits to ensure fresh state
  - Fixes SQLite database locked errors in model and route tests

All three issues (code quality checks, route test failures, and database
locked errors) are now resolved.
2025-11-18 11:51:31 +01:00
Dries Peeters 5ace391bd9 feat(i18n): Add comprehensive translation support across all templates
- Replace hardcoded English strings with translation function calls in 36 template files
- Update translation files for all supported languages (ar, de, es, fi, fr, he, it, nb, nl, no)
- Add over 55,000 new translation entries across all language files
- Update extract_translations.py to use 'python -m babel.messages.frontend' instead of pybabel
- Improve internationalization coverage for UI elements including:
  * Skip to content links
  * Sidebar toggle buttons
  * Command palette placeholders
  * Admin dashboard elements
  * Form labels and buttons
  * Report templates
  * Payment and invoice views

This commit significantly improves the application's multilingual support
by making previously hardcoded strings translatable.
2025-11-18 11:35:57 +01:00
Dries Peeters 6ba233aa0e Fix text editing in PDF editor item tables
- Enable direct editing of text elements within item/expenses tables
- Add double-click functionality to select and edit table text elements
- Add Ctrl/Cmd+Click to select individual text elements instead of parent group
- Improve text element detection using multiple methods (className, getType, constructor)
- Enhance event listeners with input, change, and paste handlers
- Add visual feedback: text cursor on hover over editable table text
- Increase textarea size to 8 rows for table items (from 3)
- Properly escape HTML special characters in text content
- Add helpful hint text for table text editing
- Fix text content conversion: handle \\n to actual newlines correctly
2025-11-18 07:55:11 +01:00
Dries Peeters bcb6b6ee86 fix(i18n): add Norwegian translation support and improve error logging
- Add 'nb' (Norwegian Bokmål) to translation extraction script
  This ensures Norwegian translations are properly included when
  extracting and updating translation catalogs.

- Improve translation compilation error logging
  Add exc_info=True to log full exception tracebacks when translation
  compilation fails, making it easier to diagnose issues with missing
  or corrupted .mo files.

Fixes issue where Norwegian (norsk) translations were not working
due to missing compiled .mo files. The app will now properly compile
Norwegian translations on startup, and any compilation errors will
be logged with full stack traces for debugging.
2025-11-18 06:22:59 +01:00
Dries Peeters d44e13847b Fix layout shift when support banner appears
Replace display:none with visibility-based hiding to reserve space
for the support banner from page load. This prevents the page from
jumping when the banner becomes visible after the 2-second delay.

- Use opacity-0/invisible instead of hidden class to keep element in layout
- Reserve banner space immediately when it should be shown
- Add smooth transition for better UX
- Update dismiss function to use new visibility classes
2025-11-18 06:02:08 +01:00
Dries Peeters e6d0deb8ad Fix PDF Layouter: Prevent accidental deletion and enable table editing
- Fix keyboard shortcuts to respect text input focus
  * Delete/Backspace only removes elements when not editing text fields
  * Arrow keys only move elements when not editing text fields
  * Prevents accidental deletion while typing in properties panel

- Add full editing support for items table and expenses table
  * Properties panel now shows editable fields for table Groups
  * Supports editing header text, font size, font style, and color
  * Supports editing items template, font size, and color
  * Supports editing separator line color and width
  * Supports editing table width

- Fix table selection behavior
  * Clicking on child elements (header, items, line) now selects parent Group
  * Ensures table can be selected and edited from any part
  * Adds click handlers to all child elements when creating tables

- Improve error handling and debugging
  * Add comprehensive logging for troubleshooting
  * Add try-catch blocks for table property processing
  * Add fallback display for unrecognized Groups

This fixes the issue where users couldn't edit table properties and
prevents frustrating accidental deletions while typing in input fields.
2025-11-17 19:54:30 +01:00
Dries Peeters b6af07454c Fix project descriptions not respecting paragraphs/newlines
- Apply markdown filter to project descriptions in list view
- Apply markdown filter to project descriptions in client portal
- Ensures project descriptions render paragraphs and newlines correctly, matching task description behavior
2025-11-17 19:31:07 +01:00
Dries Peeters d2a477da0c Improve sidebar scrollbar styling for better UI consistency
- Add custom scrollbar styling for sidebar navigation menu
- Implement thin, subtle scrollbar with transparent track
- Support both light and dark themes with appropriate opacity
- Add hover effects for better user interaction
- Compatible with Firefox (scrollbar-width/color) and Webkit browsers
- Fixes default browser scrollbar appearance when sidebar content overflows
2025-11-17 19:24:49 +01:00
Dries Peeters 3f73cb35c8 feat(i18n): Add Norwegian translation support and improve internationalization
- Add Norwegian (Norsk) language support with locale code normalization (no -> nb)
- Create Norwegian translation files (translations/nb/ and translations/no/)
- Fill empty Norwegian translation strings with English fallback values
- Add locale normalization for Flask-Babel compatibility (no -> nb mapping)
- Update context processor to correctly display 'Norsk' label instead of 'NB'

Translation improvements:
- Wrap all hardcoded strings in templates with _() translation function
- Add missing translations for setup, timer, tasks, invoices, and admin templates
- Ensure brandnames 'drytrix' and 'TimeTracker' remain untranslated across all languages
- Add new translation strings to all language files (en, de, nl, fr, it, fi, es, no, ar, he)
- Update translation files for: initial_setup, manual_entry, tasks/list, email_templates, etc.

Bug fixes:
- Add missing /api/summary/today endpoint for daily summary notifications
- Fix 'Response body already consumed' error in smart-notifications.js
- Improve translation compilation logging and error handling
- Add debug endpoint /debug/i18n for troubleshooting translation issues

Technical changes:
- Improve ensure_translations_compiled() with better logging
- Add locale normalization function for Norwegian locale handling
- Update context processor to reverse-map normalized locales for display
- Fix JavaScript fetch error handling to check response.ok before reading body
2025-11-17 19:21:24 +01:00
Dries Peeters 43324047b3 Update setup.py 2025-11-15 07:18:11 +01:00
Dries Peeters 13828bfe6a Fix onboarding tour rendering on mobile devices
The onboarding tour was incorrectly rendering on mobile devices (width < 768px), appearing as a small dot in the top-left corner with a dark overlay that blocked app access on the dashboard screen.

Changes:

- Add mobile detection (width <= 768px) in OnboardingManager.init() to prevent tour initialization on mobile devices

- Skip auto-start of tour on mobile in DOMContentLoaded handler

- Mark tour as completed on mobile to prevent future attempts

- Add window resize handler to cancel active tour if window is resized to mobile size

- Add mobile-responsive CSS styles for tooltip (for future use)

- Apply same mobile checks to EnhancedOnboardingManager

The tour is now automatically disabled on mobile devices, allowing users to access the app without the broken overlay blocking them. The tour continues to work normally on desktop devices.

Fixes: Onboarding tour broken layout on mobile (< 768px width)
2025-11-15 07:17:57 +01:00
Dries Peeters 9f4ab335fe tests 2025-11-14 21:57:59 +01:00
Dries Peeters 07d9d13240 Update conftest.py 2025-11-14 21:34:33 +01:00
Dries Peeters fdb43bf1e0 fixed tests 2025-11-14 21:26:36 +01:00
Dries Peeters 7275388c35 Update test_currency_display.py 2025-11-14 20:01:34 +01:00
Dries Peeters 882dc2da43 Update tests 2025-11-14 19:53:05 +01:00
Dries Peeters 119f40b49f Updated tests 2025-11-14 19:40:37 +01:00
Dries Peeters 906e148d11 Merge pull request #277 from DRYTRIX/Feat-Basic-client-portal
Update test_api_invoices_v1.py
2025-11-14 19:22:51 +01:00
Dries Peeters b8b7274a44 Update test_api_invoices_v1.py 2025-11-14 19:19:36 +01:00
Dries Peeters 230c399350 Merge pull request #273 from DRYTRIX/Feat-Basic-client-portal
feat: Add client portal with password setup email functionality
2025-11-14 15:16:16 +01:00
Dries Peeters 39cf649f8e feat: Add client portal with password setup email functionality
Implement a complete client portal feature that allows clients to access
their projects, invoices, and time entries through a dedicated portal with
separate authentication. Includes password setup via email with secure
token-based authentication.

Client Portal Features:
- Client-based authentication (separate from user accounts)
- Portal access can be enabled/disabled per client
- Clients can view their projects, invoices, and time entries
- Clean, minimal UI without main app navigation elements
- Login page styled to match main app design

Password Setup Email:
- Admin can send password setup emails to clients
- Secure token-based password setup (24-hour expiration)
- Email template with professional styling
- Password setup page matching app login design
- Token validation and automatic cleanup after use

Email Configuration:
- Email settings from admin menu are now used for sending
- Database email settings persist between restarts and updates
- Automatic reload of email configuration when sending emails
- Database settings take precedence over environment variables
- Improved error messages for email configuration issues

Database Changes:
- Add portal_enabled, portal_username, portal_password_hash to clients
- Add password_setup_token and password_setup_token_expires to clients
- Migration 047: Add client portal fields to users (legacy)
- Migration 048: Add client portal credentials to clients
- Migration 049: Add password setup token fields

New Files:
- app/routes/client_portal.py - Client portal routes and authentication
- app/templates/client_portal/ - Portal templates (base, login, dashboard, etc.)
- app/templates/email/client_portal_password_setup.html - Email template
- migrations/versions/047-049 - Database migrations
- tests/test_client_portal.py - Portal tests
- docs/CLIENT_PORTAL.md - Portal documentation

Modified Files:
- app/models/client.py - Add portal fields and password token methods
- app/routes/clients.py - Add send password email route
- app/routes/client_portal.py - Portal routes with redirect handling
- app/utils/email.py - Use database settings, add password setup email
- app/templates/clients/edit.html - Add send email button
- app/templates/components/ui.html - Support client portal breadcrumbs

Security:
- Secure token generation using secrets.token_urlsafe()
- Password hashing with werkzeug.security
- Token expiration (24 hours default)
- Token cleared after successful password setup
- CSRF protection on all forms
2025-11-14 15:15:38 +01:00
Dries Peeters a69cc8d3c1 Merge pull request #272 from DRYTRIX/Feat-Webhook-system
feat: Add webhook system for real-time event notifications
2025-11-14 13:55:51 +01:00
Dries Peeters a18de04a6a feat: Add webhook system for real-time event notifications
Implement comprehensive webhook system supporting 40+ event types with automatic retries, HMAC signatures, delivery tracking, REST API, and admin UI. Integrates with Activity logging for automatic event triggering.

- Database: Add webhooks and webhook_deliveries tables (migration 046)

- API: Full CRUD endpoints with read:webhooks/write:webhooks scopes

- UI: Admin interface for webhook management and testing

- Service: Automatic retry with exponential backoff every 5 minutes

- Security: HMAC-SHA256 signature verification

- Tests: Model and service tests included

- Docs: Complete integration guide with examples
2025-11-14 13:52:56 +01:00
Dries Peeters 94de87fcf4 Merge pull request #271 from DRYTRIX/Feat-Email-invoice-sending
fix: Fix email template editor initialization and JavaScript errors
2025-11-14 13:41:56 +01:00
Dries Peeters a4797b25ac fix: Fix email template editor initialization and JavaScript errors
- Fix script block name from extra_js to scripts_extra to match base.html
- Replace inline onclick handlers with event listeners to fix scope issues
- Fix ReferenceError for toggleViewMode and insertVariable functions
- Improve editor initialization flow with proper script loading detection
- Add error handling and fallback to textarea if Toast UI Editor fails to load
- Add debug logging for troubleshooting initialization issues
- Ensure default templates are editable (no restrictions in backend)
- Add email templates link to admin menu in base.html
- Remove ENV file configuration details from email support page

The editor now properly initializes and all interactive features work correctly.
2025-11-14 13:40:00 +01:00
Dries Peeters f54ab9934f feat(api): add broad API v1 parity, scope UI, and consistency improvements
Backend: add Black/isort/Flake8 configs and .editorconfig; switch health/readiness to locale-based time. Fix service worker asset list; add smoke test.

Admin scopes UI: add read:* and write:* wildcards; add granular scopes for invoices, expenses, payments, mileage, per diem, budget alerts, calendar, comments, recurring invoices.

API v1: add endpoints for invoices, expenses, payments, mileage, per diem (+rates), budget alerts, calendar, kanban, saved filters, time entry templates, comments, recurring invoices, credit notes, client notes (paginated), project costs (paginated), currencies, exchange rates, favorites, audit logs, activities, and invoice PDF/templates (admin). Extend /api/v1/info with all resources. No schema changes.

Tests: add coverage for new endpoints (CRUD/list/pagination) and service worker route smoke test.
2025-11-14 13:09:57 +01:00
Dries Peeters 70d9dad4f3 Big testing update 2025-11-14 12:08:50 +01:00
Dries Peeters efc25c7843 Update conftest.py 2025-11-13 16:36:09 +01:00
Dries Peeters dbd48200ab Update conftest.py 2025-11-13 16:23:51 +01:00
Dries Peeters 14d7c5b5e8 Update all tests 2025-11-13 15:19:32 +01:00
Dries Peeters ce35b6e9b9 Update test_invoices.py 2025-11-13 14:50:32 +01:00
Dries Peeters ca60e7c9a5 Update test_invoices.py 2025-11-13 14:44:39 +01:00
Dries Peeters 42bc1a3872 Update test_invoices.py 2025-11-13 14:37:53 +01:00
Dries Peeters 2a9715d0ef Update conftest.py 2025-11-13 14:28:30 +01:00
Dries Peeters 8f8e04bda7 Update test_calendar_event_model.py 2025-11-13 14:08:11 +01:00
Dries Peeters 5b55068ced Update test_calendar_event_model.py 2025-11-13 14:04:25 +01:00
Dries Peeters 7c0128bda5 Actually fix the tests? 2025-11-13 13:52:03 +01:00
Dries Peeters 4ddd4fba41 Update test_calendar_event_model.py 2025-11-13 13:12:53 +01:00
Dries Peeters 44cca91739 tests fixed 2025-11-13 12:36:49 +01:00