Subversion Repositories SmartDukaan

Rev

Show changed files | Directory listing | RSS feed

Filtering Options

Rev Age Author Path Log message Diff
37816 8 d 16 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ fix(einvoice): save the e-way bill whenever NIC returns EwbNo, not only with the EWBPPD note

GstProService saved EWB details only when InfoDtls held EWBPPD. NIC sends that
note (its pin-to-pin distance) only when we pass Distance=0, and the DUPIRN
get-by-IRN response carries no InfoDtls at all. So every partner with a
warehouse_partner_distance_mapping row, and every IRN recovered after a
timeout, lost its EWB although NIC had filed it (13 + 2 invoices in 30 days,
backfilled 2026-09-30), and a false "EWB Not Generated" mail was sent.

- Key on EwbNo; distance from EWBPPD, else the distance we sent, else none.
- Invoice PDF prints the "[distance]" suffix only when a distance is known
(was "[null]").
 
37504 37 d 15 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Stop invoice read paths creating directories (AccessDeniedException 500s)

getInvoicePath called Files.createDirectories, and getInvoiceFile called it on every
download. Invoices are generated by the cron app as root, so /SaholicInvoices/<month>
is 755 root-owned; a download served by Tomcat cannot create a retailer subdirectory
and threw AccessDeniedException.

It threw on line 1 of getInvoiceFile, before the Files.exists check, so the
ProfitMandiBusinessException on the next line was unreachable and the callers'
deliberate 404 handler ("Invoice not yet generated, please retry shortly") never ran.
Downloads for a not-yet-generated invoice 500ed instead of 404ing - the exact log
noise that handler was added to remove.

Split the path computation out: resolveInvoicePath is side-effect free and used by
getInvoiceFile; getInvoicePath keeps the mkdir for the two generation callers
(InvoiceService:558, GstProService:952). The legacy relocation branch creates the
target directory only when there is actually a file to move.

No ops change needed - generation as root already works.
 
37421 43 d 15 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ EWB: recover existing e-way bill on NIC 604 instead of storing a placeholder

DCNSUPDL948 generated EWB 451765074092 at NIC, then the transaction rolled back and
the number was lost. Every retry hit 604 and stored the literal EXISTING-LOOKUP-NEEDED
with no validity date, which routed the PDF down the transporter branch and NPE'd on a
self-pickup dispatch with no warehouse_provider row. ~640 retries in 55 minutes, and
because the failure surfaced as an Error it escaped catch(Exception) and blocked six
other documents behind it.

- GstProService: on 604, look the bill up via GetEwayBillsByDate + docNo match and
return it in GENEWAYBILL shape; stamp NIC's generation time instead of now().
Throw when it cannot be recovered rather than persist a placeholder.
- InvoiceService: saveInvoiceInNewTransaction no longer propagates. It commits
irn_generated=0 with the reason so a failed document stops churning; already-filed
invoices being re-rendered are left untouched.
- InvoiceService: cron loop catches Throwable so one bad document cannot skip the batch.
- InvoiceService: null-guard warehouse_provider; omit the transporter line instead of
failing the PDF.
- recordIrnFailure: transport failures now park at 0 for escalation rather than
requeueing for unbounded retry.
 
37325 52 d 14 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Add EWB backfill for invoices whose IRN was recovered via DUPIRN

When GenerateIRN carries EwbDtls, NIC files the IRN and e-way bill together and reports
the EWB back only in that response, flagged by InfoDtls[InfCd=EWBPPD]. A read timeout
sends the retry down the DUPIRN path, which recovers the IRN via the get-e-invoice
endpoint — that response carries neither InfoDtls nor EWB fields. The EWB therefore
exists at NIC while ewb_no stays null locally, and since updatePdfModelWithIrnDetails
gates the entire e-way bill section on ewb_no, the stored PDF omits it altogether.

backfillMissingEwb() looks the EWB up by (seller GSTIN, ack date), matches on docNo, and
takes actualDist from the per-EWB call since the distance is printed on the invoice. It
then re-renders the PDF; generateIrnForInvoices returns early once irn_generated is set,
so nothing is re-filed at NIC.

NIC is queried with the transaction suspended (NOT_SUPPORTED); the write and the
re-render each run in their own REQUIRES_NEW transaction.
 
37323 52 d 15 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Drop irn_attempt_count; IRN transport retry is unbounded

Removes the attempt counter added in r37322 along with its pending ALTER TABLE, so the
change no longer carries a schema dependency.

NIC outages resolve within the day, and an invoice legally requires an IRN, so capping
the retry would not remove the obligation — it would only stop trying. Transport failures
now stay queued (irn_generated NULL) until the provider recovers; only a genuine rejection
from NIC is terminal. The failure reason is still recorded in irn_error_message, which
distinguishes a requeued transport failure from an invoice never yet attempted.
 
37322 52 d 16 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Stop treating IRN transport timeouts as terminal; isolate NIC calls from batch transaction

A read timeout to GSTPro/NIC was recorded as a final verdict (irn_generated=false),
so 79 invoices billed on 2026-08-17 were left permanently without an IRN even though
NIC may well have filed them. A timeout means the call never completed, not that the
document was rejected.

