Subversion Repositories SmartDukaan

Rev

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