<?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/scheduled/</title><description>WebSVN RSS feed &#x2013; SmartDukaan</description><lastBuildDate>Thu, 08 Oct 2026 12:52:43 +0530</lastBuildDate><generator>WebSVN 2.8.6-DEV</generator><language>en</language><link>https://svn.smartdukaan.com/log.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;max=40&amp;</link><atom:link href="https://svn.smartdukaan.com/rss.php?isdir=1&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Mon, 05 Oct 2026 18:48:42 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37848 – feat(warehouse): daily 10:00 mail of stock in suspended/inactive warehouses (--sendSuspendedWarehouseStockAlert ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): daily 10:00 mail of stock in suspended/inactive warehouses (--sendSuspendedWarehouseStockAlert for a one-off); Shopify sync warehouse from shopify.warehouseId (default 13372 HR-NSSPL/UPW) instead of WAREHOUSE_NAME_MAP UP-WEST/NOIDA&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37848</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37848</guid></item>
<item><pubDate>Tue, 29 Sep 2026 18:53:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37814 – revert(samsung-rebilling): drop TODO, keep ritesh.chauhan1 on the mail  Removes ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;revert(samsung-rebilling): drop TODO, keep ritesh.chauhan1 on the mail&lt;br /&gt;
&lt;br /&gt;
Removes the TODO(amit.gupta) comment added in r37812. The only change left from&lt;br /&gt;
r37812 is ritesh.chauhan1 on To alongside kamini.sharma; tarun.verma stays on CC.&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37814</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37814</guid></item>
<item><pubDate>Tue, 29 Sep 2026 16:26:42 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37812 – fix(samsung-rebilling): send rebilling mail to kamini.sharma and ritesh.chauhan1  praveen.sharma ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(samsung-rebilling): send rebilling mail to kamini.sharma and ritesh.chauhan1&lt;br /&gt;
&lt;br /&gt;
praveen.sharma was dropped in r37631 (inactive auth user); ritesh.chauhan1 now joins&lt;br /&gt;
kamini.sharma on To, tarun.verma stays on CC. TODO(amit.gupta) records the open&lt;br /&gt;
points: recipients cannot open Manage PCM (menu 208 is Financial Services L1/L2),&lt;br /&gt;
and the CSV omits the invoice and PCM dates the query already returns.&lt;br /&gt;
&lt;br /&gt;
Requires profitmandi-dao r37811 (missing-PCM rows); deploy dao and cron together.&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37812</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37812</guid></item>
<item><pubDate>Sun, 27 Sep 2026 15:44:19 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37788 – activation: stop a broken JVM from spending the day&apos;s imei ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;activation: stop a broken JVM from spending the day&apos;s imei pool, and take the&lt;br /&gt;
selenium atom read out of the nested jar&lt;br /&gt;
&lt;br /&gt;
Oppo/Realme activation collapsed on 21-22 Sep. Every WebDriver command failed with&lt;br /&gt;
java.util.zip.ZipException reading a Selenium JS atom:&lt;br /&gt;
&lt;br /&gt;
  W3CHttpCommandCodec.amendParameters:227 -&gt; executeAtom:397&lt;br /&gt;
  -&gt; com.google.common.io.Resources.toString&lt;br /&gt;
  -&gt; org.springframework.boot.loader.jar.ZipInflaterInputStream.read -&gt; ZipException&lt;br /&gt;
&lt;br /&gt;
Scale, from fofo.activated_imei: a ~30-50 errors/day baseline became 17,508 on 21-Sep&lt;br /&gt;
and 27,768 on 22-Sep. On 22-Sep it touched 3,920 realme imeis for 0 dates and 4,824&lt;br /&gt;
oppo for 96, against a normal 76-100% hit rate. Realme burned its entire day pool by&lt;br /&gt;
11:07 and then correctly went quiet, having answered nothing.&lt;br /&gt;
&lt;br /&gt;
TWO INDEPENDENT FAULTS, one fixed each way.&lt;br /&gt;
&lt;br /&gt;
1. The pool was spent on an outage. restUnanswered stamps every unanswered imei so the&lt;br /&gt;
20-second tick advances instead of re-handing the same rows -- correct for a per-imei&lt;br /&gt;
failure, catastrophic for a systemic one, because a stamped row does not come back&lt;br /&gt;
until its rest expires. So a JVM that cannot read a jar quietly consumed a day of&lt;br /&gt;
payout data. Now: if NOTHING in the chunk was answered and the chunk had more than one&lt;br /&gt;
imei, that is infrastructure rather than a verdict, and nothing is stamped. Cost is a&lt;br /&gt;
re-ask of the same chunk next tick -- loud and self-limiting -- instead of the day.&lt;br /&gt;
Same class of bug as the carlcare transient refusal (r37537): far-end/our-end noise&lt;br /&gt;
must never be recorded as an answer.&lt;br /&gt;
&lt;br /&gt;
2. The read itself. Selenium loads its atoms as classpath RESOURCES on essentially&lt;br /&gt;
every command, which inside a fat jar is a nested-jar read on the Spring Boot 2.0.2&lt;br /&gt;
(2018) loader. Three different inflater errors appeared on prod -- &quot;invalid stored&lt;br /&gt;
block lengths&quot;, &quot;invalid distance too far back&quot;, &quot;invalid code lengths set&quot; -- on a jar&lt;br /&gt;
whose outer AND extracted nested archives both pass `unzip -t`. Intact bytes with three&lt;br /&gt;
distinct inflater failures is a reader fault, not a file fault. bootJar now sets&lt;br /&gt;
requiresUnpack for selenium-remote-driver, so it is extracted to a real file at launch&lt;br /&gt;
and the atom read never touches the nested reader. Verified in the built jar: the entry&lt;br /&gt;
carries UNPACK:&amp;lt;sha1&gt; and is STORED rather than DEFLATED.&lt;br /&gt;
&lt;br /&gt;
TRAPS WORTH RECORDING.&lt;br /&gt;
&lt;br /&gt;
- A restart is NOT a diagnosis here. It was restarted 13:16 on 22-Sep and still failed&lt;br /&gt;
  for three more hours at ~1,260/hour, then a 16:36 restart came up clean -- same jar,&lt;br /&gt;
  mtime unchanged. Anyone reading &quot;restart fixed it&quot; should distrust it.&lt;br /&gt;
- Concurrency alone does not explain it: up to 2 scheduler pools ran these tasks per&lt;br /&gt;
  minute in the broken window AND in the healthy one.&lt;br /&gt;
- The GlitchTip board under-reported this badly (#1495 lastSeen 17-Sep while the log&lt;br /&gt;
  held thousands on 21-22 Sep), so the board is not a reliable outage signal for cron.&lt;br /&gt;
  Judge this lane on dates written in fofo.activated_imei, not on issue counts.&lt;br /&gt;
- Deploy the cron jar stop -&gt; replace -&gt; start. The jar on disk was overwritten in place&lt;br /&gt;
  at 12:31 on 21-Sep while a JVM held it open, which is how this started.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/OppoImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/RealmeImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37788</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37788</guid></item>
<item><pubDate>Thu, 24 Sep 2026 18:54:35 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37771 – fix(movement): movement POs no longer auto-close; open movement PO digest ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(movement): movement POs no longer auto-close; open movement PO digest to Warehouse L1/L2 at 09:00 and 17:00&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/purchaseorder/POScheduler.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37771</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37771</guid></item>
<item><pubDate>Wed, 23 Sep 2026 19:16:30 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37751 – aging po approval mail to some collected users</title><description>&lt;div&gt;&lt;strong&gt;ranu – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;aging po approval mail to some collected users&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PoStockApprovalDigestServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37751</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37751</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:33:58 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37735 – Remove dead third-party integrations: cron  - Toffee: attachToffeeInvoices (schedule ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: cron&lt;br /&gt;
&lt;br /&gt;
- Toffee: attachToffeeInvoices (schedule already commented out), toffeeRollback&lt;br /&gt;
  and the --tc option; tofee.* keys in run.properties&lt;br /&gt;
- Bharti Assist: sendBAGPendingPolicies, testBag/mapBag and the --bag /&lt;br /&gt;
  --mapbag options&lt;br /&gt;
- HyperTrack geofence one-offs (--createGeofence, --getAllGeofences,&lt;br /&gt;
  --deleteGeofences) and their hardcoded account keys&lt;br /&gt;
- SmartPing injection in ScheduledTasks; leftover DTDC comment&lt;br /&gt;
- aramex.tracking.url in run.properties&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/resources/META-INF/run.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37735</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:31:43 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37729 – lead: one workable lead per mobile, with a 6-month supersede ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 13 file(s) modified&lt;/strong&gt;&lt;br/&gt;lead: one workable lead per mobile, with a 6-month supersede and an L2+ override&lt;br /&gt;
&lt;br /&gt;
There was no choke point for lead creation. Ten sites did `new Lead()` across four&lt;br /&gt;
modules -- three in web&apos;s LeadController, two in V2FofoLeadController, three in fofo&apos;s&lt;br /&gt;
LeadController, one in TrialServiceImpl and one in the cron LeadSyncRunner -- and only&lt;br /&gt;
ONE of them (fofo /createLead) checked for an existing lead at all. Result on live data:&lt;br /&gt;
5,137 mobiles carrying duplicate leads over 12,156 rows, worst case 29 on one number,&lt;br /&gt;
and two agents unknowingly working the same shop.&lt;br /&gt;
&lt;br /&gt;
THE RULE, in new LeadCreationService, which all ten now route through:&lt;br /&gt;
&lt;br /&gt;
  no active lead on the number      -&gt; create&lt;br /&gt;
  active, last activity &gt;= 6 months -&gt; retire the old one, create the new one, SILENTLY&lt;br /&gt;
  active, last activity &amp;lt;  6 months -&gt; BLOCK; only an L2+ user may override&lt;br /&gt;
&lt;br /&gt;
Active = status in (pending, followUp) AND the assignee is still an active auth_user.&lt;br /&gt;
Last activity = GREATEST(lead.updated/created, MAX(lead_activity.created)).&lt;br /&gt;
&lt;br /&gt;
The stale branch is deliberately quiet. A shop enquiring again after six months is a&lt;br /&gt;
handover, not a clash, and mailing on it would train the desk to ignore the alert -- so&lt;br /&gt;
only a genuine collision notifies. Live split: 195 stale against 1,241 fresh, and roughly&lt;br /&gt;
three blocks a month.&lt;br /&gt;
&lt;br /&gt;
WHY &quot;ACTIVE&quot; ALSO MEANS A LIVE OWNER&lt;br /&gt;
&lt;br /&gt;
331 open leads are assigned to 11 DEACTIVATED accounts (157 to &lt;a href=&quot;mailto:sm@smartdukaan.com&quot;&gt;sm@smartdukaan.com&lt;/a&gt; alone,&lt;br /&gt;
whose newest lead is from 2022). Counting them as active would block fresh enquiries&lt;br /&gt;
behind an account nobody can log in to and therefore nobody can close. Requiring a live&lt;br /&gt;
owner defuses all 331 without retiring a single row. Retirement here is only ever&lt;br /&gt;
REACTIVE -- triggered by a new entry on the same number. Nothing runs on a schedule.&lt;br /&gt;
&lt;br /&gt;
ASSUMPTION worth flagging: a superseded lead becomes status=notInterested (stage DROPPED)&lt;br /&gt;
with closure_timestamp and reason &apos;Superseded after 6 months inactivity&apos;, rather than a&lt;br /&gt;
new `expired` status. &quot;Closed&quot; is an explicit allow-list in the UI --&lt;br /&gt;
Arrays.asList(notInterested, finalized) at V2FofoLeadController:150 and fofo&lt;br /&gt;
LeadController:313 -- and there are ~107 references to specific LeadStatus values, so a&lt;br /&gt;
new enum value would make these leads vanish from BOTH the open and closed screens.&lt;br /&gt;
Stage DROPPED keeps the nuance (the shop never said no) and still maps to notInterested&lt;br /&gt;
via LeadStage.toLegacyStatus().&lt;br /&gt;
&lt;br /&gt;
OVERRIDE is L2+ in ANY team, not Call Center only: Sales L1 owns 1,063 of the 1,776 open&lt;br /&gt;
leads, so a Call-Center-only gate would funnel every team&apos;s collisions through three&lt;br /&gt;
people. The MAIL still goes to Call Center L2+, resolved from cs.position at send time&lt;br /&gt;
rather than hardcoded. An override is a TAKEOVER -- it closes the existing lead -- because&lt;br /&gt;
a second live lead is the exact thing the rule exists to prevent.&lt;br /&gt;
&lt;br /&gt;
UNATTENDED CALLERS (cron sync, CSV upload, trial registration, AI intake) have nobody to&lt;br /&gt;
offer an override to, so they use createUnattended: skip the colliding row and mail the&lt;br /&gt;
desk rather than throwing. CSV reports imported/duplicateSkipped/duplicateMobiles back to&lt;br /&gt;
the operator instead of failing the whole file over one number.&lt;br /&gt;
&lt;br /&gt;
ALSO FIXES selectByMobileNumber, which called getSingleResult and therefore threw&lt;br /&gt;
NonUniqueResultException on any mobile with more than one lead -- GlitchTip #99 and #1359,&lt;br /&gt;
both still firing. It now prefers the open lead, then the most recently touched.&lt;br /&gt;
&lt;br /&gt;
NOT INCLUDED, deliberately: no DB unique constraint. 10 mobiles already carry more than&lt;br /&gt;
one open lead and would have to be resolved by hand first, which conflicts with the&lt;br /&gt;
no-auto-retirement rule. The service enforces the invariant going forward.&lt;br /&gt;
&lt;br /&gt;
NEEDS A DBA STEP: user.lead.mobile is unindexed on 37,580 rows, so this check is a full&lt;br /&gt;
scan on every create. Index DDL is in the accompanying note; it has NOT been applied.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CreateRefferalRequest.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepositoryImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateDecision.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateNotifier.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/TrialServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoLeadController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37729</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37729</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:18:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37704 – Reopen a movement PO whose stock arrived late, and stop ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;Reopen a movement PO whose stock arrived late, and stop stranding GRN price corrections&lt;br /&gt;
&lt;br /&gt;
Internal movements auto-close after four days, which fits 99.6% of them - 5,491 of 5,515 receipts&lt;br /&gt;
land inside the window. The remainder leave the PO closed with the stock still in transit and&lt;br /&gt;
nowhere to receive it: 998 internal POs closed during 2026 still holding 21,996 unreceived units.&lt;br /&gt;
&lt;br /&gt;
A closed movement PO can now be reopened from the purchase order list. Reopening stamps&lt;br /&gt;
reopenedAt, and auto-close measures from WarehousePurchaseOrder.getOpenSince() - reopenedAt when&lt;br /&gt;
set, the PO date otherwise - so a reopened PO gets the same fresh window a new one gets instead of&lt;br /&gt;
being closed straight back on the next sweep. Only movements between our own warehouses: an&lt;br /&gt;
external vendor PO that has closed is settled with that vendor, not reopened unilaterally.&lt;br /&gt;
&lt;br /&gt;
Separately, a GRN price correction now checks that the PO it just raised is one the invoice can&lt;br /&gt;
actually be received against. Matching reads POs that are open and approved for the same supplier&lt;br /&gt;
and warehouse dated on or before the invoice; it never looks at the PO being corrected, so what&lt;br /&gt;
matters is that the new PO is receivable. 54 were not - backdated into INIT by the old approval&lt;br /&gt;
gate, hence outside the match - and each stranded silently: original line discarded, GRN completed&lt;br /&gt;
without it, the correction left holding a reservation for stock that had already arrived.&lt;br /&gt;
&lt;br /&gt;
isOpen() names the open set - INIT, READY, PARTIALLY_FULFILLED - that the movement and commitment&lt;br /&gt;
queries already read.&lt;br /&gt;
&lt;br /&gt;
Migration sql/add_po_reopened_at_20260918.sql adds reopenedAt, nullable and additive. It must run&lt;br /&gt;
before this ships: the entity maps the column.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/purchaseorder/POScheduler.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehousePurchaseOrder.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/GrnRequestServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/add_po_reopened_at_20260918.sql&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/warehouse/PurchaseOrderController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37704</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37704</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:53:22 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37684 – Schedule the knowlarity insights pull here instead of in the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Schedule the knowlarity insights pull here instead of in the fofo tomcat&lt;br /&gt;
&lt;br /&gt;
Eight times a day, unchanged times (11:40, 13:40, 15:40, 17:40, 18:40, 19:15,&lt;br /&gt;
20:00, 20:40) so the shape of the day&apos;s data does not move. Calls&lt;br /&gt;
KnowlarityInsightsSyncService (dao r37683).&lt;br /&gt;
&lt;br /&gt;
This lands next to KnowlarityCallMonitorScheduler on purpose: that one owns the&lt;br /&gt;
WebSocket status feed into cs.rbm_break_log, this one owns the periodic KPI pull&lt;br /&gt;
into cs.agent_daily_insight. They are the two halves of the same integration and&lt;br /&gt;
were previously split across two processes for no reason other than history.&lt;br /&gt;
&lt;br /&gt;
What it replaces: the same schedule inside the fofo tomcat, where every run&lt;br /&gt;
started an ~850MB headless chrome on a box that holds a -Xmx8g tomcat and a&lt;br /&gt;
-Xmx2g cron jar on 16GB and has been kernel-OOM-killed twice. A run is now four&lt;br /&gt;
HTTPS calls, ~2-3 seconds.&lt;br /&gt;
&lt;br /&gt;
⚠ Only fires under --spring.profiles.active=scheduled; a one-shot CLI run does&lt;br /&gt;
not start the schedulers.&lt;br /&gt;
&lt;br /&gt;
staging.properties gains the knowlarity block. It had NO knowlarity keys at all,&lt;br /&gt;
which means the WebSocket call monitor has never run there either -- this fixes&lt;br /&gt;
both. Same credentials as prod; there is no separate SR tenant for staging.&lt;br /&gt;
&lt;br /&gt;
Cadence is worth revisiting separately: the 8 slots were chosen when a run cost&lt;br /&gt;
75 seconds and 850MB. At 2 seconds, hourly or every 15 minutes during the&lt;br /&gt;
10:00-21:00 window (matching the call monitor) would be nearly free.&lt;/div&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/knowlarity/KnowlarityInsightsScheduler.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/resources/META-INF/staging.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37684</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37684</guid></item>
<item><pubDate>Thu, 17 Sep 2026 15:26:23 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37677 – price drop and hike fixed</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;price drop and hike fixed&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/b2b/Listing.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37677</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37677</guid></item>
<item><pubDate>Thu, 17 Sep 2026 14:52:14 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37675 – Remove the dead Samsung and Amazon Selenium paths  Both ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove the dead Samsung and Amazon Selenium paths&lt;br /&gt;
&lt;br /&gt;
Both were manual one-shots that nothing runs any more, and each started an&lt;br /&gt;
850MB chrome tree that now has to queue on the browser lane, so they are cost&lt;br /&gt;
without a caller.&lt;br /&gt;
&lt;br /&gt;
Evidence they are dead rather than merely idle:&lt;br /&gt;
 - No crontab entry, no cron.d file and no script references --samsung or&lt;br /&gt;
   --amazonPurchase, and neither flag appears even once in cron.log.&lt;br /&gt;
 - fofo.activated_imei has ZERO Samsung rows written by the cron (auth_id 0) in&lt;br /&gt;
   the last 90 days. All 2,331 Samsung rows in that window are auth_id 307, i.e.&lt;br /&gt;
   the human CSV upload, most recently 16-Sep. The scraper is not what keeps&lt;br /&gt;
   Samsung current; people are.&lt;br /&gt;
 - ScheduledSkeleton.fetchImeiActivation() had already been retired in place --&lt;br /&gt;
   its @Scheduled was commented out with &apos;No longer scheduled&apos;.&lt;br /&gt;
 - RunOnceTasks.amazonPurchase() reads /Users/amit/Downloads/amazon.xlsx, a&lt;br /&gt;
   laptop path that cannot exist on the server.&lt;br /&gt;
&lt;br /&gt;
Removed: SamsungIMEIActivationService, the whole scheduled/amazon package&lt;br /&gt;
(AmazonPurchaseService, OrderSummary, OrderRow, AmazonUser), their RunOnceTasks&lt;br /&gt;
callers and helpers (fetchImeiActivation, amazonPurchase, getOrderSummary,&lt;br /&gt;
parseRow), the two Application CLI blocks and the retired ScheduledSkeleton&lt;br /&gt;
wrapper. The amazon package had no importers outside RunOnceTasks.&lt;br /&gt;
&lt;br /&gt;
Both also leaked a chrome profile dir on every run -- AmazonPurchaseService&lt;br /&gt;
never called quit() at all, and SamsungIMEIActivationService called it outside&lt;br /&gt;
any finally -- so this removes two leak sources rather than fixing them.&lt;br /&gt;
&lt;br /&gt;
Untouched: RunOnceTasks.mailDashboardScreenshots() is a third dead Selenium&lt;br /&gt;
one-shot (also zero invocations) but it mails a report, so it is left for a&lt;br /&gt;
separate decision.&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;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/amazon&lt;br /&gt;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/SamsungIMEIActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37675</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37675</guid></item>
<item><pubDate>Thu, 17 Sep 2026 13:13:07 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37673 – Hold the browser lane around the oppo/realme/motorola drivers  Takes ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Hold the browser lane around the oppo/realme/motorola drivers&lt;br /&gt;
&lt;br /&gt;
Takes BrowserLane (common r37672) before new ChromeDriver and releases it after&lt;br /&gt;
quit() returns -- the 850MB is resident for the whole chunk, not just at&lt;br /&gt;
startup, so bracketing only the constructor would protect nothing.&lt;br /&gt;
&lt;br /&gt;
Five minutes of waiting, then give up and return what we have: the only things&lt;br /&gt;
that can hold the lane that long are the other brand mid-chunk or the knowlarity&lt;br /&gt;
scrape in the fofo tomcat, and giving up costs nothing because an unstamped imei&lt;br /&gt;
stays pending and the lane&apos;s next turn picks it up.&lt;br /&gt;
&lt;br /&gt;
CheckMotorolaWarrantyTask carries a comment saying &apos;do not let this job overlap&lt;br /&gt;
the oppo/realme window&apos; that nothing ever enforced. It is wired here too so it is&lt;br /&gt;
already safe whenever it gets a trigger -- it still has none today.&lt;br /&gt;
&lt;br /&gt;
Note on sizing, since the obvious knob is the wrong one: shrinking CHUNK from 25&lt;br /&gt;
was evaluated and rejected. The idle window is a fixed 20s bolted onto a variable&lt;br /&gt;
work period, so 25-&gt;10 moves the duty cycle only 96% -&gt; 91% while costing 8.4%&lt;br /&gt;
of daily throughput and 2.5x the driver launches. The lever for duty cycle is the&lt;br /&gt;
fixedDelay gap, not the chunk size.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckMotorolaWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckOppoWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckRealmeWarrantyTask.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37673</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37673</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:15:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37658 – Remove Mandii onboarding tasks from cron (r37655)  RunOnceTasks loses ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove Mandii onboarding tasks from cron (r37655)&lt;br /&gt;
&lt;br /&gt;
RunOnceTasks loses mandiiUser/mandiiUsers, their setCreditAccount helper and&lt;br /&gt;
the now-unused encodeFileToBase64Binary, plus the MandiiService autowire -&lt;br /&gt;
133 lines that pushed partner KYC into Mandii and wrote back MANDII credit&lt;br /&gt;
accounts. The matching --mandiiUser / --mandiiUsers CLI options are dropped&lt;br /&gt;
from Application. ScheduledTasks had an unused MandiiService field.&lt;br /&gt;
OnBoardingRelatedSchelduleTask imports follow services.mandii -&gt; services.kyc.&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/OnBoardingRelatedSchelduleTask.java&lt;br /&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37658</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37658</guid></item>
<item><pubDate>Tue, 15 Sep 2026 17:52:54 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37644 – Cron batch infra: count real SUCCESS rows instead of deriving ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;Cron batch infra: count real SUCCESS rows instead of deriving them, add INCOMPLETE status for runs that died mid-loop, stale-batch reaper, admin force-finalize; markItemSuccess joins the work transaction&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/BatchScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/enumuration/transaction/CronBatchStatus.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/CronBatchItemRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/CronBatchItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/CronBatchRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/CronBatchRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/cron/CronBatchService.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/CronBatchAdminController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37644</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37644</guid></item>
<item><pubDate>Tue, 15 Sep 2026 17:39:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37642 – Hot Deal brand: remove the 00:20 window-sync job and its ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Hot Deal brand: remove the 00:20 window-sync job and its CLI flag - no date windows any more&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37642</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37642</guid></item>
<item><pubDate>Tue, 15 Sep 2026 17:23:04 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37636 – refactor(cron): remove vendoritempricing one-offs; log catalog migration listing prices  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;refactor(cron): remove vendoritempricing one-offs; log catalog migration listing prices&lt;br /&gt;
&lt;br /&gt;
- Remove migrateVendorItemPricing (2023 one-off) and its flag; fixOrders no longer reads vendoritempricing&lt;br /&gt;
- CatalogMigration sets listing prices via TagListingPriceService&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/runnables/CatalogMigration.java&lt;br /&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37636</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37636</guid></item>
<item><pubDate>Tue, 15 Sep 2026 13:16:03 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37631 – feat(mail): wire inactive-recipient filter, clean addresses, remove attendance alerts  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(mail): wire inactive-recipient filter, clean addresses, remove attendance alerts&lt;br /&gt;
&lt;br /&gt;
Wire MailRecipientFilter into both mail senders. Remove inactive hardcoded recipients, fix typo addresses, send market-share reminder to tech@. Delete sendAttendanceMorningAlert/EveningAlert, sendMailToHR and their CLI options.&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;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/OnBoardingRelatedSchelduleTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/razorpay/FetchPartnersDisbursementTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasksTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37631</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37631</guid></item>
<item><pubDate>Sat, 12 Sep 2026 14:51:26 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37602 – Remove no-op refreshSnapshotAgeing task; restore originalInventoryItemId backfill call  refreshSnapshotAgeing ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove no-op refreshSnapshotAgeing task; restore originalInventoryItemId backfill call&lt;br /&gt;
&lt;br /&gt;
refreshSnapshotAgeing ran every 30 minutes aggregating warehouse.inventoryItem.rootInvoiceDate,&lt;br /&gt;
a column nothing ever wrote, so its UPDATE ... JOIN matched zero rows on every run and&lt;br /&gt;
currentinventorysnapshot.oldest_invoice_date was never populated on any of 11,686 rows.&lt;br /&gt;
Removed along with the sessionFactory field it was the only consumer of.&lt;br /&gt;
&lt;br /&gt;
Application.java had migrations.migrateWarehouseOriginalInventoryItemId(batchSize) commented&lt;br /&gt;
out while still logging &apos;Starting migration...&apos; and &apos;Migration completed.&apos;, so&lt;br /&gt;
--migrateOriginalInventoryItemId reported success while doing nothing. Restored the call;&lt;br /&gt;
it remains opt-in via the CLI flag and cannot fire on its own.&lt;br /&gt;
&lt;br /&gt;
Requires profitmandi-dao r37601 (entity fields removed).&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/scheduled/ScheduledTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37602</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37602</guid></item>
<item><pubDate>Fri, 11 Sep 2026 19:24:56 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37595 – Move the full partner-limit pass from every 20 minutes to ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Move the full partner-limit pass from every 20 minutes to daily&lt;br /&gt;
&lt;br /&gt;
The 2-minute sweep already recalculates the limit for every partner whose base&lt;br /&gt;
moved, which covers investment and utilisation - the inputs that actually change.&lt;br /&gt;
The full 980-partner rescan only exists for inputs base cannot see: credit risk,&lt;br /&gt;
the SIDBI floor and hard_limit.&lt;br /&gt;
&lt;br /&gt;
Those move on a far slower clock. RISK_DECREASE_DAYS_THRESHOLD is 90 days, and&lt;br /&gt;
transaction.fofo_sidbi_sanction has had no new row since Oct 2024 and no recorded&lt;br /&gt;
settlement. Running the rescan 72 times a day to catch them was 71 wasted passes.&lt;br /&gt;
&lt;br /&gt;
Folded into the existing daily job, after the aged-stock refresh so the limit pass&lt;br /&gt;
sees haircuts for partners whose Apple or demo stock crossed its threshold&lt;br /&gt;
overnight. Leaves two scheduled jobs instead of three.&lt;br /&gt;
&lt;br /&gt;
Limit latency is unaffected - that is the 2-minute sweep&apos;s job and it is unchanged&lt;br /&gt;
(~3 partners per window show a changed base, peak 18). The --updatePartnerLimitWithBatch&lt;br /&gt;
CLI entrypoint is untouched for manual runs.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37595</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37595</guid></item>
<item><pubDate>Fri, 11 Sep 2026 17:30:03 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37589 – Drive credit limits off the investment sweep; stop phantom limit ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Drive credit limits off the investment sweep; stop phantom limit writes&lt;br /&gt;
&lt;br /&gt;
Adds the 2-minute sweep schedule and points the limit recalculation at the&lt;br /&gt;
partners whose base_value actually moved, instead of rescanning all 980 every&lt;br /&gt;
20 minutes. Measured on production: 3 partners change per 2-minute window on&lt;br /&gt;
average, peak 18.&lt;br /&gt;
&lt;br /&gt;
- ScheduledSkeleton: 2-min sweepPartnerInvestment, daily refreshAgedStockDaily&lt;br /&gt;
  at 00:20; the 20-min full pass is kept as a backstop for inputs base does not&lt;br /&gt;
  capture (risk, the SIDBI floor, hard_limit)&lt;br /&gt;
- BatchScheduledTasks.sweepPartnerInvestment: sweep, then limits for changed&lt;br /&gt;
  bases only&lt;br /&gt;
- calculateChangedPartnerLimits(restrictTo) to support that&lt;br /&gt;
- scaleMoney(): round to paise before comparing and storing. The limit comes out&lt;br /&gt;
  of a double multiply, so 65123.7400 round-tripped as 65123.740000000005 and&lt;br /&gt;
  compareTo called it a change. 208 of 230 &apos;changed&apos; partners in one production&lt;br /&gt;
  run differed by under half a paisa, rewriting sd_credit_requirement and&lt;br /&gt;
  dtr.credit_account ~14,000 times a day for identical values and churning the&lt;br /&gt;
  SIDBI mirror. Real changes were never below a rupee, so 2dp cannot suppress one.&lt;br /&gt;
- getFirstBillingDates: one grouped query instead of one per partner&lt;br /&gt;
&lt;br /&gt;
Credit limits for 24 partners will rise on the first sweep after deploy - that is&lt;br /&gt;
the aged-Apple double-deduction correction landing (see r37588), not a defect.&lt;br /&gt;
&lt;br /&gt;
NOTE: cron is a standalone Spring Boot jar; the new schedules only fire once it&lt;br /&gt;
is restarted with --spring.profiles.active=scheduled.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/BatchScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/PartnerLimitHelper.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37589</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37589</guid></item>
<item><pubDate>Thu, 10 Sep 2026 12:05:44 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37569 – fcm: stop holding a row lock on the whole batch ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fcm: stop holding a row lock on the whole batch across every FCM call&lt;br /&gt;
&lt;br /&gt;
sendNotification lived in ScheduledTasks, which carries a class-level @Transactional,&lt;br /&gt;
so one pass was one transaction: it loaded EVERY pending row uncapped, then per row&lt;br /&gt;
made an FCM call over the network and stamped sentTimestamp on the entity. A dirty&lt;br /&gt;
row stays write-locked until commit, so a run held a lock on every notification in&lt;br /&gt;
the batch for the SUM of all the remote waits. Volume is real -- 11,581 sent on&lt;br /&gt;
2026-09-09, 12,036 on 2026-09-05 -- and HttpClientFactory sets a 10s socket timeout,&lt;br /&gt;
so one bad run could hold thousands of locks for minutes.&lt;br /&gt;
&lt;br /&gt;
That is the shape behind a 33 SECOND average InnoDB row-lock wait server-wide&lt;br /&gt;
(Innodb_row_lock_time 63,291s over 15.4 days uptime, max 51,941ms against a 50s&lt;br /&gt;
innodb_lock_wait_timeout -- which is where LockAcquisitionException comes from).&lt;br /&gt;
&lt;br /&gt;
Moved to PushNotificationSendService using the same seam the invoicing pass already&lt;br /&gt;
uses in InvoiceService.updateIrnsToInvoices: one short read transaction to pick up&lt;br /&gt;
the batch and build the payloads, NO transaction across the network call, and one&lt;br /&gt;
REQUIRES_NEW transaction per row to record the outcome. No lock is held while waiting&lt;br /&gt;
on FCM.&lt;br /&gt;
&lt;br /&gt;
It is a separate bean, and reaches its own transactional methods through an injected&lt;br /&gt;
self-reference, because REQUIRES_NEW is applied by a Spring proxy and a plain&lt;br /&gt;
self-invocation would bypass it -- same idiom, for the same reason, as InvoiceService.&lt;br /&gt;
&lt;br /&gt;
Also caps the batch at 500/run (30,000/hour against a 12,000 peak day) using the&lt;br /&gt;
already-present but never-wired selectPendingNotifications(limit); the previous query&lt;br /&gt;
was uncapped, which is what let a campaign burst become one multi-minute transaction.&lt;br /&gt;
Send outcomes are unchanged: 200 stamps now, anything else stamps the 1970 sentinel.&lt;br /&gt;
The HttpClient is now closed, which it previously was not.&lt;/div&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/PushNotificationSendService.java&lt;br /&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37569</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37569</guid></item>
<item><pubDate>Thu, 10 Sep 2026 11:58:19 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37567 – Schedule the catalogue delist daily at 05:30  Runs 30 ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Schedule the catalogue delist daily at 05:30&lt;br /&gt;
&lt;br /&gt;
Runs 30 minutes before the existing 06:00 scheduledPushDataToSolr in the same&lt;br /&gt;
class, so the same morning&apos;s reindex publishes it. A bulk UPDATE fires no&lt;br /&gt;
TagListingChangeListener event, so without that ordering the portal would lag&lt;br /&gt;
until 18:00.&lt;br /&gt;
&lt;br /&gt;
Gated on catalog.autoDelist.enabled with an inline default of true - env profiles&lt;br /&gt;
have no fallback between each other, so a key missing from one profile&apos;s&lt;br /&gt;
properties would otherwise stop the context booting.&lt;br /&gt;
&lt;br /&gt;
Also exposes --delistDeadListings for a manual run, honouring the same flag.&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/scheduled/b2b/Listing.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37567</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37567</guid></item>
<item><pubDate>Thu, 10 Sep 2026 03:00:55 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37565 – IMEI activation: 20s tick lanes for oppo/realme/vivo, idle once the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;IMEI activation: 20s tick lanes for oppo/realme/vivo, idle once the day clears&lt;br /&gt;
&lt;br /&gt;
Replaces the two once-a-day passes with chunk-per-tick lanes. Each tick takes one&lt;br /&gt;
chunk and returns; when a brand&apos;s pool comes back empty its turn is skipped, and&lt;br /&gt;
when everything is clear the ticks do nothing and stay silent until midnight.&lt;br /&gt;
&lt;br /&gt;
- browser lane (StandAlone): one chunk of 25 for one brand every 20s, oppo and&lt;br /&gt;
  realme by turns. Still exactly one ChromeDriver alive at a time.&lt;br /&gt;
- vivo lane: its own tick, chunk of 250. It must not share the browser lane --&lt;br /&gt;
  0.24s an imei against oppo&apos;s 10.2s means it would need ~70 hours behind them&lt;br /&gt;
  for work it does alone in 39 minutes.&lt;br /&gt;
&lt;br /&gt;
The snapshot is gone; the pool query is the cursor. That is what makes a restart&lt;br /&gt;
cost one chunk instead of the day: the 12:03 restart on 09-Sep forfeited ~4,000&lt;br /&gt;
lookups and the whole afternoon, and last_finish had read -1 for three days.&lt;br /&gt;
&lt;br /&gt;
The snapshot existed to stop the re-ask loop (realme, 29-Aug: 4,524 requests&lt;br /&gt;
against 1,004 distinct imeis). That is now closed at the source instead -- oppo,&lt;br /&gt;
realme and motorola stamp every imei they asked about, not just the ones that&lt;br /&gt;
produced a map entry, so a failed lookup rests until tomorrow rather than coming&lt;br /&gt;
back on the next tick. Motorola is fixed pre-emptively; nothing schedules it yet.&lt;br /&gt;
&lt;br /&gt;
Also:&lt;br /&gt;
- secondary and tertiary are merged by turns rather than concatenated. Safe while&lt;br /&gt;
  a pass walked to the end; without that guarantee oppo&apos;s 163 tertiary serials sat&lt;br /&gt;
  behind 3,819 secondary ones and would only be reached on a day that cleared.&lt;br /&gt;
- vivo abandons a tick rather than the chunk when the captcha solver returns no&lt;br /&gt;
  code -- one probe per 20s while it is down instead of 250, and no rows rested&lt;br /&gt;
  over a transient outage.&lt;br /&gt;
- the funnel gauges move from a pass to a day. due is measured on the first tick&lt;br /&gt;
  after midnight, the rest accumulate, and last_finish_epoch becomes a real&lt;br /&gt;
  completion clock. Truncation is detected at the midnight rollover, which is the&lt;br /&gt;
  case that never reaches an end-of-run at all.&lt;br /&gt;
&lt;br /&gt;
This does not create capacity. At the 21s/imei measured on 09-Sep the pool still&lt;br /&gt;
needs ~35 hours and will not clear; it now rolls over visibly instead of silently.&lt;br /&gt;
The lever for that is DAYS=1.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/ImeiActivationGauges.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/MotorolaImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/OppoImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/RealmeImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/VivoImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37565</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37565</guid></item>
<item><pubDate>Fri, 04 Sep 2026 23:19:27 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37537 – carlcare activation: retry a transient failure once before giving up ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;carlcare activation: retry a transient failure once before giving up&lt;br /&gt;
&lt;br /&gt;
One retry after a 1.5s backoff - long enough to clear the far end&apos;s rate window,&lt;br /&gt;
short enough to still fit inside a scheduler tick. A transient network blip was&lt;br /&gt;
otherwise recorded as a hard activation failure for that IMEI.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CarlcareImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37537</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37537</guid></item>
<item><pubDate>Wed, 02 Sep 2026 12:02:19 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37518 – notification scheduler</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;notification scheduler&lt;/div&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/NotificationDispatchScheduler.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37518</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37518</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:09:28 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37499 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;sales target and achievement added cron and flags&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/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/inventory/SalesTargets.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/SalesTargetsRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/SalesTargetsRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/icicilombard/IciciLombardService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37499</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37499</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:17:30 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37485 – carlcare: enable tecno alongside itel  Itel went first because ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;carlcare: enable tecno alongside itel&lt;br /&gt;
&lt;br /&gt;
Itel went first because it is the brand we can CHECK -- the DCR pull independently&lt;br /&gt;
produces itel dates to reconcile against, where tecno has no second source at all.&lt;br /&gt;
That check has passed:&lt;br /&gt;
&lt;br /&gt;
  - a 50-imei read-only trial answered 50/50, no errors, no sign rejections, and&lt;br /&gt;
    agreed with our catalog brand on all 50&lt;br /&gt;
  - 18 of the 50 carried a date, and every one of those 18 fell AFTER our own&lt;br /&gt;
    billing date (3 to 1,111 days, median ~220)&lt;br /&gt;
  - the first live tick after deploy returned the same rate: 16 dates, 32 not-yet-&lt;br /&gt;
    activated, 1 malformed response absorbed by the has(&quot;status&quot;) guard&lt;br /&gt;
&lt;br /&gt;
Tecno is also the reason this class exists. Itel was already served by the DCR pull;&lt;br /&gt;
tecno has been served by nothing since 2024-11-20 and has been manual CSV ever since.&lt;br /&gt;
&lt;br /&gt;
Capacity: ~10,400 itel + ~1,890 tecno pending against 14,400 lookups a day. The&lt;br /&gt;
round-robin splits a tick four ways only while all four queues have work; tecno is&lt;br /&gt;
much the smaller pool, so it is exhausted a few hours in, its queues then come back&lt;br /&gt;
empty and itel gets the full 50 again for the rest of the day. Itel still clears&lt;br /&gt;
daily -- roughly 1,875 + 10,650 = 12,525 itel lookups against a 10,401 pool.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CarlcareImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37485</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37485</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:59:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37482 – carlcare: recover tecno/itel activation dates, and fix trunk broken by ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;carlcare: recover tecno/itel activation dates, and fix trunk broken by r37479&lt;br /&gt;
&lt;br /&gt;
r37479/r37480 swept a working-copy edit to Application.java into the mail commit: trunk&lt;br /&gt;
has called scheduledTasks.checkCarlcareImeiActivation() since then without containing it,&lt;br /&gt;
so profitmandi-cron has not compiled. This adds the rest.&lt;br /&gt;
&lt;br /&gt;
WHAT THIS IS&lt;br /&gt;
&lt;br /&gt;
The tecno feed has been dead since 2024-11-20, when transsion decommissioned the SAP&lt;br /&gt;
OData hosts cms.tecno-mobile.com:8099 / cms.itel-mobile.com:8099. The imwav DCR portal&lt;br /&gt;
recovers itel but has nothing for tecno -- all three tecno logins together expose 17&lt;br /&gt;
imeis over five years, against 31,928 tecno rows in fofo.activated_imei. Everything since&lt;br /&gt;
has been manual CSV via /imei/upload.&lt;br /&gt;
&lt;br /&gt;
Carlcare is transsion&apos;s own after-sales arm, and the warranty-check page on carlcare.in is&lt;br /&gt;
backed by a public per-imei endpoint that answers for tecno, itel and infinix with no&lt;br /&gt;
login, no cookie and no captcha:&lt;br /&gt;
&lt;br /&gt;
  GET ind-mis-carl.shalltry.com/CarlcareClient/electronic-card/check-extended_warranty-web?imei=&lt;br /&gt;
  sign: md5(SALT + imei)&lt;br /&gt;
&lt;br /&gt;
The sign header is mandatory (without it: code 10022 &quot;Sorry, web sign is error&quot;). The salt&lt;br /&gt;
is in the site&apos;s own bundle, _nuxt/085537c.js module 688, along with the base url; re-read&lt;br /&gt;
that bundle if it ever stops working. status 3 = activated and carries activeTime, status&lt;br /&gt;
2 = device known but not activated yet and activeTime is null.&lt;br /&gt;
&lt;br /&gt;
It is also the semantically right source. The DCR portal serves an INVENTORY report and&lt;br /&gt;
the old SAP feed served a TERTIARY SALES report, whereas activeTime is the date the&lt;br /&gt;
handset was actually activated -- which is what fofo.activated_imei is meant to hold and&lt;br /&gt;
what tertiary payout is computed on.&lt;br /&gt;
&lt;br /&gt;
Measured against hadb1 before writing any of this: tecno 355463920708766 -&gt; 2026-08-28 and&lt;br /&gt;
itel 359207322028000 -&gt; 2026-08-30, both exact matches to rows we already had. A read-only&lt;br /&gt;
trial of 50 itel imeis answered 50/50 with no errors and no sign rejections, agreed with&lt;br /&gt;
our catalog brand on all 50, and returned a date for 18 -- every one of those 18 falling&lt;br /&gt;
AFTER our own billing date, 3 to 1,111 days, median ~220.&lt;br /&gt;
&lt;br /&gt;
SHAPE&lt;br /&gt;
&lt;br /&gt;
Pool queries and saveActivation semantics are the vivo ones, so the two read alike, and no&lt;br /&gt;
DAO change was needed: the pending queries are already brand-generic. The far end is far&lt;br /&gt;
cheaper than vivo&apos;s, one signed GET per imei, so there is no captcha service, no cookie&lt;br /&gt;
store, no session seeding and no verdict reporting.&lt;br /&gt;
&lt;br /&gt;
50 imeis every 5 minutes = 14,400 lookups a day against ~10,400 pending itel, so the whole&lt;br /&gt;
pool is covered daily with headroom. The pool reaches back to 2021, so the ticks are&lt;br /&gt;
themselves the backfill of the nov-2024 blackout; there is no one-off to run.&lt;br /&gt;
&lt;br /&gt;
Two things worth knowing before changing it:&lt;br /&gt;
&lt;br /&gt;
- The batch is drawn ROUND-ROBIN across each (brand, channel) queue, not by concatenating&lt;br /&gt;
  them. A full daily pass can concatenate freely because it walks to the end, but a&lt;br /&gt;
  50-at-a-time tick cannot: itel is ~1,550 secondary against ~8,851 tertiary, so the head&lt;br /&gt;
  of a concatenated list is ~31 straight ticks of pure secondary before one tertiary imei&lt;br /&gt;
  is asked about. The first trial batch was 100% secondary for exactly that reason.&lt;br /&gt;
&lt;br /&gt;
- Every outcome stamps the row, failures included. This is the one deliberate departure&lt;br /&gt;
  from vivo, which leaves a failure unrecorded so it retries next pass -- safe there&lt;br /&gt;
  because the next pass is tomorrow. On a 5-minute cadence it is not: an unstamped imei is&lt;br /&gt;
  due again in five minutes, the query keeps handing back the same 50 rows, the batch never&lt;br /&gt;
  advances past them, and the endpoint is asked the same questions twelve times an hour for&lt;br /&gt;
  as long as it keeps failing. See the runaway documented on oppoRealmeImeiActivation.&lt;br /&gt;
&lt;br /&gt;
BRANDS is itel alone to start. That is a rollout order, not a limit of the endpoint: itel&lt;br /&gt;
is the brand we can CHECK, because the DCR pull independently produces itel dates to&lt;br /&gt;
reconcile against, where tecno has nothing. Add &quot;Tecno&quot; once a day&apos;s rows agree. Both feeds&lt;br /&gt;
may write itel meanwhile with no coordination -- the pool query only returns imeis whose&lt;br /&gt;
activationTimestamp is still null, so whatever one fills has left the other&apos;s pool.&lt;br /&gt;
&lt;br /&gt;
Scheduled tick plus a --checkCarlcareImeiActivation flag, both wired.&lt;/div&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CarlcareImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37482</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37482</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:11:26 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37474 – mail: delete the dead SendGrid bean from cron, make the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: delete the dead SendGrid bean from cron, make the authenticated identity primary&lt;br /&gt;
&lt;br /&gt;
The @Primary bean named &apos;mailSender&apos; was SendGrid, so every unqualified&lt;br /&gt;
JavaMailSender injection got it -- and SendGrid rejects with 535, which is what&lt;br /&gt;
was failing 10 report/notification cron jobs (dailyTrackingReport,&lt;br /&gt;
monthlyTargetForPartner, sendFeebackSalesAndRbm and others). 420 occurrences in&lt;br /&gt;
one log.&lt;br /&gt;
&lt;br /&gt;
googleMailSender now answers to both &apos;googleMailSender&apos; and &apos;mailSender&apos; and is&lt;br /&gt;
@Primary, so those injections resolve to a sender that works and whose From is&lt;br /&gt;
rewritten to the authenticated identity. No call site changes.&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/scheduled/MailOutboxScheduler.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37474</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37474</guid></item>
<item><pubDate>Mon, 31 Aug 2026 16:08:03 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37472 – IMEI activation: one snapshotted daily pass per brand, on one ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 12 file(s) modified&lt;/strong&gt;&lt;br/&gt;IMEI activation: one snapshotted daily pass per brand, on one thread, with per-brand metrics&lt;br /&gt;
&lt;br /&gt;
Four @Scheduled jobs every 5 minutes become two daily passes. Oppo and realme&lt;br /&gt;
share one thread and alternate in 25-imei chunks, so exactly one ChromeDriver is&lt;br /&gt;
alive at a time instead of four; vivo keeps its own thread since it is direct&lt;br /&gt;
HTTP and does not contend for a browser.&lt;br /&gt;
&lt;br /&gt;
The pass snapshots its pool before any browser starts and walks that list to the&lt;br /&gt;
end. It never re-queries, and that is the actual fix. A failed lookup never&lt;br /&gt;
reaches dateMap.put, so no row is written, so createTimestamp is not bumped, so&lt;br /&gt;
the imei was eligible again on the next tick five minutes later. Measured 29-Aug:&lt;br /&gt;
realme issued 4,524 requests against 1,004 distinct imeis -- 4.5 asks each, 78%&lt;br /&gt;
of the day&apos;s budget spent re-asking -- while oppo, which rarely fails, sat at&lt;br /&gt;
1.03. More requests hardened the block, which caused more failures. A pass bounds&lt;br /&gt;
that: a failure costs one retry tomorrow, never one in five minutes.&lt;br /&gt;
&lt;br /&gt;
This supersedes the r37447/r37448/r37449 argument about driver count, which was&lt;br /&gt;
about the wrong variable. That argument blamed realme&apos;s collapse on CPU&lt;br /&gt;
contention pushing the captcha render past the element waits. The logs do not&lt;br /&gt;
support it: on 29-Aug oppo took ZERO canvas timeouts across all 24 hours on the&lt;br /&gt;
same box, same six cores, same driver count, same captcha vendor, load average&lt;br /&gt;
0.9 -- including the 15:00-23:00 window in which realme solved nothing at all.&lt;br /&gt;
Realme&apos;s own canvas wait is 15s against oppo&apos;s 8s, so the longer wait is the one&lt;br /&gt;
expiring. What realme&apos;s timeout rate tracks is its own daily request volume, and&lt;br /&gt;
it resets at midnight: 920/day -&gt; 0.3%, 3,467/day -&gt; 28%, 4,524/day -&gt; 75%. That&lt;br /&gt;
is realme.com declining to serve the widget.&lt;br /&gt;
&lt;br /&gt;
DAYS=0 is deliberate and is not an off-by-one: the pool filter is&lt;br /&gt;
createTimestamp &amp;lt; now().atStartOfDay().minusDays(DAYS), so DAYS=1 measures&lt;br /&gt;
against yesterday midnight and silently yields a two-day cadence, which is what&lt;br /&gt;
oppo and realme were running.&lt;br /&gt;
&lt;br /&gt;
Sizing measured on prod for a midnight start: oppo 4,133 and realme 2,118 imeis,&lt;br /&gt;
11.7h + 8.4h = 20.1 hours of a single thread. It fits with no slack; if the&lt;br /&gt;
&apos;pass finished&apos; counts come in short of &apos;pass starting&apos;, the lever is DAYS=1&lt;br /&gt;
rather than a second thread.&lt;br /&gt;
&lt;br /&gt;
Observability: ImeiActivationGauges publishes the funnel per brand on&lt;br /&gt;
/actuator/prometheus, which alloy already scrapes on this host -- due, churned,&lt;br /&gt;
captcha_shown, captcha_solved, answered, dates_found, errors, run_seconds and&lt;br /&gt;
last_finish_epoch. Each stage fails differently and says what broke. Rates are&lt;br /&gt;
left to PromQL. The stage that matters for health is answered: churned&gt;0 with&lt;br /&gt;
answered==0 is precisely the shape of both silent outages this year (oppo wrote&lt;br /&gt;
nothing for a week; the vivo captcha solver was dead for 46 days). dates_found is&lt;br /&gt;
deliberately NOT a health signal -- when the multi-year backlog drained at the&lt;br /&gt;
end of August, yield fell from ~100% to 2-3% on the same day across all three&lt;br /&gt;
brands with nothing broken.&lt;br /&gt;
&lt;br /&gt;
Nagios cleanup: the Nagios server and every NRPE daemon are gone, so&lt;br /&gt;
WriteToPropertiesFile and the commented-out blocks that fed&lt;br /&gt;
nagios-cron.properties are deleted, and NagiosMonitorTasks is renamed&lt;br /&gt;
BalanceMonitorTasks for the transport it actually uses. Noted there that nothing&lt;br /&gt;
calls it -- there is no @Scheduled entry and no other caller -- which is why both&lt;br /&gt;
balance gauges have always read -1.&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/monitored/BalanceGauges.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/BalanceMonitorTasks.java &lt;i&gt;(copied from /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/NagiosMonitorTasks.java@37471)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/ImeiActivationGauges.java&lt;br /&gt;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/NagiosMonitorTasks.java&lt;br /&gt;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/properties/WriteToPropertiesFile.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckOppoWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckRealmeWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/VivoImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37472</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37472</guid></item>
<item><pubDate>Mon, 31 Aug 2026 15:50:16 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37470 – Remove dead Itel/Tecno SAP activation services  Both services call ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead Itel/Tecno SAP activation services&lt;br /&gt;
&lt;br /&gt;
Both services call SAP OData endpoints that Transsion decommissioned on 2024-11-20:&lt;br /&gt;
&lt;br /&gt;
  ItelImeiActivationService  -&gt; cms.itel-mobile.com:8099/.../ZTERTIARY_SALES_REPRT_SRV&lt;br /&gt;
  TecnoImeiActivation        -&gt; cms.tecno-mobile.com:8099/.../ZTERTIARY_SALES_REPRT_SRV&lt;br /&gt;
&lt;br /&gt;
Both hosts now refuse connections outright (verified from the prod app server).&lt;br /&gt;
That decommissioning is what stopped Itel and Tecno activation ingest within the&lt;br /&gt;
same hour on 2024-11-20; everything since has arrived via manual CSV upload.&lt;br /&gt;
Neither service has produced a row in 21 months and neither can again.&lt;br /&gt;
&lt;br /&gt;
Removed:&lt;br /&gt;
  - both service classes&lt;br /&gt;
  - ScheduledTasks.checkItelImeiActivation / .checkTecnoImeiActivation, their&lt;br /&gt;
    @Autowired fields and imports (the only callers)&lt;br /&gt;
  - the --checkItelImeiActivation / --checkTecnoImeiActivation startup args&lt;br /&gt;
&lt;br /&gt;
Unaffected: ItelImeiActivationNewService and checkItelImeiActivationNew, which&lt;br /&gt;
target the current imwav portal and were fixed in r37467.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/itelImeiActivation/ItelImeiActivationService.java&lt;br /&gt;x /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/itelImeiActivation/TecnoImeiActivation.java&lt;br /&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%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37470</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37470</guid></item>
<item><pubDate>Mon, 31 Aug 2026 11:10:07 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37465 – Exclude aged Apple stock from investment when suggesting partner credit ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Exclude aged Apple stock from investment when suggesting partner credit limits&lt;br /&gt;
&lt;br /&gt;
Apple handsets a partner has held more than 30 days from GRN no longer count&lt;br /&gt;
toward the investment that drives the suggested limit. Applied in&lt;br /&gt;
getSuggestedAmount via getCreditableInvestment, covering the SDDIRECT,&lt;br /&gt;
hundred-percent and SIDBI branches. The aged amount is logged alongside each&lt;br /&gt;
limit change so a drop can be traced.&lt;br /&gt;
&lt;br /&gt;
Scoped to the limit calculation only -- getTotalInvestment() is untouched, so&lt;br /&gt;
checkout payment options, the investment-OK gates and partner-facing screens&lt;br /&gt;
see the same stock value as before.&lt;br /&gt;
&lt;br /&gt;
Measured on prod at time of commit: 580 units / ~3.94 Cr across 88 partners.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/PartnerLimitHelper.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37465</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37465</guid></item>
<item><pubDate>Sat, 29 Aug 2026 14:31:10 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37459 – Motorola IMEI activation: secondary + tertiary in one browser session ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Motorola IMEI activation: secondary + tertiary in one browser session&lt;br /&gt;
&lt;br /&gt;
Mirrors the oppo/realme combined jobs. MotorolaImeiActivationService drives&lt;br /&gt;
CheckMotorolaWarrantyTask, with MotorolaChallengeSolver for the challenge.&lt;br /&gt;
&lt;br /&gt;
Cadence comes from the pool query, which defers an imei for `days` after each&lt;br /&gt;
attempt (saveActivation bumps createTimestamp even when no date came back), so&lt;br /&gt;
days=2 retries everything every two days. Pending pool measured 1,534&lt;br /&gt;
(1,182 secondary + 352 tertiary); at ~10-14s/imei, 60 per invocation is about&lt;br /&gt;
12 minutes of driver time and clearing the pool inside 48h needs roughly 26&lt;br /&gt;
invocations, i.e. an OS cron entry every 90 minutes.&lt;br /&gt;
&lt;br /&gt;
Do NOT schedule it inside the oppo/realme window: each driver tree costs&lt;br /&gt;
~850MB and this box has been OOM-killed twice with tomcat the victim, so peak&lt;br /&gt;
concurrent drivers is the number that matters.&lt;/div&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckMotorolaWarrantyTask.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/MotorolaChallengeSolver.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/MotorolaImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37459</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37459</guid></item>
<item><pubDate>Sat, 29 Aug 2026 07:17:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37450 – Oppo: find only the hole, and let a low-contrast hole ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Oppo: find only the hole, and let a low-contrast hole be found at all&lt;br /&gt;
&lt;br /&gt;
60% of oppo attempts never got past detection -- getMatCircles2 returned null and&lt;br /&gt;
the attempt was wasted before any aiming happened. That is a bigger loss than&lt;br /&gt;
everything the scheduling work addressed put together.&lt;br /&gt;
&lt;br /&gt;
Two causes, both visible once real puzzles are captured and looked at.&lt;br /&gt;
&lt;br /&gt;
1. param1 is the Canny HIGH threshold, and it was 100. Edges weaker than that are&lt;br /&gt;
   discarded before circle finding begins. Measured hole-vs-background contrast on&lt;br /&gt;
   four live puzzles: 98, 103, 28, 117. The 28 -- a pale lilac background -- cannot&lt;br /&gt;
   produce an edge at 100, so no circle exists to find. Dropped to 50.&lt;br /&gt;
&lt;br /&gt;
2. It insisted on TWO circles whose radii matched within 3px, and returned null&lt;br /&gt;
   otherwise. So a puzzle where the hole was located perfectly still failed if the&lt;br /&gt;
   ring was missed, or if the two radii differed by 4px.&lt;br /&gt;
&lt;br /&gt;
The second is the sillier one: the ring is a DOM element,&lt;br /&gt;
dx_captcha_basic_sub-slider_, whose exact position aim() already reads via&lt;br /&gt;
pieceCentreX(). Detection was re-finding something known exactly, and then&lt;br /&gt;
throwing away a good hole because it could not confirm it. Now the ring position&lt;br /&gt;
is passed in and hough only has to find one thing.&lt;br /&gt;
&lt;br /&gt;
Lowering param1 without the pairing check would let textured backgrounds (the&lt;br /&gt;
sand images especially) supply spurious circles with nothing to reject them, so&lt;br /&gt;
the candidate is verified as an actual hole: its core must be at least 15&lt;br /&gt;
luminance below the frame mean. Real holes measure 28-117 below, so 15 rejects&lt;br /&gt;
noise with margin.&lt;br /&gt;
&lt;br /&gt;
Validated against live puzzles before committing:&lt;br /&gt;
  ring is at rel 42px on every sample; hole lands at 113-194px, separation&lt;br /&gt;
  71-152px -- so RING_EXCLUSION_PX = 30 never rejects a real hole&lt;br /&gt;
  hole contrast 28-117 against MIN_HOLE_DARKNESS = 15&lt;br /&gt;
&lt;br /&gt;
Not validated locally: the hough call itself. opencv 3.4.2-0 ships no osx/arm64&lt;br /&gt;
native and every JDK on this machine is arm64, so the detection path cannot run&lt;br /&gt;
here. param1 = 50 is reasoned from the measured contrasts, not measured. If the&lt;br /&gt;
detection rate does not move, 40 is the next value to try -- the darkness check is&lt;br /&gt;
what makes going lower safe.&lt;br /&gt;
&lt;br /&gt;
Watch &quot;Detected N circle(s) but all sat on the ring&quot; and &quot;Rejecting circle at Npx&quot;&lt;br /&gt;
in the log: the first means hough found nothing but the ring, the second means the&lt;br /&gt;
darkness check is doing its job.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckOppoWarrantyTask.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37450</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37450</guid></item>
<item><pubDate>Fri, 28 Aug 2026 20:25:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37449 – Realme unmerged too: four selenium jobs, one per pool per ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Realme unmerged too: four selenium jobs, one per pool per brand&lt;br /&gt;
&lt;br /&gt;
r37447 merged secondary and tertiary per brand to halve concurrent drivers.&lt;br /&gt;
r37448 reverted that for oppo, because serialising cost it more per imei than a&lt;br /&gt;
second browser did. This reverts it for realme as well, which ends the merge&lt;br /&gt;
experiment entirely.&lt;br /&gt;
&lt;br /&gt;
What the merge actually cost realme is only visible now that oppo is parallel&lt;br /&gt;
again: realme&apos;s per-imei went 14.2s -&gt; 29s. It did not change behaviour -- it is&lt;br /&gt;
simply competing with oppo&apos;s two browsers for CPU. At 29s its merged ceiling is&lt;br /&gt;
86400/29 = 2,979/day, just under the 3,054/day the daily re-check needs, so no&lt;br /&gt;
batch size could have closed the gap. Two parallel pools restore the ~3,900/day&lt;br /&gt;
it managed historically at four drivers.&lt;br /&gt;
&lt;br /&gt;
Measured before this change (25 min window):&lt;br /&gt;
&lt;br /&gt;
  brand    needed/day   throughput   note&lt;br /&gt;
  Oppo         8,838       7,661     parallel revert worked, +122%&lt;br /&gt;
  Realme       3,054       1,843     merged and CPU-starved&lt;br /&gt;
  Vivo        10,082      16,128     surplus, cannot transfer to another brand&lt;br /&gt;
&lt;br /&gt;
Sizes unchanged: oppo 25 per pool, realme 12 per pool, vivo 50+10.&lt;br /&gt;
&lt;br /&gt;
Honest accounting of the merge: it was my idea, sized on per-brand arithmetic that&lt;br /&gt;
ignored contention between brands, and it is now fully reverted. What survives&lt;br /&gt;
from that line of work is the part that actually paid -- reaping orphaned browsers&lt;br /&gt;
(~1.8GB), the per-brand retry caps, and per-brand maxResults. Peak drivers are&lt;br /&gt;
back to 4, which is where they started.&lt;br /&gt;
&lt;br /&gt;
Watch for contention: four browsers is the configuration that produced the 29s&lt;br /&gt;
figure for realme in the first place, so oppo may slow from its current 19.7s.&lt;br /&gt;
Re-measure both before tuning sizes again.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37449</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37449</guid></item>
<item><pubDate>Fri, 28 Aug 2026 12:08:39 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37448 – Daily re-check for all brands; Oppo back to parallel pools ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Daily re-check for all brands; Oppo back to parallel pools&lt;br /&gt;
&lt;br /&gt;
Two changes.&lt;br /&gt;
&lt;br /&gt;
1. Re-check window 4 days (secondary) and 2 days (tertiary) -&gt; 1 day everywhere.&lt;br /&gt;
   Daily demand becomes the full universe rather than a fraction of it:&lt;br /&gt;
&lt;br /&gt;
     Oppo    4,798 + 4,040 =  8,838/day&lt;br /&gt;
     Vivo    9,407 +   675 = 10,082/day   (doing 15,345 -- fine)&lt;br /&gt;
     Realme  1,973 + 1,081 =  3,054/day&lt;br /&gt;
&lt;br /&gt;
2. Oppo&apos;s two pools run in PARALLEL again, reverting the merge in r37447 for that&lt;br /&gt;
   brand only. Realme stays merged.&lt;br /&gt;
&lt;br /&gt;
   The merge was a straight trade of throughput for memory and oppo could not&lt;br /&gt;
   afford it. Measured over 32 minutes and again over an hour the next morning:&lt;br /&gt;
   3,555 then 3,456/day against 5,280 before merging. Batch cadence settled at a&lt;br /&gt;
   very regular ~15.5 min per cycle, so a 30-imei merged batch takes ~10.5 min =&lt;br /&gt;
   ~21s/imei, against the 10.2s it managed unmerged. At 21s the ceiling is&lt;br /&gt;
   86400/21 = 4,114/day even with zero idle, so no batch size and no shorter&lt;br /&gt;
   fixedDelay could have reached 8,838. Serialising simply costs more per imei&lt;br /&gt;
   here than running two browsers does.&lt;br /&gt;
&lt;br /&gt;
   Realme keeps the merge: it needs 3,054/day and delivers 2,952 merged, so a&lt;br /&gt;
   small size bump covers it without a second browser.&lt;br /&gt;
&lt;br /&gt;
Sizes: oppo 25 per pool (2 jobs in parallel), realme 12+12 merged, vivo 50+10&lt;br /&gt;
unchanged. Vivo has already cleared its entire secondary backlog -- the pool&lt;br /&gt;
reads 0 and both lists come back empty -- which is what the batch of 50 was for.&lt;br /&gt;
&lt;br /&gt;
Cost: oppo goes back to two concurrent drivers, so the fleet is 3 rather than 2,&lt;br /&gt;
roughly +700MB. Acceptable against the ~2GB freed today by reaping orphaned&lt;br /&gt;
browsers and capping retries, but it is the reason realme was left merged.&lt;br /&gt;
&lt;br /&gt;
Sizes are a starting point, not a final answer: oppo&apos;s per-imei time differs&lt;br /&gt;
markedly between merged and parallel modes, so re-measure before tuning further.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/VivoImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37448</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37448</guid></item>
<item><pubDate>Thu, 27 Aug 2026 20:36:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37447 – Selenium: one browser per brand instead of one per pool ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Selenium: one browser per brand instead of one per pool&lt;br /&gt;
&lt;br /&gt;
Oppo and Realme each ran secondary and tertiary as separate @Scheduled jobs, so&lt;br /&gt;
each brand opened two ChromeDrivers at once and the fleet ran four. Each driver&lt;br /&gt;
tree costs roughly 850MB. This box co-hosts a 9.4GB tomcat with ~3GB available&lt;br /&gt;
and has been OOM-killed twice this month -- tomcat was the victim both times, so&lt;br /&gt;
peak concurrency is the thing that matters here.&lt;br /&gt;
&lt;br /&gt;
Combined into one job per brand. Nothing downstream changes: the two pools differ&lt;br /&gt;
only in which named query fills them, and both already funnel into the same&lt;br /&gt;
updateActivationDate -&gt; checkWarranty -&gt; saveActivation path. They are disjoint by&lt;br /&gt;
construction (secondary excludes anything with a FofoLineItem, tertiary is&lt;br /&gt;
FofoLineItem-based); distinct() is insurance, not a fix for a known overlap.&lt;br /&gt;
&lt;br /&gt;
Sizing matters, because merging SERIALISES work that used to run in parallel and&lt;br /&gt;
keeping the old batch sizes would quietly cost throughput. Measured post-cap at&lt;br /&gt;
10.2s/imei (oppo, down from 14.6 after r37445) and 14.2s/imei (realme), solving&lt;br /&gt;
M * 86400 / (300 + M*t):&lt;br /&gt;
&lt;br /&gt;
  oppo    2 parallel jobs x10 = 4,299/day  -&gt;  merged 15+15 = 4,277/day  (parity)&lt;br /&gt;
  realme  2 parallel jobs x10 = 3,910/day  -&gt;  merged 10+10 = 2,959/day  (-24%)&lt;br /&gt;
&lt;br /&gt;
Oppo is sized to hold parity because it is already short of its 4,798/day need.&lt;br /&gt;
Realme is left at 20 -- it needs 2,243/day, so it can absorb the dip in exchange&lt;br /&gt;
for shorter batches and a shorter-lived browser.&lt;br /&gt;
&lt;br /&gt;
What this saves and does not save: total driver-SECONDS are roughly unchanged,&lt;br /&gt;
which is the point of resizing. PEAK concurrent drivers halves from 4 to 2.&lt;br /&gt;
&lt;br /&gt;
Also skips starting a browser at all when both pools come back empty -- currently&lt;br /&gt;
never true, but it costs nothing and a browser launched to do nothing is pure&lt;br /&gt;
waste on this box.&lt;br /&gt;
&lt;br /&gt;
checkOppoImeiStatus/Tertiary and the realme equivalents are left in place for&lt;br /&gt;
manual invocation; they are simply no longer scheduled.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37447</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37447</guid></item>
<item><pubDate>Thu, 27 Aug 2026 20:27:13 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37446 – Per-brand batch sizes, and stop chrome forking a GPU process ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Per-brand batch sizes, and stop chrome forking a GPU process it cannot use&lt;br /&gt;
&lt;br /&gt;
maxResults was hardcoded in the shared repository methods, so Oppo and Vivo were&lt;br /&gt;
forced to the same secondary batch (10) and all three to the same tertiary (10).&lt;br /&gt;
It is now a parameter, set per brand at the call site.&lt;br /&gt;
&lt;br /&gt;
Sizing is arithmetic, from measured IN-BATCH per-imei time. Solving&lt;br /&gt;
M * 86400 / (300 + M*t) = needed/day:&lt;br /&gt;
&lt;br /&gt;
  brand    needed/day   t       M required   set to&lt;br /&gt;
  Vivo         9,407    0.8s        36         50    clears, ~12,700/day&lt;br /&gt;
  Realme       1,973   13.4s        10         10    was 5 = ~1,177/day, short&lt;br /&gt;
  Oppo         4,798   14.6s        88         10    HELD, see below&lt;br /&gt;
&lt;br /&gt;
Correcting an earlier measurement of mine: I reported Vivo at 13.6s per imei and&lt;br /&gt;
concluded its backlog could not be cleared. That averaged across the ~300s idle&lt;br /&gt;
gaps BETWEEN batches. In-batch it is 0.8s -- Vivo is 17x faster than I said, is&lt;br /&gt;
idle ~97% of the time, and 50 clears its pool comfortably. There is no wait in&lt;br /&gt;
the Vivo path; it is simply fast.&lt;br /&gt;
&lt;br /&gt;
Oppo is deliberately NOT raised. At 14.6s it would need M=88, which means&lt;br /&gt;
20-minute batches and near-permanent chrome sessions. But that 14.6s predates the&lt;br /&gt;
retry cap (r37445), which cuts exhausted imeis from 20 attempts to 7 and should&lt;br /&gt;
drop it sharply. Re-measure before sizing Oppo, rather than guessing high on a&lt;br /&gt;
box with 3GB free.&lt;br /&gt;
&lt;br /&gt;
Also: --disable-gpu, --disable-dev-shm-usage, --disable-software-rasterizer on&lt;br /&gt;
both selenium tasks. Headless needs no GPU yet chrome forks a gpu-process per&lt;br /&gt;
browser -- 6 were alive across the fleet, pure overhead. No behaviour change.&lt;br /&gt;
&lt;br /&gt;
Batch size does not raise peak concurrency (fixedDelay means one batch per job at&lt;br /&gt;
a time, so never more than 4 drivers). It raises DUTY CYCLE, which converts&lt;br /&gt;
chrome&apos;s footprint from intermittent to sustained. That matters here: tomcat is&lt;br /&gt;
9.4GB, available is ~3GB, and the two OOM kills this month both took tomcat.&lt;br /&gt;
&lt;br /&gt;
Cron-only deploy. The dao signature change has no callers outside cron.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckOppoWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckRealmeWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/StandAlone.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/VivoImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/ActivatedImeiRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/ActivatedImeiRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37446</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37446</guid></item>
<item><pubDate>Thu, 27 Aug 2026 18:47:45 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37445 – Oppo/Realme: cap captcha retries per tick at 7 and 12, ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Oppo/Realme: cap captcha retries per tick at 7 and 12, measured per brand&lt;br /&gt;
&lt;br /&gt;
Most captcha work goes to imeis that never succeed. Measured over the last&lt;br /&gt;
window: oppo 6,245 attempts for 308 successes, realme 13,842 for 399. The bulk&lt;br /&gt;
is imeis grinding all 20 attempts in one already-refused session and getting&lt;br /&gt;
nothing -- oppo 279 of them, realme 610.&lt;br /&gt;
&lt;br /&gt;
The imei is NOT abandoned. A captcha failure is a technical failure, not an&lt;br /&gt;
answer, so it stays pending and the next tick retries it in ~5 minutes with a&lt;br /&gt;
fresh page and session -- which the data suggests beats continuing in a session&lt;br /&gt;
the widget has refused seven times. This caps grinding, not retrying.&lt;br /&gt;
&lt;br /&gt;
Per-brand caps, because the distributions genuinely differ:&lt;br /&gt;
&lt;br /&gt;
  OPPO cap 7    97.7% of successes kept, 58.4% of work saved (3,648 attempts)&lt;br /&gt;
    Pre-glide, 33% of oppo&apos;s successes came from attempts 8-20 and 20 was the&lt;br /&gt;
    right number. Post-glide (r37440) that is 2%: the drag lands first or second&lt;br /&gt;
    try. cap 5 keeps 95.5%/saves 67.7%, cap 10 keeps 99.0%/saves 44.8%.&lt;br /&gt;
&lt;br /&gt;
  REALME cap 12  96.0% kept, 35.7% saved (4,937 attempts)&lt;br /&gt;
    NOT 7. Realme has no glide, so its successes still spread to attempt 10+ and&lt;br /&gt;
    a cap of 7 would cost it 16.5%. It also burns more than twice oppo&apos;s work, so&lt;br /&gt;
    the gentler cap still saves more in absolute terms.&lt;br /&gt;
&lt;br /&gt;
Combined: 8,585 of 20,087 attempts saved, ~43% less browser work, for ~3% fewer&lt;br /&gt;
successes per tick -- and those imeis come back next tick anyway. Less Chrome&lt;br /&gt;
work matters on this box: it co-hosts a 9.4GB tomcat, has 3.5GB free and has been&lt;br /&gt;
OOM-killed twice this month.&lt;br /&gt;
&lt;br /&gt;
The two caps are independent constants and must not be synced. If glide is ported&lt;br /&gt;
to realme, expect its curve to shift left as oppo&apos;s did and its cap can drop to&lt;br /&gt;
~7 -- but measure it, do not assume it.&lt;br /&gt;
&lt;br /&gt;
Windows are ~2h (oppo&apos;s only ~30 min post-glide), so the right numbers may drift.&lt;br /&gt;
Worth re-reading the attempt histogram after a full day.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckOppoWarrantyTask.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/CheckRealmeWarrantyTask.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37445</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2F&amp;isdir=1&amp;rev=37445</guid></item>
</channel></rss>