Changelog

Release history and version notes

v4.120.20 July 3, 2026

Privacy: OTP diagnostic email no longer carries the code or full number

  • When an SMS OTP fails to send, the internal diagnostic email to the operator no longer includes the one-time code or the full phone number (the number is now masked and the code is removed/redacted). The report still carries the configuration and error details needed to diagnose delivery issues. The recipient address is also now configurable via an environment variable.

v4.120.19 July 3, 2026

Admin: single fail-closed authentication gate

  • The admin panel now enforces authentication through one gate covering every admin route, in addition to the existing per-route checks, so an admin tool cannot be reachable without a valid admin login even if a future route omits its own check. Added an automated test that keeps this guarantee in place. Internal change; no effect on any customer-facing page.

v4.120.18 July 3, 2026

Admin: input-validation hardening

  • Added stricter server-side validation on admin tools — the Translation Center save endpoint now accepts only known content fields and approved languages, and the image-delete endpoint now confirms the target resolves to an approved image directory. Internal admin change; no effect on any customer-facing page.

v4.120.17 July 3, 2026

Hardening: structured-data output encoding

  • Hardened the output encoding of structured-data (schema.org JSON-LD) blocks on product, series, article, and FAQ pages so embedded content is always safely escaped. No visible change to any page.

v4.120.16 July 3, 2026

Admin: access-control hardening on email tools

  • Tightened access control so the email campaign, template, and opt-out management tools consistently require an authenticated admin session, in line with the rest of the admin panel. No change for visitors or to any customer-facing page.

v4.120.15 July 2, 2026

About: GEPID added to Official Registrations

  • Added a GEPID card (Government of India tendering portal registration, NCACEPS07068516) to the Official Registrations section on the About page, alongside the existing GeM and IREPS entries. The label is available in all site languages.

v4.120.14 July 1, 2026

SEO: Bing Webmaster Tools site verification

  • Added the BingSiteAuth.xml verification file at the site root so the site can be claimed and verified in Bing Webmaster Tools (served from the public directory, alongside robots.txt). No change to any page or behaviour for visitors.

v4.120.13 July 1, 2026

Feedback: pull PO Number from the invoice, not just the quote

  • Fixed missing PO Number values on the customer portal’s Feedback page. The feedback reminder process previously read the purchase-order number only from an invoice’s linked quotation, so invoices without a linked quote (or whose quote had no PO recorded) showed a blank PO Number. It now reads the PO Number and PO Date from the invoice itself first, falling back to the linked quote only for anything still missing. Existing affected rows can be corrected with a one-time backfill.

v4.120.12 June 30, 2026

Quote requests: auto-mark “Quoted” when Zoho sends the quote

  • Added a secured webhook so that when the sales team emails a quotation from Zoho CRM, the matching website enquiry on the Quote Requests page is automatically moved to “Quoted” (matched by customer email). This keeps the admin list in step with Zoho and avoids already-quoted leads still showing under “Needs attention.” Requires a one-time Zoho workflow setup.

v4.120.11 June 30, 2026

Admin: chat-config endpoint hit counter

  • The Visitor Activity page now shows a rolling 24-hour hit counter for the chat widget’s configuration endpoint (total, bots, humans, and rate-limited requests), to help gauge crawler load on it. Counts are kept in the cache layer and reset themselves on a rolling window; a manual reset is also available.

v4.120.10 June 30, 2026

Admin: delete quote requests and portal RFQs

  • Admins can now permanently delete a website enquiry or a portal RFQ from its detail page (useful for clearing test records). Deleting also removes the associated line items and, for RFQs, the uploaded attachment files. A confirmation step is required, and where a portal RFQ has a Zoho CRM copy the prompt reminds you to remove that in Zoho separately.

v4.120.9 June 30, 2026

Rate limit on the chat widget config endpoint

  • The chat widget’s configuration endpoint is now rate limited per visitor (in line with the other public API endpoints), adding a guard against a single source hammering it. The endpoint is not part of page content, so a throttled request simply means the chat widget does not appear for that visitor for a moment, with no effect on the page itself.

v4.120.8 June 30, 2026

Chat widget config served from cache

  • The chat widget’s configuration endpoint, which is requested on every page view, now reads its settings from the shared cache instead of querying the database on each call. This removes a per-request database round-trip on a high-traffic public endpoint (notably under crawler load) with no change to behaviour for visitors.

v4.120.7 June 29, 2026

Portal navigation: reordered account tabs, added Feedback, renamed RFQs

  • The account navigation strip is now ordered Dashboard, RFQs, Quotations, Invoices, Warranty Claims, Feedback, My Account. A Feedback tab was added to the strip, and “My RFQs” was renamed to “RFQs” (all languages).

v4.120.6 June 29, 2026

Dashboard: Recent tables capped at 5 rows

  • The Recent Quotations, Recent Invoices, and Recent Warranty Claims tables on the portal dashboard now show at most the 5 most recent rows each, keeping the dashboard compact. Use the “View all” links for the full lists.

v4.120.5 June 29, 2026

Invoice detail: Material Shipment & Payment Information side by side

  • On the invoice detail page, the Material Shipment and Payment Information sections now sit side by side at half width each on desktop (stacking on smaller screens), making the page more compact and easier to scan.

v4.120.4 June 29, 2026

Portal tables: show all rows, hide draft invoices, alternate-row shading

  • Fixed: portal and admin tables were silently capping at 10 rows when their built-in pager was turned off, hiding the rest with no way to reach them. They now show every row. This also fixes the customer portal showing only part of a longer list (e.g. 24 of 44 quotations across paged results).
  • Invoices: invoices still in the “Created” stage are no longer shown anywhere in the customer portal (list, dashboard counts, warranty invoice picker) and can’t be opened by direct link.
  • Polish: table rows now have subtle alternate-row shading for easier scanning, across the customer portal and admin.

v4.120.3 June 29, 2026

Security: vulnerability disclosure contact (security.txt)

  • Added a standards-compliant /.well-known/security.txt (RFC 9116) so security researchers have a clear, machine-readable way to report vulnerabilities. No change to any visible page or customer-facing flow.

v4.120.2 June 28, 2026

Admin: impersonation activity records which team member

  • When a team member views the portal as a customer (impersonation), the admin activity log now records which admin performed each action and shows it as “IMPERSONATED by …”. Internal audit improvement — no change to the customer experience.

v4.120.1 June 27, 2026

Portal tables: search results announced to screen readers

  • When you filter a portal list (Quotations, Invoices, Warranty Claims, Quote Requests, Feedback) using the table search box, the number of matching rows is now announced to screen-reader users. Purely an assistive-technology improvement — nothing visible changes.

v4.120.0 June 27, 2026

Portal accessibility pass across all customer pages

  • Screen-reader and keyboard improvements throughout the customer portal: data tables now expose their column headers correctly, every form field has a programmatic label, and decorative icons and separators are hidden from assistive technology so they aren’t read aloud.
  • The document and photo upload areas on the warranty form are now fully keyboard-operable (Tab to focus, Enter or Space to open the file picker), and dynamic areas — the RFQ product search, attachment lists, and inline-edit status — announce their updates politely to screen readers.
  • All changes are additive and behind-the-scenes: nothing about the visible layout or wording changes.

v4.119.5 June 27, 2026

Portal dashboard: all-time Total Quotations & Total Invoices cards

  • The first two dashboard cards now show your all-time totals (relabelled “Total Quotations” / “Total Invoices”, with “Last 180 days” changed to “All time”), drawn from the cached account stats. The “Recent” lists below still show the last 180 days.

v4.119.4 June 27, 2026

Portal: account switcher shows the full company name

  • The multi-company switcher no longer shortens the company name with an ellipsis — the full name is shown, in a regular (non-bold) weight.

v4.119.3 June 27, 2026

Portal: copy tidy-ups

  • Removed the internal “Zoho CRM” wording from all customer-facing portal messages — the empty-state texts for quotations and invoices, and the account-page descriptions — across every language, and shortened the all-time order-rate label to “Order Rate” on both the dashboard card and the account page.

v4.119.2 June 27, 2026

Portal: clearer multi-company account switcher

  • For clients linked to more than one company, the account switcher in the portal header is now a clearly tappable pill with a company-count badge, so it’s obvious you can switch between your companies — previously only a small chevron hinted at it.

v4.119.1 June 27, 2026

Portal fix: table pagination no longer strands you on the last page

  • On the last page of Quotations / Invoices / Warranty Claims the whole pager — including “Prev” — disappeared, leaving no way back. The pager now appears whenever there is a previous or next page, and an out-of-range or invalid ?page= value is clamped to a valid page.

v4.119.0 June 27, 2026

Portal dashboard: a Performance card with business & order-rate metrics

  • The dashboard’s fourth card now shows your Total Business and current-FY business (invoiced value) alongside all-time and FY order rate (quotes converted to orders), instead of repeating the company name.
  • These figures are cached (~10 min) and shared with the account page’s Business Summary, so the dashboard stays fast.

v4.118.3 June 27, 2026

Portal polish: align the impersonation banner and account tabs to the page grid

  • The impersonation banner and the account tab strip now line up with the site navigation and page content (centered to the same width) instead of stretching edge-to-edge.

v4.118.2 June 27, 2026

Portal fix: impersonation banner placement (follow-up)

  • The admin “viewing as customer” banner now reliably sits just below the site navigation. The previous fix had pushed it behind the nav; the portal content is now offset with padding so the banner, the account tabs, and the page all clear the fixed header.

v4.118.1 June 27, 2026

Portal fix: impersonation banner no longer overlaps the site navigation

  • The admin “viewing as customer” banner is no longer pinned to the top of the screen, so it sits below the main navigation and scrolls with the page instead of covering the logo and menu.

v4.118.0 June 27, 2026

Customer portal now lives inside the main site

  • One consistent experience — logging in no longer drops you into a separate back-office layout. The portal now wears the same header, footer, navigation, type and design as the rest of the website; the old left sidebar, top bar and clock are gone.
  • Account tab strip — Dashboard, Quotes, Invoices, RFQs, Warranty and My Account sit in a clean tab bar under the main navigation; the company switcher (for multi-account users) moves to the right of it.
  • Shared preferences — language and text-size/font settings now use the site-wide preferences panel, so there is one place to change them everywhere. Feedback moved into the “My Account” menu.
  • No change to portal features, data, or the public site’s appearance.

v4.117.1 June 27, 2026

Accessibility: colour contrast, image alt text, and heading order (mobile audit fixes)

  • Contrast — the gold and blue accents used for small labels, the “Find Part”/“Search” buttons, and inline links now use slightly deeper ink shades so every one clears the WCAG AA 4.5:1 threshold; the decorative brand colours (borders, backgrounds, headings) are unchanged.
  • Skip-to-content link — recoloured to the darker navy so it passes contrast when focused.
  • Images — the product hover-preview thumbnail now carries explicit (empty) alt, so it is correctly treated as decorative.
  • Heading order — footer column titles dropped from <h4> to <h3> so the page heading levels descend without skipping.

v4.117.0 June 27, 2026

Public site accessibility: screen-reader and keyboard support (no visual change)

  • Sitewide structure — a “Skip to content” link, a single <main> landmark, and a labelled primary navigation on every page, so keyboard and screen-reader users can bypass the masthead.
  • Forms, images, tables — programmatic labels on contact/service/register/feedback/search forms, meaningful alt text on product and storefront images, table headers, lang tags on Hindi text, and hidden decorative icons.
  • Interactive components — the language picker and Site Preferences panel are now proper dialogs (focus trap + Escape + focus return); the part-number search announces results as you type (combobox/listbox); nav menus expose their open/closed state.
  • All changes are additive attributes/markup — the storefront looks exactly the same.

v4.116.2 June 27, 2026

Admin: even row-action buttons on Customers (Portal)

  • In the Customers list, the per-row action buttons were mismatched — Stats/Sync/Login-as were one size while Resend/Suspend/Reactivate were hand-styled slightly different. All six now share the same size, so each row’s buttons line up.

v4.116.1 June 27, 2026

Admin: uniform Products header buttons

  • The four action buttons in the Products header (Sync OEM Status, Sync CRM Images, Bulk Manager, + Add Product) were mismatched heights and wrapped to two lines; they’re now a single consistent size and stay on one line. Audited the other admin pages’ header toolbars too — they were already consistent, so no other changes were needed.

v4.116.0 June 27, 2026

Admin accessibility (phase 2, behavioral): keyboard + screen-reader support for modals and click-only controls

  • Modals (Stock edit/log, Forecast adjust/snapshot, Display Settings, Image Picker, Create PO, and ~13 more) are now announced as dialogs, trap keyboard focus while open, close on Escape, and return focus to whatever opened them — via one shared helper (/js/admin-modal-a11y.js), so no modal grew its own focus code.
  • Click-only controls — sortable headers, drill-down/inline-edit table cells, collapsible toggles, and the visitor-path triggers — are now reachable by Tab and operable with Enter/Space.
  • This completes the accessibility program (phase 1 → mechanical phase 2 → behavioral). Keyboard behaviour should be confirmed in-browser on staging.

v4.115.2 June 27, 2026

Admin accessibility (phase 2, wave 2): the remaining views

  • Completed the mechanical screen-reader/keyboard pass on the 19 views the earlier run had to skip — Stock, the Supply & Promise pages, Forecast-adjacent screens, Series, Warehouses, Zoho Sync, Translations, Quote Requests, and more now get the same table scope, associated form labels, named icon buttons, lang="hi" tagging, and ordered headings as the rest of the panel.

v4.115.1 June 27, 2026

Admin: compact pagination, and accessibility follow-ups

  • Compact pagination — list pages that used to dump every page button (Visitor Sessions showed 231) now use one shared windowed control: « first · ‹ prev · 1 … 6 7 8 9 10 … 231 · next › · last ». Applied to Sessions, Visitors, Email Log, Feedback, Equipment, and Portal Activity.
  • Fixed aria-current markers that were being HTML-escaped in the previous accessibility update, so the active page, tab, and filter are now correctly announced to screen readers across the sidebar and list views.

v4.115.0 June 27, 2026

Admin accessibility (phase 2, wave 1): screen-reader and keyboard improvements across the panel

  • Across most admin pages: data-table headers now carry scope, form fields are programmatically labelled, icon-only buttons and links have accessible names (decorative glyphs hidden), Hindi text is tagged lang="hi", headings descend in order, and tabs/filters/nav expose their state to assistive tech — including aria-controls on the sidebar, which clears every page at once.
  • Attribute-level changes only, no visual change. Modal focus-management and full keyboard operation of click-only cells are the next, separate pass.

v4.114.1 June 26, 2026

Fix: broken /products/…/null catalogue links no longer generated

  • A product whose SKU was the literal text “null” (from a bad import row) produced a broken catalogue link like /products/delco-remy/null that 404’d (and was being crawled). The canonical-URL helper now treats “null”/“undefined”/blank SKUs as missing and falls back to the product slug, on product pages and in the sitemap. The importer and the no-SKU cleanup script now also reject those values.

v4.114.0 June 26, 2026

Admin accessibility: bigger type, keyboard focus, and screen-reader landmarks (phase 1)

  • Bigger, more readable text across every admin page — the baseline type size is lifted to a comfortable level (table rows, sub-lines, badges, and buttons all scale up together), with the A-/A+ control still adjusting on top.
  • Visible keyboard focus — every link, button, field, nav item, and pagination control now shows a clear focus ring when you navigate with the keyboard.
  • Screen-reader navigation — added a “Skip to content” link, a <main> landmark, and a labelled navigation region.
  • Larger tap targets for small buttons, nav items, and pagination. Customer-facing pages are unchanged.

v4.113.2 June 26, 2026

404 digest email: list the actual IP addresses per path

  • The daily bot/scanner 404 digest’s “IPs” column now lists every distinct IP address that hit each path, instead of just showing a count — so you can see exactly which addresses are probing a URL. The summary line still shows the total unique-IP count.

v4.113.1 June 26, 2026

Admin: secondary text no longer looks like a clickable link

  • Muted helper text in the admin panel — timestamps, sub-lines, captions, and section labels — was drawn in a blue-grey almost identical to the link colour, making static data look clickable. It’s now a neutral grey, so genuine links and action buttons are the only blue, clickable elements on the page. Customer-facing pages are unchanged.

v4.113.0 June 26, 2026

Fix: website RFQ leads now reach Zoho CRM even with long addresses

  • New-visitor Requirements-form leads were silently failing to create in Zoho when the billing/delivery address exceeded Zoho's 100-character Street limit — the lead was lost while the on-site request and staff email still went through
  • Address Street fields are now capped to Zoho's limit, with the complete address preserved in the lead's Description (nothing lost)
  • CRM sync failures are now recorded on the quote and shown as a "CRM sync failed" badge on the admin quotation page, so they're no longer invisible
  • Added a recovery tool to re-create the leads that were previously lost

v4.112.0 June 26, 2026

Admin · Traffic Summary: charts, click-through to records, and a readability pass

  • Added a Human vs Bot donut and proportional bars on the bot origin / most-hit-page lists, and fixed the count columns that were being clipped on the right edge.
  • Click any number or breakdown row to open a modal: counts and breakdowns (a source, country, landing page, bot origin…) list the actual sessions behind them; the derived metrics explain how they’re computed.
  • Larger, more readable type across the page, and the modal is centered on screen. The record-filtering logic is covered by unit tests.

v4.111.0 June 26, 2026

Admin · Traffic Summary: trends, CSV export, and a look behind the bot wall

  • The headline tiles now show a change vs the previous equal period (▲/▼ on Sessions, Human and Repeat humans), so the page can finally answer “is interest growing?” rather than just “how much this week?”.
  • New Export CSV button downloads the human sessions for the selected range (referrer, source, country, landing page, depth) for deeper analysis.
  • New “Bot / no-JS — where it’s coming from” panel surfaces the top origin countries and most-hit pages behind the automated traffic, so catalogue scraping is visible instead of an opaque wall.
  • Top countries and landing pages now show their real denominator (e.g. “18 of 47 located”) and flag tiny samples as “who showed up, not a ranking”. Admin tables also stay readable on phones.

v4.110.0 June 26, 2026

Admin · Traffic Summary: AI referral channel + clearer small-sample reporting

  • Visits sent from AI assistants (ChatGPT, Perplexity, Claude, Copilot and the like) now show as their own AI source in “Coming from”, instead of being lumped under “Referral”.
  • When a date range has only a handful of human sessions, the dashboard shows a small-sample notice so the source, country and landing breakdowns are read as directional rather than precise.
  • “Repeat humans” now shows its denominator (e.g. 2 of 45), and the human/bot accent colours were corrected to the brand palette.

v4.109.0 June 26, 2026

Articles: three-zone reading layout with a persistent quote rail

  • On wide screens, article pages now use the empty side margins: an “In this article” table of contents on the left (it follows your scroll) and a sticky quote rail on the right with Request a Quotation and a tap-to-call sales number.
  • The layout adapts down to laptops and phones — the contents become a toggle and the quote actions become a slim sticky bar — and the reading column itself is unchanged.
  • Adds a mid-article Request a quote prompt after the comparison table. Content and the article body are untouched; the table of contents is generated automatically from the article’s headings.

v4.108.1 June 25, 2026

Fix: missing-article page returned a server error

  • Visiting an article URL that doesn’t exist now shows the branded 404 page instead of a 500 Server Error. The not-found response was missing a value the page header needs, which crashed the error page itself.

v4.108.0 June 24, 2026

Catalog: results-per-page is now configurable

  • Configuration » Catalog (Products) Search now has Results per page — when searching and — when browsing fields (defaults 20 and 24), so the /products page size can be tuned without code changes.
  • Additive schema — catsearch_per_page_search / catsearch_per_page_browse columns on settings, applied on npm run migrate:safe.

v4.107.2 June 24, 2026

Header account menu: restore the bordered pill

  • Fixed the account button losing its bottom border and side padding after it became a dropdown — the reused menu-trigger style was overriding the pill. The full bordered pill is back, turning brown on hover.

v4.107.1 June 24, 2026

Header account menu, portal Catalog link & admin settings search

  • Account menu — a logged-in customer’s name now shows as title + surname (e.g. “Mr. Lohkare”) instead of just the salutation, and opens a dropdown with Portal and Log Out.
  • Portal — the Browse Catalog link moved to the top of the sidebar so it’s visible without scrolling.
  • Admin » Configuration — a search box that filters the sections by title, description and individual setting names, so you can quickly find where a setting lives.

v4.107.0 June 24, 2026

Setting: hide prices from logged-in customers in homepage search

  • New toggle under Configuration » Part Number Finder“Display — show prices to logged-in customers” — controls whether approved/logged-in customers see unit prices in the homepage Part Number Finder and Search by Vehicle/Equipment results. Ships off (prices hidden for logged-in customers); check it to show them again. Anonymous visitors are unchanged — they still follow the existing “Display — show prices” toggle.
  • Additive schema — a search_show_prices_loggedin column on settings, applied on npm run migrate:safe.

v4.106.4 June 24, 2026

Admin nav: auto-expand on Visitor Activity / Sessions / Traffic

  • Opening Visitor Activity, Visitor Sessions or Traffic Summary now expands the System » Logs group in the left nav and highlights the active page, instead of leaving the whole section collapsed. (Those three links were added to the Logs menu but had been left out of its auto-open rule.)

v4.106.3 June 24, 2026

Product page: Technical Specifications above the image on mobile

  • On phones and tablets, the Technical Specifications (together with the Brand / Country-of-Origin card) now appear above the product image instead of after all the page content at the bottom. Desktop’s two-column layout is unchanged.

v4.106.2 June 24, 2026

"Likely bot" flag on Visitor Sessions too

  • The 🤖 likely bot badge (no JavaScript and/or datacenter ISP) now also appears on each row of the Visitor Sessions report, matching Visitor Activity.

v4.106.1 June 24, 2026

Visitor Activity: "likely bot" flag

  • Each row now shows a 🤖 likely bot badge when the visit ran no JavaScript (no screen size recorded) and/or came from a datacenter / hosting ISP — so you can spot automated traffic without filtering. Hover for the reason. It's a heuristic (a determined bot can run JS), not a verdict.

v4.106.0 June 24, 2026

New: Traffic Summary (human vs bot + where visitors come from)

  • Logs » Traffic Summary — a one-glance overview for a chosen range (24h / 7d / 30d / all): sessions split into Human (ran JS / has a screen size) vs Bot / no-JS, with a side-by-side engagement table (bounce rate, avg pages/session, avg length) that usually makes clear the "everyone bounces" traffic is automated, not an SEO problem.
  • Coming from — human sessions by Direct / Search / Social / Referral / Internal, plus top referring domains; and top countries + top landing pages.
  • Read-only, no schema change. (Search keywords aren't carried in referrers anymore — that data lives in Google Search Console.)

v4.105.0 June 24, 2026

New: Visitor Sessions report (repeat-visitor analytics)

  • Logs » Visitor Sessions — page views are now grouped into sessions (a new session after 30 minutes idle), one row per session, newest first: pages, length, entry/exit, system, resolution, location, ISP/IP, and the referrer it came from.
  • Repeat-visitor signal — each row shows that visitor's Total Sessions count (highlighted when more than one); click through to their full history, now segmented session-by-session.
  • Filters (sticky for your login session): repeat-only, minimum pages / session length, labelled IPs, incoming source (referrer), plus the usual country / IP / date.
  • Additive schema — a session_id column + indexes on visitor_views; existing rows are back-filled on npm run migrate:safe.

v4.104.0 June 24, 2026

Visitor Activity: screen-size filter, clickable pages, sticky filters

  • "With screen size" filter — a checkbox to show only visits that reported a screen resolution (i.e. real JS browsers), hiding most non-JS bot/scraper noise.
  • Clickable Page / Referrer — both open in a new tab; only http(s)/relative URLs are linkified (a non-http referer renders as plain text, never a live link).
  • Sticky filters — all active filters (date range, country, IP, the checkboxes) now persist across navigations, pagination and reloads for the rest of your login session, until you click Clear.

v4.103.3 June 23, 2026

Fix: screen-size beacon was blocked by CSRF (403)

  • Root cause: the global CSRF middleware 403-ed the token-less POST /api/vt beacon, so screen resolution never reached the server. (Confirmed via the browser console: POST /api/vt 403 Forbidden.)
  • Fix: /api/vt is now on the CSRF exempt list, alongside the other same-origin/no-session endpoints. Safe — the beacon only writes the caller's own screen size to their own visitor row.

v4.103.2 June 23, 2026

Visitor analytics: screen-size beacon fix + automatic stray-row cleanup

  • Screen resolution fix: the /api/vt beacon endpoint now parses its body regardless of content-type. A navigator.sendBeacon payload could arrive with a content-type the global JSON parser skipped, leaving the body empty so no screen size was stored.
  • Cleanup: migrate:safe now automatically removes any admin/portal rows logged before the v4.103.1 path-exclusion fix (idempotent — a no-op once corrected).

v4.103.1 June 23, 2026

Fix: visitor analytics was logging admin/portal page views

  • Root cause: the public-page check read req.path, but inside the mounted /admin and /portal routers Express strips the mount prefix from the URL — and because those handlers end the response without calling next(), the value was still stripped when logging ran on response finish. So /admin/visitors looked like /visitors and slipped past the exclusion.
  • Fix: the exclusion now uses req.originalUrl (never mount-stripped), so admin and portal page views are correctly ignored. Existing stray admin/portal rows can be pruned with a one-off query.

v4.103.0 June 23, 2026

Visitor analytics: ISP / network names (ipinfo.io)

  • New: Visitor Activity can now show each IP's ISP / network (e.g. "Reliance Jio Infocomm Limited"), resolved via ipinfo.io and cached per IP (ip_geo_cache) so lookups stay tiny.
  • Double-gated for privacy (this sends IPs to a third party): off until you both add an ipinfo_token under Encrypted API keys and enable "Resolve ISP via ipinfo.io" in Configuration » Visitor Analytics. Private/bogon IPs are never sent.
  • Resolution runs in a background job (every ~5 min, rate-paced); the admin views read from the cache, so there's no added latency.
  • Additive schema only — run npm run migrate:safe and restart. Disclose the ipinfo.io lookup in your Privacy Policy.

v4.102.0 June 23, 2026

Visitor analytics: ignore-this-computer, IPv4/IPv6, screen resolution & device

  • Ignore visits from this computer: a button on Visitor Activity sets a per-browser blocking cookie (nitc_notrack) so your own visits aren't logged. Plus an IP / prefix exclusion list (e.g. 103.25.) to ignore a whole office network.
  • IPv4 & IPv6: each IP is badged by version; a visitor's detail shows a Networks panel listing their IPv4 and IPv6 addresses where seen.
  • Screen resolution: a tiny first-party beacon now reports screen size, viewport and pixel ratio (this can't be read server-side); shown per visitor.
  • Device: device type (Desktop/Mobile/Tablet) plus best-effort model from the user-agent (often hidden by modern browsers).
  • Additive schema only — run npm run migrate:safe and restart. Note: the beacon collects screen/device info — keep the Privacy Policy current.

v4.101.0 June 23, 2026

Built-in visitor analytics — first-party "Page View Activity" (replaces StatCounter)

  • New: a self-hosted visitor log under Logs » Visitor Activity — every public page view with location (city/region/country via the bundled GeoLite2 DB), browser/OS, referrer and time. No third-party service, no subscription.
  • Repeat-visitor recognition via a first-party cookie, plus manual IP labels (e.g. "key account") that tag every view from that IP, and a per-visitor path view showing how they traversed the site.
  • Configurable under Configuration » Visitor Analytics: enable/disable, retention (default 180 days, auto-pruned daily), and whether to log bots. Capture is server-side and runs after the response, so it adds no page latency.
  • Supersedes the OpenReplay session-replay tracker — set Configuration » Session replay to off once verified.
  • Privacy: stores visitor IPs, geo and paths (personal data); update the Privacy Policy page accordingly. Additive schema only — run npm run migrate:safe and restart.

v4.100.0 June 23, 2026

Configurable catalog (Products) search + 20 results per search page

  • New: which fields the /products catalog search matches is now admin-configurable under System » Configuration » Catalog (Products) Search — on/off toggles for SKU, Series, Product name, Short description, Application & equipment (CRM fields), Technical info, and Cross-references. All default on, so existing behaviour is unchanged until you tune it. Live on the next search; no restart.
  • Search-result pages now show 20 per page; category browsing and the full catalog stay at 24.
  • Independent from the homepage Part Number Finder — the two searches are tuned separately.
  • Additive schema only — run npm run migrate:safe and restart.

v4.99.0 June 23, 2026

Configurable Part Number Finder — tune the search from Settings

  • New: the homepage Part Number Finder is now tunable live from System » Configuration » Part Number Finder, with no restart. A Search mode picks a preset — sku_only, current (the original behaviour, unchanged by default), everything, or custom.
  • Custom mode exposes per-field toggles (SKU, OEM, Old Part Number, Competitor, Product name, Series, Brand, Vehicle/equipment applications), a global match strictness (contains / starts-with / exact), and optional number normalization that ignores dashes, spaces and dots on SKU, cross-references and series — so 0-001-510-025 matches 0001510025.
  • Minimum characters, maximum results and the type-ahead delay are settings too, applied in every mode.
  • The part-finder display toggles (matched-via labels, cross-references, prices) moved from the Homepage section into the new Part Number Finder section, and the “show cross-references” option now renders correctly.
  • Additive schema only — run npm run migrate:safe and restart.

v4.98.4 June 13, 2026

Fix: reliable Indic translation of long article bodies (structured outputs)

  • Root cause: the translator asked the model to hand-write a JSON array, which failed two ways on long Indic article bodies — the model occasionally wrapped the JSON in prose (e.g. a self-correction note) or emitted invalid JSON (an unescaped quote inside long HTML), and both broke parsing so the field was left untranslated.
  • Fix: the Anthropic request now uses structured outputs (a constrained JSON schema), so the reply is guaranteed to be a valid translations array with no surrounding prose. The per-call timeout was also raised to accommodate long bodies under load.
  • No schema or deployment steps beyond deploying and restarting; re-run Admin → Translations generate for any languages with remaining missing article bodies.

v4.98.3 June 13, 2026

Fix: translation progress no longer falsely reports “Job not found”

  • Root cause: a bulk-translate job ran detached in one Passenger worker while its in-memory progress was invisible to other workers, so the status poll often landed on a worker that had never seen the job and reported “Job not found — may have completed” even for jobs that were running fine and completing successfully.
  • Fix: job progress now lives in a translation_jobs table, so any worker answers the status poll correctly — the progress bar and final counts are accurate across worker switches and restarts. Progress writes are throttled and finished jobs are pruned automatically.
  • Additive schema only — run npm run migrate:safe and restart to create the table.

v4.98.2 June 13, 2026

Fix: long article & page bodies now translate fully

  • Root cause: the auto-translator never split a single oversized field, so long article/page bodies (7,000–17,000+ characters) were sent in one API call and their translated output overflowed the token limit — the reply was truncated, parsing failed, and the field was stored as untranslated. Short fields (titles, excerpts) were unaffected, which is why only the longest article bodies showed blank across every Indic language.
  • Fix: oversized fields are now split into budget-sized parts on line boundaries, translated as separate units, and reassembled losslessly. Partial failures leave the field untranslated rather than storing a half-translated body.
  • Re-run translation for the affected article bodies to backfill the missing Indic translations.

v4.98.1 June 13, 2026

Translation cost tracking fix & audit diagnostics

  • Accurate cost tracking: translation cost estimates now use actual token counts (input & output) from the Anthropic API response instead of character-based guesses. Dashboard and configuration history updated accordingly.
  • Audit clarity: the Translation Audit “Overall” summary now shows a static/DB breakdown when translations are missing, making it easier to identify the source.
  • Generate diagnostics: added per-table diagnostic logging to the translation generate flow to help trace skipped-field issues.

v4.98.0 June 13, 2026

Translation API usage monitoring

  • Dashboard card: the admin dashboard now shows a Translation API summary — characters used, request count, cap utilisation percentage, and estimated cost for the current month, with a colour-coded progress bar (green / amber / red).
  • Configuration section: a new Translation section in Admin → Configuration shows connection status, up to 12 months of usage history with per-month cost estimates, cached-translation count, and the monthly character cap (editable).

v4.97.0 June 12, 2026

New article: Who Owns the "Delco Remy" Brand?

  • A fifth, deeply researched article (~2,000 words, 21 cited sources) covering the full chain of title — Remy Electric 1896, Delco 1909, the GM era, the 1994 divestiture in which GM kept the trademark, Remy International, BorgWarner's 2015 acquisition, and PHINIA's 2023 spin-off — plus the documented history of Sahney Paris Rhone → Remy Electricals India (1997 JV) → REIL, and the Trade Marks Act / passing-off context. All statements about REIL are attributed to REIL's own materials, SEC filings, or PHINIA's signed February 2026 clarification.
  • Ships with its own OG card and is added via INSERT IGNORE — run npm run migrate:safe and restart to publish.

v4.96.1 June 12, 2026

Fix: article pages started underneath the fixed top nav

  • The "← Back to Articles" link (and the top of the listing page) was hidden under the 72px fixed navigation bar — the new article layouts used 44px top padding where the site convention is ~140px. Both pages now clear the nav.

v4.96.0 June 12, 2026

Articles get visuals: cover images + original technical diagrams

  • Cover images: each article now carries its branded 1200×630 card as cover — shown on the article page, the listing grid, and social shares. Backfilled on production only where no cover was set, so admin-chosen covers always win.
  • Four original SVG diagrams embedded in the article bodies with styled captions: the starter cranking chain, the charging-system sizing picture, a "what to verify before accepting a unit" nameplate guide, and the authorized-channel vs grey-market supply map. Original artwork — crisp at any size, a few KB each, nothing stock.
  • Body updates ship through the same one-time mechanism (now seo_content_pass = 3); run npm run migrate:safe and restart.

v4.95.0 June 12, 2026

Articles: 3× deeper content, FAQ rich results, proper social cards

  • All four SEO articles expanded ~3× (to ~1,000–1,200 words each) with red-flag lists, authorized-vs-grey-market comparison tables, buyer checklists, failure warning signs, and cross-links between articles. Applied to production once via seo_content_pass = 2 (run npm run migrate:safe) — later admin edits are never re-overwritten.
  • FAQ rich results: every article now ends with a FAQ section; the template auto-extracts faq-q/faq-a pairs into FAQPage structured data, making future articles eligible for FAQ snippets in Google with zero extra work.
  • Real social cards: article pages now emit og:type article with published/modified times, twitter:summary_large_image, and a branded 1200×630 OG image per article (new /img/og/ convention — drop a <slug>.png there and it's picked up automatically; cover images take priority).
  • Fixes: article <title> no longer doubles the brand suffix; article body now styles tables and FAQ blocks.

v4.94.0 June 12, 2026

Articles redesigned to publication standard

  • Article pages now read like a proper publication: a centred ~760px reading column, real typographic hierarchy (lead paragraph, styled headings, lists and links), an "Insights" kicker, and a clean byline with a formatted date ("12 June 2026") and reading time instead of the raw database timestamp.
  • Share & convert: WhatsApp / LinkedIn / Email share buttons in the byline, a "Need a genuine Delco Remy part?" quotation CTA after every article, and a "More from New Indo" block with up to three related articles.
  • Articles listing rebuilt as a responsive card grid with excerpts, formatted dates, and hover states to match. No schema changes — deploy is git pull + restart.

v4.93.0 June 12, 2026

Translation engine: ~10× cheaper, with hard cost guards

  • New backend: text translation (Translation Center, auto-translate on save, re-translate buttons) now runs on Claude Haiku via the same Anthropic API key the site chat already uses — roughly 7–10× cheaper per character than Google Translate, with brand names, part numbers, and series codes (50MT, 36SI…) kept untranslated by instruction. The Google Translate key is no longer used.
  • Persistent cache: a new translation_cache table remembers every translation across restarts, so bulk re-runs and repeated saves of unchanged text are free — this (not the per-character rate) was the main cause of the runaway Google bill.
  • Monthly spend cap: translation stops gracefully (English fallback, saves never break) once 2,000,000 source characters/month are used — ≈ $4–6 at Haiku rates. Adjustable via settings.translation_monthly_char_cap; usage is metered in translation_usage.
  • PDF auto-translation disabled: uploading a KB document no longer triggers Google Document Translation into 10 languages (billed per page × language — the single biggest cost driver). Already-translated PDFs on disk keep serving. Deploy note: run npm run migrate:safe, then restart from cPanel.

v4.92.0 June 12, 2026

SEO push: target keywords, blog posts, sitemap fix

  • Sitemap fixed: /sitemap.xml was returning a 500 (the blog-article query referenced a non-existent published_at column), so search engines could not read the sitemap at all. It now renders correctly.
  • Keyword-tuned meta: Home, Products, Compatibility, and Industries meta titles/descriptions/keywords now target delco remy india, delco remy india distributor, remy india, delco/remy starter and delco/remy alternator. Applied once via migrate:safe (a settings.seo_content_pass marker prevents re-runs from trampling later admin edits). Series pages get keyword-rich meta wherever theirs was empty.
  • Four new blog posts (published, English): authorized-distributor guide, Delco starter guide (50MT/42MT/41MT), Remy alternator guide (24SI–55SI), and a genuine-vs-counterfeit checklist — all internally linked to the catalog, compatibility lookup, and quotation flow.
  • Richer head tags: Twitter Card meta on every public page; homepage structured data now declares LocalBusiness alongside Organization for local-intent searches.
  • Admin: Pages & SEO and SEO & Rankings now present as two tabs of one page ("Pages & Meta" / "Rankings"), with a single sidebar entry. Deploy note: run npm run migrate:safe, then restart from cPanel.

v4.91.0 June 12, 2026

Release page: select-all for suggestions

  • A master checkbox in the table header selects every visible suggestion in one click — it respects the scope chips and the SKU filter, shows a half-checked state when only some rows are ticked, and feeds the same totals bar and Create-PO flow. 53 act-now lines no longer mean 53 clicks.

v4.90.1 June 12, 2026

Supply data tables use the full screen width

  • The 1180px readability cap on Supply & Promise pages was meant for the prose/menu pages, but the data worklists inherited it too — on wide monitors the Release table sat at ~70% width. The five table pages (Release, Promise, Verify, On the water, Quote Requests) now stretch to the full content area; the guided pages keep the cap.

v4.90.0 June 12, 2026

"Nothing promisable" now answers with the new-order date

  • When a part is short, the Promise page finishes the sentence: the shortfall chip reads "new order ≈ 6 mo from PO — lands ~12 Dec 26" and the Safe-to-Promise cell shows "none — new order ≈ 6 mo from PO → promise ~15 Dec 26" (the sea lead comes from Configuration → Inventory, plus pack & dispatch days).
  • The Zoho write-back carries the same answer into the line-item description — so the customer-facing quote records a real date even when nothing is promisable from current supply.

v4.89.0 June 12, 2026

Write availability back to the Zoho quote

  • When a Zoho quote is fetched and promise dates are computed, a new "✍ Write availability to the Zoho quote" button appends each part's AVAILABLE — WHEN result to that line item's description in Zoho — on a new line, never replacing what's already written. Example: Availability 12 Jun 26 (portal): 38 from stock — ship by 15 Jun 26; 1062 on ~10 Dec 26 — promise 13 Dec 26.
  • Each write is date-stamped, confirmed before sending, recorded in the audit trail, and safe for the quote's other line items (every row is preserved untouched).

v4.88.1 June 12, 2026

Promise page: ATP and AFA each on one clean line

  • The ASKED column no longer wraps a label away from its value: line one is ATP −1062, line two is AFA 38 — each on a single non-wrapping line (the column widens as needed; nothing truncates), including the "→ N for this quote" form.

v4.88.0 June 12, 2026

Promise page shows AFA before the recommendation

  • Each computed line now shows AFA (ATP + on order) directly under ATP — with the same "→ N for this quote" adjustment when the quote's own hold is added back. One glance separates a timing problem (AFA > 0: material is coming) from a true shortage (AFA ≤ 0: a new order is the only answer).
  • Sharper wording when a hold exists but supply doesn't: instead of "its reservation guarantees these pieces", a covered-but-short line now says "its hold gives it first claim — but there is no free supply to claim yet; needs a new order." A hold guarantees priority, not existence.

v4.87.0 June 12, 2026

Promising no longer nets out the trend forecast — reservations are the protection

  • The team's rule, now the system's rule: "trend forecast is nothing to do with quotes." The forecast is a buying tool (Order Forecast, Coverage, Release keep it). When promising, what matters is ATP now + dated arrivals — first come, first served. Every real quote books its own hold via Zoho, and that hold moves ATP for everyone after it; that is the demand protection.
  • Before: a 1,556-pc enquiry on the brush showed "nothing promisable / 1556 short" while Verify's own AFA said 38 pieces are free — phantom future trend sales were eating them. Now the same enquiry reads: 0 now · 38 on the arrival date · 1,518 short — agreeing with AFA.
  • Every computed line now names who holds the supply — "1100 held for 2026/QT/7018 · high" — so a negative ATP always explains itself, with a hint to fetch that quote when the enquiry is the same customer.

v4.86.1 June 12, 2026

Fix: a fully-reserved quote is promised on supply timing — and the disabled Reserve button looks disabled

  • No more false "short" on a quote its own hold fully covers. The reservation already prioritizes that quote over future walk-in demand (everyone else's ATP reflects it), so netting expected sales out of its own held pieces protected them twice — 663 pcs nobody could promise. A fully-held quote now follows the incoming supply: 38 now + 1,062 on arrival, short 0, with the note "its reservation guarantees these pieces". Partially-held quotes keep the cautious math and say so explicitly.
  • Reserve as Soft now LOOKS disabled when it is. It was functionally disabled (the bar said "already reserved by the Zoho sync") but a more specific green style won over the disabled style — the button now greys out on the dark bar.

v4.86.0 June 12, 2026

One-click "Recalculate all SKUs" on the Verify page

  • The Verify page now has a Recalculate all SKUs button (stock-edit permission): one click re-derives every SKU's stored numbers — on hand, hard, soft, ATP — from the source tables. Safe by design (nothing invented, only recomputed), confirmed before running, and recorded in the audit trail.
  • Use it after imports, migrations (e.g. the v4.83 confidence rule) or whenever the self-check shows drift — no server command needed anymore.

v4.85.0 June 12, 2026

Promise page: a quote never blocks itself

  • Fetching a Zoho quote now adds its own hold back before computing. When the webhook has already booked a high-confidence reservation for that very quote, those pieces are counted as available to it — the page shows "✓ 1100 held for this quote — counted available to it" and "ATP −1062 → 38 for this quote" instead of wrongly answering "nothing promisable".
  • No double-reserving: when the Zoho sync already holds the quote, the Reserve button is disabled with an explanation — and the server refuses a duplicate hold even if the button were bypassed. The webhook keeps the hold in step with the quote.
  • Reservation badges now state hard vs soft and the hold's confidence.

v4.84.0 June 12, 2026

AFA at the forefront — quote customer ETAs from the stock page

  • The Stock page's AFA column now shows WHEN, not just how much. Under each AFA value (ATP + On Order) sits the earliest open purchase-order arrival — "lands 18 Sep 26" — so anyone looking up a part can immediately tell a customer: order now, delivery after that date plus dispatch.
  • Purchase orders without an ETA show an assumed date one sea lead out ("~12 Dec 26 assumed") with a pointer to set the real ETA on Coverage → Shipments.
  • The legend explains the quoting rule, and links to Promise a delivery for an exact dated promise on a specific quantity (that page already accounts for backlog and future demand month by month).

v4.83.0 June 12, 2026

ATP counts only high-confidence quote holds — driven from Zoho

  • The business problem: buyers collect 3–5 quotes per requirement, so the company sees 3–10 RFQs per real demand. Every quote booked a soft hold, inflating reservations to many times the true demand and dragging ATP falsely negative.
  • The rule now: every soft hold carries a confidence — ATP = on hand − hard − high-confidence soft only. Low-confidence holds stay fully visible (the Soft Reserved total is unchanged) but no longer reduce ATP. AFA = ATP + on order is now a named number on the Verify page.
  • Zoho is the source of truth: the new Quotes field Order_Confidence (High/Low, default Low) flows through the stock-sync webhook — the sales manager marks the real buyer's quote High and the portal hold follows, including on later edits. Promise-page reserves and manual stock edits book High (they're deliberate). The Verify page shows each hold's confidence with a one-click flip (stock-edit permission, audited).
  • Migration (team decision): all existing holds start as Low for immediate ATP relief — re-mark genuinely hot quotes High from the Verify page or in Zoho.

v4.82.0 June 12, 2026

Pages grouped by function — audit result

  • Zoho CRM page: connection management is now ONE card. Status and the typed-confirm Disconnect used to sit at the top and bottom of the page with unrelated PDF template settings sandwiched between (the team's report). The page now reads: Connection (status + disconnect together, danger-marked) → PDF templates → change history.
  • Order Forecast: Saved snapshots moved below the results table. Snapshots are history, not an input — the page now flows inputs → parameters → results → history, the same convention as the Configuration pages.
  • Audit of the remaining admin pages found no other split-function layouts: the Coverage board's overlay forms already follow the grid they feed, Stock's import sections are already adjacent after the table, and the list pages are simple header → filters → table.

v4.81.0 June 12, 2026

Configuration: fields are locked until you click the pencil

  • No setting can be edited by accident anymore. Every Configuration field now renders read-only (values stay fully readable); a ✎ pencil beside each field unlocks editing for that one field. The existing safety net stays on top: change-highlighting, the worded confirm-diff before save, audit history with revert.
  • Applies to every section and every field type — text, numbers, checkboxes, selects, colors, textareas — plus the username on My account & security. Blank action inputs (new password, typed-confirmation words, encrypted keys) stay directly typeable: there is nothing in them to overwrite.
  • Sidebar polish shipped alongside: the Expert tools section was renamed Stock & Forecast and now sits above Catalog.

v4.80.0 June 12, 2026

Sidebar: collapsed sections + the menu stays where you left it

  • Every sidebar section now collapses — its label is the toggle. By default only Supply & Promise is open, plus the section you are currently working in (so the highlighted page is always visible). Click a label to peek into another section.
  • The menu no longer jumps back to the top on every click. The sidebar remembers its scroll position across page loads, and if the current page's entry would still be out of view, it is scrolled into view automatically.
  • In the icon-only (collapsed) sidebar, sections stay fully visible as before — collapsing applies only to the wide menu.

v4.79.1 June 12, 2026

Fix: Feedback Webhooks sidebar link was a 404

  • The Configuration menu's Feedback Webhooks entry (added in v4.77.0) pointed to /admin/feedback-webhooks; the page actually lives at /admin/feedback/webhooks. The link now opens the webhook log, and the Feedback item in Today no longer lights up at the same time.

v4.79.0 June 12, 2026

Sidebar corrections from the team's review

  • Series Pages, Industries and the Image Library moved to Content — all three build the public site (series landing pages; the Industries pages are pure content by schema; the Image Library holds general and series imagery, not just product photos). They now live in Content → Website Pages, and the Content Studio hub gained a "Series & Industries landing pages" card.
  • Warehouses joined the Masters group (it is master data) — leaving Expert tools to the working pages only.
  • Catalog now contains exactly what it should: Products, the Bulk Manager, and the masters.

v4.78.2 June 12, 2026

Series Pages — "how do I add a series?" answered on the page

  • The Series Pages screen now says how a series comes to exist: a + New series (via its first product) button opens the add-product form (where "+ Create new series…" in the Series field births the series), with a one-line explanation — including the constraint that the Bulk Manager can't create series. No more trial and error.

v4.78.1 June 12, 2026

"Super admin only" badge everywhere it applies

  • The grey 🔒 badge added in v4.78.0 for Configuration now marks every super-admin-only surface across the admin: the Admin Users pages (list, add/edit, permissions), Backup Management, the Create-PO modal (all three launch points), the stock edit modal, the stock-log Reverse dialog, the forecast's sales-history upload card, the Release page's PO footer bar, and the Zoho status card on the Customers page.
  • One shared component (partials/sa-badge.ejs + a single CSS rule) — so the marker stays identical wherever it appears.

v4.78.0 June 12, 2026

Configuration is super-admin territory

  • All Configuration sections now require super admin — viewing, saving and reverting — with one deliberate exception: My account & 2FA stays open to every admin (it's their own credentials). Non-super admins opening Configuration see just their account section with a clear note.
  • The endpoints those sections drive are gated the same way: encrypted API keys (save/reveal), Zoho connect/callback/disconnect, Google Search Console connect/callback/disconnect, and the logo upload.
  • Every gated section wears a small grey "Super admin only" badge — on its Configuration card and on the section page itself — so the boundary is visible, not discovered by surprise.

v4.77.2 June 12, 2026

Fix: unreadable primary buttons · Zoho status gated

  • Primary buttons were navy-on-navy when rendered as links (e.g. + Invite Customer): the admin's .btn-primary rule set the background but never the text color, so anchor link-color showed through. The rule now sets white text and removes the underline — fixing every primary button across the admin at once.
  • The Zoho CRM connection status on the Customers page (and its Manage-in-Configuration link) now shows only to super admins — staff see the customer list without integration internals.

v4.77.1 June 12, 2026

Customers page cleanup (from the production screenshot)

  • Question-led header ("Who are our customers?") replaces the stale "Customer Portal" title and its two contradictory subtitle lines that still claimed the page manages the Zoho connection and portal settings.
  • Removed the dead Contact Updates button (its page no longer exists — it redirected straight back) and the duplicate Quote Requests button (it has its own sidebar entry).
  • Brown/khaki buttons converted to the D2 system here and on the invite + service-ticket pages (+ Invite Customer and Search/Invite are navy primaries; Login-as is a quiet outline like its neighbours).
  • One legend instead of two: the duplicated Roles/Actions explainer above the table is gone, and the bottom legend shrank from nine items to three — the per-button explanations now live on the buttons as tooltips.

v4.77.0 June 12, 2026

Settings live ONLY in Configuration · full palette sweep

  • No more settings scattered across pages. The Zoho connect/disconnect UI embedded on the Customers page is now a status line linking to Configuration → Zoho. The sea/air lead-time defaults moved off the Coverage page into Configuration → Inventory & ATP (with blast-radius notes — they reshape every projection); Coverage shows the values read-only with a link. The Google Search Console connection moved off the SEO page into a new Configuration → Search Console section (with the one-time setup steps); the SEO page links there when unconnected. Feedback Webhooks is now homed in the Configuration menu.
  • Skinning finished: 427 surviving old-palette colors (royal navy, cold tailwind blues/reds/greens/greys) across 42 admin views — plus the colors the PO modal injects from JS — re-mapped to the D2 system. Every one of the 125 views compiles and every inline script syntax-checks after the sweep.

v4.76.1 June 12, 2026

Unification completeness fixes

  • The guided add-a-page flow now shows its step banner on every step — Pages (step 1) and the Translation Center (step 2) gained the "Guided flow — step N of 4" banner with the next-step link, matching Navigation (step 3), as the Content Studio plan specified.
  • Removed the two list views orphaned by the Quote Requests merge (quotations.ejs, portal-rfqs.ejs — their routes redirect; delete them on servers too).
  • package-lock.json's version fields were stuck at 3.130.5 — synced to the real version.

v4.76.0 June 12, 2026

Unification phase 8 — customer portal in the same language

  • The portal now speaks D2: navy active states and links (replacing the brown accent), the same warm tan borders and cream surfaces as the admin, the same four-color status-badge system (green / amber / red / navy), and the D2 ink/grey text scale. The customer-friendly light shell stays — homogeneity comes from the shared component language, not from making the portal look like an internal tool.
  • Strictly a re-tint: every selector, class and mobile rule in portal.css is unchanged (148 rules before and after); the RFQ form, warranty inline-edit and all transactional scripts are untouched. Fonts were already rem-based, so the A−/A+ text-size preference continues to apply.
  • This completes the admin + portal unification program (phases 1–8, v4.69.0 → v4.76.0).

v4.75.0 June 12, 2026

Unification phase 7 — one page header everywhere

  • Twenty-three more admin pages (users, masters, logs, feedback, SEO, campaigns-adjacent lists, warehouses, backup…) now use the single standard page-header component — finishing the header homogenization started in phase 1. Pages whose titles are computed (detail/forms) keep their dynamic headers, already styled by the shared classes.
  • Every admin view compiles and every inline script syntax-checks under the post-sweep harness. No behavior changes.

v4.74.0 June 12, 2026

Unification phase 6 — expert tools, D2 chrome

  • The power pages now introduce themselves like the guided pages do: "Where does every part stand today?" (Stock), "What should I order?" (Forecast), "When does stock run out — and what closes the gaps?" (Coverage), "What changed, and why?" (Stock Audit Log), "What did Zoho do to my stock?" (Zoho Sync).
  • Stock quick filters are grouped and labelled — Warehouse · Commitment · Status · Levels — instead of one wall of identical pills (the team's original complaint). The buttons themselves, their behavior and all table scripts are untouched.
  • Per the team's density ruling, the data grids keep their compact expert scale; the A−/A+ control enlarges on demand. Coverage tab accent aligned to the D2 navy.

v4.73.0 June 12, 2026

Unification phase 5 — Content Studio

  • One home for the static site (/admin/content): the hub asks "What do you want to do with the website?" — add a page, edit a page, change the menus, translate, manage the library, check SEO. The old split between "Content" and "Site & Navigation" is gone.
  • "How do I add a page?" now has one answer (/admin/content/new-page): a four-step guided path — create & write (SEO inside the editor) → translate → place in the menus → check it live.
  • Header menu and footer links are ONE page (/admin/navigation, two tabs) — they were always the same job. Old URLs redirect with the right tab; all editing forms and their behavior unchanged.

v4.72.0 June 12, 2026

Unification phase 4 — Customer 360

  • Every customer task completes on one page (/admin/customers/<id>): identity with role/status and Zoho contact/account links, Login as customer, recent portal activity, access & security (last login, failed attempts), and the customer's quote requests — all together.
  • Profile updates are approved where the customer is: pending requests appear on the customer's page as field → new-value diffs with Approve-&-sync-to-Zoho / Reject right there. The separate Profile Updates page is gone (old URL redirects); the customers list shows an amber badge on anyone with pending updates plus a banner with the total.
  • Customer names in the list now open the 360 page. No schema change.

v4.71.0 June 12, 2026

Unification phase 3 — Quote Requests: one worklist

  • Website enquiries and portal RFQs are one table now (/admin/quote-requests) — they were always the same business object, differing only by customer. The customer type is a badge (New / Existing) and a filter, the source is said in words ("via website · no account yet"), and statuses from both worlds map onto one honest vocabulary: Needs action → In review → Quoted → Won (or Cancelled / Closed).
  • Filter chips with live counts default to Needs action; search across company, contact, email and reference. Urgent requests carry their urgency badge; Zoho-linked requests say so.
  • Opening a request keeps its full existing detail page — enquiries with GST verification and notes, portal RFQs with Zoho deal/quote links and push/retry — because the actions genuinely differ. The two old list pages redirect here; the sidebar shows one entry.

v4.70.0 June 12, 2026

Unification phase 2 — Configuration, made safe

  • The settings page is gone; long live Configuration (/admin/configuration): eleven small sections (Company, Branding, Homepage, Inventory & ATP, Chat, Zoho, Session replay, Portal sessions, Maintenance & protection, Encrypted keys, My account). Each section has its own Save that writes only its own fields — the old single form bundled 33 fields into one Save; an accidental edit elsewhere can no longer ship with yours.
  • Nothing writes unconfirmed: Save shows exactly what will change (old → new, in words) with blast-radius notes on high-impact fields ("affects ALL outgoing email", "stops ALL automatic quote reservations"). Changed fields highlight amber; the button counts your changes.
  • Audited and reversible: every save records who/when/field/old→new; each section shows its recent changes with a one-click Revert (itself audited). Maintenance mode requires typing MAINTENANCE; disconnecting Zoho requires typing DISCONNECT in a separated danger zone.
  • Zoho CRM connection finally has a home — status, Connect and Disconnect live in Configuration → Zoho, no longer scattered.
  • Old links keep working: /admin/settings (and its tabs) redirect to the right section; logo upload, 2FA and encrypted-key flows unchanged. Deploy note: run npm run migrate:safe (adds the audit details column; syncs four portal-session columns into schema.sql).

v4.69.0 June 12, 2026

Admin unification phase 1 — D2 foundation, new sidebar organization

  • One design across the admin: the Supply & Promise palette is now the admin-wide theme — tables, cards, inputs, buttons, badges, filter chips and dashboard stat cards all share the same colors, radii and proportions. The sidebar wears the approved slate-navy gradient. Identical content, homogeneous look, on every one of the ~60 admin pages at once.
  • The sidebar is reorganized by the job (every page keeps its URL): Supply & Promise first · Today (Dashboard, Quote Requests, Website Enquiries, Customers, Profile Updates, Service, Feedback, Campaigns) · Catalog with its masters (Brands/Categories/Industries/Equipment — masters are business data, not settings) · Expert tools (Stock, Forecast, Coverage, logs, Warehouses) · Content (Website Pages, Library, Translations) · System split into Configuration (settings only), Access (admin users — no longer buried in settings) and Logs.
  • New standard page header (question-led title + plain-language purpose), adopted on the Dashboard first; remaining pages convert phase by phase. Three stray duplicate view files removed.
  • This is phase 1 of the admin + portal unification the team requested; Configuration-made-safe, the Quote-Requests merge, Customer 360 and Content Studio follow as their own releases.

v4.68.0 June 12, 2026

Verify — read-only Tally compare

  • “Does this match my Tally data?” now has a one-click answer: upload today's Tally stock-summary CSV on the Verify page and get a difference report — DEL stock, hard committed, and Tally-side on-order per SKU, portal vs Tally with colored deltas. Nothing is written; the compare can never become an import (to apply Tally's numbers you still run the real import on the Stock page, which previews first).
  • On-order differences are explained, not alarmed: when the portal's total includes forecast POs or manual rows that Tally doesn't know yet, the row says so with the total alongside.
  • The summary counts exact matches, differences, CSV SKUs not on the portal, and portal SKUs holding DEL stock that the CSV doesn't mention. Mismatched SKUs link straight to their full Verify dossier. Handles Tally's UTF-16 exports like the import does.

v4.67.0 June 12, 2026

Admin text size now follows your preference — with an A−/A+ control

  • The portal has always had a per-user text-size preference, but the admin's tables, chips, buttons and the Supply & Promise pages were locked to fixed pixel sizes that ignored it. All admin type now scales with the preference — pixel-identical at the default size, larger everywhere when you choose a bigger step.
  • New A− / A+ control in the admin's top bar (next to the IST clock): five steps from S to XXL, applied instantly without a reload, remembered on the browser, and shared with the public site — set it once and every page obeys. Built for the team members who found the admin type hard to read.
  • Tooltips scale too. No behavior changes otherwise; no schema change.

v4.66.1 June 12, 2026

Fix: Release worklist 500 error

  • /admin/supply/release crashed on load (data.suggestions.forEach is not a function) — the suggestions engine returns { items, summary }, not a bare array. The worklist now reads suggestions.items, same as the Coverage page.

v4.66.0 June 12, 2026

Create-PO over-buy guardrail — cover-after-order on every line

  • Every line in the shared Create-PO modal (Forecast, Coverage suggestions, Release worklist) now shows the months of forward cover the order produces: green “cover 6.2 mo ✓”, or amber “⚠ cover 16.3 mo — try ≤ N (≈ ₹X/yr carrying on the excess)” when the quantity pushes the SKU past the Coverage board's 14-month over-stock line. Updates live as you edit quantities.
  • Warn, never block — deliberate forward-buys (price-rise economics) stay fully allowed; the footer counts amber lines so you commit with eyes open. Carrying ₹ uses the planner's convention (24%/yr on the excess at purchase rate).
  • Threshold and rates come from the same forecast/coverage engine as every other page — a line that ambers here is exactly one that would show “over” on the board. SKUs without sales history show no chip (no basis to judge).

v4.65.0 June 12, 2026

Supply & Promise — release worklist + on the water (slices 3 & 4, section complete)

  • “What must I release to keep the 30-day promise?” (/admin/supply/release): every part with its 12-month runway sparkline and run-out date in words, an act-by deadline (the last month a sea release still prevents the gap — “Sep-26 — or breach Mar-27”, or NOW with the air-bridge size when sea can no longer make it), and the sized suggestion with its reason. Stage chips (Act now / At risk / Healthy) scope the list; defaults to what's due.
  • Ordering without over-buying: tick the suggestions you accept — quantities are already sized to target cover by the suggestions engine — and the sticky footer's Create PO opens the same guarded flow used everywhere (brand/OEM qualify filters, rate validation before any write, PDF, automatic On-Order update). Air mode pre-selected when every ticked line is an air top-up.
  • “What's on the water?” (/admin/supply/water): open shipments with ETAs, pieces, Tally-owned locks and next-arrival callout; in-play preponements; and on-order rows with no tracked shipment (Tally/manual) shown honestly as “assumed sea lead”.
  • Front-door cards now all route to guided pages — the Supply & Promise section is complete: promise · release · order · verify · track. Release-page parts link to their Verify dossier. No schema change.

v4.64.0 June 12, 2026

Supply & Promise — verify a number (slice 2)

  • “Is this number right?” (/admin/supply/verify): pick any SKU and every figure is provable — ATP shown as on hand − hard − soft with the actual reservation rows behind each term (source, who, when, expiry; promise-page reserves labelled), and On Order decomposed into its open incoming rows with source badges (Tally import / Purchase order / Manual adjustment), ETAs and statuses.
  • Self-check: each stored value is recomputed live from the source tables and compared — green when they match, amber with both numbers when drifted (typically an expired soft reservation awaiting auto-release), with a one-click audited Recalculate now.
  • Sync stamps & history: last Tally import, the last Zoho webhook that touched the SKU (linked to its sync detail), and the 15 most recent audited changes with deltas — full history one click away in the Stock Audit Log. The page is honest about its boundary: a live Tally comparison needs today's CSV, which the stock-page import already diffs.
  • Front-door card now routes here; new sidebar entry; the promise calculator's ATP figures link straight to verification. No schema change.

v4.63.0 June 11, 2026

Supply & Promise — new guided section: promise calculator (slice 1)

  • New task-led admin section at /admin/supply: opens with “What do you want to do?” — five business questions, each routing to a purpose-built page (this release ships the first; the others deep-link to today's expert pages). Existing Stock / Forecast / Coverage pages are untouched.
  • Promise a delivery (/admin/supply/promise): enter a Zoho quote number (fetched live by Quote_Number/Offer_Number) or ad-hoc SKU + qty lines, and get a per-part answer: how many ship from stock now, how many arrive on which shipment ETA, and how many are short — with a safe-to-promise date including a remembered pack-&-dispatch buffer.
  • Honest by design: future arrivals are promised only to the extent the coverage projection says they'll still be free after regular sales (same engine as the Coverage board — prepones and out-of-trend orders respected; overcommitted SKUs pay their backlog first). The optimistic “if no other sales” figure is shown alongside. Undated Tally on-order is flagged “assumed sea lead”.
  • Reserve as Soft: one click books the promised pieces using the same percentage policy and expiry as the Zoho sync, audited in the Stock Log, idempotent per quote, with one-click release — and if the quote is later processed from Zoho, the webhook supersedes the manual reservation automatically (never double-counted).
  • New pages use the readability scale agreed with the team (16px base, nothing under 12px, darker secondary text).

v4.62.0 June 11, 2026

Admin UI kit — one design across admin pages (phase 1)

  • Design audit found 20+ font sizes, 12+ padding combos, four separately-styled quick-filter pill variants and ad-hoc button sizing across admin pages. A shared UI kit now lives in the main stylesheet: 13px controls/labels · 12px chips/buttons · 11px table headers.
  • One chip component — Stock, Forecast, Coverage and Suggestions quick filters are now visually identical (same shape, size, active state).
  • One button size — 42 toolbar/row buttons across Stock, Forecast, Coverage and the PO modal normalized to .btn-sm (semantic colors kept; ad-hoc inline sizes removed).
  • Calmer, denser tables — headers drop from 15px shouting caps to 11px, row padding tightens, so more data fits per screen.
  • Phase 2 (remaining admin pages — customers, orders, settings, …) follows the same kit.

v4.61.2 June 11, 2026

Narrower SKU column

  • With Hide Product on, the SKU and Qty/mo columns are pinned tight (96px / 58px) — the freed width flows to the month cells instead of padding the first columns.

v4.61.1 June 11, 2026

Board polish: inline editing, Hide Product, chip layout

  • Inline editing on the preponement and out-of-trend tables — Edit turns the row's Qty / date / note cells into inputs, Save posts, cancel reloads.
  • Hide Product toggle (on by default, remembered) keeps the SKU column narrow; untick to show the product name on a second line under the SKU.
  • Cell chips no longer collide with the balance — the +N/▲ markers sit in a top band and ▼N in a bottom band, with the closing stock between them (fixes “+1100” overlapping the December figure).

v4.61.0 June 11, 2026

Out-of-trend orders, prepone editing, tooltip polish

  • 📈 Out-of-trend orders (in play): record a one-off large order the trend can't see — SKU, qty, execute-by month. It's added as extra consumption (▼N on the board cell), revising balances, gaps, the Suggestions tab and the Planned forecast's backlog. Remove the entry once executed; overdue entries turn amber.
  • Edit buttons on both overlay tables — adjust a preponement's Qty / New ETA / note (capacity re-validated) or an out-of-trend order's Qty / date / note; the form switches to Update with a cancel link.
  • Tooltips: explicit 12px white-on-navy across both pages.

v4.60.1 June 11, 2026

Coverage board readability: +N incoming chip, instant tooltips

  • Arrival months now show a small green +N on the cell — the pcs arriving that month — so the closing-stock number can't be misread as the incoming quantity (e.g. after a preponement: +2 ▲S · 3 = 2 arriving, holding 3 at month end).
  • Tooltips on the Coverage page are now instant (the same styled layer as the forecast page — cell in/out/end, chips, prepone statuses) instead of the slow native bubbles that often never appeared.

v4.60.0 June 11, 2026

Coverage: sticky filters + preponement overlay

  • Filters survive reloads: the board's search keyword and quick chips persist — switching the Opening basis (ATP/On Hand), reloading, or returning to the page keeps them.
  • ⏩ Expedited / preponed (in play): a new table under the board records on-order material you've managed to expedite — SKU, qty, new ETA, and the source (a dated PO or the undated assumed-Sea pool). Each entry moves the quantity to the earlier month (supply conserved — added at the new ETA, subtracted from its source; On Order totals untouched). The board shows a purple ▲P marker; the Suggestions tab and the Planned forecast's backlog see the new timing too, so false air-top-ups disappear when a prepone already bridges the gap.
  • Entries stay in play until you remove them — rows past their ETA turn amber (“due — remove once received”), and entries whose source shrank (e.g. after a Tally import) are flagged. Requires npm run migrate:safe.

v4.59.2 June 11, 2026

Qty/mo as a whole number

  • The Coverage board's Qty/mo column (and the CSV) now shows whole numbers; the exact decimal rate remains in the cell's tooltip.

v4.59.1 June 11, 2026

Coverage board: Qty/mo column

  • A Qty/mo column right after SKU/Product shows the monthly consumption rate the projection subtracts each month (the dampened forecast rate; A-class at the +20% band) — no more expanding the row to see it.

v4.59.0 June 11, 2026

Coverage board: Opening stock basis — ATP or On Hand

  • New Opening selector on the Coverage board: ATP (stock net of hard/soft commitments — the default, what's truly promisable) or On Hand (physical stock, commitments ignored — how long the shelf actually lasts). The whole 12-month projection, gap/over coloring, summary counts, CSV and PDF recompute on the chosen basis; the PDF title and column note it.

v4.58.0 June 11, 2026

Backlog confidence review — Net Negative filter + “cover this backlog”

  • New ⚠ Net Negative quick filter on the forecast: every SKU where ATP + On Order < 0 (quotes/commitments exceed supply — typically dead SKUs suddenly quoted). Review each one for confidence.
  • High confidence? Open the SKU's dampener modal and tick “Cover this backlog in the order” — the deficit is added to the Classic and Planned orders, flows into Create PO, and the Coverage board opens in an immediate gap for it. The ATP cell shows “+N backlog”. Low confidence (test quote)? Leave it unticked — it stays out of the forecast.
  • Dead SKUs no longer get ghost orders: a completed FY whose uploaded file lacks the SKU now counts as zero sales (the same “silence is evidence” rule as the current FY), so a 5-pc sale from 2022-23 can't quietly drive a 2026 recommendation. Requires npm run migrate:safe.

v4.57.0 June 11, 2026

Tally import owns On Order

  • Tally is the truth: the CSV import now clears stale manual On-Order adjustments (the edit-modal deltas) along with its own previous rows, so after an import On Order equals Tally's “Purc Orders Pending” — plus any portal forecast POs not yet in Tally. This fixes On Order “sticking” at an old value (e.g. 36 vs the CSV's 26).
  • Forecast-PO handover: a FORECAST PO with status ordered/in-transit is assumed entered in Tally, so the import absorbs it — its portal On-Order rows retire (no double count) and it becomes read-only (“in Tally” badge): lines can't be edited, the PO can't be deleted. The status still works, and setting it to cancelled reduces On Order immediately via an offset that the next import clears. New POs created after an import count instantly as before, until the next import absorbs them.
  • The import also recalculates SKUs that were in the previous import but missing from the new CSV (they used to keep stale On Order), and the result summary lists cleared adjustments and absorbed POs.

v4.56.4 June 11, 2026

PO PDF previews in the browser

  • PO PDF now opens the FORECAST PO inline in a new tab — preview the order details and print (Cmd/Ctrl+P) or download from there, instead of a forced download.

v4.56.3 June 11, 2026

PO line edits: rates auto-generated for new SKUs

  • Adding a line to a PO as plain SKU, QTY no longer leaves a silent ₹0 rate — the portal now prices it at MRP × the PO's rate factor (the same rule as the Create-PO modal). If no MRP exists in the catalog, the save is rejected with a clear message asking for an explicit SKU, QTY, RATE — and validation now runs before anything is written, so a failed save can't disturb the existing lines.

v4.56.2 June 11, 2026

Fix: “Unknown SKUs” when saving shipment lines

  • Saving edited shipment/PO lines written as SKU, QTY[, RATE] (comma + space — the format the edit form itself pre-fills) failed with Unknown SKUs: 1115673,, … — the parser was swallowing the trailing comma into the SKU. Fixed; all separator styles (, / ; / space, with or without spaces) now parse correctly.

v4.56.1 June 10, 2026

Suggestions as a filterable table

  • The Suggestions tab is now a proper table (Type, SKU, Product, Class, Mode, Qty, ₹ value, When/Ref, Why) with quick-filter chips — Air top-up / Place order / Delay / Pre-close and Class A/B/C (combinable) — plus search and sorting. “Create PO from visible (N)…” takes the purchase-type rows currently shown, replacing the per-card checkboxes.

v4.56.0 June 10, 2026

Coverage Suggestions → the same Create-PO flow

  • On Coverage & Shipments → Suggestions, the purchase-type cards (AIR TOP-UP / PLACE ORDER) now carry an “Include in PO” checkbox (ticked by default) and the summary bar gains “Create PO from selected (N)…” — opening the identical review modal as the forecast page, pre-filled with the suggestion quantities. Mode pre-sets to Air when only air top-ups are selected, otherwise Sea (editable).
  • Same everything from there: Brand/OEM Qualify filters, editable qty/rate lines, supplier meta remembered from your last PO, Save & Generate → FORECAST PO PDF + automatic On Order update.
  • The old per-card “Create draft Air PO” one-click (review-less, no PDF, no On Order) is replaced by this flow. The PO modal is now a shared component used by both pages.

v4.55.5 June 10, 2026

PO PDF polish

  • Title is now FORECAST PO; Description of Goods shows the product name only (no SKU prefix); the line table has full vertical column borders (outer frame through the totals so the grand total is never sliced); and rows/rules got breathing room — proper padding above every horizontal line.

v4.55.4 June 10, 2026

Fix: filtered table not detected by Create PO / PDF chooser

  • The forecast table is paginated — the page only keeps the current page's rows in the DOM, so the "is a filter active?" check could both miss real filters (Create PO loading all SKUs despite 6 visible) and false-alarm on unfiltered multi-page tables. Both Create PO… and the Download PDF chooser now compare against the table's true total row count.

v4.55.3 June 10, 2026

Create PO respects the table's quick filters

  • With Quick filters (Class A/B/C, PreClose, PreArrival Gap, Itemwise Dampener) and/or a search keyword active, Create PO… now includes only the visible SKUs. The modal states it plainly — “table filter: 12 of 163 visible” — and the brand/OEM qualification then applies on top. No filter → all forecast SKUs as before.

v4.55.2 June 10, 2026

PO line edits keep their purchase rates

  • Editing a PO's lines on the Shipments tab no longer resets the purchase rates (which zeroed the PO PDF amounts). Rates are preserved automatically, and the line format now accepts an optional third column — SKU, QTY[, RATE] — to change a rate explicitly. On Order continues to follow every edit, status change and delete by the exact delta.

v4.55.1 June 10, 2026

PO qualification filters: Brand + OEM status

  • The Create-PO modal now has two Qualify filters — Brand (default Delco Remy) and Product OEM status (default active). Only matching SKUs appear on the PO; the Add-SKU lookup is restricted the same way, the excluded count is shown, and the server re-checks on save so a non-qualifying SKU can never land on a PO.

v4.55.0 June 10, 2026

Create PO from the forecast — review, PDF, and automatic On Order

  • Create PO… (toolbar, super-admins) works for both forecasts: planner ON uses the Planned Orders, OFF uses the Classic Orders.
  • A review modal shows every line — edit quantities and purchase rates (prefilled MRP × factor, re-appliable), delete lines, add SKUs — plus PO number (auto-suggested), supplier block, payment/despatch/destination terms (remembered from your last PO), mode Sea/Air with expected date, and warehouse.
  • Save & Generate produces a Tally-style Purchase Order PDF (supplier + buyer blocks with GSTIN, HSN/SAC and GST % per line, IGST by rate, grand total, amount in words, PAN, signatory) — re-downloadable anytime from the Shipments tab (PO PDF).
  • On Order updates automatically: the PO writes incoming-stock lines (the source of the On Order figure) the moment it is saved. Shipment statuses now drive it too — ordered/in transit count as incoming, arrived books the receipt, cancelled (or deleting the PO) reverses it. Editing PO lines re-syncs.
  • The old “Convert plan → PO” draft-only button is replaced by this flow. Requires npm run migrate:safe.

v4.54.2 June 10, 2026

Planner budget entered in lakhs

  • Budget ₹ lakhs (sell value) — type 200 for ₹2 Cr or 22.5 for ₹22,50,000 (decimals ok); the live readout below echoes the full ₹ value. Old links/snapshots with whole-rupee budgets still work.

v4.54.1 June 10, 2026

Forecast tooltips: readable at the screen edge

  • Fixed the navy tooltip collapsing into an unreadable one-word-per-line column near the right edge of the screen (e.g. on the Planned Order ⓘ) — it now keeps its full width and repositions inside the viewport.

v4.54.0 June 10, 2026

Planned forecast v2 — additive & transparent: Classic + Backlog + opt-in Forward buy

  • The Planned Order is now built additively: Classic order (qty/mo × Cover months − stock) + backlog projected to accumulate by the arrival month (pulled per SKU from the Coverage projection — shipment ETAs included) + an optional price-rise forward buy. Each SKU's ⓘ shows the exact breakdown.
  • One cover knob: the planner's separate “Cover after arrival” field is gone — the Classic Cover months feeds both forecasts.
  • Forward buy is asked, not forced: a recommendation line shows the economic months (12 × rise ÷ carry, capped by Max fwd), pieces, ₹ and savings — tick “Add to Planned Order” to include it. The ₹ Budget trim (C→B→A) applies only when added; the classic + backlog base is never cut.
  • Plan summary now reads = classic X + backlog Y (+ forward Z); pre-arrival gap SKUs stay flagged (the backlog is ordered for, but only an air top-up prevents the stock-out itself). PDF and AI memo updated to the new model.

v4.53.2 June 10, 2026

Forecast workflow: the rate-building stage is now explicit

  • Blend weight and Global dampener now sit under a parent step ② Forecasted average consumption / month (qty/mo) as sub-steps 2a and 2b — making it clear they settle one number per SKU: the monthly rate. Requirement period (now step ③) multiplies that rate into pieces; Recompute is step ④. Tooltips renumbered to match.

v4.53.1 June 10, 2026

PDF exports ask: filtered SKUs or all?

  • On both the Order Forecast page and the Coverage board, clicking Download PDF with a filter active now asks “Filtered (N)” or “All (M)”. Filtered exports build the PDF server-side for exactly the visible SKUs — including their order summaries / suggestions — and the PDF title notes the filtering. No filter → straight to the full PDF as before.

v4.53.0 June 10, 2026

Coverage board: Export CSV & Download PDF

  • Export CSV downloads the rows currently visible on the Coverage board (respects search/class/gap filters): SKU, class, demand, stock figures and the 12 monthly closing balances.
  • Download PDF generates the full board server-side — colored gap/over cells, arrival markers (^), repeated headers, page numbers — followed by the complete Suggestions list with quantities and ₹ values.

v4.52.0 June 10, 2026

New: Coverage & Shipments — the 12-month inventory goal, visualised

  • New admin page (sidebar → Coverage & Shipments) with three tabs. Coverage board: a per-SKU 12-month grid — green = covered, red = will run dry, blue = over-stocked — with ▲Sea/▲Air arrival markers, projected closing stock per month, search/class/gap filters, and click-to-expand SKU detail.
  • Shipments: track your POs with mode (Sea/Air), status (draft → ordered → in transit → arrived/cancelled), ETA and SKU lines. Shipments are the time-phased breakdown of the Zoho On-Order total; any undated remainder is flagged and assumed Sea. Lead defaults (Sea 6 / Air 3 months) editable here. Requires npm run migrate:safe.
  • Suggestions: concrete actions to keep every SKU covered — AIR TOP-UP (gap before supply lands), PLACE ORDER (no pipeline), DELAY / PRE-CLOSE (sustained over-stock), each with quantities, ₹ value and a one-click draft Air PO (super-admins).
  • The forecast page's Planned forecast gains “Convert plan → PO” (super-admins): stores the current Planned Orders permanently as a draft shipment with an ETA from the lead defaults. Demand basis: dampened rate, A-class at the +20% band.

v4.51.0 June 10, 2026

Order Forecast: Classic vs Planned naming

  • The two methods are now named explicitly: the “Forecast Order” column is “Classic Order” (pairing with “Planned Order”), step 4 is “Requirement period — Classic vs Planned forecast” with labelled Classic forecast / Planned forecast (Order planner) sub-sections, and the quick-filter pill, live notes, legend and PDF headers follow.
  • Steps 2 (Blend) and 3 (Global dampener) are marked “feeds both forecasts” — they shape the monthly rate that both the Classic and the Planned methods consume, so they are deliberately not under either section.

v4.50.0 June 10, 2026

Tables sitewide: the search keyword survives reloads

  • Every smart table's Search box now remembers its keyword per page (per browser tab) — change forecast parameters, save a dampener, or reload, and the filter is still applied. Typing overwrites it live; a new × button clears it. Applies to all tables sitewide (forecast, stock, quotations, portal lists…); the keyword clears when the tab closes.

v4.49.2 June 10, 2026

Order Forecast: Global dampener auto-saves

  • The Global dampener now saves itself when you commit a change — releasing the slider, leaving the Manual % or reason field, or pressing Enter — and then reloads the report. No Save button. A non-zero value politely waits until a reason is typed (“type a reason to auto-save +15%”); Reset to 0 saves immediately.

v4.49.1 June 10, 2026

Order Forecast: the planner remembers itself

  • The Order planner's on/off state and last field values are now remembered per browser: a fresh visit to the forecast page restores your last planner setup automatically (previously it silently reset to off on every visit). Unticking the box or clicking Reset remembers “off”.

v4.49.0 June 10, 2026

Order Forecast: tidier planner — options hidden when off; Hide Planned order toggle

  • With Order planner unticked, its Timeline / Price & money fields and readouts are now fully hidden (previously greyed out) — tick the box and they appear with the recompute.
  • New “Hide Planned order” toggle in the toolbar (shown while the planner is on, remembered per browser) hides the Fwd buy + Planned order columns on screen without switching the planner off.

v4.48.2 June 10, 2026

Order Forecast: ticking Order planner recomputes immediately

  • Toggling the Order planner checkbox now applies straight away — the Fwd buy / Planned order columns, gap warnings and plan summary appear (or disappear) without needing a separate Apply click. Changing the planner's field values still uses Apply.

v4.48.1 June 10, 2026

Order Forecast: “Requirement period” wording for Cover months

  • Step 4 is now titled “Requirement period — what must the order cover?” and the Cover-months tooltip/legend spell out the exact math (dampened monthly demand × cover months − ATP − On Order) and that it still drives the classic Order columns when the planner is ON (only the Planned-order column uses Lead + Cover after arrival). A small inline note states this whenever the planner is active.

v4.48.0 June 10, 2026

Order Forecast: ABC value class always visible

  • The Class column (A = top 80% of latest-FY revenue, B = next 15%, C = tail) and the Class A/B/C quick filters now show always — no longer only when the Order planner is on. The planner keeps using the same classes for its band policy.

v4.47.3 June 10, 2026

Order Forecast: coverage-target readout shows how the timeline stacks

  • The planner readout now has a second live line — “Coverage target per SKU: 7 lead + 7 cover + 10 fwd = 24 mo of demand” — updating as you edit Lead time / Cover after arrival, making clear that those size the base need while the forward horizon (12 × rise ÷ carry) is a money-only quantity stacked on top.

v4.47.2 June 10, 2026

Order Forecast: planner fields grouped — Timeline vs Price & money

  • The Order-planner inputs are now two labelled columns: Timeline (months) — Lead time, Cover after arrival, Max fwd — and Price & money — Price rise %, Carrying %/yr, Budget ₹. The horizon and budget readouts sit beneath, bridging the two.
  • Cover months is relabelled “Cover months (classic)” and stays outside the planner box on purpose: it drives the classic Order columns and works whether the planner is on or off.

v4.47.1 June 10, 2026

Order Forecast: dampener controls aligned with the Blend column

  • The Global dampener's Manual % and Reset to 0 now sit compactly in the step header (top-right), mirroring the Blend column's Preview SKU placement and styling.

v4.47.0 June 10, 2026

Order Forecast: zero sales this FY now counts as evidence

  • Behaviour change: when the current-FY file is uploaded, a SKU absent from it is now treated as YTD = 0 (run-rate 0/mo) instead of “no signal”. The Blend-weight slider therefore works on every SKU, and months of silence on a historically active item correctly pulls its forecast down (at Auto blend, month 3: roughly −25%). Slide toward history to soften this for lumpy sellers.
  • The “slider has no effect” note now appears only when no current-FY file exists at all.

v4.46.0 June 10, 2026

Order Forecast: dampener manual %, target-pieces entry, Reset buttons

  • Both dampeners (Global and the per-SKU modal) gain a Manual % box accepting the full server range −90% … +200% — beyond the slider's ±90 the slider pegs but the typed value applies and saves.
  • The per-SKU modal also takes a target order (pcs): type the pieces you want the Forecast Order to be and the dampener % is computed backwards (using the current blend, global dampener and cover months).
  • Reset to 0 buttons on both dampeners — sets neutral; click Save to store.

v4.45.1 June 10, 2026

Order Forecast: Budget unit made unambiguous (whole rupees)

  • Budget ₹ is entered in whole rupees (no paise, no Cr/lakh units; commas ignored). A live readout now echoes what you typed — e.g. 20000000“₹2,00,00,000 (2.00 crore)” — and the tooltip + legend state the unit explicitly.
  • The calculated defaults now show inside the empty fields: Max fwd displays the economic horizon (e.g. 10 (econ), updating live as you change rise/carry) and Budget shows the uncapped plan value as its reference. Placeholders only — typing a value is what overrides.

v4.45.0 June 10, 2026

Order Forecast: instant tooltips; live “which cap binds” horizon feedback

  • All the “?” hover hints on the forecast page now show instant styled tooltips (the native browser bubbles were slow and easy to miss). They also appear on keyboard focus.
  • New live line under the Order-planner fields shows the forward-buy horizon arithmetic as you type: the economic horizon (12 × rise ÷ carry), whether Max fwd overrides it (Carrying % dims when bypassed) or the economics bind, and the applied months. Fields are deliberately not blanked or locked: Price rise % also drives the savings estimate, and the planner always applies the lower of the two caps, so your typed values are never destroyed.

v4.44.3 June 10, 2026

Order Forecast: AI recommendation visible to super-admins only

  • The AI order recommendation card is again shown only to super-admin users (other admins no longer see it at all). For super-admins the button still stays disabled, with guidance, until the Order planner is applied. Server-side super-admin enforcement was always in place.

v4.44.2 June 10, 2026

Order Forecast: parameters reorganised as a 5-step decision workflow

  • Report parameters now read top-to-bottom in decision order: ① Where are we in the year (months elapsed) → ② Blend weight (which data to believe) and ③ Global dampener (judgment boost/cut) side-by-side → ④ What must the order cover (Cover months / Order planner) → ⑤ Recompute (Apply / Reset).
  • The Blend-weight and Global-dampener sliders now sit inline in one row (~48% each), stacking on narrow screens; every step number and field carries a hover tooltip explaining it.

v4.44.1 June 9, 2026

Order Forecast: AI memo now prescribes the exact parameter values

  • Every AI memo ends with a new “Parameter changes to rerun” section — one line per planner field in the form Set <field> = <value> — reason (Max fwd, Budget ₹ converted via your cost %, dampeners, …). When your situation notes contradict the parameters, the memo must resolve the contradiction concretely so you can apply the values, click Apply, and regenerate to verify.

v4.44.0 June 9, 2026

Order Forecast: choose the AI model for the recommendation memo

  • New Model selector in the AI order recommendation card: Opus 4.8 (default, most capable), Opus 4.7 / 4.6, Sonnet 4.6 (faster, ~40% of Opus cost) or Haiku 4.5 (fastest & cheapest). The choice is remembered per browser and validated server-side; the memo footer states which model wrote it.

v4.43.1 June 9, 2026

Order Forecast: Reset button; AI card always visible with guided enable

  • New Reset button next to Apply — clears every parameter and returns to the default live report.
  • The AI order recommendation card (with its pre-filled situation prompt) is now always visible on the live page; the Get AI recommendation button stays disabled until the conditions are met, and the card states exactly what's missing (Order planner not applied / super-admin login).

v4.43.0 June 9, 2026

Order Forecast: combinable quick filters; planner-aware pre-close

  • Quick filters now combine — click multiple pills (e.g. Class A + PreArrival Gap). Class pills OR together; all other pills must match too. All clears.
  • Pre-close logic rebuilt for the Order planner: with the planner on, pending orders are flagged for cancellation only when supply exceeds the full lead + cover + forward horizon at the SKU's band — pending old-price stock counts as a free forward buy, so a pre-close and a planned order can never contradict each other on one SKU. Zero-demand SKUs still flag all pending pcs. The plan summary, row tints, PDF section and AI memo all use the new rule (classic rule unchanged when the planner is off).

v4.42.0 June 9, 2026

Order Forecast: snapshots now keep the AI recommendation memo

  • If an AI memo has been generated, Save current as snapshot stores it with the snapshot — making the snapshot a complete packet: parameters, frozen numbers, per-SKU reasons and the AI's written recommendation.
  • The saved memo appears on the snapshot page and in the snapshot PDF (new “AI recommendation memo” section). Requires npm run migrate:safe (new memo column).

v4.41.4 June 9, 2026

Fix: snapshot 500 when planner data overflowed storage

  • Fixed a 500 error opening saved snapshots: planner results could exceed the snapshot parameter column (64 KB), truncating the stored JSON. The column is now MEDIUMTEXT (16 MB) — run npm run migrate:safe — and snapshot pages now render gracefully even if a stored snapshot is old or damaged.
  • Snapshots saved while broken (truncated) should be deleted and re-saved after the migration.

v4.41.3 June 9, 2026

Order Forecast: more quick filters

  • New quick-filter pills: Itemwise Dampener (SKUs with a non-zero per-item dampener) and — when the Order planner is on — Class A / Class B / Class C.

v4.41.2 June 9, 2026

Order Forecast: ready-made situation notes for the AI recommendation

  • The AI order recommendation box now opens pre-filled with an editable template covering the current ordering situation — sea lead time, last order before the +20% rise, competitor forward-buying, cash/principal limits, demand outlook — plus the four questions to ask. Fill the [bracketed] blanks (cash ceiling, cost %, demand outlook) and click Get AI recommendation.

v4.41.1 June 9, 2026

Order Forecast: clearer controls — tooltips, legend, Apply vs Save

  • Every Order planner input now has a hover tooltip, and the legend explains Max fwd (mo) (blank = the economic 12 × rise ÷ carry horizon; 0 = no forward buy) and Budget ₹ (valued at selling price, not cost; trims forward buys C→B→A, never the base need).
  • Cleared up the three actions: Apply recomputes (nothing stored — settings live in the URL), the dampener button is now labelled Save dampener (stores it for every admin), and Save current as snapshot freezes results — explained at the top of Report parameters, in tooltips and in the legend.

v4.41.0 June 9, 2026

Order Forecast: Order Planner (lead time + price-rise forward buy) with AI advisor

  • New Order planner panel for situations like a long sea lead time and a last-chance buy before a price increase: set Lead time, Cover after arrival, Price rise %, Carrying %/yr, and optional Max forward months / ₹ Budget caps.
  • Per SKU it computes a Planned order with the reason why (on the ⓘ and in the PDF): ABC value class (A-class ordered at the +20% band to protect share; B/C at trend), lead + cover demand net of pipeline, and an economic forward buy (12 × rise ÷ carry months) — trimmed C→B→A when the budget binds, never cutting the base need.
  • Pre-arrival stock-out warnings: amber rows + a PreArrival Gap quick filter for SKUs that will run dry before the shipment arrives (this order can't fix those — expedite or ration).
  • The PDF gains planner parameters, the planned-order table, per-SKU reasons and the gap list; snapshots freeze planner results too.
  • AI order recommendation (super-admins): type your situation notes and get a Claude-written decision memo — executive summary, SKU-level calls, risks and actions — using the Anthropic key from Settings.

v4.40.0 June 9, 2026

Order Forecast: dampeners are now sliders with live notes

  • The Global dampener and the per-item Itemwise dampener (in the pencil modal) are now −90% … +90% sliders centered on 0 (neutral), matching the Blend-weight slider.
  • Each shows a live note that explains the choice in plain language (e.g. "+20% — Boosting every item's demand") and its impact on a SKU — the resulting Forecast Order vs neutral. Moving the Blend or Global slider updates the notes together. Saving still requires a reason and reloads.

v4.39.0 June 9, 2026

Order Forecast: blend-weight slider with live per-SKU impact

  • The Blend weight control is now a slider — drag between the 4-yr trend (left) and this year's YTD run-rate (right). It opens at the Auto position (months elapsed) with an even-50% midpoint marker, so default report numbers are unchanged until you move it.
  • A live note under the slider explains the choice in plain language and shows its impact on a chosen SKU — the monthly rate, the resulting Forecast Order, and the full range (4-yr trend ↔ YTD-only) — so you can judge the right level before applying.
  • Pick the preview SKU from a type-ahead box (defaults to 10479339) or by clicking any SKU in the table. The table, PDF and snapshots still recompute on Apply.

v4.38.3 June 9, 2026

Admin sidebar: matched the toggle & flyout accents to the new navy

  • Re-tinted the collapse toggle and the collapsed hover-flyout into the same rich deep-blue family so they no longer look grayish against the v4.38.2 navy.

v4.38.2 June 9, 2026

Admin sidebar: richer, deeper navy

  • Deepened the admin sidebar to a richer, more saturated navy blue — the v4.38.1 shade read as faded.

v4.38.1 June 9, 2026

Order Forecast access & layout polish; brighter admin sidebar

  • Sales history (won business) upload is now super-admin only — the panel is hidden for other admins and the upload/import endpoints are restricted server-side.
  • Legend & method is now a click-to-expand panel (collapsed by default) to reduce clutter.
  • Moved Saved snapshots below Legend & method.
  • Admin sidebar refreshed to a brighter navy with brighter text, and fixed the version label in the collapsed sidebar (it previously showed a stray doubled “v”).

v4.38.0 June 9, 2026

Order Forecast: whole-number rate, quick filters, hide-column toggles, cleaner default

  • Forecasted Qty/mo now shows as a whole number.
  • Renamed “Order Trend” → “Forecast Order”, and added “Hide Order +20%” / “Hide Order −10%” toggles (on by default) — so the table and PDF show just the Forecast Order column unless you want the up/down scenarios.
  • Quick-filter pills above the table: All · PreClose (over-ordered rows) · Forecast Order (rows that need an order).
  • Moved the Download PDF button next to Export CSV.

v4.37.0 June 9, 2026

AI Chat Widget: show only to logged-in visitors

  • New Settings → Integrations → AI Chat Widget option “Show only to logged-in visitors” (enabled by default). When on, the chat widget appears only to signed-in customers on public and customer-portal pages; turn it off to show it to everyone.

v4.36.0 June 9, 2026

Smarter default language for first-time Indian visitors

  • A first-time visitor detected in India now sees the site in: (1) their browser's language if it's a supported Indian language, else (2) their state's language (GeoIP — Tamil Nadu → Tamil, West Bengal → Bengali, Karnataka → Kannada, …), else (3) the admin “Default language for Indian visitors” fallback (Hindi). Previously every Indian visitor got the single admin default.

v4.35.1 June 9, 2026

Admin: deep-navy sidebar; Legacy section removed

  • The admin sidebar is now deep navy with white text and links (was light blue).
  • Removed the deprecated “Old Modules” (Legacy → Customer Accounts) navigation section.

v4.35.0 June 9, 2026

Order Forecast: flags over-ordered SKUs & recommends pre-closing pending orders

  • SKUs where ATP + On Order exceeds the +20% (High) demand are now flagged — the row is shaded pink and the On Order cell shows how many pending pieces to cancel / pre-close (computed against the current parameters and dampeners).
  • The downloaded PDF gains a “Pending orders to pre-close” summary section listing those SKUs and the quantity to cancel, with totals.

v4.34.0 June 9, 2026

Order Forecast: “Hide SKU” toggle

  • New “Hide SKU” toggle (on by default, remembered per browser) drops the SKU column — the part number is already the prefix of each Product name — to declutter the report. It applies to both the on-screen table and the downloaded PDF; switch it off to show SKU again.

v4.33.2 June 9, 2026

Order Forecast: clearer column names and parameter guidance

  • Renamed two columns for clarity — “Mo. rate” → “Forecasted Qty/mo” and “Adj%” → “Itemwise Dampener” (on screen, in the legend, and in the CSV & PDF exports).
  • The legend now spells out the difference between Blend weight (which data to trust — a weighting, not a boost) and the dampeners (deliberate boosts/cuts that multiply the result; Global and Itemwise compound).

v4.33.1 June 9, 2026

Forecast PDF: parameters block, explanations, and easier-to-read tables

  • The PDF now lists the parameters used (cover months, current-FY months elapsed, blend weight, global dampener) with a one-line plain explanation of each, right under the title.
  • Alternating row shading and a distinct header-row background make the table easier to scan and the header easy to spot on every page.

v4.33.0 June 9, 2026

Order Forecast: downloadable PDF, grouped controls, legends, tutorial & snapshot notes

  • Download PDF — the report is now generated on the server as a landscape PDF with repeating column headers, the order summary on its own page, and an exact “Page X of Y” footer that works in every browser (replaces the browser-print button).
  • Report parameters — Cover months, Current-FY months elapsed, Blend weight and the Global dampener are grouped into one panel directly above the table.
  • Legend & method — the explanation is split into clear groups: every Column, every Parameter, the Order scenarios, and the calculation Method & notes.
  • How-to tutorial — a collapsible “How to use this report” guide walks through setting each parameter before generating.
  • Snapshot notes — saving a snapshot now takes a name and an optional note, shown with the full save date & time; each snapshot can be deleted.

v4.32.0 June 9, 2026

Order Forecast: fit-to-width, print/PDF, and saved snapshots

  • Fit to width — a toggle (on by default, remembered) that fits the whole table on screen by wrapping long product names instead of scrolling sideways.
  • Print / Save as PDF — a clean landscape-A4 layout, sorted by SKU, with light borders and a repeating header, ending in an "order to be placed" summary of Trend quantities.
  • Saved snapshots — freeze the current parameters and results under a name, then reopen any saved version (read-only) to present quickly. Snapshots are shared across admins.

v4.31.0 June 9, 2026

Order Forecast v2: multi-year + rolling current FY + manual dampener

  • The forecast now uses up to four completed years with a recency-weighted trend, and blends in the current FY's run-rate (weighted by how far into the year you are), covering the rest of this financial year.
  • New manual dampener — a signed % with a required reason, set per-item or globally, for trends not visible in the history. Applied to demand and recorded with who/when.
  • Method cross-checked against demand-planning practice (rolling "3+9" forecasts, combination forecasting, forecast value added). FY periods are computed in IST.

v4.30.1 June 9, 2026

Order Forecast: fix clipped right-hand column

  • The forecast table now scrolls horizontally, so the rightmost Order +20% column is reachable on narrower screens instead of being cut off.

v4.30.0 June 9, 2026

Order Forecast: sales-history import + recommended-order report

  • New Order Forecast admin page. Upload your itemwise won-business CSVs (per financial year) and get a recommended order quantity per item under Low (−10%), Trend, and High (+20%) demand scenarios.
  • Demand is trend-extrapolated from the two latest years (capped 0.5×–2.0×), prorated over a configurable months-of-cover, and netted against current ATP + On-Order. The page explains every step, and the table exports to CSV.

v4.29.0 June 9, 2026

Stock: inline Edit Stock editor for super-admins

  • The Stock & Inventory table now has an Edit column (super-admin only) — a pencil opens a modal to set each warehouse's quantity and adjust Hard, Soft and On-Order for that SKU.
  • Warehouse quantities are set directly; Hard / Soft / On-Order are recorded as manual adjustment entries (a quote/PO change can still move the live total on top of the manual value). Every change is written to the stock audit log.

v4.28.1 June 9, 2026

Auto-translate checkbox now off by default on admin forms

  • The “Auto-translate to all languages on save” checkbox is now unchecked by default on every admin add/edit form (products, series, pages, FAQs, articles, knowledge base, industries, equipment, nav). Saves no longer fire a full 10-language re-translation unless you deliberately tick it.
  • Unchecked behaviour: blank Hindi fields are still filled from English, and existing manual / reviewed translations are preserved (not overwritten). Tick the box to (re)generate all 9 other Indic languages or to force-refresh Hindi.

v4.28.0 June 9, 2026

Error alerts: batch bot/scanner 404s into a daily digest

  • 404s from bots and vulnerability scanners (no referer, external referer, or scanner paths like /wp-login.php) are no longer emailed one-by-one. They're stored and summarised in a single digest sent about once every 24 hours.
  • 404s that come from a broken link within the site (an internal referer) are still emailed immediately, since those indicate a real problem.
  • 403 and 500 alerts are unchanged. New not_found_log table backs the digest; tunable via ERR_404_DIGEST_HOURS / ERR_404_RETENTION_DAYS.

v4.27.2 June 9, 2026

Stock audit log: net-by-Zoho-Ref summary

  • The stock audit-log popup now opens with a Net by Zoho Ref summary: each quote/invoice reference's deltas are netted over the SKU's full history for that field, so a reference that reserved then released stock cancels out and is hidden. Shows Ref, Company and Net for the references that currently contribute.
  • Widened the popup so the detail columns (including Company and Notes) fit without horizontal scrolling.

v4.27.1 June 9, 2026

Stock page: Tally CSV format help + tidier table

  • The Import from Tally Prime card now documents the expected CSV format — the positional Reorder Status columns (SKU, Closing Stock → DEL, Purchase Pending → On Order, Sales Orders Due → Hard) with a sample row.
  • Removed the redundant Listing column from the stock table (listing state is still shown in the Status column and via the Listed / Discontinued quick filters).

v4.27.0 June 9, 2026

Warehouse stock: upload & import from the admin Stock page

  • New Import warehouse stock card on /admin/stock: pick a warehouse, upload a CSV/TSV, preview the current → new quantities (and which SKUs would be zeroed), then confirm — no more SCP + CLI.
  • Replace mode (default on) makes the file the complete current truth: SKUs absent from the file are set to 0. Reactivate (default on) re-activates products that now have stock.
  • Every change is recorded in the stock audit log (source: Tally Import). The expected CSV format is shown on the page.
  • The CLI (scripts/import-inventory.js) and the web upload now share one import library.

v4.26.2 June 8, 2026

Stock audit log: show the quote's company name

  • The stock audit log now carries a Company column, resolving each Zoho-sourced entry to the account (company) name on the linked quote or invoice. Visible in the stock-page log popup, the Zoho sync-detail popup, and the full /admin/stock-log page.
  • Entries with no linked Zoho record (e.g. Tally imports, manual adjustments) show —.

v4.26.1 June 5, 2026

Fix: Zoho "Connect" lost the admin session on the OAuth callback

  • Connecting Zoho CRM from /admin/portal failed after authenticating: the redirect back from Zoho landed without a session, so the connection never saved. Cause was the session cookie's SameSite=Strict attribute, which the browser withholds on the cross-site redirect back from an OAuth provider.
  • Changed the session cookie to SameSite=Lax — it now survives the OAuth redirect-back (and legitimate inbound links to /admin) while still blocking cross-site POSTs, so CSRF protection for state-changing actions is preserved.

v4.26.0 June 5, 2026

Quote-Ready email: one-shot trigger + revision labelling

  • The customer "Quote Ready" email no longer re-fires on every edit to a quote. After a successful send, the portal now clears the Portal_Send_Quote checkbox in Zoho CRM, so the box behaves as a deliberate one-shot trigger — staff re-tick it when a revised quote is ready to send.
  • Re-sent quotes are now clearly labelled as revisions: the subject reads "Revised Quotation (Revision N, <date> IST) — …" and the email carries a banner noting it supersedes the previous version. Recipients can tell a genuine update from a duplicate. The first email is unchanged.
  • Revision date/time is shown in IST (Asia/Kolkata) regardless of server timezone.
  • Safety net: if clearing the Zoho checkbox fails, the auto-send is suppressed (and logged) on the next edit rather than risk re-spamming the customer; staff can still send via the manual Retry button.
  • New quote_send_state table tracks the per-quote revision counter and last-clear status.

v4.25.5 June 4, 2026

OpenReplay: inline CSS for accurate replay rendering

  • Added inlineCss: 3 so session replays capture computed styles and render correctly even when stylesheets aren't reachable by the player

v4.25.4 June 4, 2026

OpenReplay: label portal sessions with the customer name

  • Logged-in portal replays now carry the customer's name as metadata, alongside the existing email (session user ID) and company

v4.25.3 June 4, 2026

OpenReplay: record sessions without masking

  • Turned off numeric, email, and input-value obscuring so part numbers, ratings, specifications, on-page emails, and form inputs all appear as entered in session replays

v4.25.2 June 4, 2026

Fix: OpenReplay session replay now records

  • Corrected the OpenReplay loader snippet, which was mangled and never started the recorder — no sessions were reaching the dashboard
  • Now loads the tracker (openreplay.js) instead of the live-assist add-on, with the loader arguments in the correct order, pinned to the self-hosted backend version

v4.25.1 June 4, 2026

Fix: portal quote and invoice amounts now show correct currency

  • Quote and invoice detail pages now render USD amounts as USD 1,234.56 instead of incorrectly applying the ₹ symbol to non-INR quotes
  • Currency is read from the Zoho record's Currency field; defaults to INR when absent

v4.25.0 June 4, 2026

Portal RFQ form redesigned — reference no., per-item delivery, quote validity

  • Compact two-column layout (Items + Quote details | Notes + Attachments) reduces scrolling while adding more fields
  • New Reference No. field (SAP / ERP / PO ref) flows into the Zoho Deal name and quote PO field so customers can reconcile against their system
  • Per-item Required delivery select (Immediate … 180+ days) flows into the Zoho quoted-item description
  • New Quote Validity required field (7 days … 12 months) sets the Zoho quote Validity and Valid Till date
  • Urgency of Quote reworded to Standard / Priority / Urgent for clarity
  • Attachments now accept zip files and images in addition to PDFs and spreadsheets, up to 5 files per request

v4.24.0 June 4, 2026

Switchable session-replay provider (LogRocket / Microsoft Clarity / OpenReplay)

  • Admins can now choose the front-end session-replay provider in Settings → Integrations: LogRocket, Microsoft Clarity (free, unlimited), OpenReplay, or Off
  • Each provider's key is entered under Encrypted API Keys; the active provider's snippet loads on the public site and customer portal, with admin pages excluded
  • Portal sessions are tagged with the customer's email and company on all three providers, so a specific customer's replay can be found

v4.23.2 June 4, 2026

Fix: website enquiry now fills the Zoho Lead's billing & delivery address

  • New Leads created from the website enquiry form had blank address fields — the entered/registered address was never sent to Zoho. They are now populated
  • For GST-verified enquiries the billing address is driven by the GSTIN's registered address: Street, State, PIN and Country are filled from the verified GST record (the GST API returns the street as a single line, so City is left for manual entry)
  • Delivery address is copied from billing when "same as billing" is ticked, otherwise the entered delivery address is saved to the Lead's delivery fields

v4.23.1 June 4, 2026

Fix: portal RFQ → Zoho quote (addresses, line discounts, premature email)

  • Auto-generated quotes now copy the Account's Billing and Shipping address (Street, City, State, PIN, Country) onto the quote; Shipping falls back to Billing when blank
  • Each line item's Discount is now computed as 27% of its amount (unit price × qty) and the net total reflects it — previously the per-line discount was left at zero
  • The customer "Quote Ready" email no longer fires when the quote is first created as a Draft; it now sends only once the quote is marked Quoted with "Send to Portal" enabled in Zoho

v4.23.0 June 4, 2026

Email Log: per-open history with IP, date/time, and device

  • The Email Log's Opened column now records each real (non-proxy) open as a separate event — showing the recipient's IP address, the date and time, and the device — up to 5 opens per email
  • Mail-provider image proxies (Gmail, Apple, Outlook) are still counted but clearly labelled as proxy opens, so a proxy fetch is never mistaken for the recipient's own IP
  • Open timestamps now include the time of day, not just the date

v4.22.6 June 1, 2026

Admin: diagnostic columns on the portal Invite page

  • Invite search results now show the Zoho Contact ID, contact Owner, and Portal Status (invitation status + last login) for each contact
  • Makes duplicate Zoho contacts that share an email distinguishable — two rows with different Contact IDs are separate Zoho records (consider merging in Zoho), and the Portal Status (matched by Contact ID) shows exactly which one owns the portal account

v4.22.5 June 1, 2026

Colour-coded invoice Status & quote Stage badges

  • Invoice Status and quote Stage badges are now colour-coded across the portal (dashboard, quotes list, invoices list): green for won/paid/confirmed states, blue for active/in-flight states, amber for pending/draft, red for overdue and all "Lost" outcomes, grey for cancelled/expired
  • Fixed the status CSS-class slug so punctuated values (e.g. "Quoted - Rate Contract", "Deferred (Review later)") map to valid, styleable classes

v4.22.4 May 30, 2026

Colour-coded warranty claim Status badges

  • Warranty claim Status is now colour-coded across the portal (claim detail, warranty list, and dashboard): green for Resolved/Settled/Accepted, red for Rejected, blue for New/Closed, amber for in-progress/awaiting states, purple for "Rejected (Accepted on Goodwill basis)"
  • Fixed the status CSS-class slug so multi-word and punctuated Zoho statuses (e.g. "Rejected (Accepted on Goodwill basis)") map to valid, styleable classes

v4.22.3 May 30, 2026

Fix: warranty "Warranty Applicable" now shows the real Zoho value

  • The "Warranty Applicable" field on the portal warranty detail page showed "Pending" for any value other than the literal "Yes"/"No" — so Zoho picklist values like "Applicable" / "Not Applicable" never displayed
  • Now shows the actual Zoho CRM Cases Warranty_Applicable value verbatim, colour-coded (green for Applicable/Yes, red for Not Applicable/No), and "Pending" only when the field is blank

v4.22.2 May 30, 2026

SEO: add shippingRate to product structured data

  • Added the shippingRate field to product merchant-listing JSON-LD (inside offers.shippingDetails), clearing the Google Search Console "Missing field 'shippingRate'" enhancement warning
  • Declared as free shipping within India (₹0) — actual freight continues to be quoted per order

v4.22.1 May 30, 2026

Fix: magic-login & Quote-Ready links reported "already used or expired"

  • Login links in the magic-login and "Quote is Ready" emails were being consumed by automated email security scanners (Microsoft SafeLinks, Mimecast, Proofpoint) before the customer clicked, causing a false "already used or expired" error on a never-clicked link
  • Clicking a login link now opens a quick confirmation page; the one-time token is only consumed when you click "Log in to continue", so automated scanners can no longer burn it
  • Magic-login links are no longer routed through the click-tracking redirect, so they appear as direct, trusted links

v4.22.0 May 30, 2026

Send quote by email from the portal

  • New "Send Quote Email" button on the portal quote detail page, inline with "Download PDF"
  • Emails the quote PDF as an attachment to the quote's Zoho contact, falling back to the logged-in user's email if the contact has no email on file
  • Uses a plain portal link (no auto-login token) so the quote can be safely sent to the contact
  • Success and error confirmation shown on the page after sending

v4.21.3 May 29, 2026

Requirements form UX improvements

  • Continue button disabled until at least one part number is entered
  • Matched part numbers now lock to read-only with full product details (SKU — Name — Brand — Series — Voltage) and a "Change" link to re-search
  • Increased input font size across all wizard steps for better readability
  • Simplified step labels: "Verify Email" → "Email", "Verify Mobile" → "Mobile"
  • Quote PDF now attached to "Quote is Ready" email for direct viewing without portal login

v4.21.2 May 29, 2026

Feedback improvements

  • Added "Overall Experience" as the primary feedback question — recorded immediately when a star is clicked in the email, even without full form submission
  • Fixed invoice number and PO date mapping from Zoho CRM — scanner now fetches correct Invoice_No and PO data from linked Quotes
  • Fixed form field name mismatches that prevented feedback form submission
  • Null PO dates (0000-00-00) are now hidden instead of displayed

v4.21.1 May 29, 2026

Webhook audit log & feedback queue admin

  • Full webhook audit log — every incoming webhook call is logged with status (success, skipped, auth failed, error), payload, and IP address
  • Feedback queue admin view — see all pending, sent, completed, and skipped feedback requests with status filters
  • Both views accessible from the Feedback Dashboard in the admin panel

v4.21.0 May 28, 2026

Customer feedback & rating system

  • Post-invoice feedback collection — 30 days after payment, customers receive an email with one-click star ratings and a link to a structured 8-question feedback form
  • Token-authenticated feedback form — no portal login required; customers click a star in the email and land directly on the form
  • Admin feedback dashboard with KPI summary cards (quality, delivery, accuracy, NPS, reorder intent), moderation controls (approve/reject for public display), and Excel export
  • Principal report view with product quality by series, fitment issues, NPS trends, and delivery performance — designed for sharing with BorgWarner
  • Approved reviews displayed on product detail pages with Google structured data (aggregateRating + review) — resolves Search Console warnings
  • Zoho CRM integration — feedback synced as Notes on Account records for sales team visibility
  • Portal integration — customers can view pending and past feedback from their portal dashboard

v4.20.2 May 28, 2026

Dynamic XML sitemap

  • Added dynamic /sitemap.xml endpoint — auto-generates a complete sitemap from the database including all products, product series, categories, knowledge base articles and documents, blog articles, and static pages
  • Cached for 1 hour to avoid repeated DB queries on crawler hits
  • Includes lastmod dates from database updated_at timestamps, per-URL changefreq and priority

v4.20.1 May 28, 2026

Google Search Console structured data fixes

  • Added hasMerchantReturnPolicy to product structured data — returns not permitted (transit damage, incorrect supply, and warranty claims handled separately)
  • Added shippingDetails with per-product delivery time based on stock lead time, shipping to India
  • Fixed breadcrumb structured data to use new pretty category URLs

v4.20.0 May 27, 2026

Pretty URLs

  • Product catalog now uses clean path-based URLs: /products/category/starter-motors, /products/search/8200433, /products/category/alternator-units/page/2
  • Knowledge base tabs and category filters now use path segments: /knowledge-base/articles, /knowledge-base/documents/category/Guides
  • All legacy query-string URLs (/products?cat=, /knowledge-base?tab=) automatically 301-redirect to their pretty equivalents — existing bookmarks, search engine links, and shared URLs continue to work
  • Refinement filters (voltage, stock status) remain as query parameters per industry convention

v4.19.2 May 27, 2026

Security hardening — deep audit

  • Atomic magic link token consumption — prevents race-condition double-use of tokens
  • Added X-Content-Type-Options: nosniff and Cache-Control: private, no-cache headers to all portal file downloads (quotes, invoices, warranty PDFs and attachments)
  • Clamped magic link expiry to 5–1440 minutes to prevent misconfigured zero or extreme values
  • Multi-account switch now re-validates against the database instead of relying on stale session cache
  • Added randomised response delay on failed portal login to prevent timing-based user enumeration
  • Added Permissions-Policy header restricting geolocation, camera, microphone, payment, and USB APIs
  • Enabled HSTS preload flag for inclusion in browser preload lists
  • Tightened session cookie SameSite from Lax to Strict

v4.19.1 May 27, 2026

Portal security hardening

  • Added CSRF validation to /portal/switch-account and /portal/warranty/:id/edit
  • Added rate limiting (10 per 15 min per IP) to the magic link verification endpoint /portal/verify
  • Sanitized error messages on warranty submission, warranty upload, and account edit — internal details no longer exposed to clients
  • Hardened open redirect protection on magic link redirect_url — now blocks //, .., and non-alphanumeric path starts
  • Added rate limiting (30 per min per IP) to public APIs: part search, compatibility, KB search, categories, and GST lookup

v4.19.0 May 27, 2026

Just-in-time portal user provisioning

  • Customers who receive a Quote Ready email from Zoho CRM are now auto-provisioned a portal account — no more manual admin invite required for quote recipients to access their quotes
  • Portal login now auto-creates accounts for Zoho contacts who have at least one Quote — if a customer enters their email and they exist in Zoho CRM with quotes, they are provisioned and sent a magic link automatically
  • Both JIT paths create the user as invited with role buyer; clicking the magic link activates their account

v4.18.0 May 27, 2026

Magic link for CRM quotes + resend from Email Log

  • CRM-originated quotes (not linked to a portal RFQ) now look up the portal user by email before sending — magic link auto-login works for all Quote Ready emails, not just portal RFQ ones
  • Added reference_id column to email_log — Quote Ready emails now store the Zoho Quote ID for traceability and resend
  • New "Resend" button on Email Log page for quote_ready emails — one-click resend if quote ID is stored, or paste a Zoho Quote ID for older emails missing it

v4.17.4 May 27, 2026

Fix magic link in Quote Ready emails

  • Added missing redirect_url column to portal_magic_links in canonical schema — the column existed via seed migration but was absent from schema.sql, causing the magic link INSERT to fail silently and emails to send without auto-login
  • Upgraded silent fallback to CRITICAL-level logging with portalUserId, quoteId, and full stack trace so future failures are immediately visible in server logs

v4.17.3 May 27, 2026

GST verify button

  • Added an explicit "Verify" button next to the GST number field on the quotation request form (Step 4) — consistent with the email and mobile verification steps, reducing user confusion

v4.17.2 May 27, 2026

About page translations

  • Translated all hardcoded English text on the About page — body paragraphs, feature cards, testimonials, certificates, registrations, and button labels (36 new keys across 11 languages)

v4.17.1 May 27, 2026

Fix Redis session store race condition

  • Session store now awaits the Redis connection (up to 3 s) before choosing between Redis and MySQL — previously the synchronous check always fell back to MySQL because Redis connects asynchronously
  • Fixed admin password being overwritten on every migrate:safe run — seed now uses a no-op ON DUPLICATE KEY UPDATE

v4.17.0 May 26, 2026

Magic link improvements + button label update

  • Configurable magic link expiry — admin Security tab now has a setting to increase the default 15-minute login link validity (up to 24 hours) for customers with delayed email delivery
  • Quote Ready emails now embed a magic link that auto-logs in the customer and redirects them directly to the quote page — no separate login step needed
  • Open redirect protection: magic link redirect_url is validated to only allow /portal/* paths
  • Changed enquiry button label from "+ RFQ" to "+ Add" across all locales (11 languages)

v4.16.4 May 26, 2026

CRM image sync fixes + SEO title improvement

  • Always save downloaded CRM photos as .jpg regardless of source content type — fixes images not displaying when Zoho returns PNG
  • Added standalone scripts/sync-crm-images.js for running image sync via SSH (survives Passenger worker restarts)
  • Product page title now includes brand: Delco Remy 8600467 28SI Alternator | New Indo

v4.16.3 May 26, 2026

Fix CRM image sync

  • Strip zcrm_ prefix from record IDs before calling Zoho photo API — was causing 404 on every product
  • Made progress box fixed-position (bottom-center) so it's visible regardless of scroll position

v4.16.1 May 26, 2026

Fix CRM image sync progress

  • Replaced SSE streaming with fire-and-forget background execution — resolves progress bar not updating under Passenger/cPanel proxy
  • Progress now tracked entirely via polling (2s interval), which works reliably regardless of proxy buffering

v4.16.0 May 26, 2026

CRM image sync

  • New "Sync CRM Images" button on Products page — pulls product photos from Zoho CRM for active Delco Remy products that are missing images
  • Downloads record photos and saves as the default angle image (_ANG)
  • Real-time progress tracking, 700ms throttle between Zoho API calls
  • Badge shows count of products eligible for image sync

v4.15.3 May 26, 2026

OEM sync filter controls

  • Added Active / Inactive / All filter buttons to bulk OEM sync
  • Preview panel shows count and top 10 SKUs before sync starts
  • User confirmation required with estimated time before bulk sync proceeds

v4.15.2 May 26, 2026

OEM sync resilience + monitoring

  • Sync now checks all Delco Remy products with active OEM status (not just site-inactive ones)
  • Added 500ms throttle between products to avoid rate-limiting by the Delco Remy site
  • Added 30-second per-iteration timeout — skips and logs if any single product hangs
  • Sync continues server-side even if browser connection drops — progress tracked in memory
  • Added GET /admin/products/sync-oem-status/status polling endpoint for reconnect
  • Frontend auto-detects running sync on page load and falls back to polling if SSE drops
  • Double-start prevention — rejects new sync while one is in progress
  • Pending sync count shown as badge on Sync button and inside dropdown

v4.15.1 May 26, 2026

File logger

  • Added lib/logger.js — tees all console.log/error output to ~/logs/app.log with timestamps
  • Auto-creates ~/logs/ directory on startup

v4.15.0 May 26, 2026

OEM sync: single-product mode + console logging

  • Added dropdown to sync a single product by SKU, or sync all active products
  • Added server-side console.log progress counters for OEM sync (start, errors, updates, done summary)

v4.14.2 May 26, 2026

Fix OEM sync parser + SKU edit URL

  • Fixed: Delco Remy page parser now correctly extracts Superseded By, Replacement Options, and Upgrade Options SKUs by walking up the DOM tree from section labels to find product links.
  • Fixed: Product edit URL with numeric SKU (e.g. /admin/products/edit/10459009) now correctly falls back to SKU lookup when no product with that numeric ID exists.

v4.14.1 May 26, 2026

Fix SKU-based product edit URL

  • Fixed: Product edit URL with numeric SKU (e.g. /admin/products/edit/10459009) now correctly falls back to SKU lookup when no product with that numeric ID exists.

v4.14.0 May 26, 2026

Delco Remy OEM Status Sync

  • New: "Sync OEM Status" button on Products page fetches live status from delcoremy.com for all inactive Delco Remy products with oem_status = active. Updates oem_status to match the OEM site (obsolete, discontinued, superseded).
  • New: Automatically adds cross-references when a product is found obsolete — superseded-by SKUs get an "Old Part Number" ref, replacement and upgrade option SKUs get "Replacement Option" and "Upgrade Option" refs respectively.
  • New: Added "Replacement Option" and "Upgrade Option" as cross-reference types in the product edit form.
  • New: OEM Status badge color coding — green for current, red for obsolete, blue for private_label.
  • Changed: Products table now shows OEM Status and Active columns instead of Voltage and Output.
  • Changed: Product edit URL now accepts SKU in addition to numeric ID.
  • New: Real-time SSE progress indicator during OEM sync.

v4.13.5 May 26, 2026

Fix listing page lead time display

  • Fixed: Product cards on listing, series, and search pages showed the product-level lead time (60 days) instead of the actual warehouse lead time when stock was available. Now uses the minimum active warehouse lead time.

v4.13.4 May 26, 2026

Product form tab reorganisation

  • Moved: Cross-References section from Technical tab to CRM tab for better grouping with imported data.
  • Moved: Auto-translate checkbox from CRM tab to Core tab sidebar for quicker access.
  • Improved: Core tab sidebar now flexes to use available width instead of a fixed 260px.

v4.13.3 May 26, 2026

Warehouse lead time UI

  • Added: Lead Time column to the admin Warehouses page, editable inline for both existing and new warehouses.

v4.13.2 May 26, 2026

Per-warehouse lead times

  • Warehouse-level lead time: In-stock lead time is now configured per warehouse (via lead_time_days on the warehouses table) instead of being hardcoded. When a product has stock in multiple warehouses, the shortest lead time is used.
  • Removed: Product-level “Lead Time (days) — when in stock” field from the admin product form. The product column remains as a fallback for products without warehouse stock data.

v4.13.1 May 26, 2026

Remove legacy stock_positions table usage

  • Cleanup: Removed all references to the legacy stock_positions table from public routes, admin routes, seed data, and export scripts. Stock data now comes exclusively from the multi-warehouse product_stock system and product-level fields (total_stock, lead_time_days).
  • Removed: Legacy single-location stock card from the product form, the admin stock page POST handler for stock_positions, and seed data for the table.

v4.13.0 May 26, 2026

Auto-computed listing status & hidden status removal

  • Auto-computed listing statuslisting_status is now derived automatically from stock level and OEM status whenever stock changes. In-stock products are “Available,” zero-stock with an active OEM status are “Catalogue Only” (orderable with lead time), and zero-stock obsolete/discontinued/superseded/private-label products are “Discontinued.” The field is no longer manually editable; it displays as a read-only badge on the product form.
  • Removed “hidden” listing status — the hidden value has been eliminated. Products that should not appear on the public site should use the Active checkbox (master on/off switch) instead.
  • Excel import & bulk editlisting_status is no longer importable via Excel or editable through the Bulk Manager. After import, recalcStockBatch runs to set listing status correctly for all affected products.
  • Quote cart hardening — the price-refresh query in the RFQ cart now filters on active = 1, preventing inactive products from persisting in the cart.
  • Updated admin labels — Active checkbox, OEM Status, and Listing Status legend hints on the product form now clearly describe their roles and the auto-compute logic.

v4.12.3 May 26, 2026

Admin product form — unified status sidebar & RFQ cart fix

  • Product Status sidebar — Active checkbox, OEM Status, and Listing Status are now grouped together in a sticky right-column panel on the Core tab, making status inconsistencies easier to spot. Removed the duplicate fields from the Logistics tab.
  • RFQ cart fix — restored the active = 1 guard on the /quote/add route that was accidentally removed. Inactive products are correctly rejected again; the underlying data inconsistency (products with Active unchecked despite OEM and Listing statuses being Active) should be fixed via the admin panel or a bulk SQL update.

v4.12.2 May 25, 2026

Product catalog card layout — full-width RFQ button

  • Catalog cards — the “+ RFQ” button on product listing cards now sits in its own full-width footer row with a top border, matching the service-parts card layout. Lead-time badge remains above.

v4.12.1 May 25, 2026

Fix missed RFQ buttons on service parts & compatibility page

  • Service parts grid — the “+ Enquiry” buttons on service-part cards (product detail page) now use the stock-colored .enquiry-add-btn style, read “+ RFQ,” and toggle via AJAX (add/remove) instead of redirecting with a form POST — matching the behaviour of all other RFQ buttons on the site.
  • Compatibility checker — the add-to-enquiry button in compatibility search results now reads “+ RFQ” instead of “+ Enquiry.”

v4.12.0 May 25, 2026

RFQ button redesign & product detail cleanup

  • Stock-colored RFQ buttons — the “+ RFQ” button on product listing cards and the product detail page now uses colour to signal stock status: green for in-stock, amber for limited/allocation, and brown for made-to-order items. Buttons are larger, filled, and more visible.
  • Unified label — all enquiry buttons across the site now consistently read “+ RFQ” instead of mixing “Enquiry” and “RFQ.”
  • Product detail sidebar cleanup — removed the “Add to Enquiry” form and “Send Requirements Instead” button from the right column, which were buried below the fold and rarely used. The primary RFQ action in the price card is now full-width and prominent.

v4.11.1 May 25, 2026

Fix email open/click tracking for CC’d emails

  • Separate CC delivery — emails with CC recipients (e.g. account managers) are now sent as two separate messages: a tracked copy to the client and an untracked copy to staff. This ensures open/click metrics reflect client engagement only, not internal staff activity.

v4.11.0 May 25, 2026

Content protection & hotlink prevention

  • Right-click disable — separate admin toggles for public pages and customer portal. When enabled, the browser context menu is suppressed sitewide to deter casual content copying.
  • Asset hotlink guard — new middleware blocks external sites from embedding product images or linking directly to KB documents. Product images allow empty referer (preserving Google Images / SEO). KB downloads require either a same-origin referer or a signed URL.
  • Signed URLs for KB documents — download links for knowledge-base files now use HMAC-SHA256 signed tokens with 15-minute expiry, preventing link sharing outside the site.
  • Admin settings — three new toggles under Settings → Security → Content Protection: disable right-click (public), disable right-click (portal), and enable asset protection.

v4.10.0 May 25, 2026

Unregistered portal login tracking

  • Login attempt logging — magic-link login requests from unregistered email addresses are now logged to a new portal_login_attempts table with email, IP, and user agent.
  • Admin email alert — an immediate email notification is sent to admin when an unregistered email attempts to log in.
  • Dashboard attention card — the Needs Attention panel on the admin dashboard now shows a count of unregistered login attempts in the last 7 days.
  • Dedicated admin page — new Reports → Access Attempts page with full log, email/date filters, pagination, and a “Top Repeat Emails” summary of frequent offenders.

v4.9.6 May 25, 2026

Portal quote Brand column fix

  • Brand from local DB — the Brand column on the portal quote detail page now looks up the product brand from the local database by SKU, instead of relying on the Zoho API’s Manufacturer field which is not included in quote line item lookups.

v4.9.5 May 25, 2026

Quote Ready email for non-portal quotes

  • Direct quote notification — quotes created directly in Zoho CRM (not through the portal RFQ flow) now trigger the “Quote Ready” email to the linked contact when Portal_Send_Quote is checked and the quote stage reaches “Quoted”. The contact’s email is fetched from Zoho CRM and the contact owner is CC’d.

v4.9.4 May 25, 2026

Portal quote table aligned with PDF

  • Quoted Items columns — the line items table on the portal quote detail page now matches the PDF layout: #, Product, Brand, Qty, Price/Unit, Tax, Net Total. Brand is sourced from the Zoho product’s Manufacturer field and Price/Unit from Basic_PC, replacing the previous List Price and Discount columns.

v4.9.3 May 25, 2026

Quote Ready email gated by Zoho Portal_Send_Quote

  • Portal_Send_Quote check — the “Quote Ready” email is now only sent to the customer if the Portal_Send_Quote checkbox is enabled on the Zoho CRM Quote record. This applies to all three trigger points: Zoho webhook, admin “Push to Zoho”, and admin “Send Quote Email” retry button. When the field is unchecked, admin users see a flash message explaining why the email was skipped.

v4.9.2 May 24, 2026

Stock sync edge case hardening

  • Auto-expiry audit trail — the periodic soft reservation expiry job now logs each expired reservation to the stock audit log with safe-decrement accounting, so admins can see exactly when and why reservations were released.
  • Won stage no-op logging — when a quote jumps directly to Won (skipping the soft stage), the stock log now records that no soft reservation was found to convert.
  • Unresolved SKU warnings — when a Zoho Quote or Invoice contains product codes that don’t exist on the portal, the system now logs a console warning identifying each skipped SKU.
  • Invoice no-line-items sync record — when an Invoice webhook is skipped because no line items could be resolved, a sync error record is now created (matching the Quote handler behaviour).
  • Duplicate webhook guard — rapid-fire duplicate Quote webhooks for the same stage are now suppressed if the same stage was processed within 60 seconds, preventing duplicate reservations.

v4.9.1 May 24, 2026

Webhook audit logging for no-op scenarios

  • Audit trail for release no-ops — when a Zoho Quote webhook fires for a release stage (Expired, Lost, Cancelled, etc.) but no soft reservation exists to release, the stock log now records an informational entry per product explaining that the webhook fired and why no action was taken.
  • Sync record for skipped webhooks — when a Quote webhook is skipped because no line items could be resolved, a sync error record is now created so the admin can see the webhook was received.

v4.9.0 May 23, 2026

Zoho webhook “Quote Ready” notification

  • Auto-notify on Quoted stage — when a Zoho CRM Quote reaches the “Quoted” stage and the stock-sync webhook fires, the matching portal RFQ is now automatically marked as “Quoted” and a “Quote Ready” email is sent to the customer. The contact owner is CC’d when available. This is best-effort and does not affect stock sync processing if anything fails.

v4.8.3 May 23, 2026

Fix bulk image assignment and preserve filters

  • Fix image assignment — assigning a library image via the Bulk Product Manager now stores the full image URL. Previously the file extension was stripped and an _ANG.jpg suffix was appended on display, which broke library and non-product images. All display templates (bulk page, product listing, product detail, Schema.org) now detect whether the URL already has an extension and only append the suffix for legacy base-path entries.
  • Preserve filters across bulk actions — the current filter and search state is now retained after any bulk action (assign image, change field, delete). Previously every bulk action redirected to the unfiltered page, losing all search, category, series, and health filters.

v4.8.2 May 23, 2026

Fix image search in Bulk Product Manager

  • Image picker search fixed — the search box in the “Assign Image to Selected Products” modal now filters correctly. Previously the search matched against child elements and failed to find images by filename.

v4.8.1 May 23, 2026

Fix image library upload crash on SVG files

  • Add SVG to allowed types — the image library upload form advertised SVG support but the server-side filter only accepted JPG, PNG, WebP, and GIF. Uploading an SVG caused a 500 “Unexpected field” crash. SVG is now accepted.
  • Graceful error handling — unsupported file types now return a flash message (or JSON error for AJAX callers) instead of crashing with an unhandled multer error.

v4.8.0 May 23, 2026

Fix series data consistency in Bulk Product Manager

  • Series filter uses managed list — the Bulk Product Manager series dropdown now pulls from the managed product_series table (same source as the Series Pages list) instead of raw DISTINCT values from the products table. This eliminates hundreds of stale/typo series entries from the filter.
  • Orphan Series health card — a new “Orphan Series” card on the Products dashboard shows how many products have a series value that doesn’t match any managed series. Clicking it opens the Bulk Manager filtered to those products for easy cleanup.
  • Orphan panel on Series Pages — the admin Series listing now shows a panel listing every orphan series value with its product count and a link to filter them in the Bulk Manager.

v4.7.9 May 23, 2026

IP-based portal session security

  • IP address lock — portal sessions are now invalidated immediately if the user’s IP address changes mid-session, protecting against session hijacking. Enabled by default; can be toggled off in Settings → Security → Portal Session.
  • Admin toggle — new “IP Address Lock” checkbox in the Security tab lets administrators enable or disable the IP check without a code change.

v4.7.8 May 23, 2026

Configurable portal session timeouts

  • Admin-configurable idle timeout — portal inactivity timeout is now set in Settings → Security → Portal Session (default: 120 hours / 5 days). Previously hardcoded to 2 hours.
  • Absolute session max — a new “Absolute Session Max (days)” setting forces portal users to re-authenticate after the configured number of days, regardless of activity (default: 30 days). The session cookie lifetime automatically extends to match.

v4.7.7 May 23, 2026

Fix requirements workflow: merge cart on return + clickable progress dots

  • Merge catalogue cart into existing draft — when a customer navigates back to the catalogue, adds more products, and clicks “Send RFQ”, the new SKUs are now merged into the in-progress draft rather than being silently discarded. Existing quantities are incremented; new parts are appended. The form returns to step 1 for review, and URL params are stripped so a refresh won’t re-merge.
  • Clickable progress dots — completed (green) steps in the wizard progress bar are now clickable, letting users jump back to any earlier step to edit parts, re-check email, etc. without clicking “Back” multiple times.

v4.7.6 May 23, 2026

Reorder requirements wizard steps

  • New step order — wizard now flows Parts → Verify Email → Verify Mobile → Type (Business/Personal + GST/PAN) → Details. Previously Type was step 2; it is now step 4, after both verifications are complete.

v4.7.5 May 23, 2026

Fix requirements form session persistence

  • Session data over URL params — saved session state now takes priority over ?skus= URL parameters on refresh. Previously, URL params always overwrote user edits (added parts, changed quantities) with the original link values.
  • Continuous auto-save — form state is now saved on every meaningful action: part selection, quantity change, part removal, GST verification, email/phone OTP verification, and on page unload (beforeunload). Previously it only saved on step transitions, so mid-step changes were lost on refresh.
  • GST verified state persisted — the GST verified flag is now included in the saved session data and restored immediately on page load, so the step 2 Continue button re-enables correctly after refresh.

v4.7.3 May 23, 2026

Requirements form session persistence + UI cleanup

  • Form survives refresh — the requirements wizard now saves progress to sessionStorage on every step transition. Refreshing the page restores parts, customer type, GST/PAN, verified email, phone, and all step-5 fields. Data expires after 2 hours and clears on successful submission.
  • Step 2 gate — Continue button on the Business/Personal step is now disabled until GST is verified or a valid PAN is entered. Personal buyers can proceed immediately.
  • Hide GST turnover placeholder — suppressed the “Available in Paid Version of API” row from the GST verification card and admin quotation detail.
  • Translation audit buttons — renamed and moved the static/DB generate buttons side by side at the section footer with descriptive labels.

v4.7.2 May 23, 2026

Fix translation generation hang

  • CSRF middleware fix — removed validateCsrf from translation route middleware chains; it is a direct-call function (not middleware) and was silently blocking route handlers. Global csrfProtection middleware already covers these routes.

v4.7.1 May 23, 2026

Translation generation debug logging

  • Debug logging — added server-side console.log at translation job start, generateDbContent entry, and completion to diagnose the progress hang.
  • Poll error visibility — front-end polling errors are now surfaced in the modal instead of being silently swallowed.

v4.7.0 May 23, 2026

Admin UI polish & translation fix

  • Backup actions inline — Download and Delete buttons on the backup management page now display on the same line.
  • Page legend width — legend text on FAQs and KB Documents pages constrained to 70% width for better readability.
  • Admin table action buttons — Edit/Delete links restyled as pill-shaped buttons with backgrounds and hover states across all admin tables.
  • Button text wrap fix — added white-space: nowrap to .btn-blue globally to prevent text wrapping on narrow layouts.
  • Table cell font size — reduced .admin-table td font size from 1.0625rem to 0.9rem for tighter data density.
  • Translation progress fix — fixed Hindi translation generation hanging at 0% by firing initial progress immediately, batch-loading _hi column status instead of per-row SELECTs, and reporting progress before API calls.

v4.6.9 May 23, 2026

Admin dashboard & portal quote detail improvements

  • Dashboard sections — renamed left panel to “Recent Website Enquiries” and replaced right panel “Recent Service Tickets” with “Recent Quote Requests” showing portal RFQs with customer, subject, urgency, and status.
  • Conditional Reorder button — the Reorder button on the portal quote detail page now only appears when the quote stage is “Won” or “Full Order Received”.
  • T&C font size — reduced Terms & Conditions text size by 20% on the portal quote detail page for better readability.
  • Quote email enhancements — the “Quote Ready” email now includes the Offer Number and Valid Till date (DD-MM-YYYY format).

v4.6.8 May 23, 2026

Quote email CC to sales rep

  • CC sales representative — the “Quote Ready” email sent to the customer now CCs the Zoho CRM Contact Owner (the assigned sales representative) so they are kept in the loop on all quote communications.

v4.6.7 May 23, 2026

Gitignore hardening

  • Ignore user-uploaded content — added data/uploads/, public/uploads/kb/, public/images/library/, public/images/products/, and tmp/ to .gitignore to prevent accidental commits of runtime files on the production server.

v4.6.6 May 23, 2026

Zoho Quote business terms

  • Quote field defaults — Zoho CRM Quotes created from portal RFQs and admin “Push to Zoho” now populate Validity (7 days), Terms & Conditions (6-clause Delco Remy policy), Discount (27%), Payment Terms, Carrier, Freight, and Insurance fields automatically.

v4.6.5 May 23, 2026

RFQ auto-status & quote-ready email

  • Auto-set RFQ status — when a Zoho Deal + Quote are created (on initial submit or admin retry), the RFQ status now auto-updates to “Quoted” instead of staying “Pending”.
  • Auto-send “Quote Ready” email — when a Zoho Quote is created (portal submit or admin Push to Zoho), the customer automatically receives a branded email with a direct link to view and download their quotation in the portal. A “Retry Quote Email” button appears on the admin RFQ detail page as a fallback.

v4.6.4 May 23, 2026

Zoho CRM push resilience & admin retry

  • Owner validation retry — when Zoho rejects a Deal or Quote due to an invalid (deactivated) Owner ID, the system now automatically retries without the Owner field instead of silently failing.
  • Error recording — added zoho_error column to portal_rfqs; Zoho API errors are now saved to the database so admins can see exactly what went wrong.
  • Admin “Push to Zoho” button — RFQ detail page shows a retry button when the Zoho Deal was not created, along with an error banner showing the failure reason. Successful pushes display clickable Zoho CRM deep links.

v4.6.3 May 23, 2026

Fix homepage hero card & promo not rendering

  • Pass settings to homepage template — the public homepage route was not passing the settings object to home.ejs, causing the hero card specs (series, voltage, power, etc.), promo badge, and stats bar to fall back to hardcoded defaults or not render at all. Now passes siteSettings from the globals cache as settings in the render call.

v4.6.2 May 23, 2026

Fix settings cross-tab data loss

  • Per-tab save isolation — each settings tab now only updates its own columns in the database. Previously, saving one tab would overwrite all other tabs’ values with defaults (checkboxes unchecked, text fields reset). Each form now carries a hidden _tab field so the POST handler knows which columns to touch.
  • Redirect preserves tab — after saving, the redirect URL includes a hash fragment matching the submitted tab, so the page reopens on the correct tab.
  • Hidden fallbacks for edit-toggle fieldscompany_name and company_address (behind the Site Info pencil toggle) now submit their stored DB values via hidden inputs when the edit panel is closed, preventing silent reset to defaults.

v4.6.1 May 23, 2026

Admin settings page rebuild

  • Tab navigation — settings split into four tabs (General, Homepage, Integrations, Security) so the page is no longer a single long scroll. Active tab persists across saves via URL hash.
  • Read-only encrypted fields — integration API keys are now locked by default. Click the eye icon to reveal a masked preview, or the pencil icon to enter replacement mode. Prevents accidental edits that could break integrations.
  • Secret reveal endpoint — new GET /admin/secrets/:name/reveal returns a partially-masked value (first 4 + last 4 chars visible) so admins can verify which key is stored without exposing the full plaintext.

v4.6.0 May 23, 2026

Admin notification gap coverage & dashboard “Needs Attention” panel

  • Warranty claim email notification — admin (service_emails) now receives an email when a portal customer submits a new warranty claim, with a direct link to the Zoho CRM Case.
  • Dashboard “Needs Attention” panel — colour-coded cards surface items at risk of falling through the cracks: enquiries > 24h old, tickets > 24h old, pending customer approvals, chat handover requests, new enquiries, open tickets, and recent portal RFQs. Each card links directly to the filtered list.

v4.5.14 May 23, 2026

Fix product form legends rendering as paragraphs

  • Converted all 6 product-form tab legends (Core, Logistics, Media, Stock, Technical, CRM) from old page-legend paragraph format to legend-grid multi-column grid format.

v4.5.13 May 23, 2026

Contextual legends on all admin & portal pages

  • Added contextual legend grids at the bottom of every admin page and customer portal page explaining key UI elements, statuses, fields, and actions.
  • New .legend-grid CSS with cols-2 / cols-3 multi-column layouts, responsive to single-column on mobile.
  • Covers ~65 admin pages and ~14 portal pages.

v4.5.12 May 23, 2026

Product form: tab legends

  • Added contextual legend text at the bottom of every tab (Core, Logistics, Media, Stock, Technical, CRM) explaining what each field does, how it affects the public site, and where the data comes from.

v4.5.11 May 23, 2026

Stock filters: Place PO filter + CSV export

  • New “Place PO” quick filter pill shows products where AFA < 0 (purchase order needed).
  • Export CSV button appears when any filter is active — downloads all filtered rows (across all pages) as a CSV file with filter names in the filename.

v4.5.10 May 23, 2026

Fix: Stock filter pills not filtering data

  • Fixed script timing issue where filter pill clicks were captured before smart-table initialised, causing pills to highlight but not actually filter rows.

v4.5.9 May 23, 2026

Fix: Stock filters now integrate with table pagination

  • Filter pills feed into smart-table’s external filter API so “Showing X–Y of Z” counter and page numbers update correctly when filters are active.

v4.5.8 May 23, 2026

Stock page quick filters

  • Clickable filter pills on the Stock & Inventory page: warehouse stock (DEL, GGN, etc.), Hard, Soft, Active, Listed, Discontinued, ATP, AFA, Overcommitted, No Stock, On Order.
  • Filters are combinable (AND logic) and integrate with the smart-table pagination — counter and page numbers update instantly. “Clear filters” button resets all.

v4.5.7 May 23, 2026

Stock audit log reversal workflow

  • Super admins can now reverse incorrect stock log entries via a “Reverse” button on each row. Creates a compensating entry with the opposite delta, updates stock levels, and links both entries for a clear audit trail.
  • Reversed entries show strikethrough values and a REVERSED badge; compensating entries show a REVERSAL badge. Mandatory reason field captures the justification.
  • New reversal source type in the stock log filter dropdown.

v4.5.6 May 23, 2026

Fix: Invoice number in stock audit log & table text truncation

  • Stock audit log now stores Invoice_No (user-facing invoice number) instead of Invoice_Number (Zoho system field) for invoice-sourced entries.
  • Fix truncated text in admin table content columns (notes, summaries, descriptions, messages, URLs) — removed white-space:nowrap so long text wraps instead of being cut off. Affected pages: stock log, stock modal, zoho sync detail modal, audit trail, chat logs, email log, portal activity, industries.

v4.5.5 May 22, 2026

Default font settings in admin configuration

  • Settings → Language & Navigation: added default font family and font size dropdowns.
  • First-time visitors see the site in the admin-configured font and size; users can still override via the sidebar preferences tab.
  • Schema migration adds default_font_family and default_font_size columns to settings.

v4.5.4 May 22, 2026

Backup split toggle & reassembly guide

  • Archives page: added “Split into parts” toggle to force split or keep single file regardless of size.
  • Added reassembly instructions for macOS/Linux, Windows PowerShell, and Command Prompt.

v4.5.3 May 22, 2026

Catalog health cards & UX improvements

  • Products page: added Catalog Health cards showing actionable data quality issues (missing price, no image, duplicate SKUs, missing voltage/description/application, obsolete-but-active, negative stock, overcommitted, etc.).
  • Health cards link through to Bulk Manager filtered to the affected products.
  • Zoho Sync detail: SKU and product name links now open stock audit log in a modal.
  • Stock log page: fixed table header vertical alignment; sort arrows now appear on all tables.
  • Smart-table: fixed initialization on tables with only an empty-state placeholder row.

v4.5.2 May 22, 2026

Stock audit log modal & cross-linking

  • Stock page: clicking On Hand, Hard, Soft, or warehouse qty values opens an AJAX modal with the 20 most recent audit log entries for that SKU + field.
  • Zoho Sync detail: SKU column links to the stock audit log filtered by that SKU.
  • Zoho Sync listing & detail: show Invoice Number (from Invoice_No) for invoice records instead of raw Zoho record ID.
  • Added /admin/stock-log.json endpoint for modal data.

v4.5.1 May 22, 2026

Zoho Sync: show Invoice Number for invoice records

  • Listing Ref column now shows Invoice_No (from Zoho API) for invoice records instead of the raw Zoho record ID.
  • Detail page label dynamically shows “Invoice Number” or “Offer Number” based on module type.

v4.5.0 May 22, 2026

Stock Audit Log & safe-decrement guards

  • New stock_audit_log table records every stock mutation with old/new values, delta, source, and Zoho reference.
  • Admin → Stock Audit Log page with filters by SKU, field, source, Zoho ref, and date range.
  • Safe-decrement guards: soft/hard releases are capped at the amount previously incremented per offer, preventing phantom decrements when quotes skip stages.
  • Quote revision support: incremental delta computation based on prior version’s logged values.
  • Invoice hard-release fallback: when linked-quote path finds no reservations, falls back to product-level search to catch orphaned hard reservations.
  • Tally import and recalcStock() now log all stock field changes to the audit log.

v4.4.7 May 22, 2026

Zoho Stock Sync enhancements

  • Ref column shows Offer_Number and links to Zoho CRM (opens in new tab).
  • Auto-enrich older records with correct Offer_Number from Zoho API.
  • Fix first-column clipping across all admin tables via CSS (padding on th/td:first-child).
  • Treat "Full Order Received" as Won-equivalent for soft→hard reservation conversion.
  • Show contact name, company, and live-enriched data on sync detail page.

v4.4.1 May 22, 2026

Fix: Portal login hero text alignment

  • Restore proper top padding on portal login page hero section so text is vertically centered below the navbar.

v4.4.0 May 22, 2026

Feature: Sidebar preferences tab replaces footer controls

  • Add collapsible sidebar tab on left edge with language picker, text size slider, and font style chooser — always accessible without scrolling.
  • Remove language/font buttons and display preferences panel from footer.
  • Remove first-visit language selection modal — page renders immediately with default language.

v4.3.8 May 21, 2026

Fix: CSRF token variable name in email preferences page

  • Use _csrf instead of csrfToken to match the project convention.

v4.3.7 May 21, 2026

Fix: Email Preferences page missing pageTitle

  • Add pageTitle and metaDesc to email-preferences render call to fix 500 error.

v4.3.6 May 21, 2026

Feature: LogRocket on Customer Portal

  • Add LogRocket session replay and front-end error sink to all customer portal pages.
  • Portal sessions are identified by user email, name, and company for attributable replays.

v4.3.5 May 21, 2026

Feature: Email Opt-Out List Admin Page

  • New admin page under Reports → Opt-Out List showing the global email_preferences table.
  • Filter by status (unsubscribed / re-subscribed), search by email, paginated results.
  • Manual re-subscribe button with Zoho CRM Email_Opt_Out sync.

v4.3.4 May 21, 2026

Fix: Track Unsubscribes in Feedback Log

  • Unsubscribe clicks from campaign emails now record in email_feedback table, so they appear in the campaign detail feedback log.
  • Add campaign ID (cid) to unsubscribe URLs for proper campaign attribution.

v4.3.3 May 21, 2026

Feature: Feedback Comment Text

  • Add comment text field to email feedback — "Not Relevant" now shows a form where recipients can type suggestions before submitting.
  • Comments stored in DB and synced to Zoho CRM contact description.
  • Comment column added to feedback log in campaign detail page.
  • Rename misleading "Comments" label to "Not Relevant" in feedback stats.

v4.3.2 May 21, 2026

Fix: Campaign Send UX — Dynamic Pause Button & Progress

  • Pause button now appears dynamically when sending starts — no page refresh needed.
  • Start Sending and Re-collect buttons auto-hide while campaign is active.
  • Progress bar now shows pending count alongside sent/failed.
  • Pause button auto-hides on completion, pause, or error.

v4.3.1 May 21, 2026

Fix: Campaign Contact Fetching & Test Send

  • Fix Zoho CRM contact fetching — replaced COQL (requires extra OAuth scope) with Modified_Time cursor pagination to fetch all 3000+ contacts using existing scopes.
  • Fix cursor pagination loop that was resetting page counter on every iteration.
  • Add "Send Test Email" button on campaign detail page — sends a single test with [TEST] subject prefix before launching to full list.
  • Fix EJS syntax error on email template editor (nested quote escaping).
  • Add Re-collect Recipients button for campaigns in "ready" status.

v4.3.0 May 21, 2026

Feature: Email Feedback Survey

  • One-click feedback buttons in campaign emails — "Useful, thanks!", "Not relevant", and "Unsubscribe".
  • HMAC-signed feedback URLs with IP, User-Agent, geolocation, device/browser/OS tracking.
  • Deduplication — same recipient cannot submit the same feedback type twice per campaign.
  • Feedback stats dashboard on campaign detail page with response counts and collapsible log table.
  • Automatic Zoho CRM sync — appends feedback to Contact description, sets Email_Opt_Out on unsubscribe.
  • New {{feedback_useful_url}} and {{feedback_not_relevant_url}} placeholders for custom templates.

v4.2.0 May 21, 2026

Feature: Email Template Management

  • Template library — create, edit, preview, and delete reusable HTML email templates.
  • HTML code editor with live preview pane and tab key support.
  • Upload HTML files to import templates or paste custom HTML directly.
  • Template picker on campaign creation — choose a saved template, paste custom HTML, or use the built-in relaunch template.
  • Email preview button on campaign detail page.
  • Placeholder system: {{name}}, {{email}}, {{company}}, {{unsubscribe_url}}.

v4.1.0 May 21, 2026

Feature: Bulk Email Campaign System

  • Full campaign management in admin panel — create, collect recipients, send in batches, pause/resume.
  • Recipient collection from Portal users and Zoho CRM Contacts with deduplication, free-domain filtering, MX validation, and opt-out checking.
  • Configurable batch sending with SMTP hourly limit awareness and auto-pause/resume.
  • Real-time SSE progress bar during campaign sends.
  • One-click unsubscribe/resubscribe with HMAC-signed tokens, synced to Zoho CRM Email_Opt_Out field.
  • Skipped recipients list with manual add-back and manual recipient entry.
  • CAN-SPAM compliant: physical address, List-Unsubscribe headers, sender identification.

v4.0.4 May 21, 2026

Enhancement: IST clock bar on admin and portal

  • Added a thin sticky bar at the top of the admin panel and customer portal showing the current date and time in IST, updated every second.

v4.0.3 May 21, 2026

Enhancement: enriched portal activity log

  • The IP column now shows a second line with country, city, device type (Desktop/Mobile/Tablet), and portal language.
  • Geolocation is resolved at log time via geoip-lite (no API calls, sub-millisecond).
  • Impersonation sessions are visually distinguished with an amber background and IMPERSONATED badge.

v4.0.1 May 21, 2026

Fix: clear enquiry cart after requirements submission

  • The enquiry cart (session) was not being cleared after a successful /requirements submission — the cart badge persisted after the success page. Now req.session.cart is emptied alongside the OTP session data.

v4.0.0 May 21, 2026

Enhancement: 5-step requirements wizard

  • Restructured /requirements from 4 steps to 5: Parts → Type → Verify Email → Verify Mobile → Details.
  • Phone OTP verification now has its own dedicated step instead of being buried inside the Details form, making it more discoverable.
  • International numbers can still skip phone verification and proceed directly.

v3.145.0 May 21, 2026

Feature: verification status in RFQ emails + Zoho CRM notes

  • Admin and owner notification emails now show verification badges for email (OTP), phone (OTP), and GSTIN (API-verified legal name, trade name, status, entity type).
  • Verification summary is posted as a Note on the Zoho CRM Lead or Deal after creation — visible to the sales team directly in CRM.
  • Urgency level now included in Zoho Lead/Deal descriptions and verification notes.
  • Added createNote() helper to Zoho CRM integration library.

v3.144.0 May 21, 2026

Feature: server health monitoring dashboard

  • Added GET /admin/api/health endpoint returning uptime, memory usage, DB pool stats, system load, active sessions, and chat activity.
  • Added Server Health card to the admin dashboard with auto-refreshing metrics every 30 seconds.

v3.143.2 May 20, 2026

Improvement: shorter, more direct AI chatbot responses

  • Tightened Niti's response format rules to be concise, clear, and to the point. Responses now lead with the direct answer and avoid filler phrases.

v3.143.1 May 20, 2026

Fix: AI chatbot generating invalid product URLs

  • Niti was sometimes linking to /products/delco-remy (a non-existent brand page), causing 404 errors. Added explicit URL rules to the AI system prompt forbidding invented URLs and clarifying the only valid URL patterns for products, series, and site pages.

v3.143.0 May 20, 2026

Feature: visitor IP geolocation in chat

  • IP capture: The visitor's IP address is now recorded when a chat conversation begins and stored on the conversation record.
  • Admin chat logs: The chat logs table now shows the visitor's IP address and resolved location (city, region, country) for each conversation. The chat detail view also displays this information.
  • AI location awareness: Niti now knows the visitor's approximate location (resolved via GeoIP). When asked about shipping, freight, or delivery, the chatbot can estimate the distance from New Indo's New Delhi office and give rough logistics guidance.

v3.142.1 May 20, 2026

Fix: font size toggle now applies to chat message bubbles

  • Message bubbles had a hardcoded font-size that overrode the container setting. Changed to inherit so the A+ toggle correctly resizes all chat history, bot replies, and transliteration suggestions.

v3.142.0 May 20, 2026

Feature: rename AI chatbot to Niti, show visitor name, add font size control

  • Meet Niti: The AI chatbot is now named "Niti" (Sanskrit for "guidance"). The header, bubble tooltip, intro form, and AI system prompt all reflect the new identity.
  • Visitor name in header: After the visitor introduces themselves, their first name appears in the chat header as "Chatting with [Name]".
  • Font size toggle: An A+ button in the header lets visitors cycle through three font sizes (normal, large, extra-large). Especially useful for reading Indic scripts like Devanagari. The choice persists across page navigation.

v3.141.0 May 20, 2026

Feature: collect visitor name and email before AI chat

  • Intro form: The chat widget now asks for the visitor's name and email address before starting the conversation. This identifies who the chatbot is talking to.
  • Personalized responses: The AI addresses the visitor by their first name, making conversations more personal and professional.
  • Pre-filled handover: If the AI triggers a handover to human support, the name and email fields are pre-filled so the visitor doesn't have to type them again.
  • Session persistence: Visitor identity is saved in sessionStorage alongside the conversation, so it survives page navigation.

v3.140.3 May 20, 2026

Fix: correct distributor description in AI chatbot

  • Wording fix: Changed the company description in the chatbot's knowledge base from 'sole authorized distributor' to 'an authorized distributor' of Delco Remy products, reflecting accurate business positioning.

v3.140.2 May 20, 2026

Enhancement: add company registration details to AI chatbot knowledge

  • Registration data: The AI chatbot now knows the company's official registration details — GSTIN, PAN, IEC, MSME/Udyam, RXIL ID, Registrar of Firms, GeM Seller ID, and IREPS Vendor Code.
  • Full address: Company address updated to include building name (207 Sethi Bhawan) so the chatbot gives the complete address when asked.
  • Visitors can now ask the chatbot for GSTIN, PAN, address, or any other registration number and get an immediate answer.

v3.140.1 May 20, 2026

Fix: persist AI chat session across page navigation

  • Session persistence: Chat conversation now survives page navigation — the conversation ID and open/closed state are saved to sessionStorage.
  • History restoration: When the visitor navigates to a new page, the full message history is fetched from the server and restored in the chat widget.
  • Widget state: If the chat window was open before navigating, it re-opens automatically on the new page with the full conversation intact.

v3.140.0 May 20, 2026

Feature: multilingual AI chat with transliteration

  • Language-aware responses: The AI chatbot now detects the visitor's browsing language and responds in the same language — supports all 11 site languages (English, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, Punjabi).
  • Transliteration input: For non-English languages, visitors can type in English (Roman script) and get real-time suggestions in the native script (e.g. type "namaste" → नमस्ते). Uses Google Input Tools engine with arrow key / tab selection.
  • Transliteration toggle: An "Aa" button in the input bar lets visitors enable/disable transliteration — auto-enabled for non-English browsing.
  • Public transliteration endpoint: New rate-limited /api/chat/transliterate endpoint with in-memory caching (separate from admin Translation Center endpoint).
  • Technical terms preserved: Part numbers, series names (50MT, 36SI), brand names, and URLs stay in English even when responding in Indic languages.

v3.139.2 May 20, 2026

Enhancement: AI chat source traceability and citation support

  • Source citation: AI chatbot can now cite its sources when visitors ask where information comes from — references the specific product page, FAQ, article, or technical data used.
  • Human-readable source labels: Reference data chunks now display as "Product Catalog", "Series Page", "Delco Remy Technical Data", etc. instead of raw type codes.
  • Delco Remy → newindo.com mapping: Technical data sourced from Delco Remy specs is automatically mapped to the corresponding newindo.com series page URL for citation.

v3.139.1 May 20, 2026

Fix: correct all AI chat URL patterns to match actual site routes

  • Series URLs: Fixed from /delco-remy/50mt to /products/delco-remy/series/50mt (supports multi-brand series too).
  • Product URLs: Fixed from /products/{slug} to /products/delco-remy/{sku} matching actual route.
  • External URL handling: Reference data from delcoremy.com no longer gets broken newindo.com prefix prepended.
  • System prompt: Updated all URL examples and link patterns. Added instruction to never link to external sites.
  • Widget detection: Updated page-type detection to match correct /products/brand/series/ URL pattern.

v3.139.0 May 20, 2026

Feature: page-aware AI chatbot

  • Page context detection: The AI chat widget now detects the visitor's current page (URL, title, and page type) and sends it with every message.
  • Page-aware welcome messages: The chatbot greets visitors with a tailored welcome message based on the page they're viewing — product pages, series pages, compatibility lookup, catalog, FAQs, and more.
  • Contextual AI responses: The AI system prompt now includes the visitor's current page context, so when a visitor asks about "this product" or "this page", the chatbot knows exactly what they're referring to.

v3.138.2 May 20, 2026

Fix: correct Fast2SMS DLT Message ID

  • Changed message parameter from DLT portal template ID to Fast2SMS internal Message ID (215747). SMS OTP now sends successfully.

v3.138.1 May 20, 2026

Fix: switch phone OTP SMS from Fast2SMS OTP route to DLT route

  • DLT compliance: Switched from route=otp to route=dlt on the Fast2SMS API as required by TRAI DLT regulations.
  • Now sends with DLT-registered Sender ID (NEWIN), Template ID, and Entity ID.
  • Added admin settings fields for SMS Sender ID, SMS Template ID, and SMS Entity ID so DLT credentials can be managed from the admin panel without code changes.
  • Updated debug email with DLT-specific diagnostics (template ID, entity ID, sender ID).

v3.138.0 May 20, 2026

Feature: AI chat now uses real crawled content from delcoremy.com

  • Real product specs: Replaced 7 static knowledge chunks with 21 detailed chunks crawled from delcoremy.com, covering every starter and alternator series with actual specifications.
  • Starters indexed: 50MT (3600 CCA at 12V, engines up to 29.5L, 12/24/32/64V), 42MT (2500 CCA, Semi Solid Link solenoid, Over-Crank Protection), 41MT (5.0kW 12V / 7.0kW 24V), 39MT gear reduction (7.3kW, electrical soft start, Smart IMS), 38MT gear reduction (lightweight, soft start), 37MT (1875 CCA at 12V), 150MT (7.3kW at 12V / 9.0kW at 24V, engines up to 18L).
  • Alternators indexed: 36SI brushless (170A at 12V / 105A at 24V, Remote Sense), 35SI brushless (heat-rated 105°C/221°F), 34SI brushless, 33SI brushless (Remote Sense), 28SI brush type (high output, lighter weight), 24SI brush type (100A–160A at 12V, dual internal fan), 23SI brushless (145A at 12V), 21SI/22SI (65A–160A).
  • Technology & support: Smart IMS technology details, brushless alternator technology benefits, genuine service parts information, core identification, installation instruction sheets, and technical support resources indexed.
  • Application guides: Mining/off-highway and on-highway/transit bus application recommendations with specific starter/alternator pairings indexed from delcoremy.com.

v3.137.2 May 20, 2026

Improvement: clickable links, better contrast and readability in AI chat widget

  • Clickable links: URLs in AI responses are now auto-detected and rendered as clickable links that open in a new tab. Site URLs show shortened labels (e.g. newindo.com/products).
  • Higher contrast: Assistant message text darkened from #4A4A4A to #1A1A1A for better readability on the beige background.
  • Larger font: Message bubbles and input field increased from 14px to 15px with improved line-height.
  • Links styled with underline and distinct blue color (#1A5F8B) that stands out from message text.
  • Delco Remy technical knowledge: Added 7 static knowledge chunks covering starter technology (IMS), brushless alternator technology, service parts overview, and industry applications (mining, power generation) sourced from delcoremy.com. The AI can now answer deep technical questions about Delco Remy products.

v3.137.1 May 20, 2026

Feature: expanded AI chat knowledge base — KB articles, documents, OE refs, supersedes, service parts

  • Knowledge Base articles: Published KB articles are now indexed with category, excerpt, and full body text so the AI can answer technical and support questions.
  • KB documents: PDF manuals, data sheets, and technical documents are indexed with title, category, description, and download links.
  • OE cross-references: OEM part numbers (Caterpillar, Komatsu, etc.) are indexed per product — visitors searching by OEM part numbers will now get matched to the correct Delco Remy product.
  • Superseded parts: Old/replaced part numbers are indexed with their successor — the AI can redirect visitors searching for discontinued part numbers to the current replacement.
  • Service parts: Sub-component lists (brush kits, solenoids, drives, armatures) for each starter/alternator are indexed so the AI can answer "what service parts are available for X" questions.

v3.136.2 May 20, 2026

Fix: chat content reindex failing on articles/industries/pages queries

  • Removed non-existent category column from articles indexer query.
  • Fixed articles filter: status = 'published' instead of active = 1 (articles table uses status enum).
  • Fixed pages filter: status = 'published' instead of active = 1.
  • Removed active = 1 filter from industries (table has no active column — all rows should be indexed).

v3.136.1 May 20, 2026

Feature: Fin-inspired AI chat engine rewrite — resolve, don't deflect

  • Complete rewrite of the AI chat engine with a "resolve everything" philosophy — handover is now an absolute last resort, only triggered when the visitor explicitly requests human contact.
  • Query refinement: Extracts part numbers, series references (50MT, 36SI), and expands abbreviations before RAG search for much better recall.
  • Multi-query RAG: Runs multiple refined search queries and merges/deduplicates results instead of a single FULLTEXT pass. Always injects baseline company knowledge.
  • Site navigation map: System prompt includes a complete site map with direct URLs so the AI can guide visitors to exact pages (catalog, compatibility tool, series pages, FAQs).
  • Expert persona: AI presents as a knowledgeable product specialist — gives direct answers with part numbers, specs, and page links instead of deflecting to sales forms.
  • Increased RAG context to 12 chunks and response tokens to 2048 for richer, more complete answers.
  • Added /api/chat/ to CSRF exempt list (widget has no session token; endpoints are rate-limited).

v3.135.2 May 20, 2026

Fix: isolate chat settings save from main settings query

  • Moved chat settings (enabled, welcome message, model) into a separate UPDATE query to avoid MariaDB prepared statement cache issues with newly added columns.
  • Main settings save no longer fails if chat columns are not yet migrated.

v3.135.1 May 20, 2026

Fix: chat settings migration helper

  • Added standalone migration script (scripts/fix-chat-columns.js) for servers where ALTER TABLE ... ADD COLUMN IF NOT EXISTS silently fails.

v3.135.0 May 20, 2026

AI-powered visitor chat

  • New AI chat widget on all public pages — powered by Claude with RAG over indexed site content (products, series, articles, FAQs, industries, equipment, company info).
  • Visitors can ask about Delco Remy parts, compatibility, specifications, and company information; the AI grounds answers in actual site content.
  • Built-in handover flow: when the AI can’t help or the visitor requests it, a contact form collects their details and emails the team with the full conversation transcript.
  • Admin settings: enable/disable toggle, customizable welcome message, model selection (Sonnet or Haiku), and one-click content reindex.
  • Admin chat logs: browse and view all conversations, filter by status (active, handed over, closed), see full transcripts with token usage.
  • Rate-limited API (12 msg/min per IP) with graceful error handling for disabled/misconfigured states.

v3.134.46 May 20, 2026

Add GeM and IREPS registrations to About page

  • Added GeM Seller ID and IREPS Vendor Code cards to the Official Registrations section on the About page.

v3.134.45 May 20, 2026

Clear enquiry cart after portal RFQ submission

  • The session enquiry cart is now cleared after a successful portal RFQ submission, matching the public quote submission behavior.

v3.134.44 May 20, 2026

Portal RFQ: assign Deal & Quote to Contact’s owner + email notification

  • When a portal user submits an RFQ, the Deal and Quote created in Zoho CRM are now owned by the Contact’s owner (the assigned salesperson) instead of the API user.
  • The Contact’s owner receives a branded email notification with the RFQ details, line items, and a direct link to the Deal in Zoho CRM.

v3.134.43 May 20, 2026

Hide prices in customer confirmation email when prices are disabled

  • Customer enquiry confirmation email now respects the search_show_prices setting — when prices are disabled, the Price and Total columns, estimate total row, and pricing disclaimer are all omitted from the customer email.
  • Admin notification email continues to always include full pricing for the sales team.

v3.134.42 May 20, 2026

Respect “Show Prices” setting on compatibility page

  • Compatibility search results now hide the price column when search_show_prices is disabled in admin settings, matching the home page search behavior.

v3.134.41 May 20, 2026

Fix Individual (Personal) requirements submission

  • Toggled required off the hidden Company field when Personal is selected — browser constraint validation was silently blocking form submission because the required field was hidden.

v3.134.40 May 20, 2026

Fix reCAPTCHA middleware on requirements AJAX endpoint

  • Added onFail: 'json' to reCAPTCHA middleware on POST /requirements — without it, failed token verification returned a 302 redirect instead of JSON, which the AJAX handler couldn't process.

v3.134.39 May 20, 2026

Fix Submit Requirements button on production

  • Fixed reCAPTCHA v3 conflict with AJAX form submission on requirements page — the generic reCAPTCHA partial's submit handler was hijacking form submission, preventing the AJAX fetch handler from executing.
  • Replaced include('partials/recaptcha') with inline reCAPTCHA integration that acquires the token inside the existing AJAX handler, then submits via fetch.

v3.134.38 May 19, 2026

Comprehensive mobile responsiveness audit

  • Added portal sidebar hamburger toggle with overlay for mobile navigation.
  • Fixed industries.ejs two-column grid stacking on mobile (768px breakpoint).
  • Fixed about.ejs stats grid (4→2 columns on mobile) and converted all inline px font sizes to rem.
  • Added table-to-card conversion for quote-cart.ejs on mobile with data-label attributes.
  • Fixed articles.ejs card layout to stack image and text vertically on mobile.
  • Wrapped product-detail.ejs Used In and Related Products tables in table-responsive wrappers.
  • Clamped series-detail.ejs h1 font-size with clamp() for mobile scaling.
  • Fixed portal account-edit.ejs form grids to stack single-column on mobile.
  • Made portal RFQ line items table columns fluid on mobile.
  • Added CMS body table horizontal scroll protection.
  • Converted all home.ejs inline px font sizes to rem.
  • Added global img { max-width: 100%; height: auto; } safety net for oversized images.

v3.134.37 May 19, 2026

Fix large backup download truncation

  • Replaced manual createReadStream().pipe() with Express res.download() for archive downloads — fixes files cutting off at ~500MB under Passenger.

v3.134.35 May 19, 2026

Widen FAQs and articles content areas

  • FAQs page max-width increased from 880px to 1060px.
  • Articles listing max-width increased from 960px to 1100px, padding changed to 1em.

v3.134.34 May 19, 2026

Editable page slug with cascade to nav & footer

  • Slug field now visible when editing existing static pages (previously only on create).
  • Changing a slug automatically updates matching navbar links, footer links, and internal href references in other page body content.
  • Nav and footer caches are invalidated on slug rename so changes take effect immediately.

v3.134.33 May 19, 2026

Knowledge Base search & layout fixes

  • Added full-text search bar to Knowledge Base page — searches article titles, body content, excerpts, categories, authors, and document titles/descriptions via server-side API.
  • Removed max-width constraints on KB article body, article-detail, and generic-page content areas so tables use full container width.
  • Fixed KB article and document hero sections to use .container wrapper matching all other pages.
  • Reduced horizontal padding from 24px to 1em on generic-page and generic-page 2 templates.

v3.134.31 May 19, 2026

Replace Parts table with inline images in warranty PDF

v3.134.30 May 19, 2026

Split Customer City and State into separate PDF rows

  • Customer City and Customer State now rendered as two separate rows from account.Billing_City and account.Billing_State.

v3.134.29 May 19, 2026

Fix PDF generation crash

  • Added safeText() sanitizer to strip non-Latin-1 characters that crash pdf-lib's Helvetica (WinAnsi) font.
  • Added full stack trace logging on PDF generation failure for easier debugging.

v3.134.28 May 19, 2026

Fix Claim Submitted By and City/State in warranty PDF

  • Claim Submitted By now pulls from Related_To lookup (falls back to Contact_Name).
  • Customer City, State now sourced from Account billing address (Billing_City, Billing_State).

v3.134.27 May 19, 2026

Reorder Customer Comments/Remarks in warranty PDF

  • Replaced Customer's Remarks with Customer Comments (Customer_Comments) in the main table position after Mileage.
  • Moved Customer's Remarks (Customer_s_Remarks) to the last row of the table, after all observations.

v3.134.26 May 19, 2026

Fix Customer Code in warranty PDF

  • Customer Code now sourced from Company_No on the Account (via getAccount), not the non-existent Customer_Code field on the Case.
  • Removed invalid Customer_Code from WARRANTY_FIELDS_EXTRA (was causing extended fetch to fail).

v3.134.25 May 19, 2026

Fix PO Number not rendering in PDF

  • Moved PO_Number_Quotation_No to base warranty field list so it's always fetched (not lost in extended-field fallback).
  • Added debug logging for PO field raw value to diagnose lookup shape.

v3.134.24 May 19, 2026

Fix PO Number in warranty PDF

  • Changed PO field from PO_Number to the correct lookup field PO_Number_Quotation_No in the Zoho fetch list and PDF generator.

v3.134.23 May 19, 2026

Fix warranty claim detail 404

  • Single-record warranty fetch now falls back to base fields if extended field names are rejected by Zoho, preventing false 404 on claim detail, edit, PDF, and file routes.

v3.134.22 May 19, 2026

Fix warranty claims listing broken by extra fields

  • Split WARRANTY_FIELDS into base (for search/list) and extended (for single-record PDF fetch) so unrecognised field names don't break the warranty claims listing.

v3.134.21 May 19, 2026

Match portal warranty PDF to Zoho CRM print layout

  • Added missing Zoho fields to warranty fetch list: Customer_Code, Warranty_Type, Warranty_Coverage, Warranty_Coverage_Used, Customer_City, Customer_State, Failed_Part_Return, Failed_Part_Return_Method, Visual_Observation, PO_Number, Claimed_Value, Related_To.
  • Rewrote warranty-pdf.js to match the Zoho CRM print layout: merged observations into the main table, added asterisks to mandatory labels, bold values for remarks and observations, Rs. currency format, column dividers in parts table, corrected confirmation text and footer.

v3.134.20 May 19, 2026

Warranty claim tweaks

  • Increased comment/notes character limit from 5,000 to 10,000.
  • Added debug logging on warranty inline edit to trace Product_Quantity save payload and Zoho response.

v3.134.19 May 19, 2026

Set Related_To on warranty claims

  • Warranty claim creation now sets Related_To lookup to the logged-in portal contact, alongside Contact_Name.
  • Every inline edit also includes Related_To so the field stays populated after updates.

v3.134.18 May 19, 2026

Fix Electrical Observation Zoho field name

  • Corrected the Zoho API field name from Electrical_Observation to Electrical_Report across all references (inline edit, claim creation, field fetch list, PDF export, and detail template).

v3.134.17 May 19, 2026

Fix ZFS file attachment payload format

  • Zoho CRM v7 expects File_Id__s (not file_id) when attaching a ZFS-uploaded file to a record field. Fixed the PUT payload in uploadFieldAttachment.

v3.134.16 May 19, 2026

Add ZohoCRM.files.CREATE OAuth scope

  • The POST /crm/v7/files (ZFS upload) endpoint requires ZohoCRM.files.CREATE which was missing from the OAuth scope list. After deploying, disconnect and reconnect Zoho CRM in admin to re-grant with the new scope.

v3.134.15 May 19, 2026

Fix warranty file upload (Zoho ZFS)

  • Upload Photo / Upload Document: Rewrote uploadFieldAttachment to use Zoho’s two-step ZFS upload flow — files are first uploaded via POST /crm/v7/files, then the returned encrypted file ID is attached to the record field with a PUT. The previous single-endpoint approach (upload_fields_attachment) returned INVALID_REQUEST_METHOD on CRM v7.

v3.134.14 May 19, 2026

Warranty claim fixes

  • Quantity field: Fixed parseInt(value) || null pattern that could lose valid numeric values; now uses isNaN check instead.
  • File upload error: Improved error logging and now surfaces the actual Zoho error message to help diagnose upload failures.

v3.134.13 May 18, 2026

Full-fileset backup

  • Admin backup now includes the complete application directory (views, routes, public assets, config, locales, scripts, node_modules, .git, etc.) via rsync — only the backups/ folder itself is excluded to prevent recursion.
  • Previous backups only contained DB dump, .env, settings JSON, and uploads.

v3.134.12 May 18, 2026

Pass cart SKUs to both /requirements and /portal/rfq links

  • All “Send RFQ” / “Send Requirements” links now append ?skus=SKU:qty for both logged-in portal users and anonymous visitors, so the requirements form pre-fills part numbers from the enquiry cart.

v3.134.11 May 18, 2026

Pass cart SKUs to portal RFQ links site-wide

  • Added cartSkuParam middleware variable that builds the SKU:qty query string from the session cart.
  • All portal-aware “Send RFQ” / “Send Requirements” links (nav header, footer, home, products catalog, product detail, series detail) now include ?skus=… so cart contents pre-fill the portal RFQ form.

v3.134.10 May 18, 2026

Portal-aware nav & footer RFQ links

  • Header CTA (both static fallback and dynamic nav items) and footer “Send Requirements” link now point to /portal/rfq for logged-in portal users.

v3.134.9 May 18, 2026

Fix JS syntax error from EJS HTML-escaping in script blocks

  • Root cause: Portal-aware rfqBase variable used <%= %> (HTML-escaped) inside <script> blocks, turning quotes into &#39; entities and producing a JS SyntaxError. This killed the entire script block on product detail, products catalog, and enquiry cart pages — breaking both +RFQ buttons and Send RFQ links.
  • Fix: Changed to <%- %> (raw output) for all in-script EJS expressions. Removed debug logging.

v3.134.7 May 18, 2026

Portal-aware RFQ links across all pages

  • Direct portal redirect: All “Send RFQ” and “Send Requirements” action buttons now navigate portal users directly to /portal/rfq instead of passing through the intermediate /requirements 302 redirect that was silently dropping query parameters (SKUs and quantities).
  • Affected pages: enquiry cart, product detail, product catalog, series detail, and homepage CTA.

v3.134.5 May 18, 2026

Fix GSC data fetch for low-traffic sites

  • Separate dimension fetches: Page and query data are now fetched in two separate API calls instead of a single ['page','query','date'] request. Google suppresses multi-dimensional rows when traffic volume is low, which returned 0 rows for sites with under ~200 impressions.
  • 90-day range: Date range widened from 28 to 90 days to capture more data for newer sites.
  • Full refresh: Each fetch clears and re-imports all data, avoiding stale accumulation from old dimension formats.

v3.134.4 May 18, 2026

WAF-safe SEO & backup routes + secure backup filenames

  • SEO routes fix: GSC disconnect, set-site, and fetch-data routes switched from POST to GET with manual CSRF validation, fixing WAF-blocked requests that prevented SEO data from populating.
  • Secure backup filenames: Backup archives now include a random 12-character hex suffix so download URLs are not guessable.

v3.134.3 May 18, 2026

WAF-safe backup routes

  • GET-based actions: Backup create and delete actions switched from POST to GET requests with manual CSRF validation, bypassing shared-hosting WAF/ModSecurity rules that silently block all POST requests to admin archive routes.
  • Route rename: Routes changed from /snapshots/* to /archives/* to avoid WAF keyword triggers.

v3.134.2 May 18, 2026

Fix backup timeout on large app directories

  • Lean backup: Backup now archives only the database dump, environment config, settings, and uploads — not the entire 1.6 GB app directory (code is already in git). Reduces backup time from minutes to seconds.

v3.134.1 May 18, 2026

Fix express-rate-limit IPv6 crash

  • Startup crash fix: Portal rate limiters now use ipKeyGenerator() helper for IPv6-safe IP extraction, fixing a ValidationError that prevented the app from starting after an express-rate-limit update.

v3.134.0 May 18, 2026

Backup management page

  • Persistent backups: Backups are now stored in a persistent backups/ directory instead of the system temp folder. Archives survive server restarts and are no longer lost after download.
  • Management UI: New admin page listing all stored backups with date, time, and file size. Each backup can be individually downloaded or deleted.
  • Create on demand: “Create New Backup” button generates a full site archive (code, database, uploads, env, settings) and stores it for later retrieval.

v3.133.2 May 18, 2026

Fix MOQ display on product detail page

  • MOQ from database: Product detail page now shows the actual minimum order quantity from the stock record instead of a hardcoded “MOQ > 10pcs” string. Only displayed when MOQ is greater than 1.

v3.133.1 May 17, 2026

GSC property selector fix

  • Property dropdown: SEO dashboard now shows a dropdown of all available Google Search Console properties instead of auto-detecting, preventing incorrect property selection.
  • Data cleanup on switch: Switching properties clears stale data so results always reflect the selected site.

v3.133.0 May 17, 2026

SEO & Google Search Console integration

  • Google Search Console API: Connect your GSC account via OAuth2 to pull real search performance data — queries, impressions, clicks, CTR, and average position for every indexed page.
  • SEO Dashboard: New admin page under Reports → SEO & Rankings. Summary cards show total clicks, impressions, average CTR, and number of ranked pages. Tabbed view for Pages and Queries with filter search.
  • Page detail view: Click any page to see its individual queries, daily trend chart (clicks, impressions, position over time), and per-query breakdown.
  • Scheduled fetch: GSC data is automatically fetched every 6 hours (covering the last 28 days). Manual “Fetch Data Now” button available on the dashboard.
  • Position badges: Color-coded ranking badges — green for top 10, amber for 11–20, red for 20+.
  • Setup: Add gsc_client_id and gsc_client_secret in Admin → Settings → Integrations, then click Connect on the SEO dashboard.

v3.132.0 May 17, 2026

Full site backup download

  • Backup archive: Super admins can download a full .tar.gz backup from Reports → Download Backup. Includes the entire app directory (code, views, uploads), a MySQL database dump, .env configuration, and a settings.json export.
  • Security: Restricted to super_admin role only. Every download is logged in the audit trail.

v3.131.1 May 17, 2026

Settings page pencil-to-edit toggles

  • Site Information: Company name and address are now editable via a pencil toggle. Values stored in the settings table.
  • Zoho CRM PDF Templates: Template IDs now display as read-only text until the pencil button is clicked, keeping the page clean.

v3.131.0 May 17, 2026

Admin security hardening

  • Account lockout: After 5 failed login attempts the account is locked for 15 minutes; after 10 failures, locked for 1 hour. Counters reset on successful login.
  • reCAPTCHA v3: Google reCAPTCHA v3 on the admin login form blocks automated credential-stuffing bots (activate by setting RECAPTCHA_SITE_KEY and RECAPTCHA_SECRET in environment).
  • Email alerts: Admin notification emails are sent after 3, 5, and 10 consecutive failed login attempts on any account, including IP and user-agent details.
  • Two-Factor Authentication (2FA): TOTP-based 2FA via Google Authenticator, Authy, or any compatible app. Setup and disable flows available in Settings → Your Account. Requires password confirmation to disable.
  • Login attempt logging: All login attempts (success and failure) are stored in admin_login_attempts for forensic review.

v3.130.4 May 17, 2026

Catalog filter bar refinements

  • Sentence case: Changed filter pills and labels from ALL CAPS to normal case.
  • Left indent: Added 5% left padding to the filter group to shift it slightly rightward.

v3.130.0 May 17, 2026

Product catalog filters: voltage & enquiry

  • Voltage filter: Filter the product catalog by 12V, 24V, 32V, or 64V. Normalizes all voltage formats (e.g. “12”, “12V”, “12 V”) for consistent matching.
  • “Added” filter: Toggle to show only products you’ve added to your enquiry list. Useful for reviewing your selection before sending an RFQ.
  • Filter persistence: All filters (category, stock, voltage, added, search) are now preserved across each other and across pagination.

v3.129.4 May 17, 2026

SCCL performance certificate

  • About page: Added Singareni Collieries Company Limited (SCCL) performance certificate card to the testimonials section with “View Certificate” link.

v3.129.3 May 17, 2026

Custom upload-image toolbar button

  • Upload Image button: Added a dedicated “Upload image” toolbar button to all Jodit editors (products, series, KB articles, pages). This bypasses Jodit v4’s broken built-in uploader and uses a direct fetch() to /admin/editor/upload. Click the landscape-icon button next to the existing Image button, pick one or more files, and they’re uploaded + inserted inline.
  • Original Image button preserved: The built-in Image button still works for pasting image URLs directly.

v3.129.2 May 17, 2026

Jodit editor image upload

  • Image file upload: The image button in all Jodit WYSIWYG editors (products, series, KB articles, pages) now supports drag-and-drop and click-to-browse file upload. Images are saved to the image library and inserted inline.
  • Upload endpoint: Added POST /admin/editor/upload — accepts image files (JPG, PNG, WebP, GIF up to 10 MB) and returns the Jodit-compatible JSON response.

v3.129.0 May 17, 2026

Enquiry cart → Send RFQ redirect

  • Replaced inline form: The enquiry cart page (/quote) no longer has its own contact form. Instead, a “Send a RFQ” button redirects to the /requirements page with all cart SKUs and quantities pre-filled.
  • Quantity carry-through: SKU:qty pairs are now passed via the ?skus= query param (e.g. ?skus=10461457:3,10479048:2) and auto-fill the requirements form with correct quantities. Supported on both the public requirements form and portal RFQ page.

v3.128.0 May 17, 2026

Smarter related products matching

  • New matching logic: Related products table now filters by same voltage, same or greater power output, same mount type (from product specs), and same category — replacing the old "top 4 by price in same category" logic.
  • Paginated results: Displays 5 related products per page with Prev/Next pagination when more matches exist, showing "Showing 1–5 of N matches" inline with navigation.

v3.127.3 May 17, 2026

Rich text editor for product descriptions

  • Jodit HTML editor: The Full Description field on the product edit form now uses the Jodit v4 rich text editor (same as series and page forms), supporting bold, italic, headings, lists, links, images, tables, and YouTube embeds.
  • HTML rendering: Product detail pages now render the full description as HTML instead of plain text, so formatting entered in the editor displays correctly on the public site.

v3.127.2 May 17, 2026

Redis prefix isolation for multi-environment

  • Configurable Redis prefix: Added REDIS_PREFIX environment variable so theta and production can share the same Redis server without key collisions. Sessions, translation cache, and globals cache are now fully isolated between environments. Defaults to ni: if not set (backward-compatible).

v3.127.1 May 17, 2026

Maintenance mode & sitemap fixes

  • Admin frontend bypass: Logged-in admins can now browse the public frontend while maintenance mode is active, so they can verify the site before re-opening to visitors.
  • Sitemap resilience: All five database queries in /sitemap.xml now gracefully handle missing tables or columns instead of returning a blank error page. Added error logging to help diagnose schema gaps.

v3.127.0 May 17, 2026

Maintenance mode

  • Maintenance page: New admin toggle (Settings → Maintenance Mode) puts the public site behind a branded “Under Maintenance” splash page. Returns HTTP 503 with noindex meta so search engines know the outage is temporary.
  • Admin & portal bypass: /admin, /portal, API webhooks, and static assets remain accessible while maintenance mode is active so administrators can continue working.
  • Custom message: Optional message field lets you inform visitors what’s happening and when to expect the site back.

v3.126.0 May 17, 2026

SEO migration & structured data

  • Legacy URL redirects: 301 redirect middleware maps all indexed URLs from the old static newindo.com site (50+ .htm pages) to their new Express equivalents. Preserves SEO equity during domain cutover.
  • Product structured data: Product detail pages now emit Schema.org Product JSON-LD with SKU, brand, price/availability offers, and technical specs as additionalProperty.
  • BreadcrumbList schema: Product detail and series pages include BreadcrumbList structured data for rich search result navigation.
  • Article schema: Blog article pages emit Schema.org Article JSON-LD with headline, author, publisher, and dates.
  • FAQPage schema: The FAQs page emits FAQPage structured data with all Q&A pairs for rich snippet eligibility.
  • Hreflang tags: All public pages now include hreflang alternate links for English, Hindi, and x-default to signal multilingual content to search engines.

v3.125.0 May 17, 2026

Portal security — session, rate limiting, and data hygiene

  • Session inactivity timeout: Portal sessions now auto-expire after 2 hours of inactivity; users are redirected to login with an informational message.
  • Secure logout: Logout now fully destroys the session and clears the cookie (previously only deleted portal fields).
  • Write-route rate limiting: RFQ submit and warranty creation are limited to 10 per 15 minutes; file uploads to 20 per 15 minutes (per user).
  • Input length enforcement: Subject (200), notes/comments (5000), and general fields (500) are server-side truncated. Items capped at 50 per RFQ. Urgency field restricted to allowed enum values.
  • Magic link hardening: Timing-safe token verification added as defense-in-depth. Expired tokens are pruned automatically (on startup + every 6 hours).
  • Download security headers: RFQ attachment downloads now send X-Content-Type-Options: nosniff, restrictive CSP, and Cache-Control: private.
  • Audit log retention: Portal activity log entries older than 90 days are automatically pruned (on startup + every 24 hours).

v3.124.0 May 17, 2026

Portal security hardening

  • CSRF protection: All multipart POST routes (RFQ submit, warranty create, warranty file upload) now validate CSRF tokens after multer parsing.
  • Open redirect fix: The account-switch return_to parameter is now restricted to /portal/ paths only.
  • File access control: RFQ attachments moved from the public web root to an authenticated download route. Portal users can only access their own files; admin uses a separate authenticated route.
  • Role-based access control: Write routes (RFQ submit, warranty create/edit/upload, account edit) now enforce role checks. The viewer role is read-only; finance can edit account details but not submit RFQs or warranty claims.
  • Stored XSS fix: Warranty detail page now escapes CRM comment fields.

v3.123.0 May 17, 2026

Portal auto-login from RFQ form + Zoho CRM deduplication

  • Logged-in portal users visiting /requirements are now automatically redirected to the portal RFQ form with their cart items carried through.
  • Anonymous visitors whose email matches an active portal user are auto-logged in after OTP verification and redirected to the portal RFQ (creating a Deal linked to their existing CRM record).
  • Portal RFQ now accepts ?skus=X,Y,Z query parameters for catalog cart passthrough.
  • Anonymous submissions: Zoho CRM is searched by GSTIN and email before Lead creation. If an existing Account or Contact is found, a Deal is created (linked to the existing record) instead of a duplicate Lead.
  • New crm_match_type and crm_deal_id columns in quotations table. Admin quotation detail shows “Existing CRM Account/Contact” badge when a match is detected.

v3.122.3 May 17, 2026

Fix: Step 2 wizard validation for PAN

  • The “Continue” button on Step 2 now validates that either GST or PAN has been entered (for business customers) before advancing.
  • PAN field is now visible on initial page load when Business is pre-selected and GST is empty.

v3.122.2 May 17, 2026

Urgency, PAN fallback, customer reference, international phone, billing address

  • New “How urgent is this requirement?” field in Step 4 with four levels: Emergency, Urgent, Standard (default), and Budgetary. Saved to DB and shown in admin detail, listing, and notification email.
  • Business entity: Company Name is now mandatory. If GST is not provided, PAN number becomes mandatory (validated as AAAAA9999A format). PAN field auto-shows/hides based on GST input.
  • New optional “Your Inquiry Reference” field for business customers to cross-link with their internal PR/indent number.
  • RFQ form now accepts international phone numbers (E.164 format: +country code followed by 7–15 digits). SMS OTP remains available for Indian numbers only.
  • “Company Address” renamed to “Billing Address” and made mandatory for both business and individual customers.
  • Company Name, Designation, and Inquiry Reference hidden when “Personal / Individual buyer” is selected.

v3.122.1 May 17, 2026

RFQ form — preserve state on validation errors

  • Form submission now uses AJAX — validation errors are shown inline without losing form data or wizard state.
  • Server returns field-specific error messages (name, email, phone, GST, parts) and the form navigates to the relevant step.
  • Added /requirements/success GET route for post-submit redirect.

v3.122.0 May 17, 2026

Admin dates + RFQ search term capture

  • All admin portal dates now display in DD-MM-YYYY HH:MM format, converted to IST (Asia/Kolkata). New formatIST() helper replaces inconsistent toLocaleDateString() calls.
  • RFQ form now captures what the visitor typed before selecting from autocomplete (search_term column). Shown in admin quotation detail, admin email, and customer confirmation email when it differs from the matched SKU.
  • Fixed duplicate SKU display in RFQ part selection (e.g. “8201091 — 8201091 STARTER”).
  • Lead-time dot: amber changed to golden (#E5A100), dot size increased from 6 px to 8 px for better visibility.

v3.121.1 May 16, 2026

Catalog — rename button label to “RFQ”

  • Product card button changed from “+ Enquiry” to “+ RFQ” across all 11 languages.

v3.121.0 May 16, 2026

Catalog — enquiry toggle, “Send a RFQ” with pre-filled parts

  • Clicking “✓ Added” now removes the product from the enquiry list (toggle on/off).
  • Bottom CTA changed from “Open Enquiry List” to “Send a RFQ” — links to /requirements with selected part numbers pre-filled.
  • Requirements form now accepts multiple SKUs via ?skus= query param.
  • POST /quote/remove now returns JSON for AJAX callers.

v3.120.4 May 16, 2026

Products page — swapped badge/button styling

  • Lead time badge is now plain text (colored dot + text, no border or background) so it blends with the card.
  • Enquiry button gets a bordered rounded-rectangle (brown outline) so it reads as the actionable element.
  • “✓ Added” state uses a green-bordered rectangle.

v3.120.1 May 16, 2026

Products page — card footer polish

  • Fixed lead time colored dot not rendering (pseudo-element needed display:block).
  • Removed underline from product card link text on all states (hover, visited, active).
  • Increased gap between lead badge and enquiry button so they read as separate elements.

v3.120.0 May 16, 2026

Products page — lead time badges & inline enquiry button

  • Product catalog cards now show “Lead Time: X days” instead of stock position badges. The colored dot indicates urgency (green ≤ 14 days, amber ≤ 60 days, red > 60 days).
  • New inline “+ Enquiry” button on each product card — add multiple products to your enquiry list directly from the catalog without navigating into each product.
  • Button swaps to “✓ Added” (green) once clicked; uses AJAX so the page doesn’t reload.
  • Stock filters at the top of the page continue to work as before for narrowing by availability.
  • New .lead-badge and .enquiry-add-btn CSS — light fill + thin border (A2 style), body font, high-contrast dark text on white cards.
  • Added pd.leadTime, cta.enquiryShort, and catalog.added locale keys across all 11 languages.

v3.119.3 May 16, 2026

Admin portal page — full-width layout fix

  • Fixed admin pages not rendering full width when table content overflows (e.g. portal users with many action buttons).
  • Added min-width:0 to .admin-main so flex child respects viewport bounds.
  • Added .table-responsive CSS for horizontal scroll on wide tables.

v3.119.2 May 16, 2026

Email log — device info, geo location & proxy detection

  • Opened column now shows parsed device and browser (e.g. “Mac · Chrome”) from the User-Agent header. Full UA visible on hover.
  • Approximate city and country shown from IP geo-lookup (via geoip-lite, offline — no API calls).
  • Known mail proxy IPs (Gmail, Apple, Outlook) are labelled instead of showing a misleading IP address.

v3.119.1 May 16, 2026

Business Summary — Indic translations

  • All Business Summary card labels on the portal account page now support Hindi and 9 other Indic languages (17 new biz.* locale keys).

v3.119.0 May 16, 2026

Product detail — price & stock card styling

  • Unified price and stock card headings to match the sidebar “Technical Specifications” label style (uppercase, letterspaced, muted).
  • Price notes now render as a proper bulleted list with separate “Bulk discounts available (MOQ > 10pcs)” line item.

v3.118.2 May 16, 2026

MOQ spec migration

  • One-time migration script (scripts/migrate-moq-spec.js) moves “Minimum Order Qty” from product specs into the dedicated moq column and deletes the redundant spec rows.
  • Import scripts (Korea & EMEA) no longer create the MOQ spec — value is set directly on the product row.

v3.118.0 May 16, 2026

Product catalog stock filter & MOQ column

  • New stock filter on the products page: In Stock (ATP > 0), On Order (ATP ≤ 0), and MOQ On Order (MOQ > 1 and not in stock).
  • New moq (Minimum Order Quantity) column on products, editable in admin product form.
  • Filter combines with category and search; all persist across pagination.
  • Stock labels and footnotes translated into all 10 Indic languages.

v3.117.0 May 16, 2026

Stock position card — allocation & made-to-order scenarios

  • Stock card now shows three distinct scenarios: In Stock (on hand with warehouse-based lead time), Available for Allocation (stock in transit, +60 days default), and Available to Order (manufactured to order, +150 days sea / +75 days air).
  • New configurable lead time fields per product in admin: Allocation Lead, Order Lead — Sea, and Order Lead — Air.
  • Contextual footnotes explain each scenario to the customer: transit allocation, or made-to-order with air freight option.

v3.116.0 May 16, 2026

Admin stock table & product stock card overhaul

  • Admin stock table: removed Product column, centre-aligned numeric columns, moved On Order to last position.
  • ATP formula revised to On Hand − Hard Committed − Soft Reserved (Incoming no longer added).
  • New AFA (Available for Allocation) column in admin stock table: On Order + ATP.
  • Product detail stock card now shows ATP as the “On hand” value; lead time derived from warehouse location (Delhi = 7 days, Gurugram = 14 days) and hidden when stock is zero.
  • Admin sidebar logo and “← Website” button now open the public site in a new tab.
  • IP addresses in admin email log are now clickable links to ip.me for geolocation lookup.

v3.115.0 May 16, 2026

Email tracking IP address fix

  • Fixed email open/click tracking storing incorrect IP addresses (proxy/loopback instead of real client IP) behind cPanel’s Apache + Passenger reverse proxy.
  • New trackingClientIp() helper reads X-Forwarded-For and X-Real-IP headers directly, with ::ffff: prefix stripping for clean IPv4 storage.

v3.114.0 May 16, 2026

Multi-account portal access

  • Portal users linked to multiple Zoho accounts (sister concerns / branch offices) can now switch between companies using a dropdown in the sidebar.
  • Linked accounts are auto-discovered at login by searching all Zoho Contacts matching the user’s email and collecting their distinct Account associations.
  • New portal_user_accounts table persists the user–account links, refreshed on each login.
  • Admin impersonation now also populates linked accounts so the switcher works during testing.
  • Dashboard “Recent Quotations” and “Recent Invoices” cards now show counts from the last 180 days instead of the most recent 5.
  • Admin “Customer Portal” page shows a badge when a user has multiple linked companies.

v3.113.2 May 16, 2026

Business stats improvements & portal data fixes

  • Added “Avg. Execution Time” metric to business summary cards (portal & admin) — computes average days between PO receipt and invoice date.
  • Added “Avg. Payment Cycle” metric — averages Zoho Payment_Cycle_Days across all invoices, color-coded green/amber/red (≤30 / ≤60 / >60 days).
  • Fixed Despatch Contact displaying as [object Object] on account view and edit pages — now correctly extracts the lookup name.
  • Fixed GSTIN field using wrong Zoho API name — reads GSTN_No with GST_Number fallback.
  • Order stats now count both “Won” and “Full Order Received” quote stages.
  • Fixed account edit form change detection for Zoho lookup-type fields.

v3.113.0 May 16, 2026

Customer business summary cards

  • Portal “My Account” page now shows a Business Summary card with: total invoiced business (all-time & current Indian FY), quotation counts, orders won, and order placement rate percentage.
  • Admin “Customer Portal” page: each user row now has a “Stats” button that expands an inline card with the same business metrics, fetched live from Zoho CRM.
  • New Zoho helper getAccountBusinessStats() fetches all invoices and quotes for an account (paginating up to 2,000 records) and computes totals using Indian FY (April–March).

v3.112.1 May 16, 2026

Translation Center sticky footer fix

  • Fixed bulk-action bar (“Select all / Mark Reviewed / Lock / Reset to Machine”) overlapping the last table rows — content now scrolls clear of the bar.

v3.112.0 May 16, 2026

Live Redis stats on admin dashboard

  • Redis Cache card now shows live metrics: memory used, percentage free, cache hit rate, and hit/miss counts — auto-refreshes every 30 seconds.
  • Free memory indicator is colour-coded: green (≥50%), amber (30–49%), red (<30%).
  • New API endpoint /admin/api/cache/stats returns Redis memory and keyspace statistics.

v3.111.1 May 16, 2026

Cache management improvements

  • Cache TTL range extended up to 1 year — new options: 1 day, 1 week, 30 days, 1 year.
  • Translations (Hindi and regional languages) now cached in Redis alongside nav, footer, categories, and settings.
  • Configured cache TTL now loads at app startup so all cache writes use the correct value immediately.
  • Fixed “Flush Cache Now” and TTL “Apply” buttons that silently failed due to a middleware routing issue.
  • Fixed CSRF token delivery for cache API calls — token now sent via X-CSRF-Token header for reliability.

v3.110.1 May 16, 2026

Redis cache management card on dashboard

  • New Redis Cache card in the Quick Actions section of the admin dashboard: live connection status badge, adjustable cache TTL (5 min to 24 hours), and “Flush Cache Now” button to clear all cached data instantly.
  • All caching layers (translations, navigation, footer links, categories, settings) now fall back to a 30-second in-process cache when Redis is unavailable, preventing DB overload while Redis is down.
  • Sessions: public pages are unaffected by Redis downtime; admin users may need to re-login once Redis recovers. If the app is restarted while Redis is down, sessions automatically fall back to MySQL.

v3.109.0 May 16, 2026

Fix translations not appearing on frontend after save

  • Removed per-worker in-process translation cache TTL; all Passenger workers now read from shared Redis on every request, so cache invalidation is instant across workers.
  • Translation Center save now also invalidates the globals cache (navigation, footer links, categories, settings) so edited labels appear on the frontend immediately.

v3.108.1 May 16, 2026

Phonetic transliteration in Translation Center

  • New “Transliterate” toggle on the Translation Center editor: type in English on a standard keyboard and get real-time suggestions in the target script (Hindi, etc.) powered by Google Input Tools.
  • Suggestion dropdown appears as you type, with number-key shortcuts (1–5) to pick alternatives; Space/Enter commits the top suggestion automatically.
  • Server-side proxy endpoint with in-memory cache to keep transliteration fast and avoid CORS issues.
  • Fix: suggestion dropdown now renders as a solid opaque panel above page content with proper z-index and shadow, instead of blending into background rows.

v3.107.0 May 15, 2026

Dark mode removed & Indic font size boost

  • Removed dark mode entirely from the public site and admin panel. All pages now render in light theme only, resolving reports of dark mode activating unexpectedly for Windows visitors using new browsers.
  • Non-English pages (Hindi and other Indic scripts) now render at 110% font size across all text-size settings, improving readability for complex scripts.

v3.106.0 May 15, 2026

Tally Prime CSV import for DEL stock, hard commitments & on-order

  • New “Import from Tally Prime” section on the Stock & Inventory admin page: upload a Tally Reorder Status CSV to reset DEL warehouse stock, hard commitments (Sale Orders Due), and on-order quantities (Purc Orders Pending) in a single operation.
  • Two-step import flow with preview table: parsed CSV rows are matched to the product catalog, current vs. new values shown side-by-side with delta indicators, and anomalies flagged (stock dropping to zero, unexpected increases, Tally hard vs. Zoho hard mismatches).
  • Per-SKU exclusion: uncheck individual rows before confirming to skip anomalous products.
  • Import cycle: CSV sets the weekly baseline; between imports, Zoho quote webhooks add real-time soft/hard deltas. Pre-import Zoho hard reservations are automatically released (absorbed into Tally’s Sale Orders Due on next import).
  • Handles Tally’s UTF-16LE encoded CSVs and “5 PCS”-style quantity values.

v3.105.0 May 15, 2026

On Order stock column & expanded soft reservation stages

  • Added “On Order” column to the admin Stock & Inventory page showing expected incoming quantities from supplier, fed via Tally CSV import.
  • Added Draft, Planned, and Quoted-No Followup to soft reservation stages for the Zoho CRM quote webhook (previously only Quoted and Validity Extended).
  • Updated legend and ATP formula documentation on the stock page.

v3.104.0 May 15, 2026

Media tab redesign, requirements prefill & upload limit fix

  • Redesigned the admin product Media tab: each image slot (ANG, FRO, SID, BAC) now has its own “Browse Library” and “Upload” buttons with inline preview, replacing the old single-picker workflow.
  • “Send Requirements Instead” on product pages now prefills the part number, product name, and quantity into the requirements wizard.
  • Bumped Express body-parser limit from 1 MB to 5 MB to fix “Payload Too Large” errors when saving large KB articles.

v3.103.0 May 15, 2026

Contact form & spam protection for all public forms

  • Wired the /contact form to the internal service desk: submissions create a ticket (category “other”) and send a confirmation email, exactly like the Service Desk page.
  • Added Google reCAPTCHA v3 (invisible, score-based) to all six public-facing forms: Contact, Service Desk, Register, Login, Quote Submit, and Requirements.
  • New reusable partial partials/recaptcha.ejs — drop-in include for any form; auto-disabled when keys are unset.
  • New server module lib/recaptcha.js: verifies tokens with Google, blocks low-score bots, fails open on network error to avoid blocking real users.
  • Added per-endpoint rate limiting via express-rate-limit: 10 submissions / 15 min for forms, 5 / 15 min for login.
  • Removed duplicate dead GET /contact route near the bottom of public.js.

v3.102.1 May 14, 2026

Fix nav labels ignoring admin-edited text

  • Removed legacy t() locale-file override in header.ejs: nav labels now come exclusively from the database via tr(), making the admin Navigation editor the single source of truth.
  • Previously, stale nav.* keys in locale JSON files would silently override whatever the admin had set (e.g. “Contact Us” in admin rendered as “contact us” on the site).

v3.102.0 May 14, 2026

Redis caching for per-request globals

  • New lib/redis.js: shared ioredis client (Unix socket at /tmp/redis.sock) with graceful degradation—site works without Redis, just loses the speed-up.
  • New lib/globals-cache.js: Redis-backed cache for settings, categories, footer links, and nav items. 1-hour TTL with explicit invalidation on admin saves.
  • Translations cache (lib/i18n.js) now checks Redis first before querying the database, with in-process 5-minute fast path.
  • i18n middleware deduplicated: settings are read from the globals cache instead of a separate DB query, eliminating a redundant round-trip on every request.
  • Session store: prefer Redis (connect-redis) with automatic fallback to MySQL if Redis is unavailable.
  • Globals middleware in server.js replaced four inline DB queries with cached lookups—most page loads now hit Redis instead of MariaDB.
  • All admin POST handlers (categories, settings, logo, footer links, nav items) now explicitly invalidate their corresponding cache entry after writes.

v3.101.3 May 14, 2026

Fix nav Hindi translations not rendering + Translation Center CSRF

  • Fixed navigation items showing in English even when Hindi translations exist: tr(item, 'label_en') was looking for label_en_hi (which doesn’t exist) instead of label_hi. Added a property alias in the nav loader so tr() finds Hindi under the expected key.
  • Fixed save error in Translation Center: AJAX save and bulk-status calls now include the CSRF token, preventing 403 rejections from the global CSRF middleware.
  • Error tooltips: save button now shows the actual error message on hover when a save fails.

v3.101.1 May 14, 2026

Translation Center — centralised human review of all translations

  • New Translation Center in the admin panel: a dashboard showing all 10 Indic languages with progress bars, linking to per-language review editors.
  • Each language page groups translations by content type (UI Strings, Products, Series, Categories, Pages, etc.) with AJAX-loaded tabs, paginated 25 per page, filterable by status and searchable.
  • Side-by-side editor: English source on the left, target language textarea on the right. Each field can be saved individually via AJAX.
  • Three-state review workflow: Machine (auto-translated, can be overwritten), Reviewed (human-verified, protected from auto-overwrite), and Locked (explicitly protected). Bulk actions for status changes.
  • Auto-translate (translateRecordToAll and deriveHindi) now respects status flags—reviewed and locked translations are never overwritten by machine translation.
  • Source-change detection: a hash of the English text is stored alongside each translation. When the English source changes, the translation is flagged as “stale” so the reviewer knows it needs re-checking.
  • Database migration adds status, source_hash, reviewed_by, and reviewed_at columns to the translations table.

v3.100.4 May 14, 2026

Zoho Stock Sync admin page redesign

  • Redesigned the Zoho Stock Sync admin page with a clear “How It Works” section explaining Quote and Invoice state machines (soft/hard reservations, deductions).
  • Added Webhook Configuration reference showing endpoints, auth method, and required parameters with a live configured/not-configured badge.
  • Added a colour-coded legend (Quote = blue, Invoice = green) and status indicators (OK, Skipped, Error).
  • Renamed the events table to “Webhook Event Log” with an event count badge and improved empty-state guidance.

v3.100.3 May 14, 2026

Zoho webhook: token via Custom Parameters + auto-fetch line items

  • Zoho CRM rejects ? in webhook URLs and does not support custom headers, so the auth token is now sent as a Custom Parameter in the webhook body (token field). The server checks req.body.token as a fallback after headers and query params.
  • Zoho CRM webhooks cannot send sub-form data (line items) via Module Parameters. The stock sync engine now automatically fetches the full Quote or Invoice record from the Zoho API using the record ID when line items are missing from the webhook payload.
  • Webhook setup is now simpler: only id and Stage as Module Parameters, plus token as a Custom Parameter—no headers, no query params, no line items needed.
  • Updated the Zoho Stock Sync Deployment Guide to match the actual Zoho CRM webhook UI throughout.

v3.100.1 May 14, 2026

Warranty claim per-field inline editing

  • When a warranty claim’s status is “New”, each editable field shows a pencil icon. Clicking it opens an inline input for that field; press Enter to save (or Ctrl+Enter for textareas), Escape to cancel. Each field saves independently via AJAX—no full-page form submit.
  • Editable fields: Subject, Serial Number, Traceability Number, Quantity, VIN, Engine Details, Hours Run, Mileage, Date of Fitment, Date of Failure, and all observation/comments fields.
  • Once the status moves past “New”, all fields revert to read-only with no pencil icons.
  • Added updateWarrantyClaim to the Zoho integration layer (Cases API PUT).

v3.99.0 May 14, 2026

Customer enquiry confirmation email

  • New: customers now receive a branded confirmation email after submitting the requirements form, mirroring the admin notification layout but with customer-appropriate language.
  • Includes a “Please note” callout box with two disclaimers: (1) prices are Basic per PC/NOS, taxes and freight are extra; (2) zero-price items may be obsolete or unpriced—contact sales for clarification.
  • Confirmation email is non-blocking—failures are logged but do not affect form submission.

v3.98.0 May 14, 2026

Admin settings page redesign

  • Redesigned the Settings page with a two-column grid layout. All settings are now grouped into clear, labeled sections with a single “Save All Settings” button that sticks to the bottom of the viewport.
  • Merged Language & Navigation into one section. Integrations now display in a two-column card grid with status badges.
  • Logo upload and Site Information sit side-by-side below the main form. Collapses to a single column on mobile (< 900px).

v3.97.3 May 14, 2026

Fix FAQ category dropdown

  • Replaced the unreliable <datalist> category field with a proper <select> dropdown plus an “Other…” option that reveals a text input for custom categories.
  • Added missing categories: Orders, Pricing, Products. List now matches all categories in use on the public FAQ page.

v3.97.1 May 14, 2026

Upload RFQ attachments to Zoho CRM Leads

  • RFQ file attachments submitted via the requirements form are now uploaded to the corresponding Zoho CRM Lead record as an attachment.
  • New uploadRecordAttachment helper in zoho.js for general-purpose record-level attachments (Leads, Deals, Contacts, etc.).
  • Upload failures are logged but do not block form submission or Lead creation.

v3.97.0 May 14, 2026

Portal user sync from Zoho CRM

  • Portal user details (name, email, company, phone) are now synced from Zoho CRM on every login. Previously, these were stored at invitation time and never refreshed.
  • New admin “Sync” button on the Portal Users page lets admins manually refresh a user’s details from their linked Zoho CRM contact.
  • Sync is non-blocking — if Zoho is unreachable at login, the user still logs in with cached data.

v3.96.3 May 14, 2026

Warranty form: full cascading from invoice selection

  • Selecting an invoice now auto-fills: Invoice Date, Product dropdown (from line items), Unit Price (from Basic_PC), and PO/Quotation (from the invoice’s linked Quote record).
  • PO/Quotation auto-populates from the quote linked to the selected invoice. If no quote is linked, the dropdown becomes editable and loads all the customer’s quotes with PO_Number_Date.
  • Invoice Date and Unit Price fields are read-only.
  • Invoice detail endpoint now fetches and returns the linked Quote with PO_Number_Date and Offer_Number.
  • Fixed: dropdowns no longer overflow their grid cell.

v3.95.0 May 14, 2026

Customer portal: warranty claim submission form

  • New: customers can submit warranty claims directly from the portal at /portal/warranty/new. Claims are pushed to Zoho CRM Cases module with Case_Reason = “Failure under Warranty”.
  • Multi-section form covering claim details, product & invoice info, equipment data, failure observations, and file uploads (documents + photos).
  • Invoice and PO/Quote fields are lookup dropdowns populated from the customer’s existing Zoho records. Product field uses a live typeahead search with auto-fill of unit price.
  • Two-phase submission: record created first, then files uploaded to Zoho’s file-upload fields.
  • Server-side validation for mandatory fields (subject, serial number, dates, comments). Form preserves entered data on validation failure.
  • “+ New Claim” button added to warranty claims listing and empty state.

v3.94.1 May 14, 2026

Fix series rename cascade

  • Fixed: renaming any series now cascades to ALL products in that series regardless of brand. The series owns its products by name — the cascade should never filter by brand.

v3.94.0 May 14, 2026

Multi-brand series support

  • Added multi_brand flag to product series. When enabled, the series page shows products from all brands (not just Delco Remy) and uses a brand-less URL: /products/series/<slug>.
  • Brand column automatically appears in the product table for multi-brand series. Series hero and specs bar adapt to omit single-brand references.
  • SEO: branded URLs redirect 301 to the brand-less canonical URL for multi-brand series; single-brand series redirect the other way.
  • Admin: multi-brand toggle on the series edit form, “Multi-brand” badge on the series listing, updated product count query to include all brands.
  • Homepage showcase: product count and URL generation updated to respect multi-brand flag.

v3.93.0 May 14, 2026

Streamline font list + expand text-size range

  • Removed Sans-Serif, Serif, and Courier from the font chooser — kept Monospace (JetBrains Mono) as the single fixed-width option. Font list is now 8 choices across admin, frontend, and portal.
  • Added XXS and XXL text-size stops (7 total: XXS / XS / Small / Medium / Large / XL / XXL). Updated CSS, JS whitelist, slider, and all admin/frontend/portal pickers.

v3.92.0 May 14, 2026

Move display preferences into a modal dialog

  • Replaced the sidebar preferences panel with a small gear icon in the footer bar (between version and logout). Clicking it opens a centered modal with Font, Text Size, and Theme options.
  • The sidebar footer is now compact: just “← Website”, version, gear, and logout. No space consumed by preference buttons.
  • Modal closes on click-outside or the × button. Works identically in expanded, collapsed, and mobile sidebar states.

v3.91.0 May 14, 2026

Collapse display preferences into a single gear button

  • Replaced the three always-visible preference groups (font, size, theme) with a single “Display” gear button that opens a compact popover panel on click.
  • Reclaims roughly half the sidebar footer height. Panel closes on click-outside.
  • When sidebar is collapsed, the gear icon stays visible and the panel flies out to the right.

v3.90.3 May 14, 2026

Fix font chooser overflow in sidebar

  • Added flex-wrap to the preference option buttons so the 11 font choices wrap neatly within the sidebar instead of overflowing horizontally.

v3.90.2 May 14, 2026

Admin font size chooser shows all 5 levels

  • Expanded the admin text-size chooser from 3 options (Small / Medium / Large) to all 5 levels: XS, Small, Medium, Large, XL — matching the frontend.

v3.90.1 May 14, 2026

Fix admin font chooser label

  • Renamed the default font option from “System” to “Source Sans 3” in the admin font chooser, matching the frontend label.

v3.90.0 May 14, 2026

Admin area font sizes converted to rem

  • Converted all font-size declarations across 47 admin EJS templates and admin-specific CSS selectors from fixed px values to rem units.
  • Admin typography now scales with the root font-size preference, ensuring consistent sizing when users change the text-size setting (Small / Medium / Large).

v3.89.3 May 14, 2026

Full font list + fix preference flyout hover gap

  • Font family chooser now lists all 11 fonts matching the public frontend: System, Sans-Serif, Serif, Monospace, Segoe UI, Arial, Tahoma, Inter, Open Sans, Verdana, Courier.
  • Fixed flyout panels disappearing when moving cursor from trigger icon to options. Added a transparent hover-bridge pseudo-element to keep :hover state connected across the gap.

v3.89.2 May 14, 2026

Admin preference choosers with flyout panels

  • Replaced the old font-size and theme button strip in the admin sidebar footer with three flyout-capable preference groups: Font Family (System / Sans / Serif / Mono), Text Size (Small / Medium / Large), and Theme (Auto / Light / Dark).
  • When the sidebar is collapsed, each group shows a clean SVG icon. Hovering reveals a flyout panel with labeled options — matching the nav submenu pattern.
  • Icons rationalized: Type icon for font, big-T/small-T for size, contrast circle for theme.

v3.89.1 May 14, 2026

Fix flyout submenu clipping

  • Fixed collapsed-sidebar flyout submenus not appearing. The overflow: hidden on .admin-nav and .admin-sidebar was clipping the absolutely-positioned flyout panels. Set overflow: visible on both elements when sidebar is collapsed.

v3.89.0 May 14, 2026

Admin sidebar: flyout submenus when collapsed

  • When the sidebar is collapsed to icon-only mode, hovering over a group icon now shows a flyout panel with the submenu items instead of rendering invisible empty blocks. Includes a header label pulled from data-label attribute and proper styling with dot markers.
  • Added title attributes to all group toggle buttons for tooltip accessibility.
  • Mobile breakpoint unaffected — sidebar still expands to full overlay on small screens.

v3.88.2 May 14, 2026

Fix KB article table headers

  • Added .kb-table-dark CSS class for dark-header tables in KB articles. Site-level th styles were overriding inline backgrounds, making header text invisible.

v3.88.1 May 14, 2026

KB-STR-001 Slow-Cranking Diagnostic Guide

  • Added comprehensive diagnostic guide for 24V 50MT starter slow-cranking complaints to Knowledge Base. Includes 5 embedded Delco Remy YouTube videos, voltage spec tables, symptom categories, 5-step diagnostic procedure, and 15-item warranty documentation checklist.
  • SQL insert script at scripts/seed-kb-str001.sql.

v3.88.0 May 14, 2026

10 Delco Remy technical articles for Knowledge Base

  • Added 10 technical articles with optimized images across three categories: Starters & Diagnostics, Alternators & Charging, and Electrical Systems. Covers diagnostics, Smart IMS, Remote Sense, brushless alternators, soft-start, overcrank protection, IMSS, alternator sizing, heavy-duty alternators and battery maintenance.
  • SQL seed script at scripts/seed-kb-articles.sql for inserting articles into kb_articles table.

v3.87.7 May 14, 2026

Switch to Fast2SMS OTP route

  • Changed from route=v3 (Quick Transactional, returned empty responses) to route=otp with variables_values parameter. The OTP route uses Fast2SMS’s built-in OTP template and returns proper JSON responses.

v3.87.1 May 14, 2026

Phone OTP error messaging improvement

  • Updated the phone OTP error message to guide users to continue and submit the RFQ even if SMS sending fails.
  • On SMS send failure, a detailed debug email (API config, payload, error, stack trace) is sent to the admin inbox to help diagnose Fast2SMS issues.

v3.87.0 May 14, 2026

Delivery address and RFQ file upload on requirements form

  • Added a “Delivery address same as company address” checkbox (checked by default). Uncheck to reveal a separate delivery address field — stored in its own column and shown in admin.
  • New “Attach Formal RFQ” file upload field accepts PDF and Excel files up to 10 MB. Uploaded files are saved to /uploads/rfq/ and linked in the admin quotation detail view.

v3.86.0 May 14, 2026

Phone number OTP verification

  • Optional phone number verification via SMS OTP on the requirements form. Sends a 6-digit code via Fast2SMS and shows a “verified” badge on the phone field once confirmed. Does not block form submission — unverified numbers are accepted but flagged.
  • Phone verification status stored in the database (phone_verified column on quotations, new phone_verifications table) and displayed with a badge in the admin quotation detail view.
  • API key configurable via Admin → Settings → “Fast2SMS API Key”.

v3.85.0 May 14, 2026

GST number auto-verification with full GSTN data capture

  • Requirements form and quote cart now auto-verify GST numbers on blur/paste via the Jamku GST API (RapidAPI, 1,000 free lookups/day). Displays a comprehensive verified card with trade name, legal name, entity type, PAN, registration date, address, compliance rating, e-invoice status, turnover slab, HSN/SAC codes, business activities, and jurisdiction details.
  • All verified GSTN data is persisted to the database (18 new columns on quotations) and displayed in the admin quotation detail view with a “verified” badge.
  • Auto-fills company name and delivery address fields from verified data.
  • Graceful fallback — if verification fails or API is unavailable, the GST number is accepted as entered without blocking the form.
  • API key configurable via Admin → Settings → “GST Verification API Key”.

v3.84.5 May 14, 2026

Fix 404.ejs crash from smart quotes

  • Replaced 40 curly/smart quote characters (‘ ’ “ ”) with straight quotes in views/404.ejs. EJS compiles template code blocks to JavaScript, which does not recognize smart quotes as string delimiters — causing a 500 “Invalid or unexpected token” error whenever the 404 page was rendered.

v3.84.4 May 14, 2026

KB PDF translation extended to all Indic languages

  • PDF document translation now generates translated PDFs for all 10 Indic languages (Hindi + Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, Punjabi), not just Hindi. Regional PDF paths are stored in the translations table so tr(doc, 'file_path') resolves correctly.
  • New translatePdfToAll() wrapper in lib/pdf-translator.js — loops through all languages, stores Hindi path in file_path_hi column and regional paths in translations table.
  • translatePdf() now accepts an opts.targetLang parameter (default 'hi').

v3.84.3 May 14, 2026

Fix series card taglines not translating on home page

  • Home page series query was missing s.id in the SELECT list, so the _id tag was undefined and tr() could never build a valid cache key. Added s.id to the query — series taglines now resolve correctly for all regional languages.

v3.84.2 May 14, 2026

Fix nav item translations not resolving in regional languages

  • Navigation labels in the header dropdown were showing English for regional languages despite translations existing in the database. Root cause: tr(it, 'label') looked up cache key ...:label but translations were stored under field name label_en. Changed to tr(it, 'label_en') so the field name matches the translations table. Affects both top-level nav items and dropdown children.

v3.84.1 May 13, 2026

Fix regional language translations not resolving on public pages

  • Added _table / _id tags to all DB row loaders so tr() can look up non-Hindi Indic translations from the translations cache. Previously, industries, products (listing), product series (home), categories, equipment, FAQs, and KB articles/documents (listing) were missing these tags, causing tr() to skip the cache and fall straight through to English.

v3.84.0 May 13, 2026

Legal pages moved to CMS — editable from admin area

  • Moved hardcoded HTML content from Terms of Business, Online Sales T&C, Privacy Policy, and Warranty Terms & FAQs EJS templates into the pages database table. All four pages are now fully editable from /admin/pages using the Jodit rich-text editor.
  • Body content is translatable via the existing translateRecordToAll() pipeline — saving a legal page with “Retranslate” checked auto-generates translations for Hindi + 9 Indic languages. The /admin/translations audit page now correctly tracks legal page body translations.
  • Added db/legal-bodies.js with extracted HTML content; seed.js migration (safe for --migrate-only) inserts body content for existing databases without overwriting admin edits.
  • EJS templates simplified to hero section + <%- pageBody %> only — no more inline fallback HTML.

v3.83.6 May 13, 2026

Remove Hindi fallback from regional language content

  • tr() now falls back directly from the selected regional language to English, skipping the intermediate Hindi step. All Indic languages have their own translations via translateRecordToAll(), so the Hindi detour is no longer needed.

v3.83.5 May 13, 2026

Auto-translate to all languages on admin save

  • Retranslate checkbox now checked by default on all admin content forms — every save auto-translates Hindi + 9 Indic languages (Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, Punjabi) via Google Translate.
  • Added retranslate checkbox to article, industry, and equipment forms (previously missing).
  • New translateRecordToAll() helper upserts translations for a single record into the translations table across all Indic languages — runs fire-and-forget after the redirect so admin saves stay fast.
  • Industries and equipment forms now auto-translate _hi columns via deriveHindi() instead of relying on manual Hindi input.
  • Added ~182 missing t() locale keys (auth, catalog, legal, hero, KB, nav, product detail, series, etc.) to en.json, hi.json, and all 9 Indic locale files — fixes mixed-language rendering on Terms, Privacy, Warranty, Knowledge Base, and catalog pages.

v3.83.4 May 13, 2026

Complete i18n audit — error pages, locale key gaps, about page

  • Error pages (403/404/500): replaced all isHindi checks with t() locale keys — headlines, bodies, reference label, phone line, and CTA all translate correctly in every language.
  • Added 26 new keys to en.json (error.*, compat.*, form.other, pd.notesPlaceholder, product.starter/alternator, table.partNum, about.registrations/testimonials) and translations for all 9 Indic locales.
  • Backfilled 20 enquiry/portal keys missing from Indic locale files (bn, mr, te, ta, gu, kn, or, ml, pa) — all 588 keys now present in every locale.

v3.83.3 May 13, 2026

Eliminate remaining isHindi checks from templates

  • Footer: tagline, address, copyright, trademark, disclaimer, link groups, and link labels now use tr() instead of isHindi — all Indic languages get proper translations.
  • Generic page body, KB article body, and KB document file path also switched from isHindi to tr().

v3.83.2 May 13, 2026

Wire translations table cache into all public routes

  • Tag DB rows with _table / _id so tr() can resolve non-Hindi Indic translations from the translations table cache (series detail, product detail, KB articles/documents, generic pages, loadPage()).
  • Rewrite pageMeta() and pickRow() to use i18n.tr() instead of manual column checks, enabling the same translations-cache lookup for meta tags and JSON APIs.

v3.83.1 May 13, 2026

Fix mixed-language rendering on Indic locale pages

  • Route-level i18n: replaced all isHi Hindi-only checks in public routes with a language-aware cascade (_<lang> column → _hi fallback → English). Affected routes: series detail, product detail, KB articles/documents, generic pages, and the shared pageMeta() / pickRow() helpers.
  • Locale keys: added 9 missing UI string translations (series.keyFeatures, series.needQuote, series.productsIn, cta.equipmentSearch, etc.) to all 9 Indic locale files (bn, mr, te, ta, gu, kn, or, ml, pa).

v3.83.0 May 13, 2026

Responsive tables — card layout on mobile

  • Admin tables: all .admin-table elements convert from horizontal tables to stacked card layouts at ≤900px. Each row becomes a bordered card with label–value pairs, eliminating horizontal scrolling.
  • Portal tables: all .portal-table elements convert to card layout at ≤768px with the same label–value pattern.
  • Auto-labeler JS reads <th> headers and applies data-label attributes to every <td>, so no template changes are needed.

v3.82.1 May 13, 2026

Improve sidebar footer contrast

  • Version number and Logout link in the admin sidebar footer now use higher-contrast dark navy instead of faded steel with 60% opacity.

v3.82.0 May 13, 2026

Responsive admin, portal & visitor pages for mobile/tablet

  • Admin sidebar: off-canvas hamburger menu on mobile/tablet (≤900px) instead of full-screen icon stack. Slides in from the left with a backdrop overlay; closes on link tap or backdrop tap.
  • Admin tables: horizontal scroll wrapper so wide tables don’t overflow on small screens. Smaller font sizes and padding on mobile.
  • Portal: definition-list grids collapse to single column on phones (≤480px). Tighter padding for small screens.
  • Visitor pages: hero accents capped to viewport width, display-prefs panel and language picker fit mobile, stats bar and form grid adjust at 480px, login card uses max-width instead of fixed width.
  • Added dedicated breakpoints at 480px (small phone) alongside the existing 600px and 900px.

v3.81.0 May 13, 2026

Richer error alert emails

  • Email subject now includes portal version, HTTP status, and the URL path — e.g. [New Indo v3.81.0] 404 Error (/app/).
  • Email body now shows a Visitor Details section: IP address, parsed device/browser/OS summary, language preferences, and referer.
  • Raw User-Agent string included for full debugging context.

v3.80.0 May 13, 2026

CLI bulk translator for all languages

  • New scripts/translate-all.js — runs from SSH with a live terminal progress bar, bypassing Passenger entirely. Supports any language or all, with --table, --db-only, --static-only, and --dry-run flags.
  • Hardened generateDbContent with per-table and per-field error handling so a missing column skips gracefully.
  • Background translation job in admin UI now runs fully detached from Express handler.

v3.79.3 May 13, 2026

Fix translation job crash — robust error handling

  • Background translation job now runs fully detached from the Express handler so an unhandled error cannot crash the server or kill the polling connection.
  • Added per-table and per-field error handling in generateDbContent so a missing column or query failure skips that table gracefully instead of aborting the whole job.

v3.79.2 May 13, 2026

Fix translation progress — switch from SSE to polling

  • Passenger’s lsnode wrapper buffers entire HTTP responses, making SSE unusable. Replaced with a polling approach: POST starts the job and returns a jobId immediately; the client polls a GET endpoint every second for progress updates.
  • Progress modal now works reliably behind Passenger/cPanel regardless of proxy buffering.

v3.79.1 May 13, 2026

Fix SSE buffering for translation progress

  • Added 2 KB padding flush and proxy-bypass headers so the translation progress stream reaches the browser immediately instead of being buffered by Passenger/nginx.

v3.79.0 May 13, 2026

Live progress bar for translation generation

  • Clicking “Generate” on the Translation Audit page now shows a live progress modal with a progress bar, row count, and per-table status updates streamed in real time via SSE.
  • When complete, a summary shows translations generated, skipped, and errors, with a “Done — Reload” button to refresh the audit.

v3.78.4 May 13, 2026

Fix translation audit missing column rendering

  • The “Missing” column in the Translation Audit database content table was showing raw HTML tags instead of rendered styled text. Fixed EJS escaping (<%=<%-).

v3.78.3 May 12, 2026

Remove Notes column from product applications table

  • Removed the empty “Notes” column from the equipment/applications table on product detail pages.

v3.78.2 May 12, 2026

Part search cleanup — show only part numbers

  • RFQ part search dropdown no longer dumps the full cross-reference text. Results now show SKU, brand, series, voltage, stock only.
  • API response trimmed — removed bulk cross_refs payload from /api/part-search, reducing response size.

v3.78.1 May 12, 2026

Nav labels respect admin-set names

  • Navigation item labels set in the admin editor now take priority over hardcoded i18n keys. Previously, built-in translations (e.g. “Send Requirements”, “Customer Portal”) always overrode whatever was typed in the admin nav editor.
  • The Customer Portal auth link also uses the admin-set label when available.

v3.78.0 May 12, 2026

Part Number Finder in top navigation

  • Added a Part Number Finder typeahead search to the main navigation bar, available site-wide on all customer-facing pages.
  • Type 2+ characters to see up to 5 matching SKUs with series names; keyboard navigation (Arrow keys, Enter, Escape) fully supported.
  • On mobile (< 900px) the input collapses to a magnifying-glass icon that expands on tap.
  • Dark-mode compatible — dropdown uses theme-aware CSS variables.

v3.77.3 May 12, 2026

Admin stock column + product detail OEM Status

  • Admin products list now shows Total Stock (all warehouses combined) instead of single-warehouse on-hand quantity.
  • Product detail page: replaced the generic “Status: Active/Inactive” spec row with OEM Status showing the actual value (Active, Discontinued, Obsolete, etc.).

v3.77.2 May 12, 2026

Portal impersonation uses granular permissions

  • Impersonate (“Login as”) now respects the portal.impersonate permission instead of requiring super_admin role. Managers and staff with this permission enabled can now impersonate portal users.
  • The “Login as” button is hidden for admins without the permission.

v3.77.1 May 12, 2026

Translation fixes — CSRF token + HTML-safe translate

  • Fixed CSRF token on translation generate forms — “Invalid or missing security token” error resolved.
  • Google Translate API now uses format: html so fields containing HTML markup (body, description, features, etc.) have their tags preserved during translation instead of being mangled.

v3.77.0 May 12, 2026

Translation audit system — multi-language coverage dashboard

  • New Translations page under Site & Navigation in the admin panel showing per-language coverage for both static UI strings (locale JSON files) and database content (products, series, pages, FAQs, etc.).
  • One-click “Generate Missing” auto-translates missing content via Google Translate API — per language, per table, or all at once.
  • New translations database table stores non-Hindi translations without adding columns to every content table. Hindi continues to use dedicated _hi columns.
  • The tr() helper now checks the translations table for languages beyond Hindi, with an in-process cache (5-minute TTL) for zero-latency lookups.
  • Supports all 10 Indic languages: Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, Punjabi.

v3.76.5 May 12, 2026

Admin data integrity: server-side validation + auto-create series

  • All product write paths (bulk action, inline edit, Excel import, product form) now validate that series and category values exist in the database before saving — preventing orphan strings that break frontend series pages.
  • Product form “Create new series” now auto-creates a product_series record with the correct brand and category, ensuring the frontend page exists immediately.
  • Excel import rejects rows with unknown series or category names and reports them in the error summary.
  • SKU column on series detail page no longer wraps.

v3.76.4 May 12, 2026

Bulk update dropdowns for Series, Brand, Category, Badge, and Country

  • The bulk “Set Field” toolbar now shows a dropdown instead of a free-text input for Series, Brand, Category, Badge, and Country of Origin — preventing typos and mismatches.
  • Inline cell editing (double-click) for Series and Brand columns also uses a dropdown picker sourced from the product_series table and existing brands.

v3.76.3 May 12, 2026

Inline “Add new country” for Country of Origin

  • Country of Origin dropdown now includes a “+ Add new country…” option that shows an inline text field. Type a 2-letter ISO code (e.g. TH) or “Thailand (TH)” and it gets added to the list instantly.
  • Dropdown is also populated from all distinct country codes already in the database, so any country entered via bulk import or CRM sync appears automatically.

v3.76.2 May 12, 2026

Per-image removal on product Media tab

  • Each angle card (ANG, FRO, SID, BAC) now has its own “Remove” checkbox so individual images can be deleted without affecting the others.
  • If all four images are removed, the product’s image_url is cleared automatically.

v3.76.1 May 12, 2026

Product edit form — save stays on page, multi-angle image uploads

  • Saving a product now redirects back to the same edit page and tab instead of returning to the product list. A flash message confirms the save.
  • Media tab now shows 4 separate upload fields for Angle, Front, Side, and Back images, with existing thumbnails previewed for each.
  • Uploaded images are always saved as .jpg with the correct angle suffix (_ANG, _FRO, _SID, _BAC), fixing the mismatch where non-JPG uploads did not render on the public product detail page.

v3.76.0 May 11, 2026

Portal users — server-side search & pagination

  • Admin portal users page now uses server-side search and pagination (25 per page) instead of loading all users at once.
  • Search queries the database directly — all 423+ users are now searchable by name, email, or company.
  • Pagination controls with page numbers, prev/next, and result count. Search and page context are preserved when changing a user’s role, resending a magic link, or suspending/reactivating.

v3.75.1 May 11, 2026

Zoho CRM PDF template IDs in admin settings

  • Moved the three hardcoded Zoho CRM PDF template IDs (Quotation, Invoice, Warranty Claim) to the admin Settings page so they can be viewed and changed without a code deploy.
  • New “Zoho CRM PDF Templates” section under Settings with fields for each template ID.
  • Template IDs are cached for 5 minutes and the cache is cleared on settings save.

v3.75.0 May 11, 2026

RFQ file attachments

  • Portal customers can now attach up to 3 supporting documents (PDF, Word, Excel, PowerPoint — 10 MB each) when submitting a quote request.
  • Drag-and-drop upload zone with file preview, size display, and remove button.
  • Attachments are shown in both the customer’s RFQ detail view and the admin RFQ detail page with download links.
  • New rfq_attachments database table; files stored in /uploads/rfq/.

v3.74.0 May 11, 2026

Consistent naming — Enquiry & Quote Request terminology

  • Public website: renamed “Quotation / Order List” to “Enquiry” across all pages, buttons, cart, success screen, and navigation tooltip.
  • Admin panel: renamed “Quotations / Order Lists” to “Website Enquiries” in sidebar, dashboard, and list page. Renamed “RFQs” to “Quote Requests” in the portal submenu.
  • Updated English and Hindi i18n files with new keys (old keys preserved for compatibility).
  • Updated admin notification email subject and template to say “Enquiry” instead of “Quotation.”

v3.73.1 May 11, 2026

Sidebar navigation consolidation

  • Renamed “Customers & Portal” group to “Customers” and renamed “Portal Users” to “Customers” for clarity.
  • Removed legacy Customer Accounts link from the main Customers group.
  • Added a “Legacy” section at the bottom of the sidebar containing the old Customer Accounts page for reference.

v3.73.0 May 11, 2026

Collapsible admin sidebar

  • Added a toggle button on the sidebar to collapse it to icon-only mode (56px), giving the main content area significantly more width for data-heavy pages.
  • Collapsed state is remembered via cookie — persists across page navigations and sessions.
  • Hover tooltips appear on collapsed nav icons showing the full label.
  • Smooth CSS transition on expand/collapse. Disabled on mobile (sidebar stacks naturally).
  • Supports dark mode styling for the toggle button.

v3.72.4 May 11, 2026

Portal admin page polish

  • Reorganised portal page legend into grouped columns — Roles and Actions displayed as separate vertical lists instead of inline text.
  • Made action buttons inline (no wrapping) for a cleaner table layout.
  • Reduced table font size for better density on the portal users list.

v3.72.2 May 11, 2026

Remove .htaccess from git tracking

  • Added .htaccess to .gitignore — this file is managed by cPanel/Passenger on the server and should not be tracked in the repo.
  • Prevents git pull conflicts when cPanel rewrites Passenger directives on server restart.

v3.72.1 May 11, 2026

Fix: portal display toggle button sizing

  • Set fixed width (60px), height (36px), and border-radius (9px) on the Aa display toggle button in the portal header.

v3.72.0 May 11, 2026

Page legends across all admin and portal pages

  • Admin pages (36 pages): Added subtle page legends below every heading — each with a contextual description, usage tips, and shortcut links where applicable.
  • Customer portal (13 pages): Added matching page legends to dashboard, quotes, invoices, RFQs, account, and warranty pages.
  • New CSS class: .page-legend — muted 13px text with pipe-separated tips, auto-breaks to its own line in flex containers.

v3.71.5 May 11, 2026

Fix: smart-table toolbar and footer spacing

  • Base styles: Updated .st-toolbar and .st-footer with consistent padding: 5px, margin: 16px, gap: 12px, and a top border on the footer for visual separation.
  • Admin styles: Aligned .admin-main overrides to match; capped search input at 420px max-width to prevent full-width stretching.

v3.71.3 May 11, 2026

Fix: CSRF token validation on multipart form submissions

  • Bug fix: Product edit, image uploads, brand logos, KB documents, and bulk import forms no longer fail with “Invalid or missing security token” when submitted with file attachments.
  • Root cause: Global CSRF middleware ran before multer could parse multipart/form-data bodies, so req.body._csrf was always empty. Middleware now defers validation on multipart requests; each route handler validates the token after multer has parsed the body.

v3.71.2 May 11, 2026

Add robots.txt and dynamic sitemap.xml

  • robots.txt: Added static robots.txt allowing crawlers, blocking /admin/, /portal/, and /api/ paths.
  • sitemap.xml: Added dynamic XML sitemap pulling products, series, articles, KB articles, and CMS pages from the database with correct URLs and last-modified dates.

v3.71.1 May 11, 2026

Fix: duplicate series on repeated migrations

  • Bug fix: npm run migrate:safe no longer re-runs the series auto-populate query when the product_series table already has rows, preventing duplicate entries caused by whitespace or casing variations in product data.
  • Slug normalization: Improved slug generation to trim whitespace, collapse double-hyphens, and strip trailing hyphens before insertion.

v3.71.0 May 11, 2026

Granular Permissions System

  • Per-user permission overrides: Super admins can now fine-tune individual permissions for any admin user, overriding their role defaults on a per-permission basis.
  • ~50 granular permissions: Comprehensive permission set covering all admin sections — Dashboard, Products & Catalog, Stock & Inventory, Customers & Portal, Orders & Service, Content, Site & Navigation, Configuration, and Administration.
  • Permissions editor: New visual editor accessible from the user edit page showing all permissions grouped by section, with role defaults displayed and three-state controls (Use Role Default / Grant / Deny).
  • Role-based defaults: Three built-in roles (Super Admin, Manager, Staff) each with sensible defaults. Overrides layer on top without changing the role itself.
  • Reset to defaults: One-click button to clear all overrides and revert to role defaults.

v3.70.0 May 11, 2026

Bulk Product Manager

  • Bulk Manager page: New dedicated page under Products & Stock → Bulk Manager for managing large numbers of products at once.
  • Checkbox + bulk actions: Select multiple products and apply bulk status changes (Active/Draft, listing status), update any field across all selected products, assign images, or delete in one action.
  • Inline editing: Double-click any editable cell (series, brand, voltage, output, price) to edit it directly in the table — changes save instantly via AJAX.
  • Active toggle: Click any Active/Draft badge to toggle it instantly without leaving the page.
  • Filters: Filter products by search text, category, series, brand, listing status, and active/draft before applying bulk actions.
  • Excel export: Download the full product catalog as an .xlsx file with 31 columns of data.
  • Excel import: Upload an .xlsx file to bulk-update existing products (matched by SKU) or create new ones. Same format as the export.
  • Bulk image assignment: Select products and assign an image from the image library or enter a custom URL — applied to all selected products at once.

v3.69.0 May 11, 2026

Admin user management & audit trail viewer

  • Admin Users page: Super admins can now create, edit, and delete admin panel users from Configuration → Admin Users. Supports three roles: super_admin, manager, and staff.
  • Audit Trail page: New report page under Reports showing all admin actions (logins, product edits, deletions, settings changes) with filters by user, action type, and date range.

v3.68.0 May 10, 2026

Security hardening

  • CSRF protection: All POST/PUT/DELETE forms and AJAX calls now require a per-session CSRF token, preventing cross-site request forgery attacks.
  • Security headers: Added Helmet middleware for HSTS, X-Content-Type-Options, X-Frame-Options, and Referrer-Policy headers.
  • Rate limiting: Admin and portal login endpoints are now rate-limited to prevent brute-force attacks.
  • Session hardening: Sessions are regenerated on login to prevent fixation attacks. Production startup now requires SESSION_SECRET to be set.
  • Open redirect fix: Click-tracking redirects are now validated against an allowlist of trusted domains.
  • SVG upload block: SVG files are no longer accepted in logo, brand, or image library uploads to prevent stored XSS.
  • Portal access controls: Ownership checks on quotes, invoices, and warranty claims now deny access by default when account data is missing.
  • Impersonation restricted: Portal impersonation now requires super_admin role instead of any admin.
  • Zoho webhook auth: Webhook endpoint now rejects requests when the webhook token environment variable is not configured.
  • Error message scrubbing: Internal error details are no longer exposed to portal users in PDF, file download, and upload error responses.
  • Password security: Removed legacy plain-text password fallback from admin login.
  • Footer cleanup: Removed version number from the customer-facing footer.

v3.67.0 May 10, 2026

Portal activity tracking and audit log

  • Portal activity log: New portal_activity_log table tracks every customer login, logout, page view, RFQ submission, PDF download, profile edit, and warranty upload with IP, user-agent, and entity context.
  • Live sessions: Admin Portal Activity page shows currently active portal sessions with customer name, company, last action, and last-seen timestamp.
  • Activity report: Filterable log table with customer, action type, and date range filters, color-coded action badges, and pagination.
  • Automatic page-view tracking: Fire-and-forget middleware logs every authenticated portal GET request without blocking the response.
  • Email template cleanup: Removed distributor tagline from branded email header and footer.

v3.66.0 May 10, 2026

Branded emails with delivery and engagement tracking

  • Branded HTML templates: All portal emails (magic links, OTP codes, quotation notifications, service tickets, account approvals, invitations, error alerts) now use professionally branded HTML templates with Newindo identity, replacing plain text.
  • Email tracking: Self-hosted open tracking (1x1 pixel) and click tracking (redirect links) on all outbound emails. No third-party dependencies.
  • Email log database: New email_log table records every outbound email with status progression (queued, sent, opened, clicked, bounced, failed), timestamps, and engagement counts.
  • Admin email report: New Email Log page under Reports with summary cards (total/sent/opened/clicked/failed), filterable by status, email type, and date range, with pagination.

v3.65.1 May 10, 2026

Industry images committed to repository

  • Image files added: 10 real equipment photos (JPG) added to /images/industries/ — mining, excavation, power generation, marine, and transport.

v3.65.0 May 10, 2026

Industries page — real equipment photos

  • Authentic equipment photos: Replaced stock imagery with real equipment photos — CAT 796 AC, Komatsu HD785, BEML BH60M, Wirtgen 220 SM, L&T KSM403, Cummins engine, Hyster reach stackers, and Volvo dump truck.
  • Mixed sourcing: 10 proprietary photos for Mining, Excavation, Marine, Power Gen, and Transport; Unsplash stock retained for Oil & Gas and gap-fills.

v3.64.0 May 10, 2026

Industries page equipment photo gallery

  • Flip-card photo gallery: Each industry card now displays three rotating equipment photographs with CSS 3D flip animation, replacing the previous gradient placeholders.
  • Equipment imagery: 18 curated photos covering Mining, Excavation, Power Generation, Marine, Oil & Gas, and Commercial Transport industries.
  • Auto-cycling: Photos rotate every 4 seconds with dot navigation indicators for manual selection.

v3.63.0 May 10, 2026

Configurable series listing columns

  • Admin column picker: Series edit form now lets admins choose which columns to display on the public series product listing (Voltage, Power, Rated Output, Pinion, Mount Type, Ground, OE Number, Make).
  • Rated Output fix: Falls back to products.power when no spec-table entry exists — fixes dashes on EMEA range products.
  • OE Number & Make columns: New column options pull data from cross-references and applications tables respectively.
  • Schema: Added listing_columns (JSON) to product_series table.

v3.62.14 May 10, 2026

EMEA range — fix "various models" & improve model correlation

  • Removed "various models": Products without specific model data now show a blank equipment field instead of the misleading "various models" placeholder.
  • Improved correlation: Fixed 17 model-to-make mapping failures across 14 products by adding make aliases (KHD↔DEUTZ, VOLVO CE↔VOLVO C.E.), ambiguous model resolution (MK for both Iveco and Mercedes-Benz), and domain-specific corrections (Barber Greene, Volvo BM loaders, Caterpillar forklifts).
  • Generic term filtering: Strips non-model descriptors like "agricultural" and "industrial" from the model field.
  • Fix: Use empty string instead of NULL for blank equipment (column has NOT NULL constraint).

v3.62.12 May 10, 2026

EMEA range — equipment applications & cross-references fix

  • Data fix: Re-parsed all 327 EMEA range products to split combined make strings (e.g. "DAF/MAN/MERCEDES-BENZ/RENAULT TRUCKS") into individual per-make application rows with correctly correlated models.
  • PDF artifact repair: Fixed corrupted make names from PDF extraction (e.g. "GOL DONI" → "GOLDONI", "MERCEDES- BENZ" → "MERCEDES-BENZ") and model name artifacts.
  • Canonicalization: Normalised spelling variants (RENAULT TRUCK → RENAULT TRUCKS, IRUSBUS → IRISBUS) and compound make names (82 known multi-word makes).
  • Cross-references: Verified competitor refs (Prestolite, Mahle, WAI) and vehicle MFG numbers exist as individual OE ref rows.
  • Script: scripts/fix-emea-applications.js — run with --dry-run to preview, without to apply.

v3.62.11 May 10, 2026

Series content population — batch 2

  • Content: Added rich descriptions, features, applications, voltage/power ranges, and meta tags for 6 Delco Remy series: 39MT, 31MT, 38MT, 29MT, 30SI, and Refrigeration/APU. Content sourced from official delcoremy.com product pages.
  • Script: scripts/populate-series-content-batch2.js — run with --dry-run to preview, without to apply.

v3.62.10 May 10, 2026

Cascade series rename to products

  • Bug fix: Renaming a series in the admin form now automatically updates the products.series field for all products in that series. Previously, renaming a series orphaned its products because products link to series by name.

v3.62.9 May 10, 2026

Series merge bulk action

  • Merge series: Select 2+ series in the admin series table, choose “Merge selected” from the bulk action dropdown, and a confirmation page lets you pick the target series to keep and the category for the merged result. Products from all other series are reassigned to the target, then the merged series are deleted.

v3.62.8 May 10, 2026

Fix Delco Remy consolidation script

  • Alternator Units series: Separated alternator-units products into their own “Delco Remy Alternator Units” series instead of lumping them into Spares. Script now creates three consolidated series: Spares, Starter Motor, and Alternator Units.
  • Catch-all: Added a fallback UPDATE to sweep any remaining products from deleted series into “Delco Remy Spares”, preventing future mismatches from unexpected categories.
  • Verification scope: Narrowed orphan check to only verify reassigned products, not all 800+ pre-existing orphans.

v3.62.7 May 10, 2026

Delco Remy series consolidation script

  • Migration script: Added scripts/dr-series-consolidation.js to consolidate SKU-named Delco Remy series into “Delco Remy Spares” and “Delco Remy Starter Motor”. Retains all MT, SI, PG260D, PG260N2, and REFRIGERATION/AUX series. Dry-run by default, --execute to apply.

v3.62.6 May 10, 2026

Series bulk actions

  • Bulk action bar: The admin series table now supports multi-select with checkboxes and a bulk action bar. Actions include: suppress from homepage, show on homepage, set hidden (inactive), set active, and delete selected series.

v3.62.5 May 10, 2026

Admin product form & series table improvements

  • Series dropdown: The Series field in the product edit/add form is now a dropdown populated from the database, grouped by brand. Includes a “Create new series” option for unlisted series names.
  • Series table layout: The admin series table now displays Brand as the primary column with Series as a subcategory underneath, sorted by brand first for clearer grouping.

v3.62.4 May 10, 2026

Image picker — pagination & verified images

  • Paginated grid: Browse Library now shows 24 images per page with Prev/Next controls, instead of loading 500+ images at once (was causing 113 MB of requests and browser slowdowns).
  • Verified files only: API now checks file existence on disk before including database-sourced images, eliminating 404 errors for products without uploaded photos.
  • Removed lazy loading: Fixed images not rendering in the scrollable modal due to loading="lazy" not triggering inside overflow containers.

v3.62.2 May 10, 2026

Image picker fix

  • Database-backed image list: The Browse Library modal now pulls known-working image URLs from the products and series tables in addition to filesystem scans, making thumbnails reliably visible.
  • Graceful fallback: Images that fail to load now show the filename as a clickable placeholder instead of an empty box.
  • Better search: Image picker search now matches against both filename and full URL path.

v3.62.1 May 10, 2026

Cleaner stock badges

  • Simplified labels: “Limited Stock 2 · 5d lead” is now just “Limited Stock 2”. “Available to order (+60 days) · 60d lead” is now “On Order +60 days”. Lead time details remain on the product detail page.
  • No-wrap badges: All stock badges are now forced to a single line with slightly reduced font size to prevent wrapping on narrow cards.

v3.62.0 May 10, 2026

Site-wide sortable tables

  • All tables sortable: Every table across the admin panel, customer portal, and public site now supports click-to-sort on all column headers. Uses the unified smart-table system for consistent behavior everywhere.
  • Tables updated: Equipment, Industries, Brands, Customer Accounts, Portal Users, Quote Requests, Zoho Sync Detail, Quotation Detail, Stock & Inventory (sort re-enabled), Series Pages, and all portal tables (Invoices, Quotes, Warranty Claims, RFQ History).
  • Series table cleanup: Replaced custom inline sort code with the standard smart-table component for consistency and reduced page weight.

v3.61.1 May 10, 2026

Sortable series table

  • Sortable columns: All table headers on the Series Pages admin list are now clickable to sort ascending/descending. Supports text and numeric sorting with visual indicators. Works alongside the existing search filter.

v3.61.0 May 10, 2026

Image library & picker

  • Image library: New admin page under Catalog to browse, upload, preview, and delete images across all image directories (products, library, series). Grid view with thumbnails, file sizes, and a full-screen preview overlay.
  • Product form image picker: The Media tab now has a “Browse Library” button that opens a modal to select any existing image from the library. Upload still works as before — library pick and direct upload coexist, with upload taking priority.
  • Series form image picker: Replaced the plain text URL input for series images with a visual picker — browse and select from the library with a live preview, or remove the current image.

v3.60.0 May 10, 2026

Tabbed product form

  • Product editor tabs: The 500+ line product form is now organized into 6 tabs — Core, Logistics, Media, Stock, Technical, and CRM. All fields remain in a single <form> so saves work exactly as before, but the editing experience is far less overwhelming. Tab state toggles via CSS classes with no page reloads.
  • Wider form cards: Product form cards expand to 900px inside tabs (up from 700px) to take advantage of the available space.

v3.59.0 May 10, 2026

Admin panel overhaul — navigation, roles & audit trail

  • Sidebar overflow fix: Admin nav now scrolls when links exceed viewport height, with compact font sizes and a slim custom scrollbar.
  • Navigation regrouping: Sidebar reorganized into functional groups — Setup (configuration & master data), Catalog (products & stock), Transactions (customers, portal, orders), Content (articles & KB), and Reports & Audit. Portal sub-pages (Users, Profile Updates, RFQs) now have dedicated nav links.
  • Admin roles: Three-tier role system (super_admin, manager, staff) with requireRole() middleware. First admin auto-promoted to super_admin on migration. Role stored in session and exposed to views.
  • Audit trail: New admin_audit_log table records who did what, when, and from where. Logs admin logins, product create/update/delete, and settings changes. Non-blocking — audit failures never break the main flow.
  • Series homepage bug fix: Series with show_on_home = 1 but no tagline now display correctly on the homepage (removed hidden tagline IS NOT NULL SQL filter).

v3.58.0 May 10, 2026

Admin field gap audit — full coverage

  • Product form: Added Model, Catalog Type, Reman SKU fields; added Logistics, Tax & Marketplace card with HSN/SAC, GST Rate, Weight, Catalog Price, Pack, Box Size, Warranty, GeM Product ID, and GeM Catalog URL.
  • Series form: Added editable Brand and Brand Slug fields with auto-slug generation.
  • Categories CRUD: New inline-edit admin page under System → Categories. Bulk save all categories at once, add new categories with custom slug IDs.
  • Industries CRUD: New admin page under System → Industries with list view, edit form for all fields (name, slug, icon, descriptions, part count), and add modal.
  • Equipment CRUD: New admin page under System → Equipment with paginated list (50/page), search by name/make/model, edit form, and add modal.
  • Warehouses CRUD: New inline-edit admin page under System → Warehouses. Edit code, name, city, sort order, and active status for all warehouses at once.
  • Homepage content: Hero card (featured series, specs, promo) and stats bar values are now editable from Settings instead of hardcoded.

v3.57.1 May 10, 2026

Country of Origin field in admin product form

  • New field: Added Country of Origin dropdown to the admin product edit/add form with common ISO country options (MX, IN, CN, US, KR, JP, DE, BR, HU). The column already existed in the database but had no UI to set it.

v3.57.0 May 9, 2026

Zoho CRM stock sync via webhooks

  • Zoho Quote webhooks: Automatically creates soft reservations when quotes reach "Quoted" or "Validity Extended" stage, converts to hard on "Won", and releases on "Expired", "Lost", "Cancelled", or any other stage. Quantity revisions are diffed against the last sync.
  • Zoho Invoice webhooks: Deducts on-hand stock (DEL first, overflow to GGN) and releases hard reservations when invoices are created. Supports partial invoicing across multiple invoices per quote.
  • Sync tracking tables: New zoho_stock_sync and zoho_sync_lines tables track every processed webhook with per-line-item reservation and deduction quantities for auditing and debugging.
  • Admin sync dashboard: New "Zoho Stock Sync" page under Catalog shows all webhook events with status, stage, line counts, and drill-down to see per-SKU reservation and deduction details.
  • Webhook security: Token-based validation via X-Zoho-Webhook-Token header, configurable through ZOHO_WEBHOOK_TOKEN environment variable.

v3.56.0 May 9, 2026

Materialized ATP architecture

  • Stored stock values: All five inventory metrics (on_hand, hard_committed, soft_reserved, incoming_qty, atp) are now stored directly on the products table and recalculated only when stock transactions occur. This eliminates expensive multi-JOIN queries on every page load.
  • recalcStock engine: New recalcStock(), recalcStockAll(), and recalcStockBatch() functions in the inventory engine, called automatically after every reservation create/release/convert, product save, and inventory import.
  • Simplified display queries: Removed all getProductAtpBatch() calls from product listings, detail pages, series pages, part search, and compatibility search. Stock badges now read product.atp directly.
  • Admin dashboard: getStockOverview() and getNegativeAtpProducts() now read materialized values from the products table instead of computing them dynamically.
  • Import script: import-inventory.js now calls recalcStockAll() after importing warehouse stock instead of manually updating total_stock.

v3.55.11 May 9, 2026

Fixes

  • Admin stock dashboard: On Hand, Hard, Soft, and ATP columns now correctly read from atpByProduct (the getStockOverview result) instead of missing fields on the inline product query row. Previously showed zeros for all ATP-related columns.

v3.55.10 May 9, 2026

Improvements

  • Admin stock dashboard: Added collapsible legend panel explaining every column, the ATP formula, and status badge thresholds.

v3.55.9 May 9, 2026

Fixes

  • ATP calculation: Fixed getProductAtpBatch returning a Map instead of a plain object, causing all bracket-notation lookups (atpMap[id]) to silently return undefined. Service parts, compatibility search, and product listings were falling back to raw total_stock instead of true ATP.
  • Admin stock dashboard: ATP column now uses product_stock sum (same as public pages) instead of stale products.total_stock denormalized column. ON HAND column also updated.

v3.55.8 May 9, 2026

Fixes

  • Stock badge: Fixed invisible ATP quantity number in stock badges; qty chip now uses explicit background colours per variant instead of currentColor.

v3.55.7 May 9, 2026

Improvements

  • Price card: Added “International Warranty of Manufacturer is applicable” note.

v3.55.6 May 9, 2026

Improvements

  • Price card: Added “GST extra as applicable” note below the ex-warehouse line on the product detail page.

v3.55.5 May 9, 2026

Improvements

  • Product detail layout: Moved the price and stock position cards from the sidebar into the main content area, displayed side by side in a single row after the Overview section. Stacks vertically on mobile.

v3.55.4 May 9, 2026

Improvements

  • Product detail layout: Moved Country of Origin out of the Technical Specifications table and into the Brand card in the sidebar, displayed to the right of the brand name.

v3.55.3 May 9, 2026

Bug Fixes

  • Specs deduplication: Product detail page no longer shows both “Voltage” and “System Voltage” in the Technical Specifications table. If the product has a Voltage value, “System Voltage” from the specs list is suppressed. If Voltage is empty, System Voltage still appears.

v3.55.2 May 9, 2026

Improvements

  • Table headers: Increased spec-table and apps-table header font size from 0.625rem to 0.75rem for better legibility.

v3.55.1 May 9, 2026

Improvements

  • Typography: Increased default body font size from 16px to 18px for better readability. The user-switchable font-size scale (xs–xl) has been recalculated around the new baseline.

v3.55.0 May 9, 2026

New Feature

  • Admin product image upload: Product edit and add forms now support uploading a product image directly from the admin panel. Shows a preview of the current image, accepts JPG/PNG/WebP up to 10 MB, and saves with standard CDN-compatible naming ({SKU}_ANG.jpg). Includes option to remove existing image.

v3.54.6 May 9, 2026

Maintenance

  • .gitignore: Added public/images/products/ and public/images/brands/ so server-only uploaded images are never wiped by git operations. Fixed stray {views/ typo.

v3.54.5 May 9, 2026

Improvements

  • Stock badges: Quantity on limited-stock items now renders as a bold white-on-colour chip instead of small parenthesised text — far easier to read at a glance across product detail, catalog, series, and compatibility pages.

v3.54.4 May 9, 2026

Bug Fixes

  • Service & child parts: Stock badges on product detail page now use full ATP data instead of raw qty_on_hand — parts with stock and positive ATP no longer show “Out of Stock”.

v3.54.3 May 9, 2026

Bug Fixes

  • Stock badge: Lead time now context-aware — in-stock items show 5-day warehouse dispatch instead of the full procurement lead time (which was misleadingly showing 60 days for stocked products).
  • Home page: Fixed TypeError: Cannot read properties of undefined (reading 'contains') in series thumbnail hover tooltip.
  • Admin stock: Fixed 500 error on /admin/stock — ATP queries referenced p.name instead of p.product_name.

v3.54.0 May 9, 2026

Available-to-Promise (ATP) Inventory System

  • Schema: New stock_reservations and incoming_stock tables for hard/soft inventory reservations and purchase order tracking. Eight new ATP settings columns in settings table.
  • Engine: New lib/inventory.js with ATP calculation (On Hand − Hard Committed − Soft Reserved + Incoming), row-level locking via FOR UPDATE, configurable soft reservation percentage, scarce-stock override, auto-expiry, and 60-second settings cache.
  • Admin — Settings: New “Inventory Reservations (ATP)” section with soft reservation %, quote expiry days, rounding mode, alert email, and four toggle switches.
  • Admin — Stock: Stock dashboard now shows Hard Committed, Soft Reserved, and ATP columns with color-coded values and ATP-aware status badges (Available, Limited, Fully committed, Overcommitted).
  • Public site: All stock badges across product detail, catalog, series pages, part search, and compatibility search now use ATP instead of raw physical stock. Exact quantities hidden for ATP > 10 (“In Stock”); limited stock shows available count.
  • Document: ATP Inventory Reservation Policy document generated for team review.

v3.53.0 May 9, 2026

Portal — Reorder from past quote or invoice

  • Feature: Added “Reorder” button on quote and invoice detail pages that prefills a new RFQ with the original line items (SKU, product name, quantity).
  • UI: New .portal-btn-reorder outline button style with hover fill effect.
  • i18n: Added portal.reorder key in English and Hindi.

v3.52.3 May 9, 2026

Portal — Match font button shape to language button

  • UI: Increased horizontal padding on the Aa button so it appears rectangular like the language picker button instead of squarish.

v3.52.1 May 9, 2026

Portal — Fix Name_of_Engineer [object Object]

  • Fix: Unwrap Name_of_Engineer Zoho lookup field (object → name) in warranty detail page.

v3.52.0 May 9, 2026

Portal — Warranty file attachments (view & upload)

  • New: Warranty claim detail page now shows Upload Documents and Upload Photos sections with files pulled from Zoho CRM (Upload_Documents_Images and Upload_Images fields).
  • New: Documents and photos are downloadable — clicking opens/downloads the file directly from Zoho CRM.
  • New: Portal users can upload additional documents or photos to a warranty claim. Files are sent directly to the corresponding Zoho CRM file-upload field.
  • New: Photo thumbnails displayed in a responsive grid with hover zoom effect.
  • Backend: Added downloadFieldAttachment and uploadFieldAttachment functions to lib/zoho.js for Zoho CRM file-upload field support (multipart upload).

v3.51.3 May 9, 2026

Portal — Prevent date column wrapping

  • Fix: Added white-space:nowrap to the Date column in warranty tables (dashboard & warranty list) to prevent date values from wrapping.

v3.51.2 May 9, 2026

Portal — Prevent Claim No wrapping

  • Fix: Added white-space:nowrap to the Warranty Claim No column on both the dashboard and warranty list pages so values stay on a single line.

v3.51.1 May 9, 2026

Portal — Show raw Warranty_Applicable value

  • Fix: Display the actual Warranty_Applicable field value from Zoho instead of hardcoded Yes/No/Pending logic on dashboard and warranty list.

v3.51.0 May 9, 2026

Portal — Redesign invoices table columns

  • Enhancement: Replaced invoice table columns: now shows Invoice # (Invoice_No), Date, Amount (Invoice_Amount), Balance (Short_Payment), Date Paid (Payment_Received_Date), Status, and Days (Payment_Cycle_Days).
  • Removed: Subject and Due Date columns from invoice listings.
  • i18n: Added portal.balance, portal.datePaid, portal.paymentDays keys in English and Hindi.

v3.50.9 May 9, 2026

Portal — Reformat RFQ Reference column layout

  • Enhancement: Show Deal_Name as main text on top; PO # and PO Date as sub-line beneath.

v3.50.8 May 9, 2026

Portal — Add PO # and PO Date sub-line in RFQ Reference

  • Enhancement: Show “PO #: [Deal_Name] | PO Date: [date]” on a second line beneath PO_Number_Date in the RFQ Reference column.

v3.50.7 May 9, 2026

Portal — Show PO number and date in RFQ Reference column

  • Enhancement: When PO_Number_Date is present on a quote, display it with PO_Date below; otherwise fall back to Deal_Name.

v3.50.6 May 9, 2026

Portal — Replace Subject column with RFQ Reference

  • Enhancement: Replaced “Subject” column with “RFQ Reference” showing Deal_Name data on dashboard and quotes list.
  • i18n: Added portal.rfqReference key in English and Hindi.

v3.50.5 May 9, 2026

Portal — Rename Quote # to Offer Number

  • Enhancement: Replace “Quote #” column header with “Offer Number” and display Offer_Number (with Subject fallback) instead of Zoho record IDs on dashboard and quotes list.

v3.50.4 May 9, 2026

Portal — Fix Invoice_Number rendering in warranty PDF

  • Fix: Invoice_Number is a Zoho lookup field (object with .name), not a plain string — unwrap it before rendering in the warranty claim PDF to avoid “[object Object]”.

v3.50.3 May 9, 2026

Portal — Fix warranty PDF currency encoding

  • Fix: Replace &#x20B9; (₹) symbol with “INR” prefix in warranty claim PDF — pdf-lib’s standard fonts only support WinAnsi encoding.

v3.50.2 May 9, 2026

Portal — Fix dashboard data loading for accounts with warranty claims

  • Fix: Removed speculative Zoho CRM warranty fields (Visual_Observation, Customer_Code, PO_Number, Warranty_Type, etc.) that don’t exist in the schema, causing API errors that broke all data loading.
  • Fix: Changed dashboard from Promise.all to Promise.allSettled so a single Zoho API failure no longer hides quotes, invoices, and account data.

v3.50.1 May 9, 2026

Portal — Server-generated warranty claim PDF

  • Feature: Built a full warranty claim PDF generator using pdf-lib, matching the Zoho CRM template format with company letterhead, claim details table, observations, parts claimed, return address, and confirmation/signature blocks.
  • Enhancement: Added additional Zoho CRM fields (Customer_Code, PO_Number, Warranty_Type, Visual_Observation, etc.) for comprehensive PDF output.

v3.50.0 May 9, 2026

Portal — Fix warranty PDF with Case_Number

  • Fix: Pass Case_Number instead of record ID to Zoho template print-preview API for Cases module.
  • Fix: Add Case_Number to warranty fields list so it’s fetched from Zoho.

v3.49.9 May 9, 2026

Portal — Fix warranty PDF endpoint

  • Fix: Use /settings/templates/ instead of /settings/inventory_templates/ for Cases module PDF generation.

v3.49.8 May 9, 2026

Portal — Warranty claim PDF download

  • Feature: Warranty claim detail page now has a “Download PDF” button using the Zoho CRM Cases template.

v3.49.7 May 9, 2026

Portal — Fix invoice PDF download

  • Fix: Invoice PDF downloads now use the correct Zoho inventory template print-preview API with hardcoded template ID.

v3.49.6 May 9, 2026

Portal — Fix quote PDF download endpoint

  • Fix: Use correct Zoho CRM inventory template print-preview API to generate quote PDFs, replacing the non-functional actions/download endpoint.

v3.49.5 May 9, 2026

Portal — Fix quote PDF crash

  • Fix: Resolved ReferenceError: quoteId is not defined in the quote PDF error handler that crashed the app on PDF download failures.

v3.49.4 May 9, 2026

Portal — Improved quote PDF error diagnostics

  • Fix: Quote PDF download errors now surface the actual Zoho CRM response instead of a generic message, aiding faster debugging.

v3.49.3 May 9, 2026

Portal — Fix quote PDF download

  • Fix: Quote PDF downloads now use the correct Zoho CRM template, resolving the “template not available” error.

v3.49.2 May 9, 2026

Portal — Extended warranty claim fields

  • Enhancement: Warranty claim detail now shows engineer contact info (name, phone, email), photo status, electrical/audible/nasal observations, and attached documents.
  • Enhancement: 9 new i18n keys added to all 11 locale files for the additional warranty fields.

v3.49.1 May 9, 2026

Admin — Table search filters

  • Enhancement: Added instant client-side search to the Portal Users table — filter by name, email, or company.
  • Enhancement: Added instant client-side search to the Series Pages table — filter by series name, brand, or category.

v3.49.0 May 9, 2026

Portal — Warranty Claims tracking

  • Feature: Customers can now view their warranty claim history and status in the portal. Lists only Cases with Case Reason = “Failure under Warranty” from Zoho CRM.
  • Feature: Warranty claim detail page shows product info, equipment details, customer observations, warranty decision, and settled amount — internal fields (costs, supplier recovery, adjudication notes) are hidden.
  • Feature: Warranty Claims card and recent table added to the portal dashboard. Nav link added to sidebar.
  • Feature: Full i18n support — 40 warranty-specific keys added to all 11 locale files.

v3.48.2 May 9, 2026

Portal — Right-align currency values

  • Fix: Currency values in the Amounts and Payment Information sections of invoice and quote detail pages are now right-aligned for easier scanning.

v3.48.1 May 9, 2026

Portal — Complete all-language translations

  • Fix: Added 197 portal translation keys to all 9 remaining locale files (Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, Punjabi) — portal now renders in all 11 supported languages, not just English and Hindi.

v3.48.0 May 9, 2026

Portal — Full i18n support

  • Feature: All 14 portal templates now use t() translation calls — the entire customer portal is translatable via the language picker.
  • Feature: ~150 portal-specific translation keys added to English and Hindi locale files covering login, dashboard, quotes, invoices, RFQ, account, and all detail pages.
  • Feature: Client-side JS strings in the RFQ form (prompt text, validation messages, empty-state labels) are now translatable via inline EJS.

v3.47.1 May 9, 2026

Fix portal language picker dropdown direction

  • Fix: Language picker in portal header now opens downward instead of upward (was going off-screen because the base CSS was designed for the footer position).

v3.47.0 May 9, 2026

Portal — Additional company fields

  • Feature: Portal users can now view and edit PAN No., CIN No., Vendor Code, and Despatch Contact on their company profile.
  • Feature: Read-only Customer Code (Company_No) displayed on account view and edit pages.
  • Fix: Language toggle now works in portal header — JS rewritten to support multiple picker instances (header + footer).
  • Improvement: Removed “Send Requirements” from portal sidebar (portal users use RFQ instead). Quotes empty state now links to RFQ.
  • Feature: Portal users now see prices on the public site (catalog, product detail, series, search results) — same as approved customers.

v3.46.1 May 9, 2026

Fix portal account page messaging

  • Fix: Removed “Changes require admin approval” text from My Account page — now reads “Changes are saved and synced immediately” to match the auto-sync behavior.
  • Cleanup: Removed pending-update query and banner from account view since approval workflow is no longer used.

v3.46.0 May 9, 2026

Portal Phase 2 — Contact self-service update

  • Feature: Portal users can now edit their full profile (contact details, company info, GST, billing/shipping addresses) with immediate auto-sync to Zoho CRM — no admin approval required.
  • Feature: Added updateAccount() to Zoho API wrapper for updating company-level fields.
  • Improvement: Changes are logged to portal_contact_updates for audit trail even though approval is no longer required.

v3.45.3 May 9, 2026

Fix Delco Remy scraper redirect handling

  • Fix: Scraper now handles relative-path 301 redirects from delcoremy.com by prepending the base URL before following them.

v3.45.1 May 9, 2026

Fix search results using stale stock data

  • Fix: Part Number Finder and Equipment Search API queries now read stock from the products.total_stock column instead of the legacy stock_positions table, so search results show correct inventory.
  • Fix: Import script now reads DB_PASSWORD env var as fallback (matching .env convention).

v3.45.0 May 9, 2026

Warehouse inventory & OEM lifecycle status

  • Feature: Dual-status model — oem_status tracks manufacturer lifecycle (active / discontinued / obsolete / superseded / private label) and listing_status controls portal visibility (available / catalogue only / discontinued / hidden).
  • Feature: Per-warehouse stock tracking (GGN, DEL) with warehouses and product_stock tables. Admin sees per-warehouse breakdown; public sees combined total.
  • Feature: CLI inventory import — node scripts/import-inventory.js <warehouse> <file> handles CSV/TSV/UTF-16, upserts stock, and auto-reactivates products.
  • Feature: Redesigned admin Stock & Inventory page with colour-coded OEM and listing status badges, per-warehouse columns, and availability indicators.
  • Improvement: Product detail stock display now uses aggregated warehouse total instead of single-location field; “Available to order (+60 days)” for catalogue-only items.
  • Improvement: Part Number Finder and Equipment Search results now reflect the new status fields for accurate availability badges.
  • 100 previously inactive products with physical stock reactivated via import.

v3.44.4 May 9, 2026

Search result display toggles

  • Feature: Three new toggles in Admin → Settings → Part Number Finder: Show matched reason, Show cross-references, Show prices. All off by default — enable for debugging, then disable again.
  • Toggles apply to both the Part Number Finder and Equipment Search on the homepage.

v3.44.3 May 9, 2026

Editable footer trademark & disclaimer text

  • Feature: Trademark notice and disclaimer paragraph in the footer bottom section are now editable from Admin → Settings → Footer Content.
  • Feature: Copyright year now auto-updates dynamically.
  • Schema: Added footer_trademark, footer_trademark_hi, footer_disclaimer, footer_disclaimer_hi columns to settings. Run npm run migrate:safe.

v3.44.2 May 9, 2026

Fix footer links admin modal visibility

  • Fix: Add/Edit modals on the Footer Links admin page were visible on load because the hidden attribute was overridden by inline display:flex. Switched to style.display toggling.

v3.44.1 May 9, 2026

Fix footer_links migration path

  • Fix: Moved footer_links table creation and default seed into the --migrate-only code path so npm run migrate:safe correctly creates the table on production databases.

v3.44.0 May 9, 2026

Admin-managed footer links & static pages

  • Feature: All four footer navigation columns (Products, Industries, Company, Legal) are now fully editable from the admin panel under Footer Links. Add, edit, reorder, hide, or delete any link.
  • Feature: New + New Page button in Pages & SEO lets you create additional static pages with custom slugs (e.g. /careers, /distributors). Pages can be set to Draft while under construction.
  • Feature: DB-driven catch-all route serves any published page from the pages table at its slug URL. Only published pages are visible; draft pages return 404.
  • Schema: New footer_links table. Run npm run migrate:safe to create the table and seed default links.

v3.43.4 May 9, 2026

Homepage series section title update

  • Change: Series section heading on homepage changed from "Delco Remy Series" to "Popular Delco Remy Series in India".

v3.43.3 May 9, 2026

Homepage alternator cards: "Rated Output" instead of "Power"

  • Fix: Homepage series cards for alternator series now display the label Rated Output instead of Power. Starter series cards still show "Power".

v3.43.2 May 9, 2026

Match "Mount Type" spec label for series tables

  • Fix: Mount Type column now also matches the Mount Type spec label (in addition to Mount, Mounting, Mounting Type) for both starter and alternator series product tables.

v3.43.0 May 9, 2026

Alternator series: Rated Output, Mount & Ground columns

  • Feature: Series detail product table for alternator series now shows Rated Output (replacing Power), Mount, and Ground columns. Values are pulled from product_specs (labels: Rated Output / Output / Rated Amps / Amps, Mount / Mounting / Mounting Type, Ground Terminal / Ground / Grounding).
  • Note: Starter series tables remain unchanged (Pinion + Mount columns).

v3.42.6 May 9, 2026

Fix thumbnail bottom padding on homepage series cards

  • Fix: Added explicit bottom padding to .series-card-thumbs so thumbnails no longer touch the bottom separator border (overrides the global * { padding: 0 } reset).

v3.42.5 May 9, 2026

Thumbnail hover tooltip on homepage series cards

  • Feature: Hovering over a product thumbnail in a series card now shows a larger 180×180 preview in a dark floating tooltip near the cursor. Thumbnail also scales up slightly on hover for visual feedback.

v3.42.4 May 9, 2026

Center series card thumbnails on homepage

  • Fix: Product thumbnails in homepage series cards are now horizontally centered and vertically balanced between the top and bottom separator borders (justify-content: center, equal top/bottom padding).

v3.42.1 May 9, 2026

Homepage thumbnails: use series hero image for angles

  • Fix: Series card thumbnails now derive all 4 angles (ANG, FRO, SID, BAC) from the admin-set series hero image, which is known to have files on disk. Falls back to the first product image only when the series has no hero. This fixes empty thumbnails on series like 39MT where the first product by SKU had no uploaded photos.

v3.42.0 May 9, 2026

Starter series: Pinion & Mounting columns in product table

  • Feature: Series detail product table now shows Pinion and Mount columns for starter series (category_id = 'starter-motors'). Values are pulled from the product_specs table (labels: Pinion, Pinion Teeth, Mount, Mounting, Mounting Type).
  • Note: Alternator series tables remain unchanged (no extra columns).

v3.41.5 May 9, 2026

Exclude child parts from series queries

  • Fix: Homepage series card thumbnails and product count now only include starters and alternators (category_id IN ('starter-motors','alternator-units')), excluding service/child parts.
  • Fix: Series detail page product table now also filters to starters and alternators only — child parts are no longer listed in the "Products in XXX Series" section.

v3.41.3 May 9, 2026

Fix product thumbnails on homepage series cards

  • Fix: Thumbnail src now appends _ANG.jpg to the base image_url (matching the product detail page convention), with a fallback for URLs that already include a file extension.
  • Fix: Broken thumbnails are gracefully hidden; if all four fail the entire thumbnail strip is removed.

v3.41.2 May 9, 2026

Series editor: retranslate checkbox + auto-translate on save

  • Fix: Added "Re-translate all Hindi fields on save" checkbox to the series edit form, matching the pattern used in product and category editors.
  • Fix: Series save handler now uses deriveHindi() — empty Hindi fields are auto-translated from English on every save, and the retranslate checkbox forces a full refresh of all Hindi content.

v3.41.1 May 9, 2026

Auto-translate series content to Hindi

  • Script: New scripts/translate-series.js — one-shot migration to populate Hindi translations for all series description, features, applications, tagline, and meta fields using the Google Translate API.

v3.41.0 May 9, 2026

Series Hindi translations + product thumbnails on homepage

  • Feature: Series detail pages now fully support Hindi — description, features, applications, section titles, CTA text, and meta tags all switch when the language is changed to Hindi.
  • Feature: Homepage series cards now show the series name and tagline in Hindi when the language is switched.
  • Feature: New admin toggle "Show Product Thumbnails on Homepage" in the series editor. When enabled, up to 4 product photos appear on the homepage series card.
  • Schema: New show_thumbs_on_home column on product_series.
  • i18n: Added Hindi translations for series page UI strings (key features, need a quote, applications, product listing, etc.).

v3.40.1 May 8, 2026

RFQ visibility — portal history + admin RFQ management

  • Feature: Portal users can now view their submitted RFQs via My RFQs in the sidebar, with a clickable history list and full detail view showing line items, status, and Zoho Deal/Quote IDs.
  • Feature: Admin panel has a new Quote Requests page (/admin/portal/rfqs) listing all RFQs across all portal users with customer info, urgency, and status.
  • Feature: Admin RFQ detail view with inline status dropdown (Pending → Reviewing → Quoted → Accepted → Rejected → Closed) for managing quote request lifecycle.
  • Schema: Added zoho_quote_id column to portal_rfqs table.

v3.40.0 May 8, 2026

Contact self-service update with admin approval

  • Feature: Portal users can now edit their contact details (name, phone, mobile, designation, department, address, fax) from My Account → Edit My Details. Changes are saved as pending and require admin approval before syncing to Zoho CRM.
  • Feature: Admin panel has a new Contact Update Requests page (/admin/portal/updates) where admins can review, approve, or reject pending profile changes. Approving pushes the changes to the Zoho CRM Contact record via the API.
  • Feature: Added apiPut and updateContact to lib/zoho.js for updating Zoho CRM records.
  • Schema: New portal_contact_updates table for tracking self-service profile edit requests with approval workflow.

v3.39.1 May 8, 2026

Zoho Lead creation — add custom fields (GST, requirement, next step)

  • Fix: Zoho Lead creation now includes Current_Requirement, TIN_CST_Number (GST), and Next_Step custom fields alongside the mandatory Last_Name, Lead_Source, and Lead_Status.

v3.39.0 May 8, 2026

Portal login flow — header nav, magic link entry point, Zoho Lead creation

  • Feature: Header "Sign In" replaced with "Customer Portal" button linking to /portal/login. When a portal user is logged in, the header shows their name with a link to the dashboard.
  • Feature: /login now redirects (301) to /portal/login for a unified customer entry point using email-based magic links.
  • Feature: Portal login page updated — new customers are directed to the Requirements form to get started.
  • Feature: Successful Requirements form submissions now create a Lead in Zoho CRM with the customer's name, company, email, phone, and item details.

v3.38.5 May 8, 2026

Tighten Zoho product search — match Product_Code only, require active status

  • Fix: Product search for Quote line items now matches only on Product_Code (starts_with) instead of also matching Product_Name, which caused false positives. Active status is filtered using the correct Status picklist field (Status:equals:Active) in the Zoho search criteria itself rather than post-filtering on the wrong field name.

v3.38.4 May 8, 2026

Fix Quote line items — correct field name, skip inactive products

  • Fix: Zoho Quotes API uses Product_Name (not product) for line item product references. Inactive products are now skipped and fall back to free-text line items instead of causing a 400 error.

v3.38.0 May 8, 2026

RFQ → Zoho CRM Deal creation working end-to-end

  • Fix: Resolved Zoho CRM Deal creation errors (Pipeline, Layout, mandatory fields). RFQ submissions now dynamically fetch the Deals layout and pipeline settings, set the correct Layout, Pipeline, Stage, Current_Requirement, and Closing_Date fields, and successfully create Deals linked to the customer's Account and Contact in Zoho CRM.

v3.37.3 May 8, 2026

Fix PDF download showing empty JSON

  • Fix: Zoho download endpoint can return JSON {} instead of a PDF when the template is not available. Added validation to detect non-PDF responses and show a user-friendly error message instead of raw JSON.

v3.37.2 May 8, 2026

Fix Zoho OAuth scope for PDF downloads

  • Fix: PDF download returned 500 (OAUTH_SCOPE_MISMATCH) because per-module READ scopes don't cover the /actions/download endpoint. Switched to ZohoCRM.modules.ALL which covers all module operations including PDF download and record creation.

v3.37.1 May 8, 2026

Customer Portal — language and font chooser

  • New: Language picker and display preferences (text size, font style) added to the portal header bar — same controls as the public site.
  • New: Portal pages now load main.js for theme/font/language preference persistence via cookies.

v3.37.0 May 8, 2026

Customer Portal — Phase 2: Request for Quote (RFQ)

  • New: "Request Quote" page in customer portal — search local catalog by SKU or product name, add line items with quantities and notes, or add free-text items for products not in catalog.
  • New: RFQ submission creates a Deal in Zoho CRM (stage "RFQ Received") linked to the customer's Account and Contact, with full line item details in the description.
  • New: Local portal_rfqs table stores all RFQ submissions for history tracking, with fallback if Zoho API is unavailable.
  • New: RFQ history page shows all past quote requests with status tracking.
  • New: Zoho API write capabilities — apiPost, createDeal, createLead, searchAccounts, searchZohoProducts methods added to zoho.js.
  • New: OAuth scopes expanded to include Deals.CREATE, Leads.CREATE, Accounts.CREATE, Leads.READ, Products.READ for Phase 2 features.

v3.36.0 May 8, 2026

Customer Portal — PDF downloads for quotes and invoices

  • New: "Download PDF" button on quote and invoice detail pages — streams the official Zoho CRM PDF directly to the browser.
  • New: Binary download support in Zoho API wrapper (apiDownload, downloadQuotePdf, downloadInvoicePdf).
  • Security: PDF download routes verify account ownership before serving the document.

v3.35.11 May 8, 2026

Invoice detail — add GST row to amounts card

  • New: GST row added between Total Taxable Value and Sub Total in the Amounts card, sourced from Total_Tax_on_Items.

v3.35.10 May 8, 2026

Portal — wider label columns to prevent text wrapping

  • Fix: Definition list label column widened from 130px to 160px (200px for full-width cards like Material Shipment and Payment) so labels like "Balance Payment Reference" display on a single line.

v3.35.9 May 8, 2026

Invoice detail — correct Zoho API field names for balance payment fields

  • Fix: Balance Received Amount mapped to nd_Received_Amount (exact Zoho API name).
  • Fix: Balance Payment Reference mapped to nd_Check_NEFT_RTGS_No (exact Zoho API name).

v3.35.7 May 8, 2026

Portal — force light theme

  • Fix: Customer portal now always uses light theme regardless of OS dark-mode preference, improving readability of invoice and quote details.

v3.35.6 May 8, 2026

Invoice detail — fix field mapping issues

  • Fix: Freight field (Freight1) displayed as text instead of currency — it holds values like "To-Pay", not a number.
  • New: Added missing Material Shipment fields: LR Date, Material Delivery Date, LR Weight (kgs), LR Freight Amount.
  • New: Added missing Payment fields: Balance Received Amount, Balance Payment Reference, Balance Due, Status badge.
  • Fix: LD field displayed as plain value (not currency) to match Zoho CRM behaviour.

v3.35.5 May 8, 2026

Invoice detail — full Zoho CRM field mapping

  • New: Invoice detail now shows all Zoho CRM fields: Invoice No, Quote reference, PO Number/Date, Unit Serial Number, and GRN.
  • New: Material Shipment card with LR No, Book Upto, Transport, Tracking, Freight, Transit Time, Weight, LR Boxes, Freight %, and Freight Rs/kg.
  • New: Payment Information card with Payment Terms, Due Date, Bill Amount, Received Amount, Payment Reference, IGST TDS, TDS, LD, Other Deductions, and Final Payment Date.
  • Fix: Line items now sourced from Invoiced_Items array with proper Product_Name.name extraction, Tax column, and discount percentage display.
  • Fix: Amounts card shows all fields including zeros (matching Zoho CRM view).
  • Cleanup: Removed temporary debug endpoints (/admin/portal/debug-quote and /admin/portal/debug-invoice) and debug console.log from quote detail route.

v3.35.4 May 8, 2026

Quote detail — verified field mapping from Zoho CRM API

  • Fix: Line items now sourced from Quoted_Items array (was looking for Product_Details which doesn't exist on Quotes).
  • Fix: Product name correctly extracted from nested Product_Name.name object — shows product code alongside name.
  • Fix: Tax Type field mapped to Tax_Forms (Zoho's actual field name, not Tax_Type).
  • Improved: Line items table now shows Tax column and Discount as percentage when available.
  • New: Price Basis, Validity, and PO Number fields added to quote detail.

v3.35.3 May 8, 2026

Expanded quote detail — terms, tax, addresses

  • New: Quote Terms card showing Carrier, Freight, Insurance, Payment Terms, and Delivery.
  • New: Tax Type card showing tax classification and description (e.g. "GST Extra as Applicable").
  • New: Address Information section with Billing and Shipping addresses.
  • New: Offer Number field displayed alongside the Quote Number.

v3.35.2 May 8, 2026

Fix portal quote/invoice line items

  • Fix: Product name in line items showed [object Object] — now correctly extracts the name from Zoho CRM's nested product lookup field.
  • Fix: Unit price showed "—" because of field name casing mismatch with Zoho API v7 response — now handles both list_price and Unit_Price variants.
  • Improved: Added Discount column to quote and invoice line item tables to match Zoho CRM detail view.
  • Debug: Temporary server-side logging of Zoho line item structure on quote detail to verify field mapping.

v3.35.1 May 8, 2026

Admin impersonation for customer portal

  • New: "Login as" button on the admin portal users table — lets super-admin view the customer portal exactly as any user sees it, for testing and co-browsing during training.
  • New: Sticky amber impersonation banner across all portal pages showing the impersonated user's name and company, with an "Exit to Admin" button to return.
  • New: /portal/exit-impersonation route clears portal session and redirects back to admin portal management.

v3.35.0 May 8, 2026

Customer Portal — Phase 1 (read-only, Zoho CRM integration)

  • New: Customer portal at /portal with magic-link (passwordless) login, linked to Zoho CRM contacts.
  • New: Portal dashboard showing recent quotations and invoices pulled live from Zoho CRM.
  • New: Quote history and invoice history pages with detail views, line items, and amounts.
  • New: My Account page displaying contact and company info synced from Zoho CRM.
  • New: Admin panel → Customer Portal page to manage Zoho CRM OAuth connection, invite contacts, and manage portal user roles/status.
  • New: lib/zoho.js — OAuth2 server-based application module with auto-refreshing access tokens and CRM API v7 wrappers for Contacts, Accounts, Quotes, Invoices, and Sales Orders.
  • New: Schema tables: zoho_tokens, portal_users, portal_magic_links.
  • New: Dedicated portal CSS (portal.css) with sidebar navigation, responsive layout, KPI cards, data tables, and detail views.
  • Security: Account-scoped data access — portal users can only see quotes/invoices belonging to their Zoho Account.
  • Security: Magic link tokens expire after 15 minutes (login) or 7 days (initial invite) and are single-use.

v3.34.0 May 8, 2026

Customer portal groundwork — Zoho CRM integration keys

  • New: Added Zoho CRM Client ID and Client Secret fields to Admin → Settings → Integrations for the upcoming customer portal (OAuth2 server-based application).

v3.33.5 May 8, 2026

YouTube embed rework — placeholder approach

  • Fix: Jodit was wrapping <iframe> tags in its own <jodit> wrapper, destroying the embed on save. Switched to a placeholder-based approach: the editor stores a data-youtube-id div with a thumbnail preview; the footer script converts it to a real iframe on page load.
  • Applies to: All public pages — KB articles, series detail, CMS pages (about, warranty, etc.).

v3.33.4 May 8, 2026

Fix YouTube embeds stripped by editor + responsive iframe CSS

  • Fix: Jodit's cleanHTML was silently removing <iframe> tags. Changed deny-list to only block <script>, allowing iframes to persist.
  • New: Added responsive iframe CSS for .kb-article-body, series, and page content areas so embedded videos scale correctly on all screen sizes.

v3.33.3 May 8, 2026

YouTube embed button in WYSIWYG editor

  • New: Added a YouTube button to the Jodit editor toolbar in KB Articles, Pages, and Series forms. Click it, paste any YouTube URL, and a responsive embed is inserted automatically.

v3.33.2 May 8, 2026

Fix missing CSS and changelog in git repository

  • Fix: Corrective commit — restored public/css/style.css and views/changelog.ejs which were accidentally removed from the git repository in v3.33.1 due to a work-tree mismatch during commit.

v3.33.1 May 8, 2026

WYSIWYG HTML editor for admin content forms

  • New: Added Jodit rich-text editor (MIT, CDN-loaded) to KB Article body, Page body, and Series description/features/applications fields. Includes toolbar with formatting, headings, lists, links, images, tables, and a source/HTML toggle.
  • Fix: Restored list, heading, and table styles inside the Jodit editor content area — the global CSS reset (* { margin: 0; padding: 0; }) was stripping list bullets/numbers and indentation.
  • Applies to: kb-article-form.ejs, page-form.ejs, series-form.ejs — both English and Hindi body fields.

v3.32.1 May 8, 2026

Support large PDFs (20+ pages) in Hindi translation

  • New: PDFs exceeding Google's 20-page inline limit are now automatically split into chunks, each chunk translated separately, then merged back into a single Hindi PDF.
  • Deps: Added pdf-lib for PDF splitting and merging.

v3.32.0 May 8, 2026

Layout-preserving Hindi PDF translation

  • New: Rewrote lib/pdf-translator.js to use Google Cloud Translation v3 Document Translation API. Hindi PDFs now preserve the original layout, images, tables, branding, and formatting — only the text is translated.
  • New: GCP service account JSON can be stored securely in /admin/settings under "GCP Service Account JSON" (textarea input for the full JSON blob).
  • Removed: Dropped pdf-parse and pdfkit dependencies — no longer needed since Google's API handles PDF processing end-to-end.
  • Auth: Service-account JWT → OAuth2 access token exchange using Node's built-in crypto module — no extra npm packages required.

v3.31.1 May 8, 2026

Fix: PDF translation pipeline (pdf-parse v2 compatibility)

  • Fix: Updated lib/pdf-translator.js to use pdf-parse v2 API — constructor-based new PDFParse({ data }) instead of the removed default-function export. Fixes "pdfParse is not a function" error when translating KB document PDFs.
  • Fix: Strip pdf-parse v2 page markers (-- 1 of 5 --) from extracted text before sending to translator.

v3.31.0 May 8, 2026

Hindi PDF translation for Knowledge Base documents

  • New: Automatic Hindi PDF translation pipeline — when a PDF is uploaded to KB Documents, the system extracts text, translates it to Hindi via Google Translate API, and generates a new Hindi PDF using Noto Sans Devanagari font.
  • New: Hindi visitors viewing KB documents now see the translated Hindi PDF inline, with an "English PDF" link to the original.
  • Schema: Added file_path_hi column to kb_documents table.
  • Deps: Added pdf-parse (text extraction) and pdfkit (PDF generation).
  • Bundle: Noto Sans Devanagari font included in /fonts for server-side PDF rendering.

v3.30.1 May 8, 2026

Fix: KB Articles category dropdown

  • Fix: Replaced <datalist> autocomplete with a proper <select> dropdown for KB Article category — same fix as KB Documents (v3.29.4). Includes "Other…" option for custom categories with backend __other sentinel resolution.

v3.30.0 May 8, 2026

Complete Hindi translations for all public pages

  • New: Added ~180 missing Hindi translation keys covering: authentication pages (login, register, account), all legal pages (privacy policy, terms of business, terms of sale, warranty), knowledge base, articles, product detail specs, catalog pagination/search, requirements wizard steps, footer links, changelog, and error pages.
  • i18n: Hindi locale now covers 100% of all t() calls site-wide — every public page is fully translatable.

v3.29.4 May 8, 2026

Fix: KB Documents category dropdown

  • Fix: Replaced <datalist> autocomplete with a proper <select> dropdown for KB Document category — now reliably shows all category options. Includes "Other…" option for custom categories.

v3.29.3 May 8, 2026

Admin: Billing address label in quotation detail

  • Admin: Billing address now displayed with a clear label and separator in the customer card on quotation detail.

v3.29.2 May 8, 2026

Fix: Quotation total estimate + admin detail enhancements

  • Fix: Total estimate was always ₹0 due to incorrect row destructuring inside the transaction — now calculates correctly from item prices × quantities.
  • Admin: Quotation detail now shows designation, GST number, email verified badge, customer type (business/personal), and email delivery status (sent/failed/pending) with error tooltip.
  • Fix: "+ Add Part" button was missing its click handler (v3.29.1).

v3.29.0 May 8, 2026

Requirements Page — Multi-Step Wizard Redesign

  • New: Complete redesign of the requirements/quotation form as a 4-step guided wizard: Step 1 — AJAX part search with autocomplete (searches by SKU and OE cross-references), quantity per item, free-text fallback for unlisted parts. Step 2 — Business/Personal selector with conditional GST number field. Step 3 — Email verification via 6-digit OTP code (15-min expiry, rate-limited to 3 sends/hour, max 5 wrong attempts). Step 4 — Contact details (name, phone, company, designation, billing address, comments).
  • New: email_verifications table for OTP-based email verification with expiry and attempt tracking.
  • New: /api/send-otp and /api/verify-otp endpoints with in-memory rate limiting.
  • Schema: Added customer_type, designation, and email_verified columns to quotations table.
  • UX: Progress bar, keyboard-navigable autocomplete, mobile-responsive layout, dark mode support, duplicate-submission guard.

v3.28.1 May 8, 2026

Add 40SI and 55SI Alternator Series

  • New: Added full series content for 40SI (brushless, up to 320A at 12V) and 55SI (brushless, up to 430A at 12V / 275A at 24V) alternator series.
  • Fix: Migration now auto-creates series rows for any SERIES_CONTENT entries that weren't auto-populated from products, ensuring all researched series appear on the homepage.

v3.28.0 May 8, 2026

Admin: Show/Hide Series on Homepage

  • New: "Show on Homepage" toggle in admin series editor — set to "No (suppress)" to hide a series from the homepage showcase while keeping its detail page accessible via direct URL.
  • Admin list: New "Home" column shows Shown/Suppressed badge for each series.

v3.27.3 May 8, 2026

Filter Series Products to Delco Remy Family Only

  • Fix: Series detail and homepage product counts now only include products from the Delco Remy brand family (Delco Remy, Delphi Technologies, Phinia). Competitor or aftermarket brands with the same series name are excluded.

v3.27.2 May 8, 2026

Fix Series Detail — Match Products by Series Name Only

  • Fix: Series detail page showed "No products" when the product brand didn't exactly match the series brand (e.g. Korea Range products). Query now matches by series name only, which is already unique per series.

v3.27.1 May 8, 2026

Fix Series Badge — Starter/Alternator Instead of Parts

  • Fix: Series cards on homepage and series detail page showed "Parts" badge instead of "Starter" or "Alternator" because product_series.category_id still had old values from before the category consolidation.
  • Migration: Added automatic fix in migrate:safe to update series category_id to the consolidated IDs (starter-motors, alternator-units, spares).

v3.27.0 May 8, 2026

Series Detail Page Redesign

  • New: Rich series detail page with hero section, specs bar (voltage, power, product count, brand), two-column layout with overview, key features, and applications.
  • New: Products table on series page with SKU links, voltage, power, stock status badges, and price (for approved customers).
  • New: Quick action card with link to send requirements for quotes.
  • Responsive: Full mobile support with stacked layout and horizontally scrollable product table.
  • Dark mode: Complete dark theme support for all new components.

v3.26.1 May 8, 2026

Fix Series Showcase — Filter to Real Series Only

  • Fix: Homepage series showcase now filters to only show series with actual content (tagline populated), excluding auto-generated junk entries where individual SKUs were stored as series names.

v3.26.0 May 8, 2026

Series Showcase on Homepage

  • Replaced: Individual product cards with a Series Showcase — each card represents a Delco Remy series (50MT, 42MT, 36SI, etc.) with its tagline, voltage/power range, and product count.
  • Purpose: Customers can now browse series to understand what each model range means, compare features, and drill into the series detail page for full specifications and products.
  • Sorted: Starters first, then alternators, then by sort order — matching the catalog hierarchy.

v3.25.3 May 8, 2026

Fix Homepage Product Type Badges

  • Fix: Product cards on homepage now correctly show "Starter" / "Alternator" badges instead of all showing "Service Part" — was still referencing old category IDs.

v3.25.2 May 8, 2026

Homepage Section Reorder

  • Moved: Equipment Search section now appears above Delco Remy Series product grid for better search-first flow.

v3.25.1 May 8, 2026

Equipment Search on Homepage

  • Replaced: Static "Equipment Match" preview table with a live Equipment Search box — type any vehicle make, model, or equipment name to find matching starters and alternators inline.
  • Removed: Unused compatRows query from homepage route, saving a DB call on every page load.

v3.25.0 May 8, 2026

Part Number Finder on Homepage

  • New: Homepage now features a Part Number Finder — type any part number (our SKU, OE number, competitor cross-reference from Bosch, Mahle, WAI, Prestolite, or old part numbers) and get instant inline results.
  • API: New /api/part-search endpoint searches across products.sku and product_oe_refs.manufacturer_part, returning matched products with full cross-reference data.
  • Results: Each result card shows SKU, type badge, brand, series, voltage, power, stock status, price, matched-via tags, and all cross-references — with direct links to the product page.
  • UX: Auto-search after 500ms of typing (3+ chars), Enter key support, and a fallback link to Equipment Search for vehicle-based lookups.

v3.24.0 May 8, 2026

Product Category Consolidation

  • Consolidated: 11 product categories merged down to 5 clean groups — Starter Motor, Alternator, Spares, HEMM, and Others.
  • Migration: New consolidate-categories.js script remaps all products and series from old category IDs to new ones. Supports --dry-run preview.
  • Updated: All import scripts, admin forms, footer links, catalog display, and compatibility search updated to use new category IDs.

v3.23.4 May 8, 2026

Korea Import — Append Applications on Backfill

  • Fix: Korea Range import now appends vehicle application data even when the product already has some applications from a previous import. Previously, backfill skipped applications entirely if any existed, causing Korea-specific fitment data (e.g. CRUZE, SPARK, AVEO) to be missing from search.

v3.23.3 May 8, 2026

Compatibility Search — Group by Product

  • Rework: Search results now group by SKU instead of equipment. Each product appears once with all matching applications listed underneath — no more duplicate SKUs across sections.
  • Wider coverage: Search now queries both the equipment table (legacy admin data) and the product_applications table (EMEA, Korea, and other imports), so newly imported ranges are searchable.
  • SKU search: You can now search by part number directly in compatibility search.

v3.23.2 May 8, 2026

Korea Range Import

  • New: Import script (import-korea-range.js) for the Delphi Technologies / Delco Remy Korea Range — 155 products (109 starters + 46 alternators) covering passenger cars, light commercial vehicles, and heavy-duty equipment.
  • Data: Rich vehicle fitment data with 1,341 application rows including engine codes, power ratings, year ranges, fuel types, and aspiration details.
  • Series: Products split into "Korea Passenger Car" (PC & LCV) and "Korea Heavy Duty" (HD) series. MRP pricing imported. MOQ 25 units. COO set to KR.
  • Backfill: Existing SKUs receive specs, applications, OE refs, and pricing without overwriting manually entered data.

v3.23.1 May 8, 2026

Country of Origin on Product Detail

  • Fix: Country of Origin now displays in the Technical Specifications table on the product detail page (was stored in DB but never shown).
  • EMEA imports: All EMEA Highway products now have Country of Origin set to EU.

v3.23.0 May 8, 2026

EMEA Highway Range Import

  • New: Import script (import-emea-range.js) for the Delco Remy 2025 EMEA "New to Range" catalog — 326 products (180 starters + 146 alternators) covering European highway trucks, buses, and construction equipment.
  • Data: Each product includes voltage, power/amperage, pinion teeth or pulley specs, vehicle applications, and OE cross-references (Prestolite, Mahle, WAI, Vehicle MFG numbers).
  • Series: All products assigned to new "EMEA Highway" series. MOQ set to 25 units. Prices on request.

v3.22.4 May 8, 2026

Trademark Disclaimer in Footer

  • New: Added a trademark attribution line below the copyright notice, clarifying that all brand names (Delco Remy, Nikko, Bosch, Prestolite, Hitachi, Komatsu, Kobelco, Caterpillar, Cummins, etc.) are used for descriptive purposes only and belong to their respective owners.

v3.22.3 May 8, 2026

Scrape-Only Import Mode

  • New: import-delcoremy.js --scrape-only mode backfills specs, applications, and service parts directly from delcoremy.com without requiring the Excel file. Works for a single SKU (--scrape-only --sku 61032288) or in bulk for all active products missing specs.
  • Backfill fields: voltage, power, reman SKU, image, and short description are updated only when the existing value is empty, preserving any manually entered data.

v3.22.2 May 8, 2026

Breadcrumb Visibility Fix

  • Fix: product hero breadcrumb now uses --text-mid and --brown for proper contrast against the light blue hero background. The current SKU is highlighted in --text-dark.

v3.22.1 May 8, 2026

Inline Brand Logo in Hero

  • Inline brand logo: the brand logo now sits inline at the start of the H1 heading (e.g. [Delco Remy logo] 8200308 Starter) instead of floating above it as a separate element. Falls back to brand name text when no logo is available.

v3.22.0 May 8, 2026

Dynamic Product Hero Tagline

  • Dynamic hero sentence: the product detail hero now builds a descriptive tagline from live data — brand, SKU, category, series, condition (New/Reman), voltage, and all technical specs. Example: "Delco Remy 8200308 Starter — 39MT, New, 12V, SAE 3 Mount, 11T Pinion, CW Rotation, Over-Crank Protected".
  • SEO meta description: the HTML meta description now uses the same dynamic tagline for richer search-engine snippets.
  • Short description removed from hero: replaced by the auto-generated spec tagline — no more redundant text.

v3.21.3 May 8, 2026

Quote Cart — Brand Column

  • Replace Equipment with Brand: the quote cart table now shows the product brand instead of the equipment column, which was typically empty.
  • Brand refresh: brand is now refreshed from the database alongside SKU and price on every cart page load.

v3.21.2 May 8, 2026

Quote Cart SKU Refresh

  • Fix: quote cart now refreshes SKU from the database on every page load, so products added before SKU was populated now display the correct part number instead of the series name.

v3.21.1 May 8, 2026

SKU Enforcement

  • SKU required: every product must now have a unique SKU / part number. Products with missing SKUs are automatically set to draft (inactive).
  • Admin validation: the product form now requires SKU before saving and checks for duplicates. Clear error messages are shown via flash alerts.
  • SKU persistence: the admin product form now correctly saves SKU changes to the database (previously the field was displayed but not persisted on save).
  • Flash messages: admin panel now supports flash messages for validation errors and confirmations.

v3.21.0 May 7, 2026

Brand Management & Dynamic Logos

  • New brands table: auto-populated from the product catalog. Stores light and dark logo variants, website URL, and display settings for each brand.
  • Admin brand management: new "Brands" page under Catalog in the admin panel. Upload or replace logo images (PNG, JPG, SVG, WebP) for both light and dark backgrounds.
  • Dynamic product logos: product detail pages now show the correct brand logo from the database instead of a hardcoded Delco Remy logo. Brands without uploaded logos fall back to text display.

v3.20.4 May 7, 2026

Industry Column Backfill

  • Industry default: application rows with an empty Industry column are now backfilled with "Mining / Off-highway" during migrate:safe. Also adds a fallback application row for products that have none.

v3.20.2 May 7, 2026

Safe Migration Mode

  • New --migrate-only flag: npm run migrate:safe runs schema upgrades and series content population without truncating product specs, applications, or stock data. Use this instead of npm run seed on any database with imported catalog data.

v3.20.1 May 7, 2026

Series Content Population

  • Manufacturer-sourced content: seed migration now populates descriptions, key features, applications, and SEO metadata for all 10 core Delco Remy series (50MT, 42MT, 41MT, 40MT, 39MT, 36SI, 33SI, 28SI, 26SI, 24SI) from official manufacturer data.
  • Non-destructive updates: uses COALESCE so admin-edited content is never overwritten by re-running the seed.

v3.20.0 May 7, 2026

URL Restructuring & Series Pages (Phase 2)

  • New product URLs: products are now at /products/delco-remy/10479339 (brand/SKU pattern). Old slug-based URLs (/products/50mt) automatically 301-redirect to the new canonical URL.
  • Series landing pages: each product series now has its own page at /products/delco-remy/series/50mt showing an overview, specs, features, applications, and all products in the series.
  • New product_series table: auto-populated from the catalog on first seed. Stores series-level content (description, features, applications, voltage/power ranges, SEO fields) with Hindi translations.
  • Admin series management: new "Series Pages" section under Catalog in the admin panel. Edit descriptions, features, applications, images, and SEO metadata for each series.
  • Consistent link generation: all internal product links now use the productUrl() helper, ensuring brand/SKU URLs everywhere — product cards, compatibility results, quote cart, service parts, related products.

v3.19.0 May 7, 2026

SKU-First Refactor (Phase 1)

  • SKU as primary identifier everywhere: product cards on home page and catalog now show SKU prominently before series name. Compatibility search results use SKU as link text. Home compatibility preview lists SKUs instead of series.
  • Requirements form redesigned: product dropdown now submits product ID (not series text), shows "SKU — Series — Voltage — Power — Price" format, and stores SKU in quotation items.
  • Admin quotation detail fixed: resolved product_series / qty undefined bugs, added separate Part # and Series columns with correct field references.
  • Image alt tags: product images now use SKU when available for better SEO.

v3.18.5 May 7, 2026

Import — Voltage Unit Fix

  • Voltage normalization: bare numbers like "24" now get "V" appended → "24V". Separate normalizers for voltage and power so each field gets the right treatment.

v3.18.4 May 7, 2026

Import — Power & Voltage Cleanup

  • Unit normalization: import script now cleans power and voltage values — "160 Amps Amps" → "160 A", "9 KW KW" → "9 kW", "24 Volts" → "24 V". Fixes duplicate unit suffixes and normalizes full words to standard abbreviations.

v3.18.3 May 7, 2026

All CRM Multi-Line Columns Widened to TEXT

  • products.crm_description: VARCHAR(500) → TEXT
  • product_oe_refs.manufacturer: VARCHAR(120) → TEXT
  • customer_codes.material_code: VARCHAR(120) → TEXT
  • All Zoho CRM multi-line fields now support 2500+ characters without truncation.

v3.18.2 May 7, 2026

Cross-Reference Column — TEXT

  • DB column changed to TEXT: product_oe_refs.manufacturer_part expanded from VARCHAR(255) to TEXT to support values up to 2500+ characters without truncation.
  • Index prefix: search index rebuilt with 100-character prefix for TEXT compatibility.

v3.18.1 May 7, 2026

Cross-Reference Data Truncation Fix

  • DB column widened: product_oe_refs.manufacturer_part expanded from VARCHAR(60) to VARCHAR(255) so long part numbers are no longer truncated on import.
  • Admin form layout: part number field now uses a resizable textarea with more width; notes column removed from the row to give part numbers room to display fully.

v3.18.0 May 7, 2026

OE Cross-References & SKU in Compatibility

  • Admin cross-references: product edit form now shows OEM, Old Part Number, and Competitor cross-references with add/remove row support. Data saves to the product_oe_refs table.
  • Product search: searching by OEM, old, or competitor part number now matches against the cross-reference table in addition to CRM fields and SKU.
  • Compatibility SKU column: compatibility search results now show each product's SKU/part number alongside the series name.

v3.17.8 May 7, 2026

CRM Fields in Admin Product Editor

  • New CRM Data section: admin product edit form now shows all CRM fields — Description, Specifications & Application, Equipment, Engine Model, Technical Information, Status, and Record ID.
  • Save support: CRM fields are now included in the product save/update SQL, so edits persist to the database.

v3.17.7 May 7, 2026

Dark Mode Redesign — Deep Steel

  • Proper dark palette: replaced the washed-out "Twilight steel" mid-blue dark mode with a true dark navy palette (bg #0F1C2E, surface #1A2E42, surface-alt #22384E) that has steel-blue undertones and clear contrast.
  • Light text on dark: all text now renders as light (#D8E4F0) on dark surfaces with muted tones (#8098B0) for secondary text. Gold accents (#C4A45A) for brown elements in dark mode.
  • Component overrides: hero card, stat items, quick-lookup, industry cards, product cards, compat groups, footer links, page-hero, login, CTA strip, admin sidebar/cards, utility buttons, language picker, display preferences panel — all mapped to dark surface colors.
  • Dark logo variant: reverted to showing the dark (light-on-dark) logo on the now-dark background.

v3.17.6 May 7, 2026

Founding Year Fix

  • Est. 1992: corrected the founding year from 1999 to 1992 across all 10 locale files, about page, hero badge, FAQ, seed data, and meta descriptions.
  • Stats bar: updated "25+ Years in Business" to "33+" to match the correct founding year.

v3.17.5 May 7, 2026

Mobile Responsive Overhaul

  • Hero: grid stacks to single column on tablet (≤ 900px) and phone (≤ 600px); heading scales from 3.75rem → 2.75rem → 2rem; hero card padding and series font shrink; CTA buttons stack vertically on phone.
  • Stats bar: switches from 4-column to 2×2 grid so all four stats are visible on narrow screens.
  • Industries grid: drops from 3 → 2 columns on tablet, 1 column on phone — cards get full-width breathing room.
  • Products grid: single column on phone so cards aren't cramped.
  • Section padding: reduced from 100px to 60px (tablet) / 44px (phone) so content isn't spaced miles apart on mobile.
  • Quick lookup, forms, footer, about, contact: all stack to single column on narrow screens with tighter padding.
  • Compatibility table: horizontal scroll on tablet/phone instead of overflowing the page.

v3.17.4 May 7, 2026

Twilight Steel Dark Mode

  • Dark mode redesign: dark mode now uses the same steel-blue + cream palette darkened by two shades (bg #A8C0D8, surface #96B0CA) instead of near-black — consistent look between light and dark.
  • Dark text on mid-blue: all dark-mode component overrides updated to use dark text (#1A2A3A) instead of cream/white text, matching the Twilight steel aesthetic.
  • Language modal: dark-mode lang-modal uses dark text on mid-blue surfaces with visible option cards.
  • Product cards / KB cards: image backgrounds and borders updated to mid-blue tones in both explicit and auto dark modes.
  • Nav dropdowns: softened box shadows and hover states for mid-blue context.
  • Logo: light logo variant now shown in dark mode (mid-blue background no longer needs the dark variant).
  • Token coverage: added --steel, --chrome, --silver, --ink-on-dark overrides in dark token block for full var() consistency.

v3.17.3 May 7, 2026

Text Contrast Fix + Mobile Menu Fix

  • Readable text everywhere: replaced all faint ink-on-dark, steel, silver, and chrome text colors with solid text-dark (#4A4A4A) on light-blue surfaces — hero, stats bar, section-dark, page-hero, CTA strip, footer, compatibility notes.
  • Quick-lookup box: removed the dark semi-transparent overlay; now a clean white card with subtle blue border and shadow that sits naturally on the light hero.
  • Footer: all text, links, headings, utility icons, and language picker now use dark colors for strong contrast against the light-blue (#B8D4E8) background.
  • Language picker dropdown: changed from dark navy popup to clean white card with blue accents.

v3.17.1 May 7, 2026

Mobile Hamburger Menu + Logo-Nav Alignment

  • Mobile hamburger menu: on screens ≤ 820px the navigation collapses behind a ☰ toggle button that slides open a vertical menu. Sub-dropdowns nest inline. Menu auto-closes when a link is tapped or the user clicks outside.
  • Logo-nav alignment: removed extra bottom padding on company-name text so the nav links sit at the same visual height as the logo text.

v3.17.0 May 7, 2026

Steel-Blue + Cream Palette — Light, Airy, No Dark Areas

  • New color direction: replaced dark-brown tones with medium steel-blue (#B8D4E8 / #D6E8F7 / #EEF4FA) across all surfaces — hero, footer, page-hero, section-dark, stats bar, CTA strip, compatibility groups, login page, and admin sidebar are now light blue contrasting warm cream/beige.
  • No dark areas: all previously-dark surfaces flipped to light backgrounds with dark text for a bright, open feel across the entire site.
  • CAD background grid: SVG strokes updated from brown back to blue (#3A7CB8) to match the steel-blue palette.
  • Admin fonts significantly increased: page titles (2.25rem), table headers (0.9375rem), table cells (1.0625rem), stat values (2.5rem), nav links (1.0625rem), submenu (1rem), badges (0.8125rem) — all larger for comfortable reading.
  • KB file icons & download cards: use solid blue gradient instead of dark palette variables for consistent contrast.
  • Smart-table section-dark styles: search, select, and pagination now use white backgrounds with blue borders instead of translucent dark overlays.

v3.16.0 May 7, 2026

Warm Cream/Beige Color Overhaul + Admin Font Increase

  • Dark blue removed: navy/blue palette replaced with warm dark-brown tones (#3B2A14 / #4A3620 / #5C462B) across all dark surfaces — hero, footer, page-hero, section-dark, stats bar, CTA strip, compatibility groups, login page, and admin sidebar.
  • Accent colors unified: blue accent links, badges, labels, and hover states replaced with brown/gold tones throughout. CAD background grid changed from blue to warm brown.
  • Admin font sizes increased: nav links, table headers, table cells, page titles, stat values, edit/delete links, and sidebar submenu items all bumped up for easier reading.
  • Dark mode updated: dark mode tokens now use warm earth tones instead of cool blue-greys.

v3.15.2 May 7, 2026

CRM Fields Indexed for Search

  • Product search expanded: product search (/products?q=) now searches across CRM fields — Specifications & Application, Equipment, Engine Model, Technical Information, and Product Name.
  • Compatibility search expanded: /compatibility search now also matches against CRM equipment, engine model, and specs fields for broader results.
  • CRM fields backend-only: removed CRM field display from public product page — data stays in admin and powers search only.

v3.15.1 May 7, 2026

Color Lightening + Compatibility Index + UI Fixes

  • Colors lightened: warmer, lighter cream/beige palette — text softened (#4A4A4A / #6B6B6B), backgrounds lifted (#FCFAF7), borders gentler (#EDE0C8). Easier on the eyes while retaining the technical aesthetic.
  • Compatibility search indexed: import script now populates the equipment and product_equipment tables from product applications data, enabling the /compatibility search to return results for imported products.
  • Header logo alignment: logo pushed left with gap between logo and navigation links for cleaner separation.
  • Footer product links: now link to category-filtered product pages (Starters, Alternators, Service Parts, HEMM Electricals, All Products) instead of individual SKUs.

v3.15.0 May 7, 2026

Major Catalog Expansion + Color Refresh + Articles + Contact

  • Schema expansion (v3.15): products table gains 20 new columns — product_name, HSN/SAC, GST rate, weight, country of origin, pack, box size, GeM IDs, warranty terms, CRM fields (description, specs, equipment, engine, technical info, status, record ID), catalog_price, catalog_id, and source. catalog_type converted from ENUM to VARCHAR(40) to support varied product types.
  • Cross-references: product_oe_refs gains ref_type column (OEM, Old Part Number, Competitor).
  • New tables: customer_codes (maps customer-specific part numbers to SKUs), articles (admin-managed content with full CRUD).
  • Categories expanded: 11 categories — Starters, Starter Motor, Alternators, Alternator Unit, Service Parts, Starter Service Parts, Alternator Spares, HEMM ELECTRICALS, HEMM SPARES, Packages, Others.
  • Import script: scripts/import-catalog.js reads Combined_Product_Catalog.xlsx and populates all tables — 2,588 products, 3,009 specs, 13,494 applications, 3,417 service parts, 1,317 cross-references, 590 customer codes. Run migration first: node scripts/migrate-v3.15.js.
  • Export updated: export-excel.js now includes all new fields and ref_type on cross-references.
  • Color refresh: warm neutral palette — charcoal text (#3C3C3C), warm brown accent (#8B6914), cream backgrounds (#FAF7F2), beige borders (#E8D5B7). Easy on the eyes, business-like.
  • Admin panel: cream/beige background (#FAF7F2), warm beige card borders, cream table headers.
  • Articles: admin CRUD at /admin/articles (add, edit, delete), public listing at /articles, detail at /articles/:slug. Added to sidebar nav and footer.
  • Contact page: updated with full address (207 Sethi Bhavan, 7 Rajendra Place, New Delhi 110008), phone (+91 11 4153 8485), email (sales@newindo.com), Google Maps embed, business hours, and LocalBusiness structured data.
  • Warranty: warranty.newindo.com linked in footer (Warranty Portal), warranty page (banner CTA), and contact page quick links.
  • SEO: Organization JSON-LD structured data on homepage, LocalBusiness JSON-LD on contact page, all pages have canonical URLs and OG tags.

v3.14.9 May 7, 2026

Card Typography + Brand Label

  • Brand label: "Brand: Delco Remy" shown as the last line below the type, in a consistent style.
  • Simplified fonts: product cards use one font (mono) at two sizes — SKU and series at 1rem, type and brand at 0.625rem.
  • Voltage "V" suffix: imported products storing bare numbers (e.g. "24") now display "24V"; values already containing "V" display as-is.

v3.13.3 May 7, 2026

Service Part Image Backfill Script

  • Image backfill: added scripts/backfill-images.js — downloads product images from the Delco Remy CDN for all service/spare parts that were skipped by the main importer. Downloads all 4 angles (main, front, side, back) and updates the database image_url column.
  • Supports --sku 1945853 (single SKU) and --dry-run (check availability only) flags.

v3.13.2 May 7, 2026

Official Delco Remy Logo & Trademark Attribution

  • Official logo: replaced styled text brand display on product detail pages with the official Delco Remy® logo image (sourced from delcoremy.com). Light and dark variants swap automatically with the site theme.
  • Trademark attribution: added required trademark notice to the site footer per Delco Remy logo usage guidelines: "DELCO REMY is a registered trademark of General Motors LLC, licensed to PHINIA Technologies Inc."

v3.13.1 May 7, 2026

Improved "Used In" Cross-Reference Display

  • Used In table: replaced card layout with a sortable/searchable table showing SKU (linked), series, applications summary, and stock status — each row now shows the unique identifier for each parent assembly instead of repeated generic info.
  • Smart table integration: Used In table supports search, sort, and pagination via data-smart-table for parts used in many assemblies.

v3.13.0 May 7, 2026

Service Parts Module & Cross-References

  • Service parts on product detail: starter and alternator pages now show a "Service Parts" section listing all child components (brushes, bearings, solenoids, housings, etc.) as a card grid with images, SKU, stock badge, pricing (approved customers), and individual "Add to Quote" buttons.
  • Reverse cross-reference: service part pages show a "Used In" section — a compact list of all parent assemblies (starters/alternators) that use the part, with thumbnail, series, voltage/power, and click-through to the assembly detail page.
  • Admin service parts CRUD: the product edit form includes a new "Service Parts" section to link child SKUs to parent assemblies. Automatically cross-links to existing catalog products by SKU lookup on save.
  • Compatibility page fix: fixed a 500 error when adding products to quote from the compatibility search — the API response was missing product_id, causing NaN in the SQL WHERE clause. Added server-side validation guard on POST /quote/add.

v3.12.0 April 24, 2026

Full CMS & Admin Customization

  • Dynamic Sign In nav item: Sign In / Account button is now a manageable nav item (kind = "auth"). Shows "Sign In" for guests, customer name + Logout for logged-in users. Position and visibility controlled from Admin > Navigation.
  • Nav alignment: new setting in Admin > Settings to align navigation links left, center, or right.
  • Page body editing: every page (About, Contact, Terms, Privacy, Warranty, etc.) now has a rich body field in the admin panel. HTML content entered here overrides the hardcoded template. Leave blank to keep the default template.
  • Footer content editing: tagline, address, and copyright text are now editable from Admin > Settings with bilingual EN/HI support.
  • Homepage section toggles: six toggle switches in Settings to show/hide individual homepage sections (hero, industries, featured products, compatibility, equipment match, CTA).
  • Brand colors: color pickers in Settings for primary blue, accent brown, and background cream. Changes apply site-wide immediately.
  • Logo upload: upload a custom logo (PNG, JPG, SVG, WebP) from Settings. Overrides the default logo in the header.
  • Database: expanded settings table with 16 new columns for CMS controls. Added body/body_hi to pages. Expanded nav_items.kind ENUM to include auth.

v3.11.0 April 24, 2026

Customer Portal & Price Visibility Control

  • Customer registration & login: visitors can now create an account at /register and log in at /login. Accounts require admin approval before prices become visible.
  • Price gating: product prices are hidden from all unapproved visitors across the catalog, product detail, home page, and quote cart. Approved customers see full pricing.
  • Admin customer management: new /admin/customers page to review, approve, reject, or delete customer accounts. Dashboard shows customer counts and pending approvals.
  • Email notifications: admins receive an email when a new customer registers. Customers receive approval/rejection emails.
  • Header auth links: Sign In link for guests, account name + logout for logged-in customers in the top navigation.
  • Database: new customers table with bcrypt password hashing and status workflow (pending/approved/rejected).

v3.10.6 April 23, 2026

UI Polish & Bug Fixes

  • Dropdown labels: fixed child items (Terms of Business, Online Sales T&C, Privacy Policy, Warranty Terms) showing blank text. The template expected a plain label column but nav_items uses label_en/label_hi; switched to direct column access.
  • Dropdown CSS: scoped .nav-links a to .nav-links > a so uppercase/nav-bar styles no longer leak into dropdown items. Reduced nav gap and letter-spacing to prevent multi-word items wrapping to two lines.
  • Stock position card: added proper styles for the product detail stock section — label/value pairs now render in a clean two-column layout with separators instead of raw bullet points.
  • Color consistency: shifted --cream from warm golden (#F5EDE0) to neutral (#F3F0EB). Fixed dark navy background (#1E2D3D) leaking into light-mode image viewer, card images, and thumbnails. Image containers now use white to match product photo backgrounds.

v3.10.0 April 23, 2026

Navigation Dropdowns & Header/Footer Redesign

  • Dropdown menus: nav items can now have children, rendered as sleek dropdown panels with backdrop blur, smooth slide-down animation, and subtle separator lines. Supports hover on desktop, tap-to-toggle on touch devices, and full keyboard navigation (arrow keys, Escape).
  • Parent/child admin UI: the nav item form now includes a "Parent" selector to nest any item under a top-level link. The admin nav list shows children indented with a ↳ marker and parent label. Schema adds parent_id column with foreign key constraint.
  • Legal pages under About: Terms of Business, Online Sales T&C, Privacy Policy, Warranty Terms, and Contact Us are seeded as dropdown children of the About link.
  • Header polish: Home link suppressed (logo serves that purpose). Cart rendered as an SVG icon with positioned count badge and tooltip.
  • Footer redesign: grid layout replaced with flexible inline nav groups wrapped in semantic <nav>. Trademark notice condensed and merged inline with copyright. Version number now dynamic via package.json. Mobile breakpoint at 600px.
  • Cache-busting: all static CSS and JS references stamped with ?v=<version> from package.json, auto-updated on every version bump.

v3.9.0 April 22, 2026

Form Validation & GST Number Support

  • GST Number field: both the quotation checkout and requirements forms now include an optional GST Number (GSTIN) input with auto-uppercase formatting and 15-character validation against the official GSTIN pattern (e.g. 22AAAAA0000A1Z5). Stored in a new gst_number column on the quotations table.
  • Client-side validation: new form-validate.js module provides instant on-blur feedback for GST format, email address, and Indian mobile number (10 digits starting 6–9, with optional +91 prefix). Invalid fields show red borders and inline error messages; corrected fields turn green. First error auto-scrolls into view on submit.
  • Server-side validation: both /quote/submit and /requirements POST handlers now re-check GST, email, and phone format server-side before inserting into the database. Invalid submissions redirect back to the form.
  • Drop-in architecture: any form can opt in to validation by adding the data-validate attribute — the script auto-discovers fields by name and attaches blur/submit handlers. No per-page wiring needed.
  • Validation CSS: error state (red border + shadow + message), success state (green border + shadow), and error-state label coloring added to the global stylesheet.

v3.8.0 April 22, 2026

Technical Knowledge Base & PDF Literature Viewer

  • Knowledge Base index page: new /knowledge-base public page with tabbed navigation (All / Articles / Documents), category filter pills, and a responsive card grid showing all published content.
  • Technical articles: admin-authored articles with HTML body, excerpt, category, bilingual support (auto-translated Hindi), and SEO-friendly slug URLs. Rendered in a clean, readable article layout at /knowledge-base/articles/:slug.
  • Document library: PDF catalogs, datasheets, installation guides, and technical bulletins. Supports both file upload (up to 50 MB via multer) and external URL links. Documents are displayed with file type badges, size info, and category tags.
  • Embedded PDF viewer: PDF documents open in an in-page iframe viewer with toolbar, plus "Open in New Tab" and "Download" buttons. Non-PDF documents show a styled download card. Responsive height adapts to mobile screens.
  • Admin CRUD: full create/read/update/delete for both articles and documents from the admin panel under Content → KB Articles and Content → KB Documents. File uploads stored in public/uploads/kb/ with sanitized filenames.
  • Site navigation: "Knowledge Base" added to the top nav between Industries and FAQs. New dependency: multer for file upload handling.

v3.7.0 April 22, 2026

Product Experience — 360° Spin Viewer

  • 360° drag-to-rotate viewer: product detail pages now feature an interactive image viewer. Drag left/right (mouse or touch) to rotate between four product angles (ANG, FRO, SID, BAC). Includes previous/next navigation buttons and keyboard arrow support.
  • Fullscreen lightbox zoom: click the zoom icon on any product image to open a fullscreen lightbox overlay with high-resolution images. Navigate between angles with on-screen arrows, keyboard left/right, or press Escape to close. Backdrop click also dismisses.
  • Image pre-caching: all four product angles are preloaded via JavaScript new Image() on page load, so rotation between views is instant with no loading flicker. A brief loading state (opacity fade) handles edge cases on slow connections.
  • Drag hint: a pulsing "Drag to rotate" hint appears on first view and auto-hides after the user's first interaction (drag, click thumbnail, or press arrow key).
  • Responsive & dark-mode: navigation buttons are always visible on mobile (no hover required), thumbnail strip adapts to smaller sizes, and the spin viewer background matches the dark theme palette.

v3.6.0 April 22, 2026

Intelligent Language Detection

  • GeoIP auto-detection: first-time visitors are automatically served the site in their regional language based on IP geolocation. Uses MaxMind GeoLite2 database (bundled via geoip-lite) for sub-millisecond in-memory lookups with no external API calls.
  • Indian state mapping: IP addresses from India are mapped to state-level ISO codes, then to the appropriate language — Maharashtra → Marathi, Tamil Nadu → Tamil, West Bengal → Bengali, and so on across all 11 supported languages. Hindi belt states (UP, MP, Delhi, Rajasthan, Bihar, etc.) default to Hindi.
  • Accept-Language fallback: if GeoIP returns English (international or unresolvable IP), the browser's Accept-Language header is parsed as a secondary signal. This catches users with Indian language preferences set in their browser even when browsing from abroad.
  • One-time detection: the detected language is persisted in the newindo.lang cookie immediately, so the GeoIP lookup only runs once per visitor. Users can still override via the language picker at any time.
  • Subcontinent awareness: Nepal → Hindi, Bangladesh → Bengali, Sri Lanka → Tamil. All other countries default to English.
  • Hindi default for India: all Indian visitors default to Hindi on first visit (regardless of state), with a welcome modal popup prompting them to choose their preferred regional language.
  • Welcome modal: first-time visitors see a "Welcome to New Indo Trading Company — please choose your preferred language" popup (always in English) with a grid of all 11 languages. Dismissing the modal or clicking outside persists the current language. Includes dark-mode and mobile-responsive styling.

v3.5.0 April 22, 2026

Admin Navigation Overhaul

  • Collapsible sidebar groups: admin navigation reorganised from 9 flat links into 4 logical groups — Catalog (Products, Stock), Orders & Service (Quotations, Service Tickets), Content (FAQs, Pages & SEO, Top Navigation), and System (Settings). Dashboard remains a top-level link.
  • Animated expand/collapse: each group has a chevron toggle with smooth max-height animation. Clicking a group header opens or closes the submenu.
  • Persistent state: open/closed state is saved in a cookie (adminNav) so sidebar groups stay where you left them across page loads. Groups containing the active page are always forced open.
  • Sub-item styling: submenu links are indented with dot indicators, active state highlighted with blue accent, and hover transitions matching the existing admin theme.

v3.4.0 April 22, 2026

Legal & Compliance Pages

  • Terms of Business: comprehensive B2B terms covering definitions, scope, quotations, payment, delivery, warranty references, returns, limitation of liability, intellectual property, governing law, and amendments.
  • Online Sales Terms & Conditions: website-specific purchase terms covering eligibility, product information, quotation workflow, pricing & GST, payment methods, order processing, shipping, cancellation policy, returns & refunds, and data protection.
  • Privacy Policy: DPDP Act 2023 compliant privacy policy covering data collection categories, purpose, consent & legal basis, storage & security, retention periods, data sharing, cookies, data principal rights, children's data, and grievance officer contact.
  • Warranty Terms & FAQs: full warranty coverage details (new, remanufactured, service parts), exclusions, claim process (through New Indo or the Delco Remy warranty portal), resolution options, and 6 frequently asked questions.
  • Footer navigation: new "Legal" column in the site footer with links to all four legal pages.
  • Legal page styling: new .legal-page CSS class with readable max-width, section dividers, styled headings, FAQ formatting, and dark-mode support.

v3.3.1 April 22, 2026

Smart Tables, 11-Language i18n, Product Enhancements

  • Smart Tables: site-wide drop-in table enhancement via data-smart-table attribute. Features include live search, click-to-sort columns, and configurable pagination (10/20/50/100/200/All). Applied to all public and admin tables.
  • 11-Language support: language picker expanded from EN/HI to 11 Indian languages — English, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Odia, Malayalam, and Punjabi. Static chrome fully translated for all languages; DB content falls back through regional language → Hindi → English.
  • Language picker: redesigned as a dropdown menu (replacing the EN↔HI toggle) showing each language in its native script. Added Google Fonts Noto Sans family for all 10 Indian scripts.
  • Product placeholders: custom SVG gear/starter icon displayed for products without images, replacing the broken-image icon on product cards and detail pages.
  • Brand display: brand badge now shown on product detail sidebar above the price card.
  • Equipment reindex: admin dashboard button and cron-ready CLI script (scripts/reindex-equipment.js) to sync product_applications into the equipment + product_equipment tables used by the compatibility page.
  • Deactivate no-SKU products: utility script (scripts/deactivate-no-sku.js) to set products without a SKU to inactive status.
  • Bug fixes: product detail form layout corrected (was rendering horizontally); smart-table pagination styled for dark-section contexts; db.q() destructure errors fixed in utility scripts.

v3.3.0 April 22, 2026

Display Preferences Overhaul + Logo Redesign

  • Font chooser: expanded from 4 to 11 font options (system, sans, serif, mono, segoe-ui, arial, tahoma, inter, open-sans, verdana, courier). Each preference overrides --font-display and --font-body CSS variables at the <html> level so the chosen font applies site-wide.
  • Font sizer: converted all 136 font-size declarations from px to rem. The 5 text-size stops (xs/s/m/l/xl) now change the root font-size (13.6px–19.2px), scaling the entire page uniformly — nav, hero, footer, cards, tables, everything.
  • Display Preferences popup: redesigned as a compact 300px panel anchored bottom-right (was a 440px centered modal) so users can see the page update in real-time while adjusting settings. Includes a 5-stop text-size slider and an 8-option font-style card grid.
  • Utility bar: three icon buttons in the footer — globe (EN↔HI toggle), Aa (display prefs popup), moon (theme cycle).
  • Logo redesign: replaced the wide horizontal logo (1695×323, 5:1 ratio) with a compact layout — starter artwork as image + "New Indo Trading Company" rendered as HTML text in Cinzel with font-variant-caps: small-caps for the classic large-initial/small-caps look. Dark variant auto-generated with consistent cream outlines. Logo text scales with font-size preferences since it's HTML.
  • Google Fonts: added Cinzel (logo text), Inter, and Open Sans to the font stack.
  • Footer link font-size increased to 0.9rem for readability.

v3.2.1 April 21, 2026

Security Patch + UX Polish

  • Security: bumped nodemailer ^6.9 → ^8.0.5 (addresses GHSA-mm7p-fcc7-pg87, GHSA-rcmh-qjqh-p98v, GHSA-c7w3-x93f-qmm8, GHSA-vvjj-xcjg-gr5g).
  • Utility bar: language / text-size / theme toggles relocated from the top nav into a centered footer toolbar above the copyright strip.
  • Hero, stats, and section-dark blocks now use dedicated --ink-on-dark / --ink-on-dark-muted CSS tokens so cream ink reads cleanly against navy surfaces in both themes.
  • Public tables (.compat-table, .spec-table, .apps-table, .cart-table) rewired onto theme tokens.
  • Form inputs switched from hardcoded #D0D5DD borders to var(--border).

v3.2.0 April 21, 2026

Hindi i18n + Bilingual Support

  • Hindi i18n: shipped end-to-end. lib/translator.js wraps Google Cloud Translate; admin save handlers auto-populate *_hi columns on create/edit.
  • Locale picker: res.locals.tr(row, field) for DB rows and res.locals.t(key, fallback) for static chrome (dictionaries at locales/en.json / locales/hi.json).
  • Every public EJS view wrapped in t(); admin panel remains English-only.
  • Utility bar: language (EN/HI), theme (light/dark/system), font size, and font family toggles, all persisted in cookies.
  • Logos: new PNG logos replace the old inline SVG and swap via theme-aware CSS.
  • Error pages: branded 403/404/500 pages via views/404.ejs.
  • LogRocket: front-end session replay + error capture (opt-in through LOGROCKET_APP_ID).
  • Error pipeline: lib/error-reporter.js emails deduped, rate-limited alerts to ERROR_ALERT_TO.
  • Secret store: API-key management moved behind an encrypted store (lib/secret-store.js + SECRET_KEY env) with a dedicated admin UI.

v3.1.1 April 21, 2026

Dependency & Security Updates

  • Dependencies bumped for Node 22/24 + MariaDB 11.4.
  • Dropped body-parser in favour of Express built-ins.
  • Added trust proxy, sameSite+secure cookies.
  • Added X-Content-Type-Options / X-Frame-Options / Referrer-Policy via .htaccess.
  • Charset corrected to utf8mb4 (was utf8mb4_unicode_ci).