<?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>Mon, 14 Sep 2026 03:59:08 +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=37513</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37513&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Tue, 01 Sep 2026 18:46:42 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37513 – notification live</title><description>&lt;div&gt;&lt;strong&gt;ranu – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;notification live&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/NotificationTargetCriteria.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/NotificationSchedule.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/NotificationScheduleRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/NotificationScheduleRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/resources/js/notification-calendar.js&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/notification-calendar.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37513&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37513&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:41:08 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37512 – notification live</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;notification live&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/LinkedEntity.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37512&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37512&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:40:18 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37511 – notification live</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;notification live&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/enumuration/NotificationFormat.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37511&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37511&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:39:11 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37510 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 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;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37510&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37510&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:38:33 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37509 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/enumuration/NotificationCategory.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37509&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37509&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:12:41 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37508 – notification live new ....api and modification , ui</title><description>&lt;div&gt;&lt;strong&gt;ranu – 11 file(s) modified&lt;/strong&gt;&lt;br/&gt;notification live new ....api and modification , ui&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/Notification.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/SendNotificationModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/NotificationCampaign.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/SimpleCampaignParams.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/NotificationCampaignRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/NotificationCampaignRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/NotificationController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/send-notification.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/send-notification.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37508&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37508&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:11:31 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37507 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/SalesHierarchyMonthlyTargetModel.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37507&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37507&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 18:10:56 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37506 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/SalesHierarchyAchievedByMovementModel.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37506&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37506&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 17:49:23 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37505 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/RbmDrrDashboardController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37505&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37505&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:59:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37504 – Stop invoice read paths creating directories (AccessDeniedException 500s)  getInvoicePath ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Stop invoice read paths creating directories (AccessDeniedException 500s)&lt;br /&gt;
&lt;br /&gt;
getInvoicePath called Files.createDirectories, and getInvoiceFile called it on every&lt;br /&gt;
download. Invoices are generated by the cron app as root, so /SaholicInvoices/&amp;lt;month&gt;&lt;br /&gt;
is 755 root-owned; a download served by Tomcat cannot create a retailer subdirectory&lt;br /&gt;
and threw AccessDeniedException.&lt;br /&gt;
&lt;br /&gt;
It threw on line 1 of getInvoiceFile, before the Files.exists check, so the&lt;br /&gt;
ProfitMandiBusinessException on the next line was unreachable and the callers&apos;&lt;br /&gt;
deliberate 404 handler (&quot;Invoice not yet generated, please retry shortly&quot;) never ran.&lt;br /&gt;
Downloads for a not-yet-generated invoice 500ed instead of 404ing - the exact log&lt;br /&gt;
noise that handler was added to remove.&lt;br /&gt;
&lt;br /&gt;
Split the path computation out: resolveInvoicePath is side-effect free and used by&lt;br /&gt;
getInvoiceFile; getInvoicePath keeps the mkdir for the two generation callers&lt;br /&gt;
(InvoiceService:558, GstProService:952). The legacy relocation branch creates the&lt;br /&gt;
target directory only when there is actually a file to move.&lt;br /&gt;
&lt;br /&gt;
No ops change needed - generation as root already works.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/InvoiceService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37504&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37504&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:35:38 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37503 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 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;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37503&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37503&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:32:50 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37502 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;sales target and achievement added cron and flags&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/icicilombard/model/LastTransactionsResponseModel.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37502&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37502&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:26:05 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37501 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;sales target and achievement added cron and flags&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/icicilombard/model/LastTransactionsRequestModel.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37501&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37501&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 16:19:27 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37500 – sales target and achievement added cron and flags</title><description>&lt;div&gt;&lt;strong&gt;ranu – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;sales target and achievement added cron and flags&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/inventory/SalesAchievements.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/SalesAchievementsRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/SalesAchievementsRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37500&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37500&amp;peg=37513</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&amp;isdir=1&amp;rev=37499&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37499&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 15:55:04 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37498 – Fix: namespace document-level handlers in remaining vm fragments  Completes ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 35 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix: namespace document-level handlers in remaining vm fragments&lt;br /&gt;
&lt;br /&gt;
Completes the sweep started in r37493/r37494. These fragments are injected&lt;br /&gt;
with .html(), which re-executes their inline &amp;lt;script&gt;, so every load stacked&lt;br /&gt;
another $(document) delegated handler. Mutating handlers then fired N&lt;br /&gt;
identical requests and were rejected as duplicates; read-only ones silently&lt;br /&gt;
fired N GETs (never deduped, so no alert - just N times the load).&lt;br /&gt;
&lt;br /&gt;
35 fragments, 70 bindings. Adopts the create-purchase-return.vm convention:&lt;br /&gt;
one $(document).off(&apos;.ns&apos;) before the first binding, every event namespaced,&lt;br /&gt;
so only the newest binding survives a re-injection.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
- ticket.vm binds via jQuery(document).on, which the earlier passes did not&lt;br /&gt;
  match, and its clear must sit OUTSIDE ready() - that callback fires async,&lt;br /&gt;
  so an inside-ready clear would wipe the top-level binds registered before it.&lt;br /&gt;
