<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SmartDukaan &#x2013; /</title><description>WebSVN RSS feed &#x2013; SmartDukaan</description><lastBuildDate>Sun, 23 Aug 2026 20:27:14 +0530</lastBuildDate><generator>WebSVN 2.8.6-DEV</generator><language>en</language><link>https://svn.smartdukaan.com/log.php?repname=SmartDukaan&amp;path=%2F&amp;max=40&amp;peg=37337</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37337&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Tue, 18 Aug 2026 13:37:58 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37337 – Move offer-circular ingest out of cron and into the portal ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 23 file(s) modified&lt;/strong&gt;&lt;br/&gt;Move offer-circular ingest out of cron and into the portal&lt;br /&gt;
&lt;br /&gt;
The parse now runs in profitmandi-fofo, on a background thread, triggered by the&lt;br /&gt;
upload that produced the document.&lt;br /&gt;
&lt;br /&gt;
Why: splitting one feature across two artifacts with independent deploy cadences&lt;br /&gt;
cost a full day. fofo shipped, cron did not, and a valid upload sat in DRAFT with&lt;br /&gt;
nothing on the server able to parse it - the deployed cron jar contained none of the&lt;br /&gt;
ingest classes. One 9-page PDF a month never justified a batch tier, and the portal&lt;br /&gt;
already ships two PDF stacks, so the isolation argument for keeping PDFBox out was&lt;br /&gt;
weaker than it looked.&lt;br /&gt;
&lt;br /&gt;
- 13 parser classes move verbatim from com.smartdukaan.cron.offercircular to&lt;br /&gt;
  com.spice.profitmandi.web.offercircular. No logic changed.&lt;br /&gt;
- CircularIngestScheduler becomes CircularIngestRunner: the @Scheduled(every 5 min)&lt;br /&gt;
  entry point and the offer.circular.ingest.enabled flag are gone, replaced by a&lt;br /&gt;
  single-threaded daemon executor. All claim, ingest and notification logic is&lt;br /&gt;
  unchanged.&lt;br /&gt;
- Upload hands the document id to the runner AFTER COMMIT, not inline. The DRAFT row&lt;br /&gt;
  is written inside the request transaction; a worker starting immediately would race&lt;br /&gt;
  that commit, find nothing to claim and silently do nothing - which is precisely the&lt;br /&gt;
  stuck-on-DRAFT symptom this change removes.&lt;br /&gt;
- The guarded claim is KEPT even though there is now one trigger. It still stops a&lt;br /&gt;
  double-submit, a second portal node, and a re-ingest racing an in-flight parse.&lt;br /&gt;
- Re-ingest parses immediately instead of queueing for a scheduler.&lt;br /&gt;
- The stall reaper runs when the review screen loads. There is no timer here any&lt;br /&gt;
  more, and a document stranded by a redeploy mid-parse only matters when somebody&lt;br /&gt;
  looks for it - which matters more now the parse lives in the web application.&lt;br /&gt;
- tabula moves to this module with its exclusions intact, as does the&lt;br /&gt;
  dumpCircularClasspath helper the local ingest harness depends on.&lt;br /&gt;
- Screen no longer claims &quot;the ingest job runs every 5 minutes&quot;, which was untrue the&lt;br /&gt;
  moment cron stopped being the route; poll interval 15s -&gt; 3s to match a parse that&lt;br /&gt;
  takes seconds. jsVersion 404 -&gt; 405.&lt;br /&gt;
- offer.circular.review.url added here, since the runner sends that email now.&lt;br /&gt;
&lt;br /&gt;
Verified: full ingest of the Aug&apos;26 circular through the relocated code is identical&lt;br /&gt;
to the reference - 239 offers, 663 products, 279 AUTO_EXACT, 361 benefits, 511&lt;br /&gt;
tenures, 911 bank links. ProductNamesTest 11/11 in its new home.&lt;/div&gt;~ /trunk/profitmandi-fofo/build.gradle&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferCircularController.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/BankTextParser.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/BenefitParser.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/CatalogIndex.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/CircularExtractor.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/CircularIngestRunner.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/CircularIngestService.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/CircularRow.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/FootnoteParser.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/ProductAliases.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/ProductMatcher.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/ProductNames.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/ScopeConfig.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/SequenceRatio.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/offercircular/TenureParser.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/dev.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/prod.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/offer-circular-review.js&lt;br /&gt;+ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/web/offercircular&lt;br /&gt;+ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/web/offercircular/ProductNamesTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37337&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37337&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 12:13:49 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37336 – Expose loginEmail to the admin views  admin.vm gates the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Expose loginEmail to the admin views&lt;br /&gt;
&lt;br /&gt;
admin.vm gates the OFFER CIRCULAR sidebar entry on the exact logged-in email,&lt;br /&gt;
because visibility there is per-email and auth.menu can only express roles. Nothing&lt;br /&gt;
was setting that variable, so the #if was always false and the entry rendered for&lt;br /&gt;
nobody on a clean build - it only appeared where a working copy happened to carry&lt;br /&gt;
this line locally.&lt;br /&gt;
&lt;br /&gt;
Committed alongside r37331, which added the gate itself.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/AdminUser.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37336&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37336&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 12:12:09 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37335 – Show offer circular ingest state on the review screen  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Show offer circular ingest state on the review screen&lt;br /&gt;
&lt;br /&gt;
Upload and parsing run in different processes - the portal stores the PDF as DRAFT&lt;br /&gt;
and the cron job claims it minutes later - so the screen looked identical before and&lt;br /&gt;
after a successful ingest. A reviewer had no way to tell &quot;not parsed yet&quot; from&lt;br /&gt;
&quot;parsed and produced nothing&quot;, and a FAILED circular showed nothing at all.&lt;br /&gt;
&lt;br /&gt;
- the selected circular&apos;s state is shown as queued / parsing / parsed / failed,&lt;br /&gt;
  with the recorded reason on failure and the ingest summary on success&lt;br /&gt;
