Subversion Repositories SmartDukaan

Rev

Rev 23397 | Rev 23427 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 23397 Rev 23418
Line 1... Line 1...
1
package com.spice.profitmandi.service.order;
1
package com.spice.profitmandi.service.order;
2
 
2
 
-
 
3
import java.io.IOException;
-
 
4
import java.net.URISyntaxException;
3
import java.time.DateTimeException;
5
import java.time.DateTimeException;
4
import java.time.LocalDate;
6
import java.time.LocalDate;
5
import java.time.LocalDateTime;
7
import java.time.LocalDateTime;
6
import java.util.ArrayList;
8
import java.util.ArrayList;
7
import java.util.HashMap;
9
import java.util.HashMap;
8
import java.util.HashSet;
10
import java.util.HashSet;
9
import java.util.Iterator;
11
import java.util.Iterator;
10
import java.util.List;
12
import java.util.List;
11
import java.util.Map;
13
import java.util.Map;
-
 
14
import java.util.Random;
12
import java.util.Set;
15
import java.util.Set;
13
import java.util.function.Function;
16
import java.util.function.Function;
14
import java.util.stream.Collectors;
17
import java.util.stream.Collectors;
15
 
18
 
16
import org.json.JSONObject;
19
import org.json.JSONObject;
17
import org.slf4j.Logger;
20
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
21
import org.slf4j.LoggerFactory;
19
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.stereotype.Component;
23
import org.springframework.stereotype.Component;
21
 
24
 
-
 
25
import com.spice.profitmandi.common.ResponseCodeHolder;
22
import com.spice.profitmandi.common.enumuration.SearchType;
26
import com.spice.profitmandi.common.enumuration.SearchType;
23
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
27
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
24
import com.spice.profitmandi.common.model.CartFofo;
28
import com.spice.profitmandi.common.model.CartFofo;
25
import com.spice.profitmandi.common.model.CreateOrderRequest;
29
import com.spice.profitmandi.common.model.CreateOrderRequest;
26
import com.spice.profitmandi.common.model.CustomAddress;
30
import com.spice.profitmandi.common.model.CustomAddress;
Line 43... Line 47...
43
import com.spice.profitmandi.common.util.Utils;
47
import com.spice.profitmandi.common.util.Utils;
44
import com.spice.profitmandi.dao.entity.catalog.Item;
48
import com.spice.profitmandi.dao.entity.catalog.Item;
45
import com.spice.profitmandi.dao.entity.dtr.GadgetCopsInsuranceCalc;
49
import com.spice.profitmandi.dao.entity.dtr.GadgetCopsInsuranceCalc;
46
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
50
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
47
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
51
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
-
 
52
import com.spice.profitmandi.dao.entity.dtr.Otp;
48
import com.spice.profitmandi.dao.entity.dtr.PolicyNumberGenerationSequence;
53
import com.spice.profitmandi.dao.entity.dtr.PolicyNumberGenerationSequence;
49
import com.spice.profitmandi.dao.entity.dtr.Retailer;
54
import com.spice.profitmandi.dao.entity.dtr.Retailer;
50
import com.spice.profitmandi.dao.entity.dtr.User;
55
import com.spice.profitmandi.dao.entity.dtr.User;
51
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
56
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
52
import com.spice.profitmandi.dao.entity.fofo.Customer;
57
import com.spice.profitmandi.dao.entity.fofo.Customer;
Line 56... Line 61...
56
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
61
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
57
import com.spice.profitmandi.dao.entity.fofo.FofoOrderPaymentOption;
62
import com.spice.profitmandi.dao.entity.fofo.FofoOrderPaymentOption;
58
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
63
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
59
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
64
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
60
import com.spice.profitmandi.dao.entity.fofo.InvoiceNumberGenerationSequence;
65
import com.spice.profitmandi.dao.entity.fofo.InvoiceNumberGenerationSequence;
-
 
66
import com.spice.profitmandi.dao.entity.fofo.PrebookingListing;
-
 
67
import com.spice.profitmandi.dao.entity.fofo.PrebookingOrder;
-
 
