Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21577 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
22486 ashik.ali 3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.InputStream;
21654 ashik.ali 6
import java.time.LocalDateTime;
21987 kshitij.so 7
import java.util.ArrayList;
21654 ashik.ali 8
import java.util.HashMap;
21612 ashik.ali 9
import java.util.HashSet;
21987 kshitij.so 10
import java.util.Iterator;
21577 ashik.ali 11
import java.util.List;
21654 ashik.ali 12
import java.util.Map;
21612 ashik.ali 13
import java.util.Set;
22523 ashik.ali 14
import java.util.function.Predicate;
15
import java.util.stream.Collectors;
21577 ashik.ali 16
 
17
import javax.servlet.http.HttpServletRequest;
21987 kshitij.so 18
import javax.servlet.http.HttpServletResponse;
21577 ashik.ali 19
 
21987 kshitij.so 20
import org.json.JSONObject;
21577 ashik.ali 21
import org.slf4j.Logger;
22
import org.slf4j.LoggerFactory;
23
import org.springframework.beans.factory.annotation.Autowired;
21987 kshitij.so 24
import org.springframework.beans.factory.annotation.Value;
22486 ashik.ali 25
import org.springframework.core.io.InputStreamResource;
26
import org.springframework.http.HttpHeaders;
27
import org.springframework.http.HttpStatus;
22472 ashik.ali 28
import org.springframework.http.ResponseEntity;
21577 ashik.ali 29
import org.springframework.stereotype.Controller;
21654 ashik.ali 30
import org.springframework.transaction.annotation.Transactional;
21577 ashik.ali 31
import org.springframework.ui.Model;
22472 ashik.ali 32
import org.springframework.web.bind.annotation.RequestBody;
21577 ashik.ali 33
import org.springframework.web.bind.annotation.RequestMapping;
22472 ashik.ali 34
import org.springframework.web.bind.annotation.RequestMethod;
21577 ashik.ali 35
import org.springframework.web.bind.annotation.RequestParam;
36
 
21987 kshitij.so 37
import com.google.gson.Gson;
21577 ashik.ali 38
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21987 kshitij.so 39
import com.spice.profitmandi.common.model.CartFofo;
21612 ashik.ali 40
import com.spice.profitmandi.common.model.CustomCurrentInventorySnapshot;
22472 ashik.ali 41
import com.spice.profitmandi.common.model.InventoryItemAgingModel;
22581 ashik.ali 42
import com.spice.profitmandi.common.model.PriceModel;
21577 ashik.ali 43
import com.spice.profitmandi.common.model.ProfitMandiConstants;
22472 ashik.ali 44
import com.spice.profitmandi.common.util.ExcelUtils;
21654 ashik.ali 45
import com.spice.profitmandi.common.util.StringUtils;
21987 kshitij.so 46
import com.spice.profitmandi.common.util.Utils;
22472 ashik.ali 47
import com.spice.profitmandi.common.web.util.ResponseSender;
21728 ashik.ali 48
import com.spice.profitmandi.dao.entity.catalog.Item;
21987 kshitij.so 49
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
21728 ashik.ali 50
import com.spice.profitmandi.dao.entity.fofo.FofoItemId;
51
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
52
import com.spice.profitmandi.dao.entity.fofo.Purchase;
53
import com.spice.profitmandi.dao.entity.transaction.LineItem;
54
import com.spice.profitmandi.dao.entity.transaction.Order;
55
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
56
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
57
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
58
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
59
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
22472 ashik.ali 60
import com.spice.profitmandi.service.aging.InventoryItemAgingService;
22354 ashik.ali 61
import com.spice.profitmandi.service.pricing.PricingService;
22139 amit.gupta 62
import com.spice.profitmandi.web.model.LoginDetails;
21987 kshitij.so 63
import com.spice.profitmandi.web.response.ValidateCart;
22069 ashik.ali 64
import com.spice.profitmandi.web.util.CookiesProcessor;
21577 ashik.ali 65
import com.spice.profitmandi.web.util.MVCResponseSender;
66
 
