Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21612 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
21689 ashik.ali 3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.InputStream;
21680 ashik.ali 6
import java.util.ArrayList;
21985 kshitij.so 7
import java.util.Collection;
21680 ashik.ali 8
import java.util.HashMap;
21612 ashik.ali 9
import java.util.HashSet;
21985 kshitij.so 10
import java.util.Iterator;
21680 ashik.ali 11
import java.util.List;
12
import java.util.Map;
21612 ashik.ali 13
import java.util.Set;
14
 
15
import javax.servlet.http.HttpServletRequest;
21689 ashik.ali 16
import javax.servlet.http.HttpServletResponse;
21612 ashik.ali 17
 
21985 kshitij.so 18
import org.json.JSONObject;
21612 ashik.ali 19
import org.slf4j.Logger;
20
import org.slf4j.LoggerFactory;
21
import org.springframework.beans.factory.annotation.Autowired;
21689 ashik.ali 22
import org.springframework.core.io.InputStreamResource;
23
import org.springframework.http.HttpHeaders;
24
import org.springframework.http.HttpStatus;
25
import org.springframework.http.MediaType;
26
import org.springframework.http.ResponseEntity;
21612 ashik.ali 27
import org.springframework.stereotype.Controller;
22064 ashik.ali 28
import org.springframework.transaction.annotation.Transactional;
21985 kshitij.so 29
import org.springframework.ui.Model;
21612 ashik.ali 30
import org.springframework.web.bind.annotation.RequestBody;
31
import org.springframework.web.bind.annotation.RequestMapping;
32
import org.springframework.web.bind.annotation.RequestMethod;
21689 ashik.ali 33
import org.springframework.web.bind.annotation.RequestParam;
21612 ashik.ali 34
 
35
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21985 kshitij.so 36
import com.spice.profitmandi.common.model.CartFofo;
21680 ashik.ali 37
import com.spice.profitmandi.common.model.CustomAddress;
21689 ashik.ali 38
import com.spice.profitmandi.common.model.CustomCustomer;
39
import com.spice.profitmandi.common.model.CustomFofoLineItem;
40
import com.spice.profitmandi.common.model.CustomFofoOrderItem;
41
import com.spice.profitmandi.common.model.CustomRetailer;
21896 ashik.ali 42
import com.spice.profitmandi.common.model.GstRate;
21689 ashik.ali 43
import com.spice.profitmandi.common.model.PdfModel;
21612 ashik.ali 44
import com.spice.profitmandi.common.model.ProfitMandiConstants;
21689 ashik.ali 45
import com.spice.profitmandi.common.util.PdfUtils;
21680 ashik.ali 46
import com.spice.profitmandi.common.util.StringUtils;
21896 ashik.ali 47
import com.spice.profitmandi.common.util.Utils;
21728 ashik.ali 48
import com.spice.profitmandi.dao.entity.catalog.Item;
49
import com.spice.profitmandi.dao.entity.dtr.Retailer;
50
import com.spice.profitmandi.dao.entity.dtr.User;
51
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
52
import com.spice.profitmandi.dao.entity.fofo.Customer;
53
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
21896 ashik.ali 54
import com.spice.profitmandi.dao.entity.fofo.FofoItemId;
21728 ashik.ali 55
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
56
import com.spice.profitmandi.dao.entity.fofo.FofoLineItemSerialNumber;
57
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
58
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
59
import com.spice.profitmandi.dao.entity.fofo.InvoiceNumberGenerationSequence;
60
import com.spice.profitmandi.dao.entity.fofo.PaymentOption;
61
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
62
import com.spice.profitmandi.dao.entity.user.Address;
63
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
21883 kshitij.so 64
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
21728 ashik.ali 65
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
66
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
67
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
68
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
69
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
70
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
71
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
72
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
73
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemSerialNumberRepository;
74
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
75
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
76
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
77
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
78
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
79
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
80
import com.spice.profitmandi.dao.repository.user.AddressRepository;
22069 ashik.ali 81
import com.spice.profitmandi.service.pricing.PricingService;
21612 ashik.ali 82
import com.spice.profitmandi.web.model.FofoDetails;
83
import com.spice.profitmandi.web.request.CreateOrderRequest;
84
import com.spice.profitmandi.web.request.CustomPaymentOption;
21680 ashik.ali 85
import com.spice.profitmandi.web.response.ItemIdQuantityAvailability;
86
import com.spice.profitmandi.web.response.Quantity;
22069 ashik.ali 87
import com.spice.profitmandi.web.util.CookiesProcessor;
21612 ashik.ali 88
import com.spice.profitmandi.web.util.MVCResponseSender;
89
 
21985 kshitij.so 90
import in.shop2020.model.v1.catalog.ItemType;
91
 
