[2026-09-16 00:02:12] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:04:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:06:14] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:11:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:14:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:14:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:14:35] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:16:50] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:17:22] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 00:20:40] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:20:41] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:20:45] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:20:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:20:56] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:20:57] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:21:22] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:23:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:24:31] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:24:44] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:24:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:25:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:25:08] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:31:19] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:33:25] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:34:42] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:34:52] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:35:23] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:36:16] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 00:38:39] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:39:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:44:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:54:20] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:57:58] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:58:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 00:59:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:03:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:03:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:05:30] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:05:42] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:05:46] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:05:50] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:07:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:08:00] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:08:36] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:09:06] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:09:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:09:51] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 01:10:14] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:10:45] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:11:00] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:11:12] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:11:15] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:11:18] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:11:22] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:11:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:11:43] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:12:35] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:22:07] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:25:18] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:25:53] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:26:05] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:26:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:27:40] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:28:10] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:28:12] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 01:28:40] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:29:10] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:29:41] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:30:28] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 01:37:56] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:38:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:38:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 01:39:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:01:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:01:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:01:27] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:13:27] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:21:27] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:23:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:31:01] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:31:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:32:41] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 02:36:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:36:49] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 02:43:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:01:21] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:17:54] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:18:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:18:51] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:21:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:22:33] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:22:56] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:23:00] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:23:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:23:58] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:24:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:24:14] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:25:44] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:26:14] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:26:16] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 03:28:50] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:29:20] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:29:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:29:34] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:29:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:29:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:29:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:29:56] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:30:00] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:30:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:30:08] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:30:12] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:44:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:44:36] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:45:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:46:13] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:48:33] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:49:07] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:49:38] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 03:49:46] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:49:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:51:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:56:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 03:56:45] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:10:28] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:18:51] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 04:23:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:30:07] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:30:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:31:05] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:31:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:31:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:31:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:32:00] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:32:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:32:53] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:32:57] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:34:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 04:35:04] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 04:52:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:52:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:53:23] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:53:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:53:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:54:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:55:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:56:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:56:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:56:36] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:56:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:56:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 04:58:20] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 04:58:21] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 04:58:30] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 04:58:37] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 05:04:49] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:05:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:07:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:08:16] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:08:28] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:08:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:09:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:10:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:15:16] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:15:28] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:15:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:15:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:18:28] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 05:20:09] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 05:22:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:22:37] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:22:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:24:21] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:24:34] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:32:30] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:32:42] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:32:46] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:34:33] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:51:45] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:56:54] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:57:06] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:57:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:57:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:57:39] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:07] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:19] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:58:27] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 05:59:39] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:00:09] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:03:13] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:03:51] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:04:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:45] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:49] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:53] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:05:57] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:06:01] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:06:05] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:06:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:06:20] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:11:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 06:12:02] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:19:50] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:21:35] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:25:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:30:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:30:38] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:32:32] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:32:44] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:32:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:32:55] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:32:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:33:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:35:45] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:36:19] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:37:46] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:38:05] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:38:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:40:37] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:40:49] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:43:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:48:00] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:53:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:53:16] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:53:38] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:54:18] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:54:24] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:55:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:55:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 06:58:57] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:59:03] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:59:04] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 06:59:50] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 06:59:58] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:00:21] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:00:55] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:01:52] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 07:02:42] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:05:25] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:05:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:07:56] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:16] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:29] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:39] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:48] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:56] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:08:57] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:07] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:15] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:16] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:09:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:09:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:10:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:10:34] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:10:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:10:51] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:11:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:11:34] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:11:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:11:51] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:12:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:12:34] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:12:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:12:51] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:13:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 07:13:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:13:35] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:13:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:13:52] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:14:17] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:14:26] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:14:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:35] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:14:36] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:39] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:43] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:43] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:43] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 07:14:44] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:45] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:47] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:47] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:14:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:16:47] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 07:18:47] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 07:22:43] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:52:01] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:52:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:52:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:52:21] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:55:09] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 07:57:43] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:01:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:09:07] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 08:09:59] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 08:11:34] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 08:16:34] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:16:45] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 08:16:45] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 08:16:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"2779050.28400000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:16:45] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 08:16:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",43]} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 08:16:45] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:16:45] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:16:45] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 08:16:45] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 08:16:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"5040630.00000000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:16:45] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:16:45] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 08:16:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",43]} 
[2026-09-16 08:16:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 08:16:50] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:16:50] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:16:50] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:16:50] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:16:50] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:16:50] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:16:50] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:16:50] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:16:50] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:16:51] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:16:51] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:16:51] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:16:51] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:16:51] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:16:51] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:16:51] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:16:51] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:16:51] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:16:51] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:16:51] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:17:01] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-14","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:01] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-14"} 
[2026-09-16 08:17:01] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-14')"} 
[2026-09-16 08:17:01] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-14') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-14'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:01] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4680460.28240000","is_opening":true,"date":"2026-09-14"} 
[2026-09-16 08:17:01] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:01] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-15' (includes all types except purchase_order)"} 
[2026-09-16 08:17:01] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-15'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:01] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-09-15"} 
[2026-09-16 08:17:02] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-14","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:02] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:02] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-14"} 
[2026-09-16 08:17:02] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-14')"} 
[2026-09-16 08:17:02] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-14') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-14'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:02] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7588682.50000000","is_opening":true,"date":"2026-09-14"} 
[2026-09-16 08:17:02] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:02] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:02] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-15' (includes all types except purchase_order)"} 
[2026-09-16 08:17:02] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-15'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:02] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-09-15"} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:09] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:17:09] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:17:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:09] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:17:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:09] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:09] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:17:09] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:17:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:09] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:09] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:17:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:17:12] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-14","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:12] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-14"} 
[2026-09-16 08:17:12] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-14')"} 
[2026-09-16 08:17:12] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-14') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-14'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:12] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4680460.28240000","is_opening":true,"date":"2026-09-14"} 
[2026-09-16 08:17:12] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 08:17:12] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-15' (includes all types except purchase_order)"} 
[2026-09-16 08:17:12] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-15'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:12] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-09-15"} 
[2026-09-16 08:17:13] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-14","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:13] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:13] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-14"} 
[2026-09-16 08:17:13] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-14')"} 
[2026-09-16 08:17:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-14') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-14'))","bindings":["purchase_order",43,"opening_stock","opening_stock"]} 
[2026-09-16 08:17:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7588682.50000000","is_opening":true,"date":"2026-09-14"} 
[2026-09-16 08:17:13] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-15","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 08:17:13] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:17:13] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-15' (includes all types except purchase_order)"} 
[2026-09-16 08:17:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-15'","bindings":["purchase_order",43]} 
[2026-09-16 08:17:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-09-15"} 
[2026-09-16 08:17:49] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:19:44] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:20:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:24:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:24:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"category_id":null,"sub_category_id":null,"brand_id":null,"unit_id":null},"permitted_locations":"all"} 
[2026-09-16 08:24:45] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:24:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:24:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"4678360.28240000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:24:45] live.INFO: === getOpeningClosingStock START === {"business_id":43,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":true,"filters":{"category_id":null,"sub_category_id":null,"brand_id":null,"unit_id":null},"permitted_locations":"all"} 
[2026-09-16 08:24:45] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 08:24:45] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:24:45] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",43]} 
[2026-09-16 08:24:45] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"7585682.50000000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:24:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:25:58] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:29:14] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:32:04] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:32:14] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:32:16] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:32:18] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:35:58] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:36:19] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:36:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:36:32] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:37:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:37:56] live.INFO: filterProduct method called {"business_id":43,"search_term":"milk","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:37:56] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:37:56] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:37:56] live.DEBUG: Applying search filters {"search_term":"milk","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:37:56] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:37:56] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:37:56] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"milk"} 
[2026-09-16 08:37:58] live.INFO: Product Row Debug - RELOADED {"product_id":174,"product_name":"kinangop milk 250g","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":50.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:38:24] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:38:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:38:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:39:24] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:39:33] live.INFO: === getOpeningClosingStock START === {"business_id":1,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:39:33] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:39:33] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:39:33] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",1,"opening_stock","opening_stock"]} 
[2026-09-16 08:39:33] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:39:33] live.INFO: === getOpeningClosingStock START === {"business_id":1,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:39:33] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:39:33] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",1]} 
[2026-09-16 08:39:33] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:39:33] live.INFO: filterProduct method called {"business_id":43,"search_term":"milk","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:39:33] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:39:33] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:39:33] live.DEBUG: Applying search filters {"search_term":"milk","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:39:33] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:39:33] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:39:33] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"milk"} 
[2026-09-16 08:39:34] live.INFO: Product Row Debug - RELOADED {"product_id":174,"product_name":"kinangop milk 250g","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":50.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:39:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:39:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:40:20] live.INFO: filterProduct method called {"business_id":43,"search_term":"milk","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:40:20] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:40:20] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:40:20] live.DEBUG: Applying search filters {"search_term":"milk","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:40:20] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:40:20] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:40:20] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"milk"} 
[2026-09-16 08:40:22] live.INFO: Product Row Debug - RELOADED {"product_id":174,"product_name":"kinangop milk 250g","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":50.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:40:30] live.INFO: Fetching tax rate for product ID: 174  
[2026-09-16 08:40:30] live.INFO: Product ID 174 has no tax assigned.  
[2026-09-16 08:41:06] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:41:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:41:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:41:31] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:41:42] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:42:10] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:42:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:42:22] live.INFO: newBusinessDefaultResources called {"business_id":44,"user_id":363} 
[2026-09-16 08:42:23] live.INFO: Inserted 47 records into account_subtypes for business 44. Skipped: 0  
[2026-09-16 08:42:23] live.INFO: Inserted 207 records into account_detail_types for business 44. Skipped: 0  
[2026-09-16 08:42:23] live.INFO: Inserted 15 records into chart_of_accounts for business 44. Skipped: 0  
[2026-09-16 08:42:25] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:42:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:43:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:43:12] live.INFO: filterProduct method called {"business_id":43,"search_term":"four","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:43:12] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:43:12] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:43:12] live.DEBUG: Applying search filters {"search_term":"four","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:43:12] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:43:12] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:43:12] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"four"} 
[2026-09-16 08:43:14] live.INFO: Product Row Debug - RELOADED {"product_id":165,"product_name":"four cousins 750ml","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":1000.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:43:23] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:43:23] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:43:23] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:43:23] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 08:43:23] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:43:23] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:43:23] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:43:23] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 08:43:23] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:43:24] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 08:43:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:43:45] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:43:54] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:44:05] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:44:10] live.INFO: filterProduct method called {"business_id":43,"search_term":"fou","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:44:10] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:44:10] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:44:10] live.DEBUG: Applying search filters {"search_term":"fou","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:44:10] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:44:10] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:44:10] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"fou"} 
[2026-09-16 08:44:11] live.INFO: Product Row Debug - RELOADED {"product_id":165,"product_name":"four cousins 750ml","discount_allowed":true,"has_global_discount":true,"global_discount_type":null,"global_discount_amount":null,"discounts_count":1,"discounts":[{"id":26,"product_id":165,"business_id":43,"from_quantity":3,"to_quantity":10,"discount_type":"fixed","discount_amount":100.0,"created_at":"2026-09-16T05:43:01.000000Z","updated_at":"2026-09-16T05:44:02.000000Z"}],"base_price":1000.0,"discounts_json":"[{\"id\":26,\"product_id\":165,\"business_id\":43,\"from_quantity\":3,\"to_quantity\":10,\"discount_type\":\"fixed\",\"discount_amount\":100,\"created_at\":\"2026-09-16T05:43:01.000000Z\",\"updated_at\":\"2026-09-16T05:44:02.000000Z\"}]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:44:24] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:44:32] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:44:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:45:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:45:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:45:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:45:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:46:31] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:46:37] live.INFO: filterProduct method called {"business_id":43,"search_term":"fou","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 08:46:37] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 08:46:37] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 08:46:37] live.DEBUG: Applying search filters {"search_term":"fou","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 08:46:37] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 08:46:37] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 08:46:37] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"fou"} 
[2026-09-16 08:46:38] live.INFO: Product Row Debug - RELOADED {"product_id":165,"product_name":"four cousins 750ml","discount_allowed":true,"has_global_discount":true,"global_discount_type":null,"global_discount_amount":null,"discounts_count":2,"discounts":[{"id":27,"product_id":165,"business_id":43,"from_quantity":3,"to_quantity":5,"discount_type":"fixed","discount_amount":100.0,"created_at":"2026-09-16T05:46:27.000000Z","updated_at":"2026-09-16T05:46:27.000000Z"},{"id":28,"product_id":165,"business_id":43,"from_quantity":6,"to_quantity":7,"discount_type":"fixed","discount_amount":200.0,"created_at":"2026-09-16T05:46:27.000000Z","updated_at":"2026-09-16T05:46:27.000000Z"}],"base_price":1000.0,"discounts_json":"[{\"id\":27,\"product_id\":165,\"business_id\":43,\"from_quantity\":3,\"to_quantity\":5,\"discount_type\":\"fixed\",\"discount_amount\":100,\"created_at\":\"2026-09-16T05:46:27.000000Z\",\"updated_at\":\"2026-09-16T05:46:27.000000Z\"},{\"id\":28,\"product_id\":165,\"business_id\":43,\"from_quantity\":6,\"to_quantity\":7,\"discount_type\":\"fixed\",\"discount_amount\":200,\"created_at\":\"2026-09-16T05:46:27.000000Z\",\"updated_at\":\"2026-09-16T05:46:27.000000Z\"}]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 08:48:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 08:48:23] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:48:35] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:52:39] live.INFO: === getOpeningClosingStock START === {"business_id":1,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:52:39] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 08:52:39] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 08:52:39] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",1,"opening_stock","opening_stock"]} 
[2026-09-16 08:52:39] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 08:52:39] live.INFO: === getOpeningClosingStock START === {"business_id":1,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 08:52:39] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 08:52:39] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",1]} 
[2026-09-16 08:52:39] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 08:54:19] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:54:20] live.INFO: newBusinessDefaultResources called {"business_id":45,"user_id":364} 
[2026-09-16 08:54:20] live.INFO: Inserted 47 records into account_subtypes for business 45. Skipped: 0  
[2026-09-16 08:54:20] live.INFO: Inserted 207 records into account_detail_types for business 45. Skipped: 0  
[2026-09-16 08:54:20] live.INFO: Inserted 15 records into chart_of_accounts for business 45. Skipped: 0  
[2026-09-16 08:55:14] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:55:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:55:30] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:55:30] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 08:56:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:56:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 08:56:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 09:02:06] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 09:02:38] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 09:05:15] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:05:15] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:05:15] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:05:15] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 09:05:15] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:05:15] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:05:15] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:05:15] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 09:05:15] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:05:16] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:07:00] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 09:12:37] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:15:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:17:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 09:20:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:20:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:21:51] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:22:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:23:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:25:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:27:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 09:27:27] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:27:42] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:28:05] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:28:05] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:28:05] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:28:05] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 09:28:05] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:28:05] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:28:05] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:28:05] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 09:28:05] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:28:06] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:28:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:29:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:29:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:29:43] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:29:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:29:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:30:00] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:30:19] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:30:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:34:12] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:35:34] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:36:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:36:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:37:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 09:38:30] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 09:38:48] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 09:40:32] live.INFO: filterProduct method called {"business_id":43,"search_term":"fou","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 09:40:32] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 09:40:32] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 09:40:32] live.DEBUG: Applying search filters {"search_term":"fou","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 09:40:32] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 09:40:32] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 09:40:32] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"fou"} 
[2026-09-16 09:40:33] live.INFO: Product Row Debug - RELOADED {"product_id":165,"product_name":"four cousins 750ml","discount_allowed":true,"has_global_discount":true,"global_discount_type":null,"global_discount_amount":null,"discounts_count":2,"discounts":[{"id":27,"product_id":165,"business_id":43,"from_quantity":3,"to_quantity":5,"discount_type":"fixed","discount_amount":100.0,"created_at":"2026-09-16T05:46:27.000000Z","updated_at":"2026-09-16T05:46:27.000000Z"},{"id":28,"product_id":165,"business_id":43,"from_quantity":6,"to_quantity":7,"discount_type":"fixed","discount_amount":200.0,"created_at":"2026-09-16T05:46:27.000000Z","updated_at":"2026-09-16T05:46:27.000000Z"}],"base_price":1000.0,"discounts_json":"[{\"id\":27,\"product_id\":165,\"business_id\":43,\"from_quantity\":3,\"to_quantity\":5,\"discount_type\":\"fixed\",\"discount_amount\":100,\"created_at\":\"2026-09-16T05:46:27.000000Z\",\"updated_at\":\"2026-09-16T05:46:27.000000Z\"},{\"id\":28,\"product_id\":165,\"business_id\":43,\"from_quantity\":6,\"to_quantity\":7,\"discount_type\":\"fixed\",\"discount_amount\":200,\"created_at\":\"2026-09-16T05:46:27.000000Z\",\"updated_at\":\"2026-09-16T05:46:27.000000Z\"}]","multiplier":1,"unit_prices":{"39":{"unit_id":39,"unit_name":"Pieces","unit_price":null,"multiplier":1,"has_price":false}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 09:40:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:41:47] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:41:47] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:41:47] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:41:47] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",45,"opening_stock","opening_stock"]} 
[2026-09-16 09:41:47] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:41:47] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:41:47] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:41:47] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",45]} 
[2026-09-16 09:41:47] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:41:47] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:41:55] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 09:42:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:45:58] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:46:35] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:46:35] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:46:35] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:46:35] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 09:46:35] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:46:35] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:46:35] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:46:35] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 09:46:35] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:46:36] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:46:39] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:46:39] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:46:39] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:46:39] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",45,"opening_stock","opening_stock"]} 
[2026-09-16 09:46:39] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:46:39] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:46:39] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:46:39] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",45]} 
[2026-09-16 09:46:39] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:46:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:47:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:47:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:47:24] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:47:24] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:47:24] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:47:24] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 09:47:24] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:47:24] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:47:24] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:47:24] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 09:47:24] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:47:25] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:47:25] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:47:25] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:47:25] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:47:25] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 09:47:25] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:47:25] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:47:25] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:47:25] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 09:47:25] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:47:25] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:47:34] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:47:34] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:48:21] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:48:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:48:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:49:01] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:49:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:49:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:49:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:50:30] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:50:42] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:52:31] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:52:36] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:53:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":365,"business_id":45} 
[2026-09-16 09:53:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":366,"business_id":44} 
[2026-09-16 09:53:40] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 09:55:50] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:55:50] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:55:50] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:55:50] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",44,"opening_stock","opening_stock"]} 
[2026-09-16 09:55:50] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:55:50] live.INFO: === getOpeningClosingStock START === {"business_id":44,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:55:50] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:55:50] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",44]} 
[2026-09-16 09:55:50] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:55:51] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:55:54] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:55:54] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 09:55:54] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 09:55:54] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",45,"opening_stock","opening_stock"]} 
[2026-09-16 09:55:54] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":true,"date":"2026-09-15"} 
[2026-09-16 09:55:54] live.INFO: === getOpeningClosingStock START === {"business_id":45,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 09:55:54] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 09:55:54] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",45]} 
[2026-09-16 09:55:54] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":0,"is_opening":false,"date":"2026-09-16"} 
[2026-09-16 09:55:55] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:56:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:56:44] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:56:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:57:14] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:57:16] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:58:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:59:12] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 09:59:30] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:59:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:59:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 09:59:42] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 09:59:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 09:59:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:01:23] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 10:01:23] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 10:01:23] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 10:01:23] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 10:01:23] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 10:01:23] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 10:01:23] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 10:01:23] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 10:01:23] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 10:01:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:01:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:01:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:02:04] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:02:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:04:19] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":888} 
[2026-09-16 10:04:29] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":889} 
[2026-09-16 10:04:57] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":890} 
[2026-09-16 10:05:11] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":891} 
[2026-09-16 10:05:21] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":892} 
[2026-09-16 10:05:44] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":893} 
[2026-09-16 10:05:51] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":894} 
[2026-09-16 10:06:08] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":895} 
[2026-09-16 10:06:32] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":896} 
[2026-09-16 10:06:43] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":897} 
[2026-09-16 10:07:21] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":898} 
[2026-09-16 10:07:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:07:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:08:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:08:14] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:09:08] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":899} 
[2026-09-16 10:09:08] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":900} 
[2026-09-16 10:09:25] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":901} 
[2026-09-16 10:09:30] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":902} 
[2026-09-16 10:09:43] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":903} 
[2026-09-16 10:09:51] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":904} 
[2026-09-16 10:10:00] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":45,"contact_id":905} 
[2026-09-16 10:10:15] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":906} 
[2026-09-16 10:10:33] live.WARNING: Digitax upload failed: ETIMS settings not configured {"business_id":44,"contact_id":907} 
[2026-09-16 10:10:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:10:51] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:11:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:11:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:14:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:14:41] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:16:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:16:58] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:17:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:18:11] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:18:49] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":369,"request_units":[{"actual_name":"Packet","unit_id":"300","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}],"page_batch_id":"20260916_101439_8149"} 
[2026-09-16 10:18:49] live.INFO: === saveProductNewUnitRelationships START === {"product_id":369,"product_name":"Ajab Self Raising White Wheat Flour 2KG"} 
[2026-09-16 10:18:49] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"300","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}],"count":1} 
[2026-09-16 10:18:49] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"300","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}} 
[2026-09-16 10:18:49] live.INFO: Unit found by ID {"unit_id":300,"actual_name":"Packet"} 
[2026-09-16 10:18:49] live.INFO: Unit lookup result {"found":"yes","unit_id":300,"method":"by_id"} 
[2026-09-16 10:18:49] live.INFO: Updating existing unit {"unit_id":300} 
[2026-09-16 10:18:49] live.INFO: Updated unit_price {"new_price":250.0} 
[2026-09-16 10:18:49] live.INFO: Unit updated successfully  
[2026-09-16 10:18:49] live.INFO: Setting as BASE unit {"unit_id":300} 
[2026-09-16 10:18:49] live.INFO: Base unit saved {"base_unit_id":300} 
[2026-09-16 10:18:49] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":300} 
[2026-09-16 10:18:49] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:18:49] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:18:49] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:18:50] live.INFO: OpeningStockController::add - Location Data {"product_id":"369","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:18:50] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"369","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:18:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:18:57] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":370,"request_units":[{"actual_name":"Packet","unit_id":"301","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}],"page_batch_id":"20260916_101656_3855"} 
[2026-09-16 10:18:57] live.INFO: === saveProductNewUnitRelationships START === {"product_id":370,"product_name":"Ajab Wheat Flour 2kg"} 
[2026-09-16 10:18:57] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"301","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}],"count":1} 
[2026-09-16 10:18:57] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"301","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"250"}} 
[2026-09-16 10:18:57] live.INFO: Unit found by ID {"unit_id":301,"actual_name":"Packet"} 
[2026-09-16 10:18:57] live.INFO: Unit lookup result {"found":"yes","unit_id":301,"method":"by_id"} 
[2026-09-16 10:18:57] live.INFO: Updating existing unit {"unit_id":301} 
[2026-09-16 10:18:57] live.INFO: Updated unit_price {"new_price":250.0} 
[2026-09-16 10:18:57] live.INFO: Unit updated successfully  
[2026-09-16 10:18:57] live.INFO: Setting as BASE unit {"unit_id":301} 
[2026-09-16 10:18:57] live.INFO: Base unit saved {"base_unit_id":301} 
[2026-09-16 10:18:57] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":301} 
[2026-09-16 10:18:57] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:18:57] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:18:57] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:18:57] live.INFO: OpeningStockController::add - Location Data {"product_id":"370","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:18:57] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"370","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:18:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:19:22] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:19:27] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:20:00] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:20:00] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:21:11] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":371,"request_units":[{"actual_name":"Packet","unit_id":"302","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"page_batch_id":"20260916_101957_9540"} 
[2026-09-16 10:21:11] live.INFO: === saveProductNewUnitRelationships START === {"product_id":371,"product_name":"Ajab Self Raising White Wheat Flour 1KG"} 
[2026-09-16 10:21:11] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"302","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"count":1} 
[2026-09-16 10:21:11] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"302","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}} 
[2026-09-16 10:21:11] live.INFO: Unit found by ID {"unit_id":302,"actual_name":"Packet"} 
[2026-09-16 10:21:11] live.INFO: Unit lookup result {"found":"yes","unit_id":302,"method":"by_id"} 
[2026-09-16 10:21:11] live.INFO: Updating existing unit {"unit_id":302} 
[2026-09-16 10:21:11] live.INFO: Updated unit_price {"new_price":210.0} 
[2026-09-16 10:21:11] live.INFO: Unit updated successfully  
[2026-09-16 10:21:11] live.INFO: Setting as BASE unit {"unit_id":302} 
[2026-09-16 10:21:11] live.INFO: Base unit saved {"base_unit_id":302} 
[2026-09-16 10:21:11] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":302} 
[2026-09-16 10:21:11] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:21:11] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:21:11] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:21:12] live.INFO: OpeningStockController::add - Location Data {"product_id":"371","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:21:12] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"371","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:21:14] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:21:15] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":372,"request_units":[{"actual_name":"Packet","unit_id":"303","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"page_batch_id":"20260916_101958_4780"} 
[2026-09-16 10:21:15] live.INFO: === saveProductNewUnitRelationships START === {"product_id":372,"product_name":"Ajab Wheat Flour 1kg"} 
[2026-09-16 10:21:15] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"303","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"count":1} 
[2026-09-16 10:21:15] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"303","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}} 
[2026-09-16 10:21:15] live.INFO: Unit found by ID {"unit_id":303,"actual_name":"Packet"} 
[2026-09-16 10:21:15] live.INFO: Unit lookup result {"found":"yes","unit_id":303,"method":"by_id"} 
[2026-09-16 10:21:15] live.INFO: Updating existing unit {"unit_id":303} 
[2026-09-16 10:21:15] live.INFO: Updated unit_price {"new_price":210.0} 
[2026-09-16 10:21:15] live.INFO: Unit updated successfully  
[2026-09-16 10:21:15] live.INFO: Setting as BASE unit {"unit_id":303} 
[2026-09-16 10:21:15] live.INFO: Base unit saved {"base_unit_id":303} 
[2026-09-16 10:21:15] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":303} 
[2026-09-16 10:21:15] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:21:15] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:21:15] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:21:16] live.INFO: OpeningStockController::add - Location Data {"product_id":"372","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:21:16] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"372","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:21:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:21:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:21:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:22:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:22:37] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:22:45] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:23:36] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":373,"request_units":[{"actual_name":"Packet","unit_id":"304","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"196"}],"page_batch_id":"20260916_102211_6716"} 
[2026-09-16 10:23:36] live.INFO: === saveProductNewUnitRelationships START === {"product_id":373,"product_name":"Ajab Maize Flour 2kg"} 
[2026-09-16 10:23:36] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"304","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"196"}],"count":1} 
[2026-09-16 10:23:36] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"304","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"196"}} 
[2026-09-16 10:23:36] live.INFO: Unit found by ID {"unit_id":304,"actual_name":"Packet"} 
[2026-09-16 10:23:36] live.INFO: Unit lookup result {"found":"yes","unit_id":304,"method":"by_id"} 
[2026-09-16 10:23:36] live.INFO: Updating existing unit {"unit_id":304} 
[2026-09-16 10:23:36] live.INFO: Updated unit_price {"new_price":196.0} 
[2026-09-16 10:23:36] live.INFO: Unit updated successfully  
[2026-09-16 10:23:36] live.INFO: Setting as BASE unit {"unit_id":304} 
[2026-09-16 10:23:36] live.INFO: Base unit saved {"base_unit_id":304} 
[2026-09-16 10:23:36] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":304} 
[2026-09-16 10:23:36] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:23:36] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:23:36] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:23:36] live.INFO: OpeningStockController::add - Location Data {"product_id":"373","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:23:36] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"373","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:23:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:23:48] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:23:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:24:27] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":374,"request_units":[{"actual_name":"Unit","unit_id":"305","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"40000"}],"page_batch_id":"20260916_102235_6504"} 
[2026-09-16 10:24:27] live.INFO: === saveProductNewUnitRelationships START === {"product_id":374,"product_name":"Samsung 45\" TV"} 
[2026-09-16 10:24:27] live.INFO: Units data received {"units_data":[{"actual_name":"Unit","unit_id":"305","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"40000"}],"count":1} 
[2026-09-16 10:24:27] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Unit","unit_id":"305","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"40000"}} 
[2026-09-16 10:24:27] live.INFO: Unit found by ID {"unit_id":305,"actual_name":"Unit"} 
[2026-09-16 10:24:27] live.INFO: Unit lookup result {"found":"yes","unit_id":305,"method":"by_id"} 
[2026-09-16 10:24:27] live.INFO: Updating existing unit {"unit_id":305} 
[2026-09-16 10:24:27] live.INFO: Updated unit_price {"new_price":40000.0} 
[2026-09-16 10:24:27] live.INFO: Unit updated successfully  
[2026-09-16 10:24:27] live.INFO: Setting as BASE unit {"unit_id":305} 
[2026-09-16 10:24:27] live.INFO: Base unit saved {"base_unit_id":305} 
[2026-09-16 10:24:27] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":305} 
[2026-09-16 10:24:27] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:24:27] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:24:27] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:24:28] live.INFO: OpeningStockController::add - Location Data {"product_id":"374","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:24:28] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"374","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:24:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:24:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:25:02] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:25:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:27:26] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":375,"request_units":[{"actual_name":"Unit","unit_id":"306","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"2500"}],"page_batch_id":"20260916_102500_5124"} 
[2026-09-16 10:27:26] live.INFO: === saveProductNewUnitRelationships START === {"product_id":375,"product_name":"Oraimo Smartwatch"} 
[2026-09-16 10:27:26] live.INFO: Units data received {"units_data":[{"actual_name":"Unit","unit_id":"306","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"2500"}],"count":1} 
[2026-09-16 10:27:26] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Unit","unit_id":"306","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"2500"}} 
[2026-09-16 10:27:26] live.INFO: Unit found by ID {"unit_id":306,"actual_name":"Unit"} 
[2026-09-16 10:27:26] live.INFO: Unit lookup result {"found":"yes","unit_id":306,"method":"by_id"} 
[2026-09-16 10:27:26] live.INFO: Updating existing unit {"unit_id":306} 
[2026-09-16 10:27:26] live.INFO: Updated unit_price {"new_price":2500.0} 
[2026-09-16 10:27:26] live.INFO: Unit updated successfully  
[2026-09-16 10:27:26] live.INFO: Setting as BASE unit {"unit_id":306} 
[2026-09-16 10:27:26] live.INFO: Base unit saved {"base_unit_id":306} 
[2026-09-16 10:27:26] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":306} 
[2026-09-16 10:27:26] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:27:26] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:27:26] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:27:27] live.INFO: OpeningStockController::add - Location Data {"product_id":"375","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:27:27] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"375","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:27:28] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:27:41] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:27:47] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":376,"request_units":[{"actual_name":"Packet","unit_id":"307","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"580"}],"page_batch_id":"20260916_102351_0113"} 
[2026-09-16 10:27:47] live.INFO: === saveProductNewUnitRelationships START === {"product_id":376,"product_name":"StaSoft Lavender Fabric Softener 2l"} 
[2026-09-16 10:27:47] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"307","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"580"}],"count":1} 
[2026-09-16 10:27:47] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"307","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"580"}} 
[2026-09-16 10:27:47] live.INFO: Unit found by ID {"unit_id":307,"actual_name":"Packet"} 
[2026-09-16 10:27:47] live.INFO: Unit lookup result {"found":"yes","unit_id":307,"method":"by_id"} 
[2026-09-16 10:27:47] live.INFO: Updating existing unit {"unit_id":307} 
[2026-09-16 10:27:47] live.INFO: Updated unit_price {"new_price":580.0} 
[2026-09-16 10:27:47] live.INFO: Unit updated successfully  
[2026-09-16 10:27:47] live.INFO: Setting as BASE unit {"unit_id":307} 
[2026-09-16 10:27:47] live.INFO: Base unit saved {"base_unit_id":307} 
[2026-09-16 10:27:47] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":307} 
[2026-09-16 10:27:47] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:27:47] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:27:47] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:27:47] live.INFO: OpeningStockController::add - Location Data {"product_id":"376","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:27:47] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"376","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:27:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:27:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:27:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:28:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:28:57] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":377,"request_units":[{"actual_name":"Packet","unit_id":"308","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1150"}],"page_batch_id":"20260916_102801_9130"} 
[2026-09-16 10:28:57] live.INFO: === saveProductNewUnitRelationships START === {"product_id":377,"product_name":"Subrice Long Grain 5kg"} 
[2026-09-16 10:28:57] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"308","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1150"}],"count":1} 
[2026-09-16 10:28:57] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"308","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1150"}} 
[2026-09-16 10:28:57] live.INFO: Unit found by ID {"unit_id":308,"actual_name":"Packet"} 
[2026-09-16 10:28:57] live.INFO: Unit lookup result {"found":"yes","unit_id":308,"method":"by_id"} 
[2026-09-16 10:28:57] live.INFO: Updating existing unit {"unit_id":308} 
[2026-09-16 10:28:57] live.INFO: Updated unit_price {"new_price":1150.0} 
[2026-09-16 10:28:57] live.INFO: Unit updated successfully  
[2026-09-16 10:28:57] live.INFO: Setting as BASE unit {"unit_id":308} 
[2026-09-16 10:28:57] live.INFO: Base unit saved {"base_unit_id":308} 
[2026-09-16 10:28:57] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":308} 
[2026-09-16 10:28:57] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:28:57] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:28:57] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:28:57] live.INFO: OpeningStockController::add - Location Data {"product_id":"377","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:28:57] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"377","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:28:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:29:09] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:29:09] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:29:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:29:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:29:43] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:29:47] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":378,"request_units":[{"actual_name":"Liter","unit_id":"309","short_name":"Ltr","relation_unit_id":null,"relation_qty":"1","price":"80"}],"page_batch_id":"20260916_102752_2386"} 
[2026-09-16 10:29:47] live.INFO: === saveProductNewUnitRelationships START === {"product_id":378,"product_name":"Dasani Water 1liter"} 
[2026-09-16 10:29:47] live.INFO: Units data received {"units_data":[{"actual_name":"Liter","unit_id":"309","short_name":"Ltr","relation_unit_id":null,"relation_qty":"1","price":"80"}],"count":1} 
[2026-09-16 10:29:47] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Liter","unit_id":"309","short_name":"Ltr","relation_unit_id":null,"relation_qty":"1","price":"80"}} 
[2026-09-16 10:29:47] live.INFO: Unit found by ID {"unit_id":309,"actual_name":"Liter"} 
[2026-09-16 10:29:47] live.INFO: Unit lookup result {"found":"yes","unit_id":309,"method":"by_id"} 
[2026-09-16 10:29:47] live.INFO: Updating existing unit {"unit_id":309} 
[2026-09-16 10:29:47] live.INFO: Updated unit_price {"new_price":80.0} 
[2026-09-16 10:29:47] live.INFO: Unit updated successfully  
[2026-09-16 10:29:47] live.INFO: Setting as BASE unit {"unit_id":309} 
[2026-09-16 10:29:47] live.INFO: Base unit saved {"base_unit_id":309} 
[2026-09-16 10:29:47] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":309} 
[2026-09-16 10:29:47] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:29:47] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:29:47] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:29:47] live.INFO: OpeningStockController::add - Location Data {"product_id":"378","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:29:47] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"378","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:29:48] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:30:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:30:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:30:13] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":379,"request_units":[{"actual_name":"Packet","unit_id":"310","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1450"}],"page_batch_id":"20260916_102911_3287"} 
[2026-09-16 10:30:13] live.INFO: === saveProductNewUnitRelationships START === {"product_id":379,"product_name":"Dawaat Pishori Rice 5kg"} 
[2026-09-16 10:30:13] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"310","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1450"}],"count":1} 
[2026-09-16 10:30:13] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"310","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1450"}} 
[2026-09-16 10:30:13] live.INFO: Unit found by ID {"unit_id":310,"actual_name":"Packet"} 
[2026-09-16 10:30:13] live.INFO: Unit lookup result {"found":"yes","unit_id":310,"method":"by_id"} 
[2026-09-16 10:30:13] live.INFO: Updating existing unit {"unit_id":310} 
[2026-09-16 10:30:13] live.INFO: Updated unit_price {"new_price":1450.0} 
[2026-09-16 10:30:13] live.INFO: Unit updated successfully  
[2026-09-16 10:30:13] live.INFO: Setting as BASE unit {"unit_id":310} 
[2026-09-16 10:30:13] live.INFO: Base unit saved {"base_unit_id":310} 
[2026-09-16 10:30:13] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":310} 
[2026-09-16 10:30:13] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:30:13] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:30:13] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:30:13] live.INFO: OpeningStockController::add - Location Data {"product_id":"379","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:30:13] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"379","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:30:14] live.INFO: filterProduct method called {"business_id":43,"search_term":"bl","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 10:30:14] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 10:30:14] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 10:30:14] live.DEBUG: Applying search filters {"search_term":"bl","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 10:30:14] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 10:30:14] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 10:30:14] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"bl"} 
[2026-09-16 10:30:14] live.INFO: Product Row Debug - RELOADED {"product_id":357,"product_name":"BLACK COFFEE","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":200.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"265":{"unit_id":265,"unit_name":"Pc","unit_price":23000.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 10:30:15] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:15] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:16] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:30:19] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:19] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:19] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:19] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:19] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:19] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:20] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:20] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:20] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:20] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:21] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:21] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:21] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:21] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:22] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:30:22] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:30:22] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:30:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:30:28] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:30:31] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":380,"request_units":[{"actual_name":"Bottles","unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80"}],"page_batch_id":"20260916_102752_2386"} 
[2026-09-16 10:30:31] live.INFO: === saveProductNewUnitRelationships START === {"product_id":380,"product_name":"Dasani Water 1liter"} 
[2026-09-16 10:30:31] live.INFO: Units data received {"units_data":[{"actual_name":"Bottles","unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80"}],"count":1} 
[2026-09-16 10:30:31] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Bottles","unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80"}} 
[2026-09-16 10:30:31] live.INFO: Unit found by ID {"unit_id":311,"actual_name":"Bottles"} 
[2026-09-16 10:30:31] live.INFO: Unit lookup result {"found":"yes","unit_id":311,"method":"by_id"} 
[2026-09-16 10:30:31] live.INFO: Updating existing unit {"unit_id":311} 
[2026-09-16 10:30:31] live.INFO: Updated unit_price {"new_price":80.0} 
[2026-09-16 10:30:31] live.INFO: Unit updated successfully  
[2026-09-16 10:30:31] live.INFO: Setting as BASE unit {"unit_id":311} 
[2026-09-16 10:30:31] live.INFO: Base unit saved {"base_unit_id":311} 
[2026-09-16 10:30:31] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":311} 
[2026-09-16 10:30:31] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:30:31] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:30:31] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:30:31] live.INFO: OpeningStockController::add - Location Data {"product_id":"380","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:30:31] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"380","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:30:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:30:41] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:30:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:31:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:31:32] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:31:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:31:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:31:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:32:05] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:32:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:32:44] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":381,"request_units":[{"actual_name":"Packet","unit_id":"312","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"542"}],"page_batch_id":"20260916_103023_8314"} 
[2026-09-16 10:32:44] live.INFO: === saveProductNewUnitRelationships START === {"product_id":381,"product_name":"Omo Handwashing Powder 500g"} 
[2026-09-16 10:32:44] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"312","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"542"}],"count":1} 
[2026-09-16 10:32:44] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"312","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"542"}} 
[2026-09-16 10:32:44] live.INFO: Unit found by ID {"unit_id":312,"actual_name":"Packet"} 
[2026-09-16 10:32:44] live.INFO: Unit lookup result {"found":"yes","unit_id":312,"method":"by_id"} 
[2026-09-16 10:32:44] live.INFO: Updating existing unit {"unit_id":312} 
[2026-09-16 10:32:44] live.INFO: Updated unit_price {"new_price":542.0} 
[2026-09-16 10:32:44] live.INFO: Unit updated successfully  
[2026-09-16 10:32:44] live.INFO: Setting as BASE unit {"unit_id":312} 
[2026-09-16 10:32:44] live.INFO: Base unit saved {"base_unit_id":312} 
[2026-09-16 10:32:44] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":312} 
[2026-09-16 10:32:44] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:32:44] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:32:44] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:32:44] live.INFO: OpeningStockController::add - Location Data {"product_id":"381","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:32:44] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"381","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:32:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:32:47] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:32:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:32:54] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:32:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:33:05] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:33:36] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":382,"request_units":[{"actual_name":"Cans","unit_id":"313","short_name":"Cns","relation_unit_id":null,"relation_qty":"1","price":"250"}],"page_batch_id":"20260916_103154_9344"} 
[2026-09-16 10:33:36] live.INFO: === saveProductNewUnitRelationships START === {"product_id":382,"product_name":"Redbull Energy Drink"} 
[2026-09-16 10:33:36] live.INFO: Units data received {"units_data":[{"actual_name":"Cans","unit_id":"313","short_name":"Cns","relation_unit_id":null,"relation_qty":"1","price":"250"}],"count":1} 
[2026-09-16 10:33:36] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Cans","unit_id":"313","short_name":"Cns","relation_unit_id":null,"relation_qty":"1","price":"250"}} 
[2026-09-16 10:33:36] live.INFO: Unit found by ID {"unit_id":313,"actual_name":"Cans"} 
[2026-09-16 10:33:36] live.INFO: Unit lookup result {"found":"yes","unit_id":313,"method":"by_id"} 
[2026-09-16 10:33:36] live.INFO: Updating existing unit {"unit_id":313} 
[2026-09-16 10:33:36] live.INFO: Updated unit_price {"new_price":250.0} 
[2026-09-16 10:33:36] live.INFO: Unit updated successfully  
[2026-09-16 10:33:36] live.INFO: Setting as BASE unit {"unit_id":313} 
[2026-09-16 10:33:36] live.INFO: Base unit saved {"base_unit_id":313} 
[2026-09-16 10:33:36] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":313} 
[2026-09-16 10:33:36] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:33:36] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:33:36] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:33:37] live.INFO: OpeningStockController::add - Location Data {"product_id":"382","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:33:37] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"382","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:33:38] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:33:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:33:53] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:33:58] live.INFO: filterProduct method called {"business_id":43,"search_term":"blac","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 10:33:58] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 10:33:58] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 10:33:58] live.DEBUG: Applying search filters {"search_term":"blac","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 10:33:58] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 10:33:58] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 10:33:58] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"blac"} 
[2026-09-16 10:33:59] live.INFO: Product Row Debug - RELOADED {"product_id":357,"product_name":"BLACK COFFEE","discount_allowed":true,"has_global_discount":true,"global_discount_type":null,"global_discount_amount":null,"discounts_count":1,"discounts":[{"id":29,"product_id":357,"business_id":43,"from_quantity":3,"to_quantity":5,"discount_type":"fixed","discount_amount":50.0,"created_at":"2026-09-16T07:30:05.000000Z","updated_at":"2026-09-16T07:33:49.000000Z"}],"base_price":200.0,"discounts_json":"[{\"id\":29,\"product_id\":357,\"business_id\":43,\"from_quantity\":3,\"to_quantity\":5,\"discount_type\":\"fixed\",\"discount_amount\":50,\"created_at\":\"2026-09-16T07:30:05.000000Z\",\"updated_at\":\"2026-09-16T07:33:49.000000Z\"}]","multiplier":1,"unit_prices":{"265":{"unit_id":265,"unit_name":"Pc","unit_price":23000.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 10:33:59] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:33:59] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:00] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:00] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:08] live.INFO: filterProduct method called {"business_id":43,"search_term":"bl","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 10:34:08] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 10:34:08] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 10:34:08] live.DEBUG: Applying search filters {"search_term":"bl","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 10:34:08] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 10:34:08] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 10:34:08] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"bl"} 
[2026-09-16 10:34:09] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:09] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:09] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:09] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:10] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":383,"request_units":[{"actual_name":"Packet","unit_id":"314","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"269"}],"page_batch_id":"20260916_103255_8162"} 
[2026-09-16 10:34:10] live.INFO: === saveProductNewUnitRelationships START === {"product_id":383,"product_name":"Omo Regukar Washing powder 250g"} 
[2026-09-16 10:34:10] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"314","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"269"}],"count":1} 
[2026-09-16 10:34:10] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"314","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"269"}} 
[2026-09-16 10:34:10] live.INFO: Unit found by ID {"unit_id":314,"actual_name":"Packet"} 
[2026-09-16 10:34:10] live.INFO: Unit lookup result {"found":"yes","unit_id":314,"method":"by_id"} 
[2026-09-16 10:34:10] live.INFO: Updating existing unit {"unit_id":314} 
[2026-09-16 10:34:10] live.INFO: Updated unit_price {"new_price":269.0} 
[2026-09-16 10:34:10] live.INFO: Unit updated successfully  
[2026-09-16 10:34:10] live.INFO: Setting as BASE unit {"unit_id":314} 
[2026-09-16 10:34:10] live.INFO: Base unit saved {"base_unit_id":314} 
[2026-09-16 10:34:10] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":314} 
[2026-09-16 10:34:10] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:34:10] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:34:10] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:34:11] live.INFO: OpeningStockController::add - Location Data {"product_id":"383","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:34:11] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"383","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:34:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:34:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:34:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:34:35] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 10:34:37] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:34:43] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:43] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:44] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:44] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:44] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:44] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:45] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:45] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:45] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:45] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:46] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:46] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:46] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:46] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:46] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:46] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:47] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:47] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:47] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:47] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:48] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:48] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:49] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:34:49] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:34:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:34:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:35:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:36:01] live.INFO: === saveProductUnitRelationships START === {"product_id":357,"product_name":"BLACK COFFEE"} 
[2026-09-16 10:36:01] live.INFO: Units data received {"units_data":[{"unit_id":"265","short_name":"Pc","relation_unit_id":null,"relation_qty":"1","price":"500"}],"count":1} 
[2026-09-16 10:36:01] live.INFO: Processing unit index: 0 {"unit_data":{"unit_id":"265","short_name":"Pc","relation_unit_id":null,"relation_qty":"1","price":"500"}} 
[2026-09-16 10:36:01] live.WARNING: Empty actual_name, skipping this unit  
[2026-09-16 10:36:01] live.INFO: First pass complete {"created_units_count":0,"unit_ids_to_keep":[],"base_unit_id":null} 
[2026-09-16 10:36:01] live.WARNING: No base_unit_id set, skipping second pass  
[2026-09-16 10:36:01] live.INFO: === saveProductUnitRelationships END ===  
[2026-09-16 10:36:03] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:36:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:36:19] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:36:28] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:36:34] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":384,"request_units":[{"actual_name":"Pieces","unit_id":"315","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"70"}],"page_batch_id":"20260916_103435_9652"} 
[2026-09-16 10:36:34] live.INFO: === saveProductNewUnitRelationships START === {"product_id":384,"product_name":"Kasuku A4 Notepads"} 
[2026-09-16 10:36:34] live.INFO: Units data received {"units_data":[{"actual_name":"Pieces","unit_id":"315","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"70"}],"count":1} 
[2026-09-16 10:36:34] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Pieces","unit_id":"315","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"70"}} 
[2026-09-16 10:36:34] live.INFO: Unit found by ID {"unit_id":315,"actual_name":"Pieces"} 
[2026-09-16 10:36:34] live.INFO: Unit lookup result {"found":"yes","unit_id":315,"method":"by_id"} 
[2026-09-16 10:36:34] live.INFO: Updating existing unit {"unit_id":315} 
[2026-09-16 10:36:34] live.INFO: Updated unit_price {"new_price":70.0} 
[2026-09-16 10:36:34] live.INFO: Unit updated successfully  
[2026-09-16 10:36:34] live.INFO: Setting as BASE unit {"unit_id":315} 
[2026-09-16 10:36:34] live.INFO: Base unit saved {"base_unit_id":315} 
[2026-09-16 10:36:34] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":315} 
[2026-09-16 10:36:34] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:36:34] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:36:34] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:36:34] live.INFO: OpeningStockController::add - Location Data {"product_id":"384","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:36:34] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"384","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:36:36] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:36:47] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:36:49] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":385,"request_units":[{"actual_name":"Packet","unit_id":"316","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"780"}],"page_batch_id":"20260916_103427_6350"} 
[2026-09-16 10:36:49] live.INFO: === saveProductNewUnitRelationships START === {"product_id":385,"product_name":"Sta Soft Aromatherapy Passion 2l"} 
[2026-09-16 10:36:49] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"316","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"780"}],"count":1} 
[2026-09-16 10:36:49] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"316","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"780"}} 
[2026-09-16 10:36:49] live.INFO: Unit found by ID {"unit_id":316,"actual_name":"Packet"} 
[2026-09-16 10:36:49] live.INFO: Unit lookup result {"found":"yes","unit_id":316,"method":"by_id"} 
[2026-09-16 10:36:49] live.INFO: Updating existing unit {"unit_id":316} 
[2026-09-16 10:36:49] live.INFO: Updated unit_price {"new_price":780.0} 
[2026-09-16 10:36:49] live.INFO: Unit updated successfully  
[2026-09-16 10:36:49] live.INFO: Setting as BASE unit {"unit_id":316} 
[2026-09-16 10:36:49] live.INFO: Base unit saved {"base_unit_id":316} 
[2026-09-16 10:36:49] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":316} 
[2026-09-16 10:36:49] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:36:49] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:36:49] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:36:50] live.INFO: OpeningStockController::add - Location Data {"product_id":"385","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:36:50] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"385","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:36:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:36:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:37:01] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 10:37:02] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:37:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:37:52] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":386,"request_units":[{"actual_name":"Packet","unit_id":"317","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"340"}],"page_batch_id":"20260916_103719_0729"} 
[2026-09-16 10:37:52] live.INFO: === saveProductNewUnitRelationships START === {"product_id":386,"product_name":"Spring Fresh Fabric Conditioner 2L"} 
[2026-09-16 10:37:52] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"317","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"340"}],"count":1} 
[2026-09-16 10:37:52] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"317","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"340"}} 
[2026-09-16 10:37:52] live.INFO: Unit found by ID {"unit_id":317,"actual_name":"Packet"} 
[2026-09-16 10:37:52] live.INFO: Unit lookup result {"found":"yes","unit_id":317,"method":"by_id"} 
[2026-09-16 10:37:52] live.INFO: Updating existing unit {"unit_id":317} 
[2026-09-16 10:37:52] live.INFO: Updated unit_price {"new_price":340.0} 
[2026-09-16 10:37:52] live.INFO: Unit updated successfully  
[2026-09-16 10:37:52] live.INFO: Setting as BASE unit {"unit_id":317} 
[2026-09-16 10:37:52] live.INFO: Base unit saved {"base_unit_id":317} 
[2026-09-16 10:37:52] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":317} 
[2026-09-16 10:37:52] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:37:52] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:37:52] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:37:53] live.INFO: OpeningStockController::add - Location Data {"product_id":"386","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:37:53] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"386","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:37:54] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 10:37:55] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:38:01] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:38:27] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:39:15] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":387,"request_units":[{"actual_name":"Packet","unit_id":"318","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"360"}],"page_batch_id":"20260916_103825_5772"} 
[2026-09-16 10:39:15] live.INFO: === saveProductNewUnitRelationships START === {"product_id":387,"product_name":"Sunlight 1kg hand washing powder"} 
[2026-09-16 10:39:15] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"318","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"360"}],"count":1} 
[2026-09-16 10:39:15] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"318","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"360"}} 
[2026-09-16 10:39:15] live.INFO: Unit found by ID {"unit_id":318,"actual_name":"Packet"} 
[2026-09-16 10:39:15] live.INFO: Unit lookup result {"found":"yes","unit_id":318,"method":"by_id"} 
[2026-09-16 10:39:15] live.INFO: Updating existing unit {"unit_id":318} 
[2026-09-16 10:39:15] live.INFO: Updated unit_price {"new_price":360.0} 
[2026-09-16 10:39:15] live.INFO: Unit updated successfully  
[2026-09-16 10:39:15] live.INFO: Setting as BASE unit {"unit_id":318} 
[2026-09-16 10:39:15] live.INFO: Base unit saved {"base_unit_id":318} 
[2026-09-16 10:39:15] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":318} 
[2026-09-16 10:39:15] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:39:15] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:39:15] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:39:15] live.INFO: OpeningStockController::add - Location Data {"product_id":"387","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:39:15] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"387","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:39:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:39:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:39:30] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":388,"request_units":[{"actual_name":"Unit","unit_id":"319","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"25000"}],"page_batch_id":"20260916_103657_7763"} 
[2026-09-16 10:39:30] live.INFO: === saveProductNewUnitRelationships START === {"product_id":388,"product_name":"Samsung Home Theater 5.0"} 
[2026-09-16 10:39:30] live.INFO: Units data received {"units_data":[{"actual_name":"Unit","unit_id":"319","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"25000"}],"count":1} 
[2026-09-16 10:39:30] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Unit","unit_id":"319","short_name":"unt","relation_unit_id":null,"relation_qty":"1","price":"25000"}} 
[2026-09-16 10:39:30] live.INFO: Unit found by ID {"unit_id":319,"actual_name":"Unit"} 
[2026-09-16 10:39:30] live.INFO: Unit lookup result {"found":"yes","unit_id":319,"method":"by_id"} 
[2026-09-16 10:39:30] live.INFO: Updating existing unit {"unit_id":319} 
[2026-09-16 10:39:30] live.INFO: Updated unit_price {"new_price":25000.0} 
[2026-09-16 10:39:30] live.INFO: Unit updated successfully  
[2026-09-16 10:39:30] live.INFO: Setting as BASE unit {"unit_id":319} 
[2026-09-16 10:39:30] live.INFO: Base unit saved {"base_unit_id":319} 
[2026-09-16 10:39:30] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":319} 
[2026-09-16 10:39:30] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:39:30] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:39:30] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:39:30] live.INFO: OpeningStockController::add - Location Data {"product_id":"388","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:39:30] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"388","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:39:32] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:39:41] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:39:43] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:39:44] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:39:46] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:39:46] live.INFO: filterProduct method called {"business_id":43,"search_term":"bla","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 10:39:46] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 10:39:46] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 10:39:46] live.DEBUG: Applying search filters {"search_term":"bla","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 10:39:46] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 10:39:46] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 10:39:46] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"bla"} 
[2026-09-16 10:39:47] live.INFO: Product Row Debug - RELOADED {"product_id":357,"product_name":"BLACK COFFEE","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":500.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"265":{"unit_id":265,"unit_name":"Pc","unit_price":23000.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 10:39:48] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:39:48] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:39:53] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:39:53] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:39:58] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:02] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:12] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:40:13] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:16] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":389,"request_units":[{"actual_name":"Packet","unit_id":"320","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"380"}],"page_batch_id":"20260916_103944_0173"} 
[2026-09-16 10:40:16] live.INFO: === saveProductNewUnitRelationships START === {"product_id":389,"product_name":"Sunlight 2 In 1 Hand Washing Powder Tropical 1kg"} 
[2026-09-16 10:40:16] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"320","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"380"}],"count":1} 
[2026-09-16 10:40:16] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"320","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"380"}} 
[2026-09-16 10:40:16] live.INFO: Unit found by ID {"unit_id":320,"actual_name":"Packet"} 
[2026-09-16 10:40:16] live.INFO: Unit lookup result {"found":"yes","unit_id":320,"method":"by_id"} 
[2026-09-16 10:40:16] live.INFO: Updating existing unit {"unit_id":320} 
[2026-09-16 10:40:16] live.INFO: Updated unit_price {"new_price":380.0} 
[2026-09-16 10:40:16] live.INFO: Unit updated successfully  
[2026-09-16 10:40:16] live.INFO: Setting as BASE unit {"unit_id":320} 
[2026-09-16 10:40:16] live.INFO: Base unit saved {"base_unit_id":320} 
[2026-09-16 10:40:16] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":320} 
[2026-09-16 10:40:16] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:40:16] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:40:16] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:40:16] live.INFO: OpeningStockController::add - Location Data {"product_id":"389","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:40:16] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"389","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:40:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:18] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:40:21] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:24] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:40:25] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:25] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:25] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:25] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:26] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:40:26] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:26] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:26] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:26] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:27] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:27] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:27] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:27] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:27] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:27] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:28] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:28] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:28] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:28] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:29] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:29] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:29] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:29] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:30] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:30] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:30] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:30] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:31] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:31] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:31] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 10:40:31] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 10:40:32] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:40:36] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:40:45] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:41:02] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:41:04] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:41:06] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:41:13] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":390,"request_units":[{"actual_name":"Pieces","unit_id":"321","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1500"}],"page_batch_id":"20260916_104010_6793"} 
[2026-09-16 10:41:13] live.INFO: === saveProductNewUnitRelationships START === {"product_id":390,"product_name":"Oraimo Earpods"} 
[2026-09-16 10:41:13] live.INFO: Units data received {"units_data":[{"actual_name":"Pieces","unit_id":"321","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1500"}],"count":1} 
[2026-09-16 10:41:13] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Pieces","unit_id":"321","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1500"}} 
[2026-09-16 10:41:13] live.INFO: Unit found by ID {"unit_id":321,"actual_name":"Pieces"} 
[2026-09-16 10:41:13] live.INFO: Unit lookup result {"found":"yes","unit_id":321,"method":"by_id"} 
[2026-09-16 10:41:13] live.INFO: Updating existing unit {"unit_id":321} 
[2026-09-16 10:41:13] live.INFO: Updated unit_price {"new_price":1500.0} 
[2026-09-16 10:41:13] live.INFO: Unit updated successfully  
[2026-09-16 10:41:13] live.INFO: Setting as BASE unit {"unit_id":321} 
[2026-09-16 10:41:13] live.INFO: Base unit saved {"base_unit_id":321} 
[2026-09-16 10:41:13] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":321} 
[2026-09-16 10:41:13] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:41:13] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:41:13] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:41:14] live.INFO: OpeningStockController::add - Location Data {"product_id":"390","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:41:14] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"390","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:41:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:41:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:41:54] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":391,"request_units":[{"actual_name":"Packet","unit_id":"322","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"page_batch_id":"20260916_104102_4331"} 
[2026-09-16 10:41:54] live.INFO: === saveProductNewUnitRelationships START === {"product_id":391,"product_name":"Amaize Premium Maize Meal 2Kg"} 
[2026-09-16 10:41:54] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"322","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}],"count":1} 
[2026-09-16 10:41:54] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"322","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"210"}} 
[2026-09-16 10:41:54] live.INFO: Unit found by ID {"unit_id":322,"actual_name":"Packet"} 
[2026-09-16 10:41:54] live.INFO: Unit lookup result {"found":"yes","unit_id":322,"method":"by_id"} 
[2026-09-16 10:41:54] live.INFO: Updating existing unit {"unit_id":322} 
[2026-09-16 10:41:54] live.INFO: Updated unit_price {"new_price":210.0} 
[2026-09-16 10:41:54] live.INFO: Unit updated successfully  
[2026-09-16 10:41:54] live.INFO: Setting as BASE unit {"unit_id":322} 
[2026-09-16 10:41:54] live.INFO: Base unit saved {"base_unit_id":322} 
[2026-09-16 10:41:54] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":322} 
[2026-09-16 10:41:54] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:41:54] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:41:54] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:41:54] live.INFO: OpeningStockController::add - Location Data {"product_id":"391","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:41:54] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"391","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:41:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:41:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:42:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:42:15] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:43:18] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":392,"request_units":[{"actual_name":"Packet","unit_id":"323","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":null}],"page_batch_id":"20260916_104213_8330"} 
[2026-09-16 10:43:18] live.INFO: === saveProductNewUnitRelationships START === {"product_id":392,"product_name":"1 kg White Sugar (Economy"} 
[2026-09-16 10:43:18] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"323","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":null}],"count":1} 
[2026-09-16 10:43:18] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"323","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":null}} 
[2026-09-16 10:43:18] live.INFO: Unit found by ID {"unit_id":323,"actual_name":"Packet"} 
[2026-09-16 10:43:18] live.INFO: Unit lookup result {"found":"yes","unit_id":323,"method":"by_id"} 
[2026-09-16 10:43:18] live.INFO: Updating existing unit {"unit_id":323} 
[2026-09-16 10:43:18] live.INFO: No changes needed for unit  
[2026-09-16 10:43:18] live.INFO: Setting as BASE unit {"unit_id":323} 
[2026-09-16 10:43:18] live.INFO: Base unit saved {"base_unit_id":323} 
[2026-09-16 10:43:18] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":323} 
[2026-09-16 10:43:18] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:43:18] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:43:18] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:43:19] live.INFO: OpeningStockController::add - Location Data {"product_id":"392","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:43:19] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"392","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:43:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:43:27] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:43:39] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:44:09] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":393,"request_units":[{"actual_name":"Packet","unit_id":"325","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"300"}],"page_batch_id":"20260916_104337_5094"} 
[2026-09-16 10:44:09] live.INFO: === saveProductNewUnitRelationships START === {"product_id":393,"product_name":"2 kg White Sugar (Economy"} 
[2026-09-16 10:44:09] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"325","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"300"}],"count":1} 
[2026-09-16 10:44:09] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"325","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"300"}} 
[2026-09-16 10:44:09] live.INFO: Unit found by ID {"unit_id":325,"actual_name":"Packet"} 
[2026-09-16 10:44:09] live.INFO: Unit lookup result {"found":"yes","unit_id":325,"method":"by_id"} 
[2026-09-16 10:44:09] live.INFO: Updating existing unit {"unit_id":325} 
[2026-09-16 10:44:09] live.INFO: Updated unit_price {"new_price":300.0} 
[2026-09-16 10:44:09] live.INFO: Unit updated successfully  
[2026-09-16 10:44:09] live.INFO: Setting as BASE unit {"unit_id":325} 
[2026-09-16 10:44:09] live.INFO: Base unit saved {"base_unit_id":325} 
[2026-09-16 10:44:09] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":325} 
[2026-09-16 10:44:09] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:44:09] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:44:09] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:44:09] live.INFO: OpeningStockController::add - Location Data {"product_id":"393","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:44:09] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"393","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:44:10] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":394,"request_units":[{"actual_name":"Packet","unit_id":"324","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1200"}],"page_batch_id":"20260916_104155_1794"} 
[2026-09-16 10:44:10] live.INFO: === saveProductNewUnitRelationships START === {"product_id":394,"product_name":"Soko Wheat Flour 5kg"} 
[2026-09-16 10:44:10] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"324","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1200"}],"count":1} 
[2026-09-16 10:44:10] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"324","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"1200"}} 
[2026-09-16 10:44:10] live.INFO: Unit found by ID {"unit_id":324,"actual_name":"Packet"} 
[2026-09-16 10:44:10] live.INFO: Unit lookup result {"found":"yes","unit_id":324,"method":"by_id"} 
[2026-09-16 10:44:10] live.INFO: Updating existing unit {"unit_id":324} 
[2026-09-16 10:44:10] live.INFO: Updated unit_price {"new_price":1200.0} 
[2026-09-16 10:44:10] live.INFO: Unit updated successfully  
[2026-09-16 10:44:10] live.INFO: Setting as BASE unit {"unit_id":324} 
[2026-09-16 10:44:10] live.INFO: Base unit saved {"base_unit_id":324} 
[2026-09-16 10:44:10] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":324} 
[2026-09-16 10:44:10] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:44:10] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:44:10] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:44:11] live.INFO: OpeningStockController::add - Location Data {"product_id":"394","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:44:11] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"394","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:44:11] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:44:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:44:18] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:44:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:44:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:44:52] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 10:44:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:45:19] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":395,"request_units":[{"actual_name":"Packet","unit_id":"326","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"305"}],"page_batch_id":"20260916_104420_7176"} 
[2026-09-16 10:45:19] live.INFO: === saveProductNewUnitRelationships START === {"product_id":395,"product_name":"2 kg Mumias Sugar / Kabras: KES 305"} 
[2026-09-16 10:45:19] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"326","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"305"}],"count":1} 
[2026-09-16 10:45:19] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"326","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"305"}} 
[2026-09-16 10:45:19] live.INFO: Unit found by ID {"unit_id":326,"actual_name":"Packet"} 
[2026-09-16 10:45:19] live.INFO: Unit lookup result {"found":"yes","unit_id":326,"method":"by_id"} 
[2026-09-16 10:45:19] live.INFO: Updating existing unit {"unit_id":326} 
[2026-09-16 10:45:19] live.INFO: Updated unit_price {"new_price":305.0} 
[2026-09-16 10:45:19] live.INFO: Unit updated successfully  
[2026-09-16 10:45:19] live.INFO: Setting as BASE unit {"unit_id":326} 
[2026-09-16 10:45:19] live.INFO: Base unit saved {"base_unit_id":326} 
[2026-09-16 10:45:19] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":326} 
[2026-09-16 10:45:19] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:45:19] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:45:19] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:45:20] live.INFO: OpeningStockController::add - Location Data {"product_id":"395","business_id":45,"locations":{"Illuminate\\Support\\Collection":{"41":"TAF LTD (BL0001)"}},"available_locations":[41]} 
[2026-09-16 10:45:20] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"395","business_id":45,"has_serial_numbers":{"41":false},"total_locations_with_serial":0} 
[2026-09-16 10:45:22] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:45:33] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:46:23] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":396,"request_units":[{"actual_name":"Packet","unit_id":"327","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"230"}],"page_batch_id":"20260916_104455_3866"} 
[2026-09-16 10:46:23] live.INFO: === saveProductNewUnitRelationships START === {"product_id":396,"product_name":"Soko Wheat Flour 2kg"} 
[2026-09-16 10:46:23] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"327","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"230"}],"count":1} 
[2026-09-16 10:46:23] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"327","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"230"}} 
[2026-09-16 10:46:23] live.INFO: Unit found by ID {"unit_id":327,"actual_name":"Packet"} 
[2026-09-16 10:46:23] live.INFO: Unit lookup result {"found":"yes","unit_id":327,"method":"by_id"} 
[2026-09-16 10:46:23] live.INFO: Updating existing unit {"unit_id":327} 
[2026-09-16 10:46:23] live.INFO: Updated unit_price {"new_price":230.0} 
[2026-09-16 10:46:23] live.INFO: Unit updated successfully  
[2026-09-16 10:46:23] live.INFO: Setting as BASE unit {"unit_id":327} 
[2026-09-16 10:46:23] live.INFO: Base unit saved {"base_unit_id":327} 
[2026-09-16 10:46:23] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":327} 
[2026-09-16 10:46:23] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:46:23] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:46:23] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:46:23] live.INFO: OpeningStockController::add - Location Data {"product_id":"396","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:46:23] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"396","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:46:25] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:46:37] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:46:58] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:47:17] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:47:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:48:49] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:50:36] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 10:50:54] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":397,"request_units":[{"actual_name":"Pairs","unit_id":"328","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"1700"}],"page_batch_id":"20260916_104847_2843"} 
[2026-09-16 10:50:54] live.INFO: === saveProductNewUnitRelationships START === {"product_id":397,"product_name":"Levi Men's Jean 42"} 
[2026-09-16 10:50:54] live.INFO: Units data received {"units_data":[{"actual_name":"Pairs","unit_id":"328","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"1700"}],"count":1} 
[2026-09-16 10:50:54] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Pairs","unit_id":"328","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"1700"}} 
[2026-09-16 10:50:54] live.INFO: Unit found by ID {"unit_id":328,"actual_name":"Pairs"} 
[2026-09-16 10:50:54] live.INFO: Unit lookup result {"found":"yes","unit_id":328,"method":"by_id"} 
[2026-09-16 10:50:54] live.INFO: Updating existing unit {"unit_id":328} 
[2026-09-16 10:50:54] live.INFO: Updated unit_price {"new_price":1700.0} 
[2026-09-16 10:50:54] live.INFO: Unit updated successfully  
[2026-09-16 10:50:54] live.INFO: Setting as BASE unit {"unit_id":328} 
[2026-09-16 10:50:54] live.INFO: Base unit saved {"base_unit_id":328} 
[2026-09-16 10:50:54] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":328} 
[2026-09-16 10:50:54] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:50:54] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:50:54] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:50:55] live.INFO: OpeningStockController::add - Location Data {"product_id":"397","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:50:55] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"397","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:50:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:51:09] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 10:51:09] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:52:09] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:52:50] live.INFO: === saveProductUnitRelationships START === {"product_id":378,"product_name":"Dasani Water 1liter"} 
[2026-09-16 10:52:50] live.INFO: Units data received {"units_data":[{"unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}],"count":1} 
[2026-09-16 10:52:50] live.INFO: Processing unit index: 0 {"unit_data":{"unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}} 
[2026-09-16 10:52:50] live.WARNING: Empty actual_name, skipping this unit  
[2026-09-16 10:52:50] live.INFO: First pass complete {"created_units_count":0,"unit_ids_to_keep":[],"base_unit_id":null} 
[2026-09-16 10:52:50] live.WARNING: No base_unit_id set, skipping second pass  
[2026-09-16 10:52:50] live.INFO: === saveProductUnitRelationships END ===  
[2026-09-16 10:52:50] live.INFO: OpeningStockController::add - Location Data {"product_id":"378","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:52:50] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"378","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:52:52] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:53:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:53:28] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:53:59] live.INFO: === saveProductUnitRelationships START === {"product_id":378,"product_name":"Dasani Water 1liter"} 
[2026-09-16 10:53:59] live.INFO: Units data received {"units_data":[{"unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}],"count":1} 
[2026-09-16 10:53:59] live.INFO: Processing unit index: 0 {"unit_data":{"unit_id":"311","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}} 
[2026-09-16 10:53:59] live.WARNING: Empty actual_name, skipping this unit  
[2026-09-16 10:53:59] live.INFO: First pass complete {"created_units_count":0,"unit_ids_to_keep":[],"base_unit_id":null} 
[2026-09-16 10:53:59] live.WARNING: No base_unit_id set, skipping second pass  
[2026-09-16 10:53:59] live.INFO: === saveProductUnitRelationships END ===  
[2026-09-16 10:53:59] live.INFO: OpeningStockController::add - Location Data {"product_id":"378","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:53:59] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"378","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:54:01] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:54:07] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:54:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:55:19] live.INFO: === saveProductUnitRelationships START === {"product_id":378,"product_name":"Dasani Water 1liter"} 
[2026-09-16 10:55:19] live.INFO: Units data received {"units_data":[{"actual_name":"311","unit_id":"309","short_name":"Btls","allow_decimal":"0","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}],"count":1} 
[2026-09-16 10:55:19] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"311","unit_id":"309","short_name":"Btls","allow_decimal":"0","relation_unit_id":null,"relation_qty":"1","price":"80.0000"}} 
[2026-09-16 10:55:19] live.INFO: Unit found by ID {"unit_id":309,"actual_name":"Liter"} 
[2026-09-16 10:55:19] live.INFO: Updated short_name {"new_short_name":"Btls"} 
[2026-09-16 10:55:19] live.INFO: Updated allow_decimal {"new_allow_decimal":"0"} 
[2026-09-16 10:55:19] live.WARNING: Skipping actual_name update - value looks like an ID {"actual_name":"311","unit_id":309} 
[2026-09-16 10:55:19] live.INFO: Setting as BASE unit {"unit_id":309} 
[2026-09-16 10:55:19] live.INFO: Unit saved {"unit_id":309,"unit_name":"Liter","is_base":true} 
[2026-09-16 10:55:19] live.INFO: First pass complete {"created_units_count":1,"unit_ids_to_keep":[309],"base_unit_id":309} 
[2026-09-16 10:55:19] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:55:19] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:55:19] live.INFO: === Cleaning up unused units === {"unit_ids_to_keep":[309],"base_unit_id":309,"page_batch_id":"20260916_102752_2386"} 
[2026-09-16 10:55:19] live.INFO: Units to delete {"count":1,"unit_ids":[311]} 
[2026-09-16 10:55:19] live.INFO: Checking if unit can be deleted {"unit_id":311,"unit_name":"Bottles","used_as_relation":false,"used_as_base":false} 
[2026-09-16 10:55:19] live.INFO: Unit deleted {"unit_id":311} 
[2026-09-16 10:55:19] live.INFO: === saveProductUnitRelationships END ===  
[2026-09-16 10:55:20] live.INFO: OpeningStockController::add - Location Data {"product_id":"378","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:55:20] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"378","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:55:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:55:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:56:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:56:58] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 10:59:06] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":398,"request_units":[{"actual_name":"Pairs","unit_id":"329","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"4500"}],"page_batch_id":"20260916_105654_9503"} 
[2026-09-16 10:59:06] live.INFO: === saveProductNewUnitRelationships START === {"product_id":398,"product_name":"Nike Shoes J4/40"} 
[2026-09-16 10:59:06] live.INFO: Units data received {"units_data":[{"actual_name":"Pairs","unit_id":"329","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"4500"}],"count":1} 
[2026-09-16 10:59:06] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Pairs","unit_id":"329","short_name":"prs","relation_unit_id":null,"relation_qty":"1","price":"4500"}} 
[2026-09-16 10:59:06] live.INFO: Unit found by ID {"unit_id":329,"actual_name":"Pairs"} 
[2026-09-16 10:59:06] live.INFO: Unit lookup result {"found":"yes","unit_id":329,"method":"by_id"} 
[2026-09-16 10:59:06] live.INFO: Updating existing unit {"unit_id":329} 
[2026-09-16 10:59:06] live.INFO: Updated unit_price {"new_price":4500.0} 
[2026-09-16 10:59:06] live.INFO: Unit updated successfully  
[2026-09-16 10:59:06] live.INFO: Setting as BASE unit {"unit_id":329} 
[2026-09-16 10:59:06] live.INFO: Base unit saved {"base_unit_id":329} 
[2026-09-16 10:59:06] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":329} 
[2026-09-16 10:59:06] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 10:59:06] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 10:59:06] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 10:59:06] live.INFO: OpeningStockController::add - Location Data {"product_id":"398","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 10:59:06] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"398","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 10:59:08] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:59:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 10:59:55] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:01:19] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:01:29] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":399,"request_units":[{"actual_name":"Bottles","unit_id":"330","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"300"}],"page_batch_id":"20260916_105953_6936"} 
[2026-09-16 11:01:29] live.INFO: === saveProductNewUnitRelationships START === {"product_id":399,"product_name":"Keringet Drinking Water 5liters"} 
[2026-09-16 11:01:29] live.INFO: Units data received {"units_data":[{"actual_name":"Bottles","unit_id":"330","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"300"}],"count":1} 
[2026-09-16 11:01:29] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Bottles","unit_id":"330","short_name":"Btls","relation_unit_id":null,"relation_qty":"1","price":"300"}} 
[2026-09-16 11:01:29] live.INFO: Unit found by ID {"unit_id":330,"actual_name":"Bottles"} 
[2026-09-16 11:01:29] live.INFO: Unit lookup result {"found":"yes","unit_id":330,"method":"by_id"} 
[2026-09-16 11:01:29] live.INFO: Updating existing unit {"unit_id":330} 
[2026-09-16 11:01:29] live.INFO: Updated unit_price {"new_price":300.0} 
[2026-09-16 11:01:29] live.INFO: Unit updated successfully  
[2026-09-16 11:01:29] live.INFO: Setting as BASE unit {"unit_id":330} 
[2026-09-16 11:01:29] live.INFO: Base unit saved {"base_unit_id":330} 
[2026-09-16 11:01:29] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":330} 
[2026-09-16 11:01:29] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 11:01:29] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 11:01:29] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 11:01:30] live.INFO: OpeningStockController::add - Location Data {"product_id":"399","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 11:01:30] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"399","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 11:01:31] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:01:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:04:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:04:59] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:05:13] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:05:22] live.INFO: filterProduct method called {"business_id":43,"search_term":"bl","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:05:22] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:05:22] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:05:22] live.DEBUG: Applying search filters {"search_term":"bl","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 11:05:22] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 11:05:22] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 11:05:22] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"bl"} 
[2026-09-16 11:05:23] live.INFO: Product Row Debug - RELOADED {"product_id":357,"product_name":"BLACK COFFEE","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":500.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"265":{"unit_id":265,"unit_name":"Pc","unit_price":23000.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:05:24] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 11:05:24] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 11:05:38] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 11:05:38] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 11:05:39] live.INFO: Fetching tax rate for product ID: 357  
[2026-09-16 11:05:39] live.INFO: Tax rate for product ID 357 is: 16%  
[2026-09-16 11:05:50] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:05:56] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 11:05:56] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:05:56] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:05:56] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:05:56] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:05:56] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 11:05:56] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:05:56] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:05:56] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129135229.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:05:56] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:06:23] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:06:30] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:06:32] live.INFO: Digitax upload skipped: No tax number provided {"contact_id":908,"contact_name":"","contact_type":"supplier"} 
[2026-09-16 11:06:34] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:07:15] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":400,"request_units":[{"actual_name":"pieces","unit_id":"331","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1000"}],"page_batch_id":"20260916_110631_4938"} 
[2026-09-16 11:07:15] live.INFO: === saveProductNewUnitRelationships START === {"product_id":400,"product_name":"product test"} 
[2026-09-16 11:07:15] live.INFO: Units data received {"units_data":[{"actual_name":"pieces","unit_id":"331","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1000"}],"count":1} 
[2026-09-16 11:07:15] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"pieces","unit_id":"331","short_name":"pcs","relation_unit_id":null,"relation_qty":"1","price":"1000"}} 
[2026-09-16 11:07:15] live.INFO: Unit found by ID {"unit_id":331,"actual_name":"pieces"} 
[2026-09-16 11:07:15] live.INFO: Unit lookup result {"found":"yes","unit_id":331,"method":"by_id"} 
[2026-09-16 11:07:15] live.INFO: Updating existing unit {"unit_id":331} 
[2026-09-16 11:07:15] live.INFO: Updated unit_price {"new_price":1000.0} 
[2026-09-16 11:07:15] live.INFO: Unit updated successfully  
[2026-09-16 11:07:15] live.INFO: Setting as BASE unit {"unit_id":331} 
[2026-09-16 11:07:15] live.INFO: Base unit saved {"base_unit_id":331} 
[2026-09-16 11:07:15] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":331} 
[2026-09-16 11:07:15] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 11:07:15] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 11:07:15] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 11:07:15] live.INFO: OpeningStockController::add - Location Data {"product_id":"400","business_id":43,"locations":{"Illuminate\\Support\\Collection":{"39":"Greenfield Supermarket Ltd (BL0001)"}},"available_locations":[39]} 
[2026-09-16 11:07:15] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"400","business_id":43,"has_serial_numbers":{"39":false},"total_locations_with_serial":0} 
[2026-09-16 11:07:18] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:07:26] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:07:43] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:07:48] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:07:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:07:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":364,"business_id":45} 
[2026-09-16 11:08:01] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:08:10] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:08:18] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:08:21] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:08:28] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:08:29] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:08:40] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:09:15] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":401,"request_units":[{"actual_name":"PC","unit_id":"332","short_name":"PC","relation_unit_id":null,"relation_qty":"1","price":"200"},{"actual_name":"kG","unit_id":"333","short_name":"KG","relation_unit_id":"332","relation_qty":"4","price":"650"}],"page_batch_id":"20260916_110749_1526"} 
[2026-09-16 11:09:15] live.INFO: === saveProductNewUnitRelationships START === {"product_id":401,"product_name":"DRUM STICK"} 
[2026-09-16 11:09:15] live.INFO: Units data received {"units_data":[{"actual_name":"PC","unit_id":"332","short_name":"PC","relation_unit_id":null,"relation_qty":"1","price":"200"},{"actual_name":"kG","unit_id":"333","short_name":"KG","relation_unit_id":"332","relation_qty":"4","price":"650"}],"count":2} 
[2026-09-16 11:09:15] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"PC","unit_id":"332","short_name":"PC","relation_unit_id":null,"relation_qty":"1","price":"200"}} 
[2026-09-16 11:09:15] live.INFO: Unit found by ID {"unit_id":332,"actual_name":"PC"} 
[2026-09-16 11:09:15] live.INFO: Unit lookup result {"found":"yes","unit_id":332,"method":"by_id"} 
[2026-09-16 11:09:15] live.INFO: Updating existing unit {"unit_id":332} 
[2026-09-16 11:09:15] live.INFO: Updated unit_price {"new_price":200.0} 
[2026-09-16 11:09:15] live.INFO: Unit updated successfully  
[2026-09-16 11:09:15] live.INFO: Setting as BASE unit {"unit_id":332} 
[2026-09-16 11:09:15] live.INFO: Base unit saved {"base_unit_id":332} 
[2026-09-16 11:09:15] live.INFO: Processing unit index: 1 {"unit_data":{"actual_name":"kG","unit_id":"333","short_name":"KG","relation_unit_id":"332","relation_qty":"4","price":"650"}} 
[2026-09-16 11:09:15] live.INFO: Unit found by ID {"unit_id":333,"actual_name":"kG"} 
[2026-09-16 11:09:15] live.INFO: Unit lookup result {"found":"yes","unit_id":333,"method":"by_id"} 
[2026-09-16 11:09:15] live.INFO: Updating existing unit {"unit_id":333} 
[2026-09-16 11:09:15] live.INFO: Updated unit_price {"new_price":650.0} 
[2026-09-16 11:09:15] live.INFO: Unit updated successfully  
[2026-09-16 11:09:15] live.INFO: First pass complete {"created_units_count":2,"base_unit_id":332} 
[2026-09-16 11:09:15] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 11:09:15] live.INFO: Setting relation for unit {"unit_id":333,"unit_name":"kG","relation_unit_id":332,"relation_unit_name":"PC","relation_qty":4.0} 
[2026-09-16 11:09:15] live.INFO: Relation saved to database {"unit_id":333,"rel_unit_id":332,"rel_unit_qty":4.0,"base_unit_id":332} 
[2026-09-16 11:09:15] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 11:09:15] live.INFO: Calculating cumulative multiplier for unit {"unit_id":333,"unit_name":"kG"} 
[2026-09-16 11:09:15] live.INFO: === calculateCumulativeMultiplier START === {"unit_id":333,"business_id":8} 
[2026-09-16 11:09:15] live.INFO: Unit found {"unit_id":333,"unit_name":"kG","rel_unit_id":332,"rel_unit_qty":"4.0000","base_unit_id":332} 
[2026-09-16 11:09:15] live.INFO: Starting cumulative multiplier {"initial_multiplier":4.0} 
[2026-09-16 11:09:15] live.INFO: Traversing up chain depth: 0 {"current_unit_id":332} 
[2026-09-16 11:09:15] live.INFO: Parent unit found {"parent_unit_id":332,"parent_unit_name":"PC","parent_rel_unit_id":null,"parent_rel_unit_qty":"1.0000"} 
[2026-09-16 11:09:15] live.INFO: Reached base unit (no rel_unit_id), stopping  
[2026-09-16 11:09:15] live.INFO: Chain traversal complete {"chain":"kG (333) -> PC (332)","final_cumulative_multiplier":4.0,"depth_traversed":0} 
[2026-09-16 11:09:15] live.INFO: === calculateCumulativeMultiplier END === {"result":4.0} 
[2026-09-16 11:09:15] live.INFO: Cumulative multiplier calculated {"unit_id":333,"unit_name":"kG","cumulative_multiplier":4.0} 
[2026-09-16 11:09:15] live.INFO: Unit saved with cumulative multiplier {"unit_id":333,"unit_name":"kG","base_unit_multiplier":4.0} 
[2026-09-16 11:09:15] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 11:09:17] live.INFO: OpeningStockController::add - Location Data {"product_id":"401","business_id":8,"locations":{"Illuminate\\Support\\Collection":{"9":"BQT GENERAL BUSINESS (BL0001)","10":"BQT BRANCH 1 (BL0002)","12":"BQT BRANCH 2 (BL0003)","14":"BQT BRANCH 3 (BL0004)"}},"available_locations":[9]} 
[2026-09-16 11:09:17] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"401","business_id":8,"has_serial_numbers":{"9":false},"total_locations_with_serial":0} 
[2026-09-16 11:09:20] live.INFO: Offline not allowed - triggering cleanup {"user_id":293,"business_id":43} 
[2026-09-16 11:09:26] live.INFO: filterProduct method called {"business_id":43,"search_term":"pro","location_id":"39","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:09:26] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:09:26] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:09:26] live.DEBUG: Applying search filters {"search_term":"pro","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 11:09:26] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 11:09:26] live.DEBUG: Applying location filter {"location_id":"39"} 
[2026-09-16 11:09:26] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":43,"search_term":"pro"} 
[2026-09-16 11:09:27] live.INFO: Product Row Debug - RELOADED {"product_id":400,"product_name":"product test","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":1000.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"331":{"unit_id":331,"unit_name":"pieces","unit_price":1000.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:09:44] live.INFO: filterProduct method called {"business_id":8,"search_term":"DRU","location_id":"9","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku","lot"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:09:44] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:09:44] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:09:44] live.DEBUG: Joining purchase_lines for lot number search  
[2026-09-16 11:09:44] live.DEBUG: Applying search filters {"search_term":"DRU","search_type":"like","search_fields":["name","sku","lot"]} 
[2026-09-16 11:09:44] live.DEBUG: LIKE search conditions applied {"fields":["name","sku","lot"]} 
[2026-09-16 11:09:44] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:09:44] live.DEBUG: Added lot number fields to select  
[2026-09-16 11:09:44] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":8,"search_term":"DRU"} 
[2026-09-16 11:09:45] live.INFO: Product Row Debug - RELOADED {"product_id":401,"product_name":"DRUM STICK","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":200.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"332":{"unit_id":332,"unit_name":"PC","unit_price":200.0,"multiplier":1,"has_price":true},"333":{"unit_id":333,"unit_name":"kG","unit_price":650.0,"multiplier":"4.0000","has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:09:54] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:54] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:55] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:55] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:56] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:56] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:56] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:56] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:57] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:57] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:57] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:57] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:58] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:58] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:09:59] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:09:59] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:02] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:02] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:03] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:03] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:26] live.INFO: filterProduct method called {"business_id":8,"search_term":"DRUM","location_id":"9","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku","lot"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:10:26] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:10:26] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:10:26] live.DEBUG: Joining purchase_lines for lot number search  
[2026-09-16 11:10:26] live.DEBUG: Applying search filters {"search_term":"DRUM","search_type":"like","search_fields":["name","sku","lot"]} 
[2026-09-16 11:10:26] live.DEBUG: LIKE search conditions applied {"fields":["name","sku","lot"]} 
[2026-09-16 11:10:26] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:10:26] live.DEBUG: Added lot number fields to select  
[2026-09-16 11:10:26] live.INFO: filterProduct completed successfully {"result_count":1,"business_id":8,"search_term":"DRUM"} 
[2026-09-16 11:10:26] live.INFO: Product Row Debug - RELOADED {"product_id":401,"product_name":"DRUM STICK","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":200.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"332":{"unit_id":332,"unit_name":"PC","unit_price":200.0,"multiplier":1,"has_price":true},"333":{"unit_id":333,"unit_name":"kG","unit_price":650.0,"multiplier":"4.0000","has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:10:33] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:33] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:34] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:34] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:34] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:34] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:35] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:35] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:36] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:36] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:36] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:36] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:37] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:37] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:37] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:37] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:38] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:38] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:10:39] live.INFO: Fetching tax rate for product ID: 401  
[2026-09-16 11:10:39] live.INFO: Product ID 401 has no tax assigned.  
[2026-09-16 11:11:54] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":402,"request_units":[{"actual_name":"KG","unit_id":"334","short_name":"KG","relation_unit_id":null,"relation_qty":"1","price":"650"}],"page_batch_id":"20260916_111125_4882"} 
[2026-09-16 11:11:54] live.INFO: === saveProductNewUnitRelationships START === {"product_id":402,"product_name":"DRUM STICK 2"} 
[2026-09-16 11:11:54] live.INFO: Units data received {"units_data":[{"actual_name":"KG","unit_id":"334","short_name":"KG","relation_unit_id":null,"relation_qty":"1","price":"650"}],"count":1} 
[2026-09-16 11:11:54] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"KG","unit_id":"334","short_name":"KG","relation_unit_id":null,"relation_qty":"1","price":"650"}} 
[2026-09-16 11:11:54] live.INFO: Unit found by ID {"unit_id":334,"actual_name":"KG"} 
[2026-09-16 11:11:54] live.INFO: Unit lookup result {"found":"yes","unit_id":334,"method":"by_id"} 
[2026-09-16 11:11:54] live.INFO: Updating existing unit {"unit_id":334} 
[2026-09-16 11:11:54] live.INFO: Updated unit_price {"new_price":650.0} 
[2026-09-16 11:11:54] live.INFO: Unit updated successfully  
[2026-09-16 11:11:54] live.INFO: Setting as BASE unit {"unit_id":334} 
[2026-09-16 11:11:54] live.INFO: Base unit saved {"base_unit_id":334} 
[2026-09-16 11:11:54] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":334} 
[2026-09-16 11:11:54] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 11:11:54] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 11:11:54] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 11:11:55] live.INFO: OpeningStockController::add - Location Data {"product_id":"402","business_id":8,"locations":{"Illuminate\\Support\\Collection":{"9":"BQT GENERAL BUSINESS (BL0001)","10":"BQT BRANCH 1 (BL0002)","12":"BQT BRANCH 2 (BL0003)","14":"BQT BRANCH 3 (BL0004)"}},"available_locations":[9]} 
[2026-09-16 11:11:55] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"402","business_id":8,"has_serial_numbers":{"9":false},"total_locations_with_serial":0} 
[2026-09-16 11:12:36] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:12:57] live.INFO: filterProduct method called {"business_id":8,"search_term":"DRU","location_id":"9","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku","lot"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:12:57] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:12:57] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:12:57] live.DEBUG: Joining purchase_lines for lot number search  
[2026-09-16 11:12:57] live.DEBUG: Applying search filters {"search_term":"DRU","search_type":"like","search_fields":["name","sku","lot"]} 
[2026-09-16 11:12:57] live.DEBUG: LIKE search conditions applied {"fields":["name","sku","lot"]} 
[2026-09-16 11:12:57] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:12:57] live.DEBUG: Added lot number fields to select  
[2026-09-16 11:12:57] live.INFO: filterProduct completed successfully {"result_count":2,"business_id":8,"search_term":"DRU"} 
[2026-09-16 11:13:02] live.INFO: Product Row Debug - RELOADED {"product_id":402,"product_name":"DRUM STICK 2","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":650.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"334":{"unit_id":334,"unit_name":"KG","unit_price":650.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:13:27] live.INFO: Credit Limit Check Started {"contact_id":"94","status":"final","final_total":"6500.00","is_credit_sale":"0","exclude_transaction_id":null} 
[2026-09-16 11:13:27] live.DEBUG: Payment Calculation {"final_total":6500.0,"curr_total_payment":6500.0,"is_credit_sale":false,"payment_count":1} 
[2026-09-16 11:13:27] live.INFO: Credit Limit Check Skipped - Fully Paid {"final_total":6500.0,"curr_total_payment":6500.0} 
[2026-09-16 11:13:27] live.INFO: mpesa_transaction_id value: NULL  
[2026-09-16 11:13:27] live.INFO: is_mpesa_sale value: true  
[2026-09-16 11:13:27] live.INFO: M-Pesa sale evaluation {"is_mpesa_sale_raw":true,"is_valid_mpesa_sale":false,"payment_method_input":"cash","mpesa_transaction_id":null,"transaction_id":1932} 
[2026-09-16 11:13:27] live.INFO: Journal Entry Case: FULL CASH PAYMENT {"transaction_id":1932,"final_total":6500.0,"amount_paid":6500.0,"balance_due":0} 
[2026-09-16 11:13:27] live.INFO: Journal Entries Inserted Successfully {"transaction_id":1932,"entries":[{"transaction_id":1932,"created_by_id":21,"transaction_number":"TRX-6aaa4fa7199497.65869573","payment_detail_id":1344,"location_id":"9","currency_id":133,"transaction_type":"sell","date":"2026-09-16","month":9,"year":2026,"active":1,"reversed":0,"reversible":1,"manual_entry":1,"created_at":"2026-09-16 11:13:27","updated_at":"2026-09-16 11:13:27","chart_of_account_id":23,"debit":null,"credit":6500.0},{"transaction_id":1932,"created_by_id":21,"transaction_number":"TRX-6aaa4fa7199497.65869573","payment_detail_id":1344,"location_id":"9","currency_id":133,"transaction_type":"sell","date":"2026-09-16","month":9,"year":2026,"active":1,"reversed":0,"reversible":1,"manual_entry":1,"created_at":"2026-09-16 11:13:27","updated_at":"2026-09-16 11:13:27","chart_of_account_id":27,"debit":6500.0,"credit":null}]} 
[2026-09-16 11:13:27] live.INFO: Inserted purchase sell mapping {"count":1,"data":[{"sell_line_id":1206,"purchase_line_id":1641,"quantity":10.0,"created_at":"2026-09-16 11:13:27","updated_at":"2026-09-16 11:13:27"}]} 
[2026-09-16 11:13:27] live.INFO: Inserted COGS → Inventory journal entries {"count":2} 
[2026-09-16 11:13:27] live.INFO: Inserted Retained Earnings (profit) entries {"count":1,"total_profit":900.0} 
[2026-09-16 11:13:27] live.INFO: ETIMS: Customer details retrieved {"transaction_id":1932,"contact_id":94,"customer_name":"Walk-In Customer","has_tin":false,"has_digitax_id":false} 
[2026-09-16 11:13:27] live.ERROR: ETIMS: Missing item_id for product {"product_id":402} 
[2026-09-16 11:13:27] live.ERROR: ETIMS: No valid items to submit after filtering  
[2026-09-16 11:13:27] live.WARNING: ETIMS WAIT: Timed out after 2 attempts for transaction ID: 1932  
[2026-09-16 11:13:42] live.INFO: filterProduct method called {"business_id":8,"search_term":"DRUM","location_id":"9","not_for_selling":"0","price_group_id":"0","product_types":[],"search_fields":["name","sku","lot"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:13:42] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:13:42] live.DEBUG: Filtering by not_for_selling {"not_for_selling":"0"} 
[2026-09-16 11:13:42] live.DEBUG: Joining purchase_lines for lot number search  
[2026-09-16 11:13:42] live.DEBUG: Applying search filters {"search_term":"DRUM","search_type":"like","search_fields":["name","sku","lot"]} 
[2026-09-16 11:13:42] live.DEBUG: LIKE search conditions applied {"fields":["name","sku","lot"]} 
[2026-09-16 11:13:42] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:13:42] live.DEBUG: Added lot number fields to select  
[2026-09-16 11:13:42] live.INFO: filterProduct completed successfully {"result_count":2,"business_id":8,"search_term":"DRUM"} 
[2026-09-16 11:13:44] live.INFO: Product Row Debug - RELOADED {"product_id":402,"product_name":"DRUM STICK 2","discount_allowed":false,"has_global_discount":false,"global_discount_type":"fixed","global_discount_amount":0,"discounts_count":0,"discounts":[],"base_price":650.0,"discounts_json":"[]","multiplier":1,"unit_prices":{"334":{"unit_id":334,"unit_name":"KG","unit_price":650.0,"multiplier":1,"has_price":true}},"has_price_group":false,"price_group_id":null} 
[2026-09-16 11:13:55] live.INFO: === About to call saveProductNewUnitRelationships === {"product_id":403,"request_units":[{"actual_name":"Packet","unit_id":"335","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"550"}],"page_batch_id":"20260916_111234_3095"} 
[2026-09-16 11:13:55] live.INFO: === saveProductNewUnitRelationships START === {"product_id":403,"product_name":"Nivea Men's Body Lotion/ Coolkick"} 
[2026-09-16 11:13:55] live.INFO: Units data received {"units_data":[{"actual_name":"Packet","unit_id":"335","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"550"}],"count":1} 
[2026-09-16 11:13:55] live.INFO: Processing unit index: 0 {"unit_data":{"actual_name":"Packet","unit_id":"335","short_name":"Pkt","relation_unit_id":null,"relation_qty":"1","price":"550"}} 
[2026-09-16 11:13:55] live.INFO: Unit found by ID {"unit_id":335,"actual_name":"Packet"} 
[2026-09-16 11:13:55] live.INFO: Unit lookup result {"found":"yes","unit_id":335,"method":"by_id"} 
[2026-09-16 11:13:55] live.INFO: Updating existing unit {"unit_id":335} 
[2026-09-16 11:13:55] live.INFO: Updated unit_price {"new_price":550.0} 
[2026-09-16 11:13:55] live.INFO: Unit updated successfully  
[2026-09-16 11:13:55] live.INFO: Setting as BASE unit {"unit_id":335} 
[2026-09-16 11:13:55] live.INFO: Base unit saved {"base_unit_id":335} 
[2026-09-16 11:13:55] live.INFO: First pass complete {"created_units_count":1,"base_unit_id":335} 
[2026-09-16 11:13:55] live.INFO: === SECOND PASS: Setting relations first ===  
[2026-09-16 11:13:55] live.INFO: === SECOND PASS: Calculating cumulative multipliers ===  
[2026-09-16 11:13:55] live.INFO: === saveProductNewUnitRelationships END ===  
[2026-09-16 11:13:55] live.INFO: OpeningStockController::add - Location Data {"product_id":"403","business_id":44,"locations":{"Illuminate\\Support\\Collection":{"40":"BEM LTD (BL0001)"}},"available_locations":[40]} 
[2026-09-16 11:13:55] live.INFO: OpeningStockController::add - Serial Numbers Check {"product_id":"403","business_id":44,"has_serial_numbers":{"40":false},"total_locations_with_serial":0} 
[2026-09-16 11:13:57] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:14:05] live.INFO: Offline not allowed - triggering cleanup {"user_id":363,"business_id":44} 
[2026-09-16 11:14:23] live.INFO: Credit Limit Check Started {"contact_id":"94","status":"final","final_total":"49400.00","is_credit_sale":"0","exclude_transaction_id":null} 
[2026-09-16 11:14:23] live.DEBUG: Payment Calculation {"final_total":49400.0,"curr_total_payment":49400.0,"is_credit_sale":false,"payment_count":1} 
[2026-09-16 11:14:23] live.INFO: Credit Limit Check Skipped - Fully Paid {"final_total":49400.0,"curr_total_payment":49400.0} 
[2026-09-16 11:14:23] live.INFO: mpesa_transaction_id value: NULL  
[2026-09-16 11:14:23] live.INFO: is_mpesa_sale value: true  
[2026-09-16 11:14:23] live.INFO: M-Pesa sale evaluation {"is_mpesa_sale_raw":true,"is_valid_mpesa_sale":false,"payment_method_input":"custom_pay_4","mpesa_transaction_id":null,"transaction_id":1934} 
[2026-09-16 11:14:23] live.INFO: Journal Entry Case: FULL CASH PAYMENT {"transaction_id":1934,"final_total":49400.0,"amount_paid":49400.0,"balance_due":0} 
[2026-09-16 11:14:23] live.INFO: Journal Entries Inserted Successfully {"transaction_id":1934,"entries":[{"transaction_id":1934,"created_by_id":21,"transaction_number":"TRX-6aaa4fdf491826.35192590","payment_detail_id":1345,"location_id":"9","currency_id":133,"transaction_type":"sell","date":"2026-09-16","month":9,"year":2026,"active":1,"reversed":0,"reversible":1,"manual_entry":1,"created_at":"2026-09-16 11:14:23","updated_at":"2026-09-16 11:14:23","chart_of_account_id":23,"debit":null,"credit":49400.0},{"transaction_id":1934,"created_by_id":21,"transaction_number":"TRX-6aaa4fdf491826.35192590","payment_detail_id":1345,"location_id":"9","currency_id":133,"transaction_type":"sell","date":"2026-09-16","month":9,"year":2026,"active":1,"reversed":0,"reversible":1,"manual_entry":1,"created_at":"2026-09-16 11:14:23","updated_at":"2026-09-16 11:14:23","chart_of_account_id":27,"debit":49400.0,"credit":null}]} 
[2026-09-16 11:14:23] live.INFO: Inserted purchase sell mapping {"count":1,"data":[{"sell_line_id":1207,"purchase_line_id":1641,"quantity":76.0,"created_at":"2026-09-16 11:14:23","updated_at":"2026-09-16 11:14:23"}]} 
[2026-09-16 11:14:23] live.INFO: Inserted COGS → Inventory journal entries {"count":2} 
[2026-09-16 11:14:23] live.INFO: Inserted Retained Earnings (profit) entries {"count":1,"total_profit":6840.0} 
[2026-09-16 11:14:23] live.INFO: ETIMS: Customer details retrieved {"transaction_id":1934,"contact_id":94,"customer_name":"Walk-In Customer","has_tin":false,"has_digitax_id":false} 
[2026-09-16 11:14:23] live.ERROR: ETIMS: Missing item_id for product {"product_id":402} 
[2026-09-16 11:14:23] live.ERROR: ETIMS: No valid items to submit after filtering  
[2026-09-16 11:14:23] live.WARNING: ETIMS WAIT: Timed out after 2 attempts for transaction ID: 1934  
[2026-09-16 11:15:05] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj method called {"business_id":8,"search_term":"DR","location_id":"9","not_for_selling":null,"price_group_id":null,"product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:15:57] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:15:57] live.DEBUG: Applying search filters {"search_term":"DR","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj completed successfully {"result_count":3,"business_id":8,"search_term":"DR"} 
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj method called {"business_id":8,"search_term":"DRU","location_id":"9","not_for_selling":null,"price_group_id":null,"product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:15:57] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:15:57] live.DEBUG: Applying search filters {"search_term":"DRU","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj completed successfully {"result_count":2,"business_id":8,"search_term":"DRU"} 
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj method called {"business_id":8,"search_term":"DRUM","location_id":"9","not_for_selling":null,"price_group_id":null,"product_types":[],"search_fields":["name","sku"],"check_qty":false,"search_type":"like"} 
[2026-09-16 11:15:57] live.DEBUG: Initial query built with joins {"has_location":true} 
[2026-09-16 11:15:57] live.DEBUG: Applying search filters {"search_term":"DRUM","search_type":"like","search_fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: LIKE search conditions applied {"fields":["name","sku"]} 
[2026-09-16 11:15:57] live.DEBUG: Applying location filter {"location_id":"9"} 
[2026-09-16 11:15:57] live.INFO: filterProductStockAdj completed successfully {"result_count":2,"business_id":8,"search_term":"DRUM"} 
[2026-09-16 11:17:22] live.INFO: Purchases array from request {"purchases":[{"product_id":"402","variation_id":"407","quantity":"100","product_unit_id":"334","sub_unit_id":"334","pp_without_discount":"560.00","discount_percent":"0.00","purchase_price":"560.00","purchase_line_tax_id":null,"item_tax":"0.00","purchase_price_inc_tax":"560.00","profit_percent":"16.07","default_sell_price":"650.00","lot_number":null,"mfg_date":null,"exp_date":null,"imei_numbers":"[]","imei_count":"0"}],"purchases_json":"[{\"product_id\":\"402\",\"variation_id\":\"407\",\"quantity\":\"100\",\"product_unit_id\":\"334\",\"sub_unit_id\":\"334\",\"pp_without_discount\":\"560.00\",\"discount_percent\":\"0.00\",\"purchase_price\":\"560.00\",\"purchase_line_tax_id\":null,\"item_tax\":\"0.00\",\"purchase_price_inc_tax\":\"560.00\",\"profit_percent\":\"16.07\",\"default_sell_price\":\"650.00\",\"lot_number\":null,\"mfg_date\":null,\"exp_date\":null,\"imei_numbers\":\"[]\",\"imei_count\":\"0\"}]"} 
[2026-09-16 11:17:22] live.WARNING: Digitax stock update skipped: Missing item_id for product_id 402  
[2026-09-16 11:17:22] live.INFO: Purchase lines created {"transaction_id":1936,"purchase_lines_count":1,"purchase_lines":[{"id":1643,"transaction_id":1936,"product_id":402,"variation_id":407,"quantity":100.0,"secondary_unit_quantity":"0.0000","pp_without_discount":"560.0000","discount_percent":"0.00","purchase_price":"560.0000","purchase_price_inc_tax":"560.0000","item_tax":"0.0000","tax_id":null,"purchase_requisition_line_id":null,"purchase_order_line_id":null,"quantity_sold":"0.0000","quantity_adjusted":"0.0000","quantity_returned":"0.0000","po_quantity_purchased":"0.0000","mfg_quantity_used":"0.0000","mfg_date":null,"exp_date":null,"lot_number":null,"sub_unit_id":null,"created_at":"2026-09-16T08:17:22.000000Z","updated_at":"2026-09-16T08:17:22.000000Z"}]} 
[2026-09-16 11:17:22] live.INFO: Processing purchase row - 0 {"row_index":0,"product_id":"402","variation_id":"407","quantity":"100","has_imei":true,"imei_raw":"[]","purchase_data_keys":["product_id","variation_id","quantity","product_unit_id","sub_unit_id","pp_without_discount","discount_percent","purchase_price","purchase_line_tax_id","item_tax","purchase_price_inc_tax","profit_percent","default_sell_price","lot_number","mfg_date","exp_date","imei_numbers","imei_count"]} 
[2026-09-16 11:17:22] live.INFO: IMEI Data - Parsed for row 0 {"row_index":0,"imei_count":0,"imei_data":[],"imei_json":"[]"} 
[2026-09-16 11:17:22] live.INFO: IMEI data is empty or invalid for row 0 {"imeiData":[]} 
[2026-09-16 11:17:22] live.INFO: M-Pesa sale evaluation {"is_mpesa_sale_raw":false,"is_valid_mpesa_sale":false,"payment_method_input":"cash","mpesa_transaction_id":null,"transaction_id":1936} 
[2026-09-16 11:17:22] live.INFO: Purchase created successfully with IMEI data {"transaction_id":1936,"ref_no":"PO2026/0196","final_total":56000.0} 
[2026-09-16 11:18:23] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:18:51] live.INFO: Stock updates received: [{"productName":"DRUM STICK 2","productSKU":"0402","stockCount":"98","difference":"2","type":"Decrease"}] 
[2026-09-16 11:18:51] live.INFO: Stock adjustment: DRUM STICK 2 - difference: 2, direction: reduce, quantity: 2  
[2026-09-16 11:18:51] live.INFO: Stock adjustment prepared for product: DRUM STICK 2, variation_id: 407, direction: reduce, quantity: 2, unit_price: 560.0000  
[2026-09-16 11:18:51] live.INFO: Updated variation_location_details for variation_id: 407, location_id: 9, new qty_available: 98  
[2026-09-16 11:18:51] live.INFO: Transaction created with ID: 1937 for ref_no: ST025, final_total: 1120  
[2026-09-16 11:18:51] live.INFO: Stock adjustment lines inserted: 1  
[2026-09-16 11:19:40] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:19:40] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 11:19:40] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 11:19:40] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:19:40] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"57191710.93840000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 11:19:40] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:19:40] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 11:19:40] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",8]} 
[2026-09-16 11:19:40] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:19:41] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:19:41] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 11:19:41] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 11:19:41] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"79732321.00000000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:19:41] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:19:41] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 11:19:41] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",8]} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150578521.00000000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:19:41] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:19:41] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:19:41] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129191789.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:19:41] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:19:41] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:19:41] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:19:42] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:19:42] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:19:42] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:19:42] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:19:42] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:19:42] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150569421.00000000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:19:42] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:19:42] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:19:42] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:19:42] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:19:42] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150578521.00000000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:26:02] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 11:26:02] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:26:02] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:26:02] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:26:02] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129191789.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:26:02] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":null} 
[2026-09-16 11:26:02] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:26:02] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:26:02] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:09] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 11:27:09] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 11:27:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"57191710.93840000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:09] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 11:27:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2025-12-31","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:09] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:09] live.INFO: Opening stock calculation - including all transactions {"date":"2025-12-31"} 
[2026-09-16 11:27:09] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2025-12-31')"} 
[2026-09-16 11:27:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2025-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2025-12-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"79732321.00000000","is_opening":true,"date":"2025-12-31"} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-12-31","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:09] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:09] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-12-31' (includes all types except purchase_order)"} 
[2026-09-16 11:27:09] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-12-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-12-31'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:09] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150578521.00000000","is_opening":false,"date":"2026-12-31"} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:13] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:27:13] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:27:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129191789.81040000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:13] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:27:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-15","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:13] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:13] live.INFO: Opening stock calculation - including all transactions {"date":"2026-09-15"} 
[2026-09-16 11:27:13] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-09-15')"} 
[2026-09-16 11:27:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-15') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-09-15'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150569421.00000000","is_opening":true,"date":"2026-09-15"} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-16","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:13] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:13] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-16' (includes all types except purchase_order)"} 
[2026-09-16 11:27:13] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-16') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-16'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:13] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150578521.00000000","is_opening":false,"date":"2026-09-16"} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-08-31","location_id":null,"is_opening":true,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:34] live.INFO: Opening stock calculation - including all transactions {"date":"2026-08-31"} 
[2026-09-16 11:27:34] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-08-31')"} 
[2026-09-16 11:27:34] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-08-31') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-08-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"128359462.95240000","is_opening":true,"date":"2026-08-31"} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-30","location_id":null,"is_opening":false,"by_sale_price":false,"filters":{"user_id":null},"permitted_locations":"all"} 
[2026-09-16 11:27:34] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-30' (includes all types except purchase_order)"} 
[2026-09-16 11:27:34] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-30') ) * (purchase_lines.purchase_price + 
                        COALESCE(purchase_lines.item_tax, 0))
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-30'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"129199629.81040000","is_opening":false,"date":"2026-09-30"} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-08-31","location_id":null,"is_opening":true,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:34] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:34] live.INFO: Opening stock calculation - including all transactions {"date":"2026-08-31"} 
[2026-09-16 11:27:34] live.INFO: Applied opening stock condition {"condition":"purchase.type = 'opening_stock' OR (purchase.type != 'opening_stock' AND date(transaction_date) <= '2026-08-31')"} 
[2026-09-16 11:27:34] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-08-31') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and (`purchase`.`type` = ? or (`purchase`.`type` != ? and date(transaction_date) <= '2026-08-31'))","bindings":["purchase_order",8,"opening_stock","opening_stock"]} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"149334970.00000000","is_opening":true,"date":"2026-08-31"} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock START === {"business_id":8,"date":"2026-09-30","location_id":null,"is_opening":false,"by_sale_price":true,"filters":"all","permitted_locations":null} 
[2026-09-16 11:27:34] live.DEBUG: Using sale price instead of purchase price {"price_query_part":"v.sell_price_inc_tax"} 
[2026-09-16 11:27:34] live.INFO: Applied closing stock condition {"condition":"date(transaction_date) <= '2026-09-30' (includes all types except purchase_order)"} 
[2026-09-16 11:27:34] live.DEBUG: Final SQL Query {"sql":"select SUM((purchase_lines.quantity - purchase_lines.quantity_returned - purchase_lines.quantity_adjusted -
                        (SELECT COALESCE(SUM(tspl.quantity - tspl.qty_returned), 0) FROM 
                        transaction_sell_lines_purchase_lines AS tspl
                        JOIN transaction_sell_lines as tsl ON 
                        tspl.sell_line_id=tsl.id 
                        JOIN transactions as sale ON 
                        tsl.transaction_id=sale.id 
                        WHERE tspl.purchase_line_id = purchase_lines.id AND 
                        date(sale.transaction_date) <= '2026-09-30') ) * v.sell_price_inc_tax
                    ) as stock from `purchase_lines` inner join `transactions` as `purchase` on `purchase_lines`.`transaction_id` = `purchase`.`id` left join `variations` as `v` on `v`.`id` = `purchase_lines`.`variation_id` left join `products` as `p` on `p`.`id` = `purchase_lines`.`product_id` where `purchase`.`type` != ? and `purchase`.`business_id` = ? and date(transaction_date) <= '2026-09-30'","bindings":["purchase_order",8]} 
[2026-09-16 11:27:34] live.INFO: === getOpeningClosingStock RESULT === {"calculated_stock":"150578521.00000000","is_opening":false,"date":"2026-09-30"} 
[2026-09-16 11:30:06] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:31:08] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:31:33] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:33:17] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:39:51] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:40:03] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:40:07] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:41:59] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 11:42:30] live.ERROR: Failed to send error alert email: Connection could not be established with host "ssl://mail.risetsystems.com:465": stream_socket_client(): Unable to connect to ssl://mail.risetsystems.com:465 (Connection timed out)  
[2026-09-16 11:44:10] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.". Authenticator "PLAIN" returned "Connection to "ssl://mail.risetsystems.com:465" timed out.".  
[2026-09-16 11:49:37] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:59:20] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
[2026-09-16 11:59:29] live.ERROR: Failed to send error alert email: Failed to authenticate on SMTP server with username "support@risetsystems.com" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Incorrect authentication data".".  
