Subversion Repositories SmartDukaan

Rev

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