68
import com.spice.profitmandi.dao.entity.fofo.PrebookingOrderItem;
61
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
69
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
62
import com.spice.profitmandi.dao.entity.user.Address;
70
import com.spice.profitmandi.dao.entity.user.Address;
63
import com.spice.profitmandi.dao.entity.user.Counter;
71
import com.spice.profitmandi.dao.entity.user.Counter;
64
import com.spice.profitmandi.dao.entity.user.PrivateDealUser;
72
import com.spice.profitmandi.dao.entity.user.PrivateDealUser;
-
 
73
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
65
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
74
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
66
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
75
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
67
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
76
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
68
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
77
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
69
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
78
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
-
 
79
import com.spice.profitmandi.dao.repository.dtr.OtpRepository;
70
import com.spice.profitmandi.dao.repository.dtr.PolicyNumberGenerationSequenceRepository;
80
import com.spice.profitmandi.dao.repository.dtr.PolicyNumberGenerationSequenceRepository;
71
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
81
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
72
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
82
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
73
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
83
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
74
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
84
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
Line 80... Line 90...
80
import com.spice.profitmandi.dao.repository.fofo.FofoOrderPaymentOptionRepository;
90
import com.spice.profitmandi.dao.repository.fofo.FofoOrderPaymentOptionRepository;
81
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
91
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
82
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
92
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
83
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
93
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
84
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
94
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
-
 
95
import com.spice.profitmandi.dao.repository.fofo.PrebookingListingRepository;
-
 
96
import com.spice.profitmandi.dao.repository.fofo.PrebookingOrderItemRepository;
-
 
97
import com.spice.profitmandi.dao.repository.fofo.PrebookingOrderRepository;
85
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
98
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
86
import com.spice.profitmandi.dao.repository.user.AddressRepository;
99
import com.spice.profitmandi.dao.repository.user.AddressRepository;
87
import com.spice.profitmandi.dao.repository.user.CounterRepository;
100
import com.spice.profitmandi.dao.repository.user.CounterRepository;
88
import com.spice.profitmandi.dao.repository.user.PrivateDealUserRepository;
101
import com.spice.profitmandi.dao.repository.user.PrivateDealUserRepository;
-
 
102
import com.spice.profitmandi.service.inventory.InventoryService;
89
import com.spice.profitmandi.service.pricing.PricingService;
103
import com.spice.profitmandi.service.pricing.PricingService;
90
import com.spice.profitmandi.service.scheme.SchemeService;
104
import com.spice.profitmandi.service.scheme.SchemeService;
91
import com.spice.profitmandi.service.wallet.WalletService;
105
import com.spice.profitmandi.service.wallet.WalletService;
92
 
106
 
93
import in.shop2020.model.v1.catalog.ItemType;
107
import in.shop2020.model.v1.catalog.ItemType;
Line 172... Line 186...
172
	
186
	
173
	@Autowired
187
	@Autowired
174
	private FofoOrderPaymentOptionRepository fofoOrderPaymentOptionRepository;
188
	private FofoOrderPaymentOptionRepository fofoOrderPaymentOptionRepository;
175
	
189
	
176
	@Autowired
190
	@Autowired
-
 
191
	private PrebookingListingRepository prebookingListingRepository;
-
 
192
	
-
 
193
	@Autowired
-
 
194
	private PrebookingOrderRepository prebookingOrderRepository;
-
 
195
	
-
 
196
	@Autowired
-
 
197
	private PrebookingOrderItemRepository prebookingOrderItemRepository;
-
 
198
	
-
 
199
	@Autowired
177
	private SchemeService schemeService;
200
	private SchemeService schemeService;
178
	
201
	
-
 
202
	@Autowired
-
 
203
	private InventoryService inventoryService;
-
 
204
	
-
 
205
	@Autowired
-
 
206
	private OtpRepository otpRepository;
-
 
207
	
179
	@Override
208
	@Override
180
	public int createOrder(CreateOrderRequest createOrderRequest, int fofoId) throws ProfitMandiBusinessException {
209
	public int createOrder(CreateOrderRequest createOrderRequest, int fofoId) throws ProfitMandiBusinessException {
181
		
210
		
182
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
211
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
183
 
212
 
Line 198... Line 227...
198
		
227
		
199
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); //this is for error
228
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); //this is for error
200
		Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap = new HashMap<>();