21612 ashik.ali 92
@Controller
22037 amit.gupta 93
@Transactional(rollbackFor=Throwable.class)
21612 ashik.ali 94
public class OrderController {
95
 
96
	private static final Logger LOGGER = LoggerFactory.getLogger(OrderController.class);
21985 kshitij.so 97
 
21612 ashik.ali 98
	@Autowired
99
	OrderRepository orderRepository;
21985 kshitij.so 100
 
21612 ashik.ali 101
	@Autowired
102
	InventoryItemRepository inventoryItemRepository;
21985 kshitij.so 103
 
21612 ashik.ali 104
	@Autowired
21680 ashik.ali 105
	CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
21985 kshitij.so 106
 
21680 ashik.ali 107
	@Autowired
108
	InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
21985 kshitij.so 109
 
21680 ashik.ali 110
	@Autowired
111
	CustomerRepository customerRepository;
21985 kshitij.so 112
 
21680 ashik.ali 113
	@Autowired
114
	AddressRepository addressRepository;
21985 kshitij.so 115
 
21680 ashik.ali 116
	@Autowired
117
	FofoLineItemSerialNumberRepository fofoLineItemSerialNumberRepository;
21985 kshitij.so 118
 
21680 ashik.ali 119
	@Autowired
120
	FofoLineItemRepository fofoLineItemRepository;
21985 kshitij.so 121
 
21680 ashik.ali 122
	@Autowired
123
	PaymentOptionRepository paymentOptionRepository;
21985 kshitij.so 124
 
21680 ashik.ali 125
	@Autowired
126
	ScanRecordRepository scanRecordRepository;
21985 kshitij.so 127
 
21680 ashik.ali 128
	@Autowired
129
	FofoOrderRepository fofoOrderRepository;
21985 kshitij.so 130
 
21680 ashik.ali 131
	@Autowired
21689 ashik.ali 132
	RetailerRepository retailerRepository;
21985 kshitij.so 133
 
21689 ashik.ali 134
	@Autowired
135
	UserRepository userRepository;
21985 kshitij.so 136
 
21689 ashik.ali 137
	@Autowired
138
	UserAccountRepository userAccountRepository;
21985 kshitij.so 139
 
21689 ashik.ali 140
	@Autowired
141
	RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
21985 kshitij.so 142
 
21689 ashik.ali 143
	@Autowired
21711 ashik.ali 144
	CustomerAddressRepository customerAddressRepository;
21985 kshitij.so 145
 
21711 ashik.ali 146
	@Autowired
21896 ashik.ali 147
	ItemRepository itemRepository;
21985 kshitij.so 148
 
21896 ashik.ali 149
	@Autowired
21612 ashik.ali 150
	MVCResponseSender mvcResponseSender;
21985 kshitij.so 151
 
21612 ashik.ali 152
	@Autowired
22069 ashik.ali 153
	CookiesProcessor cookiesProcessor;
154
 
155
	@Autowired
156
	PricingService pricingService;
21985 kshitij.so 157
 
158
	@RequestMapping(value = "/order")
159
	public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model) throws Exception{
160
		try {
22069 ashik.ali 161
			cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 162
		} catch (ProfitMandiBusinessException e) {
163
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
164
			return "response";
165
		}
166
		JSONObject cartObject = new JSONObject(cartData);
167
		Iterator<?> keys = cartObject.keys();
168
 
169
		Set<Integer> itemIds = new HashSet<>();
170
		List<CartFofo> cartItems = new ArrayList<CartFofo>();
171
 
172
		while( keys.hasNext() ) {
173
			String key = (String)keys.next();
174
			if ( cartObject.get(key) instanceof JSONObject ) {
175
				System.out.println(cartObject.get(key));
176
			}
177
			CartFofo cf = new CartFofo();
178
			cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
179
			cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
180
			if (cf.getQuantity() <= 0){
181
				continue;
182
			}
183
			cartItems.add(cf);
184
			itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
185
		}
186
		Map<Integer, Item>  itemMap = new HashMap<Integer, Item>();
187
		if (itemIds.size() > 0){
188
			List<Item> items = itemRepository.selectByIds(itemIds);
189
			for (Item i : items){
190
				itemMap.put(i.getId(), i);
191
			}
192
		}
193
		for (CartFofo cf : cartItems){
194
			Item i = itemMap.get(cf.getItemId());
195
			if (i == null){
196
				continue;
197
			}
198
			cf.setDisplayName(getValidName(i.getBrand())+" "+getValidName(i.getModelName())+" "+getValidName(i.getModelNumber())+" "+getValidName(i.getColor()).replaceAll("\\s+", " "));
199
			cf.setItemType(i.getType());
200
		}
201
		model.addAttribute("cartObj", cartItems);
202
		return "order-index";
203
	}
204
 
205
	private String getValidName(String name){
206
		return name!=null?name:"";
207
	}
21612 ashik.ali 208
 
21985 kshitij.so 209
	@RequestMapping(value = "/get-order", method = RequestMethod.GET)
