Subversion Repositories SmartDukaan

Rev

Rev 22284 | Rev 22354 | 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;
22217 ashik.ali 6
import java.time.DateTimeException;
7
import java.time.LocalDate;
22244 ashik.ali 8
import java.time.LocalDateTime;
21680 ashik.ali 9
import java.util.ArrayList;
21985 kshitij.so 10
import java.util.Collection;
21680 ashik.ali 11
import java.util.HashMap;
21612 ashik.ali 12
import java.util.HashSet;
21985 kshitij.so 13
import java.util.Iterator;
21680 ashik.ali 14
import java.util.List;
15
import java.util.Map;
21612 ashik.ali 16
import java.util.Set;
17
 
18
import javax.servlet.http.HttpServletRequest;
21689 ashik.ali 19
import javax.servlet.http.HttpServletResponse;
21612 ashik.ali 20
 
21985 kshitij.so 21
import org.json.JSONObject;
21612 ashik.ali 22
import org.slf4j.Logger;
23
import org.slf4j.LoggerFactory;
24
import org.springframework.beans.factory.annotation.Autowired;
21689 ashik.ali 25
import org.springframework.core.io.InputStreamResource;
26
import org.springframework.http.HttpHeaders;
27
import org.springframework.http.HttpStatus;
28
import org.springframework.http.MediaType;
29
import org.springframework.http.ResponseEntity;
21612 ashik.ali 30
import org.springframework.stereotype.Controller;
22064 ashik.ali 31
import org.springframework.transaction.annotation.Transactional;
21985 kshitij.so 32
import org.springframework.ui.Model;
21612 ashik.ali 33
import org.springframework.web.bind.annotation.RequestBody;
34
import org.springframework.web.bind.annotation.RequestMapping;
35
import org.springframework.web.bind.annotation.RequestMethod;
21689 ashik.ali 36
import org.springframework.web.bind.annotation.RequestParam;
21612 ashik.ali 37
 
38
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21985 kshitij.so 39
import com.spice.profitmandi.common.model.CartFofo;
21680 ashik.ali 40
import com.spice.profitmandi.common.model.CustomAddress;
21689 ashik.ali 41
import com.spice.profitmandi.common.model.CustomCustomer;
42
import com.spice.profitmandi.common.model.CustomFofoLineItem;
43
import com.spice.profitmandi.common.model.CustomFofoOrderItem;
22217 ashik.ali 44
import com.spice.profitmandi.common.model.CustomInsurancePolicy;
21689 ashik.ali 45
import com.spice.profitmandi.common.model.CustomRetailer;
22217 ashik.ali 46
import com.spice.profitmandi.common.model.GadgetCopsInsuranceModel;
21896 ashik.ali 47
import com.spice.profitmandi.common.model.GstRate;
21689 ashik.ali 48
import com.spice.profitmandi.common.model.PdfModel;
21612 ashik.ali 49
import com.spice.profitmandi.common.model.ProfitMandiConstants;
22217 ashik.ali 50
import com.spice.profitmandi.common.model.SerialNumberDetail;
51
import com.spice.profitmandi.common.util.InsuranceUtils;
21689 ashik.ali 52
import com.spice.profitmandi.common.util.PdfUtils;
21680 ashik.ali 53
import com.spice.profitmandi.common.util.StringUtils;
21896 ashik.ali 54
import com.spice.profitmandi.common.util.Utils;
22244 ashik.ali 55
import com.spice.profitmandi.common.web.util.ResponseSender;
21728 ashik.ali 56
import com.spice.profitmandi.dao.entity.catalog.Item;
22217 ashik.ali 57
import com.spice.profitmandi.dao.entity.dtr.GadgetCopsInsuranceCalc;
58
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
59
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
60
import com.spice.profitmandi.dao.entity.dtr.PolicyNumberGenerationSequence;
21728 ashik.ali 61
import com.spice.profitmandi.dao.entity.dtr.Retailer;
62
import com.spice.profitmandi.dao.entity.dtr.User;
63
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
64
import com.spice.profitmandi.dao.entity.fofo.Customer;
65
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
21896 ashik.ali 66
import com.spice.profitmandi.dao.entity.fofo.FofoItemId;
21728 ashik.ali 67
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
68
import com.spice.profitmandi.dao.entity.fofo.FofoLineItemSerialNumber;
69
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
70
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
71
import com.spice.profitmandi.dao.entity.fofo.InvoiceNumberGenerationSequence;
72
import com.spice.profitmandi.dao.entity.fofo.PaymentOption;
73
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
74
import com.spice.profitmandi.dao.entity.user.Address;
75
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
21883 kshitij.so 76
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
22217 ashik.ali 77
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
78
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
79
import com.spice.profitmandi.dao.repository.dtr.PolicyNumberGenerationSequenceRepository;
21728 ashik.ali 80
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
81
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
82
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
83
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
84
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
85
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
86
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
87
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
88
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemSerialNumberRepository;
89
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
90
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
91
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
92
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
93
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
94
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
95
import com.spice.profitmandi.dao.repository.user.AddressRepository;
22069 ashik.ali 96
import com.spice.profitmandi.service.pricing.PricingService;
22139 amit.gupta 97
import com.spice.profitmandi.web.model.LoginDetails;
21612 ashik.ali 98
import com.spice.profitmandi.web.request.CreateOrderRequest;
99
import com.spice.profitmandi.web.request.CustomPaymentOption;
21680 ashik.ali 100
import com.spice.profitmandi.web.response.ItemIdQuantityAvailability;
101
import com.spice.profitmandi.web.response.Quantity;
22069 ashik.ali 102
import com.spice.profitmandi.web.util.CookiesProcessor;
21612 ashik.ali 103
import com.spice.profitmandi.web.util.MVCResponseSender;
104
 
21985 kshitij.so 105
import in.shop2020.model.v1.catalog.ItemType;
106
 