- agreement-esign-panel, full-stock-payment-panel and create-purchase-return&lt;br /&gt;
  were left alone; they already clear their handlers (selector-targeted&lt;br /&gt;
  .off(&apos;click&apos;, sel) and .off(&apos;.createpr&apos;) respectively).&lt;br /&gt;
&lt;br /&gt;
Behaviour-preserving: every diff line is either a namespace suffix on an&lt;br /&gt;
event string or a new off() call. Selectors, handlers and ordering untouched.&lt;br /&gt;
Verified no unprotected document-level bindings remain in any fragment.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/activation-tabular.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/add-wallet-rejected.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/add-wallet-req.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/add-wallet-request.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/auth_user_partner_detail.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/beat-plan-deferred.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/beat-report-data.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/beat-report-user-detail.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/bulk-order.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/bulletin-list.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/catalog.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/dashboard-modal.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/design-completed.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/finance-services.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/lead-geo-review.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/lead.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/loi-form.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/managerTicket.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/my-partner-tickets.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/onboarding_timeline.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/order-index.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/partner-onboarding-design-index.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/partner-onboarding-index.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/partner-onboarding-open.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/partner-onboarding-reject.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/partner-readonly-info.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/post-bulletin.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/price-drop-tabular.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/returnables.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/ticket.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/update_PartnerCriteria.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/upgrade-offer-tabular.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/visit-approvals.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/wallet-details.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-grn-correction-detail.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37498&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37498&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 15:51:22 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37497 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/RbmDrrDashboardController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/rbm-drr-dashboard.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37497&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37497&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 15:42:57 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37496 – Handle empty IN collections instead of failing the query  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Handle empty IN collections instead of failing the query&lt;br /&gt;
&lt;br /&gt;
An empty IN list rendered as &quot;in ()&quot; (invalid SQL) or threw, in three inconsistent ways:&lt;br /&gt;
SQLGrammarException from prepareInPredicate, RuntimeException from prepareEqualPredicate,&lt;br /&gt;
and ProfitMandiBusinessException from selectAllByInOrderByDesc. A partner with no activity&lt;br /&gt;
for a brand legitimately produces an empty set, so these were 500ing on valid input&lt;br /&gt;
(~436 errors/week, mostly V2FofoSchemeController.getBrandWiseIncome).&lt;br /&gt;
&lt;br /&gt;
An empty IN matches nothing: route every IN site through inPredicateOrNone, which returns&lt;br /&gt;
an empty disjunction. Empty NOT IN excludes nothing, so it matches everything (conjunction).&lt;br /&gt;
selectAllByInOrderByDesc returns an empty list without a DB round-trip.&lt;br /&gt;
&lt;br /&gt;
Also covers three sites that had no guard at all: selectAllByInEqualOrderBysDesc,&lt;br /&gt;
selectCountByIn and mapToPredicate. Public API unchanged.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/GenericRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37496&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37496&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 15:42:49 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37495 – Fix Pine Labs affordability prod config: drop placeholder pinelabs.api.* overrides ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix Pine Labs affordability prod config: drop placeholder pinelabs.api.* overrides&lt;br /&gt;
&lt;br /&gt;
r36839 re-added pinelabs.api.base.url/client.id/client.secret to the web module with&lt;br /&gt;
REPLACE_WITH_* values, reintroducing the duplication removed in r35832. AppConfig loads&lt;br /&gt;
shared-prod first and the module file second, so these shadowed the real credentials and&lt;br /&gt;
every affordability call failed with UnknownHostException on plural.v2.pinepg.in&lt;br /&gt;
(NXDOMAIN) - 1,254 errors in one week. Removing them restores the working values from&lt;br /&gt;
shared-prod.properties (api.pluralpay.in).&lt;br /&gt;
&lt;br /&gt;
pinelabs.account.* deliberately left in place: the web module pins merchant 11467 while&lt;br /&gt;
shared-prod has 356460, so removing those would switch the live payment merchant.&lt;/div&gt;~ /trunk/profitmandi-web/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=37495&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37495&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 15:35:52 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37494 – Fix: namespace document-level handlers in re-injected vm fragments  Same ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix: namespace document-level handlers in re-injected vm fragments&lt;br /&gt;
&lt;br /&gt;
Same defect class as r37493. These fragments are injected with .html(),&lt;br /&gt;
which re-executes their inline &amp;lt;script&gt;, so every load stacked another&lt;br /&gt;
$(document) delegated handler. One click then fired N identical requests;&lt;br /&gt;
PostInterceptor claimed the first and rejected the rest as duplicates.&lt;br /&gt;
&lt;br /&gt;
Confirmed in prod today: beat-plan-day-view #avSubmit produced bursts of&lt;br /&gt;
3-4 rejections on POST /beatPlan/assignVisit/submit. The other four are the&lt;br /&gt;
same shape - chart-filter-lms, franchisee-account-creation and beat-plan-bulk&lt;br /&gt;
re-inject themselves directly, placement-plan-details does so indirectly by&lt;br /&gt;
clicking .search-partner-stock after createPo.&lt;br /&gt;
&lt;br /&gt;
Adopt the create-purchase-return.vm convention: one $(document).off(&apos;.ns&apos;)&lt;br /&gt;
before the first binding, every event namespaced. Only the newest binding&lt;br /&gt;
survives, which also fixes handlers holding a stale Velocity closure from a&lt;br /&gt;
previously rendered record.&lt;br /&gt;
&lt;br /&gt;
Behaviour-preserving: the only changes are the namespace suffix on 22 event&lt;br /&gt;
strings plus the five off() calls. Selectors, handlers and ordering untouched.&lt;br /&gt;
&lt;br /&gt;
Read-only self-injecting fragments (activation-tabular, catalog,&lt;br /&gt;
partner-onboarding-*, etc) still stack handlers but only fire GETs, which are&lt;br /&gt;
never deduped - left for a separate pass.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/beat-plan-bulk.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/beat-plan-day-view.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/chart-filter-lms.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/franchisee-account-creation.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/placement-plan-details.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37494&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37494&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 12:56:08 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37493 – Fix: scheme item inline date edit fired N duplicate PUTs ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix: scheme item inline date edit fired N duplicate PUTs per click&lt;br /&gt;
&lt;br /&gt;
scheme-details.vm is injected with .html(), which re-executes its inline&lt;br /&gt;
&amp;lt;script&gt;, and a successful save re-injects it - so each load stacked another&lt;br /&gt;
$(document) handler for .edit/.cancel/.save-item-dates. One Save click then&lt;br /&gt;
fired N identical PUT /scheme/item/window, and PostInterceptor rejected all&lt;br /&gt;
but the first with &apos;Duplicate request.&apos; (27 per click in prod today).&lt;br /&gt;
The stacked copies also carried a stale $scheme closure, so a save could&lt;br /&gt;
repaint the container with a previously viewed scheme.&lt;br /&gt;
&lt;br /&gt;
Move the handlers to scheme.js (loaded once via include-scripts.vm) and read&lt;br /&gt;
the scheme id/window from data- attributes on the fragment root, keeping them&lt;br /&gt;
stateless. Fragment is now markup only.&lt;br /&gt;
&lt;br /&gt;
Reuse cleanup while in here:&lt;br /&gt;
- configureMultiselect() replaces 3 near-identical multiselect configs&lt;br /&gt;
- loadBrandsByCategory/loadCatalogDescriptionByBrands take an optional&lt;br /&gt;
  afterRender so the add-item modal reuses them instead of duplicating both&lt;br /&gt;
