Subversion Repositories SmartDukaan

Rev

Rev 31694 | Rev 32171 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
23405 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
25736 tejbeer 3
import com.mongodb.DBObject;
30046 tejbeer 4
import com.spice.profitmandi.common.enumuration.ActivationType;
23785 amit.gupta 5
import com.spice.profitmandi.common.enumuration.CounterSize;
26846 tejbeer 6
import com.spice.profitmandi.common.enumuration.MessageType;
23405 amit.gupta 7
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30017 amit.gupta 8
import com.spice.profitmandi.common.model.*;
24231 amit.gupta 9
import com.spice.profitmandi.common.util.FileUtil;
25721 tejbeer 10
import com.spice.profitmandi.common.util.Utils;
11
import com.spice.profitmandi.common.util.Utils.Attachment;
26721 tejbeer 12
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30003 tejbeer 13
import com.spice.profitmandi.dao.entity.catalog.Category;
25721 tejbeer 14
import com.spice.profitmandi.dao.entity.catalog.FocusedModel;
23785 amit.gupta 15
import com.spice.profitmandi.dao.entity.catalog.Item;
23405 amit.gupta 16
import com.spice.profitmandi.dao.entity.catalog.TagListing;
27088 tejbeer 17
import com.spice.profitmandi.dao.entity.cs.Region;
30017 amit.gupta 18
import com.spice.profitmandi.dao.entity.fofo.*;
30664 amit.gupta 19
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
30003 tejbeer 20
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
23796 amit.gupta 21
import com.spice.profitmandi.dao.entity.transaction.Order;
26846 tejbeer 22
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
23796 amit.gupta 23
import com.spice.profitmandi.dao.entity.user.User;
30017 amit.gupta 24
import com.spice.profitmandi.dao.entity.warehouse.BrandRegionMapping;
26978 tejbeer 25
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
30003 tejbeer 26
import com.spice.profitmandi.dao.model.FofoReportingModel;
27
import com.spice.profitmandi.dao.model.InStockAccessoriesTvFofoIdModel;
28
import com.spice.profitmandi.dao.model.InStockBrandFofoIdModel;
26721 tejbeer 29
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30003 tejbeer 30
import com.spice.profitmandi.dao.repository.catalog.CategoryRepository;
25721 tejbeer 31
import com.spice.profitmandi.dao.repository.catalog.FocusedModelRepository;
23405 amit.gupta 32
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
33
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
31663 amit.gupta 34
import com.spice.profitmandi.dao.repository.cs.*;
30044 tejbeer 35
import com.spice.profitmandi.dao.repository.dtr.BrandLimitRepository;
23779 amit.gupta 36
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
25736 tejbeer 37
import com.spice.profitmandi.dao.repository.dtr.Mongo;
26846 tejbeer 38
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
30017 amit.gupta 39
import com.spice.profitmandi.dao.repository.fofo.*;
30664 amit.gupta 40
import com.spice.profitmandi.dao.repository.inventory.SaholicCISTableRepository;
27768 tejbeer 41
import com.spice.profitmandi.dao.repository.inventory.SaholicInventoryCISRepository;
30017 amit.gupta 42
import com.spice.profitmandi.dao.repository.inventory.WarehouseRepository;
23796 amit.gupta 43
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
44
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
45
import com.spice.profitmandi.dao.repository.user.UserRepository;
30017 amit.gupta 46
import com.spice.profitmandi.dao.repository.warehouse.BrandRegionMappingRepository;
26846 tejbeer 47
import com.spice.profitmandi.service.NotificationService;
23798 amit.gupta 48
import com.spice.profitmandi.service.authentication.RoleManager;
25736 tejbeer 49
import com.spice.profitmandi.service.inventory.InventoryService;
27768 tejbeer 50
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
23779 amit.gupta 51
import com.spice.profitmandi.service.inventory.StockAllocationService;
52
import com.spice.profitmandi.service.user.RetailerService;
25547 amit.gupta 53
import com.spice.profitmandi.service.wallet.WalletService;
23796 amit.gupta 54
import com.spice.profitmandi.thrift.clients.PaymentClient;
55
import com.spice.profitmandi.thrift.clients.TransactionClient;
56
import com.spice.profitmandi.thrift.clients.UserClient;
23405 amit.gupta 57
import com.spice.profitmandi.web.model.LoginDetails;
58
import com.spice.profitmandi.web.util.CookiesProcessor;
59
import com.spice.profitmandi.web.util.MVCResponseSender;
23796 amit.gupta 60
import in.shop2020.logistics.PickUpType;
30017 amit.gupta 61
import in.shop2020.model.v1.order.*;
23796 amit.gupta 62
import in.shop2020.model.v1.user.ItemPriceQuantity;
63
import in.shop2020.model.v1.user.ShoppingCartException;
64
import in.shop2020.model.v1.user.UserContextService.Client;
65
import in.shop2020.payments.Attribute;
66
import in.shop2020.payments.PaymentException;
67
import in.shop2020.payments.PaymentStatus;
30017 amit.gupta 68
import org.apache.commons.io.output.ByteArrayOutputStream;
69
import org.apache.logging.log4j.LogManager;
70
import org.apache.logging.log4j.Logger;
71
import org.apache.thrift.TException;
72
import org.json.JSONArray;
73
import org.json.JSONObject;
74
import org.springframework.beans.factory.annotation.Autowired;
75
import org.springframework.core.io.ByteArrayResource;
76
import org.springframework.http.HttpHeaders;
77
import org.springframework.http.HttpStatus;
78
import org.springframework.http.ResponseEntity;
79
import org.springframework.mail.javamail.JavaMailSender;
80
import org.springframework.stereotype.Controller;
81
import org.springframework.transaction.annotation.Transactional;
82
import org.springframework.ui.Model;
83
import org.springframework.web.bind.annotation.RequestBody;
84
import org.springframework.web.bind.annotation.RequestMapping;
85
import org.springframework.web.bind.annotation.RequestMethod;
86
import org.springframework.web.bind.annotation.RequestParam;
23796 amit.gupta 87
 
30017 amit.gupta 88
import javax.servlet.http.HttpServletRequest;
89
import java.time.LocalDate;
90
import java.time.LocalDateTime;
91
import java.time.LocalTime;
92
import java.util.*;
93
import java.util.Map.Entry;
94
import java.util.function.Function;
95
import java.util.stream.Collectors;
96
 
23405 amit.gupta 97
@Controller
98
@Transactional(rollbackFor = Throwable.class)
99
public class IndentController {
100
 
23568 govind 101
	private static final Logger LOGGER = LogManager.getLogger(IndentController.class);
23796 amit.gupta 102
	private static final int WALLET_GATEWAY_ID = 8;
24406 amit.gupta 103
	private static final Set<Integer> defaultTags = new HashSet<Integer>(Arrays.asList(4));
23405 amit.gupta 104
 
24231 amit.gupta 105
	private final List<OrderStatus> partnerPendingOrderList = Arrays.asList(OrderStatus.ACCEPTED,
106
			OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.BILLED, OrderStatus.SHIPPED_FROM_WH,
107
			OrderStatus.SHIPPED_TO_DESTINATION_CITY, OrderStatus.SHIPPED_TO_LOGST,
108
			OrderStatus.REACHED_DESTINATION_CITY);
25721 tejbeer 109
 
26951 amit.gupta 110
	private static final int PLANNING_OPEN_DAY = 20;
111
	private static final int PLANNING_CLOSE_DAY = 1;
112
 
30017 amit.gupta 113
	private static final String PO_TITLE_STRING = "Alert - Stock Arriving at SD Warehouse";
114
 
25547 amit.gupta 115
	@Autowired
116
	WalletService walletService;
24231 amit.gupta 117
 
23405 amit.gupta 118
	@Autowired
30017 amit.gupta 119
	BrandRegionMappingRepository brandRegionMappingRepository;
120
 
121
	@Autowired
25721 tejbeer 122
	private JavaMailSender googleMailSender;
123
 
124
	@Autowired
23405 amit.gupta 125
	private CookiesProcessor cookiesProcessor;
24231 amit.gupta 126
 
23796 amit.gupta 127
	@Autowired
128
	private UserWalletRepository userWalletRepository;
23785 amit.gupta 129
 
23779 amit.gupta 130
	@Autowired
23796 amit.gupta 131
	private UserRepository userRepository;
132
 
133
	@Autowired
23779 amit.gupta 134
	FofoStoreRepository fofoStoreRepository;
23405 amit.gupta 135
 
136
	@Autowired
23796 amit.gupta 137
	private OrderRepository orderRepository;
138
 
139
	@Autowired
26846 tejbeer 140
	private UserAccountRepository userAccountRepository;
141
 
142
	@Autowired
23405 amit.gupta 143
	private ItemRepository itemRepository;
144
 
145
	@Autowired
23779 amit.gupta 146
	private StockAllocationService stockAllocationService;
147
 
148
	@Autowired
149
	private RetailerService retailerService;
23405 amit.gupta 150
 
151
	@Autowired
152
	private TagListingRepository tagListingRepository;
153
 
154
	@Autowired
155
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
156
 
157
	@Autowired
23796 amit.gupta 158
	private PurchaseRepository purchaseRepository;
159
 
160
	@Autowired
23405 amit.gupta 161
	private MVCResponseSender mvcResponseSender;
162
 
23785 amit.gupta 163
	@Autowired
25721 tejbeer 164
	private FocusedModelRepository focusedModelRepository;
165
 
166
	@Autowired
167
	private MonthlyPlannedRepository monthlyPlannedRepository;
168
 
169
	@Autowired
170
	private FofoOrderRepository fofoOrderRepository;
25732 tejbeer 171
 
25721 tejbeer 172
	@Autowired
25732 tejbeer 173
	private FofoOrderItemRepository fofoOrderItemRepository;
174
 
175
	@Autowired
25721 tejbeer 176
	private PlannedDetailRepository plannedDetailRepository;
25732 tejbeer 177
 
25721 tejbeer 178
	@Autowired
23785 amit.gupta 179
	RoleManager roleManager;
23405 amit.gupta 180
 
25721 tejbeer 181
	@Autowired
27081 tejbeer 182
	PartnerTypeChangeRepository partnerTypeChangeRepository;
183
 
184
	@Autowired
25736 tejbeer 185
	private Mongo mongoClient;
186
 
187
	@Autowired
188
	private InventoryService inventoryService;
189
 
190
	@Autowired
31663 amit.gupta 191
	private CsService1 csService1;
192
 
193
	@Autowired
26721 tejbeer 194
	private CsService csService;
25721 tejbeer 195
 
26721 tejbeer 196
	@Autowired
197
	private AuthRepository authRepository;
26846 tejbeer 198
	@Autowired
30017 amit.gupta 199
	WarehouseRepository warehouseRepository;
26846 tejbeer 200
	@Autowired
30017 amit.gupta 201
	private SuggestedPoRepository suggestedPoRepository;
26846 tejbeer 202
 
203
	@Autowired
204
	private NotificationService notificationService;
205
 
27088 tejbeer 206
	@Autowired
207
	private RegionRepository regionRepository;
208
 
209
	@Autowired
210
	private PartnerRegionRepository partnerRegionRepository;
211
 
27768 tejbeer 212
	@Autowired
213
	private SaholicInventoryCISRepository saholicInventoryCISRepository;
214
 
215
	@Autowired
216
	private SaholicInventoryService saholicInventoryService;
217
 
30003 tejbeer 218
	@Autowired
219
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
30017 amit.gupta 220
	@Autowired
221
	private SuggestedPoDetailRepository suggestedPoDetailRepository;
30003 tejbeer 222
 
30664 amit.gupta 223
	@Autowired
224
	SaholicCISTableRepository saholicCISTableRepository;
225
 
23779 amit.gupta 226
	@RequestMapping(value = "/open-indent/save", method = RequestMethod.POST)
25721 tejbeer 227
	public String saveOpenIndent(HttpServletRequest request, Model model, @RequestParam int catalogId,
31317 tejbeer 228
			@RequestParam int itemQty, @RequestParam int fofoId) throws Exception {
27088 tejbeer 229
		if (fofoId == 0) {
230
 
231
			LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
232
			fofoId = loginDetails.getFofoId();
233
 
26990 tejbeer 234
		}
27088 tejbeer 235
 
26082 tejbeer 236
		LocalDate currentMonthDate = LocalDate.now();
237
		MonthlyPlanned monthlyPlanned = null;
25721 tejbeer 238
 
26951 amit.gupta 239
		if (LocalDate.now().isAfter(LocalDate.now().withDayOfMonth(PLANNING_OPEN_DAY))) {
26082 tejbeer 240
			currentMonthDate = LocalDate.now().plusMonths(1).withDayOfMonth(1);
26978 tejbeer 241
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, currentMonthDate);
242
			LOGGER.info("monthlyPlanned" + monthlyPlanned);
243
			saveMonthlyPlanned(monthlyPlanned, fofoId, currentMonthDate, catalogId, itemQty);
26082 tejbeer 244
		}
31238 amit.gupta 245
		model.addAttribute("response1", mvcResponseSender.createResponseString(false));
26082 tejbeer 246
		return "response";
247
	}
248
 
249
	private void saveMonthlyPlanned(MonthlyPlanned monthlyPlanned, int fofoId, LocalDate currentMonthDate,
31317 tejbeer 250
			int catalogId, int itemQty) {
25721 tejbeer 251
		if (monthlyPlanned == null) {
252
			monthlyPlanned = new MonthlyPlanned();
26082 tejbeer 253
			monthlyPlanned.setFofoId(fofoId);
254
			monthlyPlanned.setYearMonth(currentMonthDate);
25721 tejbeer 255
			monthlyPlannedRepository.persist(monthlyPlanned);
256
			PlannedDetail pd = new PlannedDetail();
257
			pd.setCatalogId(catalogId);
258
			pd.setPlannedId(monthlyPlanned.getId());
259
			pd.setQuantity(itemQty);
260
			pd.setUpdatedTimestamp(LocalDateTime.now());
261
			plannedDetailRepository.persist(pd);
262
 
23786 amit.gupta 263
		} else {
25721 tejbeer 264
			PlannedDetail plannedDetail = plannedDetailRepository.selectByPlannedIdCatalogId(monthlyPlanned.getId(),
265
					catalogId);
266
			if (plannedDetail == null) {
267
				plannedDetail = new PlannedDetail();
268
				plannedDetail.setCatalogId(catalogId);
269
				plannedDetail.setPlannedId(monthlyPlanned.getId());
270
				plannedDetail.setQuantity(itemQty);
271
				plannedDetail.setUpdatedTimestamp(LocalDateTime.now());
272
				plannedDetailRepository.persist(plannedDetail);
273
			} else if (itemQty == 0) {
274
				plannedDetailRepository.delete(plannedDetail);
275
 
276
			} else {
277
				plannedDetail.setCatalogId(catalogId);
278
				plannedDetail.setQuantity(itemQty);
279
				plannedDetail.setUpdatedTimestamp(LocalDateTime.now());
280
			}
281
 
23785 amit.gupta 282
		}
25721 tejbeer 283
 
284
	}
285
 
286
	@RequestMapping(value = "/open-indent/confirm", method = RequestMethod.POST)