229
		Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap = new HashMap<>();
201
		Map<Integer, Float> lineItemPrice = new HashMap<>(); //this is for pricing error
230
		Map<Integer, Float> lineItemPrice = new HashMap<>(); //this is for pricing error
202
		
231
		
203
		
-
 
-
 
232
		Map<Integer, Integer> prebookingOrderItemIdQuantityMap = new HashMap<>(); // for prebooking order adjustment
204
		
233
		
205
		float totalAmount = 0;
234
		float totalAmount = 0;
206
		for(CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()){
235
		for(CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()){
207
			//itemIds.add(customFofoOrderItem.getItemId());
236
			//itemIds.add(customFofoOrderItem.getItemId());
-
 
237
			if(customFofoOrderItem.isPrebookingOrder()) {
-
 
238
				prebookingOrderItemIdQuantityMap.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
-
 
239
			}
208
			Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
240
			Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
209
			if(!serialNumbers.isEmpty() && customFofoOrderItem.getQuantity() != serialNumbers.size()){
241
			if(!serialNumbers.isEmpty() && customFofoOrderItem.getQuantity() != serialNumbers.size()){
210
				itemIdQuantity.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
242
				itemIdQuantity.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
211
			}
243
			}
212
			if(!(customFofoOrderItem.getSellingPrice() > 0)){
244
			if(!(customFofoOrderItem.getSellingPrice() > 0)){
Line 228... Line 260...
228
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
260
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
229
			throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "FFORDR_1001");
261
			throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "FFORDR_1001");
230
			//return "error";
262
			//return "error";
231
		}
263
		}
232
		
264
		
-
 
265
		List<PrebookingListing> prebookingListings = prebookingListingRepository.selectAllByItemIds(prebookingOrderItemIdQuantityMap.keySet());
-
 
266
		
-
 
267
		Map<Integer, PrebookingListing> itemIdPrebookingListingMap = this.prebookingListingsToItemIdPrebookingListingMap(prebookingListings);
-
 
268
		
-
 
269
		List<PrebookingOrder> prebookingOrders = prebookingOrderRepository.selectByFofoIdCustomerMobileNumberItemIds(fofoId, customCustomer.getMobileNumber(), prebookingOrderItemIdQuantityMap.keySet());
-
 
270
		
-
 
271
		float prebookingOrdersTotalAmount = this.calculatePrebookingOrdersAmount(prebookingOrders, prebookingOrderItemIdQuantityMap, itemIdPrebookingListingMap);
-
 
272
		
233
		this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
273
		this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount - prebookingOrdersTotalAmount);
234
		
274
		
235
		if(!lineItemPrice.isEmpty()){
275
		if(!lineItemPrice.isEmpty()){
236
			// given fofo line item price must be greater than zero
276
			// given fofo line item price must be greater than zero
237
			LOGGER.error("requested itemId's selling price must greater than 0");
277
			LOGGER.error("requested itemId's selling price must greater than 0");
238
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "FFORDR_1002");
278
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "FFORDR_1002");
Line 249... Line 289...
249
			// invalid itemIds 
289
			// invalid itemIds 
250
			throw new ProfitMandiBusinessException("invalidItemIds", itemIdCustomFofoOrderItemMap.keySet(), "FFORDR_1003");
290
			throw new ProfitMandiBusinessException("invalidItemIds", itemIdCustomFofoOrderItemMap.keySet(), "FFORDR_1003");
251
		}
291
		}
252
		
292
		
253
		Map<Integer, Item>  itemMap = this.toItemMap(items);
293
		Map<Integer, Item>  itemMap = this.toItemMap(items);
254
 
294
		
255
		Set<Integer> nonSerializedItemIds = new HashSet<>();
295
		Set<Integer> nonSerializedItemIds = new HashSet<>();
256
		Set<String> serialNumbers = new HashSet<>();
296
		Set<String> serialNumbers = new HashSet<>();