21612 ashik.ali 107
@Controller
22037 amit.gupta 108
@Transactional(rollbackFor=Throwable.class)
21612 ashik.ali 109
public class OrderController {
110
 
111
	private static final Logger LOGGER = LoggerFactory.getLogger(OrderController.class);
21985 kshitij.so 112
 
21612 ashik.ali 113
	@Autowired
114
	OrderRepository orderRepository;
21985 kshitij.so 115
 
21612 ashik.ali 116
	@Autowired
117
	InventoryItemRepository inventoryItemRepository;
21985 kshitij.so 118
 
21612 ashik.ali 119
	@Autowired
21680 ashik.ali 120
	CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
21985 kshitij.so 121
 
21680 ashik.ali 122
	@Autowired
123
	InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
21985 kshitij.so 124
 
21680 ashik.ali 125
	@Autowired
126
	CustomerRepository customerRepository;
21985 kshitij.so 127
 
21680 ashik.ali 128
	@Autowired
129
	AddressRepository addressRepository;
21985 kshitij.so 130
 
21680 ashik.ali 131
	@Autowired
132
	FofoLineItemSerialNumberRepository fofoLineItemSerialNumberRepository;
21985 kshitij.so 133
 
21680 ashik.ali 134
	@Autowired
135
	FofoLineItemRepository fofoLineItemRepository;
21985 kshitij.so 136
 
21680 ashik.ali 137
	@Autowired
138
	PaymentOptionRepository paymentOptionRepository;
21985 kshitij.so 139
 
21680 ashik.ali 140
	@Autowired
141
	ScanRecordRepository scanRecordRepository;
21985 kshitij.so 142
 
21680 ashik.ali 143
	@Autowired
144
	FofoOrderRepository fofoOrderRepository;
21985 kshitij.so 145
 
21680 ashik.ali 146
	@Autowired
21689 ashik.ali 147
	RetailerRepository retailerRepository;
21985 kshitij.so 148
 
21689 ashik.ali 149
	@Autowired
150
	UserRepository userRepository;
21985 kshitij.so 151
 
21689 ashik.ali 152
	@Autowired
153
	UserAccountRepository userAccountRepository;
21985 kshitij.so 154
 
21689 ashik.ali 155
	@Autowired
156
	RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
21985 kshitij.so 157
 
21689 ashik.ali 158
	@Autowired
21711 ashik.ali 159
	CustomerAddressRepository customerAddressRepository;
21985 kshitij.so 160
 
21711 ashik.ali 161
	@Autowired
21896 ashik.ali 162
	ItemRepository itemRepository;
22217 ashik.ali 163
 
164
	@Autowired
165
	InsuranceProviderRepository insuranceProviderRepository;
166
 
167
	@Autowired
168
	InsurancePolicyRepository insurancePolicyRepository;
169
 
170
	@Autowired
171
	PolicyNumberGenerationSequenceRepository policyNumberGenerationSequenceRepository;
21985 kshitij.so 172
 
21896 ashik.ali 173
	@Autowired
21612 ashik.ali 174
	MVCResponseSender mvcResponseSender;
21985 kshitij.so 175
 
21612 ashik.ali 176
	@Autowired
22069 ashik.ali 177
	CookiesProcessor cookiesProcessor;
178
 
179
	@Autowired
180
	PricingService pricingService;
22244 ashik.ali 181
 
182
 
183
	@Autowired
184
	ResponseSender<?> responseSender;
21985 kshitij.so 185
 
186
	@RequestMapping(value = "/order")
187
	public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model) throws Exception{
22244 ashik.ali 188
		LoginDetails loginDetails = null;
21985 kshitij.so 189
		try {
22244 ashik.ali 190
			loginDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 191
		} catch (ProfitMandiBusinessException e) {
192
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
193
			return "response";
194
		}
22275 ashik.ali 195
		try{
196
			JSONObject cartObject = new JSONObject(cartData);
197
			Iterator<?> keys = cartObject.keys();
198
 
199
			Set<Integer> itemIds = new HashSet<>();
200
			List<CartFofo> cartItems = new ArrayList<CartFofo>();
201
 
202
			while( keys.hasNext() ) {
203
				String key = (String)keys.next();
204
				if ( cartObject.get(key) instanceof JSONObject ) {
205
					System.out.println(cartObject.get(key));
206
				}
207
				CartFofo cf = new CartFofo();
208
				cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
209
				cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
210
 
211
				if (cf.getQuantity() <= 0){
212
					continue;
213
				}
214
				cartItems.add(cf);
215
				itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
21985 kshitij.so 216
			}
22275 ashik.ali 217
			Map<Integer, Item>  itemMap = new HashMap<Integer, Item>();
218
			if (itemIds.size() > 0){
219
				List<Item> items = itemRepository.selectByIds(itemIds);
220
				for (Item i : items){
221
					itemMap.put(i.getId(), i);
222
				}
223
 
21985 kshitij.so 224
			}
22275 ashik.ali 225
			for (CartFofo cf : cartItems){
226
				Item i = itemMap.get(cf.getItemId());
227
				if (i == null){
228
					continue;
229
				}
230
				cf.setDisplayName(getValidName(i.getBrand())+" "+getValidName(i.getModelName())+" "+getValidName(i.getModelNumber())+" "+getValidName(i.getColor()).replaceAll("\\s+", " "));
231
				cf.setItemType(i.getType());
21985 kshitij.so 232
			}
22275 ashik.ali 233
			Map<Integer, Float> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds, loginDetails.getFofoId());
234
			LOGGER.info("mopPriceMap {}", mopPriceMap);
235
			model.addAttribute("cartObj", cartItems);
236
			model.addAttribute("mopPriceMap", mopPriceMap);
237
			return "order-index";
238
		}catch (Exception e) {
239
			LOGGER.error("Unable to Prepare cart to place order...", e);
240
			return "error";
21985 kshitij.so 241
		}
242
	}
243
 
244
	private String getValidName(String name){
245
		return name!=null?name:"";
246
	}
21612 ashik.ali 247
 
22244 ashik.ali 248
	@RequestMapping(value = "/insurancePrices", method = RequestMethod.GET)
249
	public ResponseEntity<?> getInsurancePrices(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PRICE) float price){
250
		LOGGER.info("Request received at url : {}", request.getRequestURI());
251
		try{
252
			Set<Float> prices = new HashSet<>();
253
			prices.add(price);
254
			return responseSender.ok(pricingService.getInsurancePrices(prices, ProfitMandiConstants.GADGET_COPS));
255
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
256
			return responseSender.notFound(profitMandiBusinessException);
257
		}
258
	}
259
 
260
 
21985 kshitij.so 261
	@RequestMapping(value = "/get-order", method = RequestMethod.GET)
22244 ashik.ali 262
	public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws ProfitMandiBusinessException, Exception{
22139 amit.gupta 263
		LoginDetails fofoDetails;
21985 kshitij.so 264
		try {
22069 ashik.ali 265
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 266
		} catch (ProfitMandiBusinessException e) {
267
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
268
			return "response";
269
		}
22277 ashik.ali 270
		try{
271
			FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
272
			List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
273
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
274
			List<PaymentOption> paymentOptions = paymentOptionRepository.selectByOrderId(fofoOrder.getId());
275
			List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByInvoiceNumber(fofoOrder.getInvoiceNumber());
276
			model.addAttribute("fofoOrder", fofoOrder);
277
			model.addAttribute("fofoLineItems", fofoLineItems);
278
			model.addAttribute("customerBillingAddress", getBillingAddress(customerAddress));
279
			model.addAttribute("customerBillingAddressObj", customerAddress);
280
			model.addAttribute("paymentOptions", paymentOptions);
281
			model.addAttribute("insurancePolicies", insurancePolicies);
282
			return "order-details";
283
		}catch (Exception e) {
284
			LOGGER.error("Unable to get Order details...", e);
285
			return "error";
286
		}
21985 kshitij.so 287
	}
22244 ashik.ali 288
 
289
 
290
	@RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
