<?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>Wed, 30 Sep 2026 03:29:45 +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=37735</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37735&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Mon, 21 Sep 2026 12:33:58 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37735 – Remove dead third-party integrations: cron  - Toffee: attachToffeeInvoices (schedule ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: cron&lt;br /&gt;
&lt;br /&gt;
- Toffee: attachToffeeInvoices (schedule already commented out), toffeeRollback&lt;br /&gt;
  and the --tc option; tofee.* keys in run.properties&lt;br /&gt;
- Bharti Assist: sendBAGPendingPolicies, testBag/mapBag and the --bag /&lt;br /&gt;
  --mapbag options&lt;br /&gt;
- HyperTrack geofence one-offs (--createGeofence, --getAllGeofences,&lt;br /&gt;
  --deleteGeofences) and their hardcoded account keys&lt;br /&gt;
- SmartPing injection in ScheduledTasks; leftover DTDC comment&lt;br /&gt;
- aramex.tracking.url in run.properties&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/Application.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/migrations/RunOnceTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledSkeleton.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/resources/META-INF/run.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37735&amp;peg=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37735&amp;peg=37735</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:33:57 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37734 – Remove dead third-party integrations: fofo  - SpiceMoney: controller, spiceform.vm, ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 21 file(s) modified&lt;/strong&gt;&lt;br/&gt;Remove dead third-party integrations: fofo&lt;br /&gt;
&lt;br /&gt;
- SpiceMoney: controller, spiceform.vm, logo, the Quick Links popover on&lt;br /&gt;
  analysisDashboard / dashboard-readonly (its button was already commented&lt;br /&gt;
  out in dashboard1.vm) and the /spicemoney/callback auth exclusions&lt;br /&gt;
- FundFina controller and the /fundfina/** auth exclusions&lt;br /&gt;
- Wiseapp: the Quick Links popover on 12dashboard34 (its only entry) and logos&lt;br /&gt;
- SmartPing injection in WebHookController; the Knowlarity webhooks keep&lt;br /&gt;
  working with the models now in kommuno/model&lt;br /&gt;
- Unused Toffee model reference in WarehouseController&lt;br /&gt;
- tofee.* keys, aramex.tracking.url and the PAYU PAY payment option in&lt;br /&gt;
  main and test resources&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/WebConfig.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/WebSecurityConfig.java&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/FundFinaController.java&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/spicemoney&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/WarehouseController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/WebHookController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/payment-options.json&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/resources/META-INF/prod.properties&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/webapp/resources/images/icons/provider-logos/spicemoney.jpg&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/webapp/resources/images/icons/provider-logos/wise.jpeg&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/webapp/resources/images/icons/provider-logos/wiseapp.jpg&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/12dashboard34.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/analysisDashboard.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/dashboard-readonly.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/dashboard1.vm&lt;br /&gt;x /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/spiceform.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/up-sale-call.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/resources/META-INF/dev.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/resources/META-INF/payment-options.json&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/resources/META-INF/prod.properties&lt;br /&gt;~ /trunk/profitmandi-fofo/src/test/resources/META-INF/staging.properties&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37734&amp;peg=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37734&amp;peg=37735</guid></item>
<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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37733&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37732&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37731&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37730&amp;peg=37735</guid></item>
<item><pubDate>Mon, 21 Sep 2026 12:31:43 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37729 – lead: one workable lead per mobile, with a 6-month supersede ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 13 file(s) modified&lt;/strong&gt;&lt;br/&gt;lead: one workable lead per mobile, with a 6-month supersede and an L2+ override&lt;br /&gt;
&lt;br /&gt;
There was no choke point for lead creation. Ten sites did `new Lead()` across four&lt;br /&gt;
modules -- three in web&apos;s LeadController, two in V2FofoLeadController, three in fofo&apos;s&lt;br /&gt;
LeadController, one in TrialServiceImpl and one in the cron LeadSyncRunner -- and only&lt;br /&gt;
ONE of them (fofo /createLead) checked for an existing lead at all. Result on live data:&lt;br /&gt;
5,137 mobiles carrying duplicate leads over 12,156 rows, worst case 29 on one number,&lt;br /&gt;
and two agents unknowingly working the same shop.&lt;br /&gt;
&lt;br /&gt;
THE RULE, in new LeadCreationService, which all ten now route through:&lt;br /&gt;
&lt;br /&gt;
  no active lead on the number      -&gt; create&lt;br /&gt;
  active, last activity &gt;= 6 months -&gt; retire the old one, create the new one, SILENTLY&lt;br /&gt;
  active, last activity &amp;lt;  6 months -&gt; BLOCK; only an L2+ user may override&lt;br /&gt;
&lt;br /&gt;
Active = status in (pending, followUp) AND the assignee is still an active auth_user.&lt;br /&gt;
Last activity = GREATEST(lead.updated/created, MAX(lead_activity.created)).&lt;br /&gt;
&lt;br /&gt;
The stale branch is deliberately quiet. A shop enquiring again after six months is a&lt;br /&gt;
handover, not a clash, and mailing on it would train the desk to ignore the alert -- so&lt;br /&gt;
only a genuine collision notifies. Live split: 195 stale against 1,241 fresh, and roughly&lt;br /&gt;
three blocks a month.&lt;br /&gt;
&lt;br /&gt;
WHY &quot;ACTIVE&quot; ALSO MEANS A LIVE OWNER&lt;br /&gt;
&lt;br /&gt;
331 open leads are assigned to 11 DEACTIVATED accounts (157 to &lt;a href=&quot;mailto:sm@smartdukaan.com&quot;&gt;sm@smartdukaan.com&lt;/a&gt; alone,&lt;br /&gt;
whose newest lead is from 2022). Counting them as active would block fresh enquiries&lt;br /&gt;
behind an account nobody can log in to and therefore nobody can close. Requiring a live&lt;br /&gt;
owner defuses all 331 without retiring a single row. Retirement here is only ever&lt;br /&gt;
REACTIVE -- triggered by a new entry on the same number. Nothing runs on a schedule.&lt;br /&gt;
&lt;br /&gt;
ASSUMPTION worth flagging: a superseded lead becomes status=notInterested (stage DROPPED)&lt;br /&gt;
with closure_timestamp and reason &apos;Superseded after 6 months inactivity&apos;, rather than a&lt;br /&gt;
new `expired` status. &quot;Closed&quot; is an explicit allow-list in the UI --&lt;br /&gt;
Arrays.asList(notInterested, finalized) at V2FofoLeadController:150 and fofo&lt;br /&gt;
LeadController:313 -- and there are ~107 references to specific LeadStatus values, so a&lt;br /&gt;
new enum value would make these leads vanish from BOTH the open and closed screens.&lt;br /&gt;
Stage DROPPED keeps the nuance (the shop never said no) and still maps to notInterested&lt;br /&gt;
via LeadStage.toLegacyStatus().&lt;br /&gt;
&lt;br /&gt;
OVERRIDE is L2+ in ANY team, not Call Center only: Sales L1 owns 1,063 of the 1,776 open&lt;br /&gt;
leads, so a Call-Center-only gate would funnel every team&apos;s collisions through three&lt;br /&gt;
people. The MAIL still goes to Call Center L2+, resolved from cs.position at send time&lt;br /&gt;
rather than hardcoded. An override is a TAKEOVER -- it closes the existing lead -- because&lt;br /&gt;
a second live lead is the exact thing the rule exists to prevent.&lt;br /&gt;
&lt;br /&gt;
UNATTENDED CALLERS (cron sync, CSV upload, trial registration, AI intake) have nobody to&lt;br /&gt;
offer an override to, so they use createUnattended: skip the colliding row and mail the&lt;br /&gt;
desk rather than throwing. CSV reports imported/duplicateSkipped/duplicateMobiles back to&lt;br /&gt;
the operator instead of failing the whole file over one number.&lt;br /&gt;
&lt;br /&gt;
ALSO FIXES selectByMobileNumber, which called getSingleResult and therefore threw&lt;br /&gt;
NonUniqueResultException on any mobile with more than one lead -- GlitchTip #99 and #1359,&lt;br /&gt;
both still firing. It now prefers the open lead, then the most recently touched.&lt;br /&gt;
&lt;br /&gt;
NOT INCLUDED, deliberately: no DB unique constraint. 10 mobiles already carry more than&lt;br /&gt;
one open lead and would have to be resolved by hand first, which conflicts with the&lt;br /&gt;
no-auto-retirement rule. The service enforces the invariant going forward.&lt;br /&gt;
&lt;br /&gt;
NEEDS A DBA STEP: user.lead.mobile is unindexed on 37,580 rows, so this check is a full&lt;br /&gt;
scan on every create. Index DDL is in the accompanying note; it has NOT been applied.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/leadsync/LeadSyncRunner.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CreateRefferalRequest.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/dtr/LeadRepositoryImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadCreationServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateDecision.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/lead/LeadDuplicateNotifier.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/TrialServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/fofo/V2FofoLeadController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37729&amp;peg=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37729&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37728&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37727&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37726&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37725&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37724&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37723&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37722&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37721&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37720&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37719&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37718&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37717&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37716&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37715&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37714&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37713&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37712&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37711&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37710&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37709&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37708&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37707&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37706&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37705&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37704&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37703&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37702&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37701&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37700&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37699&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37698&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37697&amp;peg=37735</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=37735</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37696&amp;peg=37735</guid></item>
</channel></rss>