210
	public String getOrder(HttpServletRequest request, @RequestParam(name = "orderId") int orderId, Model model) throws ProfitMandiBusinessException, Exception{
211
		FofoDetails fofoDetails;
212
		try {
22069 ashik.ali 213
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 214
		} catch (ProfitMandiBusinessException e) {
215
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
216
			return "response";
217
		}
218
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
22098 kshitij.so 219
		List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
220
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
221
		List<PaymentOption> paymentOptions = paymentOptionRepository.selectByOrderId(fofoOrder.getId());
222
		model.addAttribute("fofoOrder", fofoOrder);
223
		model.addAttribute("fofoLineItems", fofoLineItems);
224
		model.addAttribute("customerBillingAddress", getBillingAddress(customerAddress));
225
		model.addAttribute("customerBillingAddressObj", customerAddress);
226
		model.addAttribute("paymentOptions", paymentOptions);
227
		return "order-details";
21985 kshitij.so 228
	}
229
 
22098 kshitij.so 230
	private String getBillingAddress(CustomerAddress customerAddress) {
231
		String address = "";
232
		if ((customerAddress.getLine1() != null) && (!customerAddress.getLine1().isEmpty())) {
233
			address = address + customerAddress.getLine1();
234
			address = address + ", ";
235
		}
236
 
237
		if ((customerAddress.getLine2() != null) && (!customerAddress.getLine2().isEmpty())) {
238
			address = address + customerAddress.getLine2();
239
			address = address + ", ";
240
		}
241
 
242
		if ((customerAddress.getLandmark() != null) && (!customerAddress.getLandmark().isEmpty())) {
243
			address = address + customerAddress.getLandmark();
244
			address = address + ", ";
245
		}
246
 
247
		if ((customerAddress.getCity() != null) && (!customerAddress.getCity().isEmpty())) {
248
			address = address + customerAddress.getCity();
249
			address = address + ", ";
250
		}
251
 
252
		if ((customerAddress.getState() != null) && (!customerAddress.getState().isEmpty())) {
253
			address = address + customerAddress.getState();
254
		}
255
 
256
		if ((customerAddress.getPinCode() != null) && (!customerAddress.getPinCode().isEmpty())) {
257
			address = address + "- " + customerAddress.getPinCode();
258
		}
259
 
260
		return address;
261
	}
262
 
21985 kshitij.so 263
	@RequestMapping(value = "/create-order", method = RequestMethod.POST)
264
	public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest, Model model)  throws Throwable{
22064 ashik.ali 265
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
21985 kshitij.so 266
		FofoDetails fofoDetails;
267
		try {
22069 ashik.ali 268
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 269
		} catch (ProfitMandiBusinessException e) {
270
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
271
			return "response";
272
		}
21680 ashik.ali 273
		Set<Integer> itemIds = new HashSet<>();
21896 ashik.ali 274
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); //this is for error
275
		Map<Integer, CustomFofoLineItem> customFofoLineItemMap = new HashMap<>();
276
		Map<Integer, Float> lineItemPrice = new HashMap<>(); //this is for pricing error
277
		float totalAmount = 0;
278
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
279
			itemIds.add(customFofoLineItem.getItemId());
280
			if(!customFofoLineItem.getSerialNumbers().isEmpty() && customFofoLineItem.getQuantity() != customFofoLineItem.getSerialNumbers().size()){
281
				itemIdQuantity.put(customFofoLineItem.getItemId(), customFofoLineItem.getQuantity());
21680 ashik.ali 282
			}
21896 ashik.ali 283
			if(!(customFofoLineItem.getSellingPrice() > 0)){
284
				lineItemPrice.put(customFofoLineItem.getItemId(), customFofoLineItem.getSellingPrice());
285
			}else{
286
				totalAmount = totalAmount + customFofoLineItem.getSellingPrice() * customFofoLineItem.getQuantity();
21680 ashik.ali 287
			}
21896 ashik.ali 288
			customFofoLineItemMap.put(customFofoLineItem.getItemId(), customFofoLineItem);
21680 ashik.ali 289
		}
290
		if(!itemIdQuantity.isEmpty()){
291
			// if item quantity does not match with given serialnumbers size
292
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
293
			return "error";
294
		}
295
		try{
296
			this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
297
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
298
			LOGGER.error("Error occured while validating payment options : ", profitMandiBusinessException);
299
			return "error";
300
		}
21896 ashik.ali 301
		if(!lineItemPrice.isEmpty()){
302
			// given fofo line item price must be greater than zero
303
			LOGGER.error("requested itemId's selling price must greater than 0");
304
			return "error";
305
		}
21985 kshitij.so 306
 
21896 ashik.ali 307
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.selectByFofoItemIds(fofoDetails.getFofoId(), itemIds);
308
		if(itemIds.size() != currentInventorySnapshots.size()){
309
			// error
310
		}
311
		List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); //this is for error
21985 kshitij.so 312
		LOGGER.info("currentInventorySnapshots "+currentInventorySnapshots);
21896 ashik.ali 313
		for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
314
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(currentInventorySnapshot.getId().getItemId());
21985 kshitij.so 315
			LOGGER.info("customFofoLineItem "+customFofoLineItem);
21896 ashik.ali 316
			if(customFofoLineItem.getQuantity() > currentInventorySnapshot.getAvailability()){
317
				ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
318
				itemIdQuantityAvailability.setItemId(customFofoLineItem.getItemId());
319
				Quantity quantity = new Quantity();
320
				quantity.setAvailable(currentInventorySnapshot.getAvailability());
321
				quantity.setRequested(customFofoLineItem.getQuantity());
322
				itemIdQuantityAvailability.setQuantity(quantity);
323
				itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
324
			}