291
	public String getSaleDetails(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws ProfitMandiBusinessException, Exception{
292
		LoginDetails fofoDetails;
293
		try {
294
			fofoDetails = cookiesProcessor.getCookiesObject(request);
295
		} catch (ProfitMandiBusinessException e) {
296
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
297
			return "response";
298
		}
22279 ashik.ali 299
		try{
300
			FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
301
			List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
302
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
303
			List<PaymentOption> paymentOptions = paymentOptionRepository.selectByOrderId(fofoOrder.getId());
304
			List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByInvoiceNumber(fofoOrder.getInvoiceNumber());
305
			model.addAttribute("fofoOrder", fofoOrder);
306
			model.addAttribute("fofoLineItems", fofoLineItems);
307
			model.addAttribute("customerBillingAddress", getBillingAddress(customerAddress));
308
			model.addAttribute("customerBillingAddressObj", customerAddress);
309
			model.addAttribute("paymentOptions", paymentOptions);
310
			model.addAttribute("insurancePolicies", insurancePolicies);
311
			return "sale-details";
312
		}catch (Exception e) {
313
			LOGGER.error("Unble to fetch sale details... ", e);
314
			return "error";
315
		}
22244 ashik.ali 316
	}
317
 
318
 
21985 kshitij.so 319
 
22098 kshitij.so 320
	private String getBillingAddress(CustomerAddress customerAddress) {
321
		String address = "";
322
		if ((customerAddress.getLine1() != null) && (!customerAddress.getLine1().isEmpty())) {
323
			address = address + customerAddress.getLine1();
324
			address = address + ", ";
325
		}
326
 
327
		if ((customerAddress.getLine2() != null) && (!customerAddress.getLine2().isEmpty())) {
328
			address = address + customerAddress.getLine2();
329
			address = address + ", ";
330
		}
331
 
332
		if ((customerAddress.getLandmark() != null) && (!customerAddress.getLandmark().isEmpty())) {
333
			address = address + customerAddress.getLandmark();
334
			address = address + ", ";
335
		}
336
 
337
		if ((customerAddress.getCity() != null) && (!customerAddress.getCity().isEmpty())) {
338
			address = address + customerAddress.getCity();
339
			address = address + ", ";
340
		}
341
 
342
		if ((customerAddress.getState() != null) && (!customerAddress.getState().isEmpty())) {
343
			address = address + customerAddress.getState();
344
		}
345
 
346
		if ((customerAddress.getPinCode() != null) && (!customerAddress.getPinCode().isEmpty())) {
347
			address = address + "- " + customerAddress.getPinCode();
348
		}
349
 
350
		return address;
351
	}
352
 
21985 kshitij.so 353
	@RequestMapping(value = "/create-order", method = RequestMethod.POST)
354
	public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest, Model model)  throws Throwable{
22064 ashik.ali 355
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
22139 amit.gupta 356
		LoginDetails fofoDetails;
21985 kshitij.so 357
		try {
22069 ashik.ali 358
			fofoDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 359
		} catch (ProfitMandiBusinessException e) {
360
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
361
			return "response";
362
		}
22280 ashik.ali 363
		Set<Integer> itemIds = new HashSet<>();
364
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); //this is for error
365
		Map<Integer, CustomFofoLineItem> customFofoLineItemMap = new HashMap<>();
366
		Map<Integer, Float> lineItemPrice = new HashMap<>(); //this is for pricing error
367
		float totalAmount = 0;
368
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
369
			itemIds.add(customFofoLineItem.getItemId());
370
			if(!customFofoLineItem.getSerialNumberDetails().isEmpty() && customFofoLineItem.getQuantity() != customFofoLineItem.getSerialNumberDetails().size()){
371
				itemIdQuantity.put(customFofoLineItem.getItemId(), customFofoLineItem.getQuantity());
372
			}
373
			if(!(customFofoLineItem.getSellingPrice() > 0)){
374
				lineItemPrice.put(customFofoLineItem.getItemId(), customFofoLineItem.getSellingPrice());
375
			}else{
376
				totalAmount = totalAmount + customFofoLineItem.getSellingPrice() * customFofoLineItem.getQuantity();
377
				for(SerialNumberDetail serialNumberDetail : customFofoLineItem.getSerialNumberDetails()){
378
					if(serialNumberDetail.isInsurance() && serialNumberDetail.getAmount() > 0){
379
						totalAmount = totalAmount + serialNumberDetail.getAmount();
22217 ashik.ali 380
					}
381
				}
21680 ashik.ali 382
			}
22280 ashik.ali 383
			customFofoLineItemMap.put(customFofoLineItem.getItemId(), customFofoLineItem);
384
		}
385
		if(!itemIdQuantity.isEmpty()){
386
			// if item quantity does not match with given serialnumbers size
387
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
388
			throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "");
389
			//return "error";
390
		}
391
		try{
392
			this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
393
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
394
			LOGGER.error("Error occured while validating payment options : ", profitMandiBusinessException);
395
			throw profitMandiBusinessException;
396
		}
397
		if(!lineItemPrice.isEmpty()){
398
			// given fofo line item price must be greater than zero
399
			LOGGER.error("requested itemId's selling price must greater than 0");
400
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "");
401
		}
402
 
403
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.selectByFofoItemIds(fofoDetails.getFofoId(), itemIds);
404
		if(itemIds.size() != currentInventorySnapshots.size()){
405
			// error
406
		}
407
		List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); //this is for error
408
		LOGGER.info("currentInventorySnapshots "+currentInventorySnapshots);
409
		for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
410
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(currentInventorySnapshot.getId().getItemId());
411
			LOGGER.info("customFofoLineItem "+customFofoLineItem);
412
			if(customFofoLineItem.getQuantity() > currentInventorySnapshot.getAvailability()){
413
				ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
414
				itemIdQuantityAvailability.setItemId(customFofoLineItem.getItemId());
415
				Quantity quantity = new Quantity();
416
				quantity.setAvailable(currentInventorySnapshot.getAvailability());
417
				quantity.setRequested(customFofoLineItem.getQuantity());
418
				itemIdQuantityAvailability.setQuantity(quantity);
419
				itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
21896 ashik.ali 420
			}
22280 ashik.ali 421
 
422
		}
423
 
424
 
425
 
426
		if(!itemIdQuantityAvailabilities.isEmpty()){
427
			// itemIdQuantity request is not valid
428
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
429
			throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities, "");
430
		}
431
 
432
 
433
 
434
		//		Set<Integer> invalidItemIdSerialNumbers = new HashSet<>();
435
		//		Map<Integer, Set<String>> itemIdSerialNumbers = new HashMap<>();
436
		//		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), itemIds); //change it
437
		//		
438
		//		Map<Integer, Float> itemIdPriceDropAmount = new HashMap<>();
439
		//		
440
		//		for(InventoryItem inventoryItem : inventoryItems){
441
		//			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(inventoryItem.getItemId());
442
		//			if(customFofoLineItem.getSerialNumbers().isEmpty()){
443
		//				if(!(inventoryItem.getSerialNumber() == null && inventoryItem.getSerialNumber().equals(""))){
444
		//					invalidItemIdSerialNumbers.add(inventoryItem.getItemId());
445
		//				}
446
		//			}
447
		//			if(!customFofoLineItem.getSerialNumbers().isEmpty()){
448
		//				if(!customFofoLineItem.getSerialNumbers().contains(inventoryItem.getSerialNumber())){
449
		//					if(!itemIdSerialNumbers.containsKey(customFofoLineItem.getItemId())){
450
		//						Set<String> serialNumbers = new HashSet<>();
451
		//						serialNumbers.add(inventoryItem.getSerialNumber());
452
		//						itemIdSerialNumbers.put(customFofoLineItem.getItemId(), serialNumbers);
453
		//					}else{
454
		//						itemIdSerialNumbers.get(customFofoLineItem.getItemId()).add(inventoryItem.getSerialNumber());
455
		//				}
456
		//			}
457
		//			itemIdPriceDropAmount.put(inventoryItem.getItemId(), inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount());
458
		//		}
459
 
460
		Map<Integer, Item>  itemMap = new HashMap<Integer, Item>();
461
		List<Item> items = itemRepository.selectByIds(itemIds);
462
		for (Item i : items){
463
			itemMap.put(i.getId(), i);
464
		}
465
 
466
		Set<Integer> nonSerializedItemIds = new HashSet<>();
467
		Set<String> serialNumbers = new HashSet<>();
468
		Map<String, Float> insuranceSerialNumberItemPrice = new HashMap<>();
469
		Map<String, Float> insuranceSerialNumberSaleAmount = new HashMap<>();
470
		Map<String, String> serialNumberModelName = new HashMap<>();
471
		Map<String, String> serialNumberBrand = new HashMap<>();
472
		Collection<CustomFofoLineItem> lineItemsValues = customFofoLineItemMap.values();