257
		Map<String, Float> insuranceSerialNumberItemPrice = new HashMap<>();
297
		Map<String, Float> insuranceSerialNumberItemPrice = new HashMap<>();
258
		Map<String, Float> insuranceSerialNumberSaleAmount = new HashMap<>();
298
		Map<String, Float> insuranceSerialNumberSaleAmount = new HashMap<>();
259
		Map<String, String> serialNumberModelName = new HashMap<>();
299
		Map<String, String> serialNumberModelName = new HashMap<>();
Line 273... Line 313...
273
			}
313
			}
274
			else{
314
			else{
275
				nonSerializedItemIds.add(customFofoOrderItem.getItemId());
315
				nonSerializedItemIds.add(customFofoOrderItem.getItemId());
276
			}
316
			}
277
		}
317
		}
278
 
318
		
279
		Map<Integer, Set<InventoryItem>> serializedInventoryItemMap = new HashMap<>();
319
		Map<Integer, Set<InventoryItem>> serializedInventoryItemMap = new HashMap<>();
280
		Map<Integer, Set<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<>();
320
		Map<Integer, Set<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<>();
281
		//Map<String, Float> serialNumberItemPrice = new HashMap<>();
321
		//Map<String, Float> serialNumberItemPrice = new HashMap<>();
-
 
322
		
282
		if (!serialNumbers.isEmpty()){
323
		if (!serialNumbers.isEmpty()){
283
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, serialNumbers);
324
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, serialNumbers);
284
			LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
325
			LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
285
			for (InventoryItem inventoryItem : serializedInventoryItems){
326
			for (InventoryItem inventoryItem : serializedInventoryItems){
286
				if (inventoryItem.getGoodQuantity() == 1){
327
				if (inventoryItem.getGoodQuantity() == 1){
287
					if (serializedInventoryItemMap.containsKey(inventoryItem.getItemId())){
328
					if (serializedInventoryItemMap.containsKey(inventoryItem.getItemId())){
288
						serializedInventoryItemMap.get(inventoryItem.getItemId()).add(inventoryItem);
329
						serializedInventoryItemMap.get(inventoryItem.getItemId()).add(inventoryItem);
289
					}
-
 
290
					else{
330
					}else{
291
						Set<InventoryItem> itemIdInventoryItems = new HashSet<>();
331
						Set<InventoryItem> itemIdInventoryItems = new HashSet<>();
292
						itemIdInventoryItems.add(inventoryItem);
332
						itemIdInventoryItems.add(inventoryItem);
293
						serializedInventoryItemMap.put(inventoryItem.getItemId(), itemIdInventoryItems);
333
						serializedInventoryItemMap.put(inventoryItem.getItemId(), itemIdInventoryItems);
294
					}
334
					}
295
				}
335
				}
296
			}
336
			}
297
		}
337
		}
-
 
338
 
298
		if (!nonSerializedItemIds.isEmpty()){
339
		if (!nonSerializedItemIds.isEmpty()){
299
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoId, nonSerializedItemIds);
340
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoId, nonSerializedItemIds);
300
			LOGGER.info("nonSerializedInventoryItems {}", nonSerializedInventoryItems);
341
			LOGGER.info("nonSerializedInventoryItems {}", nonSerializedInventoryItems);