- while it is DRAFT or PROCESSING the screen polls every 15s and pulls in the rows&lt;br /&gt;
  the moment the parse lands. Polling stops as soon as the state settles, so it&lt;br /&gt;
  cannot spin forever, and a transient error keeps waiting rather than giving up&lt;br /&gt;
- jsVersion 403 -&gt; 404, since offer-circular-review.js is already being served and&lt;br /&gt;
  this is a modification rather than a new file&lt;br /&gt;
&lt;br /&gt;
Pairs with the stall reaper: a circular abandoned mid-parse is now both recovered&lt;br /&gt;
and explained on screen instead of sitting silently in PROCESSING.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/offer-circular-review.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/offer-circular-review.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37335&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37335&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 12:11:53 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37334 – Sweep stalled offer circulars before each ingest run, and drop ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Sweep stalled offer circulars before each ingest run, and drop stale scaffolding&lt;br /&gt;
&lt;br /&gt;
- The scheduler now calls reclaimStalledProcessing before looking for new work, so&lt;br /&gt;
  a circular stranded in PROCESSING by a dead or redeployed worker is failed with a&lt;br /&gt;
  reason instead of staying invisible forever. Threshold is 30 minutes against a&lt;br /&gt;
  parse that takes seconds, so it can only ever catch a genuinely dead worker. The&lt;br /&gt;
  sweep is wrapped so it can never stop the actual ingest.&lt;br /&gt;
- dumpCircularClasspath was labelled a temporary helper for diffing against the&lt;br /&gt;
  reference Python. That Python has been deleted, but the task is what lets an&lt;br /&gt;
  ingest be reproduced and measured locally per scripts/offer_circular/README.md,&lt;br /&gt;
  so the comment now says what it is for rather than telling the next reader to&lt;br /&gt;
  delete it.&lt;br /&gt;
- CircularExtractor&apos;s javadoc claimed verification against the Python reference.&lt;br /&gt;
  That proved equivalence, not correctness - both shared the missing-memory-unit&lt;br /&gt;
  bug that bound offers to the wrong SKU. Reworded so it cannot be read as a&lt;br /&gt;
  correctness guarantee, and points at the fixture and ProductNamesTest instead.&lt;br /&gt;
&lt;br /&gt;
Verified: full ingest of the Aug&apos;26 circular is byte-identical to the reference -&lt;br /&gt;
239 offers, 663 products, 279 AUTO_EXACT. ProductNamesTest 11/11.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularExtractor.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularIngestScheduler.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37334&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37334&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 12:11:38 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37333 – Reclaim offer circulars stranded in PROCESSING, and surface the ingest ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Reclaim offer circulars stranded in PROCESSING, and surface the ingest reason&lt;br /&gt;
&lt;br /&gt;
A claim moves a circular DRAFT -&gt; PROCESSING, and selectDraftDocumentIds only ever&lt;br /&gt;
picks up DRAFT. So a worker that died, was redeployed, or hung mid-parse left that&lt;br /&gt;
document stranded in PROCESSING forever, invisible to every later sweep. The batch&lt;br /&gt;
tier looked like it provided retry semantics and did not.&lt;br /&gt;
&lt;br /&gt;
- reclaimStalledProcessing(minutes) fails anything left in PROCESSING past the&lt;br /&gt;
  threshold. Deliberately FAILED and not back to DRAFT: a circular that reliably&lt;br /&gt;
  kills the parser would otherwise be re-claimed on every sweep forever. FAILED is&lt;br /&gt;
  visible, carries the reason, and the existing re-ingest action already allows&lt;br /&gt;
  FAILED -&gt; DRAFT, so re-queueing is one click.&lt;br /&gt;
- claimForProcessing now stamps processed_at, which is what the stall is measured&lt;br /&gt;
  against. No DDL: that column is written only by this repository and read by&lt;br /&gt;
  nothing else, so it can carry the last-transition time.&lt;br /&gt;
- selectDocuments returns ingest_error and ingest_summary. Without the reason the&lt;br /&gt;
  screen would show a bare FAILED, which the reaper would now produce routinely.&lt;br /&gt;
&lt;br /&gt;
Verified against the local DB both ways: a claim aged 45 minutes is reclaimed with&lt;br /&gt;
its reason recorded, a fresh claim is untouched.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/CircularIngestRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/CircularIngestRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/OfferCircularRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37333&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37333&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 11:18:51 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37332 – Move the offer-circular upload directory off a developer home path ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Move the offer-circular upload directory off a developer home path&lt;br /&gt;
&lt;br /&gt;
Every upload in production failed with a 400 on mkdirs. offer.circular.dir was&lt;br /&gt;
never set in any environment, so it fell back to the code default&lt;br /&gt;
/users/amit/uploads/offer-circulars; Tomcat runs as the tomcat user, which cannot&lt;br /&gt;
create /users at the filesystem root, and the controller threw &quot;Circular storage&lt;br /&gt;
directory is not writable&quot;.&lt;br /&gt;
&lt;br /&gt;
- default is now /var/lib/smartdukaan/offer-circulars, a real server path&lt;br /&gt;
- offer.circular.dir set explicitly in prod.properties, and pointed at the&lt;br /&gt;
  developer&apos;s own space in dev.properties, since /var/lib needs sudo on a&lt;br /&gt;
  workstation&lt;br /&gt;
