Subversion Repositories SmartDukaan

Rev

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