- toggleItemDateEdit()/initSingleDatePicker() collapse mirrored blocks&lt;br /&gt;
- SCHEME_DETAILS_CONTAINER single-sources the container id&lt;br /&gt;
- drop the template&apos;s duplicate toIsoDateTime (scheme.js already had it)&lt;br /&gt;
- updateSchemeItemWindow() now prefixes context like every other call&lt;br /&gt;
&lt;br /&gt;
Bump jsVersion 409 -&gt; 410.&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/scheme.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/scheme-details.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37493&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37493&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 12:37:42 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37492 – errors: wire the GlitchTip appender into cron and fofo logging ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;errors: wire the GlitchTip appender into cron and fofo logging&lt;br /&gt;
&lt;br /&gt;
Completes r37491, which committed only web&apos;s log4j2.xml. cron&apos;s and fofo&apos;s were&lt;br /&gt;
held back because they carried local development log paths -- a user.home&lt;br /&gt;
expansion in cron and an absolute /Users path in fofo. Neither can ship: /Users&lt;br /&gt;
does not exist on the server, so fofo logging would fail to open its file and&lt;br /&gt;
the Alloy stream tailing /var/log/tomcat7/fofo/fofo.log would go dead.&lt;br /&gt;
&lt;br /&gt;
Both files are restored to their production paths and carry the Sentry appender.&lt;br /&gt;
Whoever needs the local override should re-apply it locally rather than&lt;br /&gt;
committing it.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/resources/log4j2.xml&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/log4j2.xml&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37492&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37492&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 12:23:38 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37491 – errors: ship ERROR events to GlitchTip via the log4j2 Sentry ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;errors: ship ERROR events to GlitchTip via the log4j2 Sentry appender&lt;br /&gt;
&lt;br /&gt;
io.sentry:sentry-log4j2:7.22.6 in all three deployables. Pinned to 7.x because&lt;br /&gt;
8.x drops Java 8; verified class major version 52.&lt;br /&gt;
&lt;br /&gt;
minimumEventLevel=ERROR is load-bearing. It only became safe after r37490 moved&lt;br /&gt;
business validations to WARN -- 32% of the ERROR stream was HTTP 400s where the&lt;br /&gt;
user is simply told what to fix, and sending those would have made &quot;insufficient&lt;br /&gt;
balance&quot; the top issue and buried real bugs. Breadcrumbs come from INFO so an&lt;br /&gt;
issue arrives with the log lines that preceded it.&lt;br /&gt;
&lt;br /&gt;
Attached to the application loggers only; framework noise is not our bug.&lt;br /&gt;
&lt;br /&gt;
web&apos;s log4j2.xml is committed here. cron&apos;s and fofo&apos;s are held back: both carry&lt;br /&gt;
uncommitted local development paths (a user.home expansion, and an absolute&lt;br /&gt;
/Users path) that would break production logging and the Alloy log tailing.&lt;br /&gt;
Their Sentry blocks are staged locally and should land with whoever owns those&lt;br /&gt;
path edits.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;~ /trunk/profitmandi-fofo/build.gradle&lt;br /&gt;~ /trunk/profitmandi-web/build.gradle&lt;br /&gt;~ /trunk/profitmandi-web/src/main/resources/log4j2.xml&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37491&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37491&amp;peg=37513</guid></item>
<item><pubDate>Tue, 01 Sep 2026 12:20:10 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37490 – errors: separate business, integration and bug -- three failures logged ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;errors: separate business, integration and bug -- three failures logged three ways&lt;br /&gt;
&lt;br /&gt;
Everything was logged identically: ERROR, titled &apos;Internal Server Error&apos;, and in&lt;br /&gt;
web stack-traced twice (log4j2 plus printStackTrace, the second copy landing in&lt;br /&gt;
catalina.out). A partner mistyping an IMEI produced the same output as a&lt;br /&gt;
NullPointerException.&lt;br /&gt;
&lt;br /&gt;
That makes the error stream unalertable. Measured over six hours across web and&lt;br /&gt;
fofo: 909 ERROR lines, of which 294 (32%) were ProfitMandiBusinessException --&lt;br /&gt;
HTTP 400s where the user is simply told what to fix. Any rule on ERROR rate&lt;br /&gt;
fires constantly, and an error tracker would rank &apos;insufficient balance&apos; as the&lt;br /&gt;
top issue.&lt;br /&gt;
&lt;br /&gt;
  business    WARN,  no stack trace, 4xx  -- expected, user-correctable&lt;br /&gt;
  integration ERROR + dependency name     -- ours is fine, theirs is not&lt;br /&gt;
  anything else ERROR + stack trace, 500  -- a bug&lt;br /&gt;
