All notable changes to the SellMe application will be documented in this file.
- Replaced all NOW() and CURRENT_TIMESTAMP occurrences in SQL queries with UTC_TIMESTAMP()
- Fixed 32+ instances across controllers, models, and services
- Ensures consistent UTC storage regardless of server timezone configuration
- Affects: OrderController, PlannerController, User, Setting, ActivityLog, DisplaySession, JobHistory, SalesEvent, DashboardController, LiveDataProcessor, ApiWarningService, HelperModerator, and more
- Planner modal and tooltips now correctly display dates in local timezone
- Live stock view timer displays correct elapsed time
- Order creation form shows correct event dates
- Orders table displays dates and times correctly
- All API timestamps now use UTC for consistency (using gmdate())
- SSE stream timestamps standardized to UTC
- Rate limiting reset times use UTC
- Lockout expiration times now calculated using UTC_TIMESTAMP() in SQL
- Prevents timezone-related lockout duration issues
- Added comprehensive UTC usage documentation to BaseModel
- Updated DateHelper documentation to clarify UTC input/output behavior
- Added timezone rule documentation to PlannerController and OrderController
- Updated method-level PHPDoc comments in models with UTC storage notes
- Updated formatDateTime() documentation to specify UTC input expected
- Enhanced createDateTime() documentation for UTC conversion behavior
- All database dates are stored in UTC and converted to local timezone for display
- All database timestamps MUST use UTC_TIMESTAMP() in SQL queries
- All datetime inputs from forms are converted from local time to UTC before storage
- All datetime outputs are converted from UTC to local timezone using DateHelper::formatDateTime()
- This ensures consistency regardless of server timezone configuration
- Models: BaseModel, User, Setting, ActivityLog, DisplaySession, JobHistory, SalesEvent, Order, HelperModerator
- Controllers: PlannerController, OrderController, DashboardController, ApiController, LiveStockViewController
- Services: LiveDataProcessor, ApiWarningService
- Helpers: DateHelper (documentation only)
UTC_TIMESTAMP() instead of NOW()---
- Prevents frequent re-logins by persisting sessions across browser sessions
- Session garbage collection (session.gc_maxlifetime) aligned with cookie lifetime
- Improves user experience with longer-lasting authentication
- Moved Nginx configuration files from web root to Docs/nginx/ directory
- Better separation of documentation and configuration files from application code
public/index.php for better security and organization- Removed web-accessible test script access (security improvement)
- Removed phpMyAdmin request handling (moved to Nginx configuration)
- Made error reporting environment-based using APP_DEBUG configuration
- Cleaned up commented-out debug code
public/router.php- Removed redundant TIFF file blocking logic (handled by Nginx in production)
- Updated documentation to reflect Nginx's role in file blocking
- Updated references from non-existent favicon-32x32.png and favicon-16x16.png to existing favicon.ico and icon.svg
- Corrected favicon links in main layout and 404 error page
- Eliminates 404 errors for favicon requests
- Added cleanupOldCacheFiles() method to ProductCatalogHelper
- Automatically removes cache files older than 24 hours (1% chance per cache write)
- Prevents indefinite growth of cache directory
- Removed phpdocumentor/phpdocumentor from require-dev
- Cleaned up ~100+ unused dependencies from composer.lock
- Reduced vendor directory size and improved dependency clarity
- Deleted graphic-dashboard.css (unused)
- Deleted shootings.css (unused)
- Removed getImageUrl() function and references to non-existent Image model
- Removed converted_dir configuration and related checks
- Removed references to libvips and word-generator from dependencies UI
- Removed phpmyadmin-handler.php file (functionality moved to Nginx)
app/Helpers/Session.phpProductCatalogHelper::setImportProgress()Docs/nginx/ directoryfavicon.ico, icon.svg, apple-touch-icon.png---
- Numeric code generation and display on authorization screen
- Admin interface in dashboard for authorizing displays (webadmin only)
- Automatic code expiration (15 minutes) with visual timer
- Session extension to 48 hours after successful authorization
- Automatic code regeneration when expired
- Server-Sent Events (SSE) for instant stock updates
- Card-based layout optimized for display screens
- Dynamic border colors based on stock levels (green/yellow/red with flashing)
- Digital clock and event elapsed time display
- No header, footer, or navigation (kiosk-optimized)
- Event selection from dashboard when multiple events are active
- Accessible at /kioskmode
- Displays available kiosk display types
- Extensible architecture for future display types
- BaseKioskController with common authentication logic
- Extensible design for adding new display types
- UTC timestamp handling to prevent timezone issues
- display_sessions table for storing authorization codes
- Support for display-specific configuration (e.g., eventId)
- Automatic cleanup of expired sessions
- Starts green (100% remaining)
- Transitions to yellow as time runs out
- Red blinking animation in last 1 minute
- Timer resets to 15 minutes on page reload
- Now requires authorization via 4-digit code
- Optimized for headless display screens
- Improved SSE stream performance with caching
- Live Stock View button: Removed text label, added tooltip, changed icon to live_tv
- Kiosk authorization: Moved "Enter 4-digit code:" text to input placeholder
- Inline layout: All authorization elements (button, input, authorize button) on same line
- Authorize button: Removed text label, icon-only with tooltip for space efficiency
- Added session_write_close() after authorization to release session lock
- Prevents blocking other requests while SSE stream is active
- Improves overall application responsiveness during kiosk display usage
display_sessions (migration script: database/migrate_display_sessions.php)DisplaySession, BaseKioskControllerKioskController, DisplayController/kioskmode, /displays/check-auth, /displays/authorize, /displays/active-sessions---
- GD library-based mirrored graphic generation for Event Product ID
- Text rotation (180°) when mirror printing is enabled for readability from back of label
- Automatic graphic scaling to fit label width with configurable margins
- Uses proven ~DGR (download to RAM) + ^XGR (recall) ZPL format for reliable printing
- Contains event_product_id:article_number data format
- Positioned below price/quantity line, right-aligned
- Only displayed when mirror printing is disabled (to avoid overlap)
- Configurable size (80 dots scaled with paper width)
- Event Product ID and Article Number on same line (large font, bold if contains colon)
- Price and Quantity on same line with proper spacing
- Dynamic label height calculation based on content
- 30mm top margin for mirrored graphic area
- 3mm safety margin at bottom
- Price display (formatted with currency)
- Quantity display (formatted as "Menge: X")
- Improved font sizing and spacing
- Better text truncation for long product titles
LabelPrinterHelper.php - Updated to use ~DGR/^XGR format for graphics (replacing ^GFA)
- Added scaleImageToWidth() method for graphic scaling
- Renamed imageToZPLGF() to imageToZPLBitmap() for clarity
- Improved label height calculation for both mirror and non-mirror modes
- Enhanced PHPDoc documentation throughout
- Different calculation for mirror printing enabled vs disabled
- Accounts for QR code when mirror printing is disabled
- Accounts for graphic area when mirror printing is enabled
- 30mm reduction adjustment for optimal label length
- All text fields rotate 180° (^A0I) when mirror printing enabled
- Normal orientation (^A0N) when mirror printing disabled
- Ensures readability from back of label when mirror printed
- Added automatic scaling to fit label width (with 40 dots margin per side)
- Prevents graphics from being too large for label
- Adjusted height to prevent labels from being too long
- Added 30mm reduction when mirror printing enabled
LABEL_DATA_DOCUMENTATION.md---
- Automatic detection of mariadb-dump and mysqldump tools
- Support for both MySQL and MariaDB backup commands
- Linux/Debian path detection for MariaDB client tools
- Enhanced error messages with installation instructions for MariaDB client
- Fixed path resolution for backups directory using realpath()
- Added proper PATH environment variable handling for PHP-FPM
- Support for TCP connections (converts localhost to 127.0.0.1)
- Comprehensive error logging and diagnostics
- Fixed path resolution that prevented backup directory writability checks
- Changed password syntax from -p to --password= for better compatibility
- Added localhost to 127.0.0.1 conversion to force TCP instead of socket connections
- Improved error handling and detailed error messages
- Fixed directory path resolution using absolute paths
- Detailed error messages with diagnostic information
- Proper error file handling and cleanup
- Logging of PHP user, tool paths, and execution context
- Better error output capture from backup commands
- Prioritizes mariadb-dump for MariaDB installations
- Checks Linux standard paths before macOS-specific paths
- More reliable tool path resolution
- Better handling of PHP-FPM execution context
- Added comprehensive documentation for backup methods
- Documented MariaDB support and requirements
- Added usage examples and troubleshooting information
findMysqldump() method to search for mariadb-dump firstcreateBackup() with better error handling and loggingdirname() and realpath()---
*Changelog entries for versions prior to 0.2.18 are not available in this format.*
SellMe is a sales management system designed for managing sales events, products, and stream events.
This software is provided as-is for use in sales management and event workflows.
All content and data managed through this system remain the property of their respective owners. SellMe does not claim ownership of any user-uploaded content.
For questions regarding copyright or legal matters, please contact your system administrator.