67
@Controller
22037 amit.gupta 68
@Transactional(rollbackFor=Throwable.class)
21577 ashik.ali 69
public class InventoryController {
21987 kshitij.so 70
 
21577 ashik.ali 71
	private static final Logger LOGGER = LoggerFactory.getLogger(InventoryController.class);
21987 kshitij.so 72
 
21577 ashik.ali 73
	@Autowired
74
	CurrentInventorySnapshotRepository  currentInventorySnapshotRepository;
21987 kshitij.so 75
 
21577 ashik.ali 76
	@Autowired
21636 ashik.ali 77
	InventoryItemRepository inventoryItemRepository;
21987 kshitij.so 78
 
21636 ashik.ali 79
	@Autowired
21654 ashik.ali 80
	PurchaseRepository purchaseRepository;
21987 kshitij.so 81
 
21654 ashik.ali 82
	@Autowired
83
	ItemRepository itemRepository;
21987 kshitij.so 84
 
21654 ashik.ali 85
	@Autowired
86
	OrderRepository orderRepository;
21987 kshitij.so 87
 
21654 ashik.ali 88
	@Autowired
21577 ashik.ali 89
	MVCResponseSender mvcResponseSender;
21987 kshitij.so 90
 
21577 ashik.ali 91
	@Autowired
22069 ashik.ali 92
	CookiesProcessor cookiesProcessor;
21577 ashik.ali 93
 
22354 ashik.ali 94
	@Autowired
95
	PricingService pricingService;
96
 
22472 ashik.ali 97
	@Autowired
98
	InventoryItemAgingService inventoryItemAgingService;
99
 
100
	@Autowired
101
	ResponseSender<?> responseSender;
102
 
21987 kshitij.so 103
	@Value("${saholic.api.host}")
104
	private String host;
105
	@Value("${saholic.api.port}")
106
	private int port;
107
	@Value("${saholic.api.webapp}")
108
	private String webapp;
109
 
110
 
111
	@RequestMapping(value = "/getCurrentInventorySnapshot")
112
	public String getCurrentAvailability(HttpServletRequest request,@RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit , @RequestParam(name = "searchTerm", required=false, defaultValue="") String searchTerm ,Model model) throws Exception{
22139 amit.gupta 113
		LoginDetails fofoDetails;
21577 ashik.ali 114
		try {
22069 ashik.ali 115
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21577 ashik.ali 116
		} catch (ProfitMandiBusinessException e) {
21581 ashik.ali 117
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
118
			return "response";
21577 ashik.ali 119
		}
21987 kshitij.so 120
		List<CurrentInventorySnapshot> currentInventorySnapshot = currentInventorySnapshotRepository.getCurrentInventorySnapshot(fofoDetails.getFofoId(), offset, limit, searchTerm);
22354 ashik.ali 121
 
21987 kshitij.so 122
		long countItems = currentInventorySnapshotRepository.getCurrentInventorySnapshotCount(fofoDetails.getFofoId(), searchTerm);
123
		model.addAttribute("currentInventorySnapshot",currentInventorySnapshot);
124
		model.addAttribute("start",offset+1);
125
		model.addAttribute("size",countItems);
126
		model.addAttribute("searchTerm",searchTerm);
127
		if (currentInventorySnapshot.size() < limit){
128
			model.addAttribute("end",offset+currentInventorySnapshot.size());
129
		}
130
		else{
131
			model.addAttribute("end",offset+limit);
132
		}
133
		return "inventory-snapshot";
21612 ashik.ali 134
	}
21987 kshitij.so 135
 
136
	@RequestMapping(value = "/getBadInventorySnapshot")
137
	public String getBadAvailability(HttpServletRequest request,@RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit , @RequestParam(name = "searchTerm", required=false, defaultValue="") String searchTerm ,Model model) throws Exception{
138
		try {
22472 ashik.ali 139
			cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 140
		} catch (ProfitMandiBusinessException e) {
141
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
142
			return "response";
143
		}
144
		model.addAttribute("badInventorySnapshot",new ArrayList<>());
145
		model.addAttribute("searchTerm",searchTerm);
146
		return "bad-inventory-snapshot";
147
	}
148
 
149
	@RequestMapping(value = "/getPaginatedCurrentInventorySnapshot")
22523 ashik.ali 150
	public String getCurrentAvailabilityPaginated(HttpServletRequest request, @RequestParam(name = "offset", defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit, @RequestParam(name = "searchTerm", required=false, defaultValue="") String searchTerm , Model model) throws Exception{
22139 amit.gupta 151
		LoginDetails fofoDetails;
21987 kshitij.so 152
		try {
22069 ashik.ali 153
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 154
		} catch (ProfitMandiBusinessException e) {
155
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
156
			return "response";
157
		}
158
		List<CurrentInventorySnapshot> currentInventorySnapshot = currentInventorySnapshotRepository.getCurrentInventorySnapshot(fofoDetails.getFofoId(), offset, limit, searchTerm);
159
		model.addAttribute("currentInventorySnapshot",currentInventorySnapshot);
160
		return "inventory-snapshot-paginated";
161
	}
21612 ashik.ali 162
 
21987 kshitij.so 163
	@RequestMapping(value = "/getCatalog")
164
	public String getCatalog(HttpServletRequest request,@RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit , @RequestParam(name = "searchTerm", required=false, defaultValue="") String searchTerm ,Model model) throws Exception{
22139 amit.gupta 165
		LoginDetails fofoDetails;
21987 kshitij.so 166
		try {
22069 ashik.ali 167
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 168
		} catch (ProfitMandiBusinessException e) {
169
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
170
			return "response";
171
		}
22354 ashik.ali 172
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.getCurrentInventorySnapshot(fofoDetails.getFofoId(), offset, limit, searchTerm);
21987 kshitij.so 173
		long countItems = currentInventorySnapshotRepository.getCurrentInventorySnapshotCount(fofoDetails.getFofoId(), searchTerm);
22354 ashik.ali 174
		Set<Integer> itemIds = new HashSet<>();
175
		for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots ){
176
			itemIds.add(currentInventorySnapshot.getId().getItemId());
21987 kshitij.so 177
		}
22581 ashik.ali 178
		Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds, fofoDetails.getFofoId());
22354 ashik.ali 179
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), itemIds);
180
		Map<Integer, Set<String>> itemIdSerialNumbers = new HashMap<>();