26748 tejbeer 287
	public String confirmOpenIndent(HttpServletRequest request,
31317 tejbeer 288
			@RequestParam(required = false, defaultValue = "0") int fofoId, Model model) throws Exception {
26748 tejbeer 289
 
290
		if (fofoId == 0) {
291
			LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
292
			fofoId = loginDetails.getFofoId();
293
		}
25721 tejbeer 294
		CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
26748 tejbeer 295
 
26951 amit.gupta 296
		LocalDate currentDate = LocalDate.now();
297
		LocalDate planningMonthDate = null;
26082 tejbeer 298
		MonthlyPlanned monthlyPlanned = null;
26951 amit.gupta 299
		if (currentDate.isAfter(currentDate.withDayOfMonth(PLANNING_OPEN_DAY))) {
300
			planningMonthDate = LocalDate.now().plusMonths(1).withDayOfMonth(1);
301
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, planningMonthDate);
25721 tejbeer 302
 
26082 tejbeer 303
			confirmMonthlyPlanned(monthlyPlanned, customRetailer, fofoId);
304
		}
31238 amit.gupta 305
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26082 tejbeer 306
 
307
		return "response";
308
	}
309
 
310
	private void confirmMonthlyPlanned(MonthlyPlanned monthlyPlanned, CustomRetailer customRetailer, int fofoId)
311
			throws Exception {
25721 tejbeer 312
		List<PlannedDetail> plannedDetails = plannedDetailRepository.selectByPlannedId(monthlyPlanned.getId());
313
 
314
		List<PlannedModel> plannedModel = new ArrayList<>();
315
		for (PlannedDetail plannedDetail : plannedDetails) {
316
 
317
			List<Item> items = itemRepository.selectAllByCatalogItemId(plannedDetail.getCatalogId());
318
			String itemDesription = items.get(0).getItemDescriptionNoColor();
319
			PlannedModel pm = new PlannedModel();
320
			pm.setItemDescription(itemDesription);
321
			pm.setStoreName(customRetailer.getBusinessName());
322
			pm.setQty(plannedDetail.getQuantity());
26082 tejbeer 323
			pm.setFofoId(fofoId);
25721 tejbeer 324
			plannedModel.add(pm);
325
			LOGGER.info("plannedModel" + plannedModel);
326
 
23785 amit.gupta 327
		}
26978 tejbeer 328
		List<String> ccemails = new ArrayList<>();
329
		LOGGER.info("ccemails" + ccemails);
330
		Map<EscalationType, String> emailEsclationType = csService.getAuthUserAndEsclationTypeByPartnerId(fofoId);
331
		LOGGER.info("emailEsclationType" + emailEsclationType);
31636 tejbeer 332
		if (emailEsclationType.get(EscalationType.L1) != null) {
333
			ccemails.add(emailEsclationType.get(EscalationType.L1));
334
		}
335
 
336
		if (emailEsclationType.get(EscalationType.L2) != null) {
337
 
338
			ccemails.add(emailEsclationType.get(EscalationType.L2));
339
		}
26978 tejbeer 340
		LOGGER.info("ccemails" + ccemails);
341
		List<String> bccemails = new ArrayList<>();
342
		bccemails.add(emailEsclationType.get(EscalationType.L3));
343
		LOGGER.info("bccemails" + bccemails);
25721 tejbeer 344
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
345
				Arrays.asList("Partner Id", "Partner Name", "Model Name", "Qty"),
346
				plannedModel.stream()
347
						.map(x -> Arrays.asList(x.getFofoId(), x.getStoreName(), x.getItemDescription(), x.getQty()))
348
						.collect(Collectors.toList()));
349
		LOGGER.info("baos" + baos);
31317 tejbeer 350
		Utils.sendMailWithAttachments(googleMailSender, new String[] { customRetailer.getEmail() },
26978 tejbeer 351
				ccemails.toArray(new String[ccemails.size()]), bccemails.toArray(new String[bccemails.size()]),
25721 tejbeer 352
				"Planned Indent", "PFA",
31317 tejbeer 353
				new Attachment[] { new Attachment("PlannedIndent.csv", new ByteArrayResource(baos.toByteArray())), });
25721 tejbeer 354
 
23405 amit.gupta 355
	}
356
 
24231 amit.gupta 357
	@RequestMapping(value = "/indent/download", method = RequestMethod.GET)
358
	public ResponseEntity<ByteArrayResource> downloadIndent(HttpServletRequest request, Model model,
31317 tejbeer 359
			@RequestParam(required = false, defaultValue = "0") int fofoId,
360
			@RequestParam(defaultValue = "TEN_LAC") CounterSize counterSize) throws Exception {
25702 amit.gupta 361
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
362
		Set<Integer> roleIds = loginDetails.getRoleIds();
24231 amit.gupta 363
		LOGGER.info("Counter size is {}", counterSize);
364
		LOGGER.info("Fofo Id is {}", fofoId);
30426 tejbeer 365
 
25721 tejbeer 366
		if (roleManager.isAdmin(roleIds) || loginDetails.getFofoId() == fofoId) {
24231 amit.gupta 367
			List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId())
368
					.collect(Collectors.toList());
30426 tejbeer 369
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
370
			Map<Integer, CustomRetailer> crm = fofoIds.stream().map(x -> customRetailerMap.get(x))
371
					.filter(x -> x != null).collect(Collectors.toList()).stream()
372
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
24232 amit.gupta 373
			List<StockAllocationModel> stockAllocationList = stockAllocationService.getStockAllocation(counterSize,
374
					true);
375
			Map<Integer, Integer> modelStockAllocationMap = stockAllocationList.stream()
376
					.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getQuantity()));
23405 amit.gupta 377
 
24232 amit.gupta 378
			Map<String, Integer> catalogUserQtyMap = new HashMap<>();
25702 amit.gupta 379
			currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().forEach(x -> {
24232 amit.gupta 380
				int retailerId = x.getFofoId();
381
				int catalogId;
382
				try {
383
					catalogId = itemRepository.selectById(x.getItemId()).getCatalogItemId();
384
					String key = catalogId + "-" + retailerId;
385
					if (!catalogUserQtyMap.containsKey(key)) {
386
						catalogUserQtyMap.put(key, 0);
387
					}
388
					catalogUserQtyMap.put(key, catalogUserQtyMap.get(key) + x.getAvailability());
389
				} catch (ProfitMandiBusinessException e) {
390
					// TODO Auto-generated catch block
391
					throw new RuntimeException(e);
24231 amit.gupta 392
				}
393
			});
23779 amit.gupta 394
 
24231 amit.gupta 395
			List<Order> inTransitOrders = orderRepository.selectOrders(fofoIds, partnerPendingOrderList);
24232 amit.gupta 396
			Map<String, Integer> catalogUserInTransit = inTransitOrders.stream().collect(Collectors.groupingBy(x -> {
397
				try {
398
					return itemRepository.selectById(x.getLineItem().getItemId()).getCatalogItemId() + "-"
399
							+ x.getRetailerId();
400
				} catch (ProfitMandiBusinessException e) {
401
					// TODO Auto-generated catch block
402
					return "";
403
				}
404
			}, Collectors.summingInt(x -> x.getLineItem().getQuantity())));
23779 amit.gupta 405
 
24232 amit.gupta 406
			Map<String, CatalogListingModel> catalogListingMap = new HashMap<>();
407
 
408
			List<TagListing> tagListings = tagListingRepository.selectAll(true);
409
			Iterator<TagListing> iterator = tagListings.iterator();
24231 amit.gupta 410
			while (iterator.hasNext()) {
411
				TagListing tagListing = iterator.next();
412
				Item item = itemRepository.selectById(tagListing.getItemId());
24232 amit.gupta 413
				int catalogId = item.getCatalogItemId();
24231 amit.gupta 414
				if (item.getCategoryId() != 10006) {
415
					continue;
416
				}
23779 amit.gupta 417
 
24232 amit.gupta 418
				int catalogStockAllocationQuantity = modelStockAllocationMap.containsKey(catalogId)
419
						? modelStockAllocationMap.get(catalogId)
420
						: 0;
421
				for (int retailerId : fofoIds) {
422
					String key = catalogId + "-" + retailerId;
423
					if (catalogListingMap.containsKey(key)) {
424
						continue;
24231 amit.gupta 425
					}
24232 amit.gupta 426
					int catalogInTransit = catalogUserInTransit.containsKey(key) ? catalogUserInTransit.get(key) : 0;
427
					int catalogInStock = catalogUserQtyMap.containsKey(key) ? catalogUserQtyMap.get(key) : 0;
428
					if (catalogInTransit + catalogInStock == 0 && catalogStockAllocationQuantity == 0) {
429
						continue;
430
					}
431
					CatalogListingModel catalogListingModel = new CatalogListingModel();
432
					catalogListingModel.setFofoId(retailerId);
433
					catalogListingModel.setModelName(item.getModelName());
434
					catalogListingModel.setModelNumber(item.getModelNumber());
435
					catalogListingModel.setCatalogId(catalogId);
436
					catalogListingModel.setDp(tagListing.getSellingPrice());
437
					catalogListingModel.setMop(tagListing.getMop());
438
					catalogListingModel.setItemDescription(item.getItemDescriptionNoColor());
439
					catalogListingModel.setAllocatedQuantity(catalogStockAllocationQuantity);
440
					catalogListingModel.setInTransitQuantity(catalogInTransit);
441
					catalogListingModel
442
							.setToBeOrdered(catalogStockAllocationQuantity - catalogInTransit - catalogInStock);
24233 amit.gupta 443
					catalogListingModel.setStockInHand(catalogInStock);
24232 amit.gupta 444
					catalogListingModel.setBrand(item.getBrand());
445
					catalogListingModel.setModelName(item.getModelName());
446
					catalogListingModel.setModelNumber(item.getModelNumber());
447
					catalogListingModel.setCategoryId(item.getCategoryId());
448
					catalogListingMap.put(key, catalogListingModel);
23405 amit.gupta 449
				}
450
			}
25853 amit.gupta 451
			List<List<?>> listOfRows = new ArrayList<>();
24231 amit.gupta 452
			for (CatalogListingModel clm : catalogListingMap.values()) {
30426 tejbeer 453
				CustomRetailer cr = crm.get(clm.getFofoId());
24349 amit.gupta 454
				listOfRows.add(Arrays.asList(cr.getPartnerId(), cr.getBusinessName(), clm.getCatalogId(),
455
						clm.getBrand(), clm.getModelName(), clm.getModelNumber(), clm.getDp(), clm.getMop(),
456
						clm.getAllocatedQuantity(), clm.getInTransitQuantity(), clm.getStockInHand(),
457
						clm.getToBeOrdered()));
24231 amit.gupta 458
			}
24349 amit.gupta 459
			ByteArrayOutputStream baos = FileUtil
460
					.getCSVByteStream(
461
							Arrays.asList("StoreId", "StoreName", "Catalog Id", "Brand", "Model Name", "Model Number",
462
									"DP", "MOP", "Allocated Quantity", "In Transit", "Stock In hand", "Shortage"),
463
							listOfRows);
24231 amit.gupta 464
			HttpHeaders headers = new HttpHeaders();
465
			headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
466
			headers.set("Content-disposition", "inline; filename=retailer-allocation.csv");
24232 amit.gupta 467
			return new ResponseEntity<ByteArrayResource>(new ByteArrayResource(baos.toByteArray()), headers,
468
					HttpStatus.OK);
23405 amit.gupta 469
		}
24231 amit.gupta 470
		return null;
24232 amit.gupta 471
 
23405 amit.gupta 472
	}
473
 
24349 amit.gupta 474
	@RequestMapping(value = "/itemsByCatalogId")
475
	public String getItemsByCatalogId(HttpServletRequest request, Model model,
31317 tejbeer 476
			@RequestParam(required = false) int catalogId, @RequestParam(required = false) int itemId)
25378 tejbeer 477
			throws ProfitMandiBusinessException {
24410 amit.gupta 478
		if (catalogId == 0) {
479
			catalogId = itemRepository.selectById(itemId).getCatalogItemId();
480
		}
24349 amit.gupta 481
		List<Item> items = itemRepository.selectAllByCatalogItemId(catalogId);
24414 amit.gupta 482
		LOGGER.info("Items {}", items);
25378 tejbeer 483
		Map<Integer, String> itemsColorMap = items.stream().filter(x -> x.getColorNatural().startsWith("f_"))
484
				.collect(Collectors.toMap(Item::getId, Item::getColor));
24413 amit.gupta 485
		Map<Integer, TagListing> tagsMap = tagListingRepository
486
				.selectByItemIdsAndTagIds(items.stream().map(x -> x.getId()).collect(Collectors.toSet()), defaultTags)
25378 tejbeer 487
				.stream().collect(Collectors.toMap(TagListing::getItemId, x -> x));
24414 amit.gupta 488
		LOGGER.info("Items color map {}", itemsColorMap);
24349 amit.gupta 489
		JSONArray response = new JSONArray();
24413 amit.gupta 490
		itemsColorMap.keySet().stream().forEach(x -> {
25378 tejbeer 491
			response.put(new JSONObject().put("color", itemsColorMap.get(x)).put("id", x).put("active",
492
					tagsMap.get(x) == null ? false : tagsMap.get(x).isActive()));
24349 amit.gupta 493
		});
31238 amit.gupta 494
		model.addAttribute("response1", response.toString());
24349 amit.gupta 495
		return "response";
24410 amit.gupta 496
 
24349 amit.gupta 497
	}
498
 
28055 tejbeer 499
	@RequestMapping(value = "/hotdealsitemsByCatalogId")
500
	public String getHotdealsitemsByCatalogId(HttpServletRequest request, Model model,
31317 tejbeer 501
			@RequestParam(required = false) int catalogId, @RequestParam(required = false) int itemId)
28055 tejbeer 502
			throws ProfitMandiBusinessException {
503
		if (catalogId == 0) {
504
			catalogId = itemRepository.selectById(itemId).getCatalogItemId();
505
		}
506
		List<Item> items = itemRepository.selectAllByCatalogItemId(catalogId);
507
		LOGGER.info("Items {}", items);
508
		Map<Integer, String> itemsColorMap = items.stream().filter(x -> x.getColorNatural().startsWith("f_"))
509
				.collect(Collectors.toMap(Item::getId, Item::getColor));
510
		Map<Integer, TagListing> tagsMap = tagListingRepository
511
				.selectByItemIdsAndTagIds(items.stream().map(x -> x.getId()).collect(Collectors.toSet()), defaultTags)
512
				.stream().collect(Collectors.toMap(TagListing::getItemId, x -> x));
513
		LOGGER.info("Items color map {}", itemsColorMap);
514
		JSONArray response = new JSONArray();
515
		itemsColorMap.keySet().stream().forEach(x -> {
516
			response.put(new JSONObject().put("color", itemsColorMap.get(x)).put("id", x).put("hotDeals",
517
					tagsMap.get(x) == null ? false : tagsMap.get(x).isHotDeals()));
518
		});
31238 amit.gupta 519
		model.addAttribute("response1", response.toString());
28055 tejbeer 520
		return "response";
521
 
522
	}
523
 
30664 amit.gupta 524
	private List<Order> filterValidOrders(List<Order> lastOrdersList) {
525
		int orderRemovedCount = 0;
526
		Iterator<Order> orderIterator = lastOrdersList.iterator();
527
		while (orderIterator.hasNext()) {
528
			Order o = orderIterator.next();
529
			if (o.getInvoiceNumber() != null) {
530
				try {
531
					purchaseRepository.selectByPurchaseReferenceAndFofoId(o.getInvoiceNumber(), o.getRetailerId());
532
					orderIterator.remove();
533
					orderRemovedCount++;
534
				} catch (Exception e) {
535
 
536
				}
537
			}
538
		}
539
		LOGGER.info("Order removed count is {}", orderRemovedCount);
540
		return lastOrdersList;
541
	}