&lt;br /&gt;
New IntegrationException carries getDependency(), so two hundred failures of one&lt;br /&gt;
gateway group as one problem rather than two hundred unrelated traces. That&lt;br /&gt;
category did not exist: such failures were previously either a bare Exception&lt;br /&gt;
(indistinguishable from our own bug) or a business exception (which wrongly&lt;br /&gt;
blames the user).&lt;br /&gt;
&lt;br /&gt;
printStackTrace removed from the web handler -- it was writing a second copy of&lt;br /&gt;
every trace to catalina.out.&lt;br /&gt;
&lt;br /&gt;
Prerequisite for wiring the GlitchTip appender, which must not be attached until&lt;br /&gt;
ERROR means something.&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/exception/IntegrationException.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/GlobalExceptionHandler.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/GlobalExceptionHandler.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37490&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37490&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 19:34:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37489 – Restore Utils.html and Utils.htmlJson removed by r37477  r37477 reorganised ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Restore Utils.html and Utils.htmlJson removed by r37477&lt;br /&gt;
&lt;br /&gt;
r37477 reorganised Utils while consolidating the mail APIs and dropped its only two&lt;br /&gt;
instance methods. They have no Java callers -- they exist solely for Velocity, where&lt;br /&gt;
AppConfig binds new Utils() as $vmUtils -- so the compiler, IDE find-usages and any&lt;br /&gt;
grep over *.java all reported them dead.&lt;br /&gt;
&lt;br /&gt;
With htmlJson gone, data-paramslist=&quot;$vmUtils.htmlJson(...)&quot; stopped rendering usable&lt;br /&gt;
JSON on every report link (admin.vm:840, admin.vm:910, reports.vm:51). reports.js:7&lt;br /&gt;
then read $(this).data(&quot;paramslist&quot;) as undefined and returned true, letting the&lt;br /&gt;
browser follow the plain &amp;lt;a href&gt; natively -- a GET against the @PostMapping&lt;br /&gt;
/reports/{projectName}/{fileName} (ReportsController:126), answered with GE_1007&lt;br /&gt;
&quot;Request method &apos;GET&apos; not supported&quot;. The modal POST path was the only way that&lt;br /&gt;
endpoint was ever reachable, so every partner report broke at once.&lt;br /&gt;
&lt;br /&gt;
Confirmed against prod: zero occurrences in fofo.log for Aug 13/20/26/28/30, and 87&lt;br /&gt;
today starting 18:37:23, right after today&apos;s ROOT.war deploy. 13 distinct reports hit.&lt;br /&gt;
&lt;br /&gt;
$vmUtils.html had two further callers that also come back:&lt;br /&gt;
offer_margin_detail_partner.vm:12 and :241 (offer description and notes).&lt;br /&gt;
&lt;br /&gt;
Restored verbatim from r37476, and commented as template-only so the next refactor&lt;br /&gt;
does not read them as dead code again.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/Utils.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37489&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37489&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:50:22 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37488 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/WarehouseBuyingByMovementModel.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37488&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37488&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:49:06 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37487 – rbm drr dashboard , all today po rbm view maped</title><description>&lt;div&gt;&lt;strong&gt;ranu – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;rbm drr dashboard , all today po rbm view maped&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/RbmTargetServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/RbmDrrDashboardController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/rbm-drr-dashboard.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37487&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37487&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:32:25 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37486 – mail: fix prod outage -- MailOutboxService must not implement MailQueue ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: fix prod outage -- MailOutboxService must not implement MailQueue&lt;br /&gt;
&lt;br /&gt;
r37478 added &apos;implements MailQueue&apos; to MailOutboxService. That took down both&lt;br /&gt;
ROOT.war and profitmandi-web.war on the 18:19 deploy today; every route 404&apos;d&lt;br /&gt;
because neither Spring context would start.&lt;br /&gt;
&lt;br /&gt;
MailOutboxService has @Transactional methods, so Spring has to proxy it, and&lt;br /&gt;
@EnableTransactionManagement in both WebDBContextConfigure classes runs with the&lt;br /&gt;
default proxyTargetClass=false. While the class implemented no interface Spring&lt;br /&gt;
proxied it with a CGLIB subclass, which is still a MailOutboxService. Adding an&lt;br /&gt;
interface switched it to a JDK proxy implementing only MailQueue, so all 39&lt;br /&gt;
sites that inject the concrete MailOutboxService failed:&lt;br /&gt;
&lt;br /&gt;
  BeanNotOfRequiredTypeException: Bean named &apos;mailOutboxService&apos; is expected to&lt;br /&gt;
  be of type MailOutboxService but was actually of type com.sun.proxy.$Proxy1519&lt;br /&gt;