301
			for (InventoryItem it : nonSerializedInventoryItems){
342
			for (InventoryItem it : nonSerializedInventoryItems){
302
				if (it.getGoodQuantity() > 0){
343
				if (it.getGoodQuantity() > 0){
Line 377... Line 418...
377
		
418
		
378
		Customer customer = this.createAndGetCustomer(customCustomer);
419
		Customer customer = this.createAndGetCustomer(customCustomer);
379
		
420
		
380
		CustomerAddress customerAddress = this.createCustomerAddress(customCustomer.getAddress(), customer.getId());
421
		CustomerAddress customerAddress = this.createCustomerAddress(customCustomer.getAddress(), customer.getId());
381
		
422
		
382
		FofoOrder fofoOrder = this.createAndGetFofoOrder(customer.getId(), customCustomer.getGstNumber(), fofoId, invoiceNumberGenerationSequence, totalAmount, customerAddress.getId());
423
		FofoOrder fofoOrder = this.createAndGetFofoOrder(customer.getId(), customCustomer.getGstNumber(), fofoId, invoiceNumberGenerationSequence, totalAmount - prebookingOrdersTotalAmount, customerAddress.getId());
383
		
424
		
384
		this.createPaymentOptions(fofoOrder.getId(), createOrderRequest.getPaymentOptions());
425
		this.createPaymentOptions(fofoOrder.getId(), createOrderRequest.getPaymentOptions());
385
		
426
		
-
 
427
		this.processPrebookingOrders(fofoOrder.getId(), prebookingOrders, prebookingOrderItemIdQuantityMap, itemIdPrebookingListingMap);
-
 
428
		
386
		int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
429
		int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
387
		
430
		
388
		Address retailerAddress = addressRepository.selectById(retailerAddressId);
431
		Address retailerAddress = addressRepository.selectById(retailerAddressId);
389
		
432
		
390
		Integer stateId = null;
433
		Integer stateId = null;
Line 449... Line 492...
449
		schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
492
		schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
450
		
493
		
451
		return fofoOrder.getId();
494
		return fofoOrder.getId();
452
	}
495
	}
453
	
496
	
-
 
497
	private float calculatePrebookingOrdersAmount(List<PrebookingOrder> prebookingOrders, Map<Integer, Integer> prebookingOrderItemIdQuantityMap, Map<Integer, PrebookingListing> itemIdPrebookingListingMap) {
-
 
498
		//List<PrebookingOrder> prebookingOrders = prebookingOrderRepository.selectByFofoIdCustomerMobileNumberItemIds(fofoId, customerMobileNumber, prebookingOrderItemIdQuantityMap.keySet());
-
 
499
		float totalAmount = 0;
-
 
500
		for(PrebookingOrder prebookingOrder : prebookingOrders) {
-
 
501
			int requestedQuantity = prebookingOrderItemIdQuantityMap.get(prebookingOrder.getItemId());
-
 
502
			PrebookingListing prebookingListing = itemIdPrebookingListingMap.get(prebookingOrder.getItemId());
-
 
503
			if(requestedQuantity < prebookingOrder.getAvailableQuantity()) {
-
 
504
				LOGGER.info("when requestedQuantity < then requestedQuantity [{}] * advanceAmount [{}]", requestedQuantity, prebookingListing.getAdvanceAmount());
-
 
505
				totalAmount = totalAmount + (requestedQuantity * prebookingListing.getAdvanceAmount());
-
 
506
			}else if(requestedQuantity >= prebookingOrder.getAvailableQuantity()) {
-
 
507
				LOGGER.info("else requestedQuantity [{}] * advanceAmount [{}]", requestedQuantity, prebookingListing.getAdvanceAmount());
-
 
508
				totalAmount = totalAmount + (prebookingOrder.getAvailableQuantity() * prebookingListing.getAdvanceAmount());
-
 
509
			}
-
 
510
		}
-
 
511
		return totalAmount;
-
 
512
	}
-
 
513
	
-
 
514
	private void processPrebookingOrders(int orderId, List<PrebookingOrder> prebookingOrders, Map<Integer, Integer> prebookingOrderItemIdQuantityMap, Map<Integer, PrebookingListing> itemIdPrebookingListingMap) {
-
 
515
		//Map<Integer, PrebookingOrder> prebookingOrderIdPrebookingOrderMap = this.prebookingOrdersToPrebookingOrderIdPrebookingOrderMap(prebookingOrders);
-
 
516
		
-
 
517
		for(PrebookingOrder prebookingOrder : prebookingOrders) {
-
 
518
			if(prebookingOrder.getCompleteTimestamp() == null) {
-
 
519
				int requestedQuantity = prebookingOrderItemIdQuantityMap.get(prebookingOrder.getItemId());
-
 
520
				
-
 
521
				PrebookingOrderItem prebookingOrderItem = new PrebookingOrderItem();
-
 
522
				if(requestedQuantity < prebookingOrder.getAvailableQuantity()) {
-
 
523
					prebookingOrder.setAvailableQuantity(prebookingOrder.getAvailableQuantity() - requestedQuantity);
-
 
524
					prebookingOrderItem.setQuantity(requestedQuantity);
-
 
525
				}else if(requestedQuantity >= prebookingOrder.getAvailableQuantity()) {
-
 
526
					prebookingOrderItem.setQuantity(prebookingOrder.getAvailableQuantity());
-
 
527
					prebookingOrder.setAvailableQuantity(0);
-
 
528
				}
-
 
529
				if(prebookingOrder.getAvailableQuantity() == 0) {
-
 
530
					prebookingOrder.setCompleteTimestamp(LocalDateTime.now());
-
 
531
				}
-
 
532
				prebookingOrderRepository.persist(prebookingOrder);
-
 
533
				
-
 
534
				prebookingOrderItem.setOrderId(orderId);
-
 
535
				prebookingOrderItem.setItemId(prebookingOrder.getItemId());
-
 
536
				PrebookingListing prebookingListing = itemIdPrebookingListingMap.get(prebookingOrder.getItemId());
-
 
537
				prebookingOrderItem.setAdvanceAmount(prebookingListing.getAdvanceAmount());
-
 
538
				
-
 
539
				prebookingOrderItemRepository.persist(prebookingOrderItem);
-
 
540
			}
-
 
541
			
-
 
542
		}
-
 
543
	}
-
 
544
	
-
 
545
	private Map<Integer, PrebookingListing> prebookingListingsToItemIdPrebookingListingMap(List<PrebookingListing> prebookingListings){
-
 
546
		Map<Integer, PrebookingListing> itemIdPrebookingListingMap = new HashMap<>();
-
 
547
		for(PrebookingListing prebookingListing : prebookingListings) {
-
 
548
			itemIdPrebookingListingMap.put(prebookingListing.getItemId(), prebookingListing);
-
 
549
		}
-
 
550
		return itemIdPrebookingListingMap;
-
 
551
	}
-
 
552
	
-
 
553
	
454
	private Set<String> serialNumberDetailsToSerialNumbers(Set<SerialNumberDetail> serialNumberDetails){
554
	private Set<String> serialNumberDetailsToSerialNumbers(Set<SerialNumberDetail> serialNumberDetails){
455
		Set<String> serialNumbers = new HashSet<>();
555
		Set<String> serialNumbers = new HashSet<>();
456
		for(SerialNumberDetail serialNumberDetail : serialNumberDetails) {
556
		for(SerialNumberDetail serialNumberDetail : serialNumberDetails) {
457
			if(serialNumberDetail.getSerialNumber() != null && !serialNumberDetail.getSerialNumber().isEmpty()) {
557
			if(serialNumberDetail.getSerialNumber() != null && !serialNumberDetail.getSerialNumber().isEmpty()) {
458
				serialNumbers.add(serialNumberDetail.getSerialNumber());
558
				serialNumbers.add(serialNumberDetail.getSerialNumber());
Line 949... Line 1049...
949
				fofoOrderItem.setIgstRate(itemIdIgstTaxRateMap.get(inventoryItem.getItemId()));
1049
				fofoOrderItem.setIgstRate(itemIdIgstTaxRateMap.get(inventoryItem.getItemId()));
950
			}else{
1050
			}else{
951
				fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
1051
				fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
952
				fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
1052
				fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
953
			}
1053
			}
-
 
1054
			
954
			fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1055
			fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
955
			break;
1056
			break;
956
		}
1057
		}
957
		for(InventoryItem inventoryItem : inventoryItems){
1058
		for(InventoryItem inventoryItem : inventoryItems){
958
			if(inventoryItem.getSerialNumber() != null) {
1059
			if(inventoryItem.getSerialNumber() != null) {
Line 1081... Line 1182...
1081
					quantity.setAvailable(currentInventorySnapshot.getAvailability());
1182
					quantity.setAvailable(currentInventorySnapshot.getAvailability());
1082
					quantity.setRequested(customFofoOrderItem.getQuantity());
1183
					quantity.setRequested(customFofoOrderItem.getQuantity());
1083
					itemIdQuantityAvailability.setQuantity(quantity);
1184
					itemIdQuantityAvailability.setQuantity(quantity);
1084
					itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
1185
					itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
1085
				}
1186
				}
1086
 
-
 
1087
		}
1187
		}
1088
 
1188
 
1089
 
-
 
1090
 
-
 
1091
		if(!itemIdQuantityAvailabilities.isEmpty()){
1189
		if(!itemIdQuantityAvailabilities.isEmpty()){
1092
			// itemIdQuantity request is not valid
1190
			// itemIdQuantity request is not valid
1093
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
1191
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
1094
			throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities, "FFORDR_1015");
1192
			throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities, "FFORDR_1015");
1095
		}
1193
		}
Line 1227... Line 1325...
1227
				fofoOrderItemIdFofoLineItemsMap.get(fofoLineItem.getFofoOrderItemId()).add(fofoLineItem);
1325
				fofoOrderItemIdFofoLineItemsMap.get(fofoLineItem.getFofoOrderItemId()).add(fofoLineItem);
1228
			}
1326
			}
