<?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 02:38:43 +0530</lastBuildDate><generator>WebSVN 2.8.6-DEV</generator><language>en</language><link>https://svn.smartdukaan.com/log.php?repname=SmartDukaan&amp;path=%2F&amp;max=40&amp;peg=37733</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37733&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Mon, 21 Sep 2026 12:33:44 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37733 – Remove dead third-party integrations: web  - PayU: /payu-pay and ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 33 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: web&lt;br /&gt;
&lt;br /&gt;
- PayU: /payu-pay and the payu-pay-response/cancelled handlers (bodies were&lt;br /&gt;
  already commented out), PayuHandler, payment/ helpers, PayU POJOs, and the&lt;br /&gt;
  PAYU PAY option served by checkout/payment-options.&lt;br /&gt;
  PayuPayController stays: it holds the live CCAvenue, Razorpay and Pine Labs&lt;br /&gt;
  callbacks.&lt;br /&gt;
- SmartPing: GET /click2call/{toMobile} (v1 + v2) and the caller-ID hook&lt;br /&gt;
  /smartping/receipt + /v2/hookCallerID, which only logged&lt;br /&gt;
- HyperTrack: device location, partner location and geofence endpoints plus&lt;br /&gt;
  HyperTrackService. The attendance endpoints (/getPunchHistory,&lt;br /&gt;
  /employee/attendance) never called HyperTrack and are kept, moved to&lt;br /&gt;
  EmployeeAttendanceController / V2EmployeeAttendanceController.&lt;br /&gt;
- Affiliate click-outs and live pricing (Amazon/Flipkart/Snapdeal via OMG):&lt;br /&gt;
  ClicksController, LivePricingController and v2 wrappers. Live pricing was&lt;br /&gt;
  already returning an empty list.&lt;br /&gt;
- Thriwe controller (fully commented out), SpiceMoney and FundFina v2 controllers&lt;br /&gt;
- Aramex branch of /track; tofee.* keys in dev/prod properties&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/config/WebMVCConfig.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/OrderController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/PayuHandler.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/PayuPayController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/PayuPayResponseController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/SmartPingReceiptModel.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/ClicksController.java&lt;br /&gt;+ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/EmployeeAttendanceController.java &lt;i&gt;(copied from /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/HyperTrackController.java@37732)&lt;/i&gt;&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/HyperTrackController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/HyperTrackService.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/LivePricingController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/LogisticsTrackingController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/ThriweController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/TicketChatActivityController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/payment&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/req/PayuPayResponsePojo.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/res/AddClickReponse.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/res/LivePricingResponse.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/res/order/PayuPayPojo.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/res/order/PayuResponseParams.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoFundFinaController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoSpiceMoneyController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoWebHookController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2ClicksController.java&lt;br /&gt;+ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2EmployeeAttendanceController.java &lt;i&gt;(copied from /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2HyperTrackController.java@37732)&lt;/i&gt;&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2HyperTrackController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2LivePricingController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2PayuPayController.java&lt;br /&gt;x /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2PayuPayResponseController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2TicketChatActivityController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/resources/META-INF/dev.properties&lt;br /&gt;~ /trunk/profitmandi-web/src/main/resources/META-INF/payment-options.json&lt;br /&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=37733&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37733&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:33:17 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37732 – purchase return: look up the open return against a document ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;purchase return: look up the open return against a document&lt;br /&gt;
&lt;br /&gt;
selectOpenByDocumentReference returns the return still outstanding against a&lt;br /&gt;
document reference - neither refunded nor rejected - or null when none is.&lt;br /&gt;
&lt;br /&gt;
Backs a duplicate guard on the invoice-return submit path: the same invoice was&lt;br /&gt;
being submitted twice, the closest pair eight seconds apart, and finance was&lt;br /&gt;
rejecting the extras by hand. A settled return deliberately does not count, since&lt;br /&gt;
rejecting a return is precisely what frees the invoice to be raised again.&lt;br /&gt;
&lt;br /&gt;
Repository lands first so the method exists before the caller uses it.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/PurchaseReturnOrderRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/PurchaseReturnOrderRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37732&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37732&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:33:07 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37731 – Remove dead third-party integrations: dao  Nothing removed here had ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 39 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: dao&lt;br /&gt;
&lt;br /&gt;
Nothing removed here had a live caller. No tables are touched.&lt;br /&gt;
&lt;br /&gt;
- Toffee Insurance client + models, and the tofee.* keys in shared-*.properties&lt;br /&gt;
- Bharti Assist (BAG) service and its certificate/brand models. BagPlanModel&lt;br /&gt;
  and PlanVariant stay in bharti/model: OneAssist and ICICI Lombard use them.&lt;br /&gt;
- Private, uncalled Toffee/BAG request builders in InsuranceServiceImpl&lt;br /&gt;
- Wiseapp insurance client and ZestResponseModel&lt;br /&gt;
- SmartPing client. CallDetailModel and PushCallLogModel move to&lt;br /&gt;
  kommuno/model because the Knowlarity webhooks still parse them.&lt;br /&gt;
- SpiceMoney SSO (2-partner pilot), Thriwe stub + DTOs, DTDC/Shipsy (demo&lt;br /&gt;
  URLs only), Blue Dart SOAP stubs, legacy Pine Labs v1 client&lt;br /&gt;
- FundFina pre-approval entity/repository, HyperTrack key entity/repository,&lt;br /&gt;
  affiliate Click entity/repository&lt;br /&gt;
