Subversion Repositories SmartDukaan

Rev

Rev 22064 | Rev 22098 | 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);
219
		LOGGER.info(fofoOrder.toString());
220
		LOGGER.info(fofoOrder.getCustomer().toString());
221
		LOGGER.info(fofoOrder.getCustomer().getCustomerAddress().toString());
222
		LOGGER.info(fofoOrder.getFofoLineItem().toString());
223
		LOGGER.info(fofoOrder.getFofoLineItem().get(0).getFofoLineItemSerialNumbers().toString());
224
		LOGGER.info(fofoOrder.getPaymentOption().toString());
225
		return null;
226
	}
227
 
228
	@RequestMapping(value = "/create-order", method = RequestMethod.POST)
229
	public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest, Model model)  throws Throwable{
22064 ashik.ali 230
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
21985 kshitij.so 231
		FofoDetails fofoDetails;
232
		try {
22069 ashik.ali 233
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 234
		} catch (ProfitMandiBusinessException e) {
235
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
236
			return "response";
237
		}
21680 ashik.ali 238
		Set<Integer> itemIds = new HashSet<>();
21896 ashik.ali 239
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); //this is for error
240
		Map<Integer, CustomFofoLineItem> customFofoLineItemMap = new HashMap<>();
241
		Map<Integer, Float> lineItemPrice = new HashMap<>(); //this is for pricing error
242
		float totalAmount = 0;
243
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
244
			itemIds.add(customFofoLineItem.getItemId());
245
			if(!customFofoLineItem.getSerialNumbers().isEmpty() && customFofoLineItem.getQuantity() != customFofoLineItem.getSerialNumbers().size()){
246
				itemIdQuantity.put(customFofoLineItem.getItemId(), customFofoLineItem.getQuantity());
21680 ashik.ali 247
			}
21896 ashik.ali 248
			if(!(customFofoLineItem.getSellingPrice() > 0)){
249
				lineItemPrice.put(customFofoLineItem.getItemId(), customFofoLineItem.getSellingPrice());
250
			}else{
251
				totalAmount = totalAmount + customFofoLineItem.getSellingPrice() * customFofoLineItem.getQuantity();
21680 ashik.ali 252
			}
21896 ashik.ali 253
			customFofoLineItemMap.put(customFofoLineItem.getItemId(), customFofoLineItem);
21680 ashik.ali 254
		}
255
		if(!itemIdQuantity.isEmpty()){
256
			// if item quantity does not match with given serialnumbers size
257
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
258
			return "error";
259
		}
260
		try{
261
			this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
262
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
263
			LOGGER.error("Error occured while validating payment options : ", profitMandiBusinessException);
264
			return "error";
265
		}
21896 ashik.ali 266
		if(!lineItemPrice.isEmpty()){
267
			// given fofo line item price must be greater than zero
268
			LOGGER.error("requested itemId's selling price must greater than 0");
269
			return "error";
270
		}
21985 kshitij.so 271
 
21896 ashik.ali 272
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.selectByFofoItemIds(fofoDetails.getFofoId(), itemIds);
273
		if(itemIds.size() != currentInventorySnapshots.size()){
274
			// error
275
		}
276
		List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); //this is for error
21985 kshitij.so 277
		LOGGER.info("currentInventorySnapshots "+currentInventorySnapshots);
21896 ashik.ali 278
		for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
279
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(currentInventorySnapshot.getId().getItemId());
21985 kshitij.so 280
			LOGGER.info("customFofoLineItem "+customFofoLineItem);
21896 ashik.ali 281
			if(customFofoLineItem.getQuantity() > currentInventorySnapshot.getAvailability()){
282
				ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
283
				itemIdQuantityAvailability.setItemId(customFofoLineItem.getItemId());
284
				Quantity quantity = new Quantity();
285
				quantity.setAvailable(currentInventorySnapshot.getAvailability());
286
				quantity.setRequested(customFofoLineItem.getQuantity());
287
				itemIdQuantityAvailability.setQuantity(quantity);
288
				itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
289
			}
21985 kshitij.so 290
 
21896 ashik.ali 291
		}
21985 kshitij.so 292
 
293
 
294
 