181
		for(InventoryItem inventoryItem : inventoryItems){
182
			if(inventoryItem.getSerialNumber() != null && !inventoryItem.getSerialNumber().isEmpty()){
183
				if(!itemIdSerialNumbers.containsKey(inventoryItem.getItemId())){
184
					Set<String> serialNumbers = new HashSet<>();
185
					serialNumbers.add(inventoryItem.getSerialNumber());
186
					itemIdSerialNumbers.put(inventoryItem.getItemId(), serialNumbers);
187
				}else{
188
					itemIdSerialNumbers.get(inventoryItem.getItemId()).add(inventoryItem.getSerialNumber());
189
				}
190
			}
191
		}
192
		model.addAttribute("currentInventorySnapshot",currentInventorySnapshots);
193
		LOGGER.info("mopPriceMap [{}]", mopPriceMap);
194
		LOGGER.info("itemIdSerialNumbers [{}]", itemIdSerialNumbers);
195
		model.addAttribute("mopPriceMap", mopPriceMap);
196
		model.addAttribute("itemIdSerialNumbers", itemIdSerialNumbers);
197
		model.addAttribute("start", offset + 1);
198
		model.addAttribute("size", countItems);
199
		model.addAttribute("searchTerm", searchTerm);
200
		if (currentInventorySnapshots.size() < limit){
201
			model.addAttribute("end", offset + currentInventorySnapshots.size());
202
		}
21987 kshitij.so 203
		else{
22354 ashik.ali 204
			model.addAttribute("end",offset + limit);
21987 kshitij.so 205
		}
206
		return "catalog";
207
	}
208
 
209
	@RequestMapping(value = "/getPaginatedCatalog")
210
	public String getCatalogPaginated(HttpServletRequest request,@RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit, @RequestParam(name = "searchTerm", required=false, defaultValue="") String searchTerm , Model model) throws Exception{
22139 amit.gupta 211
		LoginDetails fofoDetails;
21987 kshitij.so 212
		try {
22069 ashik.ali 213
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 214
		} catch (ProfitMandiBusinessException e) {
215
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
216
			return "response";
217
		}
22354 ashik.ali 218
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.getCurrentInventorySnapshot(fofoDetails.getFofoId(), offset, limit, searchTerm);
219
		Set<Integer> itemIds = new HashSet<>();
220
		for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots ){
221
			itemIds.add(currentInventorySnapshot.getId().getItemId());
222
		}
22581 ashik.ali 223
		Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds, fofoDetails.getFofoId());
22354 ashik.ali 224
		model.addAttribute("currentInventorySnapshot",currentInventorySnapshots);
225
		model.addAttribute("mopPriceMap", mopPriceMap);
21987 kshitij.so 226
		return "catalog-paginated";
227
	}
228
 
229
 
230
	private String getVaildName(String name){
231
		return name!=null?name:"";
232
	}
233
 
21612 ashik.ali 234
	private CustomCurrentInventorySnapshot createCustomCurrentInventorySnapshop(Object[] row)
235
	{
236
		CustomCurrentInventorySnapshot currentInventorySnapshot = new CustomCurrentInventorySnapshot();
237
		currentInventorySnapshot.setItemId((Integer)row[0]);
238
		currentInventorySnapshot.setAvailability((Integer)row[1]);
239
		currentInventorySnapshot.setBrand((String)row[2]);
240
		currentInventorySnapshot.setModelName((String)row[3]);
241
		currentInventorySnapshot.setModelNumber((String)row[4]);
242
		currentInventorySnapshot.setColor((String)row[5]);
21987 kshitij.so 243
		currentInventorySnapshot.setCatalogItemId((Integer)row[6]);
244
		currentInventorySnapshot.setDisplayName((getVaildName((String)row[2])+" "+getVaildName((String)row[3])+" "+getVaildName((String)row[4])+" "+getVaildName((String)row[5])).replaceAll("\\s+", " "));
245
		currentInventorySnapshot.setIconUrl(Utils.getIconUrl(currentInventorySnapshot.getCatalogItemId(), host, port, webapp));
21612 ashik.ali 246
		return currentInventorySnapshot;
247
	}
21577 ashik.ali 248
	@RequestMapping(value = "/checkItemAvailability")
21987 kshitij.so 249
	public String getItemAvailability(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ITEM_ID) int itemId, Model model) throws Exception{
22139 amit.gupta 250
		LoginDetails fofoDetails;
21577 ashik.ali 251
		try {
22069 ashik.ali 252
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21577 ashik.ali 253
		} catch (ProfitMandiBusinessException e) {
21581 ashik.ali 254
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
255
			return "response";
21577 ashik.ali 256
		}
257
		try{
258
			FofoItemId fofoItemId = new FofoItemId();
259
			fofoItemId.setFofoId(fofoDetails.getFofoId());
260
			fofoItemId.setItemId(itemId);
21612 ashik.ali 261
			Object[] row = currentInventorySnapshotRepository.selectCustomByFofoItemId(fofoItemId);
21987 kshitij.so 262
			model.addAttribute("currentInventorySnapshot", new Gson().toJson(this.createCustomCurrentInventorySnapshop(row)));
263
			return "current-item-availability";
21577 ashik.ali 264
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
21581 ashik.ali 265
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("INVNTRY_SNPSHT", false, "/dashboard"));
266
			return "response";
21577 ashik.ali 267
		}