&lt;br /&gt;
The interface moves to a new MailQueueAdapter, which delegates to&lt;br /&gt;
MailOutboxService and carries no transactional annotations. MailQueueHolder and&lt;br /&gt;
EmailServiceImpl inject it by the MailQueue interface, so Utils.sendMail* and&lt;br /&gt;
EmailService still reach the outbox unchanged. MailOutboxService goes back to&lt;br /&gt;
implementing nothing, and its ~112 existing call sites are untouched.&lt;br /&gt;
&lt;br /&gt;
Chose this over proxyTargetClass=true, which would have flipped proxying for&lt;br /&gt;
every interface-implementing service in the app -- too broad for a hot fix.&lt;br /&gt;
&lt;br /&gt;
Verified with javap inside both built WARs: MailOutboxService declares no&lt;br /&gt;
interfaces, MailQueueAdapter implements MailQueue.&lt;br /&gt;
&lt;br /&gt;
Note for cron: it shares the dao jar, so a rebuild picks this up. Do not restart&lt;br /&gt;
cron on trunk without rebuilding it first.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/mail/MailOutboxService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/mail/MailQueueAdapter.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37486&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37486&amp;peg=37513</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&amp;isdir=1&amp;rev=37485&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37485&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:17:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37484 – cron metrics: register the status gauge as -1, not 0 ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;cron metrics: register the status gauge as -1, not 0&lt;br /&gt;
&lt;br /&gt;
The gauge was created when a job STARTS, and 0 means failure, so any job still&lt;br /&gt;
running its first execution after a restart reported FAILED. Selenium-driven and&lt;br /&gt;
report jobs take minutes, so this is not a narrow window -- it put ten jobs on&lt;br /&gt;
the dashboard as failed after the 2026-08-31 restart when none had failed.&lt;br /&gt;
&lt;br /&gt;
-1 means &apos;has not finished a run yet&apos;. CronJobFailing matches == 0, so those&lt;br /&gt;
jobs are simply absent from the alert until they genuinely complete once.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/monitored/CronJobMonitorAspect.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37484&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37484&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 18:11:23 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37483 – mail: migrate mail_outbox SENDGRID rows to RELAY (applied to production) ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: migrate mail_outbox SENDGRID rows to RELAY (applied to production)&lt;br /&gt;
&lt;br /&gt;
SENDGRID never meant SendGrid -- resolveSender() already routed it to the&lt;br /&gt;
Workspace relay, which is why outbox mail kept being delivered while direct&lt;br /&gt;
JavaMailSender injections failed against the real, dead SendGrid bean. So this&lt;br /&gt;
relabels rows without changing where anything is sent.&lt;br /&gt;
&lt;br /&gt;
Applied to hadb1 2026-08-31 18:10 IST:&lt;br /&gt;
  before  SENDGRID=5956  RELAY=0     GOOGLE=4896  (total 10852)&lt;br /&gt;
  after   SENDGRID=0     RELAY=5956  GOOGLE=4896  (total 10852)&lt;br /&gt;
  backup  dtr.mail_outbox_sendgrid_backup_20260831_1810 (5956 rows)&lt;br /&gt;