21680 ashik.ali 295
		if(!itemIdQuantityAvailabilities.isEmpty()){
296
			// itemIdQuantity request is not valid
297
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
298
			return "error";
299
		}
21985 kshitij.so 300
 
301
 
302
 
303
		//		Set<Integer> invalidItemIdSerialNumbers = new HashSet<>();
304
		//		Map<Integer, Set<String>> itemIdSerialNumbers = new HashMap<>();
305
		//		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), itemIds); //change it
306
		//		
307
		//		Map<Integer, Float> itemIdPriceDropAmount = new HashMap<>();
308
		//		
309
		//		for(InventoryItem inventoryItem : inventoryItems){
310
		//			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(inventoryItem.getItemId());
311
		//			if(customFofoLineItem.getSerialNumbers().isEmpty()){
312
		//				if(!(inventoryItem.getSerialNumber() == null && inventoryItem.getSerialNumber().equals(""))){
313
		//					invalidItemIdSerialNumbers.add(inventoryItem.getItemId());
314
		//				}
315
		//			}
316
		//			if(!customFofoLineItem.getSerialNumbers().isEmpty()){
317
		//				if(!customFofoLineItem.getSerialNumbers().contains(inventoryItem.getSerialNumber())){
318
		//					if(!itemIdSerialNumbers.containsKey(customFofoLineItem.getItemId())){
319
		//						Set<String> serialNumbers = new HashSet<>();
320
		//						serialNumbers.add(inventoryItem.getSerialNumber());
321
		//						itemIdSerialNumbers.put(customFofoLineItem.getItemId(), serialNumbers);
322
		//					}else{
323
		//						itemIdSerialNumbers.get(customFofoLineItem.getItemId()).add(inventoryItem.getSerialNumber());
324
		//				}
325
		//			}
326
		//			itemIdPriceDropAmount.put(inventoryItem.getItemId(), inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount());
327
		//		}
328
 
329
		Map<Integer, Item>  itemMap = new HashMap<Integer, Item>();
330
		List<Item> items = itemRepository.selectByIds(itemIds);
331
		for (Item i : items){
332
			itemMap.put(i.getId(), i);
333
		}
334
 
335
		Set<Integer> nonSerializedItemIds = new HashSet<>();
336
		Set<String> serialNumbers = new HashSet<>();
337
 
338
		Collection<CustomFofoLineItem> lineItemsValues = customFofoLineItemMap.values();
339
		for (CustomFofoLineItem cli : lineItemsValues){
340
 
341
			Item item = itemMap.get(cli.getItemId());
342
			if (item.getType().equals(ItemType.SERIALIZED)){
343
				for (String s : cli.getSerialNumbers()){
344
					serialNumbers.add(s);
21896 ashik.ali 345
				}
346
			}
21985 kshitij.so 347
			else{
348
				nonSerializedItemIds.add(cli.getItemId());
349
			}
350
 
351
		}
352
 
353
 
354
		Map<Integer, List<InventoryItem>> serializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
355
		Map<Integer, List<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
356
		Map<Integer, List<Float>> itemIdPriceDropAmount = new HashMap<>();
357
 
358
		if (serialNumbers.size() > 0 ){
359
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoDetails.getFofoId(), serialNumbers);
360
			for (InventoryItem it : serializedInventoryItems){
361
				if (it.getGoodQuantity() == 1){
362
					if (serializedInventoryItemMap.containsKey(it.getItemId())){
363
						serializedInventoryItemMap.get(it.getItemId()).add(it);
364
						itemIdPriceDropAmount.get(it.getItemId()).add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
21680 ashik.ali 365
					}
21985 kshitij.so 366
					else{
367
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
368
						tmp.add(it);
369
						serializedInventoryItemMap.put(it.getItemId(), tmp);
370
						ArrayList<Float> priceDropAmouts = new ArrayList<>();
371
						priceDropAmouts.add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
372
						itemIdPriceDropAmount.put(it.getItemId(), priceDropAmouts);
373
					}
21680 ashik.ali 374
				}
375
			}
376
		}
21985 kshitij.so 377
 
