Helps diagnose whether the product cap is from EAN filtering or a downstream limit.
health and refresh now return: product_count, rows_processed, rows_skipped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
openpyxl in read_only mode stops iterating at the sheet's cached <dimension ref>
attribute in the XML. If MTZ extended the Excel beyond the original row range,
those rows were silently ignored (hence always ~4000 products regardless of the
real count). Removing read_only=True forces openpyxl to read all actual data rows.
The file is already in BytesIO so there is no I/O penalty.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>