268
	}
269
 
21987 kshitij.so 270
	@RequestMapping(value = "/cart")
271
	public String addToCart(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model) throws Exception{
22139 amit.gupta 272
		LoginDetails fofoDetails;
21654 ashik.ali 273
		try {
22069 ashik.ali 274
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21654 ashik.ali 275
		} catch (ProfitMandiBusinessException e) {
276
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
277
			return "response";
21636 ashik.ali 278
		}
21657 ashik.ali 279
 
21987 kshitij.so 280
		JSONObject cartObject = new JSONObject(cartData);
281
		Iterator<?> keys = cartObject.keys();
282
 
283
		Set<Integer> itemIds = new HashSet<>();
284
		List<CartFofo> cartItems = new ArrayList<CartFofo>();
285
 
286
		while( keys.hasNext() ) {
287
		    String key = (String)keys.next();
288
		    if ( cartObject.get(key) instanceof JSONObject ) {
289
		    	System.out.println(cartObject.get(key));
290
		    }
291
		    CartFofo cf = new CartFofo();
292
		    cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
293
		    cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
294
		    cf.setDisplayName(cartObject.getJSONObject(key).getString("displayName"));
295
		    cf.setIconUrl(cartObject.getJSONObject(key).getString("iconUrl"));
296
		    cf.setAvailability(0);
297
		    cartItems.add(cf);
298
		    itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
299
		}
300
		if (itemIds.size() > 0){
301
			List<CurrentInventorySnapshot> cisList = currentInventorySnapshotRepository.selectByFofoItemIds(fofoDetails.getFofoId(), itemIds);
302
			for (CurrentInventorySnapshot cis: cisList ){
303
				for (CartFofo cartItem : cartItems){
304
					if (cartItem.getItemId() == cis.getItem().getId()){
305
						cartItem.setAvailability(cis.getAvailability());
306
					}
307
				}
308
			}
309
			for (CartFofo cartItem : cartItems){
310
				if (cartItem.getAvailability() < cartItem.getQuantity() && cartItem.getAvailability()!=0){
311
					cartItem.setQuantity(cartItem.getAvailability());
312
					cartItem.setMessage("Item quantity changed.Less stock available");
313
				}
314
				if (cartItem.getAvailability() == 0){
315
					cartItem.setQuantity(0);
316
					cartItem.setMessage("You don't have stock for this item");
317
				}
318
			}
319
		}
320
		model.addAttribute("cartObj", cartItems);
321
		return "cart";
322
	}
323
 
324
	@RequestMapping(value = "/validate-cart")
325
	public String validateCart(HttpServletRequest request, HttpServletResponse response,@RequestParam(name = "cartData") String cartData, Model model) throws Exception{
22139 amit.gupta 326
		LoginDetails fofoDetails = null;
21987 kshitij.so 327
		try {
22069 ashik.ali 328
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 329
		} catch (ProfitMandiBusinessException e) {
330
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
331
			return "response";
332
		}
333
 
334
		JSONObject cartObject = new JSONObject(cartData);
335
		Iterator<?> keys = cartObject.keys();
336
 
337
		Set<Integer> itemIds = new HashSet<>();
338
		List<CartFofo> cartItems = new ArrayList<CartFofo>();
339
 
340
		if (cartObject.keySet().size() == 0){
341
			model.addAttribute("validateCartResponse",new Gson().toJson(new ValidateCart("POST", "/cart", false, cartData)));
342
			return "validate-cart";
343
		}
344
 
345
		while( keys.hasNext() ) {
346
		    String key = (String)keys.next();
347
		    if ( cartObject.get(key) instanceof JSONObject ) {
348
		    	System.out.println(cartObject.get(key));
349
		    }
350
		    CartFofo cf = new CartFofo();
351
		    cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
352
		    cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
353
		    cf.setDisplayName(cartObject.getJSONObject(key).getString("displayName"));
354
		    cf.setIconUrl(cartObject.getJSONObject(key).getString("iconUrl"));
355
		    cf.setAvailability(0);
356
		    cartItems.add(cf);
357
		    itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
358
		}
359
		if (itemIds.size() > 0){
360
			List<CurrentInventorySnapshot> cisList = currentInventorySnapshotRepository.selectByFofoItemIds(fofoDetails.getFofoId(), itemIds);
361
			for (CurrentInventorySnapshot cis: cisList ){
362
				for (CartFofo cartItem : cartItems){
363
					if (cartItem.getItemId() == cis.getItem().getId()){
364
						cartItem.setAvailability(cis.getAvailability());
365
					}
366
				}
367
			}
368
			for (CartFofo cartItem : cartItems){
369
				if (cartItem.getAvailability() < cartItem.getQuantity()){
370
					model.addAttribute("validateCartResponse",new Gson().toJson(new ValidateCart("POST", "/cart", false, cartData)));
371
					return "validate-cart";
372
				}
373
			}
374
		}
375
		else{
376
			model.addAttribute("validateCartResponse",new Gson().toJson(new ValidateCart("POST", "/cart", false, cartData)));
377
			return "validate-cart";
378
		}
379
		model.addAttribute("validateCartResponse",new Gson().toJson(new ValidateCart("POST", "/order", true, cartData)));
380
		return "validate-cart";
381
	}