378
		if (nonSerializedItemIds.size() > 0){
379
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), nonSerializedItemIds);
380
			for (InventoryItem it : nonSerializedInventoryItems){
381
				if (it.getGoodQuantity() > 0){
382
					if (nonSerializedInventoryItemMap.containsKey(it.getItemId())){
383
						nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
384
					}
385
					else{
386
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
387
						tmp.add(it);
388
						nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
389
					}
390
				}
391
			}
392
		}
393
 
394
		List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
395
		List<Integer> itemIdSerialNumbers = new ArrayList<Integer>();
396
 
397
		for (Item i : items){
398
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
399
			if (i.getType().equals(ItemType.SERIALIZED)){
400
				if (customFofoLineItem ==null || customFofoLineItem.getSerialNumbers().size() ==0){
401
					invalidItemIdSerialNumbers.add(i.getId());
402
				}
403
			}
404
			else{
405
				if (customFofoLineItem == null || customFofoLineItem.getSerialNumbers().size() > 0 ){
406
					itemIdSerialNumbers.add(i.getId());
407
				}
408
			}
409
		}
410
 
21680 ashik.ali 411
		if(!invalidItemIdSerialNumbers.isEmpty()){
412
			LOGGER.error("Invalid itemId's serialNumbers {}", invalidItemIdSerialNumbers);
413
			// itemId's are serialized you are saying these are not serialized
414
			return "error";
415
		}
21985 kshitij.so 416
 
21680 ashik.ali 417
		if(!itemIdSerialNumbers.isEmpty()){
418
			LOGGER.error("Invalid itemId's serialNumbers {}", itemIdSerialNumbers);
419
			// itemId's are non serialized you are saying these are serialized
420
			return "error";
421
		}
21985 kshitij.so 422
 
21896 ashik.ali 423
		if(items.size() != itemIds.size()){
424
			LOGGER.error("Requested ItemIds not found in catalog");
425
			// invalid itemIds 
426
			return "error";
427
		}
21985 kshitij.so 428
 
429
		Map<Integer, List<InventoryItem>> inventoryItemsToBill = new HashMap<Integer,List<InventoryItem>>();
430
		Map<Integer, Integer> inventoryItemQuantityUsed = new HashMap<>(); //to keep track of inventoryitem quanity used for scan records insertion
431
 
432
		//Lets reduce quantity and decide what inventory items to use.
433
		for (Item i : items){
434
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
435
			if (i.getType().equals(ItemType.SERIALIZED)){
436
				//TODO:handle null
437
				if (serializedInventoryItemMap.get(i.getId()) == null || customFofoLineItem.getSerialNumbers().size() != serializedInventoryItemMap.get(i.getId()).size()){
438
					//not enough serial numbers
439
					System.out.println("not enough serial numbers");
440
					return "error";
441
				}
442
				List<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(i.getId());
443
				for (InventoryItem it : inventoryItemsSerializedserialized){
444
					it.setGoodQuantity(0);
445
					inventoryItemQuantityUsed.put(it.getId(), 1);
446
				}
447
				inventoryItemsToBill.put(i.getId(), inventoryItemsSerializedserialized);
448
			}
449
			else{
450
				List<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(i.getId());
451
				int quantityToBill = customFofoLineItem.getQuantity();
452
				int totalLeft = quantityToBill;
453
				List<InventoryItem> inventoryItemsNonSerializedUsed = new ArrayList<InventoryItem>();
454
				if (inventoryItemsNonSerialized!=null){
455
					for (InventoryItem it : inventoryItemsNonSerialized){
456
						if (totalLeft > 0){
457
							int toUse = Math.min(totalLeft, it.getGoodQuantity());
458
							inventoryItemQuantityUsed.put(it.getId(), toUse);
459
							it.setGoodQuantity(it.getGoodQuantity()  - toUse);
460
							totalLeft = totalLeft - toUse;
461
							inventoryItemsNonSerializedUsed.add(it);
462
						}
463
					}
464
				}
465
 
466
				if (totalLeft > 0){
467
					//not enough quanity for non-serialized
468
					System.out.println("not enough quanity for non-serialized");
469
					return "error";
470
				}
471
				inventoryItemsToBill.put(i.getId(), inventoryItemsNonSerializedUsed);
472
			}
473
		}
22069 ashik.ali 474
 
475
		// mop price validation
476
		Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