21985 kshitij.so 325
 
21896 ashik.ali 326
		}
21985 kshitij.so 327
 
328
 
329
 
21680 ashik.ali 330
		if(!itemIdQuantityAvailabilities.isEmpty()){
331
			// itemIdQuantity request is not valid
332
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
333
			return "error";
334
		}
21985 kshitij.so 335
 
336
 
337
 
338
		//		Set<Integer> invalidItemIdSerialNumbers = new HashSet<>();
339
		//		Map<Integer, Set<String>> itemIdSerialNumbers = new HashMap<>();
340
		//		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), itemIds); //change it
341
		//		
342
		//		Map<Integer, Float> itemIdPriceDropAmount = new HashMap<>();
343
		//		
344
		//		for(InventoryItem inventoryItem : inventoryItems){
345
		//			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(inventoryItem.getItemId());
346
		//			if(customFofoLineItem.getSerialNumbers().isEmpty()){
347
		//				if(!(inventoryItem.getSerialNumber() == null && inventoryItem.getSerialNumber().equals(""))){
348
		//					invalidItemIdSerialNumbers.add(inventoryItem.getItemId());
349
		//				}
350
		//			}
351
		//			if(!customFofoLineItem.getSerialNumbers().isEmpty()){
352
		//				if(!customFofoLineItem.getSerialNumbers().contains(inventoryItem.getSerialNumber())){
353
		//					if(!itemIdSerialNumbers.containsKey(customFofoLineItem.getItemId())){
354
		//						Set<String> serialNumbers = new HashSet<>();
355
		//						serialNumbers.add(inventoryItem.getSerialNumber());
356
		//						itemIdSerialNumbers.put(customFofoLineItem.getItemId(), serialNumbers);
357
		//					}else{
358
		//						itemIdSerialNumbers.get(customFofoLineItem.getItemId()).add(inventoryItem.getSerialNumber());
359
		//				}
360
		//			}
361
		//			itemIdPriceDropAmount.put(inventoryItem.getItemId(), inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount());
362
		//		}
363
 
364
		Map<Integer, Item>  itemMap = new HashMap<Integer, Item>();
365
		List<Item> items = itemRepository.selectByIds(itemIds);
366
		for (Item i : items){
367
			itemMap.put(i.getId(), i);
368
		}
369
 
370
		Set<Integer> nonSerializedItemIds = new HashSet<>();
371
		Set<String> serialNumbers = new HashSet<>();
372
 
373
		Collection<CustomFofoLineItem> lineItemsValues = customFofoLineItemMap.values();
374
		for (CustomFofoLineItem cli : lineItemsValues){
375
 
376
			Item item = itemMap.get(cli.getItemId());
377
			if (item.getType().equals(ItemType.SERIALIZED)){
378
				for (String s : cli.getSerialNumbers()){
379
					serialNumbers.add(s);
21896 ashik.ali 380
				}
381
			}
21985 kshitij.so 382
			else{
383
				nonSerializedItemIds.add(cli.getItemId());
384
			}
385
 
386
		}
387
 
388
 
389
		Map<Integer, List<InventoryItem>> serializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
390
		Map<Integer, List<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
391
		Map<Integer, List<Float>> itemIdPriceDropAmount = new HashMap<>();
392
 
393
		if (serialNumbers.size() > 0 ){
394
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoDetails.getFofoId(), serialNumbers);
395
			for (InventoryItem it : serializedInventoryItems){
396
				if (it.getGoodQuantity() == 1){
397
					if (serializedInventoryItemMap.containsKey(it.getItemId())){
398
						serializedInventoryItemMap.get(it.getItemId()).add(it);
399
						itemIdPriceDropAmount.get(it.getItemId()).add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
21680 ashik.ali 400
					}
21985 kshitij.so 401
					else{
402
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
403
						tmp.add(it);
404
						serializedInventoryItemMap.put(it.getItemId(), tmp);
405
						ArrayList<Float> priceDropAmouts = new ArrayList<>();
406
						priceDropAmouts.add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
407
						itemIdPriceDropAmount.put(it.getItemId(), priceDropAmouts);
408
					}
21680 ashik.ali 409
				}
410
			}
411
		}
21985 kshitij.so 412
 
413
		if (nonSerializedItemIds.size() > 0){
414
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), nonSerializedItemIds);
415
			for (InventoryItem it : nonSerializedInventoryItems){
416
				if (it.getGoodQuantity() > 0){
417
					if (nonSerializedInventoryItemMap.containsKey(it.getItemId())){
418
						nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
419
					}
420
					else{
421
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
422
						tmp.add(it);
423
						nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
424
					}
425
				}
426
			}
427
		}
428
 
429
		List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
430
		List<Integer> itemIdSerialNumbers = new ArrayList<Integer>();
431
 