473
		for (CustomFofoLineItem cli : lineItemsValues){
474
 
475
			Item item = itemMap.get(cli.getItemId());
476
			if (item.getType().equals(ItemType.SERIALIZED)){
477
				for (SerialNumberDetail serialNumberDetail : cli.getSerialNumberDetails()){
478
					serialNumbers.add(serialNumberDetail.getSerialNumber());
479
					if(serialNumberDetail.isInsurance()){
480
						insuranceSerialNumberItemPrice.put(serialNumberDetail.getSerialNumber(), cli.getSellingPrice());
481
						insuranceSerialNumberSaleAmount.put(serialNumberDetail.getSerialNumber(), serialNumberDetail.getAmount());
482
						serialNumberModelName.put(serialNumberDetail.getSerialNumber(), item.getModelName());
483
						serialNumberBrand.put(serialNumberDetail.getSerialNumber(), item.getBrand());
484
					}
21680 ashik.ali 485
				}
486
			}
22280 ashik.ali 487
			else{
488
				nonSerializedItemIds.add(cli.getItemId());
22244 ashik.ali 489
			}
22280 ashik.ali 490
 
491
		}
492
 
493
 
494
		Map<Integer, List<InventoryItem>> serializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
495
		Map<Integer, List<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<Integer, List<InventoryItem>>();
496
		Map<Integer, List<Float>> itemIdPriceDropAmount = new HashMap<>();
497
 
498
		if (!serialNumbers.isEmpty()){
499
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoDetails.getFofoId(), serialNumbers);
500
			LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
501
			for (InventoryItem it : serializedInventoryItems){
502
				if (it.getGoodQuantity() == 1){
503
					if (serializedInventoryItemMap.containsKey(it.getItemId())){
504
						serializedInventoryItemMap.get(it.getItemId()).add(it);
505
						itemIdPriceDropAmount.get(it.getItemId()).
506
						add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
21985 kshitij.so 507
					}
22280 ashik.ali 508
					else{
509
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
510
						tmp.add(it);
511
						serializedInventoryItemMap.put(it.getItemId(), tmp);
512
						ArrayList<Float> priceDropAmouts = new ArrayList<>();
513
						priceDropAmouts.add(it.getUnitPrice() - (it.getPriceDropAmount()==null?0:it.getPriceDropAmount()));
514
						itemIdPriceDropAmount.put(it.getItemId(), priceDropAmouts);
515
					}
21985 kshitij.so 516
				}
517
			}
22280 ashik.ali 518
		}
519
 
520
		if (!nonSerializedItemIds.isEmpty()){
521
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoDetails.getFofoId(), nonSerializedItemIds);
522
			for (InventoryItem it : nonSerializedInventoryItems){
523
				if (it.getGoodQuantity() > 0){
524
					if (nonSerializedInventoryItemMap.containsKey(it.getItemId())){
525
						nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
22244 ashik.ali 526
					}
22280 ashik.ali 527
					else{
528
						ArrayList<InventoryItem> tmp = new ArrayList<InventoryItem>();
529
						tmp.add(it);
530
						nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
531
					}
21985 kshitij.so 532
				}
533
			}
22280 ashik.ali 534
		}
535
 
536
		List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
537
		List<Integer> itemIdSerialNumbers = new ArrayList<Integer>();
538
 
539
		for (Item i : items){
540
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
541
			if (i.getType().equals(ItemType.SERIALIZED)){
542
				if (customFofoLineItem ==null || customFofoLineItem.getSerialNumberDetails().isEmpty()){
543
					invalidItemIdSerialNumbers.add(i.getId());
21985 kshitij.so 544
				}
545
			}
22280 ashik.ali 546
			else{
547
				if (customFofoLineItem == null || !customFofoLineItem.getSerialNumberDetails().isEmpty()){
548
					itemIdSerialNumbers.add(i.getId());
21985 kshitij.so 549
				}
22280 ashik.ali 550
			}
551
		}
552
 
553
		if(!invalidItemIdSerialNumbers.isEmpty()){
554
			LOGGER.error("Invalid itemId's serialNumbers {}", invalidItemIdSerialNumbers);
555
			// itemId's are serialized you are saying these are not serialized
556
			throw new ProfitMandiBusinessException("invalidItemIdSerialNumbers", invalidItemIdSerialNumbers, "");
557
		}
558
 
559
		if(!itemIdSerialNumbers.isEmpty()){
560
			LOGGER.error("Invalid itemId's serialNumbers {}", itemIdSerialNumbers);
561
			// itemId's are non serialized you are saying these are serialized
562
			throw new ProfitMandiBusinessException("itemIdSerialNumbers", itemIdSerialNumbers, "");
563
		}
564
 
565
		if(items.size() != itemIds.size()){
566
			LOGGER.error("Requested ItemIds not found in catalog");
567
			// invalid itemIds 
568
			throw new ProfitMandiBusinessException("invalidItemIds", "", "");
569
		}
570
 
571
		Map<Integer, List<InventoryItem>> inventoryItemsToBill = new HashMap<Integer,List<InventoryItem>>();
572
		Map<Integer, Integer> inventoryItemQuantityUsed = new HashMap<>(); //to keep track of inventoryitem quanity used for scan records insertion
573
 
574
		LOGGER.info("itemMap keys {}", itemMap.keySet());
575
		//Lets reduce quantity and decide what inventory items to use.
576
		for (Item i : items){
577
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(i.getId());
578
			if (i.getType().equals(ItemType.SERIALIZED)){
579
				//TODO:handle null
580
				if (serializedInventoryItemMap.get(i.getId()) == null || customFofoLineItem.getSerialNumberDetails().size() != serializedInventoryItemMap.get(i.getId()).size()){
581
					//not enough serial numbers
582
					//LOGGER.info("serialNumbers {}", serialNumbers);
583
					LOGGER.info("serializedInventoryItemMap {}", serializedInventoryItemMap);
584
					LOGGER.info("itemId {}", i.getId());
585
					LOGGER.error("not enough serial numbers");
586
					throw new ProfitMandiBusinessException("notEnoughSerialNumbers", "", "");
21985 kshitij.so 587
				}
22280 ashik.ali 588
				List<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(i.getId());
589
				for (InventoryItem it : inventoryItemsSerializedserialized){
590
					it.setGoodQuantity(0);
591
					inventoryItemQuantityUsed.put(it.getId(), 1);
592
				}
593
				inventoryItemsToBill.put(i.getId(), inventoryItemsSerializedserialized);
21985 kshitij.so 594
			}
22280 ashik.ali 595
			else{
596
				List<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(i.getId());
597
				int quantityToBill = customFofoLineItem.getQuantity();
598
				int totalLeft = quantityToBill;
599
				List<InventoryItem> inventoryItemsNonSerializedUsed = new ArrayList<InventoryItem>();
600
				if (inventoryItemsNonSerialized!=null){
601
					for (InventoryItem it : inventoryItemsNonSerialized){
602
						if (totalLeft > 0){
603
							int toUse = Math.min(totalLeft, it.getGoodQuantity());
604
							inventoryItemQuantityUsed.put(it.getId(), toUse);
605
							it.setGoodQuantity(it.getGoodQuantity()  - toUse);
606
							totalLeft = totalLeft - toUse;
607
							inventoryItemsNonSerializedUsed.add(it);
22244 ashik.ali 608
						}
609
					}
21896 ashik.ali 610
				}
22280 ashik.ali 611
 
612
				if (totalLeft > 0){
613
					//not enough quanity for non-serialized
614
					System.out.println("not enough quanity for non-serialized");
615
					throw new ProfitMandiBusinessException("notEnoughQuantityForNonSerialized", "", "");
616
				}
617
				inventoryItemsToBill.put(i.getId(), inventoryItemsNonSerializedUsed);
21896 ashik.ali 618
			}
22280 ashik.ali 619
		}
620
 
621
		// mop price validation
622
		Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
623
		Map<Integer, Float> itemIdMopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds, fofoDetails.getFofoId());