477
		Map<Integer, Float> itemIdPrinceMap = pricingService.getPrice(itemIds, fofoDetails.getFofoId());
478
		for(Map.Entry<Integer, Float> entry : itemIdPrinceMap.entrySet()){
479
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(entry.getKey());
480
			if(customFofoLineItem.getSellingPrice() < entry.getValue()){
481
				invalidMopItemIdPriceMap.put(entry.getKey(), customFofoLineItem.getSellingPrice());
482
			}
483
		}
484
 
485
		if(invalidMopItemIdPriceMap.isEmpty()){
486
			LOGGER.error("Invalid itemIds mop prices should be greater than mop prices {}", invalidMopItemIdPriceMap);
487
			return "error";
488
		}
21985 kshitij.so 489
 
21680 ashik.ali 490
		InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
491
		try{
492
			invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoDetails.getFofoId());
493
			invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
494
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
495
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
496
			invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
497
			invoiceNumberGenerationSequence.setFofoId(fofoDetails.getFofoId());
498
			invoiceNumberGenerationSequence.setPrefix("INVOICE");
22028 ashik.ali 499
			invoiceNumberGenerationSequence.setSequence(1);
21680 ashik.ali 500
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
501
		}
21985 kshitij.so 502
 
21680 ashik.ali 503
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
21985 kshitij.so 504
 
21680 ashik.ali 505
		if(!StringUtils.isValidEmailAddress(customCustomer.getEmailId())){
506
			LOGGER.error("invalid customer emailId {} ", customCustomer.getEmailId());
507
			return "error";
508
		}
21985 kshitij.so 509
 
21680 ashik.ali 510
		if(!StringUtils.isValidMobile(customCustomer.getMobileNumber())){
511
			LOGGER.error("invalid customer mobileNumber {} ", customCustomer.getMobileNumber());
512
			return "error";
513
		}
21985 kshitij.so 514
 
21680 ashik.ali 515
		Customer customer = null;
21985 kshitij.so 516
		try{
517
			customer = customerRepository.selectByMobileNumber(customCustomer.getMobileNumber());
518
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
519
			LOGGER.error("Error : ", profitMandiBusinessException);
21680 ashik.ali 520
			customer = new Customer();
21883 kshitij.so 521
			customer.setName(customCustomer.getName());
21680 ashik.ali 522
			customer.setEmailId(customCustomer.getEmailId());
523
			customer.setMobileNumber(customCustomer.getMobileNumber());
524
			customerRepository.persist(customer);
525
		}
21896 ashik.ali 526
		//TODO:Check if createOrderRequest contains addressId
21711 ashik.ali 527
		CustomerAddress customerAddress = this.createCustomerAddress(customCustomer.getAddress());
528
		customerAddress.setCustomerId(customer.getId());
529
		customerAddressRepository.persist(customerAddress);
21985 kshitij.so 530
 
21680 ashik.ali 531
		FofoOrder fofoOrder = new FofoOrder();
532
		fofoOrder.setCustomerId(customer.getId());
533
		fofoOrder.setFofoId(fofoDetails.getFofoId());
534
		fofoOrder.setInvoiceNumber(invoiceNumberGenerationSequence.getPrefix() + invoiceNumberGenerationSequence.getSequence());
535
		fofoOrder.setTotalAmount(totalAmount);
21886 kshitij.so 536
		fofoOrder.setCustomerAddressId(customerAddress.getId());
21680 ashik.ali 537
		fofoOrderRepository.persist(fofoOrder);
21985 kshitij.so 538
 
21680 ashik.ali 539
		for(CustomPaymentOption customPaymentOption : createOrderRequest.getPaymentOptions()){
540
			PaymentOption paymentOption = new PaymentOption();
541
			paymentOption.setOrderId(fofoOrder.getId());
542
			paymentOption.setAmount(customPaymentOption.getAmount());
543
			paymentOption.setType(customPaymentOption.getType());
544
			paymentOptionRepository.persist(paymentOption);
545
		}
21985 kshitij.so 546
 
21896 ashik.ali 547
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoDetails.getFofoId()));
22064 ashik.ali 548
		Map<String, GstRate> gstRateMap = null;