- Speqtra SMS constant; aramex.tracking.url keys&lt;br /&gt;
- PAYU PAY entry in payment-options.json&lt;br /&gt;
&lt;br /&gt;
Gateway.MANDII and Gateway.FUNDFINA stay: historical fofo.payment rows.&lt;/div&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/Click.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/FundFinaPreApproval.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/HypertrackKey.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/dtr/HyperTrackKeyModel.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/thriwe&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/CsServiceImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/ClickRepository.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/ClickRepositoryImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/FundFinaPreApprovalRepository.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/FundFinaPreApprovalRepositoryImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/HypertrackKeyRepository.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/HypertrackKeyRepositoryImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/dtdc&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/OtpProcessor.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/thriwe&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/BAGService.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/model/BAGInsuranceModel.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/model/BrandModel.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/model/CreateCertificateRequestModel.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/model/CreateCertificateResponseModel.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bharti/model/Sample.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/bluedart&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/kommuno/model&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/kommuno/model/CallDetailModel.java &lt;i&gt;(copied from /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/smartping/model/CallDetailModel.java@37730)&lt;/i&gt;&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/kommuno/model/PushCallLogModel.java &lt;i&gt;(copied from /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/smartping/model/PushCallLogModel.java@37730)&lt;/i&gt;&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/integrations/pinelabs/PinelabsOrderService.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/PineLabsPaymentService.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/smartping&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/spicemoney&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/toffee&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/zest/InsuranceServiceImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/zest/WiseappInsuranceServiceImpl.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/zest/WiseappWebService.java&lt;br /&gt;x /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/zest/ZestResponseModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/resources/META-INF/payment-options.json&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/resources/shared-dev.properties&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/resources/shared-prod.properties&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/resources/shared-staging.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37731&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37731&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:32:52 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37730 – Remove dead third-party integrations: common  Part of the integrations ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: common&lt;br /&gt;
&lt;br /&gt;
Part of the integrations cleanup across all modules. Nothing here had a&lt;br /&gt;
live caller.&lt;br /&gt;
&lt;br /&gt;
- Snapdeal product-page parser and UserMessagePojo (affiliate live pricing)&lt;br /&gt;
- FundFina request/response DTOs (inbound lender API, removed)&lt;br /&gt;
- Aramex XML tracking client (only reachable via /track provider=2)&lt;br /&gt;
- WiseApp insurance model&lt;br /&gt;
- URL constants for PayU, the SmartPing caller-ID hook, affiliate clicks and&lt;br /&gt;
  live pricing; the SmartPing agent map&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/UserMessagePojo.java&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/WiseAppInsuaranceModel.java&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/AramexTrackingService.java&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/fundfina&lt;br /&gt;x /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/services/SnapdealProductPageParser.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37730&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37730&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:31:43 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37729 – lead: one workable lead per mobile, with a 6-month supersede ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 13 file(s) modified&lt;/strong&gt;&lt;br/&gt;lead: one workable lead per mobile, with a 6-month supersede and an L2+ override&lt;br /&gt;
&lt;br /&gt;
There was no choke point for lead creation. Ten sites did `new Lead()` across four&lt;br /&gt;
modules -- three in web&apos;s LeadController, two in V2FofoLeadController, three in fofo&apos;s&lt;br /&gt;
LeadController, one in TrialServiceImpl and one in the cron LeadSyncRunner -- and only&lt;br /&gt;
ONE of them (fofo /createLead) checked for an existing lead at all. Result on live data:&lt;br /&gt;
5,137 mobiles carrying duplicate leads over 12,156 rows, worst case 29 on one number,&lt;br /&gt;
and two agents unknowingly working the same shop.&lt;br /&gt;
&lt;br /&gt;
THE RULE, in new LeadCreationService, which all ten now route through:&lt;br /&gt;
&lt;br /&gt;
  no active lead on the number      -&gt; create&lt;br /&gt;
  active, last activity &gt;= 6 months -&gt; retire the old one, create the new one, SILENTLY&lt;br /&gt;
  active, last activity &amp;lt;  6 months -&gt; BLOCK; only an L2+ user may override&lt;br /&gt;
&lt;br /&gt;
Active = status in (pending, followUp) AND the assignee is still an active auth_user.&lt;br /&gt;
Last activity = GREATEST(lead.updated/created, MAX(lead_activity.created)).&lt;br /&gt;
&lt;br /&gt;
The stale branch is deliberately quiet. A shop enquiring again after six months is a&lt;br /&gt;
handover, not a clash, and mailing on it would train the desk to ignore the alert -- so&lt;br /&gt;
only a genuine collision notifies. Live split: 195 stale against 1,241 fresh, and roughly&lt;br /&gt;
three blocks a month.&lt;br /&gt;
&lt;br /&gt;
WHY &quot;ACTIVE&quot; ALSO MEANS A LIVE OWNER&lt;br /&gt;
&lt;br /&gt;
331 open leads are assigned to 11 DEACTIVATED accounts (157 to &lt;a href=&quot;mailto:sm@smartdukaan.com&quot;&gt;sm@smartdukaan.com&lt;/a&gt; alone,&lt;br /&gt;
whose newest lead is from 2022). Counting them as active would block fresh enquiries&lt;br /&gt;
behind an account nobody can log in to and therefore nobody can close. Requiring a live&lt;br /&gt;
owner defuses all 331 without retiring a single row. Retirement here is only ever&lt;br /&gt;
REACTIVE -- triggered by a new entry on the same number. Nothing runs on a schedule.&lt;br /&gt;
&lt;br /&gt;
ASSUMPTION worth flagging: a superseded lead becomes status=notInterested (stage DROPPED)&lt;br /&gt;
with closure_timestamp and reason &apos;Superseded after 6 months inactivity&apos;, rather than a&lt;br /&gt;
new `expired` status. &quot;Closed&quot; is an explicit allow-list in the UI --&lt;br /&gt;
Arrays.asList(notInterested, finalized) at V2FofoLeadController:150 and fofo&lt;br /&gt;
LeadController:313 -- and there are ~107 references to specific LeadStatus values, so a&lt;br /&gt;
new enum value would make these leads vanish from BOTH the open and closed screens.&lt;br /&gt;
Stage DROPPED keeps the nuance (the shop never said no) and still maps to notInterested&lt;br /&gt;
via LeadStage.toLegacyStatus().&lt;br /&gt;
&lt;br /&gt;
OVERRIDE is L2+ in ANY team, not Call Center only: Sales L1 owns 1,063 of the 1,776 open&lt;br /&gt;
leads, so a Call-Center-only gate would funnel every team&apos;s collisions through three&lt;br /&gt;
people. The MAIL still goes to Call Center L2+, resolved from cs.position at send time&lt;br /&gt;
rather than hardcoded. An override is a TAKEOVER -- it closes the existing lead -- because&lt;br /&gt;
a second live lead is the exact thing the rule exists to prevent.&lt;br /&gt;
&lt;br /&gt;
UNATTENDED CALLERS (cron sync, CSV upload, trial registration, AI intake) have nobody to&lt;br /&gt;
offer an override to, so they use createUnattended: skip the colliding row and mail the&lt;br /&gt;
desk rather than throwing. CSV reports imported/duplicateSkipped/duplicateMobiles back to&lt;br /&gt;
the operator instead of failing the whole file over one number.&lt;br /&gt;
&lt;br /&gt;
ALSO FIXES selectByMobileNumber, which called getSingleResult and therefore threw&lt;br /&gt;
NonUniqueResultException on any mobile with more than one lead -- GlitchTip #99 and #1359,&lt;br /&gt;
both still firing. It now prefers the open lead, then the most recently touched.&lt;br /&gt;
&lt;br /&gt;
NOT INCLUDED, deliberately: no DB unique constraint. 10 mobiles already carry more than&lt;br /&gt;
one open lead and would have to be resolved by hand first, which conflicts with the&lt;br /&gt;
no-auto-retirement rule. The service enforces the invariant going forward.&lt;br /&gt;
&lt;br /&gt;
NEEDS A DBA STEP: user.lead.mobile is unindexed on 37,580 rows, so this check is a full&lt;br /&gt;
scan on every create. Index DDL is in the accompanying note; it has NOT been applied.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CreateRefferalRequest.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepositoryImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateDecision.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateNotifier.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/TrialServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoLeadController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37729&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37729&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:18:41 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37728 – logging: stop three non-defects reporting to the error board as ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 10 file(s) modified&lt;/strong&gt;&lt;br/&gt;logging: stop three non-defects reporting to the error board as ERROR&lt;br /&gt;
&lt;br /&gt;
log4j2.xml ships ERROR and above to GlitchTip, so the log level IS the filter.&lt;br /&gt;
Three sources of ordinary, expected behaviour were logging at ERROR and between&lt;br /&gt;
them accounted for 51,244 events -- 43% of the whole board -- none of them a bug.&lt;br /&gt;
GlobalExceptionHandler already logs ProfitMandiBusinessException at WARN and is&lt;br /&gt;
unchanged; every leak below bypassed it.&lt;br /&gt;
&lt;br /&gt;
1. Session state (27,302 events, 23% of the board). CookiesProcessor and the two&lt;br /&gt;
   interceptors logged a missing or expired cookie at ERROR. A logged-out or&lt;br /&gt;
   anonymous visitor is the normal case -- the code already handles it by&lt;br /&gt;
   redirecting to /login or returning 403 -- and each of these sits in a class&lt;br /&gt;
   whose surrounding lines already log at DEBUG. These never reach the handler,&lt;br /&gt;
   which is why its WARN-level treatment never applied. Now DEBUG.&lt;br /&gt;