542
 
31317 tejbeer 543
	// Clean up the saholic cis table
30664 amit.gupta 544
	@RequestMapping(value = "/indent/confirm-pause", method = RequestMethod.POST)
30668 amit.gupta 545
	public String updateTagListing(HttpServletRequest request, Model model, @RequestBody String jsonArrayString)
30664 amit.gupta 546
			throws Exception {
547
		JSONArray jsonArray = new JSONArray(jsonArrayString);
548
		for (int i = 0; i < jsonArray.length(); i++) {
549
			JSONObject obj = jsonArray.getJSONObject(i);
550
 
551
			TagListing tl = tagListingRepository.selectByItemId(obj.getInt("id"));
552
			if (tl == null) {
553
				continue;
554
			} else {
555
				tl.setActive(obj.getBoolean("active"));
30668 amit.gupta 556
				if (!tl.isActive()) {
31317 tejbeer 557
					saholicCISTableRepository.selectAllByItemId(tl.getItemId()).stream()
558
							.forEach(x -> saholicCISTableRepository.delete(x));
30668 amit.gupta 559
				}
30664 amit.gupta 560
			}
561
		}
31238 amit.gupta 562
		model.addAttribute("response1", true);
30664 amit.gupta 563
		return "response";
564
	}
565
 
566
	@RequestMapping(value = "/indent/confirm-hotdeals-pause", method = RequestMethod.POST)
567
	public String hotdealUpdate(HttpServletRequest request, Model model, @RequestBody String jsonArrayString)
568
			throws Exception {
569
		JSONArray jsonArray = new JSONArray(jsonArrayString);
570
		for (int i = 0; i < jsonArray.length(); i++) {
571
			JSONObject obj = jsonArray.getJSONObject(i);
572
 
573
			TagListing tl = tagListingRepository.selectByItemId(obj.getInt("id"));
574
			if (tl == null) {
575
				continue;
576
			} else {
577
				tl.setHotDeals(obj.getBoolean("hotDeals"));
578
				tagListingRepository.persist(tl);
579
			}
580
		}
31238 amit.gupta 581
		model.addAttribute("response1", true);
30664 amit.gupta 582
		return "response";
583
	}
584
 
585
	@RequestMapping(value = "/indent/create-po", method = RequestMethod.POST)
586
	public String raisePO(HttpServletRequest request, Model model) throws Exception {
587
		boolean success = false;
588
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
589
		int fofoId = loginDetails.getFofoId();
590
		List<ItemPriceQuantity> itemQuantities = this.getItemQuantities(fofoId);
591
		CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
592
		Client userClient = new UserClient().getClient();
593
		double totalAmount = itemQuantities.stream().mapToDouble(x -> x.getQty() * x.getPrice()).sum();
594
 
595
		if (totalAmount > 0) {
596
			userClient.addItemPricingToCart(customRetailer.getCartId(), itemQuantities);
597
			User user = userRepository.selectById(loginDetails.getFofoId());
598
			userClient = new UserClient().getClient();
599
			LOGGER.info("Setting wallet amount in cart");
600
			long transactionId = userClient.createOrders(user.getActiveCartId(), "", 0, "", 0, loginDetails.getFofoId(),
601
					7890, OrderSource.WEBSITE.getValue(), true);
602
			LOGGER.info("Creating wallet payment for transactionId - {}", transactionId);
603
			createPayment(user, totalAmount, transactionId);
604
			TransactionService.Client transactionClient = new TransactionClient().getClient();
605
			transactionClient.changeTransactionStatus(transactionId, TransactionStatus.AUTHORIZED,
606
					"Payment received for the order", PickUpType.RUNNER.getValue(), OrderType.B2B, OrderSource.WEBSITE);
607
			transactionClient.changeTransactionStatus(Long.valueOf(transactionId), TransactionStatus.IN_PROCESS,
608
					"Paid fully through wallet", PickUpType.RUNNER.getValue(), OrderType.B2B, OrderSource.WEBSITE);
609
			LOGGER.info("Successfully created transaction: " + transactionId + " for amount: " + totalAmount);
610
			transactionClient = new TransactionClient().getClient();
611
			transactionClient.markOrderForRegisteredGstInvoice(Collections.singletonList(Long.valueOf(transactionId)));
612
			try {
613
				transactionClient.enqueueTransactionInfoEmail(transactionId);
614
			} catch (Exception e1) {
615
				e1.printStackTrace();
616
				LOGGER.error("Unable to update status of transaction. Thrift Exception:", e1);
617
			}
618
			resetCart(transactionClient.getTransaction(transactionId));
619
		}
31238 amit.gupta 620
		model.addAttribute("response1", mvcResponseSender.createResponseString(success));
30664 amit.gupta 621
		return "response";
622
	}
623
 
624
	private void createPayment(User user, double totalAmount, long transactionId)
625
			throws NumberFormatException, PaymentException, TException {
626
		List<Attribute> paymentAttributes = new ArrayList<Attribute>();
627
		in.shop2020.payments.PaymentService.Client paymentClient = new PaymentClient().getClient();
628
		paymentAttributes.add(new Attribute("payMethod", "7890"));
629
		long paymentId = paymentClient.createPayment(user.getId(), totalAmount, WALLET_GATEWAY_ID, transactionId,
630
				false);
631
		paymentClient.updatePaymentDetails(paymentId, null, null, null, null, null, null, null, null,
632
				PaymentStatus.SUCCESS, null, paymentAttributes);
633
	}
634
 
23405 amit.gupta 635
	@RequestMapping(value = "/indent/loadIndent")
23785 amit.gupta 636
	public String loadOpenIndent(HttpServletRequest request, Model model,
31317 tejbeer 637
			@RequestParam(required = false, defaultValue = "0") int fofoId,
638
			@RequestParam(defaultValue = "TEN_LAC") CounterSize counterSize) throws Exception {
25702 amit.gupta 639
 
640
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
641
		Set<Integer> roleIds = loginDetails.getRoleIds();
23785 amit.gupta 642
		LOGGER.info("Counter size is {}", counterSize);
643
		LOGGER.info("Fofo Id is {}", fofoId);
25736 tejbeer 644
		boolean isAdmin = roleManager.isAdmin(roleIds);
25796 tejbeer 645
 
25797 tejbeer 646
		List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
647
				.collect(Collectors.toList());
648
 
25796 tejbeer 649
		Map<String, Object> equalsMap = new HashMap<>();
650
		equalsMap.put("categoryId", 10006);
25797 tejbeer 651
		equalsMap.put("brand", brands);
25796 tejbeer 652
		Map<String, List<?>> notEqualsMap = new HashMap<>();
653
 
654
		Map<String, List<?>> notEqualsJoinMap = new HashMap<>();
655
		Map<Integer, Integer> currentStockMap;
656
 
25721 tejbeer 657
		if (!isAdmin && fofoId == 0) {
23786 amit.gupta 658
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
25796 tejbeer 659
			Map<String, Object> equalsStockJoinMap = new HashMap<>();
660
			equalsStockJoinMap.put("fofoId", fofoId);
661
			currentStockMap = itemRepository
25800 tejbeer 662
					.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
663
							equalsStockJoinMap, notEqualsJoinMap, "availability")
25796 tejbeer 664
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
25797 tejbeer 665
			LOGGER.info("currentStock");
23786 amit.gupta 666
		} else {
667
			if (fofoId == 0) {
25796 tejbeer 668
 
669
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
670
				equalsStockJoinMap.put("fofoId", fofoId);
671
 
672
				currentStockMap = itemRepository
25800 tejbeer 673
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
25796 tejbeer 674
								equalsStockJoinMap, notEqualsJoinMap, "availability")
675
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
676
 
23779 amit.gupta 677
			} else {
25796 tejbeer 678
 
679
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
680
				equalsStockJoinMap.put("fofoId", fofoId);
681
 
682
				currentStockMap = itemRepository
25800 tejbeer 683
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
25796 tejbeer 684
								equalsStockJoinMap, notEqualsJoinMap, "availability")
685
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
686
 
23405 amit.gupta 687
			}
23786 amit.gupta 688
		}
25796 tejbeer 689
 
690
		LOGGER.info("currentStock" + currentStockMap);
25797 tejbeer 691
 
23796 amit.gupta 692
		Map<Integer, Integer> itemsInTransit = null;
23855 amit.gupta 693
		List<TagListing> tagListings = tagListingRepository.selectAll(true);
25702 amit.gupta 694
		if (!isAdmin) {
23786 amit.gupta 695
			tagListings = new ArrayList<>(tagListings);
28055 tejbeer 696
			List<Order> inTransitOrders = orderRepository.selectPendingGrnOrder(fofoId,
697
					OrderRepository.validOrderStatusList);
23796 amit.gupta 698
			inTransitOrders = this.filterValidOrders(inTransitOrders);
699
			itemsInTransit = inTransitOrders.stream().collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
700
					Collectors.summingInt(x -> x.getLineItem().getQuantity())));
701
		} else {
702
			itemsInTransit = new HashMap<>();
23786 amit.gupta 703
		}
25797 tejbeer 704
 
23796 amit.gupta 705
		int totalPcs = 0;
25797 tejbeer 706
 
23796 amit.gupta 707
		float totalAmount = 0;
24231 amit.gupta 708
		Map<Integer, CatalogListingModel> catalogListingMap = new HashMap<>();
27088 tejbeer 709
		List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
710
				.collect(Collectors.toList());
25796 tejbeer 711
 
27088 tejbeer 712
		LOGGER.info("regionIds" + regionIds);
713
		Map<Integer, FocusedModel> focusedModelMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream()
714
				.collect(Collectors.toMap(FocusedModel::getCatalogId, Function.identity()));
715
		LOGGER.info("focusedModelMap" + focusedModelMap);
26956 amit.gupta 716
		LocalDate planningMonthDate = null;
26082 tejbeer 717
		MonthlyPlanned monthlyPlanned = null;
26176 tejbeer 718
		List<Integer> fofoOrderIds = null;
26082 tejbeer 719
		LOGGER.info("localDate" + LocalDate.now());
26951 amit.gupta 720
		if (LocalDate.now().isAfter(LocalDate.now().withDayOfMonth(PLANNING_OPEN_DAY))) {
26956 amit.gupta 721
			planningMonthDate = LocalDate.now().plusMonths(1).withDayOfMonth(1);
722
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, planningMonthDate);
26082 tejbeer 723
			LOGGER.info("monthlyPlanned2" + monthlyPlanned);
26176 tejbeer 724
			fofoOrderIds = fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(loginDetails.getFofoId(),
31317 tejbeer 725
					LocalDateTime.now().minusDays(15), LocalDateTime.now()).stream().map(x -> x.getId())
26176 tejbeer 726
					.collect(Collectors.toList());
26082 tejbeer 727
 
728
			model.addAttribute("planningMonth", LocalDate.now().plusMonths(1).getMonth());
26951 amit.gupta 729
		} else {
26956 amit.gupta 730
			planningMonthDate = LocalDate.now().withDayOfMonth(1);
26176 tejbeer 731
			LocalDateTime curDate = LocalDate.now().atStartOfDay();
26956 amit.gupta 732
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, planningMonthDate);
733
			model.addAttribute("planningMonth", planningMonthDate.getMonth());
26176 tejbeer 734
			model.addAttribute("mtd", true);
26131 tejbeer 735
			model.addAttribute("freezed", true);
26176 tejbeer 736
			fofoOrderIds = fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(loginDetails.getFofoId(),
31317 tejbeer 737
					curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX)).stream().map(x -> x.getId())
26176 tejbeer 738
					.collect(Collectors.toList());
26082 tejbeer 739
			LOGGER.info("monthlyPlanned1" + monthlyPlanned);
26978 tejbeer 740
		}
26082 tejbeer 741
 
25721 tejbeer 742
		Map<Integer, Integer> plannedDetailMap = null;
743
		if (monthlyPlanned != null) {
744
			plannedDetailMap = plannedDetailRepository.selectByPlannedId(monthlyPlanned.getId()).stream()
745
					.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getQuantity()));
746
 
747
		}
25797 tejbeer 748
		LOGGER.info("plannedDetailMap" + plannedDetailMap);
26176 tejbeer 749
 
25796 tejbeer 750
		LOGGER.info("fofoOrderIds" + fofoOrderIds);
751
		Map<String, Object> equalsJoinMap = new HashMap<>();
26618 tejbeer 752
 
25796 tejbeer 753
		equalsJoinMap.put("orderId", fofoOrderIds);
26618 tejbeer 754
		Map<Integer, Integer> last15daysMap = null;
26748 tejbeer 755
		if (fofoOrderIds != null && !fofoOrderIds.isEmpty()) {
24231 amit.gupta 756
 
26618 tejbeer 757
			last15daysMap = itemRepository
758
					.selectItems(FofoOrderItem.class, "id", "itemId", equalsMap, notEqualsMap, equalsJoinMap,
759
							notEqualsJoinMap, "quantity")
760
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
761
		}
25796 tejbeer 762
		LOGGER.info("last15daysMap" + last15daysMap);
25721 tejbeer 763
 
25796 tejbeer 764
		Map<Integer, TagListing> taglistingMap = tagListings.stream()
765
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
766
		List<Item> items = itemRepository.selectByIds(taglistingMap.keySet());
767
		Map<Integer, List<Item>> catalogIdItemMap = items.stream().collect(
768
				Collectors.groupingBy(x -> x.getCatalogItemId(), Collectors.mapping(y -> y, Collectors.toList())));
25797 tejbeer 769
		LOGGER.info("catalogIdItemMap");
24231 amit.gupta 770
 
25796 tejbeer 771
		Map<String, Object> equalsItemJoinMap = new HashMap<>();
25797 tejbeer 772
		equalsItemJoinMap.put("active", 1);
28897 amit.gupta 773
		List<IntegerIdAggregateValue> tagListingCatalogIds = itemRepository.selectItems(TagListing.class, "id",
25800 tejbeer 774
				"itemId", equalsMap, notEqualsMap, equalsItemJoinMap, notEqualsJoinMap, "tagId");
25797 tejbeer 775
		LOGGER.info("tagListingCatalogIds");