549
		if(retailerAddress.getState().equals(customerAddress.getState())){
550
			gstRateMap = Utils.getGstRates(retailerAddress.getState());
551
		}else{
552
			LOGGER.info("inter gstRate = true");
553
			gstRateMap = Utils.getInterGstRates();
554
		}
555
		LOGGER.info("gstRateMap {}", gstRateMap);
21680 ashik.ali 556
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
557
			FofoLineItem fofoLineItem = new FofoLineItem();
558
			fofoLineItem.setItemId(customFofoLineItem.getItemId());
559
			fofoLineItem.setQuantity(customFofoLineItem.getQuantity());
21690 ashik.ali 560
			fofoLineItem.setSellingPrice(customFofoLineItem.getSellingPrice());
21680 ashik.ali 561
			fofoLineItem.setOrderId(fofoOrder.getId());
562
			fofoLineItem.setDp(customFofoLineItem.getSellingPrice());
21985 kshitij.so 563
			Item item = itemMap.get(customFofoLineItem.getItemId());
21896 ashik.ali 564
			GstRate gstRate = gstRateMap.get(item.getHsnCode());
565
			fofoLineItem.setIgstRate(gstRate.getIgstRate());
566
			fofoLineItem.setCgstRate(gstRate.getCgstRate());
567
			fofoLineItem.setSgstRate(gstRate.getSgstRate());
21919 ashik.ali 568
			fofoLineItem.setHsnCode(gstRate.getHsnCode());
21985 kshitij.so 569
			List<Float> priceDropAmounts = itemIdPriceDropAmount.get(customFofoLineItem.getItemId());
570
			float cost = 0;
571
			if (priceDropAmounts!=null){
572
				for (Float pda : priceDropAmounts){
573
					cost = cost + pda;
574
				}
575
			}
576
			else{
577
				cost = customFofoLineItem.getSellingPrice()* customFofoLineItem.getQuantity();
578
			}
579
			fofoLineItem.setCost(cost);
21896 ashik.ali 580
			fofoLineItem.setBrand(item.getBrand());
581
			fofoLineItem.setModelName(item.getModelName());
582
			fofoLineItem.setModelNumber(item.getModelNumber());
583
			fofoLineItem.setColor(item.getColor());
21680 ashik.ali 584
			fofoLineItemRepository.persist(fofoLineItem);
585
			LOGGER.info("\n\n");
586
			if(!customFofoLineItem.getSerialNumbers().isEmpty()){
587
				for(String serialNumber : customFofoLineItem.getSerialNumbers()){
588
					FofoLineItemSerialNumber fofoLineItemSerialNumber = new FofoLineItemSerialNumber();
589
					fofoLineItemSerialNumber.setFofoLineItemId(fofoLineItem.getId());
590
					fofoLineItemSerialNumber.setSerialNumber(serialNumber);
591
					fofoLineItemSerialNumberRepository.persist(fofoLineItemSerialNumber);
592
				}
593
			}
21985 kshitij.so 594
 
21896 ashik.ali 595
			for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
596
				FofoItemId fofoItemId = new FofoItemId();
597
				fofoItemId.setFofoId(fofoDetails.getFofoId());
598
				fofoItemId.setItemId(fofoLineItem.getItemId());
599
				if(currentInventorySnapshot.getId().equals(fofoItemId)){
600
					currentInventorySnapshotRepository.updateAvailabilityByFofoItemId(fofoItemId, currentInventorySnapshot.getAvailability() - customFofoLineItem.getQuantity());
601
				}
602
			}
21985 kshitij.so 603
			List<InventoryItem> inventoryItems = inventoryItemsToBill.get(fofoLineItem.getItemId());
21680 ashik.ali 604
			for(InventoryItem inventoryItem : inventoryItems){
21985 kshitij.so 605
				inventoryItem.setLastScanType(ScanType.SALE);
606
				inventoryItemRepository.persist(inventoryItem);
607
				ScanRecord scanRecord = new ScanRecord();
608
				scanRecord.setInventoryItemId(inventoryItem.getId());
609
				scanRecord.setFofoId(fofoDetails.getFofoId());
610
				//correct this
611
				scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
612
				scanRecord.setType(ScanType.SALE);
613
				scanRecordRepository.persist(scanRecord);
614
			}