&lt;br /&gt;
2. Client disconnect (19,349 events). There was no handler for it, so a client&lt;br /&gt;
   hanging up mid-response fell through to @ExceptionHandler(Exception.class) and&lt;br /&gt;
   was recorded as an unhandled server bug. Adds an IOException handler to both&lt;br /&gt;
   GlobalExceptionHandlers that logs a disconnect at DEBUG and everything else at&lt;br /&gt;
   ERROR with its 500 intact.&lt;br /&gt;
&lt;br /&gt;
   ⚠ ClientAbortException CANNOT be imported here: catalina is provided by the&lt;br /&gt;
   container and is not on either module&apos;s compileClasspath (verified against&lt;br /&gt;
   the configuration, not assumed). The match is therefore on the simple class&lt;br /&gt;
   name plus the &quot;broken pipe&quot;/&quot;connection reset&quot; messages, walked down the cause&lt;br /&gt;
   chain. A genuine IOException matches none of those and keeps its ERROR.&lt;br /&gt;
&lt;br /&gt;
   The handler returns null for a disconnect rather than a body: the connection&lt;br /&gt;
   that would carry it is already closed, and writing to it is what raised the&lt;br /&gt;
   exception. Null is the supported way to say &quot;handled, no body&quot; --&lt;br /&gt;
   HttpEntityMethodProcessor marks the request handled before reading the value.&lt;br /&gt;
&lt;br /&gt;
3. Business exceptions re-logged at ERROR (11 sites). Each catches a&lt;br /&gt;
   ProfitMandiBusinessException, logs it, and CONTINUES with a fallback -- a&lt;br /&gt;
   missing wallet history defaults to an empty list, a user not found by primary&lt;br /&gt;
   email is retried against the secondary. That is an expected outcome being&lt;br /&gt;
   reported as a failure, and logging it at ERROR pre-empted the handler that&lt;br /&gt;
   would have logged it at WARN. Now WARN.&lt;br /&gt;