- staging.properties deliberately untouched; the new default covers it&lt;br /&gt;
&lt;br /&gt;
The location has two hard constraints, now recorded on the field itself:&lt;br /&gt;
&lt;br /&gt;
- OUTSIDE webapps/. A redeploy wipes anything under it, and&lt;br /&gt;
  offer_document.stored_path is how both re-ingest and re-download resolve the&lt;br /&gt;
  PDF, so a wipe breaks them permanently. Stray PDFs are already sitting in&lt;br /&gt;
  WEB-INF/classes/META-INF on the server from exactly this mistake.&lt;br /&gt;
- OUTSIDE any web root. A circular carries the OEM&apos;s confidential cashback&lt;br /&gt;
  economics and must never be servable as a static file. Hence /var/lib rather&lt;br /&gt;
  than /var/www, whose local precedent /var/www/partner_stats is chmod 777.&lt;br /&gt;
&lt;br /&gt;
Only fofo needs the key: the cron ingest resolves the PDF from&lt;br /&gt;
offer_document.stored_path and reads it as root, so 0750 tomcat:tomcat is enough.&lt;br /&gt;
&lt;br /&gt;
Deploying this alone does not fix production - the directory must also exist and&lt;br /&gt;
be writable by tomcat.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferCircularController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/dev.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/prod.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37332&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37332&amp;peg=37337</guid></item>
<item><pubDate>Tue, 18 Aug 2026 00:19:29 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37331 – Add offer circular review and curation screen  Shows the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add offer circular review and curation screen&lt;br /&gt;
&lt;br /&gt;
Shows the nine verbatim PDF columns beside what the parser made of them, uploads a&lt;br /&gt;
new monthly circular, and resolves the products the matcher could not.&lt;br /&gt;
&lt;br /&gt;
Upload deliberately does not parse - it stores the PDF, sha256-deduped, and&lt;br /&gt;
registers it DRAFT, so an upload can never half-populate the offer tables. The cron&lt;br /&gt;
ingest job picks it up from there.&lt;br /&gt;
&lt;br /&gt;
The curation queue groups by distinct (division, raw text) because that is the&lt;br /&gt;
product_alias key: one answer clears every row carrying that text, on this circular&lt;br /&gt;
and on every later one. On the Aug&apos;26 circular that turns 152 unresolved rows into&lt;br /&gt;
106 decisions. Three actions mirror product_alias.action - PIN to a catalog id,&lt;br /&gt;
REWRITE to the catalog&apos;s spelling and match again, or IGNORE.&lt;br /&gt;
&lt;br /&gt;
- Writes product_alias only, so nothing the screen does can set manually_curated&lt;br /&gt;
  and lock a circular against re-ingest. Coverage decisions, which do need that,&lt;br /&gt;
  are listed but visibly parked rather than offered a naming answer.&lt;br /&gt;
- A saved decision changes nothing until re-ingest, because aliases are read at&lt;br /&gt;
  ingest time; the queue says so and the re-ingest button puts the document back&lt;br /&gt;
  to DRAFT for the scheduler. The portal cannot run the ingest itself - that lives&lt;br /&gt;
  in profitmandi-cron, which fofo does not depend on.&lt;br /&gt;
- The closest rejected match is shown for context and never pre-selected. Four new&lt;br /&gt;
  OnePlus models each &quot;nearly&quot; matched a 2015 OnePlus 2 at 0.80-0.84, and offering&lt;br /&gt;
  that as a suggestion invites a reviewer to confirm it. Where the catalog has no&lt;br /&gt;
  such SKU the search says so and steers to IGNORE.&lt;br /&gt;
- aliasExport emits every decision as replayable SQL, because the portal writes to&lt;br /&gt;
  one database and environments would otherwise drift apart silently.&lt;br /&gt;
&lt;br /&gt;
Access is an email allowlist AND the admin role. Both are enforced in the&lt;br /&gt;
controller; the sidebar entry repeats the allowlist because visibility in auth.menu&lt;br /&gt;
is role-driven and cannot express a per-email rule.&lt;br /&gt;
&lt;br /&gt;
No jsVersion bump: offer-circular-review.js is a new file that was never cached,&lt;br /&gt;
so it needs no cache-buster, and churning that shared counter only conflicts with&lt;br /&gt;
whoever is mid-edit on it.&lt;/div&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferCircularController.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/js/offer-circular-review.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/admin.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/include-scripts.vm&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/offer-circular-review.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37331&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37331&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 21:07:56 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37330 – Add Pine Labs affordability circular parsing and ingest  Turns ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 21 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add Pine Labs affordability circular parsing and ingest&lt;br /&gt;
&lt;br /&gt;
Turns the monthly OEM &quot;Mobile &amp; Laptop Offers&quot; PDF into the offers schema: tabula&lt;br /&gt;
extraction to nine verbatim columns per row, per-cell parsers for benefit, tenure,&lt;br /&gt;
bank and footnote text, catalog matching, and a scheduler that claims DRAFT&lt;br /&gt;
documents uploaded from the FOFO portal and emails the uploader the outcome.&lt;br /&gt;
&lt;br /&gt;
Ships inert. offer.circular.ingest.enabled defaults to false, so the scheduler does&lt;br /&gt;
nothing until an environment opts in, and offer.circular.review.url defaults to&lt;br /&gt;
empty - neither key is required for the context to start.&lt;br /&gt;
&lt;br /&gt;
- tabula added here and not in profitmandi-common so PDFBox never reaches the&lt;br /&gt;
  web/fofo WARs; bouncycastle, slf4j-simple and jai-imageio excluded (version&lt;br /&gt;
  clash, duplicate SLF4J binding, and unused image decoding respectively)&lt;br /&gt;
