Skip to content

Partners and Lengow Product Feeds ​

This page explains why the Menzzo Partners exports and Magento Lengow files can contain different products and values. They read related catalog data, but they are separate generators with different selection contracts, storage, schedules and field sources. Equal product counts are therefore not guaranteed by the current code.

The technical behavior below was checked against the pinned source revisions. Whether every difference is an intended business rule still requires confirmation from the catalog owners. The English feed is excluded from the operational comparison because the team does not use it; Magento still includes store ID 13 in the generator's configured store loop.

Data flow and ownership ​

View diagram source
flowchart LR
  L[(Logidav mirror tables)] --> PG[menzzo-partners General generators]
  PG --> PC[general*.cache]
  PC --> PE[partners.menzzo.fr endpoints]

  M[(Magento catalog and stock)] --> LG[Axelites Lengow LaunchExport]
  LT[(lengow_flux_export_products)] --> LG
  LG --> LF[pub/media/lengow/store-code/lengow_feed.csv]

  PE --> C[Diagnostic comparison by product ID]
  LF --> C

Diagram

The Partners side reads mz_product and mz_product_info from its configured Logidav database and serves cached files. The Lengow side selects products directly from Magento for each store, reads Magento stock and scoped attributes, and writes the public files below pub/media/lengow/.

Endpoints in the active comparison ​

MarketPartners sourceLocalized row used by PartnersLengow file
FRhttps://partners.menzzo.fr/?feed=generalmz_product_info.store_id = 3https://www.menzzo.fr/media/lengow/french/lengow_feed.csv
DEhttps://partners.menzzo.fr/?feed=general_demz_product_info.store_id = 2https://www.menzzo.fr/media/lengow/de/lengow_feed.csv
IThttps://partners.menzzo.fr/?feed=general_itmz_product_info.store_id = 14https://www.menzzo.fr/media/lengow/it/lengow_feed.csv

Always compare each Lengow market with its corresponding Partners endpoint. Comparing DE or IT with feed=general uses the French Partners selection and produces a misleading result.

The URLs above are production outputs, not health-check commands. Inspecting them requires the normal production-access approval for the exact request and target.

Generation lifecycle ​

Partners ​

index.php routes feed=general, feed=general_de and feed=general_it to the matching cache-delivery scripts. The General, GeneralDe and GeneralIt classes create a temporary semicolon-separated file and replace the corresponding cache only when the temporary file is larger than 44,945 bytes. The HTTP layer reads that cache, emits pipe-separated rows and converts the response to ISO-8859-1.

The reviewed repository establishes the cache builders and delivery path. It does not establish the deployed scheduler or the age of the cache currently served. A fresh HTTP response can therefore still contain data from an earlier cache generation.

Magento Lengow ​

The Magento cron job axelites_launch_lengow_export runs at 0 */4 * * * in the declared configuration. LaunchExport processes store IDs 3, 14, 2 and 13, builds a temporary UTF-8 file with pipe-separated quoted fields, then renames it to:

text
pub/media/lengow/<store-code>/lengow_feed.csv

The French store code is rewritten from fr to french. The rename prevents readers from seeing a partially written normal file. A per-product Throwable is printed and the loop continues, so one bad product can be omitted without failing the complete export. Runtime logs are required to prove that no row-level exception occurred.

The four-hour declaration proves the source schedule only. It does not prove that the deployed cron is enabled, that the job completed, or when the public file was last replaced.

Product eligibility rules ​

Partners selection ​

All three Partners generators require:

  • mz_product.is_active = 1;
  • visibility in 2, 4, 5 or 6;
  • a non-null source_id;
  • a non-empty product EAN;
  • is_new = 0;
  • the market-specific mz_product_info row shown in the endpoint table;
  • a strictly positive localized price before the row is written.

Additional market differences are part of the current implementation:

RuleFR GeneralDE GeneralDeIT GeneralIt
Extra localized joinsRequires store 9 and store 8 rowsNoneRequires store 9 and store 8 rows
DropshipEmpty or AsirGroupEmpty or AsirGroupEmpty only
Hard-coded SKU/EAN exclusionsYesYesNo equivalent lists in the reviewed query
Positive shipping rate requiredNoYesYes
STOCK_DESCRIPRaw mz_product.qtyEmptyEmpty
Derived qty_stock columnPresentAbsentPresent

A localized mz_product_info row does not prove that Magento assigned the product to the matching website/store. This is the largest structural difference from the Lengow selection.

Magento Lengow selection ​

For each configured store, LaunchExport::getProducts():

  • sets the current Magento store and calls addStoreFilter();
  • accepts only simple, configurable and bundle products;
  • requires a non-empty EAN;
  • requires visibility in 2, 4, 5 or 6;
  • excludes label = bipolart;
  • requires store-scoped status = 1 for the normal export;
  • applies the hard-coded EAN exclusion list and a hard-coded SKU exclusion list in the row loop.

The dropship rule then rejects any non-empty drop_ship value, with two exact exceptions on the French store only:

  • asr893ran5409
  • asr893ran5415

For DE and IT, every product with a non-empty drop_ship value is skipped. For DE, the completed row is also rejected when configured customer-facing fields contain a known French residue pattern.

The normal Magento collection does not apply the Partners source_id or is_new = 0 requirements. It also does not remove a selected row merely because getProductPrice() returns an empty value for a nonpositive price. These reverse differences can produce a small number of products found only in Lengow.

Why product counts differ ​

Use set differences, not the net count, when diagnosing a market:

text
partners_only = Partners IDs - Lengow IDs
lengow_only   = Lengow IDs - Partners IDs
common        = Partners IDs intersect Lengow IDs

The durable causes are:

DirectionCode-level causes to check first
Partners onlyMissing Magento website/store assignment; disabled store-scoped Magento status; unsupported Magento product type; label = bipolart; dropship rejection; German row validation; row-level exception during export.
Lengow onlyPartners source_id missing; is_new != 0; missing required Partners localized joins; nonpositive Partners price or shipping rate; Magento removal row retained temporarily.

For DE and IT, a large Partners-only set is expected when localized Logidav rows exist for products that are not assigned to the corresponding Magento store. For FR, the broader Partners AsirGroup allowance is an additional recurring cause.

The hard-coded lists are not identical across all markets: FR and DE Partners apply SKU/EAN lists comparable to Magento's lists, while the reviewed IT Partners query does not. Inspect the pinned source before treating those lists as a shared contract.

Field semantics ​

Rows with the same product ID can still have different values because the generators read different stores and persistence layers.

FieldPartners source and ruleMagento Lengow source and ruleDiagnostic consequence
IDmz_product_info.feed_idancien_id when present, otherwise Magento entity IDA comparison must record which identifier contract is being used.
SKUmz_product.skuancien_sku when present, otherwise current Magento SKUThe same ID can legitimately expose different SKU strings under current code. Business intent remains to be confirmed.
PRICELocalized mz_product_info.priceStore-scoped Magento product priceDifferences can reflect store scope or synchronization lag between Magento and the Logidav mirror.
PRICE_PROMOLocalized special_price when price, start and end are non-empty and the end date is not before todayMagento special price when price is positive, both dates parse, start is not after end, and today is inside the inclusive rangePartners can expose a future promotion before its start date; Lengow does not.
PROMO_FROM, PROMO_TORaw localized values when the Partners promotion check passesRaw Magento scoped dates when the stricter Lengow check passesThe generator does not itself prove timezone or upstream synchronization equivalence. Compare full timestamps and source scopes.
AVAILABILITYComputed from mz_product.availabilityComputed from Magento disponibilite, unless a removal row forces -1Both normal paths convert a future YYYYMMDD date to day difference minus one, return 0 for today/past, and default to 60 for other values. Different source values can still yield different results.
STOCK_DESCRIPFR uses raw mz_product.qty; DE/IT leave it emptyMagento stock registry quantity for the product and current store, formatted to four decimalsThis field is not sourced from the same stock read. A zero in Lengow and a positive Partners value requires stock-scope and synchronization diagnosis.
qty_stockFR/IT cap stock at 15 and force zero unless available = En_StockNo equivalent documented output ruleDo not compare qty_stock with Lengow STOCK_DESCRIP as if they were the same contract.
shipping_rateLocalized shipping_amount, with coefficient fallback; DE/IT skip nonpositive resultsStore data shipping_amount, with coefficient fallbackStore data and fallback inputs must be compared separately.