21680 ashik.ali 615
		}
21612 ashik.ali 616
		return null;
617
	}
21985 kshitij.so 618
 
21711 ashik.ali 619
	private CustomerAddress createCustomerAddress(CustomAddress customAddress){
620
		CustomerAddress customerAddress = new CustomerAddress();
621
		customerAddress.setName(customAddress.getName());
622
		customerAddress.setLine1(customAddress.getLine1());
623
		customerAddress.setLine2(customAddress.getLine2());
624
		customerAddress.setLandmark(customAddress.getLandmark());
625
		customerAddress.setCity(customAddress.getCity());
626
		customerAddress.setPinCode(customAddress.getPinCode());
627
		customerAddress.setState(customAddress.getState());
628
		customerAddress.setCountry(customAddress.getCountry());
629
		customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
630
		return customerAddress;
21680 ashik.ali 631
	}
21985 kshitij.so 632
 
21689 ashik.ali 633
	private CustomAddress createCustomAddress(Address address){
634
		CustomAddress customAddress = new CustomAddress();
635
		customAddress.setName(address.getName());
636
		customAddress.setLine1(address.getLine1());
637
		customAddress.setLine2(address.getLine2());
638
		customAddress.setLandmark(address.getLandmark());
639
		customAddress.setCity(address.getCity());
640
		customAddress.setPinCode(address.getPinCode());
641
		customAddress.setState(address.getState());
642
		customAddress.setCountry(address.getCountry());
643
		customAddress.setPhoneNumber(address.getPhoneNumber());
644
		return customAddress;
21680 ashik.ali 645
	}
21985 kshitij.so 646
 
21711 ashik.ali 647
	private CustomAddress createCustomAddress(CustomerAddress customerAddress){
648
		CustomAddress customAddress = new CustomAddress();
649
		customAddress.setName(customerAddress.getName());
650
		customAddress.setLine1(customerAddress.getLine1());
651
		customAddress.setLine2(customerAddress.getLine2());
652
		customAddress.setLandmark(customerAddress.getLandmark());
653
		customAddress.setCity(customerAddress.getCity());
654
		customAddress.setPinCode(customerAddress.getPinCode());
655
		customAddress.setState(customerAddress.getState());
656
		customAddress.setCountry(customerAddress.getCountry());
657
		customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
658
		return customAddress;
659
	}
21985 kshitij.so 660
 
21680 ashik.ali 661
	private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount) throws ProfitMandiBusinessException
21612 ashik.ali 662
	{
663
		float calculatedAmount = 0;
664
		Set<String> paymentOptionTypes = new HashSet<>();
665
		for(CustomPaymentOption customPaymentOption : customPaymentOptions){
21680 ashik.ali 666
			if(paymentOptionTypes.contains(customPaymentOption.getType().name())){
21612 ashik.ali 667
				throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_TYPE, customPaymentOption.getType().name(), "");
21680 ashik.ali 668
			}else{
669
				paymentOptionTypes.add(customPaymentOption.getType().name());
670
				calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
21612 ashik.ali 671
			}
672
		}
673
		if(calculatedAmount != totalAmount){
674
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT, calculatedAmount, "");
675
		}
676
	}
21985 kshitij.so 677
 
678
 
21689 ashik.ali 679
	@RequestMapping(value = "/generateInvoice")
21896 ashik.ali 680
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws Throwable{
22064 ashik.ali 681
		LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(), ProfitMandiConstants.ORDER_ID, orderId);
22069 ashik.ali 682
		FofoDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
22026 ashik.ali 683
 
21689 ashik.ali 684
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
685
		PdfModel pdfModel = new PdfModel();
686
		pdfModel.setAuther("profitmandi");
687
		pdfModel.setTitle("Retailer Invoice");
688
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
689
		CustomCustomer customCustomer = new CustomCustomer();
690
		customCustomer.setName(customer.getName());
691
		customCustomer.setEmailId(customer.getEmailId());
692
		customCustomer.setMobileNumber(customer.getMobileNumber());
21711 ashik.ali 693
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId()); 
21689 ashik.ali 694
		customCustomer.setAddress(this.createCustomAddress(customerAddress));