28897 amit.gupta 776
		for (IntegerIdAggregateValue catalogIdAggregateValue : tagListingCatalogIds) {
25796 tejbeer 777
			int catalogId = catalogIdAggregateValue.getCatalogId();
778
			Item item = catalogIdItemMap.get(catalogId).get(0);
779
			TagListing tagListing = taglistingMap.get(item.getId());
24231 amit.gupta 780
			CatalogListingModel catalogListingModel = catalogListingMap.get(catalogId);
781
			if (!catalogListingMap.containsKey(catalogId)) {
782
				catalogListingModel = new CatalogListingModel();
783
				catalogListingModel.setCatalogId(catalogId);
784
				catalogListingModel.setDp(tagListing.getSellingPrice());
785
				catalogListingModel.setMop(tagListing.getMop());
786
				catalogListingModel.setItemDescription(item.getItemDescriptionNoColor());
25721 tejbeer 787
				if (plannedDetailMap != null) {
788
 
789
					Integer quantity = plannedDetailMap.get(catalogId);
790
					if (quantity != null) {
791
						catalogListingModel.setAllocatedQuantity(quantity);
792
					}
793
				}
794
 
25796 tejbeer 795
				if (last15daysMap != null) {
796
					Integer last15DaysSale = last15daysMap.get(catalogId);
797
 
25721 tejbeer 798
					if (last15DaysSale != null) {
799
						catalogListingModel.setLast15DaysSale(last15DaysSale);
800
					} else {
801
						catalogListingModel.setLast15DaysSale(0);
802
					}
803
				} else {
804
					catalogListingModel.setLast15DaysSale(0);
805
				}
806
 
24231 amit.gupta 807
				catalogListingModel.setBrand(item.getBrand());
808
				if (item.getCategoryId() == 10006) {
809
					catalogListingModel.setCategoryId(item.getCategoryId());
810
				}
25721 tejbeer 811
 
812
				FocusedModel fm = focusedModelMap.get(catalogId);
813
				if (fm != null) {
814
					catalogListingModel.setRecommendedQty(fm.getRecommendedQty());
815
					catalogListingModel.setMinimumQty(fm.getMinimumQty());
816
 
817
				} else {
818
					catalogListingModel.setRecommendedQty(0);
819
					catalogListingModel.setMinimumQty(0);
820
				}
821
 
24231 amit.gupta 822
				catalogListingMap.put(catalogId, catalogListingModel);
25721 tejbeer 823
 
24231 amit.gupta 824
			}
25736 tejbeer 825
			int itemAvailability = 0;
25796 tejbeer 826
			if (currentStockMap != null) {
827
				Integer qty = currentStockMap.get(catalogId);
25736 tejbeer 828
				itemAvailability = qty == null ? 0 : qty;
829
				catalogListingModel.setStockInHand(itemAvailability);
830
			} else {
831
				catalogListingModel.setStockInHand(0);
832
			}
24231 amit.gupta 833
			Integer inTransitQuantity = itemsInTransit.get(item.getId());
834
			int inTransitQty = (inTransitQuantity == null ? 0 : inTransitQuantity);
835
			catalogListingModel.setInTransitQuantity(catalogListingModel.getInTransitQuantity() + inTransitQty);
26179 tejbeer 836
			if (plannedDetailMap != null) {
26177 tejbeer 837
				if (plannedDetailMap.get(catalogId) != null) {
24231 amit.gupta 838
 
26177 tejbeer 839
					int remaining = plannedDetailMap.get(catalogId) - catalogListingModel.getLast15DaysSale()
840
							+ catalogListingModel.getStockInHand() + catalogListingModel.getInTransitQuantity();
841
					LOGGER.info("remaning" + remaining);
26176 tejbeer 842
 
26177 tejbeer 843
					if (remaining != 0) {
844
						catalogListingModel.setRemaining(remaining);
845
					} else {
846
						catalogListingModel.setRemaining(0);
847
					}
26176 tejbeer 848
				}
849
			}
23786 amit.gupta 850
		}
25721 tejbeer 851
 
26963 amit.gupta 852
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(false);
23786 amit.gupta 853
		if (fofoId > 0) {
854
			CustomRetailer customRetailer = customRetailersMap.get(fofoId);
855
			model.addAttribute("retailerName",
856
					customRetailer.getBusinessName() + "-" + customRetailer.getAddress().getCity());
857
			FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
858
			model.addAttribute("retailerId", customRetailer.getPartnerId());
859
			model.addAttribute("counterSize", fs.getCounterSize().toString());
23779 amit.gupta 860
		} else {
23786 amit.gupta 861
			model.addAttribute("counterSize", counterSize.toString());
23405 amit.gupta 862
		}
23786 amit.gupta 863
		String customRetailers = JSONObject.valueToString(customRetailersMap.values());
25702 amit.gupta 864
 
865
		List<CatalogListingModel> catalogModelList = new ArrayList<>(catalogListingMap.values());
866
 
25721 tejbeer 867
		Comparator<CatalogListingModel> firstCmp = Comparator.comparing(CatalogListingModel::getMinimumQty,
24231 amit.gupta 868
				Comparator.reverseOrder());
25721 tejbeer 869
		LOGGER.info("monthlyPlanned" + monthlyPlanned);
25796 tejbeer 870
		model.addAttribute("catalogTagListings",
871
				catalogModelList.stream().sorted(firstCmp).collect(Collectors.toList()));
25702 amit.gupta 872
		model.addAttribute("isAdmin", roleManager.isAdmin(roleIds));
26177 tejbeer 873
		model.addAttribute("brandStockPrices", this.getBrandStockPrices(loginDetails.getFofoId()));
26956 amit.gupta 874
		model.addAttribute("previousPlanningMonth", planningMonthDate.minusMonths(1).getMonth());
875
		model.addAttribute("currentPlanningMonth", planningMonthDate.getMonth());
26131 tejbeer 876
 
23786 amit.gupta 877
		model.addAttribute("customRetailers", customRetailers);
23796 amit.gupta 878
		model.addAttribute("totalAmount", totalAmount);
25721 tejbeer 879
		model.addAttribute("monthlyPlanned", monthlyPlanned);
23796 amit.gupta 880
		model.addAttribute("totalPcs", totalPcs);
23786 amit.gupta 881
		return "open-indent";
25796 tejbeer 882
 
23405 amit.gupta 883
	}
23796 amit.gupta 884
 
30664 amit.gupta 885
	private long resetCart(Transaction transaction) {
886
		long sum = 0;
887
		Map<Long, Double> items = new HashMap<Long, Double>();
888
		for (in.shop2020.model.v1.order.Order order : transaction.getOrders()) {
889
			sum += order.getGvAmount();
890
			for (LineItem lineitem : order.getLineitems()) {
891
				Long itemId = lineitem.getItem_id();
892
				Double quantity = items.get(itemId);
893
				if (quantity == null) {
894
					quantity = lineitem.getQuantity();
895
				} else {
896
					quantity = quantity + lineitem.getQuantity();
30017 amit.gupta 897
				}
30664 amit.gupta 898
				items.put(itemId, quantity);
30017 amit.gupta 899
			}
900
		}
901
 
30664 amit.gupta 902
		LOGGER.debug("Items to reset in cart are: " + items);
30017 amit.gupta 903
 
30664 amit.gupta 904
		try {
905
			Client userClient = new UserClient().getClient();
906
			userClient.resetCart(transaction.getShoppingCartid(), items);
907
		} catch (TException e) {
908
			LOGGER.error("Error while updating information in payment database.", e);
909
		} catch (ShoppingCartException e) {
910
			LOGGER.error("Error while reseting the cart in cart database.", e);
911
		} catch (Exception e) {
912
			LOGGER.error("Unexpected exception", e);
30017 amit.gupta 913
		}
30664 amit.gupta 914
		return sum;
30017 amit.gupta 915
	}
916
 
30664 amit.gupta 917
	private List<ItemPriceQuantity> getItemQuantities(int fofoId) throws ProfitMandiBusinessException {
918
		List<ItemPriceQuantity> itemQuantities = new ArrayList<>();
919
		/*
920
		 * Map<Integer, ItemIdAvailability> itemCisMap = null; List<ItemIdAvailability>
921
		 * currentInventorySnapshots = currentInventorySnapshotRepository
922
		 * .selectItemsStock(fofoId); itemCisMap =
923
		 * currentInventorySnapshots.stream().filter(x -> x.getAvailability() > 0)
924
		 * .collect(Collectors.toMap(x -> x.getItemId(), x -> x));
925
		 * List<StockAllocationModel> stockAllocationList =
926
		 * stockAllocationService.getStockAllocation(fofoId, true);
927
		 *
928
		 * Map<Integer, StockAllocationModel> itemStockAllocationMap =
929
		 * stockAllocationList.stream() .collect(Collectors.toMap(x -> x.catalogId(), x
930
		 * -> x)); Map<Integer, Integer> itemsInTransit = null;
931
		 * LOGGER.info("Item Stock Allocation Model Map {}", itemStockAllocationMap);
932
		 * List<TagListing> tagListings = tagListingRepository.selectAll(false);
933
		 * List<Order> inTransitOrders = orderRepository.selectOrders(fofoId,
934
		 * validOrderStatusList); inTransitOrders =
935
		 * this.filterValidOrders(inTransitOrders); itemsInTransit =
936
		 * inTransitOrders.stream().collect(Collectors.groupingBy(x ->
937
		 * x.getLineItem().getItemId(), Collectors.summingInt(x ->
938
		 * x.getLineItem().getQuantity())));
939
		 *
940
		 * Iterator<TagListing> iterator = tagListings.iterator();
941
		 *
942
		 * int toBeOrdered = 0; while (iterator.hasNext()) { TagListing tagListing =
943
		 * iterator.next(); LOGGER.info(" tagListing.setAllocatedQuantity {}",
944
		 * tagListing.getAllocatedQuantity()); if
945
		 * (!itemCisMap.containsKey(tagListing.getItemId()) &&
946
		 * !itemStockAllocationMap.containsKey(tagListing.getItemId())) {
947
		 * iterator.remove(); continue; } ItemIdAvailability itemIdAvailability =
948
		 * itemCisMap.get(tagListing.getItemId());
949
		 * tagListing.setStockInHand(itemIdAvailability == null ? 0 :
950
		 * itemIdAvailability.getAvailability()); StockAllocationModel
951
		 * stockAllocationModel = itemStockAllocationMap.get(tagListing.getItemId());
952
		 *
953
		 * if (itemsInTransit.containsKey(tagListing.getItemId())) {
954
		 * tagListing.setInTransitQuantity(itemsInTransit.get(tagListing.getItemId()));
955
		 * } else { tagListing.setInTransitQuantity(0); } if (stockAllocationModel !=
956
		 * null) { tagListing.setAllocatedQuantity(stockAllocationModel.getQuantity());
957
		 * toBeOrdered = Math.max(tagListing.getAllocatedQuantity() -
958
		 * tagListing.getInTransitQuantity() - tagListing.getStockInHand(), 0); if
959
		 * (toBeOrdered > 0) { ItemPriceQuantity ipq = new ItemPriceQuantity();
960
		 * ipq.setItemId(tagListing.getItemId()); ipq.setQty((long) toBeOrdered);
961
		 * ipq.setPrice(tagListing.getSellingPrice()); itemQuantities.add(ipq); } } }
962
		 */
963
		return itemQuantities;
30017 amit.gupta 964
 
965
	}
966
 
26131 tejbeer 967
	@RequestMapping(value = "/indent/loadIndentPreviousMonth")
968
	public String previousMonthLoadOpenIndent(HttpServletRequest request, Model model,
31317 tejbeer 969
			@RequestParam(required = false, defaultValue = "0") int fofoId,
970
			@RequestParam(defaultValue = "TEN_LAC") CounterSize counterSize) throws Exception {
26956 amit.gupta 971
		LocalDate planMonthStart = null;
972
		if (LocalDate.now().isAfter(LocalDate.now().withDayOfMonth(PLANNING_OPEN_DAY))) {
973
			planMonthStart = LocalDate.now().plusMonths(1).withDayOfMonth(1);
974
		} else {
975
			planMonthStart = LocalDate.now().withDayOfMonth(1);
976
		}
26131 tejbeer 977
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
978
		Set<Integer> roleIds = loginDetails.getRoleIds();
979
		LOGGER.info("Counter size is {}", counterSize);
980
		LOGGER.info("Fofo Id is {}", fofoId);
981
		boolean isAdmin = roleManager.isAdmin(roleIds);
982
 
983
		List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
984
				.collect(Collectors.toList());
985
 
986
		Map<String, Object> equalsMap = new HashMap<>();
987
		equalsMap.put("categoryId", 10006);
988
		equalsMap.put("brand", brands);
989
		Map<String, List<?>> notEqualsMap = new HashMap<>();
990
 
991
		Map<String, List<?>> notEqualsJoinMap = new HashMap<>();
992
		Map<Integer, Integer> currentStockMap;
993
 
994
		if (!isAdmin && fofoId == 0) {
995
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
996
			Map<String, Object> equalsStockJoinMap = new HashMap<>();
997
			equalsStockJoinMap.put("fofoId", fofoId);
998
			currentStockMap = itemRepository
999
					.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1000
							equalsStockJoinMap, notEqualsJoinMap, "availability")
1001
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1002
			LOGGER.info("currentStock");
1003
		} else {
1004
			if (fofoId == 0) {
1005
 
1006
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
1007
				equalsStockJoinMap.put("fofoId", fofoId);
1008
 
1009
				currentStockMap = itemRepository
1010
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1011
								equalsStockJoinMap, notEqualsJoinMap, "availability")
1012
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1013
 
1014
			} else {
1015
 
1016
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
1017
				equalsStockJoinMap.put("fofoId", fofoId);
1018
 
1019
				currentStockMap = itemRepository
1020
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1021
								equalsStockJoinMap, notEqualsJoinMap, "availability")
1022
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1023
 
1024
			}
1025
		}
1026
 
1027
		LOGGER.info("currentStock" + currentStockMap);
1028
 
1029
		Map<Integer, Integer> itemsInTransit = null;
1030
		List<TagListing> tagListings = tagListingRepository.selectAll(true);
1031
		if (!isAdmin) {
1032
			tagListings = new ArrayList<>(tagListings);
28055 tejbeer 1033
			List<Order> inTransitOrders = orderRepository.selectPendingGrnOrder(fofoId,
1034
					OrderRepository.validOrderStatusList);
26131 tejbeer 1035
			inTransitOrders = this.filterValidOrders(inTransitOrders);
1036
			itemsInTransit = inTransitOrders.stream().collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1037
					Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1038
		} else {
1039
			itemsInTransit = new HashMap<>();
1040
		}
1041
 
1042
		int totalPcs = 0;
1043
 
1044
		float totalAmount = 0;
1045
		Map<Integer, CatalogListingModel> catalogListingMap = new HashMap<>();
1046
 
27088 tejbeer 1047
		List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
1048
				.collect(Collectors.toList());
26131 tejbeer 1049
 
27088 tejbeer 1050
		Map<Integer, FocusedModel> focusedModelMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream()
1051
				.collect(Collectors.toMap(FocusedModel::getCatalogId, Function.identity()));
1052
 
26978 tejbeer 1053
		MonthlyPlanned monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId,
1054
				planMonthStart.minusMonths(1));
26956 amit.gupta 1055
		model.addAttribute("planningMonth", planMonthStart.minusMonths(1).getMonth());
1056
		model.addAttribute("previousPlanningMonth", planMonthStart.minusMonths(1).getMonth());
1057
		model.addAttribute("currentPlanningMonth", planMonthStart.getMonth());
26131 tejbeer 1058
 
1059
		Map<Integer, Integer> plannedDetailMap = null;
1060
		if (monthlyPlanned != null) {
1061
			plannedDetailMap = plannedDetailRepository.selectByPlannedId(monthlyPlanned.getId()).stream()
1062
					.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getQuantity()));
1063
 
1064
		}
1065
 
1066
		LOGGER.info("plannedDetailMap" + plannedDetailMap);
1067
		List<Integer> fofoOrderIds = fofoOrderRepository
1068
				.selectByFofoIdBetweenCreatedTimeStamp(loginDetails.getFofoId(),
26978 tejbeer 1069
						planMonthStart.minusMonths(1).atStartOfDay(), planMonthStart.atStartOfDay())
26131 tejbeer 1070
				.stream().map(x -> x.getId()).collect(Collectors.toList());