1229
		}
1327
		}
1230
		return fofoOrderItemIdFofoLineItemsMap;
1328
		return fofoOrderItemIdFofoLineItemsMap;
1231
	}
1329
	}
-
 
1330
	
-
 
1331
	private String getOtpString(){
-
 
1332
		Random rndm_method = new Random();
-
 
1333
		String numbers ="0123456789";
-
 
1334
		char[] otp = new char[5];
-
 
1335
 
-
 
1336
		for (int i = 0; i < 5; i++){
-
 
1337
			otp[i] = numbers.charAt(rndm_method.nextInt(numbers.length()));
-
 
1338
		}
-
 
1339
		return String.valueOf(otp);
-
 
1340
	}
-
 
1341
	
-
 
1342
	private void sendOtp(String otp_text, String phone, Map<Integer, Float> itemIdAdvanceAmount){
-
 
1343
		Map<Integer, String> itemIdDescriptionMap = inventoryService.getItemIdDescriptionMap(itemIdAdvanceAmount.keySet());
-
 
1344
		StringBuilder itemIdAdvanceAmountString = new StringBuilder();
-
 
1345
		int index = 0;
-
 
1346
		for(Map.Entry<Integer, Float> itemIdAdvanceAmountEntry : itemIdAdvanceAmount.entrySet()) {
-
 
1347
			itemIdAdvanceAmountString.append(itemIdDescriptionMap.get(itemIdAdvanceAmountEntry.getKey()));
-
 
1348
			itemIdAdvanceAmountString.append("'s Advance amount [");
-
 
1349
			itemIdAdvanceAmountString.append(itemIdAdvanceAmountEntry.getValue());
-
 
1350
			itemIdAdvanceAmountString.append("]");
-
 
1351
			if(index + 1 < itemIdAdvanceAmount.size()) {
-
 
1352
				itemIdAdvanceAmountString.append(", ");
-
 
1353
			}
-
 
1354
			index++;
-
 
1355
		}
-
 
1356
		String text = "Dear Customer, {0} is the OTP that you have requested for prebooking orders for items {1} Don't share your OTP with anyone.";
-
 
1357
		String msg = java.text.MessageFormat.format(text, otp_text, itemIdAdvanceAmountString);
-
 
1358
		try {
-
 
1359
			Utils.sendSms(msg, phone);
-
 
1360
		} catch (URISyntaxException e) {
-
 
1361
			// TODO Auto-generated catch block
-
 
1362
			e.printStackTrace();
-
 
1363
		} catch (IOException e) {
-
 
1364
			// TODO Auto-generated catch block
-
 
1365
			e.printStackTrace();
-
 
1366
		}
-
 
1367
		
-
 
1368
	}
