<?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; /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/offercircular/FootnoteParser.java</title><description>WebSVN RSS feed &#x2013; SmartDukaan</description><lastBuildDate>Tue, 18 Aug 2026 12:18:20 +0530</lastBuildDate><generator>WebSVN 2.8.6-DEV</generator><language>en</language><link>https://svn.smartdukaan.com/log.php?repname=SmartDukaan&amp;path=%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Foffercircular%2FFootnoteParser.java&amp;max=40&amp;</link><atom:link href="https://svn.smartdukaan.com/rss.php?path=%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Foffercircular%2FFootnoteParser.java&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<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=%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Foffercircular%2FFootnoteParser.java&amp;rev=37330</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Foffercircular%2FFootnoteParser.java&amp;rev=37330</guid></item>
</channel></rss>