26721 tejbeer 1071
 
26131 tejbeer 1072
		LOGGER.info("fofoOrderIds" + fofoOrderIds);
1073
		Map<String, Object> equalsJoinMap = new HashMap<>();
1074
		equalsJoinMap.put("orderId", fofoOrderIds);
26721 tejbeer 1075
		Map<Integer, Integer> lastMonthSaleMap = null;
1076
		if (!fofoOrderIds.isEmpty()) {
1077
			lastMonthSaleMap = itemRepository
1078
					.selectItems(FofoOrderItem.class, "id", "itemId", equalsMap, notEqualsMap, equalsJoinMap,
1079
							notEqualsJoinMap, "quantity")
1080
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1081
		}
26131 tejbeer 1082
		LOGGER.info("lastMonthSaleMap" + lastMonthSaleMap);
1083
 
1084
		Map<Integer, TagListing> taglistingMap = tagListings.stream()
1085
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
1086
		List<Item> items = itemRepository.selectByIds(taglistingMap.keySet());
1087
		Map<Integer, List<Item>> catalogIdItemMap = items.stream().collect(
1088
				Collectors.groupingBy(x -> x.getCatalogItemId(), Collectors.mapping(y -> y, Collectors.toList())));
1089
		LOGGER.info("catalogIdItemMap");
1090
 
1091
		Map<String, Object> equalsItemJoinMap = new HashMap<>();
1092
		equalsItemJoinMap.put("active", 1);
28897 amit.gupta 1093
		List<IntegerIdAggregateValue> tagListingCatalogIds = itemRepository.selectItems(TagListing.class, "id",
26131 tejbeer 1094
				"itemId", equalsMap, notEqualsMap, equalsItemJoinMap, notEqualsJoinMap, "tagId");
1095
		LOGGER.info("tagListingCatalogIds");
28897 amit.gupta 1096
		for (IntegerIdAggregateValue catalogIdAggregateValue : tagListingCatalogIds) {
26131 tejbeer 1097
			int catalogId = catalogIdAggregateValue.getCatalogId();
1098
			Item item = catalogIdItemMap.get(catalogId).get(0);
1099
			TagListing tagListing = taglistingMap.get(item.getId());
1100
			CatalogListingModel catalogListingModel = catalogListingMap.get(catalogId);
1101
			if (!catalogListingMap.containsKey(catalogId)) {
1102
				catalogListingModel = new CatalogListingModel();
1103
				catalogListingModel.setCatalogId(catalogId);
1104
				catalogListingModel.setDp(tagListing.getSellingPrice());
1105
				catalogListingModel.setMop(tagListing.getMop());
1106
				catalogListingModel.setItemDescription(item.getItemDescriptionNoColor());
1107
				if (plannedDetailMap != null) {
1108
 
1109
					Integer quantity = plannedDetailMap.get(catalogId);
1110
					if (quantity != null) {
1111
						catalogListingModel.setAllocatedQuantity(quantity);
1112
					}
1113
				}
1114
 
1115
				if (lastMonthSaleMap != null) {
1116
					Integer lastMonthSale = lastMonthSaleMap.get(catalogId);
1117
 
1118
					if (lastMonthSale != null) {
1119
						catalogListingModel.setLastMonthSaleMap(lastMonthSale);
1120
					} else {
1121
						catalogListingModel.setLastMonthSaleMap(0);
1122
					}
1123
				} else {
1124
					catalogListingModel.setLast15DaysSale(0);
1125
				}
1126
 
1127
				catalogListingModel.setBrand(item.getBrand());
1128
				if (item.getCategoryId() == 10006) {
1129
					catalogListingModel.setCategoryId(item.getCategoryId());
1130
				}
1131
 
1132
				FocusedModel fm = focusedModelMap.get(catalogId);
1133
				if (fm != null) {
1134
					catalogListingModel.setRecommendedQty(fm.getRecommendedQty());
1135
					catalogListingModel.setMinimumQty(fm.getMinimumQty());
1136
 
1137
				} else {
1138
					catalogListingModel.setRecommendedQty(0);
1139
					catalogListingModel.setMinimumQty(0);
1140
				}
1141
 
1142
				catalogListingMap.put(catalogId, catalogListingModel);
1143
 
1144
			}
1145
			int itemAvailability = 0;
1146
			if (currentStockMap != null) {
1147
				Integer qty = currentStockMap.get(catalogId);
1148
				itemAvailability = qty == null ? 0 : qty;
1149
				catalogListingModel.setStockInHand(itemAvailability);
1150
			} else {
1151
				catalogListingModel.setStockInHand(0);
1152
			}
1153
			Integer inTransitQuantity = itemsInTransit.get(item.getId());
1154
			int inTransitQty = (inTransitQuantity == null ? 0 : inTransitQuantity);
1155
			catalogListingModel.setInTransitQuantity(catalogListingModel.getInTransitQuantity() + inTransitQty);
1156
 
1157
		}
1158
 
26963 amit.gupta 1159
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(false);
26131 tejbeer 1160
		if (fofoId > 0) {
1161
			CustomRetailer customRetailer = customRetailersMap.get(fofoId);
1162
			model.addAttribute("retailerName",
1163
					customRetailer.getBusinessName() + "-" + customRetailer.getAddress().getCity());
1164
			FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
1165
			model.addAttribute("retailerId", customRetailer.getPartnerId());
1166
			model.addAttribute("counterSize", fs.getCounterSize().toString());
1167
		} else {
1168
			model.addAttribute("counterSize", counterSize.toString());
1169
		}
1170
		String customRetailers = JSONObject.valueToString(customRetailersMap.values());
1171
 
1172
		List<CatalogListingModel> catalogModelList = new ArrayList<>(catalogListingMap.values());
1173
 
1174
		Comparator<CatalogListingModel> firstCmp = Comparator.comparing(CatalogListingModel::getMinimumQty,
1175
				Comparator.reverseOrder());
1176
		LOGGER.info("monthlyPlanned" + monthlyPlanned);
1177
		model.addAttribute("catalogTagListings",
1178
				catalogModelList.stream().sorted(firstCmp).collect(Collectors.toList()));
1179
		model.addAttribute("isAdmin", roleManager.isAdmin(roleIds));
1180
		model.addAttribute("previousMonth", true);
1181
		model.addAttribute("freezed", true);
26177 tejbeer 1182
		model.addAttribute("brandStockPrices", this.getBrandStockPrices(loginDetails.getFofoId()));
26131 tejbeer 1183
		model.addAttribute("customRetailers", customRetailers);
1184
		model.addAttribute("totalAmount", totalAmount);
1185
		model.addAttribute("monthlyPlanned", monthlyPlanned);
1186
		model.addAttribute("totalPcs", totalPcs);
1187
		return "open-indent";
1188
 
1189
	}
1190
 
30664 amit.gupta 1191
	private Map<Integer, Item> getItemByCatalogId(List<FocusedModel> focusedModels) {
1192
		Map<Integer, Item> itemMap = new HashMap<>();
1193
		for (FocusedModel focusedModel : focusedModels) {
1194
			List<Item> items = itemRepository.selectAllByCatalogItemId(focusedModel.getCatalogId());
1195
			itemMap.put(items.get(0).getCatalogItemId(), items.get(0));
23796 amit.gupta 1196
		}
1197
 
30664 amit.gupta 1198
		return itemMap;
1199
	}
25378 tejbeer 1200
 
30664 amit.gupta 1201
	private Map<Integer, Region> getRegionByRegionId(List<FocusedModel> focusedModels) {
1202
		Map<Integer, Region> regionMap = new HashMap<>();
1203
		for (FocusedModel focusedModel : focusedModels) {
1204
			Region region = regionRepository.selectById(focusedModel.getRegionId());
1205
			regionMap.put(region.getId(), region);
24406 amit.gupta 1206
		}
24231 amit.gupta 1207
 
30664 amit.gupta 1208
		return regionMap;
23796 amit.gupta 1209
	}
24231 amit.gupta 1210
 
25721 tejbeer 1211
	@RequestMapping(value = "/getFocusedModel", method = RequestMethod.GET)
32170 jai.hind 1212
	public String getFocusedModel(HttpServletRequest request , Model model)
25721 tejbeer 1213
			throws ProfitMandiBusinessException {
25736 tejbeer 1214
 
27081 tejbeer 1215
 
32170 jai.hind 1216
		List<FocusedModel> focusedModels = focusedModelRepository.selectAll();
1217
 
25736 tejbeer 1218
		if (!focusedModels.isEmpty()) {
1219
			Map<Integer, Item> itemMap = this.getItemByCatalogId(focusedModels);
27088 tejbeer 1220
			Map<Integer, Region> regionMap = this.getRegionByRegionId(focusedModels);
25721 tejbeer 1221
 
27088 tejbeer 1222
			LOGGER.info("regionMap" + regionMap);
25736 tejbeer 1223
			model.addAttribute("focusedModels", focusedModels);
1224
			model.addAttribute("itemMap", itemMap);
27088 tejbeer 1225
			model.addAttribute("regionMap", regionMap);
25736 tejbeer 1226
 
32170 jai.hind 1227
 
25736 tejbeer 1228
		} else {
1229
			model.addAttribute("walletRequest", focusedModels);
1230
		}
1231
 
27088 tejbeer 1232
		List<Region> regions = regionRepository.selectAll();
27081 tejbeer 1233
 
27088 tejbeer 1234
		model.addAttribute("regions", regions);
1235
 
25721 tejbeer 1236
		return "focused_model";
1237
	}
1238
 
25736 tejbeer 1239
	@RequestMapping(value = "/getPaginatedFocusedModel", method = RequestMethod.GET)
32170 jai.hind 1240
	public String getPaginatedFocusedModel(HttpServletRequest request, Model model)
25736 tejbeer 1241
			throws ProfitMandiBusinessException {
32170 jai.hind 1242
		//LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
1243
		List<FocusedModel> focusedModels = focusedModelRepository.selectAll();
25736 tejbeer 1244
 
1245
		if (!focusedModels.isEmpty()) {
1246
			Map<Integer, Item> itemMap = this.getItemByCatalogId(focusedModels);
27088 tejbeer 1247
			Map<Integer, Region> regionMap = this.getRegionByRegionId(focusedModels);
25736 tejbeer 1248
			model.addAttribute("focusedModels", focusedModels);
1249
			model.addAttribute("itemMap", itemMap);
27088 tejbeer 1250
			model.addAttribute("regionMap", regionMap);
25736 tejbeer 1251
		} else {
1252
			model.addAttribute("focusedModels", focusedModels);
1253
 
1254
		}
27081 tejbeer 1255
 
27088 tejbeer 1256
		List<Region> regions = regionRepository.selectAll();
1257
 
1258
		model.addAttribute("regions", regions);
25736 tejbeer 1259
		return "focused-model-paginated";
1260
	}
1261
 
25798 tejbeer 1262
	private List<BrandStockPrice> getBrandStockPrices(int fofoId) throws Exception {
1263
		Map<String, BrandStockPrice> brandStockPricesMap = inventoryService.getBrandWiseStockValue(fofoId);
25736 tejbeer 1264
 
25798 tejbeer 1265
		List<DBObject> mobileBrands = mongoClient.getMongoBrands(fofoId, "", 3);
1266
		List<BrandStockPrice> brandStockPrices = new ArrayList<>();
1267
 
1268
		mobileBrands.stream().forEach(x -> {
1269
			String brand = (String) x.get("name");
1270
			if (brandStockPricesMap.containsKey(brand)) {
1271
				BrandStockPrice brandStockPrice = brandStockPricesMap.get(brand);
1272
				brandStockPrice.setBrandUrl((String) x.get("url"));
1273
				brandStockPrice.setRank(((Double) x.get("rank")).intValue());
1274
				brandStockPrices.add(brandStockPrice);
1275
			}
1276
		});
1277
 
1278
		return brandStockPrices.stream().filter(x -> x.getTotalQty() > 0).sorted((x, y) -> x.getRank() - y.getRank())
1279
				.collect(Collectors.toList());
1280
	}
1281
 
26721 tejbeer 1282
	@RequestMapping(value = "/getPartnerAllocation")
1283
	public String getPartnerAllocation(HttpServletRequest request, Model model) throws Exception {
1284
 
1285
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1286
		AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1287
 
1288
		Map<Integer, List<Integer>> pp = csService.getAuthUserIdPartnerIdMapping();
1289
 
1290
		List<Integer> fofoIds = pp.get(authUser.getId());
1291
 
30426 tejbeer 1292
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1293
		Map<Integer, CustomRetailer> crm = fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null)
1294
				.collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
26721 tejbeer 1295
		Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectByRetailerIds(fofoIds).stream()
1296
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1297
 
30426 tejbeer 1298
		model.addAttribute("customRetailersMap", crm);
26721 tejbeer 1299
		model.addAttribute("fofoStoreMap", fofoStoreMap);
1300
		return "partners_allocation";
1301
 
1302
	}
1303
 
26846 tejbeer 1304
	@RequestMapping(value = "/partnerPendingOrder")
1305
	public String partnerPendingOrder(HttpServletRequest request, Model model) throws Exception {
1306
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1307
		AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1308
 
1309
		Map<Integer, List<Integer>> pp = csService.getAuthUserIdPartnerIdMapping();
1310
 
1311
		List<Integer> fofoIds = pp.get(authUser.getId());
30426 tejbeer 1312
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1313
		Map<Integer, CustomRetailer> crm = fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null)
1314
				.collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
26846 tejbeer 1315
 
30426 tejbeer 1316
		model.addAttribute("customRetailersMap", crm);
26846 tejbeer 1317
 
1318
		return "partner-po";
1319
 
1320
	}
1321
 
30664 amit.gupta 1322
	@RequestMapping(value = "/focusedModel", method = RequestMethod.POST)
1323
	public String focusedModel(HttpServletRequest request, @RequestParam int catalogId,
31317 tejbeer 1324
			@RequestParam(name = "recommended", defaultValue = "0") int recommended,
1325
			@RequestParam(name = "minimumQty", defaultValue = "0") int minimumQty,
1326
			@RequestParam(name = "obvrecommend", defaultValue = "0") int obvrecommend,
1327
			@RequestParam(name = "obvminimum", defaultValue = "0") int obvminimum, @RequestParam int regionId,
1328
			Model model) throws ProfitMandiBusinessException {
30664 amit.gupta 1329
 
1330
		FocusedModel fm = new FocusedModel();
1331
		fm.setCatalogId(catalogId);
1332
		fm.setMinimumQty(minimumQty);
1333
		fm.setRecommendedQty(recommended);
1334
		fm.setRegionId(regionId);
1335
		fm.setObsRecommendedQty(obvrecommend);
1336
		fm.setObsMinimumQty(obvminimum);
1337
		fm.setCreatedTimestamp(LocalDateTime.now());
1338
		focusedModelRepository.persist(fm);
1339
		return "focused_model";
1340
	}
1341
 
30017 amit.gupta 1342
	@RequestMapping(value = "/removeItem", method = RequestMethod.DELETE)
1343
	public String removeFocusedModelItem(HttpServletRequest request,
31317 tejbeer 1344
			@RequestParam(name = "id", defaultValue = "0") int id, Model model) throws Exception {
30017 amit.gupta 1345
 
1346
		focusedModelRepository.deleteById(id);
31238 amit.gupta 1347
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
30017 amit.gupta 1348
		return "response";
1349
	}
1350
 