The Partners promotion check does not verify that the start date has arrived or that the start date precedes the end date. Lengow performs both checks. This is a direct code reason for a populated Partners promotion becoming blank in Lengow.

Removal lifecycle in Lengow ​

lengow_flux_export_products tracks products written during the normal Magento export. Each successful normal row refreshes its updated_at value. After the normal selection:

  1. tracking records older than three days are deleted;
  2. remaining records not refreshed today are selected;
  3. those products are appended through the disabled-status path with AVAILABILITY = -1;
  4. after the three-day retention window, the tracking record and removal row disappear.

Consequently, a product can be present only in Lengow even though it no longer passes the normal selection. Treat AVAILABILITY = -1 as a removal notification, not as an active publication row.

Reconciliation procedure ​

  1. Record the retrieval time, response status, content length and any cache/file timestamp available for both sources.
  2. Use the market-specific Partners endpoint. Do not use FR general as the baseline for DE or IT.
  3. Parse rows by ID; also retain SKU because Magento can emit ancien_sku.
  4. Remove the header, then report total IDs, duplicate IDs, common IDs, Partners-only IDs and Lengow-only IDs.
  5. For each Partners-only product, check Magento store assignment first, followed by scoped status, type, label, dropship, blocklists and DE validation.
  6. For each Lengow-only product, check AVAILABILITY = -1, then Partners source_id, is_new, required localized joins, price and shipping rate.
  7. For value differences, compare the exact source fields in the field-semantics table. Do not infer a bug from CSV values without checking store scope and generation time.
  8. Review the Magento export output for per-product exceptions before declaring the exported set complete.
  9. Re-run the comparison only after both files have been regenerated from the intended source state. A successful HTTP download alone does not prove freshness.

Business rules awaiting confirmation ​

The source proves what the applications currently do. Seif and Marouen still need to confirm whether the following behavior is the intended contract:

  • Magento website/store assignment is mandatory for channel publication.
  • All dropship products are excluded outside FR, with only the two named FR exceptions.
  • bipolart and non-simple/configurable/bundle products must remain excluded.
  • Partners should exclude is_new != 0 while Lengow does not.
  • FR and IT should require the additional store 8 and 9 Logidav rows.
  • IT intentionally omits the hard-coded SKU/EAN exclusion lists used by FR, DE and Magento.
  • Removed products should remain for up to three days with AVAILABILITY = -1.
  • The Partners promotion rule may expose a promotion before its start date.
  • ancien_id and ancien_sku are the intended identifiers in Lengow.

Until the owners confirm these points, change requests should distinguish a code discrepancy from an intentional publication policy.

Source locations ​

ComponentRepository path
Partners HTTP routingmenzzo-partners/index.php
Partners FR generatormenzzo-partners/src/Cron/General.php
Partners DE generatormenzzo-partners/src/Cron/GeneralDe.php
Partners IT generatormenzzo-partners/src/Cron/GeneralIt.php
Magento selection and row generationmenzzo/app/code/Axelites/Lengow/Cron/LaunchExport.php
Magento export tracking and retentionmenzzo/app/code/Axelites/Lengow/Helper/Lengow.php
Magento declared schedulemenzzo/app/code/Axelites/Lengow/etc/crontab.xml

The existing Lengow integration page covers order import and shipment/status feedback. Those inbound order flows are separate from the product-file generation described here.

Internal developer documentation for Menzzo systems.