- offer_raw_row holds all nine columns verbatim, so re-parsing reads the table and&lt;br /&gt;
  never the PDF again&lt;br /&gt;
- product_alias is consulted before matching, so a human confirmation recorded once&lt;br /&gt;
  keeps applying every following month&lt;br /&gt;
&lt;br /&gt;
ProductNamesTest locks in the product-name parsing, which decides which SKU an&lt;br /&gt;
offer&apos;s money lands on. Every case there is a real mis-parse, and they share one&lt;br /&gt;
root cause: characters or digits belonging to the model name being eaten as memory&lt;br /&gt;
or stripped as punctuation. Two worth naming:&lt;br /&gt;
&lt;br /&gt;
- A memory spec with no GB/TB unit is still a memory spec. Motorola writes&lt;br /&gt;
  &quot;(8+256)&quot; and vivo &quot;(8+256G)&quot;; unrecognised, the matcher believed no size was&lt;br /&gt;
  given and bound the offer to an arbitrary sibling - a 1,000 Edge 60 Pro 8+256&lt;br /&gt;
  offer and a 2,000 12+256 offer landed on the same SKU.&lt;br /&gt;
- Two variant groups written back-to-back are two products. &quot;Edge 70 Pro&lt;br /&gt;
  (8+256)(12+256)&quot; stayed one product bound to a single SKU while the 12+256&lt;br /&gt;
  variant silently got no offer at all.&lt;br /&gt;
&lt;br /&gt;
Bundled accessories are deliberately NOT stripped back to the bare phone. Doing so&lt;br /&gt;
resolves 30 CATALOG_GAP rows and looks safe on Oppo, whose bundled and bare rows&lt;br /&gt;
carry identical values - but vivo caps X300 Pro(16+512G) at 10,000 on its own row&lt;br /&gt;
and 11,000 on the &quot;+Extender&quot; row, the difference being the Extender. Merging them&lt;br /&gt;
would let the bundle&apos;s cap be claimed on a phone sold without the accessory.&lt;br /&gt;
Whether a bundle offer transfers to the bare SKU is a commercial question the PDF&lt;br /&gt;
does not answer, so it is a manual coverage decision, not a parsing rule.&lt;br /&gt;
&lt;br /&gt;
Verified against the Aug&apos;26 circular on the local DB: 324 rows in the PDF, 239&lt;br /&gt;
loaded, producing 361 benefits, 511 tenures, 911 bank links and 663 products, of&lt;br /&gt;
which 74% resolve automatically. ProductNamesTest 11/11.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/BankTextParser.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/BenefitParser.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CatalogIndex.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularExtractor.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularIngestScheduler.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularIngestService.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/CircularRow.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/FootnoteParser.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/ProductAliases.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/ProductMatcher.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/ProductNames.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/ScopeConfig.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/SequenceRatio.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/TenureParser.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/test/java/com&lt;br /&gt;+ /trunk/profitmandi-cron/src/test/java/com/smartdukaan&lt;br /&gt;+ /trunk/profitmandi-cron/src/test/java/com/smartdukaan/cron&lt;br /&gt;+ /trunk/profitmandi-cron/src/test/java/com/smartdukaan/cron/offercircular&lt;br /&gt;+ /trunk/profitmandi-cron/src/test/java/com/smartdukaan/cron/offercircular/ProductNamesTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37330&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37330&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 21:07:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37329 – Add offers-schema repositories for the Pine Labs affordability circular  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add offers-schema repositories for the Pine Labs affordability circular&lt;br /&gt;
&lt;br /&gt;
Three repositories over the offers schema, split by who is allowed to write what:&lt;br /&gt;
&lt;br /&gt;
- OfferCircularRepository - read side for the review screen (verbatim rows,&lt;br /&gt;
  documents, per-offer parsed detail)&lt;br /&gt;
- CircularIngestRepository - write side for ingest; claims a DRAFT document with&lt;br /&gt;
  a guarded UPDATE and deletes only rows derived from that one document, so&lt;br /&gt;
  re-ingesting one month cannot disturb another&lt;br /&gt;