&lt;br /&gt;
The one PENDING row (id=26838) migrated cleanly and still routes to the relay.&lt;br /&gt;
Only GOOGLE and RELAY remain in the column. Rollback statement is in the script.&lt;br /&gt;
&lt;br /&gt;
The comment claiming legacy SENDGRID rows exist is now false and has been&lt;br /&gt;
corrected; SendGrid appears nowhere in the codebase.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/mail/MailOutboxService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/migration_mail_outbox_sendgrid_to_relay.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37483&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37483&amp;peg=37513</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&amp;isdir=1&amp;rev=37482&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37482&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:59:05 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37481 – imei activation: one 2-day billing floor for every brand, and ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;imei activation: one 2-day billing floor for every brand, and drop two dead methods&lt;br /&gt;
&lt;br /&gt;
The pending pool is a UNION of two channels, not an intersection: an imei qualifies&lt;br /&gt;
if WE billed it to the partner (selectImeiActivationByBrand) or the PARTNER billed it&lt;br /&gt;
on to the end customer (selectImeiActivationByBrandTertiary). The two are disjoint by&lt;br /&gt;
construction -- the secondary query excludes anything carrying a FofoLineItem -- so a&lt;br /&gt;
unit moves from one to the other as it sells through and is never asked about twice.&lt;br /&gt;
Said so on the interface, since the pairing was only documented at the call sites.&lt;br /&gt;
&lt;br /&gt;
billedBefore moves from now-1d to now-2d, so both channels ask only about stock billed&lt;br /&gt;
MORE THAN 2 DAYS ago. Anything sold in the last 48 hours has essentially never been&lt;br /&gt;
activated yet, so the lookup is spent for nothing; it is not lost, the same imei comes&lt;br /&gt;
back into the pool as soon as it crosses the floor, and again every day after that&lt;br /&gt;
until it activates. Kept in the repository rather than per caller so vivo, oppo, realme,&lt;br /&gt;
motorola and the new carlcare pass inherit one rule instead of drifting apart.&lt;br /&gt;
&lt;br /&gt;
Costs almost nothing today -- secondary pool, old floor vs new:&lt;br /&gt;
&lt;br /&gt;
  itel 1550 -&gt; 1550    realme    849 -&gt;  849    oppo     2021 -&gt; 2019&lt;br /&gt;
  vivo 5018 -&gt; 5016    motorola 1168 -&gt; 1153    tecno     502 -&gt;  495&lt;br /&gt;
