<?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>Thu, 08 Oct 2026 00:11:25 +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=37824</link><atom:link href="https://svn.smartdukaan.com/rss.php?peg=37824&amp;repname=SmartDukaan" rel="self" type="application/rss+xml" />
<item><pubDate>Thu, 01 Oct 2026 21:11:48 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37824 – feat(warehouse): add HR Gurugram warehouses 13368/13370/13372 to WAREHOUSE_MAP  HR-NSSPL/GGN, ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): add HR Gurugram warehouses 13368/13370/13372 to WAREHOUSE_MAP&lt;br /&gt;
&lt;br /&gt;
HR-NSSPL/GGN, HR-NSSPL/DL and HR-NSSPL/UPW (seller 21 NSSPL-HR-GGN, 06AACCN9802G2ZI)&lt;br /&gt;
in WAREHOUSE_MAP and WAREHOUSE_NAME_MAP, so the PO / GRN destination lists, vendor&lt;br /&gt;
warehouse lookup, Solr availability fields and warehouse reports include them.&lt;br /&gt;
Labels are the warehouse display names; &apos;HR&apos; stays 7720.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37824&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37824&amp;peg=37824</guid></item>
<item><pubDate>Thu, 01 Oct 2026 21:07:01 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37823 – feat(seller): rebuild Sellers &amp; Warehouses screen; PO supplier filter by ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 12 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(seller): rebuild Sellers &amp; Warehouses screen; PO supplier filter by warehouse; internal warehouse from active sellerwarehouse&lt;br /&gt;
&lt;br /&gt;
Needs dao r37822 and the warehouseaddressmaster.active migration (applied on hadb1).&lt;br /&gt;
&lt;br /&gt;
- Sellers &amp; Warehouses (menu 113): SellerController is now a thin layer over&lt;br /&gt;
  WarehouseSetupService. Seller list; per-seller physical warehouses with internal&lt;br /&gt;
  store / supplier / Dummy / sequences, Active toggle and Change address (internal&lt;br /&gt;
  stores follow); address list with Active toggle; New Address with city, pin,&lt;br /&gt;
  contact and invoice preview; New Seller with GSTIN checks; New Warehouse creates&lt;br /&gt;
  the OURS/BAD vendor 40 + Dummy shape. JSON posts; refusals come back as 400 text.&lt;br /&gt;
- PO create screen: vendor search takes the selected warehouse and lists only&lt;br /&gt;
  suppliers mapped to it (/vendors?warehouseId); changing warehouse clears the vendor.&lt;br /&gt;
- Supplier create/edit: internal warehouse defaults to 0 and is picked from active&lt;br /&gt;
  physical warehouses (transaction.sellerwarehouse.is_active), not WAREHOUSE_MAP;&lt;br /&gt;
  validated on save. Fixes the edit form ticking &quot;Internal Warehouse&quot; for a stored 0&lt;br /&gt;
  and saving the first option (7720), and the create form never sending it.&lt;br /&gt;
- jsVersion 441.&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/SellerController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/SupplierController.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/common.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/seller.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/warehouse.js&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/edit-supplier.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/new-supplier.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/seller-warehouse-container.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/seller.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/warehouse-create-purchase-order.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37823&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37823&amp;peg=37824</guid></item>
<item><pubDate>Thu, 01 Oct 2026 21:06:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37822 – feat(warehouse): physical warehouse setup service, supplier mapping PO guard, address ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 24 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(warehouse): physical warehouse setup service, supplier mapping PO guard, address active flag&lt;br /&gt;
&lt;br /&gt;
- WarehouseSetupService + WarehouseSetupValidator: create seller (state from GSTIN,&lt;br /&gt;
  unique label/GSTIN), address master (city stored last, 6-digit pin, contact),&lt;br /&gt;
  physical warehouse (OURS/BAD vendor 40 + Dummy/G + sellerwarehouse + mapping in&lt;br /&gt;
  one transaction), activate/deactivate (sellerwarehouse.is_active), remap address&lt;br /&gt;
  with internal store sync. Limits follow column sizes (sql_mode is empty).&lt;br /&gt;
- WarehouseAddressMaster.active: only active addresses are offered for assignment.&lt;br /&gt;
  Migration sql/20261001_warehouseaddressmaster_active.sql (applied on hadb1).&lt;br /&gt;
- PO guard: createPurchaseOrder refuses a supplier with no OURS/GOOD vendor&lt;br /&gt;
  warehouse at the destination (GRN could never receive it).&lt;br /&gt;
  InventoryWarehouseRepository.hasGoodSupplierWarehouse / selectSupplierIdsWithGoodWarehouse&lt;br /&gt;
  use existence checks; 67 pairs carry duplicate OURS/GOOD rows.&lt;br /&gt;
- SellerService.syncInternalStoreAddress(store); RetailerServiceImpl syncs an&lt;br /&gt;
  INTERNAL store&apos;s address when it moves warehouse or becomes internal.&lt;br /&gt;
