Skip to content

Conversation

@joshheald
Copy link
Contributor

Description

Many iPads don’t have a cellular connection. It’s a little confusing to show the cellular toggle when it doesn’t apply.

Unfortunately, there’s no good (undeprecated) API for checking this. I’ve used an approach of listing the network interfaces and looking for the cellular one, but it’s undocumented and might not always work.

OTOH, this isn’t a critical feature, so we can keep an eye on it.

Test Steps

Launch the app on a non-cellular iPad
Open POS > Settings > Local catalog
Observe that the cellular toggle isn't shown

Repeat with a cellular iPad, or a phone after commenting out this code in POSTabVisibilityChecker

        guard userInterfaceIdiom == .pad else {
            return false
        }

  • I have considered if this change warrants user-facing release notes and have added them to RELEASE-NOTES.txt if necessary.

Many iPads don’t have a cellular connection. It’s a little confusing to show the cellular toggle when it doesn’t apply.

Unfortunately, there’s no good (undeprecated) API for checking this. I’ve used an approach of listing the network interfaces and looking for the cellular one, but it’s undocumented and might not always work.

OTOH, this isn’t a critical feature, so we can keep an eye on it.
@joshheald joshheald added this to the 23.8 milestone Nov 27, 2025
@joshheald joshheald added type: task An internally driven task. feature: POS labels Nov 27, 2025
@dangermattic
Copy link
Collaborator

dangermattic commented Nov 27, 2025

2 Warnings
⚠️ View files have been modified, but no screenshot or video is included in the pull request. Consider adding some for clarity.
⚠️ This PR is assigned to the milestone 23.8. This milestone is due in less than 2 days.
Please make sure to get it merged by then or assign it to a milestone with a later deadline.

Generated by 🚫 Danger

@joshheald joshheald marked this pull request as ready for review November 27, 2025 11:29
@wpmobilebot
Copy link
Collaborator

App Icon📲 You can test the changes from this Pull Request in WooCommerce iOS Prototype by scanning the QR code below to install the corresponding build.

App NameWooCommerce iOS Prototype
Build Numberpr16412-ae39eea
Version23.7
Bundle IDcom.automattic.alpha.woocommerce
Commitae39eea
Installation URL4rjl5moqvdrdo
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

@iamgabrielma iamgabrielma self-assigned this Nov 28, 2025
Copy link
Contributor

@iamgabrielma iamgabrielma left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! I did not see the button in iPad, but I was unable to test on an iPhone after removing the .pad constraint. It's unrelated to this PR so I'll approve to unblock it.

For the issue I saw, it seems to have a problem with GRDB sync not finding statusKey, and I saw the error on screen that I cannot sync and to retry. The only thing I've changed on my end is the MARKETING_VERSION = 23.8;, then attempted to run in a iPhone 16 Plus, iOS 18.3 in landscape due to the unsupported screen width case.