- OfferCurationRepository - write side for manual curation&lt;br /&gt;
&lt;br /&gt;
The split is deliberate: a caller that only displays circulars should not hold a&lt;br /&gt;
handle that can rewrite the scope config or the offer tables.&lt;br /&gt;
&lt;br /&gt;
OfferCurationRepository writes offers.product_alias and nothing else. An alias is&lt;br /&gt;
config, keyed on (division_id, raw_text), so re-ingest reproduces it and one&lt;br /&gt;
decision carries into every later circular. Writing offer_product instead would be&lt;br /&gt;
derived data that re-ingest deletes, which is why doing so has to set&lt;br /&gt;
manually_curated and freeze the circular permanently - not a trade worth making for&lt;br /&gt;
a naming decision, so this repository cannot make it.&lt;br /&gt;
&lt;br /&gt;
A PIN is validated against the division&apos;s own brand and category before it is&lt;br /&gt;
stored. Nothing downstream re-checks a pinned id - the matcher takes it at face&lt;br /&gt;
value - so an unverified exception would silently mismap money.&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/CircularIngestRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/CircularIngestRepositoryImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/OfferCircularRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/OfferCircularRepositoryImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/OfferCurationRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/offers/OfferCurationRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37329&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37329&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 19:25:56 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37328 – Fetch a fresh EWB auth token when the cached one ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fetch a fresh EWB auth token when the cached one is stale&lt;br /&gt;
&lt;br /&gt;
Two defects made an expired EWB token unrecoverable, surfacing as GSP102&lt;br /&gt;
&quot;eInvoice AuthToken not found or expired&quot; on every GET.&lt;br /&gt;
&lt;br /&gt;
1. ewbApiGet&apos;s retry was unreachable. NIC returns GSP102 with HTTP 400, and&lt;br /&gt;
   RestClient.execute throws GE_1005 on any non-2xx before returning the body, so the&lt;br /&gt;
   &apos;if (response.contains(&quot;GSP102&quot;))&apos; branch could never run. A failed first attempt is&lt;br /&gt;
   now treated as a possibly-stale token and retried once with a freshly minted one; a&lt;br /&gt;
   second failure propagates. The POST path was unaffected — executeJson does not check&lt;br /&gt;
   status, so its retry already worked.&lt;br /&gt;
&lt;br /&gt;
2. Eviction targeted the wrong cache. The token is cached in redisCacheManager but all&lt;br /&gt;
   three sites evicted through redisFortnightlyCacheManage, a different cache, so the&lt;br /&gt;
   eviction was a silent no-op and the stale token survived. Eviction now goes through&lt;br /&gt;
   GstProAuthService.evictEwbAuthToken, declared beside the @Cacheable and pinned to the&lt;br /&gt;
   same cacheManager so the two cannot drift apart again.&lt;br /&gt;
&lt;br /&gt;
Found while dry-running the EWB backfill, which failed on the first invoice.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProAuthService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37328&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37328&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 17:46:07 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37327 – super retailer club 5 live</title><description>&lt;div&gt;&lt;strong&gt;ranu – 21 file(s) modified&lt;/strong&gt;&lt;br/&gt;super retailer club 5 live&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOrderRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOrderRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/DashboardController.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/1 GM Gold Coin.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/accessories.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/calendar_.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/CURRENTLY AIMING FOR.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/download.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Group 4.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Maharaja.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Mobile And tv.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Raftaar.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Shuruaat.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Tarakki.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Target.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/TOTAL ACHIEVEMENT.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Udaan.png&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/images/src-images/Vijeta.png&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/dashboard1.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37327&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37327&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 17:23:40 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37326 – Add --backfillMissingEwb cron arg  Runs InvoiceService.backfillMissingEwb over an explicit ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add --backfillMissingEwb cron arg&lt;br /&gt;
&lt;br /&gt;
Runs InvoiceService.backfillMissingEwb over an explicit invoice list:&lt;br /&gt;
  --backfillMissingEwb --invoiceNumbers=A,B,C [--dryRun]&lt;br /&gt;