432
		for (Item i : items){
433
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
434
			if (i.getType().equals(ItemType.SERIALIZED)){
435
				if (customFofoLineItem ==null || customFofoLineItem.getSerialNumbers().size() ==0){
436
					invalidItemIdSerialNumbers.add(i.getId());
437
				}
438
			}
439
			else{
440
				if (customFofoLineItem == null || customFofoLineItem.getSerialNumbers().size() > 0 ){
441
					itemIdSerialNumbers.add(i.getId());
442
				}
443
			}
444
		}
445
 
21680 ashik.ali 446
		if(!invalidItemIdSerialNumbers.isEmpty()){
447
			LOGGER.error("Invalid itemId's serialNumbers {}", invalidItemIdSerialNumbers);
448
			// itemId's are serialized you are saying these are not serialized
449
			return "error";
450
		}
21985 kshitij.so 451
 
21680 ashik.ali 452
		if(!itemIdSerialNumbers.isEmpty()){
453
			LOGGER.error("Invalid itemId's serialNumbers {}", itemIdSerialNumbers);
454
			// itemId's are non serialized you are saying these are serialized
455
			return "error";
456
		}
21985 kshitij.so 457
 
21896 ashik.ali 458
		if(items.size() != itemIds.size()){
459
			LOGGER.error("Requested ItemIds not found in catalog");
460
			// invalid itemIds 
461
			return "error";
462
		}
21985 kshitij.so 463
 
464
		Map<Integer, List<InventoryItem>> inventoryItemsToBill = new HashMap<Integer,List<InventoryItem>>();
465
		Map<Integer, Integer> inventoryItemQuantityUsed = new HashMap<>(); //to keep track of inventoryitem quanity used for scan records insertion
466
 
467
		//Lets reduce quantity and decide what inventory items to use.
468
		for (Item i : items){
469
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
470
			if (i.getType().equals(ItemType.SERIALIZED)){
471
				//TODO:handle null
472
				if (serializedInventoryItemMap.get(i.getId()) == null || customFofoLineItem.getSerialNumbers().size() != serializedInventoryItemMap.get(i.getId()).size()){
473
					//not enough serial numbers
474
					System.out.println("not enough serial numbers");
475
					return "error";
476
				}
477
				List<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(i.getId());
478
				for (InventoryItem it : inventoryItemsSerializedserialized){
479
					it.setGoodQuantity(0);
480
					inventoryItemQuantityUsed.put(it.getId(), 1);
481
				}
482
				inventoryItemsToBill.put(i.getId(), inventoryItemsSerializedserialized);
483
			}
484
			else{
485
				List<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(i.getId());
486
				int quantityToBill = customFofoLineItem.getQuantity();
487
				int totalLeft = quantityToBill;
488
				List<InventoryItem> inventoryItemsNonSerializedUsed = new ArrayList<InventoryItem>();
489
				if (inventoryItemsNonSerialized!=null){
490
					for (InventoryItem it : inventoryItemsNonSerialized){
491
						if (totalLeft > 0){
492
							int toUse = Math.min(totalLeft, it.getGoodQuantity());
493
							inventoryItemQuantityUsed.put(it.getId(), toUse);
494
							it.setGoodQuantity(it.getGoodQuantity()  - toUse);
495
							totalLeft = totalLeft - toUse;
496
							inventoryItemsNonSerializedUsed.add(it);
497
						}
498
					}
499
				}
500
 
501
				if (totalLeft > 0){
502
					//not enough quanity for non-serialized
503
					System.out.println("not enough quanity for non-serialized");
504
					return "error";
505
				}
506
				inventoryItemsToBill.put(i.getId(), inventoryItemsNonSerializedUsed);
507
			}
508
		}
22069 ashik.ali 509
 
510
		// mop price validation
511
		Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
512
		Map<Integer, Float> itemIdPrinceMap = pricingService.getPrice(itemIds, fofoDetails.getFofoId());
513
		for(Map.Entry<Integer, Float> entry : itemIdPrinceMap.entrySet()){
514
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(entry.getKey());
515
			if(customFofoLineItem.getSellingPrice() < entry.getValue()){
516
				invalidMopItemIdPriceMap.put(entry.getKey(), customFofoLineItem.getSellingPrice());
517
			}
518
		}
519
 
520
		if(invalidMopItemIdPriceMap.isEmpty()){
521
			LOGGER.error("Invalid itemIds mop prices should be greater than mop prices {}", invalidMopItemIdPriceMap);
522
			return "error";
523
		}
21985 kshitij.so 524
 
21680 ashik.ali 525
		InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
526
		try{
527
			invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoDetails.getFofoId());
528
			invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
529
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
530
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
531
			invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
532
			invoiceNumberGenerationSequence.setFofoId(fofoDetails.getFofoId());
533
			invoiceNumberGenerationSequence.setPrefix("INVOICE");
22028 ashik.ali 534
			invoiceNumberGenerationSequence.setSequence(1);
21680 ashik.ali 535
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
536
		}
21985 kshitij.so 537
 
21680 ashik.ali 538
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
21985 kshitij.so 539
 
21680 ashik.ali 540
		if(!StringUtils.isValidEmailAddress(customCustomer.getEmailId())){
541
			LOGGER.error("invalid customer emailId {} ", customCustomer.getEmailId());
542
			return "error";
543
		}