&lt;br /&gt;
26 rows across six brands, each deferred by one day.&lt;br /&gt;
&lt;br /&gt;
Removed as dead:&lt;br /&gt;
&lt;br /&gt;
  selectImeiActivationPendingByRealme -- a verbatim duplicate of&lt;br /&gt;
  selectImeiActivationPendingByBrand down to the named query and the parameters. Nothing&lt;br /&gt;
  called it; StandAlone already used the brand-generic method for realme and said so in&lt;br /&gt;
  a comment, which is now updated.&lt;br /&gt;
&lt;br /&gt;
  selectImeiSoldNotActivatedByBrand -- interface, impl and named query. No callers&lt;br /&gt;
  anywhere in web, fofo, cron or dao.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/fofo/ActivatedImei.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&amp;isdir=1&amp;rev=37481&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37481&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:55:16 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37480 – mail: correct a wrong claim in r37479 -- the Google ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: correct a wrong claim in r37479 -- the Google app password IS valid&lt;br /&gt;
&lt;br /&gt;
r37479 stated googleMailSender&apos;s app password was rejected. That was wrong. The&lt;br /&gt;
test behind it resolved smtp.gmail.com over IPv6; repeating it over IPv4 with&lt;br /&gt;
the same credential gives AUTH OK on both 465 and 587.&lt;br /&gt;
&lt;br /&gt;
The real fault is not the credential and not the bean config, both of which are&lt;br /&gt;
correct. SMTP from this host works over IPv4 only:&lt;br /&gt;
&lt;br /&gt;
  smtp.gmail.com   IPv4 -&gt; AUTH OK        IPv6 -&gt; 535 5.7.8 Username and Password not accepted&lt;br /&gt;
  smtp-relay       IPv4 -&gt; 250 MAIL FROM  IPv6 -&gt; 550 5.7.1 Invalid credentials for relay&lt;br /&gt;
&lt;br /&gt;
The JVM prefers IPv4, which is the only reason mail leaves this box at all.&lt;br /&gt;
Anything that prefers IPv6 fails on both paths.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37480&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37480&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:49:38 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37479 – mail: make the relay the default sender, not the Google ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: make the relay the default sender, not the Google identity&lt;br /&gt;
&lt;br /&gt;
Correcting r37474-37476. Those made googleMailSender @Primary on the assumption&lt;br /&gt;
its credentials worked. Tested against the live servers from the prod host:&lt;br /&gt;
&lt;br /&gt;
  googleMailSender  535 5.7.8 Username and Password not accepted (BadCredentials)&lt;br /&gt;
                    -- the app password in the source is no longer valid&lt;br /&gt;
  relay over IPv4   250 OK for MAIL FROM:&amp;lt;&lt;a href=&quot;mailto:noreply@smartdukaan.com&quot;&gt;noreply@smartdukaan.com&lt;/a&gt;&gt;&lt;br /&gt;
  relay over IPv6   550 5.7.1 Invalid credentials for relay&lt;br /&gt;