624
		for(Map.Entry<Integer, Float> entry : itemIdMopPriceMap.entrySet()){
625
			CustomFofoLineItem customFofoLineItem = customFofoLineItemMap.get(entry.getKey());
626
			if(entry.getValue() < Float.MAX_VALUE && customFofoLineItem.getSellingPrice() < entry.getValue()){
627
				invalidMopItemIdPriceMap.put(entry.getKey(), customFofoLineItem.getSellingPrice());
628
			}
629
		}
630
 
631
		if(!invalidMopItemIdPriceMap.isEmpty()){
632
			LOGGER.error("Invalid itemIds selling prices{} should be greater than mop prices {}", invalidMopItemIdPriceMap, itemIdMopPriceMap);
633
			throw new ProfitMandiBusinessException("invalidMopItemIdPrice", invalidMopItemIdPriceMap, "");
634
		}
635
 
636
		InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
637
		try{
638
			invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoDetails.getFofoId());
639
			invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
640
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
641
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
642
			invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
643
			invoiceNumberGenerationSequence.setFofoId(fofoDetails.getFofoId());
644
			invoiceNumberGenerationSequence.setPrefix("INVOICE");
645
			invoiceNumberGenerationSequence.setSequence(1);
646
			invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
647
		}
648
 
649
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
650
 
651
		if(!StringUtils.isValidEmailAddress(customCustomer.getEmailId())){
652
			LOGGER.error("invalid customer emailId {} ", customCustomer.getEmailId());
653
			throw new ProfitMandiBusinessException(ProfitMandiConstants.EMAIL_ID, customCustomer.getEmailId(), "");
654
		}
655
 
656
		if(!StringUtils.isValidMobile(customCustomer.getMobileNumber())){
657
			LOGGER.error("invalid customer mobileNumber {} ", customCustomer.getMobileNumber());
658
			throw new ProfitMandiBusinessException(ProfitMandiConstants.MOBILE_NUMBER, customCustomer.getMobileNumber(), "");
659
		}
660
 
661
		boolean insurance = false;
662
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
663
			for(SerialNumberDetail serialNumberDetail : customFofoLineItem.getSerialNumberDetails()){
664
				if(serialNumberDetail.getAmount() > 0){
665
					insurance = true;
666
					break;
22217 ashik.ali 667
				}
668
			}
22280 ashik.ali 669
		}
670
		LOGGER.info("insurance [{}] processing ....", insurance);
671
 
672
		LocalDate customerDateOfBirth = null;
673
		if(insurance){
22244 ashik.ali 674
			try{
22280 ashik.ali 675
				customerDateOfBirth = StringUtils.toDate(createOrderRequest.getCustomerDateOfBirth());
676
			}catch(DateTimeException dateTimeException){
677
				LOGGER.error("Unable to parse dateOfBirth", dateTimeException);
678
				throw new ProfitMandiBusinessException("dateOfBirth", createOrderRequest.getCustomerDateOfBirth(), "");
22244 ashik.ali 679
			}
22280 ashik.ali 680
		}
681
 
682
		Customer customer = null;
683
		try{
684
			customer = customerRepository.selectByMobileNumber(customCustomer.getMobileNumber());
685
		}catch(ProfitMandiBusinessException profitMandiBusinessException){
686
			LOGGER.error("Error : ", profitMandiBusinessException);
687
			customer = new Customer();
688
			customer.setFirstName(customCustomer.getFirstName());
689
			customer.setLastName(customCustomer.getLastName());
690
			customer.setEmailId(customCustomer.getEmailId());
691
			customer.setMobileNumber(customCustomer.getMobileNumber());
692
			customerRepository.persist(customer);
693
		}
694
		//TODO:Check if createOrderRequest contains addressId
695
		CustomerAddress customerAddress = this.createCustomerAddress(customCustomer.getAddress());
696
		customerAddress.setCustomerId(customer.getId());
697
		customerAddressRepository.persist(customerAddress);
698
 
699
		FofoOrder fofoOrder = new FofoOrder();
700
		fofoOrder.setCustomerId(customer.getId());
701
		fofoOrder.setFofoId(fofoDetails.getFofoId());
702
		fofoOrder.setInvoiceNumber(invoiceNumberGenerationSequence.getPrefix() + invoiceNumberGenerationSequence.getSequence());
703
		fofoOrder.setTotalAmount(totalAmount);
704
		fofoOrder.setCustomerAddressId(customerAddress.getId());
705
		fofoOrderRepository.persist(fofoOrder);
706
 
707
		for(CustomPaymentOption customPaymentOption : createOrderRequest.getPaymentOptions()){
708
			PaymentOption paymentOption = new PaymentOption();
709
			paymentOption.setOrderId(fofoOrder.getId());
710
			paymentOption.setAmount(customPaymentOption.getAmount());
711
			paymentOption.setType(customPaymentOption.getType());
712
			paymentOptionRepository.persist(paymentOption);
713
		}
714
 
715
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoDetails.getFofoId()));
716
		Map<String, GstRate> gstRateMap = null;
717
		if(retailerAddress.getState().equals(customerAddress.getState())){
718
			gstRateMap = Utils.getGstRates(retailerAddress.getState());
719
		}else{
720
			LOGGER.info("inter gstRate = true");
721
			gstRateMap = Utils.getInterGstRates();
722
		}
723
		LOGGER.info("gstRateMap {}", gstRateMap);
724
		for(CustomFofoLineItem customFofoLineItem : createOrderRequest.getFofoLineItems()){
725
			FofoLineItem fofoLineItem = new FofoLineItem();
726
			fofoLineItem.setItemId(customFofoLineItem.getItemId());
727
			fofoLineItem.setQuantity(customFofoLineItem.getQuantity());
728
			fofoLineItem.setSellingPrice(customFofoLineItem.getSellingPrice());
729
			fofoLineItem.setOrderId(fofoOrder.getId());
730
			fofoLineItem.setDp(customFofoLineItem.getSellingPrice());
731
			Item item = itemMap.get(customFofoLineItem.getItemId());
732
			GstRate gstRate = gstRateMap.get(item.getHsnCode());
733
			fofoLineItem.setIgstRate(gstRate.getIgstRate());
734
			fofoLineItem.setCgstRate(gstRate.getCgstRate());
735
			fofoLineItem.setSgstRate(gstRate.getSgstRate());
736
			fofoLineItem.setHsnCode(gstRate.getHsnCode());
737
			List<Float> priceDropAmounts = itemIdPriceDropAmount.get(customFofoLineItem.getItemId());
738
			float cost = 0;
739
			if (priceDropAmounts!=null){
740
				for (Float pda : priceDropAmounts){
741
					cost = cost + pda;
742
				}
22217 ashik.ali 743
			}
22280 ashik.ali 744
			else{
745
				cost = customFofoLineItem.getSellingPrice()* customFofoLineItem.getQuantity();
22244 ashik.ali 746
			}
22280 ashik.ali 747
			fofoLineItem.setCost(cost);
748
			fofoLineItem.setBrand(item.getBrand());
749
			fofoLineItem.setModelName(item.getModelName());
750
			fofoLineItem.setModelNumber(item.getModelNumber());
751
			fofoLineItem.setColor(item.getColor());
752
			fofoLineItemRepository.persist(fofoLineItem);
753
			LOGGER.info("\n\n");
754
			if(!customFofoLineItem.getSerialNumberDetails().isEmpty()){
22244 ashik.ali 755
				for(SerialNumberDetail serialNumberDetail : customFofoLineItem.getSerialNumberDetails()){
22280 ashik.ali 756
					FofoLineItemSerialNumber fofoLineItemSerialNumber = new FofoLineItemSerialNumber();
757
					fofoLineItemSerialNumber.setFofoLineItemId(fofoLineItem.getId());
758
					fofoLineItemSerialNumber.setSerialNumber(serialNumberDetail.getSerialNumber());
759
					fofoLineItemSerialNumberRepository.persist(fofoLineItemSerialNumber);
22244 ashik.ali 760
				}
761
			}
22280 ashik.ali 762
 
763
			for(CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots){
764
				FofoItemId fofoItemId = new FofoItemId();
765
				fofoItemId.setFofoId(fofoDetails.getFofoId());
766
				fofoItemId.setItemId(fofoLineItem.getItemId());
767
				if(currentInventorySnapshot.getId().equals(fofoItemId)){
768
					currentInventorySnapshotRepository.updateAvailabilityByFofoItemId(fofoItemId, currentInventorySnapshot.getAvailability() - customFofoLineItem.getQuantity());
22217 ashik.ali 769
				}
770
			}
22280 ashik.ali 771
			List<InventoryItem> inventoryItems = inventoryItemsToBill.get(fofoLineItem.getItemId());
772
			for(InventoryItem inventoryItem : inventoryItems){
773
				inventoryItem.setLastScanType(ScanType.SALE);
774
				inventoryItemRepository.persist(inventoryItem);
775
				ScanRecord scanRecord = new ScanRecord();
776
				scanRecord.setInventoryItemId(inventoryItem.getId());
777
				scanRecord.setFofoId(fofoDetails.getFofoId());
778
				//correct this
779
				scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
780
				scanRecord.setType(ScanType.SALE);
781
				scanRecordRepository.persist(scanRecord);
782
			}
783
		}
