<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SmartDukaan &#x2013; /</title><description>WebSVN RSS feed &#x2013; SmartDukaan</description><lastBuildDate>Tue, 29 Sep 2026 00:24:26 +0530</lastBuildDate><generator>WebSVN 2.8.6-DEV</generator><language>en</language><link>https://svn.smartdukaan.com/log.php?repname=SmartDukaan&amp;path=%2F&amp;max=40&amp;peg=37691</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37691&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Thu, 17 Sep 2026 18:11:39 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37691 – rbm rankijng mail</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm rankijng mail&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/migrations/RunOnceTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37691&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37691&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 18:01:08 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37690 – 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/migrations/RunOnceTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37690&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37690&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 18:00:04 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37689 – 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/migrations/RunOnceTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37689&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37689&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:59:10 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37688 – Record that the counter/privatedealuser rename was applied on hadb1 (suffix ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Record that the counter/privatedealuser rename was applied on hadb1 (suffix _dropped_20260917)&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/resources/sql/retire_counter_privatedealuser_20260916.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37688&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37688&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:59:01 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37687 – rbm ranking mailer</title><description>&lt;div&gt;&lt;strong&gt;ranu – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm ranking mailer&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/migrations/RunOnceTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37687&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37687&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:56:53 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37686 – for rbm ranking mail on month end</title><description>&lt;div&gt;&lt;strong&gt;ranu – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;for rbm ranking mail on month end&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-dao/src/main/java/com/spice/profitmandi/service/monitors&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/monitors/RbmPerformanceRankingService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/monitors/RbmPerformanceRankingServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37686&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37686&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:53:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37685 – Remove selenium from the fofo portal entirely  No browser ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove selenium from the fofo portal entirely&lt;br /&gt;
&lt;br /&gt;
No browser starts in this WAR any more, and the selenium-java and&lt;br /&gt;
webdrivermanager dependencies are gone with it. Verified: no source reference to&lt;br /&gt;
selenium/WebDriver/ChromeDriver anywhere in the module, and zero selenium&lt;br /&gt;
artifacts on the runtime classpath.&lt;br /&gt;
&lt;br /&gt;
Three pieces:&lt;br /&gt;
&lt;br /&gt;
1. The insights schedule and its pull move to profitmandi-cron (r37684) and dao&lt;br /&gt;
   (r37683). This service keeps only the READ paths -- redis, then in-memory,&lt;br /&gt;
   then cs.agent_daily_insight -- plus refreshInsights(), which now asks the dao&lt;br /&gt;
   sync service to run once and re-reads what it wrote. The portal therefore&lt;br /&gt;
   holds no credentials at all: KNOWLARITY_USERNAME/PASSWORD are deleted from&lt;br /&gt;
   this source, along with INSIGHTS_PAGE_URL and the 200-character CSS selector&lt;br /&gt;
   the scrape depended on.&lt;br /&gt;
&lt;br /&gt;
2. KnowlarityScraperService deleted. It was dead, not merely idle: zero&lt;br /&gt;
   references anywhere, both @Scheduled annotations commented out, and its&lt;br /&gt;
   @PostConstruct selenium block commented out with the note &apos;DISABLED - Live&lt;br /&gt;
   status now comes from WebSocket via profitmandi-cron&apos;. SVN backs that up --&lt;br /&gt;
   r36057/r36058 (25-Mar) moved agent status to the websocket and r36072/r36075&lt;br /&gt;
   (26-Mar) created KnowlarityBreakLogService in dao, but nobody removed the&lt;br /&gt;
   corpse. It kept selenium in this WAR for six months after nothing used it.&lt;br /&gt;
   The data agrees: &apos;On Break - &amp;lt;reason&gt;&apos; rows in cs.rbm_break_log stop on&lt;br /&gt;
   25-27 March and plain &apos;Break&apos; takes over, which is exactly that handover.&lt;br /&gt;
&lt;br /&gt;
   ⚠ Consequence worth knowing: break-REASON granularity (lunch/meeting/sick)&lt;br /&gt;
   was lost at that migration and is not coming back from the websocket feed.&lt;br /&gt;
&lt;br /&gt;
3. setTokens() and POST /indent/set_knowlarity_tokens removed -- the method had&lt;br /&gt;
   already been reduced to a log line, and the pull now authenticates itself per&lt;br /&gt;
   run. Also retired the orphan knowlarity.scraper.enabled property (nothing read&lt;br /&gt;
   it; it was still &apos;true&apos; in prod), and corrected a stale section header and a&lt;br /&gt;
   doc comment that promised &apos;current tokens&apos; which no longer exist.&lt;br /&gt;