&lt;br /&gt;
Explicit list rather than a date window so the backfill only touches the invoices known&lt;br /&gt;
to have lost their EWB. NOT_SUPPORTED on the RunOnceTasks wrapper suspends the&lt;br /&gt;
class-level transaction, keeping the NIC lookups outside one.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/migrations/RunOnceTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37326&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37326&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 17:23:32 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37325 – Add EWB backfill for invoices whose IRN was recovered via ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add EWB backfill for invoices whose IRN was recovered via DUPIRN&lt;br /&gt;
&lt;br /&gt;
When GenerateIRN carries EwbDtls, NIC files the IRN and e-way bill together and reports&lt;br /&gt;
the EWB back only in that response, flagged by InfoDtls[InfCd=EWBPPD]. A read timeout&lt;br /&gt;
sends the retry down the DUPIRN path, which recovers the IRN via the get-e-invoice&lt;br /&gt;
endpoint — that response carries neither InfoDtls nor EWB fields. The EWB therefore&lt;br /&gt;
exists at NIC while ewb_no stays null locally, and since updatePdfModelWithIrnDetails&lt;br /&gt;
gates the entire e-way bill section on ewb_no, the stored PDF omits it altogether.&lt;br /&gt;
&lt;br /&gt;
backfillMissingEwb() looks the EWB up by (seller GSTIN, ack date), matches on docNo, and&lt;br /&gt;
takes actualDist from the per-EWB call since the distance is printed on the invoice. It&lt;br /&gt;
then re-renders the PDF; generateIrnForInvoices returns early once irn_generated is set,&lt;br /&gt;
so nothing is re-filed at NIC.&lt;br /&gt;
&lt;br /&gt;
NIC is queried with the transaction suspended (NOT_SUPPORTED); the write and the&lt;br /&gt;
re-render each run in their own REQUIRES_NEW transaction.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/InvoiceService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37325&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37325&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 16:32:42 +0530</pubDate><dc:creator>aman</dc:creator><title>Rev 37324 – Lead Management: restrict lead view to field-level sales only (L1-L3). ...</title><description>&lt;div&gt;&lt;strong&gt;aman – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Lead Management: restrict lead view to field-level sales only (L1-L3). Any SALES position at any level previously forced the own+reportees lead filter, so senior sales heads (L4+ BM/RSM/NSM/co-founder L7) lost visibility of all leads and their dashboard charts collapsed. hasCategory check replaced with isFieldSales() at both view-filter sites; assignee validation untouched.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37324&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37324&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 16:28:39 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37323 – Drop irn_attempt_count; IRN transport retry is unbounded  Removes the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Drop irn_attempt_count; IRN transport retry is unbounded&lt;br /&gt;
&lt;br /&gt;
Removes the attempt counter added in r37322 along with its pending ALTER TABLE, so the&lt;br /&gt;
change no longer carries a schema dependency.&lt;br /&gt;
&lt;br /&gt;
NIC outages resolve within the day, and an invoice legally requires an IRN, so capping&lt;br /&gt;
the retry would not remove the obligation — it would only stop trying. Transport failures&lt;br /&gt;
now stay queued (irn_generated NULL) until the provider recovers; only a genuine rejection&lt;br /&gt;
from NIC is terminal. The failure reason is still recorded in irn_error_message, which&lt;br /&gt;
distinguishes a requeued transport failure from an invoice never yet attempted.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/transaction/EInvoiceDetails.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/InvoiceService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37323&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37323&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 15:45:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37322 – Stop treating IRN transport timeouts as terminal; isolate NIC calls ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Stop treating IRN transport timeouts as terminal; isolate NIC calls from batch transaction&lt;br /&gt;
&lt;br /&gt;
A read timeout to GSTPro/NIC was recorded as a final verdict (irn_generated=false),&lt;br /&gt;
so 79 invoices billed on 2026-08-17 were left permanently without an IRN even though&lt;br /&gt;
NIC may well have filed them. A timeout means the call never completed, not that the&lt;br /&gt;
document was rejected.&lt;br /&gt;
&lt;br /&gt;
- markEInvoiceFailed -&gt; recordIrnFailure(invoiceNumber, Throwable): transport failures&lt;br /&gt;
  leave irn_generated NULL so the cron retries (DUPIRN recovers anything NIC did file);&lt;br /&gt;
  only a genuine rejection is terminal. Alert email now fires only when terminal.&lt;br /&gt;
- New einvoice_details.irn_attempt_count bounds that retry at 10 attempts, reset on&lt;br /&gt;
  success, so a prolonged NIC outage still converges instead of looping forever.&lt;br /&gt;
  Requires the matching ALTER TABLE before deploy.&lt;br /&gt;
- New saveInvoiceInNewTransaction(invoiceNumber): REQUIRES_NEW per invoice, reloading&lt;br /&gt;
  orders inside it. RunOnceTasks has class-level @Transactional wrapping the whole&lt;br /&gt;
  batch loop, so every NIC call previously ran inside one transaction holding write&lt;br /&gt;
  locks on all orders in the batch; at 60s per call that window is unacceptable.&lt;br /&gt;
  updateIrnsToInvoices and regenerateBilledInvoices now carry only invoice numbers,&lt;br /&gt;
  keeping the batch transaction read-only.&lt;br /&gt;
- Route all NIC calls (IRN gen, auth, cancel, EWB) through the 60s regulator profile&lt;br /&gt;
  via GstProAuthService.nicRestClient(). getGstDetails stays on the 10s default since&lt;br /&gt;
  it runs on request threads.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/transaction/EInvoiceDetails.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProAuthService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/InvoiceService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37322&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37322&amp;peg=37337</guid></item>
<item><pubDate>Mon, 17 Aug 2026 15:45:29 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37321 – Preserve transport-failure cause in RestClient; add 60s regulator timeout profile ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Preserve transport-failure cause in RestClient; add 60s regulator timeout profile&lt;br /&gt;
&lt;br /&gt;
RestClient wrapped IOException/ClientProtocolException into RuntimeException(GE_1006)&lt;br /&gt;
without a cause, so callers could not tell a read timeout apart from a business&lt;br /&gt;
rejection. Pass the original exception as the cause at all four transport catch sites;&lt;br /&gt;
message text is unchanged.&lt;br /&gt;
&lt;br /&gt;
Add HttpClientFactory.slowRegulatorRequestConfig() (60s socket) for NIC e-invoice/EWB&lt;br /&gt;
calls, which routinely exceed the global 10s default at peak, plus a RestClient&lt;br /&gt;
constructor taking an explicit RequestConfig. The global default is unchanged.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/web/client/HttpClientFactory.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/web/client/RestClient.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37321&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37321&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 18:57:35 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37320 – one assist ew at 99 up to 20k</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;one assist ew at 99 up to 20k&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/resources/oneassistplans.xlsx&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37320&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37320&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 18:17:18 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37319 – Fix partner-performance tertiary: aggregate order items (qty*mop), not the POS-typed ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix partner-performance tertiary: aggregate order items (qty*mop), not the POS-typed order header&lt;br /&gt;
&lt;br /&gt;
The tertiary panel summed fofo_order.total_amount - a price typed at the partner POS&lt;br /&gt;
and never validated against the catalogue - and attributed each whole order to its&lt;br /&gt;
first line item&apos;s brand via .get(0). One mistyped digit inflated reported sell-out&lt;br /&gt;
10x, and mixed-brand orders booked 100% to the first brand, leaving the rest at zero.&lt;br /&gt;
Defect dates from r32000/r32034 (May 2023); the panel was the only tertiary consumer&lt;br /&gt;
diverging from the qty*mop basis.&lt;br /&gt;
&lt;br /&gt;
- New FofoOrder.selectMonthlyBrandTertiary: sum(quantity*mop) grouped by&lt;br /&gt;
  (year*100+month) and item brand - the same basis selectPartnerTertiarySales&lt;br /&gt;
  already uses for the DSR and the partner tier calculation&lt;br /&gt;