382
 
383
	@RequestMapping(value = "/grnHistory")
384
	public String grnHistoryByFofoId(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString, @RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString, @RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE,defaultValue="") String purchaseReference, @RequestParam(name = "searchType",defaultValue="") String searchType,Model model) throws Exception{
22139 amit.gupta 385
		LoginDetails fofoDetails;
21987 kshitij.so 386
		try {
22069 ashik.ali 387
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 388
		} catch (ProfitMandiBusinessException e) {
389
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
390
			return "response";
391
		}
392
 
21654 ashik.ali 393
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
394
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
395
 
21987 kshitij.so 396
		List<Purchase> grnHistory = new ArrayList<Purchase>();
397
		long countItems = 0;
398
		if (searchType.equalsIgnoreCase("purchaseReference") && purchaseReference.trim().length() > 0){
399
			try{
400
				Purchase purchase = purchaseRepository.selectByPurchaseReference(purchaseReference);
401
				grnHistory.add(purchase);
402
				countItems = 1;
403
			}
404
			catch(Exception | ProfitMandiBusinessException e){
405
				LOGGER.info("Unable to get purchase reference "+purchaseReference);
406
			}
407
		}
408
		else{
409
			grnHistory = purchaseRepository.selectByFofoId(fofoDetails.getFofoId(), startDateTime, endDateTime, offset, limit);
410
			countItems = purchaseRepository.getPurchaseCount(fofoDetails.getFofoId(), startDateTime, endDateTime, purchaseReference, searchType);
411
		}
412
		model.addAttribute("grnHistories", grnHistory);
413
		model.addAttribute("start",offset+1);
414
		model.addAttribute("size",countItems);
415
		model.addAttribute("searchType",searchType);
416
		model.addAttribute(ProfitMandiConstants.START_TIME, startTimeString);
417
		model.addAttribute(ProfitMandiConstants.END_TIME, endTimeString);
418
		if (grnHistory.size() < limit){
419
			model.addAttribute("end",offset+grnHistory.size());
420
		}
421
		else{
422
			model.addAttribute("end",offset+limit);
423
		}
424
		return "grn-history";
21636 ashik.ali 425
	}
21987 kshitij.so 426
 
427
	@RequestMapping(value = "/getPaginatedGrnHistory")
428
	public String getGrnHistoryPaginated(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString, @RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString, @RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE,defaultValue="") String purchaseReference, @RequestParam(name = "searchType",defaultValue="") String searchType,Model model) throws Exception{
22139 amit.gupta 429
		LoginDetails fofoDetails;
21987 kshitij.so 430
		try {
22069 ashik.ali 431
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21987 kshitij.so 432
		} catch (ProfitMandiBusinessException e) {
433
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
434
			return "response";
435
		}
436
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
437
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
438
 
439
		List<Purchase> grnHistory = purchaseRepository.selectByFofoId(fofoDetails.getFofoId(), startDateTime, endDateTime, offset, limit);
440
		model.addAttribute("grnHistories", grnHistory);
441
		return "grn-history-paginated";
442
	}
443
 
21654 ashik.ali 444
	@RequestMapping(value = "/grnHistoryDetailByPurchaseId")
445
	public String grnHistoryByPurchaseId(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PURCHASE_ID) int purchaseId, Model model) throws Exception{
22139 amit.gupta 446
		LoginDetails fofoDetails;
21636 ashik.ali 447
		try {
22069 ashik.ali 448
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21636 ashik.ali 449
		} catch (ProfitMandiBusinessException e) {
450
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
451
			return "response";
452
		}
21654 ashik.ali 453
		Purchase purchase = null;
454
		try {
455
			purchase = purchaseRepository.selectById(purchaseId);
456
		} catch (ProfitMandiBusinessException e) {
21987 kshitij.so 457
 
21654 ashik.ali 458
		}
21987 kshitij.so 459
		model.addAttribute("grnDetails", this.grnHistoryDetails(purchase, fofoDetails.getFofoId()));
460
		model.addAttribute("purchaseId",purchase.getId());
461
		model.addAttribute("purchaseReference",purchase.getPurchaseReference());
462
		return "grn-details";
21636 ashik.ali 463
	}
21987 kshitij.so 464
 
21654 ashik.ali 465
	@RequestMapping(value = "/grnHistoryDetailByPurchaseReference")