26846 tejbeer 1351
	@RequestMapping(value = "/getPartnerloadContent")
1352
	public String getPartnerloadContent(HttpServletRequest request, Model model,
31317 tejbeer 1353
			@RequestParam(required = false, defaultValue = "0") int fofoId,
1354
			@RequestParam(defaultValue = "TEN_LAC") CounterSize counterSize) throws Exception {
26846 tejbeer 1355
 
1356
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1357
		Set<Integer> roleIds = loginDetails.getRoleIds();
1358
		LOGGER.info("Counter size is {}", counterSize);
1359
		LOGGER.info("Fofo Id is {}", fofoId);
1360
		boolean isAdmin = roleManager.isAdmin(roleIds);
1361
 
1362
		List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
1363
				.collect(Collectors.toList());
1364
 
1365
		Map<String, Object> equalsMap = new HashMap<>();
1366
		equalsMap.put("categoryId", 10006);
1367
		equalsMap.put("brand", brands);
1368
		Map<String, List<?>> notEqualsMap = new HashMap<>();
1369
 
1370
		Map<String, List<?>> notEqualsJoinMap = new HashMap<>();
1371
		Map<Integer, Integer> currentStockMap;
1372
 
1373
		if (!isAdmin && fofoId == 0) {
1374
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
1375
			Map<String, Object> equalsStockJoinMap = new HashMap<>();
1376
			equalsStockJoinMap.put("fofoId", fofoId);
1377
			currentStockMap = itemRepository
1378
					.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1379
							equalsStockJoinMap, notEqualsJoinMap, "availability")
1380
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1381
			LOGGER.info("currentStock");
1382
		} else {
1383
			if (fofoId == 0) {
1384
 
1385
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
1386
				equalsStockJoinMap.put("fofoId", fofoId);
1387
 
1388
				currentStockMap = itemRepository
1389
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1390
								equalsStockJoinMap, notEqualsJoinMap, "availability")
1391
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1392
 
1393
			} else {
1394
 
1395
				Map<String, Object> equalsStockJoinMap = new HashMap<>();
1396
				equalsStockJoinMap.put("fofoId", fofoId);
1397
 
1398
				currentStockMap = itemRepository
1399
						.selectItems(CurrentInventorySnapshot.class, "id", "itemId", equalsMap, notEqualsMap,
1400
								equalsStockJoinMap, notEqualsJoinMap, "availability")
1401
						.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1402
 
1403
			}
1404
		}
1405
 
27768 tejbeer 1406
		FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
26846 tejbeer 1407
		LOGGER.info("currentStock" + currentStockMap);
1408
 
1409
		Map<Integer, Integer> itemsInTransit = null;
1410
		List<TagListing> tagListings = tagListingRepository.selectAll(true);
1411
		if (!isAdmin) {
1412
			tagListings = new ArrayList<>(tagListings);
28055 tejbeer 1413
			List<Order> inTransitOrders = orderRepository.selectPendingGrnOrder(fofoId,
1414
					OrderRepository.validOrderStatusList);
26846 tejbeer 1415
			inTransitOrders = this.filterValidOrders(inTransitOrders);
1416
			itemsInTransit = inTransitOrders.stream().collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1417
					Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1418
		} else {
1419
			itemsInTransit = new HashMap<>();
1420
		}
1421
 
1422
		int totalPcs = 0;
1423
 
1424
		float totalAmount = 0;
1425
		Map<Integer, CatalogListingModel> catalogListingMap = new HashMap<>();
1426
 
27088 tejbeer 1427
		List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
1428
				.collect(Collectors.toList());
26846 tejbeer 1429
 
27088 tejbeer 1430
		Map<Integer, FocusedModel> focusedModelMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream()
1431
				.collect(Collectors.toMap(FocusedModel::getCatalogId, Function.identity()));
1432
 
26846 tejbeer 1433
		LocalDate currentMonthDate = LocalDate.now();
1434
		MonthlyPlanned monthlyPlanned = null;
1435
		List<Integer> fofoOrderIds = null;
1436
		LOGGER.info("localDate" + LocalDate.now());
26951 amit.gupta 1437
		if (LocalDate.now().isAfter(LocalDate.now().withDayOfMonth(PLANNING_OPEN_DAY))) {
26846 tejbeer 1438
			currentMonthDate = LocalDate.now().plusMonths(1).withDayOfMonth(1);
1439
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, currentMonthDate);
1440
			LOGGER.info("monthlyPlanned2" + monthlyPlanned);
1441
			fofoOrderIds = fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(loginDetails.getFofoId(),
31317 tejbeer 1442
					LocalDateTime.now().minusDays(15), LocalDateTime.now()).stream().map(x -> x.getId())
26846 tejbeer 1443
					.collect(Collectors.toList());
1444
 
1445
			model.addAttribute("planningMonth", LocalDate.now().plusMonths(1).getMonth());
26951 amit.gupta 1446
		} else {
26846 tejbeer 1447
			currentMonthDate = LocalDate.now().withDayOfMonth(1);
1448
			LocalDateTime curDate = LocalDate.now().atStartOfDay();
1449
			monthlyPlanned = monthlyPlannedRepository.selectByFofoIdYearMonth(fofoId, currentMonthDate);
1450
			model.addAttribute("planningMonth", currentMonthDate.getMonth());
1451
			model.addAttribute("mtd", true);
1452
			model.addAttribute("freezed", true);
1453
			fofoOrderIds = fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(loginDetails.getFofoId(),
31317 tejbeer 1454
					curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX)).stream().map(x -> x.getId())
26846 tejbeer 1455
					.collect(Collectors.toList());
1456
			LOGGER.info("monthlyPlanned1" + monthlyPlanned);
1457
		}
1458
 
1459
		Map<Integer, Integer> plannedDetailMap = null;
1460
		if (monthlyPlanned != null) {
1461
			plannedDetailMap = plannedDetailRepository.selectByPlannedId(monthlyPlanned.getId()).stream()
1462
					.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getQuantity()));
1463
 
1464
		}
1465
		LOGGER.info("plannedDetailMap" + plannedDetailMap);
1466
 
1467
		LOGGER.info("fofoOrderIds" + fofoOrderIds);
1468
		Map<String, Object> equalsJoinMap = new HashMap<>();
1469
 
1470
		equalsJoinMap.put("orderId", fofoOrderIds);
1471
		Map<Integer, Integer> last15daysMap = null;
1472
		if (fofoOrderIds != null && !fofoOrderIds.isEmpty()) {
1473
 
1474
			last15daysMap = itemRepository
1475
					.selectItems(FofoOrderItem.class, "id", "itemId", equalsMap, notEqualsMap, equalsJoinMap,
1476
							notEqualsJoinMap, "quantity")
1477
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> (int) x.getAggregateValue()));
1478
		}
1479
		LOGGER.info("last15daysMap" + last15daysMap);
1480
 
1481
		Map<Integer, TagListing> taglistingMap = tagListings.stream()
1482
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
1483
		List<Item> items = itemRepository.selectByIds(taglistingMap.keySet());
1484
		Map<Integer, List<Item>> catalogIdItemMap = items.stream().collect(
1485
				Collectors.groupingBy(x -> x.getCatalogItemId(), Collectors.mapping(y -> y, Collectors.toList())));
1486
		LOGGER.info("catalogIdItemMap");
1487
 
1488
		Map<String, Object> equalsItemJoinMap = new HashMap<>();
1489
		equalsItemJoinMap.put("active", 1);
28897 amit.gupta 1490
		List<IntegerIdAggregateValue> tagListingCatalogIds = itemRepository.selectItems(TagListing.class, "id",
26846 tejbeer 1491
				"itemId", equalsMap, notEqualsMap, equalsItemJoinMap, notEqualsJoinMap, "tagId");
27768 tejbeer 1492
		Map<Integer, Integer> ourStockAvailability = new HashMap<>();
1493
 
1494
		Map<Integer, List<Integer>> catalogItemIdMap = itemRepository
1495
				.selectAllByCatalogIds(new HashSet<>(
1496
						tagListingCatalogIds.stream().map(x -> x.getCatalogId()).collect(Collectors.toList())))
1497
				.stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1498
						Collectors.mapping(y -> y.getId(), Collectors.toList())));
1499
		for (Entry<Integer, List<Integer>> catalogItem : catalogItemIdMap.entrySet()) {
1500
			List<Integer> itemIds = catalogItem.getValue();
1501
			int availability = 0;
1502
			for (Integer itemId : itemIds) {
31317 tejbeer 1503
				List<SaholicCISTable> saholicCISTableList = saholicCISTableRepository.selectByItemWarehouse(itemId,
1504
						fofoStore.getWarehouseId());
30664 amit.gupta 1505
				if (saholicCISTableList != null) {
31317 tejbeer 1506
					availability += saholicCISTableList.stream()
1507
							.collect(Collectors.summingInt(x -> x.getAvailability()));
27768 tejbeer 1508
				}
1509
			}
1510
			Integer catalogItemId = catalogItem.getKey();
1511
			ourStockAvailability.put(catalogItemId, availability);
1512
		}
1513
		LOGGER.info("ourStockAvailability" + ourStockAvailability);
1514
 
28897 amit.gupta 1515
		for (IntegerIdAggregateValue catalogIdAggregateValue : tagListingCatalogIds) {
26846 tejbeer 1516
			int catalogId = catalogIdAggregateValue.getCatalogId();
1517
			Item item = catalogIdItemMap.get(catalogId).get(0);
1518
			TagListing tagListing = taglistingMap.get(item.getId());
1519
			CatalogListingModel catalogListingModel = catalogListingMap.get(catalogId);
1520
			if (!catalogListingMap.containsKey(catalogId)) {
1521
				catalogListingModel = new CatalogListingModel();
1522
				catalogListingModel.setCatalogId(catalogId);
1523
				catalogListingModel.setDp(tagListing.getSellingPrice());
1524
				catalogListingModel.setMop(tagListing.getMop());
1525
				catalogListingModel.setItemDescription(item.getItemDescriptionNoColor());
1526
				if (plannedDetailMap != null) {
1527
 
1528
					Integer quantity = plannedDetailMap.get(catalogId);
1529
					if (quantity != null) {
1530
						catalogListingModel.setAllocatedQuantity(quantity);
1531
					}
1532
				}
1533
 
1534
				if (last15daysMap != null) {
1535
					Integer last15DaysSale = last15daysMap.get(catalogId);
1536
 
1537
					if (last15DaysSale != null) {
1538
						catalogListingModel.setLast15DaysSale(last15DaysSale);
1539
					} else {
1540
						catalogListingModel.setLast15DaysSale(0);
1541
					}
1542
				} else {
1543
					catalogListingModel.setLast15DaysSale(0);
1544
				}
1545
 
1546
				catalogListingModel.setBrand(item.getBrand());
1547
				if (item.getCategoryId() == 10006) {
1548
					catalogListingModel.setCategoryId(item.getCategoryId());
1549
				}
1550
 
27768 tejbeer 1551
				Integer ourStock = ourStockAvailability.get(catalogId);
1552
				LOGGER.info("catalogId" + catalogId);
1553
 
1554
				LOGGER.info("ourStock" + ourStock);
1555
				if (ourStock != null) {
1556
					catalogListingModel.setOurStockQty(ourStock);
1557
				}
1558
 
26846 tejbeer 1559
				FocusedModel fm = focusedModelMap.get(catalogId);
1560
				if (fm != null) {
1561
					catalogListingModel.setRecommendedQty(fm.getRecommendedQty());
1562
					catalogListingModel.setMinimumQty(fm.getMinimumQty());
29667 tejbeer 1563
					catalogListingModel.setObsRecommendedQty(fm.getObsRecommendedQty());
1564
					catalogListingModel.setObsMinimumQty(fm.getObsMinimumQty());
26846 tejbeer 1565
 
1566
				} else {
1567
					catalogListingModel.setRecommendedQty(0);
1568
					catalogListingModel.setMinimumQty(0);
29667 tejbeer 1569
 
1570
					catalogListingModel.setObsRecommendedQty(0);
1571
					catalogListingModel.setObsMinimumQty(0);
1572
 
26846 tejbeer 1573
				}
1574
 
1575
				catalogListingMap.put(catalogId, catalogListingModel);
1576
 
1577
			}
1578
			int itemAvailability = 0;
1579
			if (currentStockMap != null) {
1580
				Integer qty = currentStockMap.get(catalogId);
1581
				itemAvailability = qty == null ? 0 : qty;
1582
				catalogListingModel.setStockInHand(itemAvailability);
1583
			} else {
1584
				catalogListingModel.setStockInHand(0);
1585
			}
1586
			Integer inTransitQuantity = itemsInTransit.get(item.getId());
1587
			int inTransitQty = (inTransitQuantity == null ? 0 : inTransitQuantity);
1588
			catalogListingModel.setInTransitQuantity(catalogListingModel.getInTransitQuantity() + inTransitQty);
1589
			if (plannedDetailMap != null) {
1590
				if (plannedDetailMap.get(catalogId) != null) {
1591
 
1592
					int remaining = plannedDetailMap.get(catalogId) - catalogListingModel.getLast15DaysSale()
1593
							+ catalogListingModel.getStockInHand() + catalogListingModel.getInTransitQuantity();
1594
					LOGGER.info("remaning" + remaining);
1595
 
1596
					if (remaining != 0) {
1597
						catalogListingModel.setRemaining(remaining);
1598
					} else {
1599
						catalogListingModel.setRemaining(0);
1600
					}
1601
				}
1602
			}
1603
		}
1604
 
26963 amit.gupta 1605
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(false);
26846 tejbeer 1606
		if (fofoId > 0) {
1607
			CustomRetailer customRetailer = customRetailersMap.get(fofoId);
1608
			model.addAttribute("retailerName",
1609
					customRetailer.getBusinessName() + "-" + customRetailer.getAddress().getCity());
1610
			FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
1611
			model.addAttribute("retailerId", customRetailer.getPartnerId());
1612
			model.addAttribute("counterSize", fs.getCounterSize().toString());
1613
		} else {
1614
			model.addAttribute("counterSize", counterSize.toString());
1615
		}
1616
		String customRetailers = JSONObject.valueToString(customRetailersMap.values());
1617
 
1618
		List<CatalogListingModel> catalogModelList = new ArrayList<>(catalogListingMap.values());
1619
 
1620
		Comparator<CatalogListingModel> firstCmp = Comparator.comparing(CatalogListingModel::getMinimumQty,
1621
				Comparator.reverseOrder());
1622
		LOGGER.info("monthlyPlanned" + monthlyPlanned);
1623
		model.addAttribute("catalogTagListings",
1624
				catalogModelList.stream().sorted(firstCmp).collect(Collectors.toList()));
1625
		model.addAttribute("isAdmin", roleManager.isAdmin(roleIds));
27768 tejbeer 1626
		model.addAttribute("brandStockPrices", this.getBrandStockPrices(fofoId));
26846 tejbeer 1627
		model.addAttribute("previousPlanningMonth", LocalDate.now().minusMonths(1).getMonth());
1628
		model.addAttribute("currentPlanningMonth", LocalDate.now().getMonth());
1629
 
1630
		model.addAttribute("customRetailers", customRetailers);
1631
		model.addAttribute("totalAmount", totalAmount);
1632
		model.addAttribute("monthlyPlanned", monthlyPlanned);
1633
		model.addAttribute("totalPcs", totalPcs);
1634
 