&lt;br /&gt;
Not touched, deliberately: POST update_agent_status / bulk_update_agent_status /&lt;br /&gt;
update_status_by_name still exist and still write cs.rbm_break_log through&lt;br /&gt;
AgentLiveStatusService. They are orphaned -- the deleted scraper was their only&lt;br /&gt;
feeder and no view or script in the deployed WAR calls them -- but they are&lt;br /&gt;
public HTTP surface, so proving there is no INTERNAL caller is not the same as&lt;br /&gt;
proving no external one. Left for a separate decision.&lt;/div&gt;~ /trunk/profitmandi-fofo/build.gradle&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/MonitorController.java&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityApiClient.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityInsightsService.java&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityScraperService.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/dev.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/prod.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37685&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37685&amp;peg=37691</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&amp;isdir=1&amp;rev=37684&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37684&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 17:53:09 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37683 – Move the knowlarity insights pull into dao, and delete the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Move the knowlarity insights pull into dao, and delete the dead earlier attempt&lt;br /&gt;
&lt;br /&gt;
The pull belongs in dao because its SCHEDULE moves to profitmandi-cron while the&lt;br /&gt;
fofo portal still reads the same rows. Both modules depend on dao, so that is the&lt;br /&gt;
only place the two can share it.&lt;br /&gt;
&lt;br /&gt;
KnowlarityInsightsSyncService fetches via KnowlarityApiClient (moved here from&lt;br /&gt;
fofo, unchanged) and upserts cs.agent_daily_insight. No DDL: every column it&lt;br /&gt;
writes already exists.&lt;br /&gt;
&lt;br /&gt;
It writes what the old chrome scrape could not:&lt;br /&gt;
 - the *_seconds columns. Verified on prod over 7 consecutive days, every row had&lt;br /&gt;
   logged_in_seconds, break_seconds, available_seconds and talk_seconds = 0. The&lt;br /&gt;
   API returns fractional seconds as numbers, so they are stored directly rather&lt;br /&gt;
   than re-parsed out of a display string.&lt;br /&gt;
 - calls_answered / missed_calls / total_calls, also 0 on every row, because the&lt;br /&gt;
   scrape never captured them at all.&lt;br /&gt;
&lt;br /&gt;
auth_id resolution keeps the email-PREFIX match from the fofo version: some&lt;br /&gt;
stored emails are truncated (&apos;&lt;a href=&quot;mailto:user@smartdukaan.co&quot;&gt;user@smartdukaan.co&lt;/a&gt;..&apos;), so matching the whole&lt;br /&gt;
address silently misses those agents.&lt;br /&gt;
&lt;br /&gt;
Redis keys are deliberately the same pair the portal reads, so its fast path&lt;br /&gt;
stays warm across the process boundary. ⚠ That makes AgentInsightRow&apos;s getter&lt;br /&gt;
names a contract with fofo&apos;s AgentInsightDTO -- rename one without the other and&lt;br /&gt;
the portal deserialises blanks.&lt;br /&gt;
&lt;br /&gt;
Also deleted, all with zero external references:&lt;br /&gt;
 - KnowlarityAgentInsightsService: an earlier, unfinished run at this same API.&lt;br /&gt;
   Its ALT_INSIGHTS_APIS list of guessed endpoints is the giveaway that it never&lt;br /&gt;
   worked; nothing ever called it. It owned three redis keys nobody read&lt;br /&gt;
   (knowlarity:agent:insights, :summary, :lastUpdate) -- distinct from the live&lt;br /&gt;
   knowlarity:insights:* pair, which stays.&lt;br /&gt;
 - AgentInsightsDTO / AgentInsightsSummaryDTO: used only by that service.&lt;br /&gt;
 - KnowlaritySocketTest: a scratch main(), never referenced.&lt;/div&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/dto/AgentInsightsDTO.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/dto/AgentInsightsSummaryDTO.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/KnowlarityAgentInsightsService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/KnowlarityApiClient.java &lt;i&gt;(copied from /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityApiClient.java@37682)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/KnowlarityInsightsSyncService.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/knowlarity/KnowlaritySocketTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37683&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37683&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 16:40:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37682 – feat(warehouse): auto-approve backdated POs in the creator&apos;s name  A ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): auto-approve backdated POs in the creator&apos;s name&lt;br /&gt;