- Record of 2026-10-01 HR Gurugram setup SQL (seller 21, warehouses 13368/13370/13372).&lt;br /&gt;
- Tests: WarehouseSetupValidatorTest (10), WarehouseSetupServiceImplTest (7).&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/transaction/WarehouseAddressMaster.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/warehouse/NewPhysicalWarehouseRequest.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/warehouse/NewSellerRequest.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/warehouse/NewWarehouseAddressRequest.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/warehouse/PhysicalWarehouseView.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/warehouse/WarehouseAddressView.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/inventory/InventoryWarehouseRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/inventory/InventoryWarehouseRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/WarehouseAddressMappingRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/WarehouseAddressMappingRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/SellerService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/SellerServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/user/RetailerServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderService.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/WarehouseSetupService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/WarehouseSetupServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/WarehouseSetupValidator.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/20261001_delete_hrgn1715_hr_uk_store.sql&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/20261001_hr_gurugram_vendor_warehouses.sql&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/20261001_hr_gurugram_virtual_warehouses.sql&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/20261001_warehouseaddressmaster_active.sql&lt;br /&gt;+ /trunk/profitmandi-dao/src/test/java/com/spice/profitmandi/service/warehouse/WarehouseSetupServiceImplTest.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/test/java/com/spice/profitmandi/service/warehouse/WarehouseSetupValidatorTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37822&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37822&amp;peg=37824</guid></item>
<item><pubDate>Thu, 01 Oct 2026 19:12:54 +0530</pubDate><dc:creator>aman</dc:creator><title>Rev 37821 – Lead Management: CSV download now also honours the lead table&apos;s ...</title><description>&lt;div&gt;&lt;strong&gt;aman – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Lead Management: CSV download now also honours the lead table&apos;s search text (searchTerm), so the exported rows match the filtered rows on screen. Applies to both the fofo download and the V2 API download.&lt;br /&gt;
&lt;br /&gt;
Co-Authored-By: Claude Fable 5.1 &amp;lt;&lt;a href=&quot;mailto:noreply@anthropic.com&quot;&gt;noreply@anthropic.com&lt;/a&gt;&gt;&lt;br /&gt;
Claude-Session: &lt;a href=&quot;https://claude.ai/code/session_01JjVXnkrysiXEa2YYRn4BqL&quot; target=&quot;_blank&quot;&gt;https://claude.ai/code/session_01JjVXnkrysiXEa2YYRn4BqL&lt;/a&gt;&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/lead.js&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=37821&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37821&amp;peg=37824</guid></item>
<item><pubDate>Thu, 01 Oct 2026 18:36:37 +0530</pubDate><dc:creator>aman</dc:creator><title>Rev 37820 – Lead Management: make Excel/CSV download honour the same filters as ...</title><description>&lt;div&gt;&lt;strong&gt;aman – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Lead Management: make Excel/CSV download honour the same filters as the on-screen list. V2 download no longer folds followUp into the status list when All is chosen (it skipped the status/color/date query and exported only follow-ups); fofo lead page re-selects every chosen status so Download sends the statuses the table was loaded with.&lt;br /&gt;
&lt;br /&gt;
Co-Authored-By: Claude Fable 5.1 &amp;lt;&lt;a href=&quot;mailto:noreply@anthropic.com&quot;&gt;noreply@anthropic.com&lt;/a&gt;&gt;&lt;br /&gt;
Claude-Session: &lt;a href=&quot;https://claude.ai/code/session_01JjVXnkrysiXEa2YYRn4BqL&quot; target=&quot;_blank&quot;&gt;https://claude.ai/code/session_01JjVXnkrysiXEa2YYRn4BqL&lt;/a&gt;&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LeadController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/lead.vm&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=37820&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37820&amp;peg=37824</guid></item>
<item><pubDate>Wed, 30 Sep 2026 18:20:04 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37819 – feat(loi): allow all Accounts users (L1-L4) to download Pending LOI ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(loi): allow all Accounts users (L1-L4) to download Pending LOI Forms report&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoiFormController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/pendingForm.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37819&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37819&amp;peg=37824</guid></item>
<item><pubDate>Wed, 30 Sep 2026 16:43:23 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37818 – feat(movement): allow full movable qty on PO screen, split raised ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(movement): allow full movable qty on PO screen, split raised as separate POs&lt;br /&gt;
&lt;br /&gt;
- Cap the movement quantity at everything that can move; stock at more than one cost is&lt;br /&gt;
  raised as one PO per cost on create (dao r37817). Note replaces &apos;raise a separate PO&apos;.&lt;br /&gt;
- Tests: split by cost, multi-item PO grouping, same-warehouse refusal, shelf before arriving.&lt;br /&gt;
- jsVersion 440.&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;~ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/InventoryCostLayerTest.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/warehouse/MovementPurchaseOrderSplitTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37818&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37818&amp;peg=37824</guid></item>
<item><pubDate>Wed, 30 Sep 2026 16:43:15 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37817 – fix(movement): shelf stock before arriving, one PO per cost, close ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 7 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(movement): shelf stock before arriving, one PO per cost, close PO on invoice cancel&lt;br /&gt;
&lt;br /&gt;
- Internal movement fills from shelf stock before stock still arriving (a pending PO dated at&lt;br /&gt;
  midnight ranked ahead of same-day receipts, pricing movements from units that never shipped).&lt;br /&gt;
- A quantity spanning stock at different costs is raised as one PO per cost at once instead of&lt;br /&gt;
  being refused (first PO takes every item&apos;s oldest cost, the next the following cost).&lt;br /&gt;
- Refuse a movement from a warehouse to itself.&lt;br /&gt;
- Cancelling a movement&apos;s invoice/DC takes the order&apos;s qty off its PO and pre-closes it when&lt;br /&gt;
  nothing is left open, as refunds already did.&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/repository/transaction/OrderRepository.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/transaction/OrderRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnServiceImpl.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;~ /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=37817&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37817&amp;peg=37824</guid></item>
<item><pubDate>Wed, 30 Sep 2026 16:02:53 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37816 – fix(einvoice): save the e-way bill whenever NIC returns EwbNo, not ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(einvoice): save the e-way bill whenever NIC returns EwbNo, not only with the EWBPPD note&lt;br /&gt;
&lt;br /&gt;
GstProService saved EWB details only when InfoDtls held EWBPPD. NIC sends that&lt;br /&gt;
note (its pin-to-pin distance) only when we pass Distance=0, and the DUPIRN&lt;br /&gt;
get-by-IRN response carries no InfoDtls at all. So every partner with a&lt;br /&gt;
warehouse_partner_distance_mapping row, and every IRN recovered after a&lt;br /&gt;
timeout, lost its EWB although NIC had filed it (13 + 2 invoices in 30 days,&lt;br /&gt;
backfilled 2026-09-30), and a false &quot;EWB Not Generated&quot; mail was sent.&lt;br /&gt;
&lt;br /&gt;
- Key on EwbNo; distance from EWBPPD, else the distance we sent, else none.&lt;br /&gt;
- Invoice PDF prints the &quot;[distance]&quot; suffix only when a distance is known&lt;br /&gt;
  (was &quot;[null]&quot;).&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/InvoiceService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37816&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37816&amp;peg=37824</guid></item>