1635
		UserWallet userWallet = walletService.getUserWallet(fofoId);
1636
 
1637
		model.addAttribute("userWallet", userWallet);
1638
 
1639
		return "create-partner-po";
1640
 
1641
	}
1642
 
1643
	@RequestMapping(value = "/selectItemColor", method = RequestMethod.GET)
1644
	public String selectItemColor(HttpServletRequest request, @RequestParam int catalogId, Model model)
1645
			throws Exception {
1646
 
1647
		List<Item> selecteditems = itemRepository.selectAllByCatalogItemId(catalogId);
1648
 
1649
		List<Item> items = new ArrayList<>();
1650
		for (Item item : selecteditems) {
1651
 
1652
			TagListing tagListing = tagListingRepository.selectByItemId(item.getId(), true);
1653
 
1654
			if (tagListing != null) {
1655
				items.add(item);
1656
			}
1657
 
1658
		}
1659
		model.addAttribute("items", items);
1660
		LOGGER.info("itemIdAndColorMap" + items);
1661
		return "select-item-color";
1662
	}
1663
 
30003 tejbeer 1664
	List<String> emails = Arrays.asList("kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com",
30564 tejbeer 1665
			"niranjan.kala@smartdukaan.com", "amit.gupta@smartdukaan.com", "tejbeer.kaur@smartdukaan.com");
30003 tejbeer 1666
 
1667
	@Autowired
1668
	private PositionRepository positionRepository;
1669
 
1670
	@Autowired
1671
	private PartnerTypeChangeService partnerTypeChangeService;
1672
 
1673
	@Autowired
1674
	private com.spice.profitmandi.service.transaction.TransactionService transactionService;
1675
 
1676
	@Autowired
1677
	private CategoryRepository categoryRepository;
1678
 
30044 tejbeer 1679
	@Autowired
1680
	private BrandLimitRepository brandLimitRepository;
1681
 
31663 amit.gupta 1682
	@Autowired
1683
	//This is alternate proxy to auth to enable Spring Caching
1684
	private CsService1 authService1;
1685
 
30003 tejbeer 1686
	private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING,
1687
			OrderStatus.ACCEPTED);
1688
 
1689
	public static final Map<String, Double> Brand_Amount_Limit = new HashMap<>();
1690
 
1691
	static {
30044 tejbeer 1692
 
30003 tejbeer 1693
		Brand_Amount_Limit.put("accessories", 10000.00);
1694
		Brand_Amount_Limit.put("TV", 27000.00);
1695
	}
1696
 
1697
	@RequestMapping(value = "/getPartnersBrandWiseDetail", method = RequestMethod.GET)
1698
	public String getPartnersBrandWiseDetail(HttpServletRequest request, Model model) throws Exception {
1699
 
1700
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1701
		String email = loginDetails.getEmailId();
1702
 
1703
		List<String> brands = Arrays.asList("Vivo", "Samsung", "Oppo", "Tecno", "Itel", "OnePlus", "Lava", "Realme",
1704
				"Xiaomi", "Nokia");
1705
 
1706
		AuthUser authUser = authRepository.selectByEmailOrMobile(email);
31663 amit.gupta 1707
		Set<Integer> fofoIds = csService1.getAuthFofoIds(email, true);
30003 tejbeer 1708
 
1709
		Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<>();
1710
 
30024 tejbeer 1711
		Map<Integer, Map<String, Double>> fofoIdBrandAmountMap = new HashMap<>();
30003 tejbeer 1712
 
1713
		Map<Integer, InStockAccessoriesTvFofoIdModel> inStockAccessTv = new HashMap<>();
1714
		Map<Integer, InStockAccessoriesTvFofoIdModel> pendingIndentAccessTv = new HashMap<>();
1715
		Map<Integer, InStockAccessoriesTvFofoIdModel> grnPendingAccessTvOrders = new HashMap<>();
30426 tejbeer 1716
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
30003 tejbeer 1717
		Map<Integer, CustomRetailer> customRetailers = new HashMap<>();
1718
		Map<Integer, PartnerType> fofoIdPartnerTypeMap = new HashMap<>();
1719
 
31694 amit.gupta 1720
		if (fofoIds != null && fofoIds.size() > 0) {
30003 tejbeer 1721
			List<Integer> fofoIdList = new ArrayList<>(fofoIds);
1722
 
30046 tejbeer 1723
			Map<Integer, ActivationType> partnerActivationType = fofoStoreRepository.selectByRetailerIds(fofoIdList)
1724
					.stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getActivationType()));
1725
 
1726
			model.addAttribute("partnerActivationType", partnerActivationType);
1727
			model.addAttribute("activationTypes", ActivationType.values());
1728
 
30003 tejbeer 1729
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap = csService.getPartnerIdSalesHeaders();
1730
 
1731
			model.addAttribute("partnerSalesHeadersMap", partnerSalesHeadersMap);
30044 tejbeer 1732
 
1733
			Map<Integer, Map<String, Float>> partnerBrandLimitMap = brandLimitRepository.selectAllPartnerBrandLimit()
1734
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1735
							Collectors.toMap(x -> x.getBrand(), x -> x.getBrandLimit())));
1736
 
1737
			model.addAttribute("partnerBrandLimitMap", partnerBrandLimitMap);
30426 tejbeer 1738
			customRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null)
1739
					.collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
30024 tejbeer 1740
			Map<Integer, Map<String, Double>> inStockBrandModel = new HashMap<>();
1741
			Map<Integer, Map<String, Double>> pendingIndent = new HashMap<>();
1742
			Map<Integer, Map<String, Double>> grnPendingOrders = new HashMap<>();
30003 tejbeer 1743
 
30024 tejbeer 1744
			// mobile
30003 tejbeer 1745
			inStockBrandModel = currentInventorySnapshotRepository.selectSumInStockMobiletabletGroupByBrand(fofoIdList)
1746
					.stream()
1747
					.collect(Collectors.groupingBy(InStockBrandFofoIdModel::getFofoId,
1748
							Collectors.groupingBy(InStockBrandFofoIdModel::getBrand,
1749
									Collectors.summingDouble(InStockBrandFofoIdModel::getAmount))));
1750
 
1751
			pendingIndent = transactionService.getInTransitOrders(fofoIdList).stream()
30024 tejbeer 1752
					.filter(x -> x.getLineItem().getItem().getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID)
30003 tejbeer 1753
					.collect(Collectors.groupingBy(x -> x.getRetailerId(),
1754
							Collectors.groupingBy(y -> y.getLineItem().getBrand(),
1755
									Collectors.summingDouble(y -> (double) y.getTotalAmount()))));
1756
 
1757
			grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoIdList).stream()
30024 tejbeer 1758
					.filter(x -> x.getLineItem().getItem().getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID)
30003 tejbeer 1759
					.collect(Collectors.groupingBy(x -> x.getRetailerId(),
1760
							Collectors.groupingBy(y -> y.getLineItem().getBrand(),
1761
									Collectors.summingDouble(y -> (double) y.getTotalAmount()))));
1762
 
30024 tejbeer 1763
			// accessories
30003 tejbeer 1764
			inStockAccessTv = currentInventorySnapshotRepository.selectSumInStockAccessoriesAndTv(fofoIdList).stream()
1765
					.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1766
 
1767
			pendingIndentAccessTv = orderRepository.selectAllPendingIndentAccessoriesTvGroupByFofoId(fofoIdList)
1768
					.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1769
 
1770
			grnPendingAccessTvOrders = orderRepository.selectAllGrnPendingAccessoriesTvGroupByFofoId(fofoIdList)
1771
					.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1772
 
30024 tejbeer 1773
			for (Entry<Integer, CustomRetailer> customRetailer : customRetailers.entrySet()) {
1774
				PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(customRetailer.getKey(),
1775
						LocalDate.now());
1776
				fofoIdPartnerTypeMap.put(customRetailer.getKey(), partnerType);
1777
 
1778
				Map<String, Double> stockBrand = inStockBrandModel.get(customRetailer.getKey());
1779
				Map<String, Double> pendingIndentBrand = pendingIndent.get(customRetailer.getKey());
1780
				Map<String, Double> grnBrand = grnPendingOrders.get(customRetailer.getKey());
1781
				double totalAmount = 0;
1782
 
1783
				Map<String, Double> brandAmountMap = new HashMap<>();
1784
				for (String brand : brands) {
1785
 
1786
					double stockValue = 0;
1787
					double pendingValue = 0;
1788
					double grnValue = 0;
1789
					if (stockBrand != null) {
1790
 
1791
						if (stockBrand.get(brand) != null) {
1792
							stockValue = stockBrand.get(brand);
1793
						}
1794
					}
1795
 
1796
					if (pendingIndentBrand != null) {
1797
						if (pendingIndentBrand.get(brand) != null) {
1798
							pendingValue = pendingIndentBrand.get(brand);
1799
						}
1800
					}
1801
 
1802
					if (grnBrand != null) {
1803
						if (grnBrand.get(brand) != null) {
1804
							grnValue = grnBrand.get(brand);
1805
						}
1806
					}
1807
 
1808
					totalAmount = stockValue + pendingValue + grnValue;
1809
 
1810
					brandAmountMap.put(brand, totalAmount);
1811
 
1812
				}
1813
 
1814
				fofoIdBrandAmountMap.put(customRetailer.getKey(), brandAmountMap);
1815
 
1816
			}
1817
 
1818
			List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
1819
					.selectAll(new ArrayList<>(fofoIdList), LocalDate.now().minusDays(1));
1820
			if (!partnerDailyInvestments.isEmpty()) {
1821
				partnerDailyInvestmentMap = partnerDailyInvestments.stream()
1822
						.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1823
			}
1824
 
30003 tejbeer 1825
		}
1826
 
1827
		model.addAttribute("customRetailers", customRetailers);
1828
 
30024 tejbeer 1829
		LOGGER.info("fofoIdBrandAmountMap" + fofoIdBrandAmountMap);
30003 tejbeer 1830
 
1831
		model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
1832
 
1833
		model.addAttribute("brands", brands);
1834
 
1835
		model.addAttribute("brandAmountLimit", Brand_Amount_Limit);
30024 tejbeer 1836
		model.addAttribute("fofoIdBrandAmountMap", fofoIdBrandAmountMap);
30003 tejbeer 1837
 
1838
		model.addAttribute("inStockAccessTv", inStockAccessTv);
1839
		model.addAttribute("pendingIndentAccessTv", pendingIndentAccessTv);
1840
		model.addAttribute("grnPendingAccessTvOrders", grnPendingAccessTvOrders);
1841
		model.addAttribute("fofoIdPartnerTypeMap", fofoIdPartnerTypeMap);
1842
		return "partner-brandwise-detail";
1843
	}
1844
 
30046 tejbeer 1845
	@RequestMapping(value = "/changeActivationType", method = RequestMethod.POST)
1846
	public String changeActivationType(HttpServletRequest request, @RequestParam String code,
31317 tejbeer 1847
			@RequestParam ActivationType activationType, Model model) throws Exception {
30046 tejbeer 1848
 
1849
		FofoStore fofoStore = fofoStoreRepository.selectByStoreCode(code);
1850
 
1851
		fofoStore.setActivationType(activationType);
1852
 
31238 amit.gupta 1853
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
30046 tejbeer 1854
		return "response";
1855
 
1856
	}
1857
 
30017 amit.gupta 1858
	@RequestMapping(value = "/createPo", method = RequestMethod.POST)
1859
	public String createPo(HttpServletRequest request, @RequestBody SuggestedPoModel monthlyPoModel, Model model)
1860
			throws Exception {
1861
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1862
		SuggestedPo mp = new SuggestedPo();
1863
		mp.setFofoId(monthlyPoModel.getFofoId());
1864
		mp.setCreateTimestamp(LocalDateTime.now());
1865
		mp.setStatus("open");
1866
		mp.setAuthId(loginDetails.getEmailId());
1867
		suggestedPoRepository.persist(mp);
1868
 
1869
		for (SuggestedPoIdModel poId : monthlyPoModel.getPoIds()) {
1870
			SuggestedPoDetail mpd = new SuggestedPoDetail();
1871
			mpd.setItemId(poId.getItemId());
1872
			mpd.setQuantity(poId.getQty());
1873
			mpd.setUpdatedTimestamp(LocalDateTime.now());
1874
			mpd.setPoId(mp.getId());
1875
			suggestedPoDetailRepository.persist(mpd);
1876
		}
1877
 
1878
		SendNotificationModel sendNotificationModel = new SendNotificationModel();
1879
		sendNotificationModel.setCampaignName("Alert");
1880
		sendNotificationModel.setMessage("Suggested Po");
1881
		sendNotificationModel.setType("url");
1882
		sendNotificationModel.setTitle("Alert");
1883
		sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/partnerPo/" + mp.getId());
1884
		sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
1885
		sendNotificationModel.setMessageType(MessageType.notification);
1886
		int userId = userAccountRepository.selectUserIdByRetailerId(monthlyPoModel.getFofoId());
1887
 
1888
		sendNotificationModel.setUserIds(Arrays.asList(userId));
1889
		notificationService.sendNotification(sendNotificationModel);
31238 amit.gupta 1890
		model.addAttribute("response1", mvcResponseSender.createResponseString(true));
30017 amit.gupta 1891
 
1892
		return "response";
1893
	}
1894
 
30003 tejbeer 1895
	@RequestMapping(value = "/getPartnerShortageStock", method = RequestMethod.GET)
1896
	public String getPartnerShortageStock(HttpServletRequest request,
31317 tejbeer 1897
			@RequestParam(required = false, defaultValue = "") String brand, @RequestParam int fofoId, Model model)