466
	public String grnHistoryByPurchaseReference(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE) String purchaseReference, Model model) throws Exception{
22139 amit.gupta 467
		LoginDetails fofoDetails;
21654 ashik.ali 468
		try {
22069 ashik.ali 469
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21654 ashik.ali 470
		} catch (ProfitMandiBusinessException e) {
471
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
472
			return "response";
473
		}
474
		Purchase purchase = null;
475
		try {
476
			purchase = purchaseRepository.selectByPurchaseReference(purchaseReference);
477
		} catch (ProfitMandiBusinessException e) {
21987 kshitij.so 478
 
21654 ashik.ali 479
		}
21987 kshitij.so 480
		model.addAttribute("grnDetails", this.grnHistoryDetails(purchase, fofoDetails.getFofoId()));
481
		model.addAttribute("purchaseId",purchase.getId());
482
		model.addAttribute("purchaseReference",purchase.getPurchaseReference());
483
		return "grn-details";
21654 ashik.ali 484
	}
22472 ashik.ali 485
 
486
	@RequestMapping(value = "/getInventoryItemAgingByInterval", method = RequestMethod.POST)
22523 ashik.ali 487
	public String getInventoryItemAgingByInterval(HttpServletRequest request, @RequestBody List<Integer> intervals, Model model, @RequestParam(name = "searchContent", defaultValue = "") String searchContent, @RequestParam(name = "offset",defaultValue="0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit) throws Exception{
22472 ashik.ali 488
		LoginDetails fofoDetails;
489
		try {
490
			fofoDetails = cookiesProcessor.getCookiesObject(request);
491
		} catch (ProfitMandiBusinessException e) {
22523 ashik.ali 492
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
493
			return "response";
494
		}
495
		try{
496
			this.validateIntervals(intervals);
497
		} catch (ProfitMandiBusinessException e) {
498
			LOGGER.error("Unable to get valid interval values", e);
499
			return "response";
500
		}
501
 
502
		List<InventoryItemAgingModel> inventoryItemAgingModels = inventoryItemAgingService.getItemAgingByInterval(fofoDetails.getFofoId(), intervals);
503
 
504
		if(!searchContent.isEmpty()){
505
			Predicate<InventoryItemAgingModel> searchContentPredicate = new Predicate<InventoryItemAgingModel>() {
506
				@Override
507
				public boolean test(InventoryItemAgingModel inventoryItemAgingModel) {
508
					if(!searchContent.contains(" ")){
509
						return this.search(inventoryItemAgingModel, searchContent);
510
					}else{
511
						String[] searchContents = searchContent.split(" ");
512
						for(String element : searchContents){
513
							return this.search(inventoryItemAgingModel, element);
514
						}
515
					}
516
					return false;
517
				}
518
				private boolean search(InventoryItemAgingModel inventoryItemAgingModel, String searchContent){
519
					if(inventoryItemAgingModel.getBrand() != null && !inventoryItemAgingModel.getBrand().isEmpty() && inventoryItemAgingModel.getBrand().contains(searchContent)){
520
						return true;
521
					}
522
					if(inventoryItemAgingModel.getModelName() != null && !inventoryItemAgingModel.getModelName().isEmpty() && inventoryItemAgingModel.getModelName().contains(searchContent)){
523
						return true;
524
					}
525
					if(inventoryItemAgingModel.getModelNumber() != null && !inventoryItemAgingModel.getModelNumber().isEmpty() && inventoryItemAgingModel.getModelNumber().contains(searchContent)){
526
						return true;
527
					}
528
					if(inventoryItemAgingModel.getColor() != null && !inventoryItemAgingModel.getColor().isEmpty() && inventoryItemAgingModel.getColor().contains(searchContent)){
529
						return true;
530
					}
531
					return false;
532
				}
533
			};
534
			inventoryItemAgingModels = inventoryItemAgingModels.stream().filter(searchContentPredicate).collect(Collectors.toList());
535
		}
536
 
537
		List<InventoryItemAgingModel> paginatedInventoryItemModels = new ArrayList<>();
538
		if((offset + limit) > inventoryItemAgingModels.size()){
539
			limit = inventoryItemAgingModels.size();
540
		}
541
		for(int index = offset; index < limit; index++){
542
			paginatedInventoryItemModels.add(inventoryItemAgingModels.get(index));
543
		}
544
 
545
		model.addAttribute("inventoryItemAgingModels", paginatedInventoryItemModels);
546
		model.addAttribute("intervals", intervals);
547
		model.addAttribute("start", offset);
548
		model.addAttribute("size", inventoryItemAgingModels.size());
549
		int end = 0;
550
		if (paginatedInventoryItemModels.size() < limit){
551
			end = offset + paginatedInventoryItemModels.size();
552
		}else{
553
			end = offset + limit;
554
		}
555
		model.addAttribute("end", end);
556
		return "item-aging";
557
	}
558
 
559
	@RequestMapping(value = "/downloadInventoryItemAgingByInterval", method = RequestMethod.POST)
560
	public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request, @RequestBody List<Integer> intervals, Model model) throws Exception{
561
		LoginDetails fofoDetails;
562
		try {
563
			fofoDetails = cookiesProcessor.getCookiesObject(request);
564
		} catch (ProfitMandiBusinessException e) {
22472 ashik.ali 565
			//model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
566
			return responseSender.badRequest(e);
567
		}
568
		try{
569
			this.validateIntervals(intervals);
570
		} catch (ProfitMandiBusinessException e) {
571
			LOGGER.error("Unable to get valid interval values", e);
572
			return responseSender.badRequest(e);
573
		}
574
		List<InventoryItemAgingModel> inventoryItemAgingModels = inventoryItemAgingService.getItemAgingByInterval(fofoDetails.getFofoId(), intervals);
575
		//return responseSender.ok(inventoryItemAgingModels);
22486 ashik.ali 576
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
577
		ExcelUtils.writeInventoryItemAgingModels(inventoryItemAgingModels, intervals, byteArrayOutputStream);
578
 
579
		final HttpHeaders headers=new HttpHeaders();
580
		//private static final String CONTENT_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
581
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
582
        //headers.set("Content-Type", "application/vnd.ms-excel");
583
		headers.set("Content-disposition", "inline; filename=InventoryItemAging.xlsx");
584
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
585
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
586
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
587
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
588
 
589
		//return responseSender.ok(ResponseCodeHolder.getMessage("ITM_AGNG_OK_1000"));
22472 ashik.ali 590
	}