21985 kshitij.so 544
 
21680 ashik.ali 545
		if(!StringUtils.isValidMobile(customCustomer.getMobileNumber())){
546
			LOGGER.error("invalid customer mobileNumber {} ", customCustomer.getMobileNumber());
547
			return "error";
548
		}
21985 kshitij.so 549
 
21680 ashik.ali 550
		Customer customer = null;
21985 kshitij.so 551
		try{
552
			customer = customerRepository.selectByMobileNumber(customCustomer.getMobileNumber());
553
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
554
			LOGGER.error("Error : ", profitMandiBusinessException);
21680 ashik.ali 555
			customer = new Customer();
21883 kshitij.so 556
			customer.setName(customCustomer.getName());
21680 ashik.ali 557
			customer.setEmailId(customCustomer.getEmailId());
558
			customer.setMobileNumber(customCustomer.getMobileNumber());
559
			customerRepository.persist(customer);
560
		}
21896 ashik.ali 561
		//TODO:Check if createOrderRequest contains addressId
21711 ashik.ali 562
		CustomerAddress customerAddress = this.createCustomerAddress(customCustomer.getAddress());
563
		customerAddress.setCustomerId(customer.getId());
564
		customerAddressRepository.persist(customerAddress);
21985 kshitij.so 565
 
21680 ashik.ali 566
		FofoOrder fofoOrder = new FofoOrder();
567
		fofoOrder.setCustomerId(customer.getId());
568
		fofoOrder.setFofoId(fofoDetails.getFofoId());
569
		fofoOrder.setInvoiceNumber(invoiceNumberGenerationSequence.getPrefix() + invoiceNumberGenerationSequence.getSequence());
570
		fofoOrder.setTotalAmount(totalAmount);
21886 kshitij.so 571
		fofoOrder.setCustomerAddressId(customerAddress.getId());
21680 ashik.ali 572
		fofoOrderRepository.persist(fofoOrder);
21985 kshitij.so 573
 
21680 ashik.ali 574
		for(CustomPaymentOption customPaymentOption : createOrderRequest.getPaymentOptions()){
575
			PaymentOption paymentOption = new PaymentOption();
576
			paymentOption.setOrderId(fofoOrder.getId());
577
			paymentOption.setAmount(customPaymentOption.getAmount());
578
			paymentOption.setType(customPaymentOption.getType());
579
			paymentOptionRepository.persist(paymentOption);
580
		}
21985 kshitij.so 581
 
21896 ashik.ali 582
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoDetails.getFofoId()));
22064 ashik.ali 583
		Map<String, GstRate> gstRateMap = null;
584
		if(retailerAddress.getState().equals(customerAddress.getState())){
585
			gstRateMap = Utils.getGstRates(retailerAddress.getState());
586
		}else{
587
			LOGGER.info("inter gstRate = true");
588
			gstRateMap = Utils.getInterGstRates();
589
		}
590
		LOGGER.info("gstRateMap {}", gstRateMap);
21680 ashik.ali 591
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
592
			FofoLineItem fofoLineItem = new FofoLineItem();
593
			fofoLineItem.setItemId(customFofoLineItem.getItemId());
594
			fofoLineItem.setQuantity(customFofoLineItem.getQuantity());
21690 ashik.ali 595
			fofoLineItem.setSellingPrice(customFofoLineItem.getSellingPrice());
21680 ashik.ali 596
			fofoLineItem.setOrderId(fofoOrder.getId());
597
			fofoLineItem.setDp(customFofoLineItem.getSellingPrice());
21985 kshitij.so 598
			Item item = itemMap.get(customFofoLineItem.getItemId());
21896 ashik.ali 599
			GstRate gstRate = gstRateMap.get(item.getHsnCode());
600
			fofoLineItem.setIgstRate(gstRate.getIgstRate());
601
			fofoLineItem.setCgstRate(gstRate.getCgstRate());
602
			fofoLineItem.setSgstRate(gstRate.getSgstRate());
21919 ashik.ali 603
			fofoLineItem.setHsnCode(gstRate.getHsnCode());
21985 kshitij.so 604
			List<Float> priceDropAmounts = itemIdPriceDropAmount.get(customFofoLineItem.getItemId());
605
			float cost = 0;
606
			if (priceDropAmounts!=null){
607
				for (Float pda : priceDropAmounts){
608
					cost = cost + pda;
609
				}
610
			}
611
			else{
612
				cost = customFofoLineItem.getSellingPrice()* customFofoLineItem.getQuantity();
613
			}
614
			fofoLineItem.setCost(cost);
21896 ashik.ali 615
			fofoLineItem.setBrand(item.getBrand());
616
			fofoLineItem.setModelName(item.getModelName());
617
			fofoLineItem.setModelNumber(item.getModelNumber());
618
			fofoLineItem.setColor(item.getColor());
21680 ashik.ali 619
			fofoLineItemRepository.persist(fofoLineItem);
620
			LOGGER.info("\n\n");