&lt;br /&gt;
Selenium/WebDriver (58,776 events) is deliberately untouched: that is a genuinely&lt;br /&gt;
broken ChromeDriver, and muting it would hide Oppo/Realme IMEI activation failing.&lt;br /&gt;
It looks like noise only because one broken thing repeated 52,000 times.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/GlobalExceptionHandler.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoginController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/WalletController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/interceptor/AuthenticationInterceptor.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/interceptor/RoleInterceptor.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/util/CookiesProcessor.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/AddressController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/BrandController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/GlobalExceptionHandler.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoWalletController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37728&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37728&amp;peg=37733</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:14:21 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37727 – Fixed mail sender everywhere</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fixed mail sender everywhere&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/transaction/Order.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37727&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37727&amp;peg=37733</guid></item>
<item><pubDate>Sat, 19 Sep 2026 16:08:32 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37726 – sentry: stop developer laptops reporting to the live GlitchTip board ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;sentry: stop developer laptops reporting to the live GlitchTip board&lt;br /&gt;
&lt;br /&gt;
GlitchTip #586 was 57 events tagged environment=production whose stack read&lt;br /&gt;
/opt/homebrew/Cellar/tomcat@8/8.5.100/libexec/... with server_name set to a&lt;br /&gt;
developer&apos;s machine. Nothing was wrong on prod: a laptop was posting into the&lt;br /&gt;
production project and was indistinguishable from it.&lt;br /&gt;
&lt;br /&gt;
Two things combined to allow that. The DSN lives in log4j2.xml, which ships inside&lt;br /&gt;
every build, so any machine running this code can report. And the Sentry SDK&lt;br /&gt;
defaults `environment` to &quot;production&quot; when it is not set -- which it never was --&lt;br /&gt;
so local runs arrived pre-labelled as prod.&lt;br /&gt;
&lt;br /&gt;
Adds sentry.properties to each module, read off the classpath by the SDK itself&lt;br /&gt;
(io.sentry.config.PropertiesProviderFactory) and merged over the appender&apos;s config.&lt;br /&gt;
Both keys used here are honoured by io.sentry.ExternalOptions in 7.22.6 (verified&lt;br /&gt;
against the jar): `enabled` and `environment`.&lt;br /&gt;
&lt;br /&gt;
The COMMITTED values are the safe ones -- enabled=false, environment=dev -- so a&lt;br /&gt;
plain local build is silent. build.gradle rewrites both from -Penv= alongside the&lt;br /&gt;
env.property it already writes, so only a deliberate -Penv=staging|prod build&lt;br /&gt;
reports, and it carries the right environment tag. tasks.build.doLast restores the&lt;br /&gt;
safe default afterwards, mirroring the existing handling of env.property.&lt;br /&gt;
&lt;br /&gt;
Verified both directions: default build leaves enabled=false/environment=dev,&lt;br /&gt;
-Penv=prod yields enabled=true/environment=prod.&lt;br /&gt;
&lt;br /&gt;
Note this makes the board trustworthy rather than merely quieter: events can now be&lt;br /&gt;
filtered on environment, and anything unlabelled is a build that predates this.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;+ /trunk/profitmandi-cron/src/main/resources/sentry.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/build.gradle&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/resources/sentry.properties&lt;br /&gt;~ /trunk/profitmandi-web/build.gradle&lt;br /&gt;+ /trunk/profitmandi-web/src/main/resources/sentry.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37726&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37726&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 19:33:24 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37725 – Fixed mail sender everywhere</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fixed mail sender everywhere&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37725&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37725&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 18:15:09 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37724 – chore(hot-deals): restore 5 catalogs to OEM brand, add POCO M7 ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;chore(hot-deals): restore 5 catalogs to OEM brand, add POCO M7 Plus 5G (4GB 128GB)_s to Hot Deal&lt;br /&gt;
&lt;br /&gt;
Applied on hadb1 2026-09-18. Removed 1025252/1025253 (Samsung A06) and&lt;br /&gt;
1026085/1026403/1026408 (Refurbished iPhones) via _hot_deal_brand_freeze;&lt;br /&gt;
added catalog 1026568 (item 40832) with freeze + scope rows.&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/hot_deal_brand_remove_5_catalogs_20260918.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37724&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37724&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 17:14:53 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37723 – Bulk-uploaded movement rows are validated on screen; popup shows arriving ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;Bulk-uploaded movement rows are validated on screen; popup shows arriving stock per PO&lt;br /&gt;
&lt;br /&gt;
Bulk upload only fills the PO screen - the PO is created from the screen. It used to price&lt;br /&gt;
with resolvePrices(qty), so one row over what could move rejected the whole file. It now prices&lt;br /&gt;
from describeAvailability (same cost layer order creation uses) and never refuses on quantity:&lt;br /&gt;
over-cap rows turn red on render, createPO blocks while any row is red and lists them, and&lt;br /&gt;
the server checks again on create. An item with no stock and nothing arriving still fails&lt;br /&gt;
the upload (nothing to price).&lt;br /&gt;
&lt;br /&gt;
Popup reads in stock + arriving (per PO, &amp;lt;- supplier) - promised (per PO) = can move; the&lt;br /&gt;
&apos;Of these, still to arrive&apos; line is gone. Tests for the Oppo A6 UP-&gt;Noida case. jsVersion 433.&lt;br /&gt;
Needs dao r37722.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/PurchaseOrderController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37723&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37723&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 17:14:46 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37722 – Movement PO availability: list stock arriving into the sending warehouse, ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Movement PO availability: list stock arriving into the sending warehouse, per PO&lt;br /&gt;
&lt;br /&gt;
The popup showed in stock, promised and can-move, but not stock on its way in once it was&lt;br /&gt;
fully promised - so UP to Noida read &apos;in stock 0, promised 4, can move 0&apos; with the 4 units&lt;br /&gt;
arriving on PO 54031 nowhere, and looked wrong. It now reads as a sum:&lt;br /&gt;
in stock + arriving - promised = can move.&lt;br /&gt;
&lt;br /&gt;
- selectOpenInboundPurchases: open POs into the warehouse, one row per PO, same filter as the&lt;br /&gt;
  pending-stock layer so the rows add up to the arriving total&lt;br /&gt;
- InternalMovementAvailabilityModel: arrivingTotal (before holds) + arriving breakup;&lt;br /&gt;
  inbound (after holds) unchanged, still used by the refusal message&lt;br /&gt;
- describeAvailability (single + batch) carries both; batch doc: quantities are no longer&lt;br /&gt;
  checked at bulk upload, the screen flags them and order creation enforces them&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/InternalMovementAvailabilityModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/MovementCommitmentModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37722&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37722&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 16:39:30 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37721 – fix(orders): price each order by the cart line that asked ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(orders): price each order by the cart line that asked for it, not the first line of its model&lt;br /&gt;
