| Rev |
Age |
Author |
Path |
Log message |
Diff |
| 37846 |
1 d 21 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
feat(warehouse): dashboards list ACTIVE warehouses only, warehouse-team screens ACTIVE+SUSPENDED (from BillingWarehouseService, WAREHOUSE_MAP gone); global $warehouseNames for labels of data rows in any state; Sellers & Warehouses screen: all-warehouse overview with status tabs, 3-state status, rename, stock/unshipped orders/stores/mapping usage, send stock alert; partner zone offers active warehouses only; brand stock 'All' = active warehouses (replaces r37838 loop); jsVersion 442 |
|
| 37770 |
12 d 21 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
fix(movement): GRN of a movement invoice validated against its own PO + billed IMEIs; Reopen removed; PO list shows Created By; supplier state from GSTIN; jsVersion 436 |
|
| 37750 |
13 d 21 h |
ranu |
/trunk/ |
aging sku purchasing need to approval of niranjan kala sir |
|
| 37734 |
16 d 4 h |
amit |
/trunk/profitmandi-fofo/src/ |
Remove dead third-party integrations: fofo
- SpiceMoney: controller, spiceform.vm, logo, the Quick Links popover on
analysisDashboard / dashboard-readonly (its button was already commented
out in dashboard1.vm) and the /spicemoney/callback auth exclusions
- FundFina controller and the /fundfina/** auth exclusions
- Wiseapp: the Quick Links popover on 12dashboard34 (its only entry) and logos
- SmartPing injection in WebHookController; the Knowlarity webhooks keep
working with the models now in kommuno/model
- Unused Toffee model reference in WarehouseController
- tofee.* keys, aramex.tracking.url and the PAYU PAY payment option in
main and test resources |
|
| 37723 |
18 d 23 h |
amit |
/trunk/profitmandi-fofo/src/ |
Bulk-uploaded movement rows are validated on screen; popup shows arriving stock per PO
Bulk upload only fills the PO screen - the PO is created from the screen. It used to price
with resolvePrices(qty), so one row over what could move rejected the whole file. It now prices
from describeAvailability (same cost layer order creation uses) and never refuses on quantity:
over-cap rows turn red on render, createPO blocks while any row is red and lists them, and
the server checks again on create. An item with no stock and nothing arriving still fails
the upload (nothing to price).
Popup reads in stock + arriving (per PO, <- supplier) - promised (per PO) = can move; the
'Of these, still to arrive' line is gone. Tests for the Oppo A6 UP->Noida case. jsVersion 433.
Needs dao r37722. |
|
| 37719 |
19 d 1 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
feat(po): show only allocated warehouse as 'To Warehouse' on open PO list, drop generic buyer label |
|
| 37718 |
19 d 1 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
feat(po): show allocated warehouse name and id under buyer on open PO list |
|
| 37711 |
19 d 11 h |
amit |
/trunk/ |
Bulk-uploaded PO rows show the same availability breakdown as hand-picked ones
A row added by hand showed what the warehouse holds, what older orders have promised and how many
units the order could take; the same row arriving from a bulk upload showed none of it. The file
was the one place the numbers behind a quantity were hidden, which is the case where a mistake is
least visible and hardest to unpick afterwards.
describeAvailability now also answers for a list of items. Both reads it needs already took a
list, so a whole file costs the same two queries a single item does rather than two per row. An
item the warehouse holds nothing of is left out of the result instead of failing the upload - its
quantity is still checked when the order is priced, and the row simply shows no breakdown.
The single-item and batch paths build their answer from one shared method, so the two cannot drift
apart, and the screen reuses the renderer it already had. |
|
| 37710 |
19 d 11 h |
amit |
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/ |
Closing a movement PO now cancels its orders, and refuses if any has already shipped
A movement is a purchase order and a transaction raised as one, but closing only ever ended the
PO. Its orders stayed live, still able to dispatch stock against an order nobody was going to
receive - the same split that let PO/07-26/52029 ship and invoice goods its PO could never take.
r37709 closed the PO when the last order was cancelled; this is the other direction.
Before cancelling anything it checks every order on the transaction. If one has moved past being
submitted for processing its stock is billed or already gone, and cancelling would write off a
movement that physically happened - so the close is refused, naming the order and its status,
rather than quietly reversing a real dispatch. Rare, but not impossible.
External vendor POs are untouched: they carry no transaction, so the check returns immediately. |
|
| 37704 |
19 d 12 h |
amit |
/trunk/ |
Reopen a movement PO whose stock arrived late, and stop stranding GRN price corrections
Internal movements auto-close after four days, which fits 99.6% of them - 5,491 of 5,515 receipts
land inside the window. The remainder leave the PO closed with the stock still in transit and
nowhere to receive it: 998 internal POs closed during 2026 still holding 21,996 unreceived units.
A closed movement PO can now be reopened from the purchase order list. Reopening stamps
reopenedAt, and auto-close measures from WarehousePurchaseOrder.getOpenSince() - reopenedAt when
set, the PO date otherwise - so a reopened PO gets the same fresh window a new one gets instead of
being closed straight back on the next sweep. Only movements between our own warehouses: an
external vendor PO that has closed is settled with that vendor, not reopened unilaterally.
Separately, a GRN price correction now checks that the PO it just raised is one the invoice can
actually be received against. Matching reads POs that are open and approved for the same supplier
and warehouse dated on or before the invoice; it never looks at the PO being corrected, so what
matters is that the new PO is receivable. 54 were not - backdated into INIT by the old approval
gate, hence outside the match - and each stranded silently: original line discarded, GRN completed
without it, the correction left holding a reservation for stock that had already arrived.
isOpen() names the open set - INIT, READY, PARTIALLY_FULFILLED - that the movement and commitment
queries already read.
Migration sql/add_po_reopened_at_20260918.sql adds reopenedAt, nullable and additive. It must run
before this ships: the entity maps the column. |
|
| 37680 |
20 d 0 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
feat(warehouse): resolve the logged-in user on PO creation and GRN mismatch resolution
Backdated POs are auto-approved in their creator's name, so the user has to travel with the request.
- createPurchaseOrder resolves the logged-in user via cookiesProcessor + authRepository and sets createdBy
- resolvedMismatchRequest passes the resolver through, for the correction PO it can raise
- PO create page no longer says backdated POs need HOD approval
Pairs with r37679. |
|
| 37637 |
21 d 23 h |
amit |
/trunk/profitmandi-fofo/src/ |
feat(pricing): log tag_listing price changes; reference TP instead of vendoritempricing in price drop and tag listing
- Add Pricing and price drop set DP/MOP/MRP via TagListingPriceService (logged with user; price drop logs carry price_drop_id)
- Price drop no longer writes vendoritempricing or vendor catalog pricing; old TP and prefill TP from reference TP
- Tag listing download TP from reference TP; drop unused VendorItemPricingRepository
- TagListingPricingTest: local-DB tests for the price log, reference TP and internal supplier guard |
|
| 37604 |
24 d 23 h |
amit |
/trunk/profitmandi-fofo/src/ |
Show the derived movement price when building an internal purchase order
Both places a price reaches a purchase order now use the movement price for internal
suppliers: the single lookup as an item is added on screen, and the per-item resolution
behind a bulk upload, which does the whole file in one pass instead of loading a circular
the sending warehouse does not have.
Removes addVendorPricingIfMissing, which fired only when someone typed a numeric item id
into the search box, and only for Samsung or non-handsets, writing permanent approved
pricing rows onto the internal supplier from a hardcoded source vendor. Bulk upload never
called it at all, which is why the same item could be added on screen but rejected in a
file.
Tests cover what is decided once origins are known - drawing the oldest stock first,
refusing a quantity that spans two original vendors while naming how many can move and
asking for a separate order, refusing an unmapped supplier, and falling back to the catalog
without ever recording an inferred vendor as though it were known.
Requires profitmandi-dao r37603. |
|
| 37184 |
69 d 0 h |
ranu |
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/ |
ai + fixed brand display |
|
| 37088 |
85 d 1 h |
amit |
/trunk/profitmandi-fofo/src/main/ |
Add Warehouse column to purchase order listing (warehouseId -> name via WAREHOUSE_MAP) |
|
| 36912 |
105 d 4 h |
amit |
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/ |
Internal PO: block billing-warehouse change for PO-mapped orders
Throw if the order's transaction is mapped to an internal PO before changing warehouse in changeBillingWarehouse. |
|
| 36637 |
138 d 0 h |
amit |
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/ |
fix: use full item description in PO bulk upload instead of raw modelName |
|
| 36532 |
147 d 4 h |
amit |
/trunk/ |
Fix moveToBill to use net availability, add bulk PO items upload UI with template download |
|
| 36530 |
147 d 18 h |
amit |
/trunk/ |
Add bulk PO items upload and template download endpoints for PurchaseOrder creation |
|
| 36340 |
168 d 4 h |
amit |
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/ |
Narrow downloadInvoice: release JDBC before PDF streaming + clean error codes
OrderManagementController has class-level @Transactional(rollbackFor=Throwable),
so every downloadInvoice request held a Hikari connection for the entire HTTP
response duration — including the PDF streaming phase over a user's (often
slow) mobile network. The endpoint is the #1 JDBC-slot holder in production.
- Method-level @Transactional(propagation = NOT_SUPPORTED) suspends the
class-level tx for this endpoint so no connection is held by default.
- A short read-only TransactionTemplate scopes the single SELECT (order lookup
by invoice number) inside its own tx. Connection returns to the pool as soon
as the SELECT commits; file streaming then runs without any JDBC session.
- Bounds-check orders.isEmpty() — 2 IndexOutOfBoundsException per log window
previously, now a clean 404 with message body.
- Invoice-not-yet-generated stops surfacing as a 500 with stack trace
(1,534 occurrences in yesterday's log = #1 noise source). Now a 404 with
'please retry shortly' JSON body. Saves log disk and error-budget. |
|