695
		pdfModel.setCustomer(customCustomer);
696
		pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
21965 ashik.ali 697
		pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
22026 ashik.ali 698
 
21689 ashik.ali 699
		Retailer retailer = retailerRepository.selectById(fofoDetails.getFofoId());
700
		User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
701
		CustomRetailer customRetailer = new CustomRetailer();
702
		customRetailer.setBusinessName(retailer.getName());
703
		customRetailer.setMobileNumber(user.getMobileNumber());
704
		customRetailer.setTinNumber(retailer.getNumber());
705
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
706
		customRetailer.setAddress(this.createCustomAddress(retailerAddress));
707
		pdfModel.setRetailer(customRetailer);
708
		List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
22026 ashik.ali 709
 
21689 ashik.ali 710
		Set<CustomFofoOrderItem> customerFofoOrderItems = new HashSet<>();
711
		for(FofoLineItem fofoLineItem : fofoLineItems){
712
			CustomFofoOrderItem customFofoOrderItem = new CustomFofoOrderItem();
22026 ashik.ali 713
			float totalTaxRate = fofoLineItem.getIgstRate() + fofoLineItem.getSgstRate() + fofoLineItem.getCgstRate();
714
			float taxableSellingPrice = fofoLineItem.getSellingPrice() / (1 + totalTaxRate / 100);
715
 
716
			customFofoOrderItem.setAmount(fofoLineItem.getQuantity() * taxableSellingPrice);
21689 ashik.ali 717
			customFofoOrderItem.setDescription(fofoLineItem.getBrand() + " " + fofoLineItem.getModelName() + " " + fofoLineItem.getModelNumber() + " " + fofoLineItem.getColor());
22026 ashik.ali 718
			customFofoOrderItem.setRate(taxableSellingPrice);
21689 ashik.ali 719
			customFofoOrderItem.setQuantity(fofoLineItem.getQuantity());
22026 ashik.ali 720
			float igstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getIgstRate()) / 100;
721
			float cgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getCgstRate()) / 100;
722
			float sgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getSgstRate()) / 100;
21896 ashik.ali 723
			customFofoOrderItem.setIgstRate(fofoLineItem.getIgstRate());
22026 ashik.ali 724
			customFofoOrderItem.setIgstAmount(igstAmount);
725
			customFofoOrderItem.setCgstRate(fofoLineItem.getCgstRate());
726
			customFofoOrderItem.setCgstAmount(cgstAmount);
727
			customFofoOrderItem.setSgstRate(fofoLineItem.getSgstRate());
728
			customFofoOrderItem.setSgstAmount(sgstAmount);
21896 ashik.ali 729
			customFofoOrderItem.setHsnCode(fofoLineItem.getHsnCode());
21689 ashik.ali 730
			customFofoOrderItem.setSerialNumbers(String.join(", ",this.toSerialNumbers(fofoLineItem.getFofoLineItemSerialNumbers())));
731
			customerFofoOrderItems.add(customFofoOrderItem);
732
		}
733
		pdfModel.setOrderItems(customerFofoOrderItems);
734
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
735
		PdfUtils.generateAndWrite(pdfModel, byteArrayOutputStream);
736
		//final MediaType mediaType=MediaType.parseMediaType(profilePhotoModel.getContentType().getValue());
737
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
22026 ashik.ali 738
        final HttpHeaders headers=new HttpHeaders();
739
        headers.setContentType(MediaType.APPLICATION_PDF);
740
        headers.set("Content-Disposition", "Order-"+orderId);
741
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
742
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
743
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
744
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
21689 ashik.ali 745
	}
21985 kshitij.so 746
 
21689 ashik.ali 747
	private Set<String> toSerialNumbers(Set<FofoLineItemSerialNumber> fofoLineItemSerialNumbers){
748
		Set<String> serialNumbers = new HashSet<>(fofoLineItemSerialNumbers.size());
749
		for(FofoLineItemSerialNumber fofoLineItemSerialNumber : fofoLineItemSerialNumbers){
750
			serialNumbers.add(fofoLineItemSerialNumber.getSerialNumber());
751
		}
752
		return serialNumbers;
753
	}
21985 kshitij.so 754
 
755
 
21612 ashik.ali 756
}