&lt;br /&gt;
A backdated PO used to be parked in POStatus.INIT until an HOD clicked a mailed approval link. INIT&lt;br /&gt;
keeps a PO out of the PO list, out of GRN/invoice matching and out of the auto-close sweep, so an&lt;br /&gt;
unclicked PO was frozen rather than merely pending - 440 had accumulated since 2024, of 2547 approval&lt;br /&gt;
rows only 2023 were ever clicked.&lt;br /&gt;
&lt;br /&gt;
- every PO now goes READY at creation, backdated or not&lt;br /&gt;
- the warehouse.poapproval row is still written, stamped approvedOn=now and approvedBy=&amp;lt;creator&gt; by&lt;br /&gt;
  recordAutoApproval(), since that row is what identifies a PO as backdated and who backdated it&lt;br /&gt;
- the HOD mail survives as a notification: names the creator, no approval link, PDF still attached&lt;br /&gt;
- /approve-po-date/* endpoints kept so links already sent do not 404&lt;br /&gt;
&lt;br /&gt;
Completes r37679-81. Backfill for the three POs still inside POScheduler&apos;s window is staged at&lt;br /&gt;
profitmandi-dao/src/main/resources/sql/backdated_po_auto_approval_backfill_20260917.sql, not run.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37682&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37682&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 16:29:18 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37681 – feat(warehouse): resolve the logged-in user on V2 PO creation and ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): resolve the logged-in user on V2 PO creation and GRN mismatch resolution&lt;br /&gt;
&lt;br /&gt;
V2 mirror of r37680, keeping the dormant V2 controllers in step with the fofo MVC ones.&lt;br /&gt;
&lt;br /&gt;
- createPurchaseOrder resolves the logged-in user via getEmailId + authRepository and sets createdBy&lt;br /&gt;
- resolvedMismatchRequest passes the resolver through&lt;br /&gt;
&lt;br /&gt;
Pairs with r37679.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoGrnController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoPurchaseOrderController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37681&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37681&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 16:29:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37680 – feat(warehouse): resolve the logged-in user on PO creation and GRN ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): resolve the logged-in user on PO creation and GRN mismatch resolution&lt;br /&gt;
&lt;br /&gt;
Backdated POs are auto-approved in their creator&apos;s name, so the user has to travel with the request.&lt;br /&gt;
&lt;br /&gt;
- createPurchaseOrder resolves the logged-in user via cookiesProcessor + authRepository and sets createdBy&lt;br /&gt;
- resolvedMismatchRequest passes the resolver through, for the correction PO it can raise&lt;br /&gt;
- PO create page no longer says backdated POs need HOD approval&lt;br /&gt;
&lt;br /&gt;
Pairs with r37679.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/GrnController.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/WEB-INF/views/ftl/warehouse-create-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37680&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37680&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 16:29:06 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37679 – feat(warehouse): carry the PO creator through purchase order creation for ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): carry the PO creator through purchase order creation for backdated auto-approval&lt;br /&gt;
&lt;br /&gt;
Backdated POs are to be auto-approved in the name of whoever raised them, but the service had no way&lt;br /&gt;
to know who that was: the model carried no user and buyerId is the seller, not a person.&lt;br /&gt;
&lt;br /&gt;
- CreateWarehousePurchaseOrderModel carries createdBy&lt;br /&gt;
- resolvedMismatchRequest takes resolvedBy, so the correction PO raised on a GRN price mismatch -&lt;br /&gt;
  dated to the supplier invoice and therefore backdated by nature - is credited to whoever resolved it&lt;br /&gt;
- staged backfill SQL for the three backdated POs still stuck in INIT inside POScheduler&apos;s&lt;br /&gt;
  auto-close window; data only, no schema change, not yet run&lt;br /&gt;
&lt;br /&gt;
The release-to-READY change in PurchaseOrderServiceImpl follows separately.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CreateWarehousePurchaseOrderModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/GrnRequestService.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/backdated_po_auto_approval_backfill_20260917.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37679&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37679&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 15:55:49 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37678 – Replace the knowlarity insights chrome scrape with SR&apos;s own JSON ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Replace the knowlarity insights chrome scrape with SR&apos;s own JSON API&lt;br /&gt;
&lt;br /&gt;
Drops the last unattended headless chrome out of the fofo tomcat. The scheduled&lt;br /&gt;
insights job ran 8 times a day and each run started an ~850MB chrome tree inside&lt;br /&gt;
the tomcat JVM&apos;s host -- a box holding -Xmx8g tomcat plus a -Xmx2g cron jar on&lt;br /&gt;
16GB that has been kernel-OOM-killed twice with tomcat the victim.&lt;br /&gt;
&lt;br /&gt;
It was also losing data the whole time. Verified on prod across 7 consecutive&lt;br /&gt;
days: every row of cs.agent_daily_insight has logged_in_seconds, break_seconds,&lt;br /&gt;
available_seconds, talk_seconds, calls_answered, missed_calls and total_calls&lt;br /&gt;
set to 0. Two separate causes, both fixed here:&lt;br /&gt;
&lt;br /&gt;
 - parseTimeToSeconds split on &apos;:&apos; expecting &apos;HH:mm:ss&apos;, but the table renders&lt;br /&gt;
   &apos;2h 50m 39s&apos;. A one-element split fell through to return 0, and because it&lt;br /&gt;
   never reached the NumberFormatException branch it did not even warn. It now&lt;br /&gt;
   parses the h/m/s shape and still accepts HH:mm:ss and HH:mm.&lt;br /&gt;
 - the scrape never captured the call counts at all. The API carries them.&lt;br /&gt;
&lt;br /&gt;
The auth chain is four calls and is not guessable, so it is documented in&lt;br /&gt;
KnowlarityApiClient: POST /vr/sr_login/ establishes the session and returns an&lt;br /&gt;
HS256 token that the API REJECTS; GET /newsr/user_details yields new_sr_ui_url&lt;br /&gt;
carrying a one-shot SSO blob (in a browser this hop is javascript, so it is&lt;br /&gt;
invisible to anything that merely follows redirects); POST /vr/sso_login/&lt;br /&gt;
exchanges that blob for the RS256 token the API accepts, whose claims embed the&lt;br /&gt;
srsessionid and so bind it to the session; GET /newsr/agents_insights/ with&lt;br /&gt;
header jwtAuthorization. Wrong token and wrong header name both answer&lt;br /&gt;
&apos;Invalid token&apos;, so the error never tells you which mistake you made. The window&lt;br /&gt;
parameters are start_time/end_time -- start_date/end_date authenticates fine and&lt;br /&gt;
returns &apos;Error in  API&apos;.&lt;br /&gt;
&lt;br /&gt;
Redirects are followed BY HAND. setInstanceFollowRedirects(true) exposes only&lt;br /&gt;
the final response&apos;s headers, so the Set-Cookie issued on the intermediate hops&lt;br /&gt;
is lost, the session never forms and user_details answers with an HTML error&lt;br /&gt;
page. This cost a debugging cycle; the reason is commented at the call site.&lt;br /&gt;
&lt;br /&gt;
Verified against the live account before committing: 13 agents returned,&lt;br /&gt;
calls_offered == calls_answered + missed_calls holds for all 13, durations match&lt;br /&gt;
the previous scrape to within the elapsed window (~55s), and formatSeconds /&lt;br /&gt;
parseTimeToSeconds round-trip cleanly over the real values.&lt;br /&gt;
&lt;br /&gt;
DTO fields stay the same display strings (&apos;2h 50m 39s&apos;), so every existing&lt;br /&gt;
reader is unaffected; only the previously-zero numeric columns change.&lt;br /&gt;
&lt;br /&gt;
KnowlarityScraperService still uses ChromeDriver for operator-triggered break-log&lt;br /&gt;
scrapes, so the selenium dependency stays for now. Its @Scheduled annotations are&lt;br /&gt;
already commented out, so nothing unattended starts a browser any more.&lt;/div&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityApiClient.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityInsightsService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37678&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37678&amp;peg=37691</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&amp;isdir=1&amp;rev=37677&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37677&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 15:19:50 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37676 – v2 version some fixes</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;v2 version some fixes&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/DealsController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37676&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37676&amp;peg=37691</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&amp;isdir=1&amp;rev=37675&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37675&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 13:13:15 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37674 – Hold the browser lane around the knowlarity scrapes  These ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Hold the browser lane around the knowlarity scrapes&lt;br /&gt;
&lt;br /&gt;
These run Chrome inside the tomcat JVM, on the same box as the cron jar&apos;s&lt;br /&gt;
oppo/realme imei lane, with nothing coordinating the two. isScraping only guards&lt;br /&gt;
this JVM and cannot see the cron&apos;s driver, so the interlock has to be the&lt;br /&gt;
OS-level one -- BrowserLane, common r37672.&lt;br /&gt;
&lt;br /&gt;
Fifteen minutes rather than the cron side&apos;s five: the insights scrape runs only&lt;br /&gt;
8 times a day against a lane that is busy ~96% of the time, so a short timeout&lt;br /&gt;
here would mean the insights never refreshed. On contention it serves cache.&lt;br /&gt;
&lt;br /&gt;
The break-log scraper takes the lane around its freshDriver, which has a clean&lt;br /&gt;
try/finally bracket. setupDriver()&apos;s long-lived field driver is deliberately left&lt;br /&gt;
alone -- its lifetime spans init to @PreDestroy and holding an OS lock that long&lt;br /&gt;
would starve the imei lane.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityInsightsService.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/service/KnowlarityScraperService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37674&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37674&amp;peg=37691</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&amp;isdir=1&amp;rev=37673&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37673&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 13:12:56 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37672 – Add BrowserLane: machine-wide interlock so only one headless Chrome runs ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add BrowserLane: machine-wide interlock so only one headless Chrome runs at a time&lt;br /&gt;
&lt;br /&gt;
Every ChromeDriver tree on the app box costs ~850MB RSS, on a host holding a&lt;br /&gt;
-Xmx8g tomcat and a -Xmx2g cron jar on 16GB that has been kernel-OOM-killed&lt;br /&gt;
twice with tomcat the victim. Peak concurrent drivers is the number that&lt;br /&gt;
matters, not drivers per day.&lt;br /&gt;
&lt;br /&gt;
Measured on the oppo/realme lane: a 25-imei chunk takes 505s (12s driver&lt;br /&gt;
startup, then ~19.7s an imei) against a fixed 20s fixedDelay, i.e. a 96% duty&lt;br /&gt;
cycle. Meanwhile tomcat starts its own driver 8 times a day for the knowlarity&lt;br /&gt;
scrape. On 17-Sep that scrape ran 11:40:00-11:41:07 and the lane&apos;s next driver&lt;br /&gt;
came up at 11:42:21 -- it cleared by 74 seconds, by luck. At a 96% duty cycle&lt;br /&gt;
the collision cannot be dodged by choosing better times, only by serialising.&lt;br /&gt;
&lt;br /&gt;
The two JVMs are separate processes owned by different users, so an in-process&lt;br /&gt;
flag cannot see across the boundary. Uses an OS file lock at&lt;br /&gt;
/var/lock/sd-browser.lock (overridable via -Dsd.browser.lock), created 0666 on&lt;br /&gt;
first use because cron runs as root and tomcat as tomcat and whichever starts&lt;br /&gt;
first creates it. A file lock rather than a marker file so the kernel reclaims&lt;br /&gt;
it when the holder dies: verified by SIGKILLing the holder mid-hold, the next&lt;br /&gt;
JVM acquired in 264ms. A ReentrantLock gates it first, since a second thread in&lt;br /&gt;
the same JVM would otherwise get OverlappingFileLockException rather than block.&lt;br /&gt;
&lt;br /&gt;
Callers wait rather than skip. The knowlarity scrape needs 67s against a lane&lt;br /&gt;
busy 96% of the time, so skip-on-contention would mean it essentially never&lt;br /&gt;
refreshed again. Eight scrapes a day costs the imei lane about nine minutes of&lt;br /&gt;
waiting in total.&lt;br /&gt;
&lt;br /&gt;
Fails open if the lock file is unusable (missing /var/lock, read-only mount, dev&lt;br /&gt;
laptop): serialising within the JVM only, rather than stopping imei activation&lt;br /&gt;
over what is a safety interlock.&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/BrowserLane.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37672&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37672&amp;peg=37691</guid></item>
<item><pubDate>Thu, 17 Sep 2026 11:33:22 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37671 – loi revival process modify</title><description>&lt;div&gt;&lt;strong&gt;ranu – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;loi revival process modify&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/user/StoreTimelineTatServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoiFormController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37671&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37671&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 20:29:46 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37670 – Check GSTIN shape on the onboarding screen before submit (jsVersion ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Check GSTIN shape on the onboarding screen before submit (jsVersion 425)&lt;br /&gt;
&lt;br /&gt;
Both GST boxes are validated client-side and must match, so ops see the problem on the screen&lt;br /&gt;
instead of discovering it when NIC refuses the first invoice. Server-side guard in dao r37669&lt;br /&gt;
is what actually enforces it.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/update-retailer-details.js&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37670&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37670&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 20:29:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37669 – Reject an invalid or mismatched partner GSTIN before it is ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Reject an invalid or mismatched partner GSTIN before it is saved&lt;br /&gt;
&lt;br /&gt;
The onboarding screen carries the GSTIN in two boxes both labelled GST NUMBER - the retailer&lt;br /&gt;
one (dtr.retailer.number) and the store one (fofo_store.gst_number, which billing reads).&lt;br /&gt;
Neither was validated, so DLSH1660 was saved with the LOI&apos;s pincode in the store box while the&lt;br /&gt;
retailer box held the real GSTIN, and its first invoice would have been refused by NIC.&lt;br /&gt;
&lt;br /&gt;
validateGstNumbers runs before any write (covers the fofo portal, the V2 API and the partner&lt;br /&gt;
app, which all funnel through updateRetailerDetails): both values are normalised, both must be&lt;br /&gt;
valid GSTINs, and when both are present they must agree - across 1,800 partners on record they&lt;br /&gt;
already do, bar the one that caused this. Needs common r37668.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/user/RetailerServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37669&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37669&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 20:29:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37668 – Validate GSTIN shape, state code and checksum  isValidGstNumber accepted ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Validate GSTIN shape, state code and checksum&lt;br /&gt;
&lt;br /&gt;
isValidGstNumber accepted any 15-character string, so a pincode (110095, rejected only for&lt;br /&gt;
length) and junk (Hdjiekwbdbsjskz) reached fofo_store.gst_number, which billing sends to NIC&lt;br /&gt;
as the recipient - the invoice is then refused and the goods cannot ship.&lt;br /&gt;
&lt;br /&gt;
Now: 2-digit state code + PAN + entity + Z + mod-36 check digit, trimmed and upper-cased.&lt;br /&gt;
Blank still passes (the field is optional); callers needing one present check that themselves.&lt;br /&gt;
Checked against live data: 1,569 of 1,570 well-formed partner GSTINs pass, the one that fails&lt;br /&gt;
(HRSP330) has a genuinely wrong check digit.&lt;br /&gt;
&lt;br /&gt;
Adds RTLR_1020 / RTLR_1021 for the invalid and mismatched cases.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/StringUtils.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/resources/response-codes.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37668&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37668&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 19:22:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37667 – chore(sql): drop vendor catalog pricing for supplier 1 Hotspot, flagged ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;chore(sql): drop vendor catalog pricing for supplier 1 Hotspot, flagged internal 2026-09-16 (as run on prod; backups _bak_vcp/_vcpl_internal_hotspot_20260916)&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/drop_internal_vendor_catalog_pricing_hotspot_20260916.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37667&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37667&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:56:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37666 – Hot Deal brand: /fofo/hotDeals/brands accepts categoryId, so the brand chips ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Hot Deal brand: /fofo/hotDeals/brands accepts categoryId, so the brand chips match the active tab&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/DealsController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37666&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37666&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:56:29 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37665 – Hot Deal brand: optional categoryId on the brand facet, so ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Hot Deal brand: optional categoryId on the brand facet, so the chips can be scoped to one tab&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/solr/SolrService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37665&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37665&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:48:33 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37664 – loi new revival process</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;loi new revival process&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/LoiFormRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37664&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37664&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:20:03 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37663 – Added exception to method sign</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Added exception to method sign&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoiFormController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37663&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37663&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:12:41 +0530</pubDate><dc:creator>vikas</dc:creator><title>Rev 37662 – LMS click to call</title><description>&lt;div&gt;&lt;strong&gt;vikas – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;LMS click to call&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/lms/RecordingArchiveFailureRecorder.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37662&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37662&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 18:10:20 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37661 – Fix trunk: RestClient was left behind by r37655  r37655 ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix trunk: RestClient was left behind by r37655&lt;br /&gt;
&lt;br /&gt;
r37655 deleted MandiiResponse but omitted RestClient from the commit, so&lt;br /&gt;
trunk did not compile - RestClient still imported the deleted class.&lt;br /&gt;
&lt;br /&gt;
RestClient now uses RawHttpResponse: executeMandii is renamed executeRaw and&lt;br /&gt;
postWithResponse returns the new type. The dead getMandii helper is removed;&lt;br /&gt;
its only caller was MandiiService.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/web/client/RestClient.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37661&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37661&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:50:44 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37660 – ticket download option given and some enhancement on notification panel</title><description>&lt;div&gt;&lt;strong&gt;ranu – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;ticket download option given and some enhancement on notification panel&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/AgreementEsignRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/AgreementEsignRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/StoreTimelinetbRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/StoreTimelinetbRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/loiForm/LoiFormServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoiFormController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/PartnerOnBoardingPanelController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37660&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37660&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:22:08 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37659 – Remove the Mandii callback from fofo (r37655)  Drops the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove the Mandii callback from fofo (r37655)&lt;br /&gt;
&lt;br /&gt;
Drops the /mandii payment-notification stub from HdfcPaymentController - it&lt;br /&gt;
only logged the body - and its three entries in the WebConfig auth whitelist.&lt;br /&gt;
PartnerOnBoardingPanelController imports follow services.mandii -&gt;&lt;br /&gt;
services.kyc for Gender/MaritalStatus/AddressProofType.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/WebConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/hdfc/HdfcPaymentController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/PartnerOnBoardingPanelController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37659&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37659&amp;peg=37691</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&amp;isdir=1&amp;rev=37658&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37658&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:15:01 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37657 – Remove Mandii checkout, status and callback paths (r37655)  OrderController: ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove Mandii checkout, status and callback paths (r37655)&lt;br /&gt;
&lt;br /&gt;
OrderController: the paymentOption MANDII branch and createMandiiOrder are&lt;br /&gt;
gone. GatewayController: the MANDII branch of payment/gateway/status is gone;&lt;br /&gt;
the SDDIRECT branch it sat in front of is untouched and still returns&lt;br /&gt;
AccountStatusResponseOut.&lt;br /&gt;
&lt;br /&gt;
API endpoints removed, all of them Mandii-only:&lt;br /&gt;
- /cart/payment (CartController + its V2CartController delegate) existed&lt;br /&gt;
  solely to poll Mandii for an order status and credit the wallet. It called&lt;br /&gt;
  mandiiService unconditionally, so it already failed for any other gateway.&lt;br /&gt;
- /mandii, the payment-notification callback, a no-op logging stub in both&lt;br /&gt;
  HdfcPaymentController and V2FofoHdfcPaymentController, and dropped from the&lt;br /&gt;
  WebConfig auth whitelist in the fofo commit.&lt;br /&gt;
&lt;br /&gt;
V2 twins touched only where they would otherwise keep a dead route alive or&lt;br /&gt;
fail to compile.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/CartController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/OrderController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/GatewayController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/SmartCartController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoHdfcPaymentController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoPartnerOnBoardingPanelController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2CartController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37657&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37657&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:14:51 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37656 – Point dao at the relocated KYC and SD Credit types ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Point dao at the relocated KYC and SD Credit types (r37655)&lt;br /&gt;
&lt;br /&gt;
Imports follow services.mandii -&gt; services.kyc / services.sdcredit, and&lt;br /&gt;
RecordingService takes RawHttpResponse in place of MandiiResponse.&lt;br /&gt;
&lt;br /&gt;
Gateway.MANDII is kept, with a comment saying why: it is persisted as a&lt;br /&gt;
string on FofoPayment.gateway and CreditAccount.gateway, and 740 historical&lt;br /&gt;
fofo.payment rows still carry it - removing the constant would make&lt;br /&gt;
Hibernate throw when reading them.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/fofo/FofoKyc.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/Supplier.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/enumuration/fofo/Gateway.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/SDCreditResponseOut.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/kommuno/RecordingService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/SDCreditServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37656&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37656&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 17:14:44 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37655 – Remove the dead Mandii BNPL integration (common)  Mandii has ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 21 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove the dead Mandii BNPL integration (common)&lt;br /&gt;
&lt;br /&gt;
Mandii has taken no payment since 2022-08-23 and holds no credit account, so&lt;br /&gt;
MandiiService and the 29 classes only it used are deleted.&lt;br /&gt;
&lt;br /&gt;
The package had become a home for live types, which are moved out rather than&lt;br /&gt;
lost: Gender/MaritalStatus/AddressProofType -&gt; services.kyc (they back&lt;br /&gt;
@Enumerated columns on user.fofo_kyc, 317 rows), and the SD Credit account&lt;br /&gt;
status model - AccountStatusResponseOut and its 10 dependencies -&gt; &lt;br /&gt;
services.sdcredit, still served by GatewayController for SDDIRECT.&lt;br /&gt;
&lt;br /&gt;
MandiiResponse was a generic body+status holder named after the integration;&lt;br /&gt;
renamed RawHttpResponse, still used by RestClient for Kommuno recordings.&lt;br /&gt;
Its dead getMandii() helper is gone. AccountStatusResponseOut no longer&lt;br /&gt;
carries the hardcoded merchant.mandii.com URL it shipped to the app.&lt;br /&gt;
&lt;br /&gt;
FundfinaService was logging under MandiiService.class - fixed.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/FofoKycModel.java&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/MandiiResponse.java&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/RawHttpResponse.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/fundfina/FundfinaService.java&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/kyc&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/kyc/AddressProofType.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/AddressProofType.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/kyc/Gender.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/Gender.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/kyc/MaritalStatus.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/MaritalStatus.java@37654)&lt;/i&gt;&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/AccountStatusResponseOut.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/AccountStatusResponseOut.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/CurrentStageEnum.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/CurrentStageEnum.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/Details.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/Details.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/Documents.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/Documents.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/DocumentStatusEnum.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/DocumentStatusEnum.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/DocumentTypesEnum.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/DocumentTypesEnum.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/EligibilityStatusEnum.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/EligibilityStatusEnum.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/RepaymentDetails.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/RepaymentDetails.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/VirtualAccountDetails.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/VirtualAccountDetails.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/VirtualBankAccount.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/VirtualBankAccount.java@37654)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/sdcredit/VirtualUPI.java &lt;i&gt;(copied from /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/mandii/VirtualUPI.java@37654)&lt;/i&gt;&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37655&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37655&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 16:29:59 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37654 – Sync internal store addresses at the mapping write  /createNewWarehouse ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Sync internal store addresses at the mapping write&lt;br /&gt;
&lt;br /&gt;
/createNewWarehouse now calls syncInternalStoreAddresses right after&lt;br /&gt;
persisting the WarehouseAddressMapping, inside the same transaction, so the&lt;br /&gt;
rule lives at the mutation site rather than in an endpoint someone has to&lt;br /&gt;
remember to call. A brand new warehouse has no internal store yet so it is a&lt;br /&gt;
no-op today, but any later path that sets a mapping now cannot leave an&lt;br /&gt;
internal store billing to the previous address.&lt;br /&gt;
&lt;br /&gt;
/syncWarehouseInternalAddress stays for remediating mappings repointed&lt;br /&gt;
directly in the database. Follows r37652/r37653.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/SellerController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37654&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37654&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 15:32:40 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37653 – Add POST /syncWarehouseInternalAddress  Realigns the INTERNAL stores of a ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Add POST /syncWarehouseInternalAddress&lt;br /&gt;
&lt;br /&gt;
Realigns the INTERNAL stores of a warehouse with its currently mapped&lt;br /&gt;
address. The warehouse address mapping has no edit screen - it is repointed&lt;br /&gt;
directly in the database - so a branch move never reached the internal&lt;br /&gt;
store&apos;s user.address and orders kept billing to the old premises. Run this&lt;br /&gt;
after changing a warehouse address mapping. Pairs with r37652.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/SellerController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37653&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37653&amp;peg=37691</guid></item>
<item><pubDate>Wed, 16 Sep 2026 15:32:35 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37652 – Internal store buyer address: always read user.address  An INTERNAL ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Internal store buyer address: always read user.address&lt;br /&gt;
&lt;br /&gt;
An INTERNAL store is the buying identity of a warehouse, so order creation&lt;br /&gt;
resolved its address from transaction.warehouseaddressmaster while every&lt;br /&gt;
screen read transaction.addId -&gt; user.address. The Delhi warehouses moved to&lt;br /&gt;
warehouseaddressmaster 26 in Sept 2024 and nothing carried that across, so&lt;br /&gt;
user.address still held the 2021 L-222 premises: same buyer, two addresses.&lt;br /&gt;
&lt;br /&gt;
user.address for active internal stores is now aligned with the mapped&lt;br /&gt;
warehouse address (sql/20260916_sync_internal_store_addresses.sql), split&lt;br /&gt;
exactly as getCustomAddress() does so the next invoice is unchanged. With&lt;br /&gt;
that true, createTransactionForWarehouse no longer special-cases internal.&lt;br /&gt;
&lt;br /&gt;
SellerService.syncInternalStoreAddresses carries a warehouse address remap&lt;br /&gt;
through to its internal stores - the mapping has no edit screen and is&lt;br /&gt;
repointed directly in the database, which is why nothing propagated before.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/SellerService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/SellerServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/20260916_sync_internal_store_addresses.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37652&amp;peg=37691</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37652&amp;peg=37691</guid></item>
</channel></rss>