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.
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.
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).
📈 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.
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.
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).
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.
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.
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
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
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
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
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 status — listing_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 edit — listing_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.
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.
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.
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 fields — company_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.
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.
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.
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.
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
Removed the "Parts Claimed under Warranty" section and table from the warranty claim PDF.
All attached images from Upload_Images, Upload_Photos, and Upload_Documents_Images are now rendered inline, one per row at full content width.
Images are downloaded via the Zoho API and embedded as PNG/JPG with automatic aspect-ratio scaling and page breaks.
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
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 ' 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.
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.
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.
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.
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.
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.
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/.
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.
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.
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.
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.
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).
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.
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 ₹ (₹) 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 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).
Feature: Per-warehouse stock tracking (GGN, DEL) with warehouses and product_stock tables. Admin sees per-warehouse breakdown; public sees combined total.
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.
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.
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: 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.
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.
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.
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.
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).