784
 
785
		// insurance calculation is insurance flag is enabled
786
		if(!insuranceSerialNumberItemPrice.isEmpty()){
787
			LOGGER.info("Processing for insurence for serialNumbers");
788
			Map<Float, GadgetCopsInsuranceCalc> insurancePricesMap = pricingService.getInsurancePrices(new HashSet<>(insuranceSerialNumberItemPrice.values()), ProfitMandiConstants.GADGET_COPS);
789
			InsuranceProvider insuranceProvider = insuranceProviderRepository.selectByName(ProfitMandiConstants.GADGET_COPS);
22244 ashik.ali 790
 
22280 ashik.ali 791
 
792
			Map<Float, Float> invalidInsurancePurchaseSaleAmount = new HashMap<>();
793
			Map<Float, Float> invalidInsuranceSalePurchaseAmount = new HashMap<>();
794
			for(Map.Entry<String, Float> entry : insuranceSerialNumberItemPrice.entrySet()){
795
				if(insuranceSerialNumberSaleAmount.get(entry.getKey()) < insurancePricesMap.get(entry.getValue()).getDealerPrice()){
796
					invalidInsurancePurchaseSaleAmount.put(insurancePricesMap.get(entry.getValue()).getDealerPrice(), insuranceSerialNumberSaleAmount.get(entry.getKey()));
22244 ashik.ali 797
				}
22280 ashik.ali 798
 
799
				if(insuranceSerialNumberSaleAmount.get(entry.getKey()) > insurancePricesMap.get(entry.getValue()).getSellingPrice()){
800
					invalidInsuranceSalePurchaseAmount.put(insuranceSerialNumberSaleAmount.get(entry.getKey()), insurancePricesMap.get(entry.getValue()).getDealerPrice());
22244 ashik.ali 801
				}
802
			}
803
 
22280 ashik.ali 804
			// insurance sale amount can not be lesser than insurance purchase amount
805
			if(!invalidInsurancePurchaseSaleAmount.isEmpty()){
806
				LOGGER.error("Invalid Insurance prices [{}], insurance sale amount can not be lesser than insurance purchase amount", invalidInsurancePurchaseSaleAmount);
807
				return "error";
808
			}
809
 
810
			if(!invalidInsuranceSalePurchaseAmount.isEmpty()){
811
				LOGGER.error("Invalid Insurance prices [{}], insurance sale amount can not be greater than than insurance max amount", invalidInsuranceSalePurchaseAmount);
812
				return "error";
813
			}
814
 
815
 
816
			for(Map.Entry<String, Float> entry : insuranceSerialNumberItemPrice.entrySet()){
817
				PolicyNumberGenerationSequence policyNumberGenerationSequence = null;
818
				try{
819
					policyNumberGenerationSequence = policyNumberGenerationSequenceRepository.select();
820
					policyNumberGenerationSequence.setSequence(policyNumberGenerationSequence.getSequence() + 1);
821
					policyNumberGenerationSequenceRepository.persist(policyNumberGenerationSequence);
822
				}catch(ProfitMandiBusinessException profitMandiBusinessException){
823
					policyNumberGenerationSequence = new PolicyNumberGenerationSequence();
824
					policyNumberGenerationSequence.setSequence(1);
825
					policyNumberGenerationSequenceRepository.persist(policyNumberGenerationSequence);
22244 ashik.ali 826
				}
827
 
22280 ashik.ali 828
				InsurancePolicy insurancePolicy = new InsurancePolicy();
829
				insurancePolicy.setInvoiceNumber(invoiceNumberGenerationSequence.getPrefix() + invoiceNumberGenerationSequence.getSequence());
830
				insurancePolicy.setRetailerId(fofoDetails.getFofoId());
831
				insurancePolicy.setPurchaseAmount(insurancePricesMap.get(entry.getValue()).getDealerPrice());
832
				insurancePolicy.setSaleAmount(insuranceSerialNumberSaleAmount.get(entry.getKey()));
833
				insurancePolicy.setSellingPrice(entry.getValue());
834
				insurancePolicy.setSerialNumber(entry.getKey());
835
				insurancePolicy.setModelName(serialNumberModelName.get(entry.getKey()));
836
				insurancePolicy.setBrand(serialNumberBrand.get(entry.getKey()));
837
				insurancePolicy.setPolicyNumber(StringUtils.generatePolicyNumber(ProfitMandiConstants.POLICY_NUMBER_PREFIX, policyNumberGenerationSequence.getSequence()));
838
				insurancePolicy.setProviderId(insuranceProvider.getId());
839
				insurancePolicy.setCustomerFirstName(customer.getFirstName());
840
				insurancePolicy.setCustomerLastName(customer.getLastName());
841
				insurancePolicy.setCustomerMobileNumber(customer.getMobileNumber());
842
				insurancePolicy.setCustomerEmailId(customer.getEmailId());
843
				insurancePolicy.setCustomerDateOfBirth(customerDateOfBirth);
844
				insurancePolicy.setCustomerAddress1(customerAddress.getLine1());
845
				insurancePolicy.setCustomerAddress2(customerAddress.getLine2());
846
				insurancePolicy.setCustomerCity(customerAddress.getCity());
847
				insurancePolicy.setCustomerPinCode(customerAddress.getPinCode());
848
				insurancePolicy.setCustomerState(customerAddress.getState());
22244 ashik.ali 849
 
22280 ashik.ali 850
				GadgetCopsInsuranceModel gadgetCopsInsuranceModel = new GadgetCopsInsuranceModel();
851
				gadgetCopsInsuranceModel.setBrand(serialNumberBrand.get(entry.getKey()));
852
				gadgetCopsInsuranceModel.setModelName(serialNumberModelName.get(entry.getKey()));
853
				gadgetCopsInsuranceModel.setSerialNumber(entry.getKey());
854
				gadgetCopsInsuranceModel.setCustomerFirstName(customer.getFirstName());
855
				gadgetCopsInsuranceModel.setCustomerLastName(customer.getLastName());
856
				gadgetCopsInsuranceModel.setCustomerDateOfBirth(customerDateOfBirth);
857
				gadgetCopsInsuranceModel.setCustomerMobileNumber(customer.getMobileNumber());
858
				gadgetCopsInsuranceModel.setCustomerEmailId(customer.getEmailId());
859
				gadgetCopsInsuranceModel.setCustomerAddress1(customerAddress.getLine1());
860
				gadgetCopsInsuranceModel.setCustomerAddress2(customerAddress.getLine2());
861
				gadgetCopsInsuranceModel.setCustomerCity(customerAddress.getCity());
862
				gadgetCopsInsuranceModel.setCustomerPinCode(customerAddress.getPinCode());
863
				gadgetCopsInsuranceModel.setCustomerState(customerAddress.getState());
864
				gadgetCopsInsuranceModel.setPrice(insurancePolicy.getSellingPrice());
865
				gadgetCopsInsuranceModel.setInvoiceNumber(insurancePolicy.getInvoiceNumber());
866
				gadgetCopsInsuranceModel.setPolicyNumber(insurancePolicy.getPolicyNumber());
22244 ashik.ali 867
 
22280 ashik.ali 868
				try{
869
					InsuranceUtils.submitToGadgetCops(gadgetCopsInsuranceModel);
870
					insurancePolicy.setPosted(true);
871
				}catch (ProfitMandiBusinessException profitMandiBusinessException) {
872
					LOGGER.info("Unable to submit insurance policy details to {}", insuranceProvider.getName(), profitMandiBusinessException);
22244 ashik.ali 873
				}
22280 ashik.ali 874
				insurancePolicyRepository.persist(insurancePolicy);
22244 ashik.ali 875
			}
22217 ashik.ali 876
		}
