Appearance
Scheduled jobs
This page records source declarations in axelites/menzzo-meduse at 5d3de6cb63b976aaeef739a8a7f288c4b46509ad. It is an inventory of code, not proof that a scheduler is installed or running. For the broader connector handoffs, see the Meduse workflow map.
Scheduler entry point and coverage
The application schedule is declared in app/Console/Kernel.php and in six module ScheduleServiceProvider classes. Each of those six modules is enabled in the checked-in modules_statuses.json; its module.json names the module provider, and that provider registers the schedule provider. This establishes the source registration path, not runtime provider state.
The scan found 38 non-commented command schedule declarations: 11 in the application kernel and 27 in module providers. Thirty-five are not gated by feature configuration (process-list guards still apply to many of them); three Spanish Merchant Center declarations are feature-configuration-gated. No active Schedule::job(...) declaration was found. Commented worker and schedule examples are excluded from the inventory.
config/app.php sets the application timezone to Europe/Paris. Schedule declarations without an event-level timezone use that configured timezone; the Spanish Merchant Center sync, verify, and cleanup entries explicitly use UTC. The checked-in config does not establish the host clock, deployed configuration, or whether the scheduler runner is installed.
The source comment names Laravel's runner schedule:run. The repository does not define an application command named schedule or show a host cron/service that invokes schedule:run. This page does not authorize running any listed command against production; production commands require approval for the exact command and target.
The ps xf checks below are source-level registration guards: when the checked process listing contains the command text, that provider does not add the schedule event. They are distinct from scheduler overlap locks and are not evidence that a task or worker is healthy.
Application kernel
All times below use Europe/Paris unless stated otherwise. ps xf means the event is conditionally registered from the current process listing.
| Command | Timing | Guard and scheduling controls | Handler and downstream work |
|---|---|---|---|
meduse:sync-after-magento-update | Every minute | ps xf check | Reads completed Menzzo export files from Logidav FTP, updates product connector metadata, moves processed files to Logidav's new-product finished area, then calls meduse:module:logidav:sync-product-to-logidav for changed product IDs. Handler: app/Console/Commands/SyncAfterMagentoUpdate.php. |
menzzo:fill:products-flat | Daily at 20:00 | ps xf check | Rebuilds/synchronizes the catalog_product_flat data and schema from catalog products and filterable attributes. Direct database work. Handler: app/Console/Commands/FillCatalogProductFlat.php. |
unlock:products | Daily at 23:00 | ps xf check | Clears locked_by in catalog_product and catalog_product_flat. Direct database update. Handler: app/Console/Commands/UnlockProducts.php. |
clean:old-files | Sundays at 23:00 | ps xf check | Deletes local connectors, modules, and tmp files, and Logidav FTP files older than seven days. FTP traversal skips meduse/connectors/menzzo/menu and meduse/connectors/logidav/export-asir-mappings. Handler: app/Console/Commands/CleanOldFiles.php. |
menzzo:retry-failed-files | Hourly | ps xf check | Moves files older than one hour from Menzzo FTP export/processing back to export/pending. This is file recovery, separate from Laravel's failed-job store. Handler: app/Console/Commands/MoveFailedProcessingFilesToPendingFtpDirectory.php. |
logidav:import-missing-merchant-center-data | Daily at 00:30 | ps xf check | Reads merchant-center-data.jsonl from Logidav FTP and updates matching connector resource records across tenants. Handler: app/Console/Commands/ImportMissingMerchantCenterData.php. |
logidav:import-product-data-to-connector-ressource-data --mosaikasa-shipping-only | Every five minutes | withoutOverlapping() | Reads Logidav connector JSONL and merges shipping amounts into Mosaikasa ConnectorResourceData. Direct FTP/database work; it does not dispatch a Laravel job. Handler: app/Console/Commands/ImportAllProductsDataToConnectorRessourceDataTable.php. |
google:refresh-access-tokens | Every 30 minutes | ps xf check | Uses the stored Google refresh token, requests a new access token, and saves the returned token values through GoogleAccess. Handler: Modules/MerchantCenter/Console/RefreshGoogleAccessTokens.php. |
google:refresh-mosaikasa-es-token | Minutes 25 and 55 of each hour, UTC | withoutOverlapping(); appends output to storage/logs/scheduled_tasks.log | Refreshes the Spanish Merchant Center token. The command also takes a five-minute file-cache lock and saves the new token through GoogleAccessSpanish. Handler: Modules/MerchantCenter/Console/RefreshSpanishGoogleTokenCommand.php. |
shopify:run-scheduled-bulk-operations | Every five minutes | ps xf, withoutOverlapping(), onOneServer(), runInBackground() | Reads the oldest QUEUED row from Mosaikasa's shopify_bulk_operations, stages its JSONL file, submits the Shopify bulk mutation, and updates the operation row. This is a custom database worklist, not a Laravel queue worker. Handler: Modules/Mosaikasa/Console/Commands/RunScheduledBulkOperationsCommand.php. |
shopify:check-bulk-operations | Every ten minutes | ps xf, withoutOverlapping(), onOneServer(), runInBackground() | Polls Shopify for CREATED/RUNNING operations and writes status to shopify_bulk_operations; on completion it records the result URL and removes the local JSONL file, and on failure it stores the error code. Handler: Modules/Mosaikasa/Console/Commands/CheckBulkOperationsCommand.php. |
Module schedules
Module entries use the same Europe/Paris timezone unless explicitly marked UTC. The provider guards and controls are listed once per module; they apply to each row in that module's table.
Ameubleo
Each entry checks one ps xf snapshot taken when the provider boots, then uses withoutOverlapping(60), onOneServer(), and runInBackground().
| Command | Timing | Handler and downstream work |
|---|---|---|
meduse:module:ameubleo:export-catalog-feed | Minute 0 every six hours | AmeubleoFeedExporter writes the public-disk catalog JSONL feed; default path feeds/ameubleo/catalog.jsonl. |
meduse:module:ameubleo:export-menu-feed | Minute 15 every six hours | AmeubleoMenuFeedExporter writes the public-disk menu JSONL feed; default path feeds/ameubleo/menu.jsonl. |
meduse:module:ameubleo:export-attributes-feed | Minute 30 every six hours | AmeubleoAttributesFeedExporter writes the public-disk attributes JSONL feed; default path feeds/ameubleo/attributes.jsonl. |
The defaults are configurable through the module config/environment; the effective deployed paths and tenant are not established here.
Logidav
Each entry checks ps xf. These declarations do not add scheduler withoutOverlapping() locks.
| Command | Timing | Handler and downstream work |
|---|---|---|
meduse:module:logidav:generate-sync-jobs | Every minute | Scans Logidav FTP new-product/pending, copies a file locally, moves it to FTP processing, then pushes ProcessNewProduct to process-new-product; see the new-product handoff. |
meduse:module:logidav:sync-product-from-logidav | Every minute | Reads product-update CSVs from Logidav FTP, applies catalog product attribute changes, moves files to complete/failed, and pushes Menzzo ExportProducts to export. |
meduse:module:logidav:sync-product-to-logidav | Every minute | Builds and sends product export files to Logidav FTP for the selected/all products. This is an inline command handler, not a Laravel queue consumer. |
meduse:module:logidav:sync-stock-from-logidav | Every 30 minutes | Reads export-stock CSVs, replaces the central availability tracking data, and emits AvailabilityUpdateDetected. The Mosaikasa listener dispatches Menzzo's ProcessAvailabilityUpdateJob to the connection's default queue; see queue flow and the stock workflow. |
meduse:module:logidav:sync-price-from-logidav | Every five minutes | Reads Logidav price exports, updates Menzzo/MeublePromo/Mosaikasa product raw values, deletes processed FTP input files, and records tracked-job output. |
meduse:module:logidav:sync-qty-from-logidav | Minute 0 every six hours | Reads Logidav quantity CSVs and updates catalog_product.qty; row/file failures are logged and written into the FTP CSV error column where possible. |
shopify:manage-product-status | Every four hours | Calls Mosaikasa ShopifyService to generate status JSONL and submit a Shopify bulk status mutation, or records it in the custom bulk worklist when another mutation is running. This command is also scheduled by Mosaikasa. |
MeublePromo and Menzzo
These providers check ps xf; no scheduler overlap lock is declared.
| Module | Command | Timing | Handler and downstream work |
|---|---|---|---|
| MeublePromo | meublepromo:products-export | Every minute | Calls the MeublePromo ExportProducts job with dispatchSync(), so this scheduled invocation runs its handler inline. |
| Menzzo | menzzo:products-export | Every minute | Calls the Menzzo ExportProducts job with dispatchSync(), so this scheduled invocation runs its handler inline. |
| Menzzo | menzzo:vimeo:sync-product-stories | Daily | Calls VimeoService::sync() to fetch Vimeo data and update the product_stories attribute. |
Mosaikasa
Each entry checks ps xf; no scheduler overlap lock is declared by this provider.
| Command | Timing | Handler and downstream work |
|---|---|---|
shopify:update-all-products-price | Daily at 00:30 | ShopifyService builds price JSONL, uploads it to Shopify, and records the bulk operation or adds a QUEUED row to shopify_bulk_operations if a mutation is already running. |
shopify:check-bulk-operations | Every five minutes | Polls the Shopify bulk-operation status and updates shopify_bulk_operations. It is also scheduled by the application kernel every ten minutes with additional controls. |
shopify:manage-product-status | Every four hours | Builds status JSONL and submits a Shopify bulk status operation or records a QUEUED row. It is also scheduled by Logidav every four hours. |
shopify:manage-product-stock | Every four hours | Updates Shopify inventory quantities through inventory mutations. Its optional quantity-tracking bulk operation is not enabled by this schedule because no option is passed. |
mosaikasa:update-availability-with-bulk-operation | Every two hours | Builds availability JSONL and submits a Shopify bulk metafield mutation, recording a deferred operation when another bulk mutation is active. |
shopify:sync-products-from-shopify | Daily | Fetches Shopify product/variant data and updates matching Shopify connector resource URLs in Meduse. |
mosaikasa:tag-collections-with-active-products | Daily | Reads Shopify collection product status and updates catalog_category.has_active_product for categories and ancestors. |
mosaikasa:sync-product-availability | Daily | Compares tenant products with central availability data, then runs Menzzo's ProcessAvailabilityUpdateJob with dispatchSync(), applying Meduse catalog updates inline. This command does not enqueue Mosaikasa's UpdateAvailabilityJob. |
Merchant Center
All entries use withoutOverlapping() and append output to storage/logs/scheduled_tasks.log. These schedules have no ps xf process-list guard. The effective feature flags are deployment configuration and were not read.
| Command | Timing | Gate | Handler and downstream work |
|---|---|---|---|
merchant-center:google-shopping-products --setMerchantId=5064260817 | Daily | Always declared | Sends MeublePromo merchant product data through the Merchant Center command/service path. |
merchant-center:google-shopping-products --setMerchantId=5532935661 | Daily | Always declared | Sends Mosaikasa merchant product data through the Merchant Center command/service path. |
merchant-center:sync-mosaikasa-es --no-url-check | 06:00 UTC daily | merchantcenter.mosaikasa_es_enabled; config default is false | Builds Spanish Mosaikasa product inputs and uploads batches through MerchantApiService. The command enforces its source/shipping readiness checks unless configured to bypass shipping verification. |
merchant-center:verify-mosaikasa-es | 08:00 UTC daily | merchantcenter.mosaikasa_es_enabled; config default is false | Reads Spanish Merchant Center products back, compares mapped fields/issues, and records a clean full-readback marker only on a clean full run. |
merchant-center:cleanup-mosaikasa-es --apply | 09:00 UTC daily | merchantcenter.mosaikasa_es_cleanup_enabled; config default is false | Deletes stale Spanish product inputs only after its full-upload, matching clean-readback, source, language/feed, and catalog checks pass. |
merchant-center:check-disabled-products --merchantId=5532935661 | Daily | Always declared | Checks remote Mosaikasa Merchant Center products against Meduse state, records a local CSV, and can remove remote entries that are disabled in Meduse. |
The two feature flags come from MERCHANT_ES_SYNC_ENABLED and MERCHANT_ES_CLEANUP_ENABLED. No .env file or deployed flag value was inspected.
Consequential source findings
shopify:check-bulk-operationsis declared twice: every five minutes in Mosaikasa and every ten minutes in the application kernel. The kernel entry adds overlap/one-server/background controls; the module entry only has its process-list registration check.shopify:manage-product-statusis declared in both Logidav and Mosaikasa, each every four hours with a process-list registration check and no scheduler overlap lock.- The kernel's seven
queue:workexamples and theMerchantLabelsscheduled-job line are comments, not active schedule entries. The Logidav queued command-job example is also commented. - The source includes file deletion, catalog writes, Merchant Center updates/deletions, and Shopify mutations. These are handler behaviors, not evidence that any schedule has run or that production inputs are safe.
Evidence gaps
The source review does not establish the host cron/service that invokes schedule:run, the runtime set of booted providers, deployed feature flags, queue workers, current remote state, or the outcome of any FTP/API/database operation. Review deployment and owner acceptance separately before treating any entry as operationally active.