Subversion Repositories SmartDukaan

Rev

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