22280 ashik.ali 877
		LOGGER.info("Order has been created successfully...");
878
		return "redirect:/get-order/?orderId="+fofoOrder.getId();
21612 ashik.ali 879
	}
21985 kshitij.so 880
 
21711 ashik.ali 881
	private CustomerAddress createCustomerAddress(CustomAddress customAddress){
882
		CustomerAddress customerAddress = new CustomerAddress();
883
		customerAddress.setName(customAddress.getName());
884
		customerAddress.setLine1(customAddress.getLine1());
885
		customerAddress.setLine2(customAddress.getLine2());
886
		customerAddress.setLandmark(customAddress.getLandmark());
887
		customerAddress.setCity(customAddress.getCity());
888
		customerAddress.setPinCode(customAddress.getPinCode());
889
		customerAddress.setState(customAddress.getState());
890
		customerAddress.setCountry(customAddress.getCountry());
891
		customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
892
		return customerAddress;
21680 ashik.ali 893
	}
21985 kshitij.so 894
 
21689 ashik.ali 895
	private CustomAddress createCustomAddress(Address address){
896
		CustomAddress customAddress = new CustomAddress();
897
		customAddress.setName(address.getName());
898
		customAddress.setLine1(address.getLine1());
899
		customAddress.setLine2(address.getLine2());
900
		customAddress.setLandmark(address.getLandmark());
901
		customAddress.setCity(address.getCity());
902
		customAddress.setPinCode(address.getPinCode());
903
		customAddress.setState(address.getState());
904
		customAddress.setCountry(address.getCountry());
905
		customAddress.setPhoneNumber(address.getPhoneNumber());
906
		return customAddress;
21680 ashik.ali 907
	}
21985 kshitij.so 908
 
21711 ashik.ali 909
	private CustomAddress createCustomAddress(CustomerAddress customerAddress){
910
		CustomAddress customAddress = new CustomAddress();
911
		customAddress.setName(customerAddress.getName());
912
		customAddress.setLine1(customerAddress.getLine1());
913
		customAddress.setLine2(customerAddress.getLine2());
914
		customAddress.setLandmark(customerAddress.getLandmark());
915
		customAddress.setCity(customerAddress.getCity());
916
		customAddress.setPinCode(customerAddress.getPinCode());
917
		customAddress.setState(customerAddress.getState());
918
		customAddress.setCountry(customerAddress.getCountry());
919
		customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
920
		return customAddress;
921
	}
21985 kshitij.so 922
 
21680 ashik.ali 923
	private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount) throws ProfitMandiBusinessException
21612 ashik.ali 924
	{
925
		float calculatedAmount = 0;
926
		Set<String> paymentOptionTypes = new HashSet<>();
927
		for(CustomPaymentOption customPaymentOption : customPaymentOptions){
21680 ashik.ali 928
			if(paymentOptionTypes.contains(customPaymentOption.getType().name())){
21612 ashik.ali 929
				throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_TYPE, customPaymentOption.getType().name(), "");
21680 ashik.ali 930
			}else{
931
				paymentOptionTypes.add(customPaymentOption.getType().name());
932
				calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
21612 ashik.ali 933
			}
934
		}
935
		if(calculatedAmount != totalAmount){
22244 ashik.ali 936
			LOGGER.error("PaymentOptionCalculatedAmount [{}] != TotalAmount [{}]", calculatedAmount, totalAmount);
21612 ashik.ali 937
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT, calculatedAmount, "");
938
		}
939
	}
21985 kshitij.so 940
 
941
 
21689 ashik.ali 942
	@RequestMapping(value = "/generateInvoice")
21896 ashik.ali 943
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws Throwable{
22064 ashik.ali 944
		LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(), ProfitMandiConstants.ORDER_ID, orderId);
22139 amit.gupta 945
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
22217 ashik.ali 946
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
22026 ashik.ali 947
 
21689 ashik.ali 948
		PdfModel pdfModel = new PdfModel();
949
		pdfModel.setAuther("profitmandi");
950
		pdfModel.setTitle("Retailer Invoice");
22217 ashik.ali 951
 
952
		// insurance calculation
953
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByInvoiceNumber(fofoOrder.getInvoiceNumber());
954
		Set<CustomInsurancePolicy> customInsurancePolicies = new HashSet<>();
955
		final float totalInsuranceTaxRate = 18;
956
		for(InsurancePolicy insurancePolicy : insurancePolicies){
957
			float taxableInsurancePrice = insurancePolicy.getSaleAmount() / (1 + totalInsuranceTaxRate / 100);
958
			CustomInsurancePolicy customInsurancePolicy = new CustomInsurancePolicy();
22244 ashik.ali 959
			customInsurancePolicy.setDescription(insurancePolicy.getInsuranceProvider().getName() + " Protection (" + insurancePolicy.getSerialNumber() + ")");
22217 ashik.ali 960
			customInsurancePolicy.setHsnCode("");
961
			customInsurancePolicy.setRate(taxableInsurancePrice);
962
			customInsurancePolicy.setIgstRate(18);
963
			customInsurancePolicy.setIgstAmount(taxableInsurancePrice * 18 /100);
964
			customInsurancePolicy.setCgstRate(18);
965
			customInsurancePolicy.setCgstAmount(taxableInsurancePrice * 9 /100);
966
			customInsurancePolicy.setSgstRate(9);
967
			customInsurancePolicy.setSgstAmount(taxableInsurancePrice * 9 /100);
968
			customInsurancePolicies.add(customInsurancePolicy);
969
		}
970
		pdfModel.setInsurancePolicies(customInsurancePolicies);
21689 ashik.ali 971
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
972
		CustomCustomer customCustomer = new CustomCustomer();
22217 ashik.ali 973
		customCustomer.setFirstName(customer.getFirstName());
974
		customCustomer.setLastName(customer.getLastName());
21689 ashik.ali 975
		customCustomer.setEmailId(customer.getEmailId());
976
		customCustomer.setMobileNumber(customer.getMobileNumber());
21711 ashik.ali 977
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId()); 
21689 ashik.ali 978
		customCustomer.setAddress(this.createCustomAddress(customerAddress));
979
		pdfModel.setCustomer(customCustomer);