591
 
592
 
593
	private void validateIntervals(List<Integer> intervals)throws ProfitMandiBusinessException{
594
		if(intervals.isEmpty()){
595
			throw new ProfitMandiBusinessException(ProfitMandiConstants.INTERVAL, intervals , "VE_1010");
596
		}
597
		int max = intervals.get(0);
598
		for(int index = 1; index < intervals.size(); index++){
599
			if(intervals.get(index) <= max){
600
				throw new ProfitMandiBusinessException(ProfitMandiConstants.INTERVAL, intervals, "VE_1011");
601
			}
602
			max = intervals.get(index);
603
		}
604
	}
21987 kshitij.so 605
 
21654 ashik.ali 606
	private Map<Integer, Map<String, Object>> grnHistoryDetails(Purchase purchase, int fofoId){
607
		Set<Integer> itemIds = new HashSet<>();
608
		Set<Item> inventoryItemDetails = new HashSet<>();
609
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchase.getId());
610
		for(InventoryItem inventoryItem : inventoryItems){
611
			inventoryItemDetails.add(inventoryItem.getItem());
612
			itemIds.add(inventoryItem.getItemId());
613
		}
614
 
615
		Map<Integer, Map<String, Object>> grnHistoryDetails = new HashMap<>();
616
		this.createGrnHistoryDetails(grnHistoryDetails, inventoryItems);
21987 kshitij.so 617
		Map<Integer, Map<String, Object>> completedItemDetails = this.toMap(inventoryItemDetails, purchase);
618
 
21654 ashik.ali 619
		this.writeItemDetailstoGrnHistories(grnHistoryDetails, completedItemDetails);
21987 kshitij.so 620
 
21654 ashik.ali 621
		if(!purchase.isCompleted()){
21680 ashik.ali 622
			List<Order> orders = orderRepository.selectByInvoiceNumberRetailerIdNotItemIds(purchase.getPurchaseReference(), fofoId, itemIds);
21654 ashik.ali 623
			for(Order order : orders){
624
				LineItem lineItem = order.getLineItem();
625
				//orderItemDetails.add(lineItem.getItem());
626
				Item item = lineItem.getItem();
627
				if(!grnHistoryDetails.containsKey(item.getId())){
628
					Map<String, Object> grnHistoryDetail = new HashMap<>();
629
					grnHistoryDetail.put(ProfitMandiConstants.QUANTITY, lineItem.getQuantity());
630
					grnHistoryDetail.put(ProfitMandiConstants.BRAND, item.getBrand());
631
					grnHistoryDetail.put(ProfitMandiConstants.MODEL_NAME, item.getModelName());
632
					grnHistoryDetail.put(ProfitMandiConstants.MODEL_NUMBER, item.getModelNumber());
633
					grnHistoryDetail.put(ProfitMandiConstants.COLOR, item.getColor());
21987 kshitij.so 634
					grnHistoryDetail.put(ProfitMandiConstants.CATALOG_ITEM_ID, item.getCatalogItemId());
635
					grnHistoryDetail.put("iconUrl",Utils.getIconUrl(item.getCatalogItemId(), host, port, webapp));
21654 ashik.ali 636
					grnHistoryDetail.put(ProfitMandiConstants.COMPLETED, false);
21987 kshitij.so 637
					grnHistoryDetail.put("purchaseReference", purchase.getPurchaseReference());
21654 ashik.ali 638
					if(lineItem.getSerialNumber() == null || lineItem.getSerialNumber().equals("")){
639
						grnHistoryDetail.put(ProfitMandiConstants.SERIALIZED, false);
640
					}else{
641
						grnHistoryDetail.put(ProfitMandiConstants.SERIALIZED, true);
642
						Set<String> serialNumbers = new HashSet<>();
643
						serialNumbers.add(lineItem.getSerialNumber());
644
						grnHistoryDetail.put(ProfitMandiConstants.SERIAL_NUMBERS, serialNumbers);
645
					}
646
					grnHistoryDetails.put(item.getId(), grnHistoryDetail);
647
				}else{
648
					Map<String, Object> grnHistoryDetail = grnHistoryDetails.get(item.getId());
649
					if((boolean)grnHistoryDetail.get(ProfitMandiConstants.SERIALIZED)){
650
						@SuppressWarnings("unchecked")
651
						Set<String> serialNumbers = (Set<String>)grnHistoryDetail.get(ProfitMandiConstants.SERIAL_NUMBERS);
21987 kshitij.so 652
						serialNumbers.add(lineItem.getSerialNumber());
21654 ashik.ali 653
					}
654
				}
655
			}
656
		}
