Subversion Repositories SmartDukaan

Rev

Rev 36626 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 36626 Rev 37055
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
                    }