| Line 6... |
Line 6... |
| 6 |
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
|
6 |
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
|
| 7 |
import com.spice.profitmandi.common.model.*;
|
7 |
import com.spice.profitmandi.common.model.*;
|
| 8 |
import com.spice.profitmandi.common.util.FileUtil;
|
8 |
import com.spice.profitmandi.common.util.FileUtil;
|
| 9 |
import com.spice.profitmandi.common.util.Utils.Attachment;
|
9 |
import com.spice.profitmandi.common.util.Utils.Attachment;
|
| 10 |
import com.spice.profitmandi.common.web.util.ResponseSender;
|
10 |
import com.spice.profitmandi.common.web.util.ResponseSender;
|
| 11 |
import com.spice.profitmandi.service.mail.MailOutboxService;
|
- |
|
| 12 |
import com.spice.profitmandi.dao.entity.auth.AuthUser;
|
11 |
import com.spice.profitmandi.dao.entity.auth.AuthUser;
|
| 13 |
import com.spice.profitmandi.dao.entity.catalog.*;
|
12 |
import com.spice.profitmandi.dao.entity.catalog.*;
|
| 14 |
import com.spice.profitmandi.dao.entity.cs.Region;
|
13 |
import com.spice.profitmandi.dao.entity.cs.Region;
|
| 15 |
import com.spice.profitmandi.dao.entity.fofo.*;
|
14 |
import com.spice.profitmandi.dao.entity.fofo.*;
|
| 16 |
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
|
15 |
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
|
| 17 |
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
|
16 |
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
|
| 18 |
import com.spice.profitmandi.dao.entity.transaction.Loan;
|
17 |
import com.spice.profitmandi.dao.entity.transaction.Loan;
|
| 19 |
import com.spice.profitmandi.dao.entity.transaction.Order;
|
18 |
import com.spice.profitmandi.dao.entity.transaction.Order;
|
| 20 |
import com.spice.profitmandi.dao.entity.transaction.SDCreditRequirement;
|
19 |
import com.spice.profitmandi.dao.entity.transaction.SDCreditRequirement;
|
| 21 |
import com.spice.profitmandi.dao.model.BulkCreditSummary;
|
- |
|
| 22 |
import com.spice.profitmandi.service.transaction.SDCreditService;
|
- |
|
| 23 |
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
|
20 |
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
|
| 24 |
import com.spice.profitmandi.dao.entity.warehouse.BrandRegionMapping;
|
21 |
import com.spice.profitmandi.dao.entity.warehouse.BrandRegionMapping;
|
| 25 |
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
|
22 |
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
|
| 26 |
import com.spice.profitmandi.dao.enumuration.inventory.CatalogMovingEnum;
|
23 |
import com.spice.profitmandi.dao.enumuration.inventory.CatalogMovingEnum;
|
| 27 |
import com.spice.profitmandi.dao.event.TagListingEventPublisher;
|
24 |
import com.spice.profitmandi.dao.event.TagListingEventPublisher;
|
| Line 48... |
Line 45... |
| 48 |
import com.spice.profitmandi.service.NotificationService;
|
45 |
import com.spice.profitmandi.service.NotificationService;
|
| 49 |
import com.spice.profitmandi.service.RbmTargetService;
|
46 |
import com.spice.profitmandi.service.RbmTargetService;
|
| 50 |
import com.spice.profitmandi.service.authentication.RoleManager;
|
47 |
import com.spice.profitmandi.service.authentication.RoleManager;
|
| 51 |
import com.spice.profitmandi.service.catalog.BrandsService;
|
48 |
import com.spice.profitmandi.service.catalog.BrandsService;
|
| 52 |
import com.spice.profitmandi.service.inventory.*;
|
49 |
import com.spice.profitmandi.service.inventory.*;
|
| - |
|
50 |
import com.spice.profitmandi.service.mail.MailOutboxService;
|
| - |
|
51 |
import com.spice.profitmandi.service.transaction.SDCreditService;
|
| 53 |
import com.spice.profitmandi.service.user.RetailerService;
|
52 |
import com.spice.profitmandi.service.user.RetailerService;
|
| 54 |
import com.spice.profitmandi.service.wallet.WalletService;
|
53 |
import com.spice.profitmandi.service.wallet.WalletService;
|
| 55 |
import com.spice.profitmandi.web.model.LoginDetails;
|
54 |
import com.spice.profitmandi.web.model.LoginDetails;
|
| 56 |
import com.spice.profitmandi.web.util.CookiesProcessor;
|
55 |
import com.spice.profitmandi.web.util.CookiesProcessor;
|
| 57 |
import com.spice.profitmandi.web.util.MVCResponseSender;
|
56 |
import com.spice.profitmandi.web.util.MVCResponseSender;
|
| Line 2605... |
Line 2604... |
| 2605 |
|
2604 |
|
| 2606 |
Map<Integer, CatalogAgingModel> catalogAgingModelMap = catalogAgingModels.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
|
2605 |
Map<Integer, CatalogAgingModel> catalogAgingModelMap = catalogAgingModels.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
|
| 2607 |
|
2606 |
|
| 2608 |
List<PartnerWarehouseStockAgingSummaryModel> partnerWarehouseStockAgingSummaryModelList = new ArrayList<>();
|
2607 |
List<PartnerWarehouseStockAgingSummaryModel> partnerWarehouseStockAgingSummaryModelList = new ArrayList<>();
|
| 2609 |
|
2608 |
|
| - |
|
2609 |
// Tier-aware floor for P-Fullfilled: partners must always be suggested
|
| - |
|
2610 |
// at least a minimum quantity per SKU based on their tier. If the raw
|
| - |
|
2611 |
// opening_qty from fofo_opening_stock is below the floor, we show the
|
| - |
|
2612 |
// floor instead (this also gives red rows / never-held SKUs a real
|
| - |
|
2613 |
// number to act on). P-Shortage is recomputed against the effective
|
| - |
|
2614 |
// P-Fullfilled so the two columns stay consistent.
|
| - |
|
2615 |
// GOLD / NEW / (fallback) → 3
|
| - |
|
2616 |
// DIAMOND / PLATINUM → 5
|
| - |
|
2617 |
// SILVER / BRONZE → 2
|
| - |
|
2618 |
int tierFloor;
|
| - |
|
2619 |
PartnerTypeChange partnerTypeChangeForFloor = partnerTypeChangeRepository.getRecentChange(fofoId, LocalDate.now());
|
| - |
|
2620 |
PartnerType partnerTierForFloor = partnerTypeChangeForFloor != null ? partnerTypeChangeForFloor.getPartnerType() : null;
|
| - |
|
2621 |
if (partnerTierForFloor == PartnerType.DIAMOND || partnerTierForFloor == PartnerType.PLATINUM) {
|
| - |
|
2622 |
tierFloor = 5;
|
| - |
|
2623 |
} else if (partnerTierForFloor == PartnerType.SILVER || partnerTierForFloor == PartnerType.BRONZE) {
|
| - |
|
2624 |
tierFloor = 2;
|
| - |
|
2625 |
} else {
|
| - |
|
2626 |
tierFloor = 3;
|
| - |
|
2627 |
}
|
| - |
|
2628 |
|
| 2610 |
for (PartnerWarehouseStockSummaryModel stockSummary : partnerWarehouseStockSummaryModels) {
|
2629 |
for (PartnerWarehouseStockSummaryModel stockSummary : partnerWarehouseStockSummaryModels) {
|
| 2611 |
|
2630 |
|
| 2612 |
PartnerWarehouseStockAgingSummaryModel partnerWarehouseStockAgingSummaryModel = new PartnerWarehouseStockAgingSummaryModel();
|
2631 |
PartnerWarehouseStockAgingSummaryModel partnerWarehouseStockAgingSummaryModel = new PartnerWarehouseStockAgingSummaryModel();
|
| 2613 |
partnerWarehouseStockAgingSummaryModel.setCatalogId(stockSummary.getCatalogId());
|
2632 |
partnerWarehouseStockAgingSummaryModel.setCatalogId(stockSummary.getCatalogId());
|
| 2614 |
partnerWarehouseStockAgingSummaryModel.setBrand(stockSummary.getBrand());
|
2633 |
partnerWarehouseStockAgingSummaryModel.setBrand(stockSummary.getBrand());
|
| 2615 |
partnerWarehouseStockAgingSummaryModel.setModelNumber(stockSummary.getModelNumber());
|
2634 |
partnerWarehouseStockAgingSummaryModel.setModelNumber(stockSummary.getModelNumber());
|
| 2616 |
partnerWarehouseStockAgingSummaryModel.setNetAvailability(stockSummary.getShaholicNetAvailability());
|
2635 |
partnerWarehouseStockAgingSummaryModel.setNetAvailability(stockSummary.getShaholicNetAvailability());
|
| - |
|
2636 |
int effectivePFullfilled = Math.max(stockSummary.getPartnerFullFilledQty(), tierFloor);
|
| - |
|
2637 |
int currentQty = stockSummary.getPartnerCurrentQty();
|
| 2617 |
partnerWarehouseStockAgingSummaryModel.setPartnerStockAvailability(stockSummary.getPartnerFullFilledQty());
|
2638 |
partnerWarehouseStockAgingSummaryModel.setPartnerStockAvailability(effectivePFullfilled);
|
| 2618 |
partnerWarehouseStockAgingSummaryModel.setPartnerCurrentAvailability(stockSummary.getPartnerCurrentQty());
|
2639 |
partnerWarehouseStockAgingSummaryModel.setPartnerCurrentAvailability(currentQty);
|
| 2619 |
partnerWarehouseStockAgingSummaryModel.setPartnerShortageStock(stockSummary.getPartnerShortageQty());
|
2640 |
partnerWarehouseStockAgingSummaryModel.setPartnerShortageStock(Math.max(effectivePFullfilled - currentQty, 0));
|
| 2620 |
if (catalogAgingModelMap.get(stockSummary.getCatalogId()) != null) {
|
2641 |
if (catalogAgingModelMap.get(stockSummary.getCatalogId()) != null) {
|
| 2621 |
partnerWarehouseStockAgingSummaryModel.setExceedDays(catalogAgingModelMap.get(stockSummary.getCatalogId()).getExceedDays());
|
2642 |
partnerWarehouseStockAgingSummaryModel.setExceedDays(catalogAgingModelMap.get(stockSummary.getCatalogId()).getExceedDays());
|
| 2622 |
} else {
|
2643 |
} else {
|
| 2623 |
partnerWarehouseStockAgingSummaryModel.setExceedDays(0);
|
2644 |
partnerWarehouseStockAgingSummaryModel.setExceedDays(0);
|
| 2624 |
|
2645 |
|
| Line 2639... |
Line 2660... |
| 2639 |
PartnerWarehouseStockAgingSummaryModel agingModel = new PartnerWarehouseStockAgingSummaryModel();
|
2660 |
PartnerWarehouseStockAgingSummaryModel agingModel = new PartnerWarehouseStockAgingSummaryModel();
|
| 2640 |
agingModel.setCatalogId(intransitStock.getCatalogId());
|
2661 |
agingModel.setCatalogId(intransitStock.getCatalogId());
|
| 2641 |
agingModel.setBrand(intransitStock.getBrand());
|
2662 |
agingModel.setBrand(intransitStock.getBrand());
|
| 2642 |
agingModel.setModelNumber(intransitStock.getModelNumber());
|
2663 |
agingModel.setModelNumber(intransitStock.getModelNumber());
|
| 2643 |
agingModel.setNetAvailability(0); // Not part of original aging summary
|
2664 |
agingModel.setNetAvailability(0); // Not part of original aging summary
|
| - |
|
2665 |
int intransitEffectivePFullfilled = Math.max(intransitStock.getPartnerFullFilledQty(), tierFloor);
|
| - |
|
2666 |
int intransitCurrentQty = intransitStock.getPartnerCurrentQty();
|
| 2644 |
agingModel.setPartnerStockAvailability(intransitStock.getPartnerFullFilledQty());
|
2667 |
agingModel.setPartnerStockAvailability(intransitEffectivePFullfilled);
|
| 2645 |
agingModel.setPartnerCurrentAvailability(intransitStock.getPartnerCurrentQty());
|
2668 |
agingModel.setPartnerCurrentAvailability(intransitCurrentQty);
|
| 2646 |
agingModel.setPartnerShortageStock(intransitStock.getPartnerShortageQty());
|
2669 |
agingModel.setPartnerShortageStock(Math.max(intransitEffectivePFullfilled - intransitCurrentQty, 0));
|
| 2647 |
if (catalogAgingModelMap.get(intransitStock.getCatalogId()) != null) {
|
2670 |
if (catalogAgingModelMap.get(intransitStock.getCatalogId()) != null) {
|
| 2648 |
agingModel.setExceedDays(catalogAgingModelMap.get(intransitStock.getCatalogId()).getExceedDays());
|
2671 |
agingModel.setExceedDays(catalogAgingModelMap.get(intransitStock.getCatalogId()).getExceedDays());
|
| 2649 |
} else {
|
2672 |
} else {
|
| 2650 |
agingModel.setExceedDays(0);
|
2673 |
agingModel.setExceedDays(0);
|
| 2651 |
}
|
2674 |
}
|