Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Show changed files | Details | Compare with Previous | Blame | RSS feed

Filtering Options

Rev Age Author Path Log message Diff
36454 3 d 15 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Add request/response logging to refundDebitNote endpoint  
36447 4 d 10 h amit /trunk/profitmandi-fofo/src/main/ DN lifecycle UI: acknowledge rejected return endpoint, status labels, JS handler

- Add PUT /return/debit-note/reject/acknowledge/{debitNoteId} endpoint
- invoice-return.vm: Rejected-Pending Acknowledgment + Cancelled status labels, Acknowledge Receipt button
- return.js: click handler for acknowledge-rejected-return
 
36442 4 d 20 h amit /trunk/profitmandi-fofo/src/ Rename monitor type 'normal' to 'base' in controller, validator, UI, and tests  
36436 5 d 16 h ranu /trunk/ without vendor catalog pricing po will not create  
36435 5 d 21 h aman /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Fix:Mark Inauguration Timestamp & Create Store Timeline Entry on Training Completion  
36419 7 d 16 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/digify/ OkHttp→HttpClientFactory migration for Digify controller  
36412 7 d 20 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Added Rising Star/NEW  
36411 7 d 21 h amit /trunk/ Fix lock contention: REQUIRES_NEW for wallet lock in createLoanForBilling, handle HDFC payment deadlock as duplicate  
36408 8 d 14 h amit /trunk/profitmandi-fofo/src/main/ Sale-return reversal: controller wiring + UI for cancellability gate + INV reject + date filter

PurchaseReturnController:
/return/invoice/process — autoApprove now isIrnCancellable && !isShipped.
!isShipped guard restored: shipped goods route through manual approval
even within 24h, so the physical return goes through CN flow.
/return/invoice/reject/{proId} — new endpoint for finance to reject a
pending INV PRO (sale stands, no inventory/wallet/GST action).
/return/invoice — date filter (fromDate/toDate query params, default
last 30 days) backed by selectByWarehouseIdsAndDateRange. Limit
bumped to 200 to accommodate longer ranges.
receive-debit-note view — passes $requiresFinanceApproval so the
template can render the finance-approval banner when DN's IRN is
past the 24h window.

invoice-return.vm:
Added From/To date inputs + Apply button.
Added Reject button next to Approve & Refund for pending INV PROs.

receive-debit-note.vm:
Added one informational banner (#if $requiresFinanceApproval) above
the receipt form. No layout / JS / submit-URL change.

return.js:
#invoice-return-date-apply handler — POSTs the selected range to
/return/invoice and refreshes the table.
.reject-invoice-return handler — prompts for reason, calls the new
reject endpoint.

dev/staging/prod.properties: feature flag finance.receipt.approval.email.enabled
(default false, flip per env when mail infra is ready).
 
36404 8 d 19 h amit /trunk/profitmandi-fofo/src/ Add catalog monitor type upload, sample sheet, Placement Plan UI tagging (orange/yellow), Today PO csv column, placement-plan-statement.xlsx header coloring  
36401 8 d 19 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Replace mailSender (SendGrid) with gmailRelaySender - SendGrid API key expired/revoked  
36394 8 d 20 h amit /trunk/profitmandi-fofo/src/main/ Add IMEI net-margin modal on order-index billing panel.

New /getImeiNetMarginModal endpoint: given an IMEI, derives the
purchase-billed date from the IMEI's purchase order
(InventoryItem.purchaseId -> Purchase.purchaseReference -> Order.billingTimestamp),
fetches schemes applicable on that date via PriceCircular, and shows
per-scheme contribution, NLC, and net margin in a slim modal.

Effective DP = inventory_item.unit_price - max(0, price_drop_amount)
to match SchemeServiceImpl.createSchemeInOut/PriceCircularService.getPayouts.
Offers are intentionally excluded. Per-IMEI price-drop history is
shown for reference.
 
36392 8 d 22 h ranu /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/ login talktime hours cap on 100%  
36384 11 d 16 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ GlobalExceptionHandler: handle DataIntegrityViolationException via DbErrorTranslator so MySQL truncation / duplicate / FK errors surface as HTTP 400 with a friendly ProfitMandiBusinessException payload (rendered by common.js badRequestAlert).  
36373 11 d 21 h ranu /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/monitors/ login talktime hours cap on 100%  
36371 11 d 22 h amit /trunk/ HDFC webhook: INSERT IGNORE on hdfc_payment to fix concurrent-duplicate 500 storm

Replaces persist() with a native INSERT IGNORE so concurrent same-UTR webhook
retries serialize on the unique-index check, and the loser gets a 0-row no-op
(warning, not exception). Outer @Transactional session stays clean, Spring
commits normally, HDFC sees 200 on both the winner (Success) and the loser
(Duplicate) - retry amplification ends.

Flow:
persist(hdfcPayment) -> insertIgnore(hdfcPayment) + selectByUtrNo(utr)
- inserted == 1: proceed with wallet / sidbi side-effects using fetched id
- inserted == 0: respond Duplicate, skip side-effects (owned by winning tx)
- defensive: log warn if insertIgnore returned 0 but selectByUtrNo finds
no row (could mean IGNORE swallowed a non-duplicate issue like truncation)

Also drops HdfcProcessingHelper (r36366) which used REQUIRES_NEW for the same
goal; that approach required a second JDBC connection and is no longer needed
with SQL-level idempotency.

Does NOT touch the wallet-side lost-update hole (user_wallet read-modify-write
without FOR UPDATE). That is a separate commit.
 
36370 12 d 10 h vikas /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Fix: App login  
36369 12 d 14 h vikas /trunk/profitmandi-fofo/src/main/ Fix: Sale purchase invoice item quantity calculation  
36367 12 d 17 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/hdfc/ HDFC webhook: delegate writes to HdfcProcessingHelper; always respond OK

Fixes the concurrent-duplicate deadlock observed on hadb1 2026-04-23 12:54:11
(two HDFC retries inserting same utr='308490624083' → InnoDB deadlock →
LockAcquisitionException → 500 → HDFC retries again → amplification).

- addPayment: the HDFC row build + persist + wallet/sidbi is now a single call
to hdfcProcessingHelper.processPayment() which runs in REQUIRES_NEW. The
helper catches DataIntegrityViolationException and logs silently; our tx
is unaffected.
- The else branch (pre-select found an existing row) now returns the same
code=100 status=Success as the main path instead of code=200 Duplicate.
Per product direction: HDFC should see 'OK' regardless of whether the row
already existed from a prior webhook, manual entry, or reconciliation —
retries stop cleanly, no 'Duplicate' surface distinction.

Did NOT add @Transactional(readOnly=true) on the outer method despite its
read-heavy shape — checkManualPayments() at line 277 has a write side-effect
(rejecting pending manual wallet requests for the same utr) which would be
silently dropped in a read-only session. Kept class-level writable tx for
the outer; only HDFC writes moved to REQUIRES_NEW helper.
 
36363 13 d 14 h amit /trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ Idempotent fofo_order creation in UpSaleController (mirrors r36362 in dao)

Same change as OrderServiceImpl.createAndGetFofoOrder: pre-select by
(fofo_id, invoice_number) and catch DataIntegrityViolationException as the
slow-race fallback. Paired with uk_fofo_order_fofo_invoice unique key.
 

Show All