🔵 Tracked pos_splash_screen_retry_tapped, properties: [store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, blog_id: -1, plan: ]
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 13 and pages_to_free 6
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
🔵 Tracked pos_local_catalog_downloading_screen_shown, properties: [was_ecommerce_trial: false, site_url: https://indiemelon.mystagingwebsite.com, blog_id: -1, plan: , is_wpcom_store: false, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [sync_type: full, error_code: 1, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, error_domain: GRDB.DatabaseError, error_type: database_error]
🔵 Tracked pos_splash_screen_error_shown, properties: [plan: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, is_wpcom_store: false, blog_id: -1, site_url: https://indiemelon.mystagingwebsite.com, was_ecommerce_trial: false]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"

After this, on a second run, these are the logs:

CoreData: annotation: Core Data multi-threading assertions enabled.
👀 Push Notifications are not supported in the Simulator!
Zendesk Enabled: true
⚠️ No processor found for AccountAction!
⚠️ No processor found for AccountAction!
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
📜 Resumed encrypted log upload queue due to app entering foreground
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 9 and pages_to_free 1
-[WCSession onqueue_handleUpdateSessionState:]_block_invoke dropping as pairingIDs no longer match. pairingID (null), client pairingID: (null)
🔵 Tracked dashboard_loaded, properties: [store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
WCSession is not paired
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <UITableView: 0x10888aa00; frame = (0 44; 414 818); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x600000d39e00>; backgroundColor = <UIDynamicProviderColor: 0x60000031ea20; provider = <__NSMallocBlock__: 0x600000d2c360>>; layer = <CALayer: 0x600000314a60>; contentOffset: {0, 0}; contentSize: {414, 80}; adjustedContentInset: {0, 0, 0, 0}; dataSource: <_TtGC5UIKit29UITableViewDiffableDataSourceSSCSo17NSManagedObjectID_: 0x6000000131d0>>
It was not possible to sync local orders settings: noOrdersSettings
Failed to send CA Event for app launch measurements for ca_event_type: 0 event_name: com.apple.app_launch_measurement.FirstFramePresentationMetric
🔵 Tracked app_feedback_prompt, properties: [action: shown, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
⚠️ Cannot check WC version on default store — default siteID is nil or 0.
checkAppleIDCredentialState: No Apple ID found.
🔵 Tracked application_opened, properties: [widgets: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Blaze: Store not eligible for Blaze. Don't schedule local notification.
🔵 Tracked dynamic_dashboard_card_data_loading_started, properties: [type: store_setup, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Class CKBrowserSwitcherViewController overrides the -traitCollection getter, which is not supported. If you're trying to override traits, you must use the appropriate API.
📣 Announcements synced, but nothing received.
📣 There are no announcements to show!
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
⛔️ Failed to sync add-on groups for siteID: -1. Error: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
🎛 Site settings sync completed for siteID -1
already in progress or activated
AX Safe category class 'SLHighlightDisambiguationPillViewAccessibility' was not found!
🔵 Tracked dynamic_dashboard_card_data_loading_completed, properties: [was_ecommerce_trial: false, plan: , is_wpcom_store: false, blog_id: -1, site_url: https://indiemelon.mystagingwebsite.com, type: store_setup, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Message: Tag aztec.htmltag.rootnode invalid
🔵 Tracked watch_syncing_failed, properties: [error_description: WooCommerce.WatchDependenciesSynchronizer.SyncError.watchSessionInactiveOrNotPaired, watch_app_installed: false, error_domain: WooCommerce.WatchDependenciesSynchronizer.SyncError, blog_id: -1, session_active: true, session_paired: false, is_wpcom_store: false, plan: , site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, error_code: 0, was_ecommerce_trial: false]
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Failed to send CA Event for app launch measurements for ca_event_type: 1 event_name: com.apple.app_launch_measurement.ExtendedLaunchMetrics
🟢 Successfully synced system information
🟢 Loaded Store UUID: Optional("c5bd46cc-1804-4f7b-badb-bb98c449127f")
🔵 Tracked pos_tab_visibility_checked, properties: [is_visible: true, blog_id: -1, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, plan: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
🔵 Tracked pos_tab_visibility_checked, properties: [blog_id: -1, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, is_visible: true, plan: ]
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
📋 POSLocalCatalogEligibilityService: WooCommerce version 10.3.4 meets minimum requirement for site -1
📋 POSLocalCatalogEligibilityService: WooCommerce version 10.3.4 meets minimum requirement for site -1
📋 POSLocalCatalogEligibilityService: Site -1 catalog size 191 is within limit 1000
🔄 ForegroundPOSCatalogSyncDispatcher: Starting foreground sync dispatcher for site -1
⏱️ ForegroundPOSCatalogSyncDispatcher: Starting timer (interval: 3600s
🔄 ForegroundPOSCatalogSyncDispatcher: Starting sync for site -1
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
📋 POSLocalCatalogEligibilityService: Site -1 catalog size 191 is within limit 1000
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [error_code: 1, error_type: database_error, error_domain: GRDB.DatabaseError, sync_type: full, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
⛔️ ForegroundPOSCatalogSyncDispatcher: Sync failed for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
*** A Tracks logging delegate has not been configured, so Tracks will log to the console. If you would like to redirect logging to an existing logging system, assign a logging delegate to TracksLogging.delegate. (You may need to import AutomatticTracksModel, depending on what else you have imported.)
Tracks <V>: TracksService sendQueuedEvents completed. Sent 11 events.

I was able to load POS momentarily, but then stopped showing the products, neither the Local Catalog option does not appear in settings. Logs:

CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 8 and pages_to_free 1
🔵 Tracked main_tab_pos_selected, properties: [is_wpcom_store: false, plan: , site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, was_ecommerce_trial: false, blog_id: -1]
no such column: statusKey in "SELECT COUNT(*) FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?))"
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [connection_type: wifi, sync_type: full]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
Update NavigationRequestObserver tried to update multiple times per frame.
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: No full sync performed yet for site -1, skipping incremental sync
🔵 Tracked pos_local_catalog_sync_skipped, properties: [reason: no_full_sync, sync_type: incremental]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
⛔️ POSCatalogSyncCoordinator: Error loading site -1 for full sync date: CancellationError()
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [error_type: database_error, error_domain: GRDB.DatabaseError, sync_type: full, error_code: 1, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
Tracks <V>: TracksService sendQueuedEvents completed. Sent 4 events.
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [sync_type: full, error_type: database_error, error_code: 1, error_domain: GRDB.DatabaseError, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"

@joshheald
Copy link
Contributor Author

table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

This is the problem – you've got a previous version of the app installed, which didn't have the statusKey in its schema, but we no longer auto-delete the schema on conflicts. You'd need to delete and reinstall the app to make it work now, as I didn't write a migration to add the statusKey to that table.

This is fine, because we've never allowed the GRDB code to run on production builds, so real users won't run in to this problem.

I tested it fine though, so thanks for the review!

@joshheald joshheald merged commit 4823242 into trunk Nov 28, 2025
23 checks passed
@joshheald joshheald deleted the woomob-1764-local-catalog-hide-cellular-toggle-on-non-cellular-ipads branch November 28, 2025 12:04
@iamgabrielma
Copy link
Contributor

This is the problem – you've got a previous version of the app installed, which didn't have the statusKey in its schema, but we no longer auto-delete the schema on conflicts. You'd need to delete and reinstall the app to make it work now, as I didn't write a migration to add the statusKey to that table.

Ahhh perfect, thanks for clarifying.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature: POS type: task An internally driven task.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants