<?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/leadsync/LeadSyncRunner.java</title><description>WebSVN RSS feed &#x2013; SmartDukaan</description><lastBuildDate>Wed, 07 Oct 2026 01:50:55 +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%2Fleadsync%2FLeadSyncRunner.java&amp;max=40&amp;</link><atom:link href="https://svn.smartdukaan.com/rss.php?path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<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%2Fleadsync%2FLeadSyncRunner.java&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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=37729</guid></item>
<item><pubDate>Fri, 25 Sep 2020 18:05:28 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27087 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27087</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27087</guid></item>
<item><pubDate>Mon, 21 Sep 2020 15:18:06 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27068 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27068</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27068</guid></item>
<item><pubDate>Thu, 03 Sep 2020 12:49:09 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27015 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27015</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27015</guid></item>
<item><pubDate>Mon, 31 Aug 2020 16:14:47 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27012 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27012</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27012</guid></item>
<item><pubDate>Mon, 31 Aug 2020 15:51:19 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27010 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27010</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27010</guid></item>
<item><pubDate>Mon, 31 Aug 2020 15:50:42 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27009 – </title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27009</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27009</guid></item>
<item><pubDate>Sun, 30 Aug 2020 17:26:37 +0530</pubDate><dc:creator>amit.gupta</dc:creator><title>Rev 27007 – Add DB Sync for leads</title><description>&lt;div&gt;&lt;strong&gt;amit.gupta – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add DB Sync for leads&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/leadsync&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/Item.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/Items.java&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.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%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27007</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F%2Ftrunk%2Fprofitmandi-cron%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsmartdukaan%2Fcron%2Fscheduled%2Fleadsync%2FLeadSyncRunner.java&amp;rev=27007</guid></item>
</channel></rss>