657
		return grnHistoryDetails;
658
	}
21987 kshitij.so 659
 
21654 ashik.ali 660
	private void writeItemDetailstoGrnHistories(Map<Integer, Map<String, Object>> grnHistoryDetails, Map<Integer, Map<String, Object>> itemDetails){
661
		for(int key : grnHistoryDetails.keySet()){
662
			Map<String, Object> grnHistoryDetail = grnHistoryDetails.get(key);
663
			grnHistoryDetail.putAll(itemDetails.get(key));
664
		}
665
	}
21987 kshitij.so 666
 
667
	private Map<Integer, Map<String, Object>> toMap(Set<Item> items, Purchase purchase){
21654 ashik.ali 668
		Map<Integer, Map<String, Object>> map = new HashMap<>();
669
		for(Item item : items){
670
			Map<String, Object> detailMap = new HashMap<>();
671
			detailMap.put(ProfitMandiConstants.BRAND, item.getBrand());
672
			detailMap.put(ProfitMandiConstants.MODEL_NAME, item.getModelName());
673
			detailMap.put(ProfitMandiConstants.MODEL_NUMBER, item.getModelNumber());
674
			detailMap.put(ProfitMandiConstants.COLOR, item.getColor());
21987 kshitij.so 675
			detailMap.put(ProfitMandiConstants.CATALOG_ITEM_ID, item.getCatalogItemId());
676
			detailMap.put("iconUrl",Utils.getIconUrl(item.getCatalogItemId(), host, port, webapp));
677
			detailMap.put("purchaseReference", purchase.getPurchaseReference());
21654 ashik.ali 678
			map.put(item.getId(), detailMap);
679
		}
680
		return map;
681
	}
21987 kshitij.so 682
 
21654 ashik.ali 683
	private void createGrnHistoryDetails(Map<Integer, Map<String, Object>> grnHistoryDetails, List<InventoryItem> inventoryItems){
684
		//Map<Integer, Map<String, Object>> grnHistoryDetails = new HashMap<>();
685
		for(InventoryItem inventoryItem : inventoryItems){
686
			if(!grnHistoryDetails.containsKey(inventoryItem.getItemId())){
687
				Map<String, Object> grnHistoryDetail = new HashMap<>();
688
				grnHistoryDetail.put(ProfitMandiConstants.QUANTITY, inventoryItem.getInitialQuantity());
689
				grnHistoryDetail.put(ProfitMandiConstants.COMPLETED, true);
690
				if(inventoryItem.getSerialNumber() == null || inventoryItem.getSerialNumber().equals("")){
691
					grnHistoryDetail.put(ProfitMandiConstants.SERIALIZED, false);
692
				}else{
693
					grnHistoryDetail.put(ProfitMandiConstants.SERIALIZED, true);
694
					Set<String> serialNumbers = new HashSet<>();
695
					serialNumbers.add(inventoryItem.getSerialNumber());
696
					grnHistoryDetail.put(ProfitMandiConstants.SERIAL_NUMBERS, serialNumbers);
22244 ashik.ali 697
					grnHistoryDetail.put("formattedSerialNumbers", String.join(", ", serialNumbers));
21654 ashik.ali 698
				}
699
				grnHistoryDetails.put(inventoryItem.getItemId(), grnHistoryDetail);
700
				//itemIds.add(inventoryItem.getItemId());
701
			}else{
702
				Map<String, Object> grnHistoryDetail = grnHistoryDetails.get(inventoryItem.getItemId());
703
				if((boolean)grnHistoryDetail.get(ProfitMandiConstants.SERIALIZED)){
704
					@SuppressWarnings("unchecked")
705
					Set<String> serialNumbers = (Set<String>)grnHistoryDetail.get(ProfitMandiConstants.SERIAL_NUMBERS);
706
					LOGGER.info("serialNumbers {}", serialNumbers);
21987 kshitij.so 707
					serialNumbers.add(inventoryItem.getSerialNumber());
22244 ashik.ali 708
					grnHistoryDetail.put("formattedSerialNumbers", String.join(", ", serialNumbers));
21654 ashik.ali 709
					grnHistoryDetail.put(ProfitMandiConstants.QUANTITY, (int)grnHistoryDetail.get(ProfitMandiConstants.QUANTITY) + inventoryItem.getInitialQuantity());
710
				}
711
			}
21987 kshitij.so 712
 
21654 ashik.ali 713
		}
714
		//return null;
715
	}
21987 kshitij.so 716
 
21654 ashik.ali 717
	public List<Item> getItemsByItemIds(Set<Integer> itemIds){
718
		return null;
719
	}
21987 kshitij.so 720
 
21577 ashik.ali 721
}