&lt;br /&gt;
Orders were priced from one cart line per catalog, so colours of one model at different&lt;br /&gt;
prices all took an arbitrary one. Internal movements (cost layers) failed with WLT_1000&lt;br /&gt;
when the dearer line won and were silently under-billed when the cheaper one did.&lt;br /&gt;
fulfillQty now prices from the item&apos;s own line, newColorQty from the model&apos;s any-colour&lt;br /&gt;
line; same-price output is unchanged. Refuse the transaction if orders do not total the cart.&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/OrderLineAllocator.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/test/java/com/spice/profitmandi/service/transaction/OrderLineAllocatorTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37721&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37721&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 15:58:28 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37720 – today po rbm view showing only for l7 and above</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;today po rbm view showing only for l7 and above&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/MonitorController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37720&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37720&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 15:37:40 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37719 – feat(po): show only allocated warehouse as &apos;To Warehouse&apos; on open ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(po): show only allocated warehouse as &apos;To Warehouse&apos; on open PO list, drop generic buyer label&lt;/div&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-open-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37719&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37719&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 15:26:40 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37718 – feat(po): show allocated warehouse name and id under buyer on ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(po): show allocated warehouse name and id under buyer on open PO list&lt;/div&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-open-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37718&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37718&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 14:46:30 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37717 – today po rbm view showing only for l7 and above</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;today po rbm view showing only for l7 and above&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/MonitorController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37717&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37717&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 13:27:06 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37716 – today po rbm view showing only for l7 and above</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;today po rbm view showing only for l7 and above&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/MonitorController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37716&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37716&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 05:07:16 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37715 – SD credit: stop read paths writing utilized_limit - the SD ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;SD credit: stop read paths writing utilized_limit - the SD Credit admin page and V2 getLoans mutated managed SDCreditRequirement entities to show recomputed utilization, so Hibernate dirty-checking flushed an UPDATE per partner at commit; fofo now feeds the view from display maps and getLoans detaches before the display write, leaving output identical&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/SDCreditRequirementRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/SDCreditRequirementRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/SDCreditController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/sd-credit-requirement-row.vm&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoSDCreditController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37715&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37715&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 05:05:16 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37714 – test(warehouse): receiving on an order raised before lines carried an ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;test(warehouse): receiving on an order raised before lines carried an origin still records the vendor&lt;/div&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InventoryCostLayerTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37714&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37714&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 05:05:15 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37713 – fix(warehouse): record the order&apos;s own vendor when a receipt line ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(warehouse): record the order&apos;s own vendor when a receipt line carries no origin&lt;br /&gt;
&lt;br /&gt;
- r37694 took the origin only from lineitem.origin_vendor_id, which exists on orders raised from that revision onward, so goods arriving on older open orders landed with a cost but no vendor - 282 rows on the first day&lt;br /&gt;
- A purchase from an outside vendor now falls back to that supplier; internal movements are unchanged and an unknowable origin still stays NULL&lt;br /&gt;
- sql/backfill_receipt_origin_20260918.sql repairs the 282 already received (run on prod 2026-09-18; bak warehouse._bak_receipt_origin_20260918); in-stock unknown 895 -&gt; 648&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/WarehouseServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/backfill_receipt_origin_20260918.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37713&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37713&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 05:01:25 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37712 – Fix the fofo test profile, which had been failing every ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix the fofo test profile, which had been failing every context-loading test&lt;br /&gt;
&lt;br /&gt;
The test resources carry their own META-INF/dev.properties and it shadows the main one on the&lt;br /&gt;
classpath, so anything missing from it is simply unresolvable when a context is built for a test.&lt;br /&gt;
It had drifted 23 keys behind - among them prod - and a single unresolvable placeholder stops the&lt;br /&gt;
whole context. Every test that loads one failed on mailOutboxService with &apos;Could not resolve&lt;br /&gt;
placeholder prod&apos;, which read like a broken bean and was really a stale file. Missing keys copied&lt;br /&gt;
from the dev profile.&lt;br /&gt;
&lt;br /&gt;
InventoryCostLayerTest could then run for the first time since, and two of its cases still&lt;br /&gt;
described the old rules. Expected receipts can now be ordered against, so the inbound case asserts&lt;br /&gt;
a price rather than a refusal. A line stops reserving stock once its order moves past being&lt;br /&gt;
submitted for processing, so the raw unfulfilled quantity is now an upper bound: the held figure is&lt;br /&gt;
checked against what the commitments query reports, rather than by restating its SQL in the test.&lt;br /&gt;
&lt;br /&gt;
7 of 7 pass.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InventoryCostLayerTest.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/resources/META-INF/dev.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37712&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37712&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:54:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37711 – Bulk-uploaded PO rows show the same availability breakdown as hand-picked ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Bulk-uploaded PO rows show the same availability breakdown as hand-picked ones&lt;br /&gt;
&lt;br /&gt;
A row added by hand showed what the warehouse holds, what older orders have promised and how many&lt;br /&gt;
units the order could take; the same row arriving from a bulk upload showed none of it. The file&lt;br /&gt;
was the one place the numbers behind a quantity were hidden, which is the case where a mistake is&lt;br /&gt;
least visible and hardest to unpick afterwards.&lt;br /&gt;
&lt;br /&gt;
describeAvailability now also answers for a list of items. Both reads it needs already took a&lt;br /&gt;
list, so a whole file costs the same two queries a single item does rather than two per row. An&lt;br /&gt;
item the warehouse holds nothing of is left out of the result instead of failing the upload - its&lt;br /&gt;
quantity is still checked when the order is priced, and the row simply shows no breakdown.&lt;br /&gt;
&lt;br /&gt;
The single-item and batch paths build their answer from one shared method, so the two cannot drift&lt;br /&gt;
apart, and the screen reuses the renderer it already had.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceImpl.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/java/com/spice/profitmandi/web/controller/warehouse/PurchaseOrderController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse-purchase.js&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37711&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37711&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:51:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37710 – Closing a movement PO now cancels its orders, and refuses ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Closing a movement PO now cancels its orders, and refuses if any has already shipped&lt;br /&gt;
&lt;br /&gt;
A movement is a purchase order and a transaction raised as one, but closing only ever ended the&lt;br /&gt;
PO. Its orders stayed live, still able to dispatch stock against an order nobody was going to&lt;br /&gt;
receive - the same split that let PO/07-26/52029 ship and invoice goods its PO could never take.&lt;br /&gt;
r37709 closed the PO when the last order was cancelled; this is the other direction.&lt;br /&gt;
&lt;br /&gt;
Before cancelling anything it checks every order on the transaction. If one has moved past being&lt;br /&gt;
submitted for processing its stock is billed or already gone, and cancelling would write off a&lt;br /&gt;
movement that physically happened - so the close is refused, naming the order and its status,&lt;br /&gt;
rather than quietly reversing a real dispatch. Rare, but not impossible.&lt;br /&gt;
&lt;br /&gt;
External vendor POs are untouched: they carry no transaction, so the check returns immediately.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/PurchaseOrderController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37710&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37710&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:37:25 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37709 – Cancelling a movement&apos;s last order now closes its purchase order ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Cancelling a movement&apos;s last order now closes its purchase order&lt;br /&gt;
&lt;br /&gt;
An internal movement is raised as a purchase order and a transaction together, but only the&lt;br /&gt;
transaction was ever cancelled. The PO stayed open and read as live work until the auto-close&lt;br /&gt;
sweep aged it out days later - and that sweep writes CLOSED, which is what a PO that actually&lt;br /&gt;
received its stock gets. Eight movements raised between 15 and 17 September sat this way, 59&lt;br /&gt;
units and Rs 10.68 lakh, every one cancelled the same day it was raised because the model or&lt;br /&gt;
colour was discontinued.&lt;br /&gt;
&lt;br /&gt;
refundOrder now pre-closes the movement PO once every order on its transaction is refunded -&lt;br /&gt;
every one, because a transaction can carry several and the movement is only over when the last&lt;br /&gt;
goes. PRECLOSED, not CLOSED: nothing was received, and the difference is what keeps it&lt;br /&gt;
distinguishable from a real completion in every report that reads the status.&lt;br /&gt;
&lt;br /&gt;
Refunds reaching here are already validated as never billed, so no dispatched stock is involved&lt;br /&gt;
and nothing is closed out from under stock in transit. Both lookups it needs already existed.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/OrderRepositoryImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37709&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37709&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:26:13 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37708 – Migration: state the algorithm and lock mode, and why it ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;Migration: state the algorithm and lock mode, and why it runs before the release&lt;br /&gt;
&lt;br /&gt;
hadb1 is MySQL 5.7, so adding a column rebuilds the table rather than only touching metadata.&lt;br /&gt;
At ~53k rows that is seconds and InnoDB permits concurrent reads and writes throughout, but&lt;br /&gt;
ALGORITHM/LOCK are now stated explicitly so it fails loudly rather than quietly taking a table&lt;br /&gt;
lock if that ever stops holding.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/resources/sql/add_po_reopened_at_20260918.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37708&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37708&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:21:02 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37707 – GRN price mismatch: say which PO the invoice will be ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;GRN price mismatch: say which PO the invoice will be received against, and what to do if it closes first&lt;br /&gt;
&lt;br /&gt;
Resolving a price mismatch discards the PO line and raises a replacement dated to the invoice. That&lt;br /&gt;
replacement is what the invoice is received against, so it is the one that has to stay open long&lt;br /&gt;
enough for the stock to arrive - and it closes on its own after four days for a movement, six for a&lt;br /&gt;
vendor order. Until now nothing said so: the GRN simply stopped matching and the correction sat&lt;br /&gt;
holding stock that had already arrived.&lt;br /&gt;
&lt;br /&gt;
The confirmation now states what is about to happen and what to do if the stock lands late, and the&lt;br /&gt;
request screen explains what Po Id is. Reopening is offered only where it exists - a movement can be&lt;br /&gt;
reopened from Purchase Orders, a vendor order cannot and needs a fresh PO.&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/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-grn-request-items.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37707&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37707&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:20:00 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37706 – cart: take the cart row before any line, to break ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;cart: take the cart row before any line, to break a lock-ordering deadlock&lt;br /&gt;
&lt;br /&gt;
InnoDB was rolling back cart edits with &quot;Deadlock found when trying to get lock&quot;&lt;br /&gt;
(GlitchTip #53, 27 deadlocks) and losing others to OptimisticLockException&lt;br /&gt;
&quot;actual row count: 0; expected: 1&quot; (11 issues, 42 events). Both are the same cause.&lt;br /&gt;
&lt;br /&gt;
Two request paths took the same two rows in OPPOSITE orders. Adding a line INSERTs&lt;br /&gt;
into user.line, and line_cart_id_fk shared-locks the parent cart FIRST, line second.&lt;br /&gt;
Validation/hydration mutated the line rows FIRST and wrote cart.total_price second.&lt;br /&gt;
Run those concurrently on one cart and it is a cycle. Caught in the act on prod:&lt;br /&gt;
&lt;br /&gt;
  T1: INSERT user.line (cart_id=175180781)  -&gt; holds S on cart, waits S on line&lt;br /&gt;
  T2: UPDATE user.cart SET total_price=269340.0, version=175 WHERE version=174&lt;br /&gt;
                                            -&gt; holds X on line, waits X on cart&lt;br /&gt;
  *** WE ROLL BACK TRANSACTION (1)&lt;br /&gt;
&lt;br /&gt;
Fix is to give every mutating path one order: cart, then lines. CartRepository gains&lt;br /&gt;
selectByIdForUpdate, and it is called as the first statement of each path that writes&lt;br /&gt;
a cart line. Re-taking it inside one request is a no-op.&lt;br /&gt;
&lt;br /&gt;
A lock-ordering fix is all-or-nothing -- one path in the wrong order is enough to&lt;br /&gt;
re-form the cycle -- so this covers ALL TEN cart-line writers, not just the two that&lt;br /&gt;
happened to show up in the stack traces: createCartItem, clearCart, getCartValidation,&lt;br /&gt;
addItemsToCart (x2), addShoppingBag, validateForOpen (x2) and V2BillingController&apos;s&lt;br /&gt;
bind/unbindInsurance. The audit is worth re-running before adding another writer.&lt;br /&gt;
&lt;br /&gt;
Note validateForOpen and getCartValidation WRITE despite their names (they correct&lt;br /&gt;
cart_line quantity/price and roll up cart.total_price), which is why a &quot;validate&quot; call&lt;br /&gt;
was ever holding write locks. The lock is placed accordingly; making those genuinely&lt;br /&gt;
read-only is a separate, larger change.&lt;br /&gt;
&lt;br /&gt;
This also serialises concurrent edits to the SAME cart, which is what the @Version&lt;br /&gt;
column on Cart was already trying and failing to express. Different carts are&lt;br /&gt;
different rows, so there is no cost across partners.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/v2/CartValidationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2BillingController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37706&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37706&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:19:28 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37705 – PO list: show the transaction id so a movement can ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;PO list: show the transaction id so a movement can be found from the invoice being received&lt;br /&gt;
&lt;br /&gt;
An internal movement is raised as a transaction, so the invoice on the GRN desk leads straight back to its PO&lt;br /&gt;
through that id. The list is a DataTable, so having the column makes it searchable - which is how someone finds&lt;br /&gt;
the PO to reopen when a receipt arrives after auto-close, instead of hunting through date ranges.&lt;br /&gt;
&lt;br /&gt;
Placed after Status so existing column positions are unchanged.&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/WEB-INF/views/ftl/warehouse-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37705&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37705&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:18:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37704 – Reopen a movement PO whose stock arrived late, and stop ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;Reopen a movement PO whose stock arrived late, and stop stranding GRN price corrections&lt;br /&gt;
&lt;br /&gt;
Internal movements auto-close after four days, which fits 99.6% of them - 5,491 of 5,515 receipts&lt;br /&gt;
land inside the window. The remainder leave the PO closed with the stock still in transit and&lt;br /&gt;
nowhere to receive it: 998 internal POs closed during 2026 still holding 21,996 unreceived units.&lt;br /&gt;
&lt;br /&gt;
A closed movement PO can now be reopened from the purchase order list. Reopening stamps&lt;br /&gt;
reopenedAt, and auto-close measures from WarehousePurchaseOrder.getOpenSince() - reopenedAt when&lt;br /&gt;
set, the PO date otherwise - so a reopened PO gets the same fresh window a new one gets instead of&lt;br /&gt;
being closed straight back on the next sweep. Only movements between our own warehouses: an&lt;br /&gt;
external vendor PO that has closed is settled with that vendor, not reopened unilaterally.&lt;br /&gt;
&lt;br /&gt;
Separately, a GRN price correction now checks that the PO it just raised is one the invoice can&lt;br /&gt;
actually be received against. Matching reads POs that are open and approved for the same supplier&lt;br /&gt;
and warehouse dated on or before the invoice; it never looks at the PO being corrected, so what&lt;br /&gt;
matters is that the new PO is receivable. 54 were not - backdated into INIT by the old approval&lt;br /&gt;
gate, hence outside the match - and each stranded silently: original line discarded, GRN completed&lt;br /&gt;
without it, the correction left holding a reservation for stock that had already arrived.&lt;br /&gt;
&lt;br /&gt;
isOpen() names the open set - INIT, READY, PARTIALLY_FULFILLED - that the movement and commitment&lt;br /&gt;
queries already read.&lt;br /&gt;
&lt;br /&gt;
Migration sql/add_po_reopened_at_20260918.sql adds reopenedAt, nullable and additive. It must run&lt;br /&gt;
before this ships: the entity maps the column.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/purchaseorder/POScheduler.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehousePurchaseOrder.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/GrnRequestServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/add_po_reopened_at_20260918.sql&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/PurchaseOrderController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37704&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37704&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:10:51 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37703 – GRN price mismatch: ask for the original PO to be ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;GRN price mismatch: ask for the original PO to be reopened instead of stranding a correction PO&lt;br /&gt;
&lt;br /&gt;
Resolving a price mismatch raised a correction PO dated to the supplier invoice, and stored its id&lt;br /&gt;
on the GRN request item to receive against. But by then the stock has already arrived and the PO it&lt;br /&gt;
corrects is closed - every one of the 54 raised this way had its mapped PO in CLOSED. The&lt;br /&gt;
correction therefore had nowhere to land: the GRN completed against the original, nothing was ever&lt;br /&gt;
received against the correction, and it sat holding a reservation for stock that was not coming.&lt;br /&gt;
Backdated by nature, it also parked in INIT under the old approval gate, so it could not have been&lt;br /&gt;
received even if anyone tried.&lt;br /&gt;
&lt;br /&gt;
Resolving a mismatch against a closed PO now says so and names it, asking for that purchase order&lt;br /&gt;
to be reopened first, rather than silently creating a second PO that cannot be used.&lt;br /&gt;
&lt;br /&gt;
WarehousePurchaseOrder.isOpen() names the open set - INIT, READY, PARTIALLY_FULFILLED - that the&lt;br /&gt;
movement and commitment queries already read, so it stops being restated per caller.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehousePurchaseOrder.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/GrnRequestServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37703&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37703&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 04:06:59 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37702 – Internal movement: an unapproved PO no longer dispatches stock  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;Internal movement: an unapproved PO no longer dispatches stock&lt;br /&gt;
&lt;br /&gt;
A PO raised on one of our own warehouses also raises the order that moves the stock, and that&lt;br /&gt;
order pays and processes immediately - so raising it ships goods. The approval gate never&lt;br /&gt;
governed that half. It set the PO to INIT and mailed an approval link, then created and processed&lt;br /&gt;
the order anyway, several lines later and without consulting the status it had just set. The gate&lt;br /&gt;
held back receiving - PO list, GRN matching, auto-close all skip INIT - while dispatch went ahead&lt;br /&gt;
unconditionally.&lt;br /&gt;
&lt;br /&gt;
That is how PO/07-26/52029 was delivered and invoiced while frozen out of GRN. Its goods had to be&lt;br /&gt;
received against a second PO raised for the purpose, leaving the first holding a phantom&lt;br /&gt;
unfulfilled quantity for two months.&lt;br /&gt;
&lt;br /&gt;
Order creation now waits on approval. WarehousePurchaseOrder.isApproved() names the rule once -&lt;br /&gt;
INIT is the only state before approval, every other state is something the order has already been&lt;br /&gt;
approved to do - matching how the PO list, GRN matching and the auto-close sweep already read it,&lt;br /&gt;
so callers stop restating it.&lt;br /&gt;
&lt;br /&gt;
Backdated POs are approved at creation since r37682, so this holds nothing up today; it is what&lt;br /&gt;
keeps the two halves from separating again if any future rule leaves a PO unapproved. Nothing&lt;br /&gt;
raises the order later, so such a PO simply does not move stock and has to be raised again once&lt;br /&gt;
approved - the safe failure, and it is logged.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehousePurchaseOrder.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37702&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37702&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 01:05:24 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37701 – PO create: expected stock counts toward the quantity, popover wording ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;PO create: expected stock counts toward the quantity, popover wording follows&lt;br /&gt;
&lt;br /&gt;
Stock still to arrive is now part of what the order can take, so the breakdown reports it as a&lt;br /&gt;
qualifier on that number rather than as something set aside - &apos;Of these, still to arrive&apos; instead&lt;br /&gt;
of &apos;On the way in (not yet received)&apos;, which read as though it could not be ordered.&lt;br /&gt;
&lt;br /&gt;
Tests follow the two rule changes: expected receipts can be ordered against, a quantity beyond&lt;br /&gt;
what is held and expected together is still refused and says so, and availability counts expected&lt;br /&gt;
receipts toward what can move. 21 tests pass.&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/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37701&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37701&amp;peg=37733</guid></item>
<item><pubDate>Fri, 18 Sep 2026 01:05:17 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37700 – Internal movement: order against expected stock, and stop reserving lines ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Internal movement: order against expected stock, and stop reserving lines that can no longer ship&lt;br /&gt;
&lt;br /&gt;
Two rules changed, both about stock that was being treated as unavailable when it is not.&lt;br /&gt;
&lt;br /&gt;
Stock still to arrive now counts toward what a movement order can be raised for. A movement is&lt;br /&gt;
planned against what the warehouse will hold, so the order is raised now and dispatched once the&lt;br /&gt;
stock lands; previously a warehouse holding only inbound stock refused outright, even though the&lt;br /&gt;
receipt was already on an open order.&lt;br /&gt;
&lt;br /&gt;
A purchase order line stops reserving stock once its own order moves past being submitted for&lt;br /&gt;
processing. Billed or shipped means the units have already come off the shelf; cancelled means&lt;br /&gt;
the line can never dispatch them. Holding either back a second time hid stock that was genuinely&lt;br /&gt;
free - on prod, 660 of 675 reserved units were on lines whose orders had already moved on. A line&lt;br /&gt;
whose order has not been raised at all is still a live promise and keeps its hold, and a line is&lt;br /&gt;
held only for the quantity still sitting in an in-process order, so a partly-shipped order&lt;br /&gt;
releases the rest.&lt;br /&gt;
&lt;br /&gt;
priceFor and describeAvailability continue to read stock through one shared examine(), so what is&lt;br /&gt;
shown while choosing a quantity stays exactly what the order is created against.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/InternalMovementPriceModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37700&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37700&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 22:56:54 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37699 – Fix: movement availability popover rendered empty except the closing note ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Fix: movement availability popover rendered empty except the closing note&lt;br /&gt;
&lt;br /&gt;
The breakdown was built as a table. Bootstrap 3.4.1 sanitizes popover content against a&lt;br /&gt;
whitelist that includes neither table nor its rows and cells, and it removes a non-whitelisted&lt;br /&gt;
element together with everything inside it - so the whole table was dropped and only the note&lt;br /&gt;
survived, leaving a popover that referred to orders that were not shown.&lt;br /&gt;
&lt;br /&gt;
Rebuilt from divs and spans, which are whitelisted. Sanitizing stays on rather than being&lt;br /&gt;
switched off for this popover: the content carries PO numbers and warehouse names read out of&lt;br /&gt;
the database.&lt;br /&gt;
&lt;br /&gt;
Also stops the zero-quantity note pointing at orders that are not there - a warehouse whose&lt;br /&gt;
only stock is still inbound has nothing promised to point at. jsVersion bumped.&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/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-purchase-order-add-item.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37699&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37699&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 22:46:05 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37698 – V2 getPricing: carry internal movement availability alongside the price  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;V2 getPricing: carry internal movement availability alongside the price&lt;br /&gt;
&lt;br /&gt;
Mirrors the fofo change so the two /getPricing endpoints answer alike. V2 is dormant but&lt;br /&gt;
component-scanned, so it has to keep compiling against the service signature.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoVendorController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37698&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37698&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 22:45:53 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37697 – PO create: show what can move, and which orders hold ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;PO create: show what can move, and which orders hold the rest, while the quantity is typed&lt;br /&gt;
&lt;br /&gt;
Picking an item on a movement order already called getPricing, which read the sending&lt;br /&gt;
warehouse&apos;s stock and returned only a price. It now returns the availability too, so the row&lt;br /&gt;
can show it: an info marker beside the quantity box opens the breakdown - in stock, promised&lt;br /&gt;
with each holding order named by PO number and date, anything still arriving, and the quantity&lt;br /&gt;
this order can take.&lt;br /&gt;
&lt;br /&gt;
The quantity box flags the moment what is typed passes that cap, so it is corrected before&lt;br /&gt;
submitting rather than after being refused. The marker turns amber when stock is partly&lt;br /&gt;
promised and red when none can move.&lt;br /&gt;
&lt;br /&gt;
Outside vendors are unaffected: their pricing response carries no availability and their rows&lt;br /&gt;
are left exactly as they were. jsVersion bumped so the screen picks up the new script.&lt;br /&gt;
&lt;br /&gt;
Tests cover the four cases that matter: what can move with orders named, zero movable reported&lt;br /&gt;
rather than refused, this order&apos;s cap kept separate from what the warehouse holds when stock&lt;br /&gt;
came in at two costs, and a warehouse holding none of the item still refusing.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/VendorController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse-purchase.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-purchase-order-add-item.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37697&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37697&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 22:45:33 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37696 – Internal movement: report what a warehouse can actually send, not ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Internal movement: report what a warehouse can actually send, not just refuse on submit&lt;br /&gt;
&lt;br /&gt;
The quantity a movement order can take was only discovered by submitting the order and being&lt;br /&gt;
refused. The stock reading that decides it already computed everything needed to say so in&lt;br /&gt;
advance - what is on the shelf, what older orders have promised, what is still arriving - and&lt;br /&gt;
then discarded it.&lt;br /&gt;
&lt;br /&gt;
selectOpenOutboundCommitments returns those promises one row per order, with the PO number,&lt;br /&gt;
PO date and destination, instead of a single summed quantity. applyOutboundCommitments now&lt;br /&gt;
aggregates those rows and behaves exactly as before, so no extra query is run.&lt;br /&gt;
&lt;br /&gt;
describeAvailability answers with the price plus that working. It shares one stock reading with&lt;br /&gt;
priceFor via examine(), so the cap shown while choosing a quantity and the cap enforced on&lt;br /&gt;
submit cannot drift apart. Unlike pricing it reports rather than refuses: stock that is entirely&lt;br /&gt;
promised comes back as zero movable with the orders holding it named, which is what lets someone&lt;br /&gt;
chase an abandoned order rather than only see a smaller number.&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/InternalMovementAvailabilityModel.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/MovementCommitmentModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37696&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37696&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 18:19:29 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37695 – test(warehouse): cost layer tests; update movement tests for cost-based allocation ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;test(warehouse): cost layer tests; update movement tests for cost-based allocation&lt;br /&gt;
&lt;br /&gt;
- InventoryCostLayerTest: local-DB tests for layers vs stock on hand, movement priced at recorded cost, refusal across costs, promised stock held back, pending inbound offered but not dispatchable, and GRN recording vendor and cost&lt;br /&gt;
- InternalMovementPricingServiceTest: layers now keyed by cost, so same-cost stock moves together and a different cost needs its own order&lt;br /&gt;
- BillingPricingServiceTest: compare against recorded origins rather than the serial-trace source&lt;/div&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/BillingPricingServiceTest.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceTest.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InventoryCostLayerTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37695&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37695&amp;peg=37733</guid></item>
<item><pubDate>Thu, 17 Sep 2026 18:19:28 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37694 – feat(warehouse): record where stock came from and what it cost; ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 11 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): record where stock came from and what it cost; price internal movements at that cost&lt;br /&gt;
&lt;br /&gt;
- inventoryItem.origin_vendor_id / receipt_unit_cost and lineitem.origin_vendor_id (sql/add_inventory_cost_layer_20260917.sql, applied on prod 2026-09-17 in 75s): GRN copies both from the PO line it arrived on, so origin survives any number of hops and non-serialised stock keeps it too. Unknowable origin stays NULL - never a guess, never an internal supplier&lt;br /&gt;
- A movement now moves stock at the cost it was received at, not the origin vendor&apos;s current catalog TP. Layers are grouped by cost; a quantity spanning two costs is refused with both numbers, since a PO line carries one price&lt;br /&gt;
- Stock already promised on open outbound movement orders is no longer offered again (176 item/warehouse pairs on prod are fully promised today)&lt;br /&gt;
- Stock on open inbound POs is offered for planning at that order&apos;s price and reported as &apos;on the way in&apos;, but cannot be dispatched until received; the PO item picker lists those items too&lt;br /&gt;
- Backfill: 4,010 of 4,646 in-stock rows on prod got origin and cost; 636 stay unknown and are priced from the latest approved external catalog price as before&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehouseInventoryItem.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehouseLineItem.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/InternalMovementAllocationModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/InternalMovementPriceModel.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseInventoryItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseLineItemRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/warehouse/WarehouseLineItemRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/InternalMovementPricingServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/WarehouseServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/add_inventory_cost_layer_20260917.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37694&amp;peg=37733</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37694&amp;peg=37733</guid></item>
</channel></rss>