<item><pubDate>Wed, 30 Sep 2026 15:35:48 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37815 – feat(loi): allow Finance L1 (Accounts) to download Pending LOI Forms ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(loi): allow Finance L1 (Accounts) to download Pending LOI Forms report&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/LoiFormController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/pendingForm.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37815&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37815&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 18:53:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37814 – revert(samsung-rebilling): drop TODO, keep ritesh.chauhan1 on the mail  Removes ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;revert(samsung-rebilling): drop TODO, keep ritesh.chauhan1 on the mail&lt;br /&gt;
&lt;br /&gt;
Removes the TODO(amit.gupta) comment added in r37812. The only change left from&lt;br /&gt;
r37812 is ritesh.chauhan1 on To alongside kamini.sharma; tarun.verma stays on CC.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37814&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37814&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 18:53:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37813 – revert(samsung-rebilling): restore original PCM filter, drop TODO  Reverts r37811: ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;revert(samsung-rebilling): restore original PCM filter, drop TODO&lt;br /&gt;
&lt;br /&gt;
Reverts r37811: findByBillingDateBrand goes back to spcm.pcmDate &gt; wsi.invoiceDate&lt;br /&gt;
(stores with no samsung_pcm row are no longer listed). File is identical to r37810.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehouseInventoryItem.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37813&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37813&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 16:26:42 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37812 – fix(samsung-rebilling): send rebilling mail to kamini.sharma and ritesh.chauhan1  praveen.sharma ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(samsung-rebilling): send rebilling mail to kamini.sharma and ritesh.chauhan1&lt;br /&gt;
&lt;br /&gt;
praveen.sharma was dropped in r37631 (inactive auth user); ritesh.chauhan1 now joins&lt;br /&gt;
kamini.sharma on To, tarun.verma stays on CC. TODO(amit.gupta) records the open&lt;br /&gt;
points: recipients cannot open Manage PCM (menu 208 is Financial Services L1/L2),&lt;br /&gt;
and the CSV omits the invoice and PCM dates the query already returns.&lt;br /&gt;
&lt;br /&gt;
Requires profitmandi-dao r37811 (missing-PCM rows); deploy dao and cron together.&lt;/div&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/ScheduledTasks.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37812&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37812&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 16:11:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37811 – fix(samsung-rebilling): list IMEIs of stores with no PCM date  ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(samsung-rebilling): list IMEIs of stores with no PCM date&lt;br /&gt;
&lt;br /&gt;
findByBillingDateBrand required spcm.pcmDate &gt; wsi.invoiceDate in the WHERE, so the&lt;br /&gt;
left join to SamsungPCM behaved as an inner join and the &quot;PCM date Missing&quot; label in&lt;br /&gt;
the cron mail could never appear. No PCM date has been entered since 2025-10-26, so&lt;br /&gt;
the query has returned nothing on almost every run and the daily mail went silent.&lt;br /&gt;
&lt;br /&gt;
Stores with no samsung_pcm row now come through with a null PCM date (interim),&lt;br /&gt;
alongside the existing PCM-date-after-invoice rows. Internal-movement stock is still&lt;br /&gt;
dropped by s.internal=false - TODO(amit.gupta) left on the query.&lt;br /&gt;
&lt;br /&gt;
Deploy with the matching profitmandi-cron commit.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehouseInventoryItem.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37811&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37811&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 15:20:24 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37810 – fix(irn-reset): allow reset of failed invoices and show the real ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(irn-reset): allow reset of failed invoices and show the real rejection reason&lt;br /&gt;
&lt;br /&gt;
A failed IRN filing leaves an einvoice_details row with irn NULL and only&lt;br /&gt;
irn_error_message set, but the reset panel treated any row as &quot;IRN already&lt;br /&gt;
generated&quot; and refused every failed invoice (e.g. NSLCK38227, GSP032 timeout,&lt;br /&gt;
billed same day) with the message &quot;older than five days&quot;.&lt;br /&gt;
&lt;br /&gt;
- Block only when einvoice_details.irn is set.&lt;br /&gt;
- Report a reason per invoice: not found / IRN already generated / already&lt;br /&gt;
  queued / billed more than five days ago.&lt;br /&gt;
- Trim invoice numbers: the panel joins with &quot;, &quot;, so resetOrdersIrn matched&lt;br /&gt;
  only the first invoice and silently skipped the rest.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OrderController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/eligible-irn-reset-orders.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37810&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37810&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 15:20:16 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37809 – fix(einvoice): keep waiting for a fresh NIC auth token instead ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(einvoice): keep waiting for a fresh NIC auth token instead of giving up after one wait&lt;br /&gt;
&lt;br /&gt;
getUsableAuthToken waited out an expiring token once and failed if NIC still&lt;br /&gt;
handed back one with under 60s of life. NSNOI14473 (2026-09-10) waited out a&lt;br /&gt;
token expiring 17:12:53, got one expiring 17:13:00 (6s left) and was parked at&lt;br /&gt;
irn_generated=0; the next invoice 5s later filed fine. Now waits up to 3 times,&lt;br /&gt;
each bounded by the remaining life of the token in hand.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProAuthService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37809&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37809&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 14:53:49 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37808 – offer-radar notification commit</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;offer-radar notification commit&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferRadarNotificationController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37808&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37808&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 13:36:10 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37807 – test(returns): B2C settlement after a GSTIN refusal, end to end ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;test(returns): B2C settlement after a GSTIN refusal, end to end&lt;br /&gt;
&lt;br /&gt;
ReturnB2cRefundTest (Spring context, local dev DB, invoice NSNOI5746) covers&lt;br /&gt;
the r37790 flow: the quote is the value net of GST (33,439 -&gt; 28,338); a&lt;br /&gt;
refused approval refunds nothing and records the attempt in its own&lt;br /&gt;
transaction; a wrongly typed amount and a missing remark or consent are&lt;br /&gt;
refused; settling as B2C refunds net of GST and issues a local credit note.&lt;br /&gt;
Seeded data rolls back; the refusal row it must commit is cleaned up by the&lt;br /&gt;
test. 5/5 pass.&lt;/div&gt;+ /trunk/profitmandi-fofo/src/test/java/com/spice/profitmandi/service/inventory/ReturnB2cRefundTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37807&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37807&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 13:36:09 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37806 – test(gstpro): classify NIC refusals - buyer GSTIN vs own seller ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;test(gstpro): classify NIC refusals - buyer GSTIN vs own seller vs state code&lt;br /&gt;
&lt;br /&gt;
IrnRefusalClassificationTest covers GstProService.isInvalidBuyerGstin, which&lt;br /&gt;
decides whether a NIC refusal opens the Finance B2C settlement: a cancelled or&lt;br /&gt;
invalid BUYER GSTIN qualifies; a state-code mismatch or a message naming our&lt;br /&gt;
own seller GSTIN does not. 9/9 pass.&lt;/div&gt;+ /trunk/profitmandi-dao/src/test/java/com/spice/profitmandi/service/integrations/gstpro/IrnRefusalClassificationTest.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37806&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37806&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 04:14:47 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37805 – fix(catalog): trim f_ colour prefix space; age delisted listings from ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(catalog): trim f_ colour prefix space; age delisted listings from last activation&lt;br /&gt;
&lt;br /&gt;
- Item.normalizeColor drops the space after f_ on every write (upload sheets typed&lt;br /&gt;
  &apos;f_ Black&apos;, which read &apos; Black&apos; everywhere); ItemLoaderService uses it so the&lt;br /&gt;
  duplicate-colour check compares the clean value&lt;br /&gt;