980
		pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
22244 ashik.ali 981
		pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
22026 ashik.ali 982
 
21689 ashik.ali 983
		Retailer retailer = retailerRepository.selectById(fofoDetails.getFofoId());
984
		User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
985
		CustomRetailer customRetailer = new CustomRetailer();
986
		customRetailer.setBusinessName(retailer.getName());
987
		customRetailer.setMobileNumber(user.getMobileNumber());
988
		customRetailer.setTinNumber(retailer.getNumber());
989
		Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
990
		customRetailer.setAddress(this.createCustomAddress(retailerAddress));
991
		pdfModel.setRetailer(customRetailer);
992
		List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByOrderId(fofoOrder.getId());
22026 ashik.ali 993
 
21689 ashik.ali 994
		Set<CustomFofoOrderItem> customerFofoOrderItems = new HashSet<>();
995
		for(FofoLineItem fofoLineItem : fofoLineItems){
996
			CustomFofoOrderItem customFofoOrderItem = new CustomFofoOrderItem();
22026 ashik.ali 997
			float totalTaxRate = fofoLineItem.getIgstRate() + fofoLineItem.getSgstRate() + fofoLineItem.getCgstRate();
998
			float taxableSellingPrice = fofoLineItem.getSellingPrice() / (1 + totalTaxRate / 100);
999
 
1000
			customFofoOrderItem.setAmount(fofoLineItem.getQuantity() * taxableSellingPrice);
21689 ashik.ali 1001
			customFofoOrderItem.setDescription(fofoLineItem.getBrand() + " " + fofoLineItem.getModelName() + " " + fofoLineItem.getModelNumber() + " " + fofoLineItem.getColor());
22026 ashik.ali 1002
			customFofoOrderItem.setRate(taxableSellingPrice);
21689 ashik.ali 1003
			customFofoOrderItem.setQuantity(fofoLineItem.getQuantity());
22026 ashik.ali 1004
			float igstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getIgstRate()) / 100;
1005
			float cgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getCgstRate()) / 100;
1006
			float sgstAmount = (customFofoOrderItem.getAmount() * fofoLineItem.getSgstRate()) / 100;
21896 ashik.ali 1007
			customFofoOrderItem.setIgstRate(fofoLineItem.getIgstRate());
22026 ashik.ali 1008
			customFofoOrderItem.setIgstAmount(igstAmount);
1009
			customFofoOrderItem.setCgstRate(fofoLineItem.getCgstRate());
1010
			customFofoOrderItem.setCgstAmount(cgstAmount);
1011
			customFofoOrderItem.setSgstRate(fofoLineItem.getSgstRate());
1012
			customFofoOrderItem.setSgstAmount(sgstAmount);
21896 ashik.ali 1013
			customFofoOrderItem.setHsnCode(fofoLineItem.getHsnCode());
21689 ashik.ali 1014
			customFofoOrderItem.setSerialNumbers(String.join(", ",this.toSerialNumbers(fofoLineItem.getFofoLineItemSerialNumbers())));
1015
			customerFofoOrderItems.add(customFofoOrderItem);
1016
		}
1017
		pdfModel.setOrderItems(customerFofoOrderItems);
1018
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
1019
		PdfUtils.generateAndWrite(pdfModel, byteArrayOutputStream);
1020
		//final MediaType mediaType=MediaType.parseMediaType(profilePhotoModel.getContentType().getValue());
1021
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
22026 ashik.ali 1022
        final HttpHeaders headers=new HttpHeaders();
1023
        headers.setContentType(MediaType.APPLICATION_PDF);
22099 kshitij.so 1024
        headers.set("Content-disposition", "inline; filename=invoice-" + fofoOrder.getInvoiceNumber() + ".pdf");
22026 ashik.ali 1025
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
1026
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
1027
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
1028
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
21689 ashik.ali 1029
	}
21985 kshitij.so 1030
 
21689 ashik.ali 1031
	private Set<String> toSerialNumbers(Set<FofoLineItemSerialNumber> fofoLineItemSerialNumbers){
1032
		Set<String> serialNumbers = new HashSet<>(fofoLineItemSerialNumbers.size());
1033
		for(FofoLineItemSerialNumber fofoLineItemSerialNumber : fofoLineItemSerialNumbers){
1034
			serialNumbers.add(fofoLineItemSerialNumber.getSerialNumber());
1035
		}
1036
		return serialNumbers;
1037
	}
22244 ashik.ali 1038
 
1039
	@RequestMapping(value = "/saleHistory")
1040
	public String saleHistory(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.INVOICE_NUMBER, defaultValue = "") String invoiceNumber, @RequestParam(name = "searchType",defaultValue="") String searchType, Model model) throws Exception{
1041
		LoginDetails loginDetails = null;
1042
		try {
1043
			loginDetails = cookiesProcessor.getCookiesObject(request);
1044
		} catch (ProfitMandiBusinessException e) {
1045
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
1046
			return "response";
1047
		}
1048
 
1049
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
1050
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
1051
		long countItems = 0;
1052
		List<FofoOrder> fofoOrders = new ArrayList<>();
22284 ashik.ali 1053
		if(searchType.equalsIgnoreCase(ProfitMandiConstants.INVOICE_NUMBER) && !invoiceNumber.isEmpty()){
22244 ashik.ali 1054
			try {
1055
				FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndInvoiceNumber(loginDetails.getFofoId(), invoiceNumber);
1056
				fofoOrders.add(fofoOrder);
1057
			} catch (ProfitMandiBusinessException e) {
1058
				LOGGER.info("Sale history not found : ", e);
1059
			}
1060
		}else{
1061
			fofoOrders = fofoOrderRepository.selectByFofoId(loginDetails.getFofoId(),startDateTime, endDateTime, offset, limit);
1062
			countItems = fofoOrderRepository.selectCount(loginDetails.getFofoId(), startDateTime, endDateTime, invoiceNumber, searchType);
1063
		}
1064
 
1065
		model.addAttribute("saleHistories", fofoOrders);
1066
		model.addAttribute("start",offset+1);
1067
		model.addAttribute("size",countItems);
1068
		model.addAttribute("searchType",searchType);
1069
		model.addAttribute(ProfitMandiConstants.START_TIME, startTimeString);
1070
		model.addAttribute(ProfitMandiConstants.END_TIME, endTimeString);
1071
		if (fofoOrders.size() < limit){
1072
			model.addAttribute("end",offset + fofoOrders.size());
1073
		}
1074
		else{
1075
			model.addAttribute("end",offset+limit);
1076
		}
1077
 
1078
		return "sale-history";
1079
	}
22291 ashik.ali 1080
 
1081
 
1082
	@RequestMapping(value = "/getPaginatedSaleHistory")
1083
	public String getSaleHistoryPaginated(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.INVOICE_NUMBER, defaultValue="") String invoiceNumber, @RequestParam(name = "searchType", defaultValue = "") String searchType, Model model) throws Exception{
1084
		LoginDetails loginDetails;
1085
		try {
1086
			loginDetails = cookiesProcessor.getCookiesObject(request);
1087
		} catch (ProfitMandiBusinessException e) {
1088
			model.addAttribute("loginResponse", mvcResponseSender.createResponseString("RTLR_1009", false, "/login"));
1089
			return "response";
1090
		}
1091
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
1092
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
21985 kshitij.so 1093
 
22291 ashik.ali 1094
		List<FofoOrder> saleHistories = fofoOrderRepository.selectByFofoId(loginDetails.getFofoId(), startDateTime, endDateTime, offset, limit);
1095
		model.addAttribute("saleHistories", saleHistories);
1096
		return "sale-history-paginated";
1097
	}
1098
 
21612 ashik.ali 1099
}