- PerformanceController: replaces two entity-loading queries (every FofoOrder and&lt;br /&gt;
  FofoOrderItem for 6 months) with one aggregate; all items now count, each under&lt;br /&gt;
  its own brand&lt;br /&gt;
- Month labels unchanged - toMonthLabel rebuilds the MMM&apos;&apos;uu key, template untouched&lt;br /&gt;
- Remove V2FofoPerformanceController, the /v2/fofo JSON copy carrying the same defect&lt;br /&gt;
&lt;br /&gt;
Verified against dev DB for fofo_id 175139501: Jul 2026 now 16,94,939 (panel&lt;br /&gt;
previously showed 50,92,440); all six months match the qty*mop basis.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/fofo/FofoOrder.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/MonthlyBrandTertiaryModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOrderRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOrderRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/PerformanceController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoPerformanceController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37319&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37319&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 16:04:50 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37318 – v2 version some fixes</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;v2 version some fixes&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/OrderController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37318&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37318&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 15:53:27 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37317 – Active Scratch Offers</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Active Scratch Offers&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/ScratchOffer.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37317&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37317&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 15:47:53 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37316 – Active Scratch Offers</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Active Scratch Offers&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/ScratchOffer.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37316&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37316&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 15:41:05 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37315 – Active Scratch Offers</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Active Scratch Offers&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/ScratchOfferRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37315&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37315&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 13:22:06 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37314 – Fixed max limit to 15 lac for Credit limit</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fixed max limit to 15 lac for Credit limit&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37314&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37314&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 12:09:49 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37313 – v2 version some fixes</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;v2 version some fixes&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoOrderController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37313&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37313&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 12:09:11 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37312 – one assist ew at 99 up to 20k</title><description>&lt;div&gt;&lt;strong&gt;ranu – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;one assist ew at 99 up to 20k&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/ScratchService.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OrderController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37312&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37312&amp;peg=37337</guid></item>
<item><pubDate>Fri, 14 Aug 2026 00:45:30 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37311 – Scratch Offers code modify</title><description>&lt;div&gt;&lt;strong&gt;vikas – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Scratch Offers code modify&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/ScratchService.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/bootstrap-multiselect.js&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37311&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37311&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 20:53:52 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37310 – Scratch Offers now selects only active partners</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Scratch Offers now selects only active partners&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/scratch/ScratchController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37310&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37310&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 18:48:00 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37309 – Scratch Offers now selects only active partners</title><description>&lt;div&gt;&lt;strong&gt;vikas – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Scratch Offers now selects only active partners&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/auth/LocationTrackingRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/auth/LocationTrackingRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/scratch/ScratchController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37309&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37309&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 18:29:56 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37308 – DN receipt: reject on condition mismatch instead of silently reclassifying ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;DN receipt: reject on condition mismatch instead of silently reclassifying&lt;br /&gt;
&lt;br /&gt;
The receive screen defaulted the Condition dropdown to GOOD and receiveDebitNoteItems&lt;br /&gt;
overwrote purchase_return_item.type with whatever was submitted. A DOA return received&lt;br /&gt;
without touching the dropdown was rewritten BAD-&gt;GOOD, so on reject -&gt; acknowledge the&lt;br /&gt;
restoreInventory branch put the unit back into good (sellable) stock instead of bad.&lt;br /&gt;
UKHD948/57: IMEI 353243710802439 was declared DOA, rejected as &apos;wrong entry&apos;, restored&lt;br /&gt;
as good stock and resold at MOP 3h44m later.&lt;br /&gt;
&lt;br /&gt;
- receiveDebitNoteItems now compares each submitted condition against the stored one and&lt;br /&gt;
  rejects the WHOLE debit note on any mismatch (PRO + rejectReturn are both per-DN and&lt;br /&gt;
  there is no model for a partial receipt). PRO is still persisted so the receipt attempt&lt;br /&gt;
  stays on record, then stamped rejected; no scans, no refund, no IRN work.&lt;br /&gt;
- Removed the pri.setReturnType(rt) overwrite. Past the gate the submitted condition always&lt;br /&gt;
  equals the stored one, and applyReceipt already reads it off the entity. Rejected returns&lt;br /&gt;
  now keep the declared type, so restoreReturnedItems restores to the right bucket.&lt;br /&gt;
- New notifyReturnRejectedConditionMismatch: to partner, cc Logistics L2/L3, RBM L1/L2 and&lt;br /&gt;
  Sales L1 + first populated level in L2..L4. Sales ladder is sparse (L2 262 partners,&lt;br /&gt;
  L3 64, L4 1582 of 1524 open stores) so a fixed L2/L3 rule resolves to nobody for most.&lt;br /&gt;