30003 tejbeer 1898
			throws Exception {
1899
 
1900
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
1901
				.getSaholicPOItems();
1902
 
1903
		List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
1904
		CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
1905
		Map<Integer, Integer> processingOrderMap = null;
1906
		Map<Integer, Integer> catalogIdAndQtyMap = null;
1907
		Map<Integer, Integer> grnPendingOrdersMap = null;
1908
 
30044 tejbeer 1909
		List<PartnerStockDescriptionModel> inStocks = new ArrayList<>();
1910
 
1911
		List<PartnerStockDescriptionModel> grnPendings = new ArrayList<>();
1912
 
1913
		List<PartnerStockDescriptionModel> pendingIndents = new ArrayList<>();
1914
 
30003 tejbeer 1915
		Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
1916
				.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1917
 
1918
		if (!currentInventorySnapshot.isEmpty()) {
30044 tejbeer 1919
			if (!brand.equals("undefined") && !brand.equals("accessories") && !brand.equals("TV")) {
1920
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
1921
						.filter(x -> x.getBrand().equals(brand))
1922
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1923
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
30003 tejbeer 1924
 
30044 tejbeer 1925
			} else {
1926
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
1927
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1928
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
1929
			}
1930
			inStocks.addAll(getBrandItemwiseDescription(brand, catalogIdAndQtyMap));
30003 tejbeer 1931
		}
1932
 
1933
		Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
1934
				.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1935
						Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1936
		if (!grnPendingOrders.isEmpty()) {
1937
 
30044 tejbeer 1938
			if (!brand.equals("undefined") && !brand.equals("accessories") && !brand.equals("TV")) {
1939
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
1940
						.filter(x -> x.getBrand().equals(brand))
1941
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1942
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
1943
 
1944
			} else {
1945
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
1946
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1947
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
1948
			}
1949
			grnPendings.addAll(getBrandItemwiseDescription(brand, grnPendingOrdersMap));
1950
 
30003 tejbeer 1951
		}
1952
 
1953
		Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
1954
				.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1955
						Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1956
		if (!processingOrder.isEmpty()) {
30044 tejbeer 1957
			if (!brand.equals("undefined") && !brand.equals("accessories") && !brand.equals("TV")) {
1958
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
1959
						.filter(x -> x.getBrand().equals(brand)).collect(Collectors.groupingBy(
1960
								x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
30003 tejbeer 1961
 
30044 tejbeer 1962
			} else {
1963
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
1964
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1965
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
1966
			}
1967
			pendingIndents.addAll(getBrandItemwiseDescription(brand, processingOrderMap));
1968
 
30003 tejbeer 1969
		}
1970
 
1971
		List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
1972
				.collect(Collectors.toList());
1973
		LOGGER.info("regionIds" + regionIds);
1974
		if (regionIds.size() == 0) {
1975
			LOGGER.info("No region found for partner {}", fofoId);
1976
 
1977
		}
1978
		Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
1979
				.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
1980
						Collectors.mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
1981
 
1982
		for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
1983
			List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
1984
 
1985
			if (brand.equals("undefined") || items.get(0).getBrand().equals(brand)) {
1986
 
1987
				FocusedModelShortageModel fm = this.getFocusedModelShortage(entry.getValue().get(), entry.getKey(),
31317 tejbeer 1988
						processingOrderMap, grnPendingOrdersMap, catalogIdAndQtyMap, fofoId,
1989
						warehousePoItemAvailabilityMap, items, customRetailer);
30003 tejbeer 1990
 
1991
				focusedModelShortageList.add(fm);
1992
			} else if (brand.equals("accessories")) {
1993
 
1994
				if (items.get(0).getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID) {
1995
					if (items.get(0).getCategoryId() != 0) {
1996
						Category category = categoryRepository.selectById(items.get(0).getCategoryId());
1997
 
1998
						if (category.getParentCategoryId() == 10011) {
1999
							FocusedModelShortageModel fm = this.getFocusedModelShortage(entry.getValue().get(),
31317 tejbeer 2000
									entry.getKey(), processingOrderMap, grnPendingOrdersMap, catalogIdAndQtyMap, fofoId,
2001
									warehousePoItemAvailabilityMap, items, customRetailer);
30003 tejbeer 2002
 
2003
							focusedModelShortageList.add(fm);
2004
 
2005
						}
2006
					}
2007
 
2008
				}
2009
 
2010
			} else if (brand.equals("TV")) {
2011
 
2012
				if (items.get(0).getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID) {
2013
					LOGGER.info("items.get(0).getCategoryId()" + items.get(0).getCategoryId());
2014
					if (items.get(0).getCategoryId() != 0) {
2015
 
2016
						Category category = categoryRepository.selectById(items.get(0).getCategoryId());
2017
 
2018
						if (category.getParentCategoryId() == 14200) {
2019
							FocusedModelShortageModel fm = this.getFocusedModelShortage(entry.getValue().get(),
2020
									entry.getKey(), processingOrderMap, grnPendingOrdersMap, catalogIdAndQtyMap, fofoId,
31317 tejbeer 2021
									warehousePoItemAvailabilityMap, items, customRetailer);
30003 tejbeer 2022
 
2023
							focusedModelShortageList.add(fm);
2024
 
2025
						}
2026
					}
2027
 
2028
				}
2029
 
2030
			}
2031
 
2032
		}
2033
 
2034
		LOGGER.info("focusedModelShortageList" + focusedModelShortageList);
2035
 
2036
		model.addAttribute("focusedModelShortageList", focusedModelShortageList);
2037
 
30044 tejbeer 2038
		model.addAttribute("inStocks", inStocks);
2039
 
2040
		model.addAttribute("grnPendings", grnPendings);
2041
 
2042
		model.addAttribute("pendingIndents", pendingIndents);
2043
 
30003 tejbeer 2044
		model.addAttribute("customRetailer", customRetailer);
30044 tejbeer 2045
 
2046
		model.addAttribute("brand", brand);
2047
 
2048
		if (brand.equals("undefined")) {
2049
 
2050
			Map<String, List<FocusedModelShortageModel>> focusedModelShortageBrandMap = focusedModelShortageList
2051
					.stream().collect(Collectors.groupingBy(x -> x.getBrandName()));
2052
 
2053
			Map<String, List<PartnerStockDescriptionModel>> inStockBrandMap = inStocks.stream()
2054
					.collect(Collectors.groupingBy(x -> x.getBrand()));
2055
 
2056
			LOGGER.info("inStockBrandMap" + inStockBrandMap);
2057
 
2058
			Map<String, List<PartnerStockDescriptionModel>> grnPendingBrandMap = grnPendings.stream()
2059
					.collect(Collectors.groupingBy(x -> x.getBrand()));
2060
 
2061
			LOGGER.info("grnPendingBrandMap" + grnPendingBrandMap);
2062
 
2063
			Map<String, List<PartnerStockDescriptionModel>> pendingIndentBrandMap = pendingIndents.stream()
2064
					.collect(Collectors.groupingBy(x -> x.getBrand()));
2065
 
2066
			LOGGER.info("pendingIndentBrandMap" + pendingIndentBrandMap);
2067
 
2068
			model.addAttribute("inStockBrandMap", inStockBrandMap);
2069
 
2070
			model.addAttribute("grnPendingBrandMap", grnPendingBrandMap);
2071
 
2072
			model.addAttribute("focusedModelShortageBrandMap", focusedModelShortageBrandMap);
2073
 
2074
			model.addAttribute("pendingIndentBrandMap", pendingIndentBrandMap);
2075
 
2076
		}
30003 tejbeer 2077
		return "partner-stock";
2078
 
2079
	}
2080
 
30044 tejbeer 2081
	private List<PartnerStockDescriptionModel> getBrandItemwiseDescription(String brand,
31317 tejbeer 2082
			Map<Integer, Integer> catalogIdAndQtyMap) throws ProfitMandiBusinessException {
30044 tejbeer 2083
		List<PartnerStockDescriptionModel> inStocks = new ArrayList<>();
2084
 
2085
		for (Entry<Integer, Integer> inStock : catalogIdAndQtyMap.entrySet()) {
2086
			List<Item> items = itemRepository.selectAllByCatalogItemId(inStock.getKey());
2087
 
2088
			if (brand.equals("accessories")) {
2089
				if (items.get(0).getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID) {
2090
 
2091
					if (items.get(0).getCategoryId() != 0) {
2092
						Category category = categoryRepository.selectById(items.get(0).getCategoryId());
2093
 
2094
						if (category.getParentCategoryId() == 10011) {
2095
							PartnerStockDescriptionModel psdp = new PartnerStockDescriptionModel();
2096
							psdp.setBrand(items.get(0).getBrand());
2097
							psdp.setItemDescription(items.get(0).getBrand() + " " + items.get(0).getModelName() + " "
2098
									+ items.get(0).getModelNumber());
2099
							psdp.setQty(inStock.getValue());
2100
							inStocks.add(psdp);
2101
						}
2102
					}
2103
 
2104
				}
2105
 
2106
			} else if (brand.equals("TV")) {
2107
				if (items.get(0).getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID) {
2108
 
2109
					if (items.get(0).getCategoryId() != 0) {
2110
						Category category = categoryRepository.selectById(items.get(0).getCategoryId());
2111
 
2112
						if (category.getParentCategoryId() == 14200) {
2113
							PartnerStockDescriptionModel psdp = new PartnerStockDescriptionModel();
2114
							psdp.setBrand(items.get(0).getBrand());
2115
							psdp.setItemDescription(items.get(0).getBrand() + " " + items.get(0).getModelName() + " "
2116
									+ items.get(0).getModelNumber());
2117
							psdp.setQty(inStock.getValue());
2118
							inStocks.add(psdp);
2119
						}
2120
					}
2121
 
2122
				}
2123
 
2124
			} else {
2125
				PartnerStockDescriptionModel psdp = new PartnerStockDescriptionModel();
2126
				psdp.setBrand(items.get(0).getBrand());
2127
				psdp.setItemDescription(items.get(0).getBrand() + " " + items.get(0).getModelName() + " "
2128
						+ items.get(0).getModelNumber());
2129
				psdp.setQty(inStock.getValue());
2130
				inStocks.add(psdp);
2131
			}
2132
 
2133
		}
2134
 
2135
		return inStocks;
2136
	}
2137
 
30003 tejbeer 2138
	private FocusedModelShortageModel getFocusedModelShortage(int qty, int catalogId,
31317 tejbeer 2139
			Map<Integer, Integer> processingOrderMap, Map<Integer, Integer> grnPendingOrdersMap,
2140
			Map<Integer, Integer> catalogIdAndQtyMap, int fofoId,
2141
			Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap, List<Item> items,
2142
			CustomRetailer customRetailer) throws ProfitMandiBusinessException {
30003 tejbeer 2143
 
2144
		int minQty = qty;
2145
		int inStockQty = 0;
2146
		int processingQty = 0;
2147
		int grnPendingQty = 0;
2148
		int allColorNetAvailability = 0;
2149
		int allColorPoAvailability = 0;
2150
		if (processingOrderMap != null) {
2151
			processingQty = (processingOrderMap.get(catalogId) == null) ? 0 : processingOrderMap.get(catalogId);
2152
 
2153
		}
2154
		if (grnPendingOrdersMap != null) {
2155
			grnPendingQty = (grnPendingOrdersMap.get(catalogId) == null) ? 0 : grnPendingOrdersMap.get(catalogId);
2156
 
2157
		}
2158
		if (catalogIdAndQtyMap != null) {
2159
			inStockQty = (catalogIdAndQtyMap.get(catalogId) == null) ? 0 : catalogIdAndQtyMap.get(catalogId);
2160
 
2161
		}
2162
 
2163
		int grnStockQty = grnPendingQty + inStockQty;
2164
		int totalQty = processingQty + grnPendingQty + inStockQty;
2165
 
2166
		int shortageQty = minQty - totalQty;
2167
		FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
2168
 
2169
		Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2170
				.get(fofoStore.getWarehouseId());
2171
 
2172
		for (Item it : items) {
31317 tejbeer 2173
			List<SaholicCISTable> currentAvailability = saholicCISTableRepository.selectByItemWarehouse(it.getId(),
2174
					fofoStore.getWarehouseId());
30003 tejbeer 2175
			List<SaholicPOItem> poItemAvailability = null;
2176
 
2177
			if (poItemAvailabilityMap != null) {
2178
				poItemAvailability = poItemAvailabilityMap.get(it.getId());
2179
			}
2180
			if (currentAvailability != null) {
2181
				allColorNetAvailability += currentAvailability.stream()
30664 amit.gupta 2182
						.collect(Collectors.summingInt(SaholicCISTable::getNetAvailability));
30003 tejbeer 2183
			}
2184
 
2185
			if (poItemAvailability != null) {
2186
				allColorPoAvailability += poItemAvailability.stream()
2187
						.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2188
			}
2189
 
2190
		}
2191
 
2192
		FocusedModelShortageModel fm = new FocusedModelShortageModel();
2193
		fm.setFofoId(fofoId);
2194
		fm.setStoreCode(fofoStore.getCode());
2195
		fm.setStoreName(customRetailer.getBusinessName());
2196
		fm.setBrandName(items.get(0).getBrand());
2197
		fm.setModelName(items.get(0).getModelName());
2198
		fm.setModelNumber(items.get(0).getModelNumber());
2199
		fm.setGrnStockQty(grnStockQty);
2200
		fm.setPendingIndentQty(processingQty);
2201
		fm.setShortageQty(shortageQty);
31393 amit.gupta 2202
		fm.setPoAvailability(allColorPoAvailability);
30003 tejbeer 2203
		fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
31393 amit.gupta 2204
		fm.setAvailability(allColorNetAvailability);
30003 tejbeer 2205
		return fm;
2206
 
2207
	}
2208
 
30017 amit.gupta 2209
	@RequestMapping(value = "/indent/send-po-notification", method = RequestMethod.GET)
2210
	public String SendPONotification(HttpServletRequest request, Model model) {
2211
		model.addAttribute("warehouses", ProfitMandiConstants.WAREHOUSE_MAP);
2212
		return "send-po-notification";
2213
	}
2214
 
2215
	@RequestMapping(value = "/indent/send-po-notification", method = RequestMethod.POST)
30044 tejbeer 2216
	public String sendPONotification(HttpServletRequest request, @RequestBody POItemWarehouseModel poItemWarehouseModel,
31317 tejbeer 2217
			Model model) throws Exception {
30017 amit.gupta 2218
 
30426 tejbeer 2219
		Map<Integer, Item> selectedCatalogItemMap = itemRepository
2220
				.selectAllByCatalogIds(new HashSet<>(poItemWarehouseModel.getCatalogIds())).stream()
2221
				.collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x, (existing, replacement) -> existing));
30017 amit.gupta 2222
 
30080 amit.gupta 2223
		Set<String> brands = selectedCatalogItemMap.values().stream().map(x -> x.getBrand().toLowerCase())
30044 tejbeer 2224
				.collect(Collectors.toSet());
30080 amit.gupta 2225
 
30017 amit.gupta 2226
		int warehouseId = poItemWarehouseModel.getWarehouseId();
30080 amit.gupta 2227
		for (String brand : brands) {
30096 amit.gupta 2228
			List<String> modelNames = selectedCatalogItemMap.entrySet().stream()
30426 tejbeer 2229
					.filter(x -> x.getValue().getBrand().toLowerCase().equals(brand))
2230
					.map(x -> x.getValue().getItemDescriptionNoColor()).collect(Collectors.toList());
30080 amit.gupta 2231
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2232
			sendNotificationModel.setCampaignName("SendPo");
2233
			sendNotificationModel.setTitle(String.format(PO_TITLE_STRING));
30096 amit.gupta 2234
			sendNotificationModel.setMessage(String.join(", ", modelNames));
30080 amit.gupta 2235
			sendNotificationModel.setType("url");
2236
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2237
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2238
			sendNotificationModel.setMessageType(MessageType.notification);
30017 amit.gupta 2239
 
30426 tejbeer 2240
			List<BrandRegionMapping> brandRegionMappings = brandRegionMappingRepository.selectAll().stream()
2241
					.filter(x -> brand.equals(x.getBrand().toLowerCase()) && x.getFromWarehouseId() == warehouseId
2242
							&& !x.isAccessory())
30080 amit.gupta 2243
					.collect(Collectors.toList());
2244
			List<Integer> toWarehouseIds = brandRegionMappings.stream().map(x -> x.getToWarehouseId())
2245
					.collect(Collectors.toList());
30017 amit.gupta 2246
 
30080 amit.gupta 2247
			List<Integer> fofoIds = fofoStoreRepository.selectByWarehouseIds(toWarehouseIds).stream()
2248
					.filter(x -> !x.isInternal() && x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
30017 amit.gupta 2249
 
30080 amit.gupta 2250
			List<Integer> userIds = userAccountRepository.selectUserIdsByRetailerIds(fofoIds);
2251
			sendNotificationModel.setUserIds(userIds);
2252
			notificationService.sendNotification(sendNotificationModel);
2253
		}
31238 amit.gupta 2254
		model.addAttribute("response1", true);
30017 amit.gupta 2255
		return "response";
2256
	}
2257
 
25721 tejbeer 2258
}