- markEInvoiceFailed -> recordIrnFailure(invoiceNumber, Throwable): transport failures
leave irn_generated NULL so the cron retries (DUPIRN recovers anything NIC did file);
only a genuine rejection is terminal. Alert email now fires only when terminal.
- New einvoice_details.irn_attempt_count bounds that retry at 10 attempts, reset on
success, so a prolonged NIC outage still converges instead of looping forever.
Requires the matching ALTER TABLE before deploy.
- New saveInvoiceInNewTransaction(invoiceNumber): REQUIRES_NEW per invoice, reloading
orders inside it. RunOnceTasks has class-level @Transactional wrapping the whole
batch loop, so every NIC call previously ran inside one transaction holding write
locks on all orders in the batch; at 60s per call that window is unacceptable.
updateIrnsToInvoices and regenerateBilledInvoices now carry only invoice numbers,
keeping the batch transaction read-only.
- Route all NIC calls (IRN gen, auth, cancel, EWB) through the 60s regulator profile
via GstProAuthService.nicRestClient(). getGstDetails stays on the 10s default since
it runs on request threads.
 
37290 59 d 5 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ Credit Note IRN: credit only the returned units, not the whole invoice

refundOrder persisted the CreditNote and its lines from the returned
inventory items, but then called generateCreditNoteIrn(invoiceNumber, ...),
which rebuilt the NIC payload by re-reading the original invoice - every
line at billed quantity. A 1-pc DOA return against NSDL37092 therefore
tried to register a CN covering the full invoice (2 phones + 27 carry
bags, Rs 26,664.27) against a Rs 13,332 wallet refund, and the legacy
4-digit HSN on the carry-bag line failed NIC validation with error 2311.

The wallet credit, the CreditNote row and its lines were always correct;
only the e-invoice payload was wrong.

- InvoiceService.getInvoicePdfModelForIrn: optional returnedQtyByOrderId
restricts the item list to the returned orders and prices each line at
the returned quantity. The existing single-arg method delegates with
null, so invoice PDF generation is unchanged. Margin-scheme, delivery
challan, IMEI-suffix and HSN handling apply to the reduced line as-is.
- GstProService.generateCreditNoteIrn: 4-arg overload taking the map; the
3-arg version delegates with null for whole-invoice returns.
- PurchaseReturnServiceImpl.refundOrder: passes orderReturnQtyMap, which
was already built for the ReturnOrderInfo rows.

Verified against the NIC sandbox using the real NSDL37092 rows: the old
payload is rejected with error 2311, the new payload is accepted
(DocTyp CRN, ItemCnt 1, MainHsnCode 85171300, TotInvVal 13331.99).

Not covered here: applyInvoiceReturnViaCreditNote still sends the whole
invoice, so an invoice partially returned earlier re-credits those units.
 
37274 59 d 20 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Freeze margin-scheme purchase price on the invoice line

Refurbished (GST Rule 32(5)) lines re-derived their purchase price by serial on
every read, resolving to the LATEST warehouse.inventoryItem row. A returned
device gets re-GRNed, sometimes at a different price, so a credit note or a
regenerated PDF could reverse a margin the invoice never charged. 11 already-
billed lines resolved to a price they were not sold at; IMEI 353917853695268
has been sold on six invoices at two different purchase prices.

InvoiceService.freezeMarginPurchasePrices now stamps the value onto
transaction.lineitem.margin_purchase_price at billing time (saveInvoice step 0,
inside the billing transaction), and resolveMarginPurchasePrice reads the frozen
value thereafter, falling back to the live lookup only when null so pre-existing
lines behave exactly as before.

Requires the column from db-scripts/add_margin_purchase_price_column.sql, which
must be applied before this is deployed.
 
37102 84 d 16 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Remove dead Counter/PrivateDealUser code: drop unused isFofo, bulkShipmentAmountLimit, verifiedOn, documentVerified fields and accessors; remove dead selectByIds repo methods; drop redundant Counter/PrivateDealUser repository injections in OrderServiceImpl and InvoiceService  
37085 86 d 17 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Show PO No and Order Date on transaction invoices/delivery challans

Populate InvoicePdfModel.orderDate (order createTimestamp) on every invoice
and delivery challan. Populate poNumber from the mapped warehouse PO for
internal-PO-derived orders, falling back to the transaction id as the PO
number for non-internal orders. Display-only; no e-invoice/IRN impact.
 
37059 90 d 17 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Revert order date and PO number wiring from invoice model in InvoiceService  
37054 90 d 19 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Invoicing: durably record terminal IRN failures via markEInvoiceFailed (REQUIRES_NEW) with einvoice_details.irn_error_message; add regenerateBilledInvoices for in-place PDF regeneration over a billing window; stamp order date and mapped PO number onto transaction invoices; use the real interest-bearing loan (not the flagship limit block) for credit terms  
36991 98 d 19 h ranu /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ code commited  
36750 129 d 16 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ Keep e-invoice PrdDesc as IMEI count within NIC 300-char limit while invoice PDF lists full IMEIs (complements r36749 IMEI-listing restore)  
36749 129 d 16 h ranu /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ code commited miss beat  
36715 134 d 13 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ Fix Credit Note IRN PrdDesc exceeding 300 char NIC limit — show IMEI count instead of listing all serial numbers, add 300-char safety truncation  
36684 135 d 18 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Add null check for IRN in updatePdfModelWithIrnDetails - skip QR code generation when einvoice_details has no IRN  
36672 136 d 13 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ Wrap email sends in try-catch in IRN/EWB error paths to prevent mail AuthenticationFailedException from blocking PDF generation  
36667 136 d 17 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/invoicing/ Fixed scroll in offers modal  
36453 159 d 13 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/ Fix NPE in credit note IRN: modularize InvoiceService.getInvoicePdfModel into core (ForIrn) and enrichment (EWB/eInvoice), switch purchase return CN to model-based IRN builder  

Show All