&lt;br /&gt;
So promoting google would have replaced one broken default with another. The&lt;br /&gt;
relay is what actually delivers today and it becomes &apos;mailSender&apos;. It does not&lt;br /&gt;
authenticate -- Workspace authorises it by allowlisted source IP -- so sending&lt;br /&gt;
as noreply@ is legitimate there and AuthenticatedIdentityMailSender correctly&lt;br /&gt;
leaves it alone.&lt;br /&gt;
&lt;br /&gt;
googleMailSender stays available by qualifier. Point the default back at it once&lt;br /&gt;
a valid app password is issued for &lt;a href=&quot;mailto:sdtech@smartdukaan.com&quot;&gt;sdtech@smartdukaan.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Also noted in the javadoc: the relay allowlist covers the IPv4 address only, so&lt;br /&gt;
anything that prefers IPv6 will be refused.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37479&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37479&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:38:59 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37478 – mail: MailOutboxService implements MailQueue  Adds the single entry point, ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: MailOutboxService implements MailQueue&lt;br /&gt;
&lt;br /&gt;
Adds the single entry point, queue(MailRequest). The twenty-odd queueMail*&lt;br /&gt;
overloads remain as delegates because ~112 call sites use them, but they now&lt;br /&gt;
funnel through one path rather than each building their own argument list.&lt;br /&gt;
&lt;br /&gt;
Selecting the transport moves here too: MailSenderType.GOOGLE maps to the&lt;br /&gt;
authenticated sender, anything else to the relay.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/mail/MailOutboxService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37478&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37478&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:38:48 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37477 – mail: one way to send mail, and nothing sends inline ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: one way to send mail, and nothing sends inline&lt;br /&gt;
&lt;br /&gt;
There were three overlapping APIs -- Utils.sendMail* (7 static overloads),&lt;br /&gt;
EmailServiceImpl.sendMail* (7 more) and MailOutboxService.queueMail* (20). The&lt;br /&gt;
first two built their own MimeMessage, hardcoded From: &lt;a href=&quot;mailto:noreply@smartdukaan.com&quot;&gt;noreply@smartdukaan.com&lt;/a&gt;&lt;br /&gt;
in eleven places, and pushed straight down whichever JavaMailSender the caller&lt;br /&gt;
passed.&lt;br /&gt;
&lt;br /&gt;
That From is why mail was refused: an authenticated Workspace session may send&lt;br /&gt;
only as the account it logged in as, and noreply@ is a different identity in the&lt;br /&gt;
same domain. Sending inline also meant a failed send was lost outright and took&lt;br /&gt;
the calling job down with it, which is how one expired credential came to mark&lt;br /&gt;
ten report jobs FAILED.&lt;br /&gt;
&lt;br /&gt;
New in profitmandi-common:&lt;br /&gt;
  MailQueue      - the single entry point; queue() returns once the mail is&lt;br /&gt;
                   recorded, not once it is sent&lt;br /&gt;
  MailRequest    - one value object replacing the 34 overloads&lt;br /&gt;
  MailSenderType - GOOGLE (authenticated, From rewritten) or RELAY (IP-authorised)&lt;br /&gt;
&lt;br /&gt;
The interface lives in common while MailOutboxService implements it in dao,&lt;br /&gt;
because dao depends on common and not the reverse -- Utils and EmailService&lt;br /&gt;
could not otherwise reach the outbox at all.&lt;br /&gt;
&lt;br /&gt;
Utils and EmailService keep their signatures so the ~38 call sites still&lt;br /&gt;
compile, but now delegate and ignore the JavaMailSender argument; choosing a&lt;br /&gt;
transport was never the caller&apos;s business. Both are marked deprecated.&lt;br /&gt;
MailQueueHolder bridges the static helpers to the bean and is documented as a&lt;br /&gt;
compromise, not a pattern.&lt;/div&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/mail&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/mail/MailQueue.java&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/mail/MailQueueHolder.java&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/mail/MailRequest.java&lt;br /&gt;+ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/mail/MailSenderType.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/EmailService.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/EmailServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/Utils.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37477&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37477&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:19:03 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37476 – mail: delete the dead SendGrid bean from fofo, make the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: delete the dead SendGrid bean from fofo, make the authenticated identity primary&lt;br /&gt;
&lt;br /&gt;
googleMailSender is now @Primary and answers to &apos;mailSender&apos;. Two senders remain:&lt;br /&gt;
the authenticated Workspace identity and the IP-authorised relay.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37476&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37476&amp;peg=37513</guid></item>
<item><pubDate>Mon, 31 Aug 2026 17:11:39 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37475 – mail: delete the dead SendGrid bean from web, make the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;mail: delete the dead SendGrid bean from web, make the authenticated identity primary&lt;br /&gt;
&lt;br /&gt;
Removes the live SendGrid bean plus two commented-out corpses (an old&lt;br /&gt;
&lt;a href=&quot;mailto:build@shop2020.in&quot;&gt;build@shop2020.in&lt;/a&gt; sender and a dead alias). googleMailSender is now @Primary and&lt;br /&gt;
answers to &apos;mailSender&apos;, so unqualified injections get the working authenticated&lt;br /&gt;
sender instead of one that rejects with 535.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37475&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37475&amp;peg=37513</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&amp;isdir=1&amp;rev=37474&amp;peg=37513</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37474&amp;peg=37513</guid></item>
</channel></rss>