- tag_listing.last_activated, stamped by TagListing.setActive on off-&gt;on;&lt;br /&gt;
  updateActiveById now goes through the entity (+flush) so the toggle stamps it&lt;br /&gt;
- delist cron + SQL script age a listing from GREATEST(start_date, last_activated),&lt;br /&gt;
  so a re-activated listing is not delisted again the next morning&lt;br /&gt;
- migrations: add_tag_listing_last_activated_20260929.sql, fix_item_color_prefix_space_20260929.sql&lt;br /&gt;
  (both applied on hadb1 2026-09-29; 174 items trimmed, 36830 excluded - clashes with 37089)&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/catalog/Item.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/catalog/TagListing.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/TagListingRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/CatalogDelistServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/ItemLoaderService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/add_tag_listing_last_activated_20260929.sql&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/resources/sql/delist_inactive_listings_rolling_24m.sql&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/fix_item_color_prefix_space_20260929.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37805&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37805&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 00:19:53 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37804 – fix(fofo-store): store every GSTIN in upper case at the entity ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(fofo-store): store every GSTIN in upper case at the entity setter&lt;br /&gt;
&lt;br /&gt;
FofoStore.setGstNumber now normalises through StringUtils.normalizeGstNumber,&lt;br /&gt;
so no write path can store a mixed-case GSTIN. Only the partner-update path&lt;br /&gt;
normalised before; the LOI and trial-form paths wrote the field directly,&lt;br /&gt;
which is how 06bmlpk3545g1z0 and 03AAccn9802g1zp reached the table. NIC&lt;br /&gt;
expects upper case, and case-sensitive comparisons (including the own-seller&lt;br /&gt;
GSTIN check behind a NIC refusal) silently failed to match.&lt;br /&gt;
&lt;br /&gt;
uppercase_fofo_store_gstin_20260928.sql corrects the four rows already on&lt;br /&gt;
record; it is already applied on hadb1 (0 mixed-case GSTINs remain).&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/fofo/FofoStore.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/uppercase_fofo_store_gstin_20260928.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37804&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37804&amp;peg=37824</guid></item>
<item><pubDate>Tue, 29 Sep 2026 00:19:52 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37803 – feat(scheme): offer only serialized Ear Buds models in the scheme ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(scheme): offer only serialized Ear Buds models in the scheme picker&lt;br /&gt;
&lt;br /&gt;
Scheme payouts are IMEI-driven, so a non-serialized earbud can never earn one.&lt;br /&gt;
For category 10024 the scheme-creation brand list and model list now ask the&lt;br /&gt;
inventory service for serialized items only (the dao side is already in&lt;br /&gt;
trunk); LED TV and the other categories are unchanged.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/SchemeController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37803&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37803&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 21:55:26 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37802 – remove tarun sir email from some storetimline tat email</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;remove tarun sir email from some storetimline tat email&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/user/StoreTimelineTatServiceImpl.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37802&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37802&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 20:06:30 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37801 – Disable Pine Labs offer discovery behind a config switch (default ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Disable Pine Labs offer discovery behind a config switch (default off)&lt;br /&gt;
&lt;br /&gt;
Turns off the live Pine Labs per-item offer discovery on the user&apos;s&lt;br /&gt;
instruction. New pinelabs.offer.discovery.enabled, default FALSE, so the&lt;br /&gt;
integration is off in every environment unless a properties file opts in.&lt;br /&gt;
&lt;br /&gt;
Gated at the single point all discovery funnels through&lt;br /&gt;
(PinelabsAffordabilityServiceImpl.discoverOffers), so one switch stops the&lt;br /&gt;
nightly cache loop, a single-item refresh and the /pinelabs/offers endpoint&lt;br /&gt;
without editing the six call sites. discoverOffersRawJson gated too.&lt;br /&gt;
cacheAllItemOffers returns before its listing query, since the loop costs&lt;br /&gt;
4,507 items and ~12 minutes of a cron thread even when every call is a no-op.&lt;br /&gt;
&lt;br /&gt;
Degrades gracefully rather than breaking the product surface: an empty&lt;br /&gt;
OfferDiscoveryResponse is exactly what the existing catch block returns, and&lt;br /&gt;
getGroupedCachedOffersForItems already drops an entry with an empty issuer&lt;br /&gt;
map. The Redis cache is a 24h TTL, so live badges drain within a day rather&lt;br /&gt;
than vanishing mid-request.&lt;br /&gt;
&lt;br /&gt;
The @Value carries a default deliberately — pinelabs.api.base.url and the&lt;br /&gt;
credentials carry none, so a missing key stops the whole context (the r37495&lt;br /&gt;
class of outage). A kill switch must never be able to do that.&lt;br /&gt;
&lt;br /&gt;
SCOPE: offer discovery ONLY. Payment-gateway traffic (orders, refunds,&lt;br /&gt;
callbacks, webhooks) and offer create/validate/downpayment are untouched,&lt;br /&gt;
so no live money path changes behaviour.&lt;br /&gt;
&lt;br /&gt;
@Scheduled on ScheduledSkeleton.fetchOffersByItem is intentionally left in&lt;br /&gt;
place — with the flag off it is one log line, and re-enabling stays a config&lt;br /&gt;
change rather than a code change.&lt;br /&gt;
&lt;br /&gt;
Build: dao + web + cron + fofo compile, BUILD SUCCESSFUL.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/pinelabs/PinelabsAffordabilityServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/pinelabs/PinelabsApiConfig.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/pinelabs/PinelabsOfferCacheService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37801&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37801&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 18:57:23 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37800 – offer-radar notification commit</title><description>&lt;div&gt;&lt;strong&gt;ranu – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;offer-radar notification commit&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37800&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37800&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 17:51:31 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37799 – offer-radar notification commit</title><description>&lt;div&gt;&lt;strong&gt;ranu – 4 file(s) modified&lt;/strong&gt;&lt;br/&gt;offer-radar notification commit&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferRadarNotificationController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37799&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37799&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 16:51:13 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37798 – Show a settled debit note as settled instead of offering ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 5 file(s) modified&lt;/strong&gt;&lt;br/&gt;Show a settled debit note as settled instead of offering Receive&lt;br /&gt;
&lt;br /&gt;
The DN screens decided everything from &quot;does a purchase_return_order exist&quot;,&lt;br /&gt;
which no return settled before the receive workflow ever had. A note settled&lt;br /&gt;
years ago therefore read &quot;Pending Receive&quot; with a Receive button, and receiving&lt;br /&gt;
one handed a partner back a phone already returned, refunded and resold&lt;br /&gt;
(DN UPBLY975/4, IMEI 864973083197734).&lt;br /&gt;
&lt;br /&gt;
The debit note&apos;s own status now carries the fact - CREATED means there is&lt;br /&gt;
genuinely something to receive, anything else means it is settled - so the&lt;br /&gt;
screens read it directly instead of re-deriving it from warehouse scans on&lt;br /&gt;
every page load. r37797 backfilled the 4,154 notes the old flow left behind.&lt;br /&gt;
&lt;br /&gt;
- invoice-return-results, debit-notes-table, debit-note-details,&lt;br /&gt;
  receive-debit-note: Receive only while the note is CREATED with no return&lt;br /&gt;
  order; otherwise &quot;Processed - settled earlier&quot;.&lt;br /&gt;
- debit-notes-table: Refund only on a note received and not yet settled,&lt;br /&gt;
  rather than on every row.&lt;br /&gt;
- PurchaseReturnController: the admin debit-note list now loads the return&lt;br /&gt;
  orders its Refund button needs.&lt;br /&gt;
&lt;br /&gt;
Deploy with profitmandi-dao r37797.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/PurchaseReturnController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/debit-note-details.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/debit-notes-table.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/invoice-return-results.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/receive-debit-note.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37798&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37798&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 16:50:59 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37797 – Stop a settled debit note being received a second time ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;Stop a settled debit note being received a second time&lt;br /&gt;
&lt;br /&gt;
A return settled before the receive workflow (first purchase_return_order&lt;br /&gt;
2026-03-16) wrote the warehouse SALE_RET scan, a returnorderinfo row and a&lt;br /&gt;
wallet refund, but never touched the debit note: it stayed CREATED with no&lt;br /&gt;
purchase_return_order. Those are exactly the two things the receive screens&lt;br /&gt;
read, so 5,557 fully settled notes looked like they were still awaiting&lt;br /&gt;
receipt, Receive button included.&lt;br /&gt;
&lt;br /&gt;
Receiving one of them (DN UPBLY975/4, IMEI 864973083197734, Antu Enterprises)&lt;br /&gt;
restored to the partner a phone that had already been returned, refunded&lt;br /&gt;
Rs 38,999 and resold to another partner, and a duplicate debit note followed&lt;br /&gt;
that Finance could not refund.&lt;br /&gt;
&lt;br /&gt;
- receiveDebitNoteItems: refuse a note that already has a return order, one&lt;br /&gt;
  whose status is not CREATED, and one whose every unit is already back at the&lt;br /&gt;
  warehouse. Checked BEFORE the condition-mismatch gate - a mismatch there&lt;br /&gt;
  returns into rejectOnConditionMismatch without reaching any later check, and&lt;br /&gt;
  acknowledging that rejection hands the stock back to the partner. That is&lt;br /&gt;
  how the Antu case slipped through.&lt;br /&gt;
- getAlreadyReturnedDebitNotes: the last of those checks, batched for a page of&lt;br /&gt;
  notes. Mirrors applyReceipt - SALE_RET/DOA_IN/SALE_RET_UNUSABLE for the unit&lt;br /&gt;
  against the order its invoice was billed on - so a screen can never disagree&lt;br /&gt;
  with what the refund step will accept.&lt;br /&gt;
- processInvoiceReturn: one open return per document.&lt;br /&gt;
- sql/backfill_debit_note_status_old_flow_20260924.sql: APPLIED on hadb1&lt;br /&gt;
  2026-09-24. 4,154 notes -&gt; APPROVED, 6,639 items -&gt; RETURNED, on the same&lt;br /&gt;
  evidence (returned and refunded). Open notes 5,557 -&gt; 1,404; the rest are&lt;br /&gt;
  left CREATED for review, bucketed in fofo._dn_backfill_20260922.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/backfill_debit_note_status_old_flow_20260924.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37797&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37797&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 16:27:46 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37796 – fix(cart): order with a carry bag fails - Could not ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(cart): order with a carry bag fails - Could not copy property &apos;discountedPrice&apos;&lt;br /&gt;
&lt;br /&gt;
splitCarryBagLine (r37792) copies the bag line with BeanUtils.copyProperties.&lt;br /&gt;
CartLine.discountedPrice is a nullable Float but its getter returned primitive&lt;br /&gt;
float, so unboxing the null threw NPE, surfaced as InvocationTargetException,&lt;br /&gt;
failing every order whose cart had a carry bag. Accessors now take/return Float;&lt;br /&gt;
they have no other callers.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/user/CartLine.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37796&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37796&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 15:51:17 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37795 – offer-radar notification commit</title><description>&lt;div&gt;&lt;strong&gt;ranu – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;offer-radar notification commit&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/offer_history.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/schemes.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37795&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37795&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 15:38:57 +0530</pubDate><dc:creator>ranu</dc:creator><title>Rev 37794 – offer-radar notification commit</title><description>&lt;div&gt;&lt;strong&gt;ranu – 8 file(s) modified&lt;/strong&gt;&lt;br/&gt;offer-radar notification commit&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/NotificationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/whatsapp/BotPenguinWhatsappService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/whatsapp/WhatsappFlow.java&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OfferRadarNotificationController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/offer_history.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/schemes.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37794&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37794&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 15:37:47 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37793 – feat(cart): carry bag pricing via CarryBagQuote in V2 cart and ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(cart): carry bag pricing via CarryBagQuote in V2 cart and order create&lt;br /&gt;
&lt;br /&gt;
V2CartController prices and rebalances the carry bag through&lt;br /&gt;
CartService.getCarryBagQuote: one bag at Rs 1 per smartphone over Rs 12,000,&lt;br /&gt;
extras at listing, Bronze at listing for all. The old resolveCarryBagPrice /&lt;br /&gt;
CARRY_BAG_PREMIUM_PRICE path and its partnerTypeChangeService dependency are&lt;br /&gt;
removed. OrderController splits the blended carry bag line into its two&lt;br /&gt;
priced orders when partitioning the cart, so the same SKU appears twice on&lt;br /&gt;
one invoice at its two prices.&lt;br /&gt;
&lt;br /&gt;
Needs profitmandi-dao r37792; deploy together with the partner apps.&lt;/div&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/checkout/OrderController.java&lt;br /&gt;~ /trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2CartController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37793&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37793&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 15:37:36 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37792 – feat(cart): carry bag at Rs 1 per smartphone over Rs ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 11 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(cart): carry bag at Rs 1 per smartphone over Rs 12,000, extras at listing price&lt;br /&gt;
&lt;br /&gt;
One carry bag (item 32046) is priced at Rs 1 for each smartphone (category&lt;br /&gt;
10006) in the cart selling above Rs 12,000; bags beyond that count are priced&lt;br /&gt;
at the carry bag&apos;s listing price, and Bronze partners pay listing for all.&lt;br /&gt;
Closes the leak where bag-only carts of hundreds of bags at Rs 1 were placed&lt;br /&gt;
from the old app. CarryBagQuote (via CartService.getCarryBagQuote) is the&lt;br /&gt;
single rule; the cart carries it as one line at a blended price.&lt;br /&gt;
&lt;br /&gt;
- CartService/CartServiceImpl, CartResponse, OpenCartValidationResult: expose&lt;br /&gt;
  the quote on the cart.&lt;br /&gt;
- OrderLineAllocator: an item may now have more than one cart line (the flat&lt;br /&gt;
  and listing-priced parts); its units fill the lines in order.&lt;br /&gt;
- TransactionServiceImpl: item quantities merge instead of failing on a&lt;br /&gt;
  duplicate item id.&lt;br /&gt;
- PurchaseServiceImpl: partner GRN creates one stock record per billed price;&lt;br /&gt;
  the GRN screen shows the blended unit price; dead&lt;br /&gt;
  createScannedNonSerializedItem removed.&lt;br /&gt;
- PurchaseReturnServiceImpl: debit-note PDF picks the order billed at the&lt;br /&gt;
  returned stock&apos;s price; refundOrder spreads a non-serialized return over the&lt;br /&gt;
  item&apos;s orders with room left (same price first) instead of loading it all&lt;br /&gt;
  on the first order.&lt;br /&gt;
&lt;br /&gt;
Tests: CarryBagQuoteTest 6/6, OrderLineAllocatorTest 13/13.&lt;br /&gt;
Deploy with profitmandi-web (same change) and the partner apps.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java&lt;br /&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/OpenCartValidationResult.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CarryBagQuote.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/model/CartResponse.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseServiceImpl.java&lt;br /&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/dao/model/CarryBagQuoteTest.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=37792&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37792&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 14:38:09 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37791 – Sale returns: Finance-only B2C settlement after a NIC GSTIN refusal ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 6 file(s) modified&lt;/strong&gt;&lt;br/&gt;Sale returns: Finance-only B2C settlement after a NIC GSTIN refusal&lt;br /&gt;
&lt;br /&gt;
Once NIC has refused a return because the buyer&apos;s GSTIN is cancelled or&lt;br /&gt;
invalid, only Finance may act on it - approve, retry or reject. The pending&lt;br /&gt;
queue shows the refusal reason and, on the day it happened, a &quot;Refund as&lt;br /&gt;
B2C&quot; action; Logistics sees &quot;IRN failed - awaiting Finance&quot; and no buttons.&lt;br /&gt;
&lt;br /&gt;
The B2C screen states NIC&apos;s reason and every returned line with its value&lt;br /&gt;
including and excluding GST, and fixes the refund at the value net of GST&lt;br /&gt;
in whole rupees. Finance types that figure back by hand, enters a remark and&lt;br /&gt;
ticks the consent box before the button enables; the server re-checks the&lt;br /&gt;
amount, the remark, the consent and the same-day window, so the screen is a&lt;br /&gt;
convenience and not the control. Cancelling or finishing returns to the&lt;br /&gt;
queue, and a refused approval now reloads the queue so the B2C action&lt;br /&gt;
appears without a manual refresh.&lt;br /&gt;
&lt;br /&gt;
jsVersion 438 -&gt; 439 for return.js.&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/PurchaseReturnController.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/model/SaleReturnRow.java&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/resources/js/business/return.js&lt;br /&gt;+ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/b2c-refund.vm&lt;br /&gt;~ /trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/invoice-return.vm&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37791&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37791&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 14:34:01 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37790 – Return refund as B2C when NIC refuses the buyer&apos;s GSTIN ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 13 file(s) modified&lt;/strong&gt;&lt;br/&gt;Return refund as B2C when NIC refuses the buyer&apos;s GSTIN&lt;br /&gt;
&lt;br /&gt;
A return whose credit note NIC refuses because the BUYER&apos;s GSTIN is&lt;br /&gt;
cancelled or invalid could not be settled at all: the approval threw, and&lt;br /&gt;
with it went the refund, the stock and the return rows (NSUPDL5176, Mobile&lt;br /&gt;
Hub, GSTIN 08DCUPD7948K1ZP). Where the invoice itself had never been filed&lt;br /&gt;
the return was instead refunded with no credit note at all, leaving the&lt;br /&gt;
refund undocumented.&lt;br /&gt;
&lt;br /&gt;
Raising the note automatically is not the answer - it is Finance&apos;s call,&lt;br /&gt;
and the GST on a cancelled-GSTIN sale is not recoverable, so paying the&lt;br /&gt;
full value back loses it. Both flows therefore record the refusal and stop.&lt;br /&gt;
&lt;br /&gt;
GstProService: getIrnFailureReason (NIC&apos;s refusal for an invoice),&lt;br /&gt;
isInvalidBuyerGstin (that refusal is about the buyer&apos;s registration -&lt;br /&gt;
deliberately NOT a state-code mismatch, which is a data error to fix and&lt;br /&gt;
retry, nor anything naming our own seller GSTIN) and briefIrnReason (one&lt;br /&gt;
plain-ASCII line of 128 chars; credit_note is latin1 and sql_mode is empty,&lt;br /&gt;
so anything else would store as &apos;?&apos;).&lt;br /&gt;
&lt;br /&gt;
PurchaseReturnServiceImpl: both the invoice-return and the debit-note&lt;br /&gt;
refund detect that refusal, record it through ReturnIrnFailureRecorder and&lt;br /&gt;
throw ReturnIrnGstinFailureException. The recorder commits in REQUIRES_NEW&lt;br /&gt;
because the approval it records is about to roll back, and it only inserts -&lt;br /&gt;
return_irn_failure carries no foreign key on purpose, since an FK check&lt;br /&gt;
would take a shared lock on the very PurchaseReturnOrder row the dying&lt;br /&gt;
transaction may still hold.&lt;br /&gt;
&lt;br /&gt;
Finance may then settle the return as B2C for the rest of that calendar day:&lt;br /&gt;
refundAsB2c credits the value NET of GST in whole rupees (B2cRefundQuote,&lt;br /&gt;
HALF_UP per line, so the line table and the total always agree), restores&lt;br /&gt;
the stock and issues a local credit note for exactly that amount with no tax&lt;br /&gt;
on its lines, no IRN and NIC&apos;s reason recorded. The amount is fixed - the&lt;br /&gt;
caller must pass back the quoted figure - and a remark and explicit consent&lt;br /&gt;
are required. On a later day the option only reopens after a fresh approval&lt;br /&gt;
attempt is refused again, so NIC is always re-checked first.&lt;br /&gt;
&lt;br /&gt;
Mails: every refusal notifies Accounts L2 and above; the B2C settlement&lt;br /&gt;
notifies them and the partner&apos;s Warehouse L1/L2, both tabulated.&lt;br /&gt;
&lt;br /&gt;
The partner account statement is unaffected: it skips RETURNS notes and&lt;br /&gt;
credits returns from returnorderinfo, so the new notes cannot double-credit.&lt;br /&gt;
&lt;br /&gt;
DEPLOY ORDER: apply sql/add_return_b2c_refund_20260921.sql BEFORE any war&lt;br /&gt;
built from this dao. CreditNote now maps irn_skip_reason and b2c, so every&lt;br /&gt;
credit-note read in web, fofo and cron fails until the columns exist.&lt;br /&gt;
Untested beyond compilation.&lt;/div&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/fofo/ReturnIrnFailure.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/transaction/CreditNote.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/ReturnIrnFailureRepository.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/ReturnIrnFailureRepositoryImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/integrations/gstpro/GstProService.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/B2cRefundQuote.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnNotificationService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnNotificationServiceImpl.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnService.java&lt;br /&gt;~ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/PurchaseReturnServiceImpl.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/ReturnIrnFailureRecorder.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/inventory/ReturnIrnGstinFailureException.java&lt;br /&gt;+ /trunk/profitmandi-dao/src/main/resources/sql/add_return_b2c_refund_20260921.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37790&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37790&amp;peg=37824</guid></item>
<item><pubDate>Mon, 28 Sep 2026 13:25:51 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37789 – FormattingUtils.formatDigit: print whole numbers, as intended  digitFormatter set the ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;FormattingUtils.formatDigit: print whole numbers, as intended&lt;br /&gt;
&lt;br /&gt;
digitFormatter set the MINIMUM fraction digits twice and never set the&lt;br /&gt;
maximum, so Java&apos;s default of 3 applied: formatDigit(84745.76f) rendered&lt;br /&gt;
&quot;84,745.758&quot; - float noise at three decimals - where a whole number was&lt;br /&gt;
meant. The second call was clearly a typo for setMaximumFractionDigits(0).&lt;br /&gt;
&lt;br /&gt;
Only one other call site (ItemCriteria &quot;with Selling Price &gt;= ...&quot;), which&lt;br /&gt;
passes whole rupees and is unaffected. Needed by the B2C return refund,&lt;br /&gt;
which prints whole-rupee amounts on screen and in mails.&lt;/div&gt;~ /trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/FormattingUtils.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37789&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37789&amp;peg=37824</guid></item>
<item><pubDate>Sun, 27 Sep 2026 15:44:19 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37788 – activation: stop a broken JVM from spending the day&apos;s imei ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 3 file(s) modified&lt;/strong&gt;&lt;br/&gt;activation: stop a broken JVM from spending the day&apos;s imei pool, and take the&lt;br /&gt;
selenium atom read out of the nested jar&lt;br /&gt;
&lt;br /&gt;
Oppo/Realme activation collapsed on 21-22 Sep. Every WebDriver command failed with&lt;br /&gt;
java.util.zip.ZipException reading a Selenium JS atom:&lt;br /&gt;
&lt;br /&gt;
  W3CHttpCommandCodec.amendParameters:227 -&gt; executeAtom:397&lt;br /&gt;
  -&gt; com.google.common.io.Resources.toString&lt;br /&gt;
  -&gt; org.springframework.boot.loader.jar.ZipInflaterInputStream.read -&gt; ZipException&lt;br /&gt;
&lt;br /&gt;
Scale, from fofo.activated_imei: a ~30-50 errors/day baseline became 17,508 on 21-Sep&lt;br /&gt;
and 27,768 on 22-Sep. On 22-Sep it touched 3,920 realme imeis for 0 dates and 4,824&lt;br /&gt;
oppo for 96, against a normal 76-100% hit rate. Realme burned its entire day pool by&lt;br /&gt;
11:07 and then correctly went quiet, having answered nothing.&lt;br /&gt;
&lt;br /&gt;
TWO INDEPENDENT FAULTS, one fixed each way.&lt;br /&gt;
&lt;br /&gt;
1. The pool was spent on an outage. restUnanswered stamps every unanswered imei so the&lt;br /&gt;
20-second tick advances instead of re-handing the same rows -- correct for a per-imei&lt;br /&gt;
failure, catastrophic for a systemic one, because a stamped row does not come back&lt;br /&gt;
until its rest expires. So a JVM that cannot read a jar quietly consumed a day of&lt;br /&gt;
payout data. Now: if NOTHING in the chunk was answered and the chunk had more than one&lt;br /&gt;
imei, that is infrastructure rather than a verdict, and nothing is stamped. Cost is a&lt;br /&gt;
re-ask of the same chunk next tick -- loud and self-limiting -- instead of the day.&lt;br /&gt;
Same class of bug as the carlcare transient refusal (r37537): far-end/our-end noise&lt;br /&gt;
must never be recorded as an answer.&lt;br /&gt;
&lt;br /&gt;
2. The read itself. Selenium loads its atoms as classpath RESOURCES on essentially&lt;br /&gt;
every command, which inside a fat jar is a nested-jar read on the Spring Boot 2.0.2&lt;br /&gt;
(2018) loader. Three different inflater errors appeared on prod -- &quot;invalid stored&lt;br /&gt;
block lengths&quot;, &quot;invalid distance too far back&quot;, &quot;invalid code lengths set&quot; -- on a jar&lt;br /&gt;
whose outer AND extracted nested archives both pass `unzip -t`. Intact bytes with three&lt;br /&gt;
distinct inflater failures is a reader fault, not a file fault. bootJar now sets&lt;br /&gt;
requiresUnpack for selenium-remote-driver, so it is extracted to a real file at launch&lt;br /&gt;
and the atom read never touches the nested reader. Verified in the built jar: the entry&lt;br /&gt;
carries UNPACK:&amp;lt;sha1&gt; and is STORED rather than DEFLATED.&lt;br /&gt;
&lt;br /&gt;
TRAPS WORTH RECORDING.&lt;br /&gt;
&lt;br /&gt;
- A restart is NOT a diagnosis here. It was restarted 13:16 on 22-Sep and still failed&lt;br /&gt;
  for three more hours at ~1,260/hour, then a 16:36 restart came up clean -- same jar,&lt;br /&gt;
  mtime unchanged. Anyone reading &quot;restart fixed it&quot; should distrust it.&lt;br /&gt;
- Concurrency alone does not explain it: up to 2 scheduler pools ran these tasks per&lt;br /&gt;
  minute in the broken window AND in the healthy one.&lt;br /&gt;
- The GlitchTip board under-reported this badly (#1495 lastSeen 17-Sep while the log&lt;br /&gt;
  held thousands on 21-22 Sep), so the board is not a reliable outage signal for cron.&lt;br /&gt;
  Judge this lane on dates written in fofo.activated_imei, not on issue counts.&lt;br /&gt;
- Deploy the cron jar stop -&gt; replace -&gt; start. The jar on disk was overwritten in place&lt;br /&gt;
  at 12:31 on 21-Sep while a JVM held it open, which is how this started.&lt;/div&gt;~ /trunk/profitmandi-cron/build.gradle&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/OppoImeiActivationService.java&lt;br /&gt;~ /trunk/profitmandi-cron/src/main/java/com/smartdukaan/cron/scheduled/RealmeImeiActivationService.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37788&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37788&amp;peg=37824</guid></item>
<item><pubDate>Sat, 26 Sep 2026 22:20:49 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37787 – feat(partner-access): demo grant picker lists Platinum partners only  Partner ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(partner-access): demo grant picker lists Platinum partners only&lt;br /&gt;
&lt;br /&gt;
Partner multi-select on Demo Partner Access filters active partners to the&lt;br /&gt;
current effective tier PLATINUM (PartnerTypeChangeService.getTypesForFofoIds,&lt;br /&gt;
same lookup as Indent/Order Management). Active grants table unchanged.&lt;/div&gt;~ /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/DemoPartnerAccessController.java&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37787&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37787&amp;peg=37824</guid></item>
<item><pubDate>Fri, 25 Sep 2026 17:30:34 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37786 – fix(po): read PO lines only from the PO items table ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 2 file(s) modified&lt;/strong&gt;&lt;br/&gt;fix(po): read PO lines only from the PO items table&lt;br /&gt;
&lt;br /&gt;
Create PO collected rows from every table on the page ($(&quot;table &gt; tbody &gt; tr&quot;)). The aging-SKU&lt;br /&gt;
approval modal added in r37750 has its own table (#pmscpFlaggedRows); after a flagged attempt was&lt;br /&gt;
abandoned, its rows were sent as lines with itemId 0 and the server rejected the PO with&lt;br /&gt;
&quot;Items are duplicate [0]&quot;. The create, add-row and over-cap loops now read #purchase-order-table only.&lt;br /&gt;
Bump JS version to 438.&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;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37786&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37786&amp;peg=37824</guid></item>
<item><pubDate>Fri, 25 Sep 2026 16:18:12 +0530</pubDate><dc:creator>amit</dc:creator><title>Rev 37785 – feat(cs): demo partner access menu for Sales L6 and above ...</title><description>&lt;div&gt;&lt;strong&gt;amit – 1 file(s) modified&lt;/strong&gt;&lt;br/&gt;feat(cs): demo partner access menu for Sales L6 and above&lt;br /&gt;
&lt;br /&gt;
menu_category rows for Sales (category 4) ordinals 5-9 (L6..Final) on the&lt;br /&gt;
Demo Partner Access menu. INSERT IGNORE on the PK (latin1 column rejects a&lt;br /&gt;
utf8-literal NOT EXISTS compare). Applied on hadb1 2026-09-25.&lt;/div&gt;~ /trunk/profitmandi-dao/src/main/resources/sql/migration_demo_partner_access.sql&lt;br /&gt;</description><link>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37785&amp;peg=37824</link><guid>https://svn.smartdukaan.com/revision.php?repname=SmartDukaan&amp;path=%2F&amp;isdir=1&amp;rev=37785&amp;peg=37824</guid></item>
</channel></rss>