Subversion Repositories SmartDukaan

Rev

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