-
 
1369
	
-
 
1370
	@Override
-
 
1371
	public int generatePrebookingOrdersOtp(String customerEmailId, String customerMobileNumber, Map<Integer, Float> itemIdAdvanceAmount) throws ProfitMandiBusinessException {
-
 
1372
		if(!StringUtils.isValidEmailAddress(customerEmailId)){
-
 
1373
			LOGGER.error("invalid customer emailId {} ", customerEmailId);
-
 
1374
			throw new ProfitMandiBusinessException(ProfitMandiConstants.EMAIL_ID, customerEmailId, "VE_1016");
-
 
1375
		}
-
 
1376
 
-
 
1377
		if(!StringUtils.isValidMobile(customerMobileNumber)){
-
 
1378
			LOGGER.error("invalid customer mobileNumber {} ", customerMobileNumber);
-
 
1379
			throw new ProfitMandiBusinessException(ProfitMandiConstants.MOBILE_NUMBER, customerMobileNumber, "VE_1071");
-
 
1380
		}
-
 
1381
		
-
 
1382
		List<Otp> otps = otpRepository.selectAllByEmailWithTime(customerEmailId);
-
 
1383
		String otp = null;
-
 
1384
		if (otps.size() >= 5){
-
 
1385
			throw new ProfitMandiBusinessException(ProfitMandiConstants.CUSTOMER_EMAIL_ID, customerEmailId, "FFORDR_1019");
-
 
1386
		}
-
 
1387
		if (!otps.isEmpty()){
-
 
1388
			if (otps.get(0).getCreatedOn().isAfter(LocalDateTime.now().minusMinutes(2))){
-
 
1389
				return otps.get(0).getId();
-
 
1390
			}else if(otps.get(0).getCreatedOn().isAfter(LocalDateTime.now().minusMinutes(10))){
-
 
1391
				otp = otps.get(0).getOtp();
-
 
1392
			}
-
 
1393
		}
-
 
1394
		if (otp == null || otp.isEmpty()){
-
 
1395
			otp = getOtpString();
-
 
1396
		}
-
 
1397
		
-
 
1398
		this.sendOtp(otp, customerMobileNumber, itemIdAdvanceAmount);
-
 
1399
		
-
 
1400
		Otp otp_bean = new Otp();
-
 
1401
		otp_bean.setEmail(customerEmailId);
-
 
1402
		otp_bean.setMobile(customerMobileNumber);
-
 
1403
		otp_bean.setOtp(otp);
-
 
1404
		otp_bean.setOtpType(OtpType.PREBOOKING_ORDER);
-
 
1405
		otp_bean.setCreatedOn(LocalDateTime.now());
-
 
1406
		otp_bean.setExpiryTimestamp(LocalDateTime.now().plusMinutes(10));
-
 
1407
		otpRepository.persist(otp_bean);
-
 
1408
		
-
 
1409
		return otp_bean.getId();
-
 
1410
	}