621
			if(!customFofoLineItem.getSerialNumbers().isEmpty()){
622
				for(String serialNumber : customFofoLineItem.getSerialNumbers()){
623
					FofoLineItemSerialNumber fofoLineItemSerialNumber = new FofoLineItemSerialNumber();
624
					fofoLineItemSerialNumber.setFofoLineItemId(fofoLineItem.getId());
625
					fofoLineItemSerialNumber.setSerialNumber(serialNumber);
626
					fofoLineItemSerialNumberRepository.persist(fofoLineItemSerialNumber);
627
				}
628
			}
21985 kshitij.so 629
 
21896 ashik.ali 630
			for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
631
				FofoItemId fofoItemId = new FofoItemId();
632
				fofoItemId.setFofoId(fofoDetails.getFofoId());
633
				fofoItemId.setItemId(fofoLineItem.getItemId());
634
				if(currentInventorySnapshot.getId().equals(fofoItemId)){
635
					currentInventorySnapshotRepository.updateAvailabilityByFofoItemId(fofoItemId, currentInventorySnapshot.getAvailability() - customFofoLineItem.getQuantity());
636
				}
637
			}
21985 kshitij.so 638
			List<InventoryItem> inventoryItems = inventoryItemsToBill.get(fofoLineItem.getItemId());
21680 ashik.ali 639
			for(InventoryItem inventoryItem : inventoryItems){
21985 kshitij.so 640
				inventoryItem.setLastScanType(ScanType.SALE);
641
				inventoryItemRepository.persist(inventoryItem);
642
				ScanRecord scanRecord = new ScanRecord();
643
				scanRecord.setInventoryItemId(inventoryItem.getId());
644
				scanRecord.setFofoId(fofoDetails.getFofoId());
645
				//correct this
646
				scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
647
				scanRecord.setType(ScanType.SALE);
648
				scanRecordRepository.persist(scanRecord);
649
			}
21680 ashik.ali 650
		}
21612 ashik.ali 651
		return null;
652
	}
21985 kshitij.so 653
 
21711 ashik.ali 654
	private CustomerAddress createCustomerAddress(CustomAddress customAddress){
655
		CustomerAddress customerAddress = new CustomerAddress();
656
		customerAddress.setName(customAddress.getName());
657
		customerAddress.setLine1(customAddress.getLine1());
658
		customerAddress.setLine2(customAddress.getLine2());
659
		customerAddress.setLandmark(customAddress.getLandmark());
660
		customerAddress.setCity(customAddress.getCity());
661
		customerAddress.setPinCode(customAddress.getPinCode());
662
		customerAddress.setState(customAddress.getState());
663
		customerAddress.setCountry(customAddress.getCountry());
664
		customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
665
		return customerAddress;
21680 ashik.ali 666
	}
21985 kshitij.so 667
 
21689 ashik.ali 668
	private CustomAddress createCustomAddress(Address address){
669
		CustomAddress customAddress = new CustomAddress();
670
		customAddress.setName(address.getName());
671
		customAddress.setLine1(address.getLine1());
672
		customAddress.setLine2(address.getLine2());
673
		customAddress.setLandmark(address.getLandmark());
674
		customAddress.setCity(address.getCity());
675
		customAddress.setPinCode(address.getPinCode());
676
		customAddress.setState(address.getState());
677
		customAddress.setCountry(address.getCountry());
678
		customAddress.setPhoneNumber(address.getPhoneNumber());
679
		return customAddress;
21680 ashik.ali 680
	}
21985 kshitij.so 681
 
21711 ashik.ali 682
	private CustomAddress createCustomAddress(CustomerAddress customerAddress){
683
		CustomAddress customAddress = new CustomAddress();
684
		customAddress.setName(customerAddress.getName());
685
		customAddress.setLine1(customerAddress.getLine1());
686
		customAddress.setLine2(customerAddress.getLine2());
687
		customAddress.setLandmark(customerAddress.getLandmark());
688
		customAddress.setCity(customerAddress.getCity());
689
		customAddress.setPinCode(customerAddress.getPinCode());
690
		customAddress.setState(customerAddress.getState());
691
		customAddress.setCountry(customerAddress.getCountry());
692
		customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
693
		return customAddress;
694
	}
21985 kshitij.so 695
 
21680 ashik.ali 696
	private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount) throws ProfitMandiBusinessException
21612 ashik.ali 697
	{
698
		float calculatedAmount = 0;
699
		Set<String> paymentOptionTypes = new HashSet<>();
700
		for(CustomPaymentOption customPaymentOption : customPaymentOptions){
21680 ashik.ali 701
			if(paymentOptionTypes.contains(customPaymentOption.getType().name())){
21612 ashik.ali 702
				throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_TYPE, customPaymentOption.getType().name(), "");
21680 ashik.ali 703
			}else{
704
				paymentOptionTypes.add(customPaymentOption.getType().name());
705
				calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
21612 ashik.ali 706
			}
707
		}
708
		if(calculatedAmount != totalAmount){
709
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT, calculatedAmount, "");
710
		}
711
	}
21985 kshitij.so 712
 
713
 
21689 ashik.ali 714
	@RequestMapping(value = "/generateInvoice")