- getTeamEmails now filters inactive users and dedupes. csService.getAuthUserByCategoryId&lt;br /&gt;
  (2-arg) does not filter active unlike its 1-arg sibling; fixed here rather than in&lt;br /&gt;
  CsServiceImpl because that overload has ~25 other call sites where dropping inactive&lt;br /&gt;
  users would change report scoping.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnNotificationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnNotificationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37308&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37308&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 18:04:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37307 – Block activation of item-less schemes (SELLIN/SELLOUT/SPECIAL_SUPPORT): validateSchemeHasItems guards activeSchemeById and ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Block activation of item-less schemes (SELLIN/SELLOUT/SPECIAL_SUPPORT): validateSchemeHasItems guards activeSchemeById and activeSchemeByIds, fixes /todayOfferList NPE caused by scheme 7877&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/scheme/SchemeServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37307&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37307&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 18:04:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37306 – Block activation of item-less SELLIN/SELLOUT/SPECIAL_SUPPORT schemes: add SCHM_1009 response code</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Block activation of item-less SELLIN/SELLOUT/SPECIAL_SUPPORT schemes: add SCHM_1009 response code&lt;/div&gt;~ /trunk/profitmandi-common/src/main/resources/response-codes.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37306&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37306&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 17:44:34 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37305 – carry bag for silver at 1</title><description>&lt;div&gt;&lt;strong&gt;ranu – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;carry bag for silver at 1&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2CartController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37305&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37305&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 17:39:13 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37304 – v2 version some fixes</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;v2 version some fixes&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2CartController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37304&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37304&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 15:52:50 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37303 – one assist ew at 99 up to 20k</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;one assist ew at 99 up to 20k&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/ScratchService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37303&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37303&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 13:55:10 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37302 – Split refurbished (margin scheme) items into their own order at ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Split refurbished (margin scheme) items into their own order at placement&lt;br /&gt;
&lt;br /&gt;
Refurbished lines are invoiced on the RF- series, but only the partner checkout path&lt;br /&gt;
split them out. Internal POs and bulk orders raised a single mixed transaction, which&lt;br /&gt;
billed as one invoice on whichever series its first line happened to resolve to&lt;br /&gt;
(NSPJB2757, NSPJB3212, NSUPDL3898/3899/4365/4366).&lt;br /&gt;
&lt;br /&gt;
- PurchaseOrderServiceImpl: split a mixed internal PO into a regular PO and a margin&lt;br /&gt;
  scheme PO, each with its own PO number, PDF and internal transaction. External vendor&lt;br /&gt;
  POs raise no transaction, so they are left intact.&lt;br /&gt;
- BulkOrderService: raise one transaction per billing group, each with its own loan&lt;br /&gt;
  sized to the wallet balance left to it. Pricing, combo, credit availability and the&lt;br /&gt;
  first-PO gates still validate the order as a whole, so a split first PO cannot block&lt;br /&gt;
  its own second half.&lt;br /&gt;
- TransactionServiceImpl: drop the float narrowing of walletUsed in&lt;br /&gt;
  createTransactionForCartLines - the field is a double and the cart total is validated&lt;br /&gt;
  within 0.001, so any total carrying paise was rejected.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/order/BulkOrderService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37302&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37302&amp;peg=37337</guid></item>
<item><pubDate>Thu, 13 Aug 2026 13:34:58 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37301 – one assist ew at 99 up to 20k</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;one assist ew at 99 up to 20k&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/ScratchService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37301&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37301&amp;peg=37337</guid></item>
<item><pubDate>Wed, 12 Aug 2026 23:56:14 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37300 – one assist ew at 99 up to 20k</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;one assist ew at 99 up to 20k&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/oneassist/OneAssistService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37300&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37300&amp;peg=37337</guid></item>
<item><pubDate>Wed, 12 Aug 2026 23:32:17 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37299 – scratch offer live</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;scratch offer live&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/ScratchService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37299&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37299&amp;peg=37337</guid></item>
<item><pubDate>Wed, 12 Aug 2026 22:10:01 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37298 – Default subCategoryId to 0 on endpoints that declare it required=false ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Default subCategoryId to 0 on endpoints that declare it required=false&lt;br /&gt;
&lt;br /&gt;
subCategoryId is a primitive int, so a required=false declaration with no&lt;br /&gt;
defaultValue makes Spring throw when the param is omitted:&lt;br /&gt;
&lt;br /&gt;
  Optional int parameter &apos;subCategoryId&apos; is present but cannot be translated&lt;br /&gt;
  into a null value due to being declared as a primitive type.&lt;br /&gt;
&lt;br /&gt;
v1 DealsController and GuestController already default it to 0; their v2&lt;br /&gt;
wrappers dropped that, and StoreController never had it on either version. Any&lt;br /&gt;
caller omitting the param got a 500 with a message that does not name the&lt;br /&gt;
parameter at fault.&lt;br /&gt;
&lt;br /&gt;
Adding the default only removes that failure path — every currently working&lt;br /&gt;
caller already sends a value, so no existing behaviour changes.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/StoreController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2DealsController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2GuestController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2StoreController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37298&amp;peg=37337</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37298&amp;peg=37337</guid></item>
</channel></rss>