-
 
1411
	
-
 
1412
	@Override
-
 
1413
	public String validateOtp(String customerEmailId, String customerMobileNumber, int otpId, String otpValue)
-
 
1414
			throws ProfitMandiBusinessException {
-
 
1415
		Otp otp = otpRepository.selectByIdEmailIdMobileNumber(otpId, customerEmailId, customerMobileNumber);
-
 
1416
		otp.setTryCount(otp.getTryCount() + 1);
-
 
1417
		if (!otp.getOtp().equalsIgnoreCase(otpValue)){
-
 
1418
			throw new ProfitMandiBusinessException("otpValue", otpValue, "FFORDR_1020");
-
 
1419
		}
-
 
1420
		if (otp.isExpired() || otp.isVerified() || otp.getExpiryTimestamp().isBefore(LocalDateTime.now())){
-
 
1421
			throw new ProfitMandiBusinessException("otpValue", otpValue, "FFORDR_1021");
-
 
1422
		}
-
 
1423
		if (otp.getTryCount() >5){
-
 
1424
			throw new ProfitMandiBusinessException("otpValue", otpValue, "FFORDR_1022");
-
 
1425
		}
-
 
1426
		otp.setExpired(true);
-
 
1427
		otp.setVerified(true);
-
 
1428
		otpRepository.persist(otp);
-
 
1429
		
-
 
1430
		return ResponseCodeHolder.getMessage("FFORDR_OK_1002");
-
 
1431
	}
1232
 
1432
 
1233
}
1433
}