21896 ashik.ali 715
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws Throwable{
22064 ashik.ali 716
		LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(), ProfitMandiConstants.ORDER_ID, orderId);
22069 ashik.ali 717
		FofoDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
22026 ashik.ali 718
 
21689 ashik.ali 719
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
720
		PdfModel pdfModel = new PdfModel();
721
		pdfModel.setAuther("profitmandi");
722
		pdfModel.setTitle("Retailer Invoice");
723
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
724
		CustomCustomer customCustomer = new CustomCustomer();
725
		customCustomer.setName(customer.getName());
726
		customCustomer.setEmailId(customer.getEmailId());
727
		customCustomer.setMobileNumber(customer.getMobileNumber());
21711 ashik.ali 728
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId()); 
21689 ashik.ali 729
		customCustomer.setAddress(this.createCustomAddress(customerAddress));
730
		pdfModel.setCustomer(customCustomer);
731
		pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
21965 ashik.ali 732
		pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
22026 ashik.ali 733
 
21689 ashik.ali 734
		Retailer retailer = retailerRepository.selectById(fofoDetails.getFofoId());
735
		User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
736
		CustomRetailer customRetailer = new CustomRetailer();
737
		customRetailer.setBusinessName(retailer.getName());
738
		customRetailer.setMobileNumber(user.getMobileNumber());
739
		customRetailer.setTinNumber(retailer.getNumber());
740
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
741
		customRetailer.setAddress(this.createCustomAddress(retailerAddress));
742
		pdfModel.setRetailer(customRetailer);
743
		List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
22026 ashik.ali 744
 
21689 ashik.ali 745
		Set<CustomFofoOrderItem> customerFofoOrderItems = new HashSet<>();
746
		for(FofoLineItem fofoLineItem : fofoLineItems){
747
			CustomFofoOrderItem customFofoOrderItem = new CustomFofoOrderItem();
22026 ashik.ali 748
			float totalTaxRate = fofoLineItem.getIgstRate() + fofoLineItem.getSgstRate() + fofoLineItem.getCgstRate();
749
			float taxableSellingPrice = fofoLineItem.getSellingPrice() / (1 + totalTaxRate / 100);
750
 
751
			customFofoOrderItem.setAmount(fofoLineItem.getQuantity() * taxableSellingPrice);
21689 ashik.ali 752
			customFofoOrderItem.setDescription(fofoLineItem.getBrand() + " " + fofoLineItem.getModelName() + " " + fofoLineItem.getModelNumber() + " " + fofoLineItem.getColor());
22026 ashik.ali 753
			customFofoOrderItem.setRate(taxableSellingPrice);
21689 ashik.ali 754
			customFofoOrderItem.setQuantity(fofoLineItem.getQuantity());
22026 ashik.ali 755
			float igstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getIgstRate()) / 100;
756
			float cgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getCgstRate()) / 100;
757
			float sgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getSgstRate()) / 100;
21896 ashik.ali 758
			customFofoOrderItem.setIgstRate(fofoLineItem.getIgstRate());
22026 ashik.ali 759
			customFofoOrderItem.setIgstAmount(igstAmount);
760
			customFofoOrderItem.setCgstRate(fofoLineItem.getCgstRate());
761
			customFofoOrderItem.setCgstAmount(cgstAmount);
762
			customFofoOrderItem.setSgstRate(fofoLineItem.getSgstRate());
763
			customFofoOrderItem.setSgstAmount(sgstAmount);
21896 ashik.ali 764
			customFofoOrderItem.setHsnCode(fofoLineItem.getHsnCode());
21689 ashik.ali 765
			customFofoOrderItem.setSerialNumbers(String.join(", ",this.toSerialNumbers(fofoLineItem.getFofoLineItemSerialNumbers())));
766
			customerFofoOrderItems.add(customFofoOrderItem);
767
		}
768
		pdfModel.setOrderItems(customerFofoOrderItems);
769
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
770
		PdfUtils.generateAndWrite(pdfModel, byteArrayOutputStream);
771
		//final MediaType mediaType=MediaType.parseMediaType(profilePhotoModel.getContentType().getValue());
772
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
22026 ashik.ali 773
        final HttpHeaders headers=new HttpHeaders();
774
        headers.setContentType(MediaType.APPLICATION_PDF);
775
        headers.set("Content-Disposition", "Order-"+orderId);
776
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
777
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
778
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
779
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
21689 ashik.ali 780
	}
21985 kshitij.so 781
 
21689 ashik.ali 782
	private Set<String> toSerialNumbers(Set<FofoLineItemSerialNumber> fofoLineItemSerialNumbers){
783
		Set<String> serialNumbers = new HashSet<>(fofoLineItemSerialNumbers.size());
784
		for(FofoLineItemSerialNumber fofoLineItemSerialNumber : fofoLineItemSerialNumbers){
785
			serialNumbers.add(fofoLineItemSerialNumber.getSerialNumber());
786
		}
787
		return serialNumbers;
788
	}
21985 kshitij.so 789
 
790
 
21612 ashik.ali 791
}