ws_vatcheck — planned improvements
adapted from a comparison against the "vatchecker" module (Inform-All & Keraweb), 2026-09-11
cache TTL (1 year) explicitly kept as-is, not on this list.

[ ] 1. Configurable VIES-offline fallback policy
    - Add a setting (e.g. VATCHECK_OFFLINE_MODE) with explicit modes instead of an
      implicit fail-closed default:
        - always mark invalid (current implicit behavior)
        - always mark valid
        - reuse last cached result, fall back to invalid if none
        - reuse last cached result, fall back to valid if none
    - Directly related to the GR/EL bug fixed this session: the fallback behavior
      should be an explicit, chosen policy, not an accidental side effect of
      whether an exception happens to get caught.

[ ] 2. Log every VIES check failure
    - Currently EuValidatorAdapter::checkAndStore() has no logging at all on
      failure (this silence was a big part of why the GR/EL bug took so long to
      diagnose). Add PrestaShopLogger::addLog(...) (or equivalent) whenever the
      Europa/Validator call throws, including the VAT number, country code, and
      the fault message.

[ ] 3. Company-name cross-check against VIES response
    - When VIES returns a company name for a validated VAT number, optionally
      compare it (normalized: lowercase, strip punctuation/legal-entity suffixes
      like bv/gmbh/ltd/nv/sa) against the address's company field. Make this
      togglable, since not all member states return a name.

[ ] 4. Configurable EU country allow-list
    - Replace hardcoded VatNumber::$euIso-driven behavior with an admin-configurable
      list of which EU countries are allowed to order VAT-free, similar to
      vatchecker's VATCHECKER_EU_COUNTRIES setting.

[ ] 5. Per-product VAT exclusion
    - Some products (e.g. certain digital services) may need to always charge VAT
      regardless of customer VAT-exempt status. Add a product-level flag/table
      (mirroring vatchecker_excluded_products) and consult it before applying the
      0% tax manager for a given product line.

[ ] 6. GB -> XI (Northern Ireland) mapping
    - VatNumber::$euIso has no entry at all for the UK/Northern Ireland. If this
      shop (or any future ws_vatcheck deployment) ships to Northern Ireland with an
      XI-prefixed VAT number, it will hit the same class of key/value bug already
      fixed for Greece. Add the mapping and cover it with the same key-based checks.

[ ] 7. Front-end AJAX live VAT validation
    - Add an AJAX front controller + JS so the address form validates the VAT
      number as the customer types, instead of only on form submit
      (hookActionValidateCustomerAddressForm). Mirrors vatchecker's ajax.php +
      front.js/front.css pattern. Improves UX and surfaces bad VAT numbers earlier.

[ ] 8. Configurable address-priority strategy
    - Add a setting for which address's VAT number is authoritative when invoice
      and delivery addresses differ (shipping only / invoice only / prioritize
      invoice / prioritize shipping), instead of relying on implicit PS tax-address
      resolution. Mirrors vatchecker's VATCHECKER_ADDRESS_SELECT.

Explicitly deferred / not adopting:
- Shortening the 1-year cache TTL (Config::CACHE_VALIDITY) — decided to leave as-is.
- Class overrides (Carrier/Product) as used by vatchecker — do not port this pattern;
  it conflicts with other modules that override the same core classes and is fragile
  across PS core upgrades. If shipping/product tax rule assignment ever needs
  behavior beyond what the taxManager hook covers, investigate a hook-based solution
  first before reaching for an override.
- Legacy $this->l() / translations/{iso}.php system — ws_vatcheck already uses
  $this->trans() correctly per house convention for PS >= 1.7.6.0.
