Subversion Repositories SmartDukaan

Rev

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

Rev 32014 Rev 32145
Line 76... Line 76...
76
import java.util.stream.Collectors;
76
import java.util.stream.Collectors;
77
 
77
 
78
@Component
78
@Component
79
public class OrderServiceImpl implements OrderService {
79
public class OrderServiceImpl implements OrderService {
80
 
80
 
81
	private static final Logger LOGGER = LogManager.getLogger(OrderServiceImpl.class);
81
    private static final Logger LOGGER = LogManager.getLogger(OrderServiceImpl.class);
82
 
82
 
83
	private static Map<String, Integer> serialNumberOrderIdMap = new HashMap<>();
83
    private static Map<String, Integer> serialNumberOrderIdMap = new HashMap<>();
84
 
84
 
85
	static {
85
    static {
86
		serialNumberOrderIdMap.put("862897055749275", 67228);
86
        serialNumberOrderIdMap.put("862897055749275", 67228);
87
	}
87
    }
88
 
88
 
89
	@Autowired
89
    @Autowired
90
	@Qualifier("fofoInventoryItemRepository")
90
    @Qualifier("fofoInventoryItemRepository")
91
	private InventoryItemRepository inventoryItemRepository;
91
    private InventoryItemRepository inventoryItemRepository;
92
 
92
 
93
	@Autowired
93
    @Autowired
94
	private StateGstRateRepository stateGstRateRepository;
94
    private StateGstRateRepository stateGstRateRepository;
95
 
95
 
96
	@Autowired
96
    @Autowired
97
	private SaholicInventoryService saholicInventoryService;
97
    private SaholicInventoryService saholicInventoryService;
98
 
98
 
99
	@Autowired
99
    @Autowired
100
	private LiveDemoBillingRespository liveDemoBillingRespository;
100
    private LiveDemoBillingRespository liveDemoBillingRespository;
101
 
101
 
102
	@Autowired
102
    @Autowired
103
	private InsuranceService insuranceService;
103
    private InsuranceService insuranceService;
104
 
104
 
105
	@Autowired
105
    @Autowired
106
	private WalletService walletService;
106
    private WalletService walletService;
107
 
107
 
108
	@Autowired
108
    @Autowired
109
	@Qualifier("fofoCurrentInventorySnapshotRepository")
109
    @Qualifier("fofoCurrentInventorySnapshotRepository")
110
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
110
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
111
 
111
 
112
	@Autowired
112
    @Autowired
113
	private InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
113
    private InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
114
 
114
 
115
	@Autowired
115
    @Autowired
116
	private PurchaseReturnService purchaseReturnService;
116
    private PurchaseReturnService purchaseReturnService;
117
 
117
 
118
	@Autowired
118
    @Autowired
119
	private RetailerService retailerService;
119
    private RetailerService retailerService;
120
 
120
 
121
	@Autowired
121
    @Autowired
122
	private CustomerRepository customerRepository;
122
    private CustomerRepository customerRepository;
123
 
123
 
124
	@Autowired
124
    @Autowired
125
	private PurchaseReturnItemRepository purchaseReturnItemRepository;
125
    private PurchaseReturnItemRepository purchaseReturnItemRepository;
126
 
126
 
127
	@Autowired
127
    @Autowired
128
	private AddressRepository addressRepository;
128
    private AddressRepository addressRepository;
129
 
129
 
130
	@Autowired
130
    @Autowired
131
	private FofoLineItemRepository fofoLineItemRepository;
131
    private FofoLineItemRepository fofoLineItemRepository;
132
 
132
 
133
	@Autowired
133
    @Autowired
134
	private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
134
    private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
135
 
135
 
136
	@Autowired
136
    @Autowired
137
	private FofoOrderItemRepository fofoOrderItemRepository;
137
    private FofoOrderItemRepository fofoOrderItemRepository;
138
 
138
 
139
	@Autowired
139
    @Autowired
140
	private PaymentOptionRepository paymentOptionRepository;
140
    private PaymentOptionRepository paymentOptionRepository;
141
 
141
 
142
	@Autowired
142
    @Autowired
143
	private CustomerReturnItemRepository customerReturnItemRepository;
143
    private CustomerReturnItemRepository customerReturnItemRepository;
144
 
144
 
145
	@Autowired
145
    @Autowired
146
	@Qualifier("fofoScanRecordRepository")
146
    @Qualifier("fofoScanRecordRepository")
147
	private ScanRecordRepository scanRecordRepository;
147
    private ScanRecordRepository scanRecordRepository;
148
 
148
 
149
	@Autowired
149
    @Autowired
150
	private FofoOrderRepository fofoOrderRepository;
150
    private FofoOrderRepository fofoOrderRepository;
151
 
151
 
152
	@Autowired
152
    @Autowired
153
	private RetailerRepository retailerRepository;
153
    private RetailerRepository retailerRepository;
154
 
154
 
155
	@Autowired
155
    @Autowired
156
	private UserRepository userRepository;
156
    private UserRepository userRepository;
157
 
157
 
158
	@Autowired
158
    @Autowired
159
	private UserAccountRepository userAccountRepository;
159
    private UserAccountRepository userAccountRepository;
160
 
160
 
161
	@Autowired
161
    @Autowired
162
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
162
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
163
 
163
 
164
	@Autowired
164
    @Autowired
165
	private CustomerAddressRepository customerAddressRepository;
165
    private CustomerAddressRepository customerAddressRepository;
166
 
166
 
167
	@Autowired
167
    @Autowired
168
	@Qualifier("catalogItemRepository")
168
    @Qualifier("catalogItemRepository")
169
	private ItemRepository itemRepository;
169
    private ItemRepository itemRepository;
170
 
170
 
171
	@Autowired
171
    @Autowired
172
	private InsuranceProviderRepository insuranceProviderRepository;
172
    private InsuranceProviderRepository insuranceProviderRepository;
173
 
173
 
174
	@Autowired
174
    @Autowired
175
	private InsurancePolicyRepository insurancePolicyRepository;
175
    private InsurancePolicyRepository insurancePolicyRepository;
176
 
176
 
177
	@Autowired
177
    @Autowired
178
	private StateRepository stateRepository;
178
    private StateRepository stateRepository;
179
 
179
 
180
	@Autowired
180
    @Autowired
181
	private PolicyNumberGenerationSequenceRepository policyNumberGenerationSequenceRepository;
181
    private PolicyNumberGenerationSequenceRepository policyNumberGenerationSequenceRepository;
182
 
182
 
183
	@Autowired
183
    @Autowired
184
	private PricingService pricingService;
184
    private PricingService pricingService;
185
 
185
 
186
	@Autowired
186
    @Autowired
187
	private PrivateDealUserRepository privateDealUserRepository;
187
    private PrivateDealUserRepository privateDealUserRepository;
188
 
188
 
189
	@Autowired
189
    @Autowired
190
	private TagListingRepository tagListingRepository;
190
    private TagListingRepository tagListingRepository;
191
 
191
 
192
	@Autowired
192
    @Autowired
193
	private CounterRepository counterRepository;
193
    private CounterRepository counterRepository;
194
 
194
 
195
	@Autowired
195
    @Autowired
196
	private FofoStoreRepository fofoStoreRepository;
196
    private FofoStoreRepository fofoStoreRepository;
197
 
197
 
198
	@Autowired
198
    @Autowired
199
	private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
199
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
200
 
200
 
201
	@Autowired
201
    @Autowired
202
	private SchemeService schemeService;
202
    private SchemeService schemeService;
203
 
203
 
204
	private static final List<Integer> orderIdsConsumed = new ArrayList<>();
204
    private static final List<Integer> orderIdsConsumed = new ArrayList<>();
205
 
205
 
206
	@Autowired
206
    @Autowired
207
	@Qualifier("fofoInventoryService")
207
    @Qualifier("fofoInventoryService")
208
	private InventoryService inventoryService;
208
    private InventoryService inventoryService;
209
 
209
 
210
	@Autowired
210
    @Autowired
211
	private CustomerCreditNoteRepository customerCreditNoteRepository;
211
    private CustomerCreditNoteRepository customerCreditNoteRepository;
212
 
212
 
213
	@Autowired
213
    @Autowired
214
	private OrderRepository orderRepository;
214
    private OrderRepository orderRepository;
215
 
215
 
216
	@Autowired
216
    @Autowired
217
	private HygieneDataRepository hygieneDataRepository;
217
    private HygieneDataRepository hygieneDataRepository;
218
 
218
 
219
	@Autowired
219
    @Autowired
220
	private SessionFactory sessionFactory;
220
    private SessionFactory sessionFactory;
221
 
221
 
222
	@Autowired
222
    @Autowired
223
	private Mongo mongoClient;
223
    private Mongo mongoClient;
224
 
224
 
225
	@Autowired
225
    @Autowired
226
	private PendingOrderRepository pendingOrderRepository;
226
    private PendingOrderRepository pendingOrderRepository;
227
 
227
 
228
	@Autowired
228
    @Autowired
229
	private PendingOrderItemRepository pendingOrderItemRepository;
229
    private PendingOrderItemRepository pendingOrderItemRepository;
230
 
230
 
231
	@Autowired
231
    @Autowired
232
	private ScratchOfferRepository scratchOfferRepository;
232
    private ScratchOfferRepository scratchOfferRepository;
233
 
233
 
234
	@Autowired
234
    @Autowired
235
	RestClient restClient;
235
    RestClient restClient;
236
 
236
 
237
	@Value("${prod}")
237
    @Value("${prod}")
238
	private boolean prodEnv;
238
    private boolean prodEnv;
239
 
239
 
240
	private static final String SMS_GATEWAY = "http://api.pinnacle.in/index.php/sms/send";
240
    private static final String SMS_GATEWAY = "http://api.pinnacle.in/index.php/sms/send";
241
	private static final String SENDER = "SMTDKN";
241
    private static final String SENDER = "SMTDKN";
242
 
242
 
243
	public static final String APP_DOWNLOAD_BILLING_TEMPLATE_ID = "1507163542403945677";
243
    public static final String APP_DOWNLOAD_BILLING_TEMPLATE_ID = "1507163542403945677";
244
 
244
 
245
	public static final String APP_DOWNLOAD_BILLING_OFFER = "Dear Customer, Thank you for purchasing from SmartDukaan pls click %s to download our app to see you invoice and special offers. SmartDukaan";
245
    public static final String APP_DOWNLOAD_BILLING_OFFER = "Dear Customer, Thank you for purchasing from SmartDukaan pls click %s to download our app to see you invoice and special offers. SmartDukaan";
246
 
246
 
247
	@Override
247
    @Override
248
	public int createOrder(CreateOrderRequest createOrderRequest, int fofoId, boolean accessoriesDeals)
248
    public int createOrder(CreateOrderRequest createOrderRequest, int fofoId, boolean accessoriesDeals) throws ProfitMandiBusinessException {
249
			throws ProfitMandiBusinessException {
249
        LOGGER.info("fofoId -- {} Order Request -- {}", fofoId, createOrderRequest);
250
		LOGGER.info("fofoId -- {} Order Request -- {}", fofoId, createOrderRequest);
250
        CustomCustomer customCustomer = createOrderRequest.getCustomer();
251
		CustomCustomer customCustomer = createOrderRequest.getCustomer();
251
        Customer customer = customerRepository.selectById(customCustomer.getCustomerId());
252
		Customer customer = customerRepository.selectById(customCustomer.getCustomerId());
252
 
253
 
253
        if (!StringUtils.isValidGstNumber(customCustomer.getGstNumber())) {
254
		if (!StringUtils.isValidGstNumber(customCustomer.getGstNumber())) {
254
            LOGGER.error("invalid customer gstNumber {} ", customCustomer.getGstNumber());
255
			LOGGER.error("invalid customer gstNumber {} ", customCustomer.getGstNumber());
255
            throw new ProfitMandiBusinessException(ProfitMandiConstants.CUSTOMER_GST_NUMBER, customCustomer.getGstNumber(), "VE_1072");
256
			throw new ProfitMandiBusinessException(ProfitMandiConstants.CUSTOMER_GST_NUMBER,
256
        }
257
					customCustomer.getGstNumber(), "VE_1072");
257
 
258
		}
258
        Map<Integer, Integer> itemIdQuantity = new HashMap<>(); // this is for error
259
 
259
        Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap = new HashMap<>();
260
		Map<Integer, Integer> itemIdQuantity = new HashMap<>(); // this is for error
260
        Map<Integer, Float> lineItemPrice = new HashMap<>(); // this is for pricing error
261
		Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap = new HashMap<>();
261
 
262
		Map<Integer, Float> lineItemPrice = new HashMap<>(); // this is for pricing error
262
        float totalAmount = 0;
263
 
263
        boolean noGST = false;
264
		float totalAmount = 0;
264
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
265
		boolean noGST = false;
265
            // itemIds.add(customFofoOrderItem.getItemId());
266
		for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
266
            Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
267
			// itemIds.add(customFofoOrderItem.getItemId());
267
            if (!serialNumbers.isEmpty() && customFofoOrderItem.getQuantity() != serialNumbers.size()) {
268
			Set<String> serialNumbers = this
268
                itemIdQuantity.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
269
					.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
269
            }
270
			if (!serialNumbers.isEmpty() && customFofoOrderItem.getQuantity() != serialNumbers.size()) {
270
            if (!(customFofoOrderItem.getSellingPrice() > 0)) {
271
				itemIdQuantity.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
271
                lineItemPrice.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getSellingPrice());
272
			}
272
            } else {
273
			if (!(customFofoOrderItem.getSellingPrice() > 0)) {
273
                totalAmount = totalAmount + customFofoOrderItem.getSellingPrice() * customFofoOrderItem.getQuantity();
274
				lineItemPrice.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getSellingPrice());
274
                for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
275
			} else {
275
                    if (serialNumberDetail.getAmount() > 0) {
276
				totalAmount = totalAmount + customFofoOrderItem.getSellingPrice() * customFofoOrderItem.getQuantity();
276
                        totalAmount = totalAmount + serialNumberDetail.getAmount();
277
				for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
277
                    }
278
					if (serialNumberDetail.getAmount() > 0) {
278
                }
279
						totalAmount = totalAmount + serialNumberDetail.getAmount();
279
            }
280
					}
280
 
281
				}
281
            itemIdCustomFofoOrderItemMap.put(customFofoOrderItem.getItemId(), customFofoOrderItem);
282
			}
282
        }
283
 
283
        if (!itemIdQuantity.isEmpty()) {
284
			itemIdCustomFofoOrderItemMap.put(customFofoOrderItem.getItemId(), customFofoOrderItem);
284
            // if item quantity does not match with given serialnumbers size
285
		}
285
            LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
286
		if (!itemIdQuantity.isEmpty()) {
286
            throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "FFORDR_1001");
287
			// if item quantity does not match with given serialnumbers size
287
            // return "error";
288
			LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
288
        }
289
			throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "FFORDR_1001");
289
 
290
			// return "error";
290
        this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
291
		}
291
 
292
 
292
        if (!lineItemPrice.isEmpty()) {
293
		this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
293
            // given fofo line item price must be greater than zero
294
 
294
            LOGGER.error("requested itemId's selling price must greater than 0");
295
		if (!lineItemPrice.isEmpty()) {
295
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "FFORDR_1002");
296
			// given fofo line item price must be greater than zero
296
        }
297
			LOGGER.error("requested itemId's selling price must greater than 0");
297
 
298
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "FFORDR_1002");
298
        List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.selectByFofoItemIds(fofoId, itemIdCustomFofoOrderItemMap.keySet());
299
		}
299
 
300
 
300
        this.validateCurrentInventorySnapshotQuantities(currentInventorySnapshots, itemIdCustomFofoOrderItemMap);
301
		List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository
301
 
302
				.selectByFofoItemIds(fofoId, itemIdCustomFofoOrderItemMap.keySet());
302
        List<Item> items = itemRepository.selectByIds(itemIdCustomFofoOrderItemMap.keySet());
303
 
303
        if (items.size() != itemIdCustomFofoOrderItemMap.keySet().size()) {
304
		this.validateCurrentInventorySnapshotQuantities(currentInventorySnapshots, itemIdCustomFofoOrderItemMap);
304
            LOGGER.error("Requested ItemIds not found in catalog");
305
 
305
            // invalid itemIds
306
		List<Item> items = itemRepository.selectByIds(itemIdCustomFofoOrderItemMap.keySet());
306
            throw new ProfitMandiBusinessException("invalidItemIds", itemIdCustomFofoOrderItemMap.keySet(), "FFORDR_1003");
307
		if (items.size() != itemIdCustomFofoOrderItemMap.keySet().size()) {
307
        }
308
			LOGGER.error("Requested ItemIds not found in catalog");
308
 
309
			// invalid itemIds
309
        Map<Integer, Item> itemMap = this.toItemMap(items);
310
			throw new ProfitMandiBusinessException("invalidItemIds", itemIdCustomFofoOrderItemMap.keySet(),
310
 
311
					"FFORDR_1003");
311
        Set<Integer> nonSerializedItemIds = new HashSet<>();
312
		}
312
        Set<String> serialNumbers = new HashSet<>();
313
 
313
        List<InsuranceModel> insuredModels = new ArrayList<>();
314
		Map<Integer, Item> itemMap = this.toItemMap(items);
314
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
315
 
315
            Item item = itemMap.get(customFofoOrderItem.getItemId());
316
		Set<Integer> nonSerializedItemIds = new HashSet<>();
316
            noGST = item.getHsnCode().equals("NOGST");
317
		Set<String> serialNumbers = new HashSet<>();
317
            if (item.getType().equals(ItemType.SERIALIZED)) {
318
		List<InsuranceModel> insuredModels = new ArrayList<>();
318
                for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
319
		for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
319
                    serialNumbers.add(serialNumberDetail.getSerialNumber());
320
			Item item = itemMap.get(customFofoOrderItem.getItemId());
320
                    if (serialNumberDetail.getAmount() > 0) {
321
			noGST = item.getHsnCode().equals("NOGST");
321
                        if (customer.getEmailId() == null || customer.getEmailId().equals("")) {
322
			if (item.getType().equals(ItemType.SERIALIZED)) {
322
                            throw new ProfitMandiBusinessException("Email Id is required for insurance", "Email Id is required for insurance", "Email Id is required for insurance");
323
				for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
323
                        }
324
					serialNumbers.add(serialNumberDetail.getSerialNumber());
324
                        InsuranceModel im = new InsuranceModel();
325
					if (serialNumberDetail.getAmount() > 0) {
325
                        im.setBrand(item.getBrand());
326
						if (customer.getEmailId() == null || customer.getEmailId().equals("")) {
326
                        im.setColor(item.getColor());
327
							throw new ProfitMandiBusinessException("Email Id is required for insurance",
327
                        im.setModelName(item.getModelName() + item.getModelNumber());
328
									"Email Id is required for insurance", "Email Id is required for insurance");
328
                        im.setInsuranceAmount(serialNumberDetail.getAmount());
329
						}
329
                        im.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
330
						InsuranceModel im = new InsuranceModel();
330
                        im.setInsuranceId(serialNumberDetail.getInsurance());
331
						im.setBrand(item.getBrand());
331
                        im.setSerialNumber(serialNumberDetail.getSerialNumber());
332
						im.setColor(item.getColor());
332
                        im.setMemory(serialNumberDetail.getMemory());
333
						im.setModelName(item.getModelName() + item.getModelNumber());
333
                        im.setRam(serialNumberDetail.getRam());
334
						im.setInsuranceAmount(serialNumberDetail.getAmount());
334
                        im.setMfgDate(serialNumberDetail.getMfgDate());
335
						im.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
335
                        insuredModels.add(im);
336
						im.setInsuranceId(serialNumberDetail.getInsurance());
336
                        // Check for free insurance code
337
						im.setSerialNumber(serialNumberDetail.getSerialNumber());
337
                        try {
338
						im.setMemory(serialNumberDetail.getMemory());
338
                            Map<String, List<MobileInsurancePlan>> mobileInsurancePlanMap = insuranceService.getAllPlans(item.getId(), im.getDeviceSellingPrice());
339
						im.setRam(serialNumberDetail.getRam());
339
                            MobileInsurancePlan mobileInsurancePlan = mobileInsurancePlanMap.entrySet().stream().flatMap(x -> x.getValue().stream()).filter(x -> x.getProductId().equals(serialNumberDetail.getInsurance())).findFirst().get();
340
						im.setMfgDate(serialNumberDetail.getMfgDate());
340
                            LOGGER.info("OneAssist Plan - {}", mobileInsurancePlanMap);
341
						insuredModels.add(im);
341
                            LOGGER.info("SerialNumber Detqail InsuranceId - {}", serialNumberDetail.getInsurance());
342
						// Check for free insurance code
342
                            LOGGER.info("product description - {}", mobileInsurancePlan);
343
						try {
343
                            if (mobileInsurancePlan.getPlanName().equals("OneAssist Damage Protection Plan")) {
344
							Map<String, List<MobileInsurancePlan>> mobileInsurancePlanMap = insuranceService
344
                                MobileInsurancePlan freePlan = mobileInsurancePlanMap.get("Prolong Extendended Warranty(SmartDukaan Special Price)").get(0);
345
									.getAllPlans(item.getId(), im.getDeviceSellingPrice());
345
                                InsuranceModel imFree = new InsuranceModel();
346
							MobileInsurancePlan mobileInsurancePlan = mobileInsurancePlanMap.entrySet().stream()
346
                                imFree.setBrand(item.getBrand());
347
									.flatMap(x -> x.getValue().stream())
347
                                imFree.setColor(item.getColor());
348
									.filter(x -> x.getProductId().equals(serialNumberDetail.getInsurance())).findFirst()
348
                                imFree.setModelName(item.getModelName() + item.getModelNumber());
349
									.get();
349
                                imFree.setInsuranceAmount(0);
350
							LOGGER.info("OneAssist Plan - {}", mobileInsurancePlanMap);
350
                                imFree.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
351
							LOGGER.info("SerialNumber Detqail InsuranceId - {}", serialNumberDetail.getInsurance());
351
                                imFree.setInsuranceId(freePlan.getProductId());
352
							LOGGER.info("product description - {}", mobileInsurancePlan);
352
                                imFree.setSerialNumber(serialNumberDetail.getSerialNumber());
353
							if (mobileInsurancePlan.getPlanName().equals("OneAssist Damage Protection Plan")) {
353
                                imFree.setMemory(serialNumberDetail.getMemory());
354
								MobileInsurancePlan freePlan = mobileInsurancePlanMap
354
                                imFree.setRam(serialNumberDetail.getRam());
355
										.get("Prolong Extendended Warranty(SmartDukaan Special Price)").get(0);
355
                                imFree.setMfgDate(serialNumberDetail.getMfgDate());
356
								InsuranceModel imFree = new InsuranceModel();
356
                                insuredModels.add(imFree);
357
								imFree.setBrand(item.getBrand());
357
                            }
358
								imFree.setColor(item.getColor());
358
                        } catch (Exception e) {
359
								imFree.setModelName(item.getModelName() + item.getModelNumber());
359
                            LOGGER.error("Exception - {}", e);
360
								imFree.setInsuranceAmount(0);
360
                            throw new ProfitMandiBusinessException("problem fetching plans", "problem fetching plans", "problem fetching plans");
361
								imFree.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
361
                        }
362
								imFree.setInsuranceId(freePlan.getProductId());
362
                    }
363
								imFree.setSerialNumber(serialNumberDetail.getSerialNumber());
363
 
364
								imFree.setMemory(serialNumberDetail.getMemory());
364
                }
365
								imFree.setRam(serialNumberDetail.getRam());
365
            } else {
366
								imFree.setMfgDate(serialNumberDetail.getMfgDate());
366
                nonSerializedItemIds.add(customFofoOrderItem.getItemId());
367
								insuredModels.add(imFree);
367
            }
368
							}
368
        }
369
						} catch (Exception e) {
369
 
370
							LOGGER.error("Exception - {}", e);
370
        Map<Integer, Set<InventoryItem>> serializedInventoryItemMap = new HashMap<>();
371
							throw new ProfitMandiBusinessException("problem fetching plans", "problem fetching plans",
371
        Map<Integer, Set<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<>();
372
									"problem fetching plans");
372
        // Map<String, Float> serialNumberItemPrice = new HashMap<>();
373
						}
373
 
374
					}
374
        if (!serialNumbers.isEmpty()) {
375
 
375
            List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, serialNumbers, false);
376
				}
376
            LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
377
			} else {
377
            for (InventoryItem inventoryItem : serializedInventoryItems) {
378
				nonSerializedItemIds.add(customFofoOrderItem.getItemId());
378
                if (inventoryItem.getGoodQuantity() == 1) {
379
			}
379
                    if (serializedInventoryItemMap.containsKey(inventoryItem.getItemId())) {
380
		}
380
                        serializedInventoryItemMap.get(inventoryItem.getItemId()).add(inventoryItem);
381
 
381
                    } else {
382
		Map<Integer, Set<InventoryItem>> serializedInventoryItemMap = new HashMap<>();
382
                        Set<InventoryItem> itemIdInventoryItems = new HashSet<>();
383
		Map<Integer, Set<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<>();
383
                        itemIdInventoryItems.add(inventoryItem);
384
		// Map<String, Float> serialNumberItemPrice = new HashMap<>();
384
                        serializedInventoryItemMap.put(inventoryItem.getItemId(), itemIdInventoryItems);
385
 
385
                    }
386
		if (!serialNumbers.isEmpty()) {
386
                }
387
			List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId,
387
            }
388
					serialNumbers, false);
388
        }
389
			LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
389
 
390
			for (InventoryItem inventoryItem : serializedInventoryItems) {
390
        if (!nonSerializedItemIds.isEmpty()) {
391
				if (inventoryItem.getGoodQuantity() == 1) {
391
            List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoId, nonSerializedItemIds);
392
					if (serializedInventoryItemMap.containsKey(inventoryItem.getItemId())) {
392
            LOGGER.info("nonSerializedInventoryItems {}", nonSerializedInventoryItems);
393
						serializedInventoryItemMap.get(inventoryItem.getItemId()).add(inventoryItem);
393
            for (InventoryItem it : nonSerializedInventoryItems) {
394
					} else {
394
                if (it.getGoodQuantity() > 0) {
395
						Set<InventoryItem> itemIdInventoryItems = new HashSet<>();
395
                    if (nonSerializedInventoryItemMap.containsKey(it.getItemId())) {
396
						itemIdInventoryItems.add(inventoryItem);
396
                        nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
397
						serializedInventoryItemMap.put(inventoryItem.getItemId(), itemIdInventoryItems);
397
                    } else {
398
					}
398
                        Set<InventoryItem> tmp = new HashSet<>();
399
				}
399
                        tmp.add(it);
400
			}
400
                        nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
401
		}
401
                    }
402
 
402
                }
403
		if (!nonSerializedItemIds.isEmpty()) {
403
            }
404
			List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoId,
404
        }
405
					nonSerializedItemIds);
405
 
406
			LOGGER.info("nonSerializedInventoryItems {}", nonSerializedInventoryItems);
406
        this.validateItemsSerializedNonSerialized(items, itemIdCustomFofoOrderItemMap);
407
			for (InventoryItem it : nonSerializedInventoryItems) {
407
 
408
				if (it.getGoodQuantity() > 0) {
408
        Map<Integer, Set<InventoryItem>> inventoryItemsToBill = new HashMap<>();
409
					if (nonSerializedInventoryItemMap.containsKey(it.getItemId())) {
409
        Map<Integer, Integer> inventoryItemIdQuantityUsed = new HashMap<>(); // to keep track of inventoryitem quanity
410
						nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
410
        // used for scan records insertion
411
					} else {
411
 
412
						Set<InventoryItem> tmp = new HashSet<>();
412
        LOGGER.info("itemMap keys {}", itemMap.keySet());
413
						tmp.add(it);
413
        // Lets reduce quantity and decide what inventory items to use.
414
						nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
414
        for (Item item : items) {
415
					}
415
            if (item.getType().equals(ItemType.SERIALIZED)) {
416
				}
416
                // TODO:handle null
417
			}
417
                if (serializedInventoryItemMap.get(item.getId()) == null || itemIdCustomFofoOrderItemMap.get(item.getId()).getSerialNumberDetails().size() != serializedInventoryItemMap.get(item.getId()).size()) {
418
		}
418
 
419
 
419
                    List<String> invalidSerialNumbers = itemIdCustomFofoOrderItemMap.get(item.getId()).getSerialNumberDetails().stream().map(x -> x.getSerialNumber()).collect(Collectors.toList());
420
		this.validateItemsSerializedNonSerialized(items, itemIdCustomFofoOrderItemMap);
420
                    throw new ProfitMandiBusinessException("invalidSerialNumbers", invalidSerialNumbers, "FFORDR_1004");
421
 
421
                }
422
		Map<Integer, Set<InventoryItem>> inventoryItemsToBill = new HashMap<>();
422
                List<String> serialNumberList = liveDemoBillingRespository.selectAllSerialNumber();
423
		Map<Integer, Integer> inventoryItemIdQuantityUsed = new HashMap<>(); // to keep track of inventoryitem quanity
423
 
424
		// used for scan records insertion
424
                Set<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(item.getId());
425
 
425
                for (InventoryItem inventoryItem : inventoryItemsSerializedserialized) {
426
		LOGGER.info("itemMap keys {}", itemMap.keySet());
426
                    inventoryItem.setGoodQuantity(0);
427
		// Lets reduce quantity and decide what inventory items to use.
427
                    inventoryItemIdQuantityUsed.put(inventoryItem.getId(), 1);
428
		for (Item item : items) {
428
                    if (serialNumberList.contains(inventoryItem.getSerialNumber())) {
429
			if (item.getType().equals(ItemType.SERIALIZED)) {
429
                        LiveDemoSerialNumber liveDemoSerialNumber = liveDemoBillingRespository.selectBySerialNumber(inventoryItem.getSerialNumber());
430
				// TODO:handle null
430
                        liveDemoBillingRespository.delete(liveDemoSerialNumber);
431
				if (serializedInventoryItemMap.get(item.getId()) == null
431
                    }
432
						|| itemIdCustomFofoOrderItemMap.get(item.getId()).getSerialNumberDetails()
432
                }
433
								.size() != serializedInventoryItemMap.get(item.getId()).size()) {
433
                inventoryItemsToBill.put(item.getId(), inventoryItemsSerializedserialized);
434
 
434
            } else {
435
					List<String> invalidSerialNumbers = itemIdCustomFofoOrderItemMap.get(item.getId())
435
                Set<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(item.getId());
436
							.getSerialNumberDetails().stream().map(x -> x.getSerialNumber())
436
                int quantityToBill = itemIdCustomFofoOrderItemMap.get(item.getId()).getQuantity();
437
							.collect(Collectors.toList());
437
                int totalLeft = quantityToBill;
438
					throw new ProfitMandiBusinessException("invalidSerialNumbers", invalidSerialNumbers, "FFORDR_1004");
438
                Set<InventoryItem> inventoryItemsNonSerializedUsed = new HashSet<>();
439
				}
439
                if (inventoryItemsNonSerialized != null) {
440
				List<String> serialNumberList = liveDemoBillingRespository.selectAllSerialNumber();
440
                    for (InventoryItem inventoryItem : inventoryItemsNonSerialized) {
441
 
441
                        if (totalLeft > 0) {
442
				Set<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(item.getId());
442
                            int toUse = Math.min(totalLeft, inventoryItem.getGoodQuantity());
443
				for (InventoryItem inventoryItem : inventoryItemsSerializedserialized) {
443
                            inventoryItemIdQuantityUsed.put(inventoryItem.getId(), toUse);
444
					inventoryItem.setGoodQuantity(0);
444
                            inventoryItem.setGoodQuantity(inventoryItem.getGoodQuantity() - toUse);
445
					inventoryItemIdQuantityUsed.put(inventoryItem.getId(), 1);
445
                            totalLeft = totalLeft - toUse;
446
					if (serialNumberList.contains(inventoryItem.getSerialNumber())) {
446
                            inventoryItemsNonSerializedUsed.add(inventoryItem);
447
						LiveDemoSerialNumber liveDemoSerialNumber = liveDemoBillingRespository
447
                        }
448
								.selectBySerialNumber(inventoryItem.getSerialNumber());
448
                    }
449
						liveDemoBillingRespository.delete(liveDemoSerialNumber);
449
                }
450
					}
450
 
451
				}
451
                if (totalLeft > 0) {
452
				inventoryItemsToBill.put(item.getId(), inventoryItemsSerializedserialized);
452
                    // not enough quanity for non-serialized
453
			} else {
453
                    LOGGER.error("not enough quanity for non-serialized");
454
				Set<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(item.getId());
454
                    throw new ProfitMandiBusinessException("notEnoughQuantityForNonSerialized", totalLeft, "FFORDR_1005");
455
				int quantityToBill = itemIdCustomFofoOrderItemMap.get(item.getId()).getQuantity();
455
                }
456
				int totalLeft = quantityToBill;
456
                inventoryItemsToBill.put(item.getId(), inventoryItemsNonSerializedUsed);
457
				Set<InventoryItem> inventoryItemsNonSerializedUsed = new HashSet<>();
457
            }
458
				if (inventoryItemsNonSerialized != null) {
458
        }
459
					for (InventoryItem inventoryItem : inventoryItemsNonSerialized) {
459
 
460
						if (totalLeft > 0) {
460
        Map<Integer, PriceModel> itemIdMopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIdCustomFofoOrderItemMap.keySet(), fofoId);
461
							int toUse = Math.min(totalLeft, inventoryItem.getGoodQuantity());
461
        LOGGER.info("itemIdMopMap {}", itemIdMopPriceMap);
462
							inventoryItemIdQuantityUsed.put(inventoryItem.getId(), toUse);
462
        if (accessoriesDeals) {
463
							inventoryItem.setGoodQuantity(inventoryItem.getGoodQuantity() - toUse);
463
            this.validateDpPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
464
							totalLeft = totalLeft - toUse;
464
        } else {
465
							inventoryItemsNonSerializedUsed.add(inventoryItem);
465
            this.validateMopPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
466
						}
466
        }
467
					}
467
 
468
				}
468
        String fofoStoreCode = this.getFofoStoreCode(fofoId);
469
 
469
        String documentNumber = null;
470
				if (totalLeft > 0) {
470
        if (noGST) {
471
					// not enough quanity for non-serialized
471
            documentNumber = this.getSecurityDepositNumber(fofoId, fofoStoreCode);
472
					LOGGER.error("not enough quanity for non-serialized");
472
 
473
					throw new ProfitMandiBusinessException("notEnoughQuantityForNonSerialized", totalLeft,
473
        } else {
474
							"FFORDR_1005");
474
            documentNumber = this.getInvoiceNumber(fofoId, fofoStoreCode);
475
				}
475
        }
476
				inventoryItemsToBill.put(item.getId(), inventoryItemsNonSerializedUsed);
476
 
477
			}
477
        CustomerAddress customerAddress = customer.getCustomerAddress().stream().filter(x -> x.getId() == customCustomer.getCustomerAddressId()).findFirst().get();
478
		}
478
 
479
 
479
        FofoOrder fofoOrder = this.createAndGetFofoOrder(customer.getId(), customCustomer.getGstNumber(), fofoId, documentNumber, totalAmount, customerAddress.getId());
480
		Map<Integer, PriceModel> itemIdMopPriceMap = pricingService
480
 
481
				.getPurchasePriceMopPriceNotFound(itemIdCustomFofoOrderItemMap.keySet(), fofoId);
481
        this.createPaymentOptions(fofoOrder, createOrderRequest.getPaymentOptions());
482
		LOGGER.info("itemIdMopMap {}", itemIdMopPriceMap);
482
 
483
		if (accessoriesDeals) {
483
        int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
484
			this.validateDpPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
484
 
485
		} else {
485
        Address retailerAddress = addressRepository.selectById(retailerAddressId);
486
			this.validateMopPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
486
 
487
		}
487
        Integer stateId = null;
488
 
488
        if (customerAddress.getState().equals(retailerAddress.getState())) {
489
		String fofoStoreCode = this.getFofoStoreCode(fofoId);
489
            try {
490
		String documentNumber = null;
490
                State state = stateRepository.selectByName(customerAddress.getState());
491
		if (noGST) {
491
                stateId = Long.valueOf(state.getId()).intValue();
492
			documentNumber = this.getSecurityDepositNumber(fofoId, fofoStoreCode);
492
            } catch (Exception e) {
493
 
493
                LOGGER.error("Unable to get state rates");
494
		} else {
494
            }
495
			documentNumber = this.getInvoiceNumber(fofoId, fofoStoreCode);
495
        }
496
		}
496
 
497
 
497
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
498
		CustomerAddress customerAddress = customer.getCustomerAddress().stream()
498
            FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), stateId);
499
				.filter(x -> x.getId() == customCustomer.getCustomerAddressId()).findFirst().get();
499
 
500
 
500
            Set<InventoryItem> inventoryItems = inventoryItemsToBill.get(customFofoOrderItem.getItemId());
501
		FofoOrder fofoOrder = this.createAndGetFofoOrder(customer.getId(), customCustomer.getGstNumber(), fofoId,
501
 
502
				documentNumber, totalAmount, customerAddress.getId());
502
            this.createFofoLineItem(fofoOrderItem.getId(), inventoryItems, inventoryItemIdQuantityUsed);
503
 
503
 
504
		this.createPaymentOptions(fofoOrder, createOrderRequest.getPaymentOptions());
504
            this.updateCurrentInventorySnapshot(currentInventorySnapshots, fofoId, customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
505
 
505
 
506
		int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
506
            this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
507
 
507
        }
508
		Address retailerAddress = addressRepository.selectById(retailerAddressId);
508
 
509
 
509
        List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
510
		Integer stateId = null;
510
 
511
		if (customerAddress.getState().equals(retailerAddress.getState())) {
511
        boolean smartPhone = false;
512
			try {
512
        for (FofoOrderItem fofoItem : fofoItems) {
513
				State state = stateRepository.selectByName(customerAddress.getState());
513
            Item orderItem = itemRepository.selectById(fofoItem.getItemId());
514
				stateId = Long.valueOf(state.getId()).intValue();
514
            if (orderItem.isSmartPhone()) {
515
			} catch (Exception e) {
515
                smartPhone = true;
516
				LOGGER.error("Unable to get state rates");
516
            }
517
			}
517
 
518
		}
518
        }
519
 
519
 
520
		for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
520
        if (smartPhone) {
521
			FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(),
521
            this.createAndGetHygieneData(fofoOrder.getId(), fofoOrder.getFofoId());
522
					itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), stateId);
522
        }
523
 
523
        // insurance calculation is insurance flag is enabled
524
			Set<InventoryItem> inventoryItems = inventoryItemsToBill.get(customFofoOrderItem.getItemId());
524
        //
525
 
525
        if (insuredModels.size() > 0) {
526
			this.createFofoLineItem(fofoOrderItem.getId(), inventoryItems, inventoryItemIdQuantityUsed);
526
            LOGGER.info("Processing insurane for serialNumbers");
527
 
527
            LOGGER.info("InsuranceModels {}", insuredModels);
528
			this.updateCurrentInventorySnapshot(currentInventorySnapshots, fofoId, customFofoOrderItem.getItemId(),
528
            LocalDate customerDateOfBirth = LocalDate.from(createOrderRequest.getCustomer().getDateOfBirth());
529
					customFofoOrderItem.getQuantity());
529
            fofoOrder.setDateOfBirth(customerDateOfBirth);
530
 
530
            for (InsuranceModel insuranceModel : insuredModels) {
531
			this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed,
531
                LOGGER.info("Creating insurance for {}", insuranceModel.getInsuranceId());
532
					fofoOrder.getId());
532
                insuranceService.createInsurance(fofoOrder, insuranceModel);
533
		}
533
            }
534
 
534
        }
535
		List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
535
 
536
 
536
        schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
537
		boolean smartPhone = false;
537
 
538
		for (FofoOrderItem fofoItem : fofoItems) {
538
        if (createOrderRequest.getPoId() != 0) {
539
			Item orderItem = itemRepository.selectById(fofoItem.getItemId());
539
            PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
540
			if (orderItem.isSmartPhone()) {
540
            po.setBilledAmount(po.getBilledAmount() + totalAmount);
541
				smartPhone = true;
541
            PendingOrderItem poi = pendingOrderItemRepository.selectById(createOrderRequest.getPoItemId());
542
			}
542
            poi.setStatus(OrderStatus.BILLED);
543
 
543
            poi.setBilledTimestamp(LocalDateTime.now());
544
		}
544
        }
545
 
545
 
546
		if (smartPhone) {
546
        LocalDate startDate = LocalDate.of(2023, 01, 13);
547
			this.createAndGetHygieneData(fofoOrder.getId(), fofoOrder.getFofoId());
547
        LocalDate endDate = LocalDate.of(2023, 01, 27);
548
		}
548
 
549
		// insurance calculation is insurance flag is enabled
549
        if (smartPhone) {
550
		//
550
            if (LocalDateTime.now().isAfter(startDate.atStartOfDay()) && LocalDateTime.now().isBefore(endDate.atStartOfDay())) {
551
		if (insuredModels.size() > 0) {
551
 
552
			LOGGER.info("Processing insurane for serialNumbers");
552
                try {
553
			LOGGER.info("InsuranceModels {}", insuredModels);
553
                    this.sendAppDownloadBillingOffer(customer.getMobileNumber());
554
			LocalDate customerDateOfBirth = LocalDate.from(createOrderRequest.getCustomer().getDateOfBirth());
554
                } catch (Exception e) {
555
			fofoOrder.setDateOfBirth(customerDateOfBirth);
555
                    // TODO Auto-generated catch block
556
			for (InsuranceModel insuranceModel : insuredModels) {
556
                    e.printStackTrace();
557
				LOGGER.info("Creating insurance for {}", insuranceModel.getInsuranceId());
557
                }
558
				insuranceService.createInsurance(fofoOrder, insuranceModel);
558
                this.createScratchOffer(fofoOrder.getInvoiceNumber(), fofoOrder.getCustomerId());
559
			}
559
            }
560
		}
560
        }
561
 
561
        return fofoOrder.getId();
562
		schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
562
    }
563
 
563
 
564
		if (createOrderRequest.getPoId() != 0) {
564
    public void sendAppDownloadBillingOffer(String mobileNumber) throws Exception {
565
			PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
565
        // In case of Cant receive SMS?
566
			po.setBilledAmount(po.getBilledAmount() + totalAmount);
566
        // String mailMessage = java.text.MessageFormat.format(text, otp.getOtp());
567
			PendingOrderItem poi = pendingOrderItemRepository.selectById(createOrderRequest.getPoItemId());
567
        String sdurl = "http://surl.li/anhfn";
568
			poi.setStatus(OrderStatus.BILLED);
568
        try {
569
			poi.setBilledTimestamp(LocalDateTime.now());
569
            if (prodEnv) {
570
		}
570
                this.sendSms(APP_DOWNLOAD_BILLING_TEMPLATE_ID, String.format(APP_DOWNLOAD_BILLING_OFFER, sdurl), mobileNumber);
571
 
571
            }
572
		LocalDate startDate = LocalDate.of(2023, 01, 13);
572
        } catch (Exception e) {
573
		LocalDate endDate = LocalDate.of(2023, 01, 27);
573
            e.printStackTrace();
574
 
574
        }
575
		if (smartPhone) {
575
 
576
			if (LocalDateTime.now().isAfter(startDate.atStartOfDay())
576
    }
577
					&& LocalDateTime.now().isBefore(endDate.atStartOfDay())) {
577
 
578
 
578
    public void sendSms(String dltTemplateId, String message, String mobileNumber) throws Exception {
579
				try {
579
        Map<String, String> map = new HashMap<>();
580
					this.sendAppDownloadBillingOffer(customer.getMobileNumber());
580
 
581
				} catch (Exception e) {
581
        map.put("sender", SENDER);
582
					// TODO Auto-generated catch block
582
        map.put("messagetype", "TXT");
583
					e.printStackTrace();
583
        map.put("apikey", "b866f7-c6c483-682ff5-054420-ad9e2c");
584
				}
584
 
585
				this.createScratchOffer(fofoOrder.getInvoiceNumber(), fofoOrder.getCustomerId());
585
        map.put("numbers", "91" + mobileNumber);
586
			}
586
        LOGGER.info("Message {}", message);
587
		}
587
        // OTP Message Template
588
		return fofoOrder.getId();
588
        map.put("message", message);
589
	}
589
        map.put("dlttempid", dltTemplateId);
590
 
590
 
591
	public void sendAppDownloadBillingOffer(String mobileNumber) throws Exception {
591
        String response = restClient.post(SMS_GATEWAY, map, new HashMap<>());
592
		// In case of Cant receive SMS?
592
        LOGGER.info(response);
593
		// String mailMessage = java.text.MessageFormat.format(text, otp.getOtp());
593
 
594
		String sdurl = "http://surl.li/anhfn";
594
    }
595
		try {
595
 
596
			if (prodEnv) {
596
    private void createScratchOffer(String invoiceNumber, int customerId) {
597
				this.sendSms(APP_DOWNLOAD_BILLING_TEMPLATE_ID, String.format(APP_DOWNLOAD_BILLING_OFFER, sdurl),
597
 
598
						mobileNumber);
598
        /*
599
			}
599
         * ScratchOffer so = new ScratchOffer(); so.setInvoiceNumber(invoiceNumber);
600
		} catch (Exception e) {
600
         * so.setOfferName(ScratchedGift.EW); so.setScratched(false);
601
			e.printStackTrace();
601
         * so.setCreatedTimestamp(LocalDateTime.now());
602
		}
602
         * so.setExpiredTimestamp(so.getCreatedTimestamp().plusDays(1));
603
 
603
         * so.setUnlockedAt(LocalDateTime.now()); so.setCustomerId(customerId);
604
	}
604
         * scratchOfferRepository.persist(so);
605
 
605
         */
606
	public void sendSms(String dltTemplateId, String message, String mobileNumber) throws Exception {
606
        LocalDateTime endDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 27, 21, 00);
607
		Map<String, String> map = new HashMap<>();
607
 
608
 
608
        ScratchOffer so2 = new ScratchOffer();
609
		map.put("sender", SENDER);
609
        so2.setInvoiceNumber(invoiceNumber);
610
		map.put("messagetype", "TXT");
610
        so2.setScratched(false);
611
		map.put("apikey", "b866f7-c6c483-682ff5-054420-ad9e2c");
611
        so2.setCreatedTimestamp(LocalDateTime.now());
612
 
612
        so2.setExpiredTimestamp(endDate.plusDays(1).toLocalDate().atTime(LocalTime.MAX));
613
		map.put("numbers", "91" + mobileNumber);
613
        so2.setOfferName(ScratchedGift.BLNT);
614
		LOGGER.info("Message {}", message);
614
        so2.setCustomerId(customerId);
615
		// OTP Message Template
615
 
616
		map.put("message", message);
616
        LocalDate date = LocalDate.now();
617
		map.put("dlttempid", dltTemplateId);
617
        LocalDateTime seven = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 19, 0);
618
 
618
        LocalDateTime nine = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 21, 0);
619
		String response = restClient.post(SMS_GATEWAY, map, new HashMap<>());
619
 
620
		LOGGER.info(response);
620
        if (LocalDateTime.now().isAfter(seven)) {
621
 
621
            so2.setUnlockedAt(nine.plusDays(1));
622
	}
622
        } else {
623
 
623
            so2.setUnlockedAt(nine);
624
	private void createScratchOffer(String invoiceNumber, int customerId) {
624
        }
625
 
625
 
626
		/*
626
        scratchOfferRepository.persist(so2);
627
		 * ScratchOffer so = new ScratchOffer(); so.setInvoiceNumber(invoiceNumber);
627
 
628
		 * so.setOfferName(ScratchedGift.EW); so.setScratched(false);
628
    }
629
		 * so.setCreatedTimestamp(LocalDateTime.now());
629
 
630
		 * so.setExpiredTimestamp(so.getCreatedTimestamp().plusDays(1));
630
    private HygieneData createAndGetHygieneData(int id, int fofoId) {
631
		 * so.setUnlockedAt(LocalDateTime.now()); so.setCustomerId(customerId);
631
        HygieneData hygieneData = new HygieneData();
632
		 * scratchOfferRepository.persist(so);
632
        hygieneData.setOrderId(id);
633
		 */
633
        hygieneData.setFofoId(fofoId);
634
		LocalDateTime endDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 27, 21, 00);
634
        hygieneData.setCreatedTimestamp(LocalDateTime.now());
635
 
635
        hygieneDataRepository.persist(hygieneData);
636
		ScratchOffer so2 = new ScratchOffer();
636
 
637
		so2.setInvoiceNumber(invoiceNumber);
637
        return hygieneData;
638
		so2.setScratched(false);
638
    }
639
		so2.setCreatedTimestamp(LocalDateTime.now());
639
 
640
		so2.setExpiredTimestamp(endDate.plusDays(1).toLocalDate().atTime(LocalTime.MAX));
640
    @Override
641
		so2.setOfferName(ScratchedGift.BLNT);
641
    public String getInvoiceNumber(int fofoId, String fofoStoreCode) {
642
		so2.setCustomerId(customerId);
642
        InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
643
 
643
        try {
644
		LocalDate date = LocalDate.now();
644
            invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
645
		LocalDateTime seven = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 19, 0);
645
            invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
646
		LocalDateTime nine = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 21, 0);
646
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
647
 
647
            invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
648
		if (LocalDateTime.now().isAfter(seven)) {
648
            invoiceNumberGenerationSequence.setFofoId(fofoId);
649
			so2.setUnlockedAt(nine.plusDays(1));
649
            invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
650
		} else {
650
            invoiceNumberGenerationSequence.setSequence(1);
651
			so2.setUnlockedAt(nine);
651
        }
652
		}
652
        invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
653
 
653
        return invoiceNumberGenerationSequence.getPrefix() + "/" + invoiceNumberGenerationSequence.getSequence();
654
		scratchOfferRepository.persist(so2);
654
    }
655
 
655
 
656
	}
656
    private String getSecurityDepositNumber(int fofoId, String fofoStoreCode) {
657
 
657
        InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
658
	private HygieneData createAndGetHygieneData(int id, int fofoId) {
658
        try {
659
		HygieneData hygieneData = new HygieneData();
659
            invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
660
		hygieneData.setOrderId(id);
660
            invoiceNumberGenerationSequence.setChallanNumberSequence(invoiceNumberGenerationSequence.getChallanNumberSequence() + 1);
661
		hygieneData.setFofoId(fofoId);
661
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
662
		hygieneData.setCreatedTimestamp(LocalDateTime.now());
662
            invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
663
		hygieneDataRepository.persist(hygieneData);
663
            invoiceNumberGenerationSequence.setFofoId(fofoId);
664
 
664
            invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
665
		return hygieneData;
665
            invoiceNumberGenerationSequence.setChallanNumberSequence(1);
666
	}
666
        }
667
 
667
        invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
668
	@Override
668
        return invoiceNumberGenerationSequence.getPrefix() + "/SEC" + invoiceNumberGenerationSequence.getChallanNumberSequence();
669
	public String getInvoiceNumber(int fofoId, String fofoStoreCode) {
669
    }
670
		InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
670
 
671
		try {
671
    private Set<String> serialNumberDetailsToSerialNumbers(Set<SerialNumberDetail> serialNumberDetails) {
672
			invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
672
        Set<String> serialNumbers = new HashSet<>();
673
			invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
673
        for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
674
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
674
            if (serialNumberDetail.getSerialNumber() != null && !serialNumberDetail.getSerialNumber().isEmpty()) {
675
			invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
675
                serialNumbers.add(serialNumberDetail.getSerialNumber());
676
			invoiceNumberGenerationSequence.setFofoId(fofoId);
676
            }
677
			invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
677
        }
678
			invoiceNumberGenerationSequence.setSequence(1);
678
        return serialNumbers;
679
		}
679
    }
680
		invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
680
 
681
		return invoiceNumberGenerationSequence.getPrefix() + "/" + invoiceNumberGenerationSequence.getSequence();
681
    @Override
682
	}
682
    public InvoicePdfModel getInvoicePdfModel(int orderId) throws ProfitMandiBusinessException {
683
 
683
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
684
	private String getSecurityDepositNumber(int fofoId, String fofoStoreCode) {
684
        return this.getInvoicePdfModel(fofoOrder);
685
		InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
685
    }
686
		try {
686
 
687
			invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
687
    @Override
688
			invoiceNumberGenerationSequence
688
    @Cacheable(value = "order.dummymodel", cacheManager = "oneDayCacheManager")
689
					.setChallanNumberSequence(invoiceNumberGenerationSequence.getChallanNumberSequence() + 1);
689
    public InvoicePdfModel getDummyPdfModel(String serialNumber) throws ProfitMandiBusinessException {
690
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
690
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectWarehouseInventoryItemBySerailNumbers(Arrays.asList(serialNumber));
691
			invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
691
        if (warehouseInventoryItems.size() > 0) {
692
			invoiceNumberGenerationSequence.setFofoId(fofoId);
692
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItems.get(0);
693
			invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
693
            int currentQuantity = warehouseInventoryItems.get(0).getCurrentQuantity();
694
			invoiceNumberGenerationSequence.setChallanNumberSequence(1);
694
            if (currentQuantity > 0) {
695
		}
695
                throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number exist in our warehouse");
696
		invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
696
            } else {
697
		return invoiceNumberGenerationSequence.getPrefix() + "/SEC"
697
                try {
698
				+ invoiceNumberGenerationSequence.getChallanNumberSequence();
698
                    InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(serialNumber);
699
	}
699
                    if (inventoryItem.getGoodQuantity() > 0) {
700
 
700
                        throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number is not yet billed by the partner");
701
	private Set<String> serialNumberDetailsToSerialNumbers(Set<SerialNumberDetail> serialNumberDetails) {
701
                    } else {
702
		Set<String> serialNumbers = new HashSet<>();
702
                        List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItem.getId());
703
		for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
703
                        Optional<ScanRecord> scanRecord = scanRecords.stream().filter(x -> x.getOrderId() != 0).findFirst();
704
			if (serialNumberDetail.getSerialNumber() != null && !serialNumberDetail.getSerialNumber().isEmpty()) {
704
                        if (scanRecord.isPresent()) {
705
				serialNumbers.add(serialNumberDetail.getSerialNumber());
705
                            FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.get().getOrderId());
706
			}
706
                            orderIdsConsumed.add(fofoOrder.getId());
707
		}
707
                            return this.getInvoicePdfModel(fofoOrder);
708
		return serialNumbers;
708
                        } else {
709
	}
709
                            throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number returned by partner, but in transit");
710
 
710
                        }
711
	@Override
711
                    }
712
	public InvoicePdfModel getInvoicePdfModel(int orderId) throws ProfitMandiBusinessException {
712
                } catch (Exception e) {
713
		FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
713
                    int itemId = warehouseInventoryItem.getItemId();
714
		return this.getInvoicePdfModel(fofoOrder);
714
                    if (serialNumberOrderIdMap.containsKey(serialNumber)) {
715
	}
715
                        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(serialNumberOrderIdMap.get(serialNumber));
716
 
716
                        InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
717
	@Override
717
                        this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
718
	@Cacheable(value = "order.dummymodel", cacheManager = "oneDayCacheManager")
718
                        return pdfModel;
719
	public InvoicePdfModel getDummyPdfModel(String serialNumber) throws ProfitMandiBusinessException {
719
                    }
720
		List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository
720
                    // Map this serialNumber for dummy billing
721
				.selectWarehouseInventoryItemBySerailNumbers(Arrays.asList(serialNumber));
721
                    LocalDateTime grnDate = warehouseInventoryItem.getCreated();
722
		if (warehouseInventoryItems.size() > 0) {
722
                    Random random = new Random();
723
			WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItems.get(0);
723
                    int randomDays = random.ints(2, 15).findFirst().getAsInt();
724
			int currentQuantity = warehouseInventoryItems.get(0).getCurrentQuantity();
724
                    LocalDateTime saleDate = grnDate.plusDays(randomDays);
725
			if (currentQuantity > 0) {
725
                    if (saleDate.isAfter(LocalDate.now().atStartOfDay())) {
726
				throw new ProfitMandiBusinessException("Serial Number", serialNumber,
726
                        saleDate = LocalDateTime.now().minusDays(2);
727
						"Serial Number exist in our warehouse");
727
                    }
728
			} else {
728
                    Random offsetRandom = new Random();
729
				try {
729
                    int offset = offsetRandom.ints(2, 100).findFirst().getAsInt();
730
					InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(serialNumber);
730
                    FofoOrder fofoOrder = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset);
731
					if (inventoryItem.getGoodQuantity() > 0) {
731
                    while (orderIdsConsumed.contains(fofoOrder.getId())) {
732
						throw new ProfitMandiBusinessException("Serial Number", serialNumber,
732
                        Random offsetRandom2 = new Random();
733
								"Serial Number is not yet billed by the partner");
733
                        int offset2 = offsetRandom2.ints(2, 100).findFirst().getAsInt();
734
					} else {
734
                        FofoOrder fofoOrder2 = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset2);
735
						List<ScanRecord> scanRecords = scanRecordRepository
735
                        if (fofoOrder2 != null) {
736
								.selectByInventoryItemId(inventoryItem.getId());
736
                            fofoOrder = fofoOrder2;
737
						Optional<ScanRecord> scanRecord = scanRecords.stream().filter(x -> x.getOrderId() != 0)
737
                        }
738
								.findFirst();
738
                    }
739
						if (scanRecord.isPresent()) {
739
                    InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
740
							FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.get().getOrderId());
740
                    orderIdsConsumed.add(fofoOrder.getId());
741
							orderIdsConsumed.add(fofoOrder.getId());
741
                    this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
742
							return this.getInvoicePdfModel(fofoOrder);
742
                    return pdfModel;
743
						} else {
743
 
744
							throw new ProfitMandiBusinessException("Serial Number", serialNumber,
744
                }
745
									"Serial Number returned by partner, but in transit");
745
            }
746
						}
746
        } else {
747
					}
747
            throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number does not exist in our warehouse");
748
				} catch (Exception e) {
748
        }
749
					int itemId = warehouseInventoryItem.getItemId();
749
    }
750
					if (serialNumberOrderIdMap.containsKey(serialNumber)) {
750
 
751
						FofoOrder fofoOrder = fofoOrderRepository
751
    void modifyDummyModel(FofoOrder fofoOrder, InvoicePdfModel pdfModel, int itemId, String serialNumber) throws ProfitMandiBusinessException {
752
								.selectByOrderId(serialNumberOrderIdMap.get(serialNumber));
752
 
753
						InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
753
        int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
754
						this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
754
 
755
						return pdfModel;
755
        Address retailerAddress = addressRepository.selectById(retailerAddressId);
756
					}
756
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
757
					// Map this serialNumber for dummy billing
757
 
758
					LocalDateTime grnDate = warehouseInventoryItem.getCreated();
758
        CustomerAddress customerAddress = customer.getCustomerAddress().stream().filter(x -> x.getId() == fofoOrder.getCustomerAddressId()).findFirst().get();
759
					Random random = new Random();
759
 
760
					int randomDays = random.ints(2, 15).findFirst().getAsInt();
760
        Integer stateId = null;
761
					LocalDateTime saleDate = grnDate.plusDays(randomDays);
761
        if (customerAddress.getState().equals(retailerAddress.getState())) {
762
					if (saleDate.isAfter(LocalDate.now().atStartOfDay())) {
762
            try {
763
						saleDate = LocalDateTime.now().minusDays(2);
763
                // stateId =
764
					}
764
                // Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
765
					Random offsetRandom = new Random();
765
 
766
					int offset = offsetRandom.ints(2, 100).findFirst().getAsInt();
766
                stateId = Long.valueOf(stateRepository.selectByName(customerAddress.getState()).getId()).intValue();
767
					FofoOrder fofoOrder = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset);
767
            } catch (Exception e) {
768
					while (orderIdsConsumed.contains(fofoOrder.getId())) {
768
                LOGGER.error("Unable to get state rates");
769
						Random offsetRandom2 = new Random();
769
            }
770
						int offset2 = offsetRandom2.ints(2, 100).findFirst().getAsInt();
770
        }
771
						FofoOrder fofoOrder2 = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset2);
771
        CustomOrderItem cli = pdfModel.getOrderItems().stream().findFirst().get();
772
						if (fofoOrder2 != null) {
772
        List<FofoOrderItem> fofoOrderItems = Arrays.asList(this.getDummyFofoOrderItem(itemId, fofoOrder.getId(), serialNumber, stateId));
773
							fofoOrder = fofoOrder2;
773
        pdfModel.setPaymentOptions(pdfModel.getPaymentOptions().stream().limit(1).collect(Collectors.toList()));
774
						}
774
        CustomPaymentOption paymentOption = pdfModel.getPaymentOptions().get(0);
775
					}
775
        paymentOption.setAmount(fofoOrderItems.get(0).getMop());
776
					InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
776
        Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
777
					orderIdsConsumed.add(fofoOrder.getId());
777
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
778
					this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
778
            CustomOrderItem customFofoOrderItem = new CustomOrderItem();
779
					return pdfModel;
779
            float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
780
 
780
            float taxableSellingPrice = fofoOrderItem.getSellingPrice() / (1 + totalTaxRate / 100);
781
				}
781
            float taxableDiscountPrice = fofoOrderItem.getDiscount() / (1 + totalTaxRate / 100);
782
			}
782
 
783
		} else {
783
            customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
784
			throw new ProfitMandiBusinessException("Serial Number", serialNumber,
784
            customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " " + fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
785
					"Serial Number does not exist in our warehouse");
785
            Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
786
		}
786
            // LOGGER.info("serialNumbers {}", serialNumbers);
787
	}
787
            // LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
788
 
788
            if (!serialNumbers.isEmpty()) {
789
	void modifyDummyModel(FofoOrder fofoOrder, InvoicePdfModel pdfModel, int itemId, String serialNumber)
789
                customFofoOrderItem.setDescription(
790
			throws ProfitMandiBusinessException {
790
                        customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
791
 
791
            }
792
		int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
792
            customFofoOrderItem.setRate(taxableSellingPrice);
793
 
793
            customFofoOrderItem.setDiscount(taxableDiscountPrice);
794
		Address retailerAddress = addressRepository.selectById(retailerAddressId);
794
            customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
795
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
795
            customFofoOrderItem.setNetAmount(
796
 
796
                    (fofoOrderItem.getSellingPrice() - fofoOrderItem.getDiscount()) * fofoOrderItem.getQuantity());
797
		CustomerAddress customerAddress = customer.getCustomerAddress().stream()
797
            float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
798
				.filter(x -> x.getId() == fofoOrder.getCustomerAddressId()).findFirst().get();
798
            float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
799
 
799
            float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
800
		Integer stateId = null;
800
            customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
801
		if (customerAddress.getState().equals(retailerAddress.getState())) {
801
            customFofoOrderItem.setIgstAmount(igstAmount);
802
			try {
802
            customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
803
				// stateId =
803
            customFofoOrderItem.setCgstAmount(cgstAmount);
804
				// Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
804
            customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
805
 
805
            customFofoOrderItem.setSgstAmount(sgstAmount);
806
				stateId = Long.valueOf(stateRepository.selectByName(customerAddress.getState()).getId()).intValue();
806
            customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
807
			} catch (Exception e) {
807
            customerFofoOrderItems.add(customFofoOrderItem);
808
				LOGGER.error("Unable to get state rates");
808
        }
809
			}
809
        pdfModel.setTotalAmount(paymentOption.getAmount());
810
		}
810
        pdfModel.setOrderItems(customerFofoOrderItems);
811
		CustomOrderItem cli = pdfModel.getOrderItems().stream().findFirst().get();
811
 
812
		List<FofoOrderItem> fofoOrderItems = Arrays
812
    }
813
				.asList(this.getDummyFofoOrderItem(itemId, fofoOrder.getId(), serialNumber, stateId));
813
 
814
		pdfModel.setPaymentOptions(pdfModel.getPaymentOptions().stream().limit(1).collect(Collectors.toList()));
814
    private InvoicePdfModel getInvoicePdfModel(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
815
		CustomPaymentOption paymentOption = pdfModel.getPaymentOptions().get(0);
815
 
816
		paymentOption.setAmount(fofoOrderItems.get(0).getMop());
816
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository.selectByReferenceIdAndTypes(fofoOrder.getId(), Arrays.asList(PaymentOptionReferenceType.ORDER, PaymentOptionReferenceType.INSURANCE));
817
		Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
817
 
818
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
818
        List<CustomPaymentOption> paymentOptions = new ArrayList<>();
819
			CustomOrderItem customFofoOrderItem = new CustomOrderItem();
819
 
820
			float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate()
820
        InvoicePdfModel pdfModel = new InvoicePdfModel();
821
					+ fofoOrderItem.getCgstRate();
821
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
822
			float taxableSellingPrice = fofoOrderItem.getSellingPrice() / (1 + totalTaxRate / 100);
822
            CustomPaymentOption cpi = new CustomPaymentOption();
823
			float taxableDiscountPrice = fofoOrderItem.getDiscount() / (1 + totalTaxRate / 100);
823
            cpi.setAmount(paymentOptionTransaction.getAmount());
824
 
824
            cpi.setPaymentOption(
825
			customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
825
                    paymentOptionRepository.selectById(paymentOptionTransaction.getPaymentOptionId()).getName());
826
			customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " "
826
            paymentOptions.add(cpi);
827
					+ fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
827
        }
828
			Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
828
        List<FofoOrderItem> fofoOrderItems = this.getByOrderId(fofoOrder.getId());
829
			// LOGGER.info("serialNumbers {}", serialNumbers);
829
 
830
			// LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
830
        pdfModel.setTitle("Retailer Invoice");
831
			if (!serialNumbers.isEmpty()) {
831
        Optional<FofoOrderItem> fofoOrderItemOptional = fofoOrderItems.stream().findAny();
832
				customFofoOrderItem.setDescription(
832
        if (fofoOrderItemOptional.isPresent() && fofoOrderItemOptional.get().equals("NOGST")) {
833
						customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
833
            pdfModel.setTitle("Security Deposit Receipt");
834
			}
834
        }
835
			customFofoOrderItem.setRate(taxableSellingPrice);
835
        pdfModel.setPaymentOptions(paymentOptions);
836
			customFofoOrderItem.setDiscount(taxableDiscountPrice);
836
        pdfModel.setAuther("SmartDukaan");
837
			customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
837
        pdfModel.setInvoiceDate(FormattingUtils.formatDate(fofoOrder.getCreateTimestamp()));
838
			customFofoOrderItem.setNetAmount(
838
 
839
					(fofoOrderItem.getSellingPrice() - fofoOrderItem.getDiscount()) * fofoOrderItem.getQuantity());
839
        // insurance calculation
840
			float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
840
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
841
			float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
841
        Set<CustomInsurancePolicy> customInsurancePolicies = new HashSet<>();
842
			float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
842
        final float totalInsuranceTaxRate = 18;
843
			customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
843
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
844
			customFofoOrderItem.setIgstAmount(igstAmount);
844
            float taxableInsurancePrice = insurancePolicy.getSaleAmount() / (1 + totalInsuranceTaxRate / 100);
845
			customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
845
            CustomInsurancePolicy customInsurancePolicy = new CustomInsurancePolicy();
846
			customFofoOrderItem.setCgstAmount(cgstAmount);
846
            customInsurancePolicy.setDescription(insurancePolicy.getPolicyPlan() + " for Device #" + insurancePolicy.getSerialNumber() + "\n Plan Reference - " + insurancePolicy.getPolicyNumber());
847
			customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
847
            customInsurancePolicy.setHsnCode("998716");
848
			customFofoOrderItem.setSgstAmount(sgstAmount);
848
            customInsurancePolicy.setRate(taxableInsurancePrice);
849
			customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
849
            customInsurancePolicy.setIgstRate(18);
850
			customerFofoOrderItems.add(customFofoOrderItem);
850
            customInsurancePolicy.setIgstAmount(taxableInsurancePrice * 18 / 100);
851
		}
851
            customInsurancePolicy.setCgstRate(9);
852
		pdfModel.setTotalAmount(paymentOption.getAmount());
852
            customInsurancePolicy.setCgstAmount(taxableInsurancePrice * 9 / 100);
853
		pdfModel.setOrderItems(customerFofoOrderItems);
853
            customInsurancePolicy.setSgstRate(9);
854
 
854
            customInsurancePolicy.setSgstAmount(taxableInsurancePrice * 9 / 100);
855
	}
855
            customInsurancePolicy.setNetAmount(insurancePolicy.getSaleAmount());
856
 
856
            customInsurancePolicies.add(customInsurancePolicy);
857
	private InvoicePdfModel getInvoicePdfModel(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
857
        }
858
 
858
        pdfModel.setInsurancePolicies(customInsurancePolicies);
859
		List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
859
 
860
				.selectByReferenceIdAndTypes(fofoOrder.getId(),
860
        pdfModel.setCustomer(getCustomCustomer(fofoOrder));
861
						Arrays.asList(PaymentOptionReferenceType.ORDER, PaymentOptionReferenceType.INSURANCE));
861
        pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
862
 
862
        pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
863
		List<CustomPaymentOption> paymentOptions = new ArrayList<>();
863
 
864
 
864
        Retailer retailer = retailerRepository.selectById(fofoOrder.getFofoId());
865
		InvoicePdfModel pdfModel = new InvoicePdfModel();
865
        PrivateDealUser privateDealUser = null;
866
		for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
866
        try {
867
			CustomPaymentOption cpi = new CustomPaymentOption();
867
            privateDealUser = privateDealUserRepository.selectById(retailer.getId());
868
			cpi.setAmount(paymentOptionTransaction.getAmount());
868
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
869
			cpi.setPaymentOption(
869
            LOGGER.error("Private Deal User not found : ", profitMandiBusinessException);
870
					paymentOptionRepository.selectById(paymentOptionTransaction.getPaymentOptionId()).getName());
870
        }
871
			paymentOptions.add(cpi);
871
 
872
		}
872
        User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
873
		List<FofoOrderItem> fofoOrderItems = this.getByOrderId(fofoOrder.getId());
873
        CustomRetailer customRetailer = new CustomRetailer();
874
 
874
        customRetailer.setBusinessName(retailer.getName());
875
		pdfModel.setTitle("Retailer Invoice");
875
        customRetailer.setMobileNumber(user.getMobileNumber());
876
		Optional<FofoOrderItem> fofoOrderItemOptional = fofoOrderItems.stream().findAny();
876
        // customRetailer.setTinNumber(retailer.getNumber());
877
		if (fofoOrderItemOptional.isPresent() && fofoOrderItemOptional.get().equals("NOGST")) {
877
        if (privateDealUser == null) {
878
			pdfModel.setTitle("Security Deposit Receipt");
878
            customRetailer.setGstNumber(null);
879
		}
879
        } else {
880
		pdfModel.setPaymentOptions(paymentOptions);
880
            if (null != privateDealUser.getCounterId()) {
881
		pdfModel.setAuther("SmartDukaan");
881
                Counter counter = counterRepository.selectById(privateDealUser.getCounterId());
882
		pdfModel.setInvoiceDate(FormattingUtils.formatDate(fofoOrder.getCreateTimestamp()));
882
                customRetailer.setGstNumber(counter.getGstin());
883
 
883
            } else {
884
		// insurance calculation
884
                customRetailer.setGstNumber(null);
885
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
885
            }
886
				.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
886
        }
887
		Set<CustomInsurancePolicy> customInsurancePolicies = new HashSet<>();
887
        Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
888
		final float totalInsuranceTaxRate = 18;
888
        customRetailer.setAddress(this.createCustomAddress(retailerAddress));
889
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
889
        pdfModel.setRetailer(customRetailer);
890
			float taxableInsurancePrice = insurancePolicy.getSaleAmount() / (1 + totalInsuranceTaxRate / 100);
890
 
891
			CustomInsurancePolicy customInsurancePolicy = new CustomInsurancePolicy();
891
        Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
892
			customInsurancePolicy.setDescription(insurancePolicy.getPolicyPlan() + " for Device #"
892
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
893
					+ insurancePolicy.getSerialNumber() + "\n Plan Reference - " + insurancePolicy.getPolicyNumber());
893
            float discount = fofoOrderItem.getDiscount();
894
			customInsurancePolicy.setHsnCode("998716");
894
            CustomOrderItem customFofoOrderItem = new CustomOrderItem();
895
			customInsurancePolicy.setRate(taxableInsurancePrice);
895
            float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
896
			customInsurancePolicy.setIgstRate(18);
896
            float taxableSellingPrice = (fofoOrderItem.getSellingPrice() + discount) / (1 + totalTaxRate / 100);
897
			customInsurancePolicy.setIgstAmount(taxableInsurancePrice * 18 / 100);
897
            float taxableDiscountPrice = discount / (1 + totalTaxRate / 100);
898
			customInsurancePolicy.setCgstRate(9);
898
 
899
			customInsurancePolicy.setCgstAmount(taxableInsurancePrice * 9 / 100);
899
            customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
900
			customInsurancePolicy.setSgstRate(9);
900
            customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " " + fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
901
			customInsurancePolicy.setSgstAmount(taxableInsurancePrice * 9 / 100);
901
            Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
902
			customInsurancePolicy.setNetAmount(insurancePolicy.getSaleAmount());
902
            // LOGGER.info("serialNumbers {}", serialNumbers);
903
			customInsurancePolicies.add(customInsurancePolicy);
903
            // LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
904
		}
904
            if (!serialNumbers.isEmpty()) {
905
		pdfModel.setInsurancePolicies(customInsurancePolicies);
905
                customFofoOrderItem.setDescription(
906
 
906
                        customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
907
		pdfModel.setCustomer(getCustomCustomer(fofoOrder));
907
            }
908
		pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
908
            customFofoOrderItem.setRate(taxableSellingPrice);
909
		pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
909
            customFofoOrderItem.setDiscount(taxableDiscountPrice);
910
 
910
            customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
911
		Retailer retailer = retailerRepository.selectById(fofoOrder.getFofoId());
911
            customFofoOrderItem.setNetAmount(fofoOrderItem.getSellingPrice() * fofoOrderItem.getQuantity());
912
		PrivateDealUser privateDealUser = null;
912
            float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
913
		try {
913
            float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
914
			privateDealUser = privateDealUserRepository.selectById(retailer.getId());
914
            float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
915
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
915
            customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
916
			LOGGER.error("Private Deal User not found : ", profitMandiBusinessException);
916
            customFofoOrderItem.setIgstAmount(igstAmount);
917
		}
917
            customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
918
 
918
            customFofoOrderItem.setCgstAmount(cgstAmount);
919
		User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
919
            customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
920
		CustomRetailer customRetailer = new CustomRetailer();
920
            customFofoOrderItem.setSgstAmount(sgstAmount);
921
		customRetailer.setBusinessName(retailer.getName());
921
            customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
922
		customRetailer.setMobileNumber(user.getMobileNumber());
922
            customerFofoOrderItems.add(customFofoOrderItem);
923
		// customRetailer.setTinNumber(retailer.getNumber());
923
        }
924
		if (privateDealUser == null) {
924
        pdfModel.setOrderItems(customerFofoOrderItems);
925
			customRetailer.setGstNumber(null);
925
        String partnerAddressStateCode = stateRepository.selectByName(pdfModel.getRetailer().getAddress().getState()).getCode();
926
		} else {
926
        String customerAddressStateCode = stateRepository.selectByName(pdfModel.getCustomer().getAddress().getState()).getCode();
927
			if (null != privateDealUser.getCounterId()) {
927
        pdfModel.setPartnerAddressStateCode(partnerAddressStateCode);
928
				Counter counter = counterRepository.selectById(privateDealUser.getCounterId());
928
        pdfModel.setCustomerAddressStateCode(customerAddressStateCode);
929
				customRetailer.setGstNumber(counter.getGstin());
929
        pdfModel.setCancelled(fofoOrder.getCancelledTimestamp() != null);
930
			} else {
930
        List<String> tncs = new ArrayList<>();
931
				customRetailer.setGstNumber(null);
931
        tncs.add("I agree that goods received are in good working condition");
932
			}
932
        tncs.add("Goods once sold cannot be exchanged or taken back");
933
		}
933
        tncs.add("Warranty for the goods received by me is the responsibility of the manufacturer only.");
934
		Address retailerAddress = addressRepository
934
        tncs.add("Customer needs to activate the handset at the time of delivery to be eligible for the discount");
935
				.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
935
        tncs.add(
936
		customRetailer.setAddress(this.createCustomAddress(retailerAddress));
936
                "Tempered Glass Replacement will be done only for the Mobile Phone which was purchased from SmartDukaan");
937
		pdfModel.setRetailer(customRetailer);
937
        tncs.add(
938
 
938
                "Customers requesting Tempered Glass Replacement will have to bring the broken tempered glass, either pasted on the phone or along with the phone");
939
		Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
939
        tncs.add("Service fee of Rs.20 will be chargeable for each Tempered Glass Replacement");
940
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
940
        if (pdfModel.getInsurancePolicies() != null && pdfModel.getInsurancePolicies().size() > 0) {
941
			float discount = fofoOrderItem.getDiscount();
941
            tncs.add("Damage protection provided is the responisibility of Protection Provider only");
942
			CustomOrderItem customFofoOrderItem = new CustomOrderItem();
942
        }
943
			float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate()
943
        pdfModel.setTncs(tncs);
944
					+ fofoOrderItem.getCgstRate();
944
        return pdfModel;
945
			float taxableSellingPrice = (fofoOrderItem.getSellingPrice() + discount) / (1 + totalTaxRate / 100);
945
 
946
			float taxableDiscountPrice = discount / (1 + totalTaxRate / 100);
946
    }
947
 
947
 
948
			customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
948
    private CustomCustomer getCustomCustomer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
949
			customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " "
949
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
950
					+ fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
950
        CustomCustomer customCustomer = new CustomCustomer();
951
			Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
951
        customCustomer.setFirstName(customer.getFirstName());
952
			// LOGGER.info("serialNumbers {}", serialNumbers);
952
        customCustomer.setLastName(customer.getLastName());
953
			// LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
953
        customCustomer.setEmailId(customer.getEmailId());
954
			if (!serialNumbers.isEmpty()) {
954
        customCustomer.setMobileNumber(customer.getMobileNumber());
955
				customFofoOrderItem.setDescription(
955
        customCustomer.setGstNumber(fofoOrder.getCustomerGstNumber());
956
						customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
956
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
957
			}
957
        customCustomer.setAddress(this.createCustomAddress(customerAddress));
958
			customFofoOrderItem.setRate(taxableSellingPrice);
958
        return customCustomer;
959
			customFofoOrderItem.setDiscount(taxableDiscountPrice);
959
    }
960
			customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
960
 
961
			customFofoOrderItem.setNetAmount(fofoOrderItem.getSellingPrice() * fofoOrderItem.getQuantity());
961
    @Override
962
			float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
962
    public InvoicePdfModel getInvoicePdfModel(int fofoId, int orderId) throws ProfitMandiBusinessException {
963
			float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
963
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, orderId);
964
			float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
964
        return this.getInvoicePdfModel(fofoOrder);
965
			customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
965
    }
966
			customFofoOrderItem.setIgstAmount(igstAmount);
966
 
967
			customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
967
    public String getBillingAddress(CustomerAddress customerAddress) {
968
			customFofoOrderItem.setCgstAmount(cgstAmount);
968
        StringBuilder address = new StringBuilder();
969
			customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
969
        if ((customerAddress.getLine1() != null) && (!customerAddress.getLine1().isEmpty())) {
970
			customFofoOrderItem.setSgstAmount(sgstAmount);
970
            address.append(customerAddress.getLine1());
971
			customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
971
            address.append(", ");
972
			customerFofoOrderItems.add(customFofoOrderItem);
972
        }
973
		}
973
 
974
		pdfModel.setOrderItems(customerFofoOrderItems);
974
        if ((customerAddress.getLine2() != null) && (!customerAddress.getLine2().isEmpty())) {
975
		String partnerAddressStateCode = stateRepository.selectByName(pdfModel.getRetailer().getAddress().getState())
975
            address.append(customerAddress.getLine2());
976
				.getCode();
976
            address.append(", ");
977
		String customerAddressStateCode = stateRepository.selectByName(pdfModel.getCustomer().getAddress().getState())
977
        }
978
				.getCode();
978
 
979
		pdfModel.setPartnerAddressStateCode(partnerAddressStateCode);
979
        if ((customerAddress.getLandmark() != null) && (!customerAddress.getLandmark().isEmpty())) {
980
		pdfModel.setCustomerAddressStateCode(customerAddressStateCode);
980
            address.append(customerAddress.getLandmark());
981
		pdfModel.setCancelled(fofoOrder.getCancelledTimestamp() != null);
981
            address.append(", ");
982
		List<String> tncs = new ArrayList<>();
982
        }
983
		tncs.add("I agree that goods received are in good working condition");
983
 
984
		tncs.add("Goods once sold cannot be exchanged or taken back");
984
        if ((customerAddress.getCity() != null) && (!customerAddress.getCity().isEmpty())) {
985
		tncs.add("Warranty for the goods received by me is the responsibility of the manufacturer only.");
985
            address.append(customerAddress.getCity());
986
		tncs.add("Customer needs to activate the handset at the time of delivery to be eligible for the discount");
986
            address.append(", ");
987
		tncs.add(
987
        }
988
				"Tempered Glass Replacement will be done only for the Mobile Phone which was purchased from SmartDukaan");
988
 
989
		tncs.add(
989
        if ((customerAddress.getState() != null) && (!customerAddress.getState().isEmpty())) {
990
				"Customers requesting Tempered Glass Replacement will have to bring the broken tempered glass, either pasted on the phone or along with the phone");
990
            address.append(customerAddress.getState());
991
		tncs.add("Service fee of Rs.20 will be chargeable for each Tempered Glass Replacement");
991
        }
992
		if (pdfModel.getInsurancePolicies() != null && pdfModel.getInsurancePolicies().size() > 0) {
992
 
993
			tncs.add("Damage protection provided is the responisibility of Protection Provider only");
993
        if ((customerAddress.getPinCode() != null) && (!customerAddress.getPinCode().isEmpty())) {
994
		}
994
            address.append("- ");
995
		pdfModel.setTncs(tncs);
995
            address.append(customerAddress.getPinCode());
996
		return pdfModel;
996
        }
997
 
997
 
998
	}
998
        return address.toString();
999
 
999
    }
1000
	private CustomCustomer getCustomCustomer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
1000
 
1001
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
1001
    @Override
1002
		CustomCustomer customCustomer = new CustomCustomer();
1002
    public List<CartFofo> cartCheckout(String cartJson) throws ProfitMandiBusinessException {
1003
		customCustomer.setFirstName(customer.getFirstName());
1003
        try {
1004
		customCustomer.setLastName(customer.getLastName());
1004
            JSONObject cartObject = new JSONObject(cartJson);
1005
		customCustomer.setEmailId(customer.getEmailId());
1005
            Iterator<?> keys = cartObject.keys();
1006
		customCustomer.setMobileNumber(customer.getMobileNumber());
1006
 
1007
		customCustomer.setGstNumber(fofoOrder.getCustomerGstNumber());
1007
            Set<Integer> itemIds = new HashSet<>();
1008
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1008
            List<CartFofo> cartItems = new ArrayList<CartFofo>();
1009
		customCustomer.setAddress(this.createCustomAddress(customerAddress));
1009
 
1010
		return customCustomer;
1010
            while (keys.hasNext()) {
1011
	}
1011
                String key = (String) keys.next();
1012
 
1012
                if (cartObject.get(key) instanceof JSONObject) {
1013
	@Override
1013
                    LOGGER.info(cartObject.get(key).toString());
1014
	public InvoicePdfModel getInvoicePdfModel(int fofoId, int orderId) throws ProfitMandiBusinessException {
1014
                }
1015
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, orderId);
1015
                CartFofo cf = new CartFofo();
1016
		return this.getInvoicePdfModel(fofoOrder);
1016
                cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
1017
	}
1017
                cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
1018
 
1018
                if (cartObject.getJSONObject(key).has("poId")) {
1019
	public String getBillingAddress(CustomerAddress customerAddress) {
1019
 
1020
		StringBuilder address = new StringBuilder();
1020
                    cf.setPoId(cartObject.getJSONObject(key).getInt("poId"));
1021
		if ((customerAddress.getLine1() != null) && (!customerAddress.getLine1().isEmpty())) {
1021
                    cf.setPoItemId(cartObject.getJSONObject(key).getInt("poItemId"));
1022
			address.append(customerAddress.getLine1());
1022
                }
1023
			address.append(", ");
1023
                if (cf.getQuantity() <= 0) {
1024
		}
1024
                    continue;
1025
 
1025
                }
1026
		if ((customerAddress.getLine2() != null) && (!customerAddress.getLine2().isEmpty())) {
1026
                cartItems.add(cf);
1027
			address.append(customerAddress.getLine2());
1027
                itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
1028
			address.append(", ");
1028
            }
1029
		}
1029
            Map<Integer, Item> itemMap = new HashMap<Integer, Item>();
1030
 
1030
            if (itemIds.size() > 0) {
1031
		if ((customerAddress.getLandmark() != null) && (!customerAddress.getLandmark().isEmpty())) {
1031
                List<Item> items = itemRepository.selectByIds(itemIds);
1032
			address.append(customerAddress.getLandmark());
1032
                for (Item i : items) {
1033
			address.append(", ");
1033
                    itemMap.put(i.getId(), i);
1034
		}
1034
                }
1035
 
1035
 
1036
		if ((customerAddress.getCity() != null) && (!customerAddress.getCity().isEmpty())) {
1036
            }
1037
			address.append(customerAddress.getCity());
1037
            for (CartFofo cf : cartItems) {
1038
			address.append(", ");
1038
                Item i = itemMap.get(cf.getItemId());
1039
		}
1039
                if (i == null) {
1040
 
1040
                    continue;
1041
		if ((customerAddress.getState() != null) && (!customerAddress.getState().isEmpty())) {
1041
                }
1042
			address.append(customerAddress.getState());
1042
                cf.setDisplayName(getValidName(i.getBrand()) + " " + getValidName(i.getModelName()) + " " + getValidName(i.getModelNumber()) + " " + getValidName(i.getColor()).replaceAll("\\s+", " "));
1043
		}
1043
                cf.setItemType(i.getType());
1044
 
1044
            }
1045
		if ((customerAddress.getPinCode() != null) && (!customerAddress.getPinCode().isEmpty())) {
1045
            return cartItems;
1046
			address.append("- ");
1046
        } catch (Exception e) {
1047
			address.append(customerAddress.getPinCode());
1047
            LOGGER.error("Unable to Prepare cart to place order...", e);
1048
		}
1048
            throw new ProfitMandiBusinessException("cartData", cartJson, "FFORDR_1006");
1049
 
1049
        }
1050
		return address.toString();
1050
    }
1051
	}
1051
 
1052
 
1052
    @Override
1053
	@Override
1053
    public Map<String, Object> getSaleHistory(int fofoId, SearchType searchType, String searchValue, LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1054
	public List<CartFofo> cartCheckout(String cartJson) throws ProfitMandiBusinessException {
1054
        long countItems = 0;
1055
		try {
1055
        List<FofoOrder> fofoOrders = new ArrayList<>();
1056
			JSONObject cartObject = new JSONObject(cartJson);
1056
 
1057
			Iterator<?> keys = cartObject.keys();
1057
        if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1058
 
1058
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, null, null, offset, limit);
1059
			Set<Integer> itemIds = new HashSet<>();
1059
            countItems = fofoOrderRepository.selectCountByCustomerMobileNumber(fofoId, searchValue, null, null);
1060
			List<CartFofo> cartItems = new ArrayList<CartFofo>();
1060
        } else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1061
 
1061
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, null, null, offset, limit);
1062
			while (keys.hasNext()) {
1062
            countItems = fofoOrderRepository.selectCountByCustomerName(fofoId, searchValue, null, null);
1063
				String key = (String) keys.next();
1063
        } else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1064
				if (cartObject.get(key) instanceof JSONObject) {
1064
            fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, null, null, offset, limit);
1065
					LOGGER.info(cartObject.get(key).toString());
1065
            countItems = fofoOrderRepository.selectCountBySerialNumber(fofoId, searchValue, null, null);
1066
				}
1066
        } else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1067
				CartFofo cf = new CartFofo();
1067
            fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, null, null, offset, limit);
1068
				cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
1068
            countItems = fofoOrderRepository.selectCountByItemName(fofoId, searchValue, null, null);
1069
				cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
1069
        } else if (searchType == SearchType.INVOICE_NUMBER && !searchValue.isEmpty()) {
1070
				if (cartObject.getJSONObject(key).has("poId")) {
1070
            fofoOrders = Arrays.asList(fofoOrderRepository.selectByFofoIdAndInvoiceNumber(fofoId, searchValue));
1071
 
1071
            countItems = fofoOrders.size();
1072
					cf.setPoId(cartObject.getJSONObject(key).getInt("poId"));
1072
        } else if (searchType == SearchType.DATE_RANGE) {
1073
					cf.setPoItemId(cartObject.getJSONObject(key).getInt("poItemId"));
1073
            fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1074
				}
1074
            countItems = fofoOrderRepository.selectCountByFofoId(fofoId, startDate, endDate);
1075
				if (cf.getQuantity() <= 0) {
1075
        }
1076
					continue;
1076
        Map<String, Object> map = new HashMap<>();
1077
				}
1077
 
1078
				cartItems.add(cf);
1078
        map.put("saleHistories", fofoOrders);
1079
				itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
1079
        map.put("start", offset + 1);
1080
			}
1080
        map.put("size", countItems);
1081
			Map<Integer, Item> itemMap = new HashMap<Integer, Item>();
1081
        map.put("searchType", searchType);
1082
			if (itemIds.size() > 0) {
1082
        map.put("searchTypes", SearchType.values());
1083
				List<Item> items = itemRepository.selectByIds(itemIds);
1083
        map.put("startDate", startDate);
1084
				for (Item i : items) {
1084
        map.put("searchValue", searchValue);
1085
					itemMap.put(i.getId(), i);
1085
        map.put(ProfitMandiConstants.END_TIME, endDate);
1086
				}
1086
        if (fofoOrders.size() < limit) {
1087
 
1087
            map.put("end", offset + fofoOrders.size());
1088
			}
1088
        } else {
1089
			for (CartFofo cf : cartItems) {
1089
            map.put("end", offset + limit);
1090
				Item i = itemMap.get(cf.getItemId());
1090
        }
1091
				if (i == null) {
1091
        return map;
1092
					continue;
1092
    }
1093
				}
1093
 
1094
				cf.setDisplayName(getValidName(i.getBrand()) + " " + getValidName(i.getModelName()) + " "
1094
    public ResponseEntity<?> downloadReportInCsv(org.apache.commons.io.output.ByteArrayOutputStream baos, List<List<?>> rows, String fileName) {
1095
						+ getValidName(i.getModelNumber()) + " " + getValidName(i.getColor()).replaceAll("\\s+", " "));
1095
        final HttpHeaders headers = new HttpHeaders();
1096
				cf.setItemType(i.getType());
1096
        headers.set("Content-Type", "text/csv");
1097
			}
1097
 
1098
			return cartItems;
1098
        headers.set("Content-disposition", "inline; filename=" + fileName + ".csv");
1099
		} catch (Exception e) {
1099
        headers.setContentLength(baos.toByteArray().length);
1100
			LOGGER.error("Unable to Prepare cart to place order...", e);
1100
 
1101
			throw new ProfitMandiBusinessException("cartData", cartJson, "FFORDR_1006");
1101
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1102
		}
1102
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1103
	}
1103
 
1104
 
1104
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1105
	@Override
1105
    }
1106
	public Map<String, Object> getSaleHistory(int fofoId, SearchType searchType, String searchValue,
1106
 
1107
			LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1107
    @Override
1108
		long countItems = 0;
1108
    public Map<String, Object> getSaleHistoryPaginated(int fofoId, SearchType searchType, String searchValue, LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1109
		List<FofoOrder> fofoOrders = new ArrayList<>();
1109
        List<FofoOrder> fofoOrders = new ArrayList<>();
1110
 
1110
 
1111
		if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1111
        if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1112
			fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, null, null,
1112
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, startDate, endDate, offset, limit);
1113
					offset, limit);
1113
        } else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1114
			countItems = fofoOrderRepository.selectCountByCustomerMobileNumber(fofoId, searchValue, null, null);
1114
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, startDate, endDate, offset, limit);
1115
		} else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1115
        } else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1116
			fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, null, null, offset,
1116
            fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, startDate, endDate, offset, limit);
1117
					limit);
1117
        } else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1118
			countItems = fofoOrderRepository.selectCountByCustomerName(fofoId, searchValue, null, null);
1118
            fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, startDate, endDate, offset, limit);
1119
		} else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1119
 
1120
			fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, null, null, offset,
1120
        } else if (searchType == SearchType.DATE_RANGE) {
1121
					limit);
1121
            fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1122
			countItems = fofoOrderRepository.selectCountBySerialNumber(fofoId, searchValue, null, null);
1122
        }
1123
		} else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1123
        Map<String, Object> map = new HashMap<>();
1124
			fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, null, null, offset, limit);
1124
        map.put("saleHistories", fofoOrders);
1125
			countItems = fofoOrderRepository.selectCountByItemName(fofoId, searchValue, null, null);
1125
        map.put("searchType", searchType);
1126
		} else if (searchType == SearchType.INVOICE_NUMBER && !searchValue.isEmpty()) {
1126
        map.put("searchTypes", SearchType.values());
1127
			fofoOrders = Arrays.asList(fofoOrderRepository.selectByFofoIdAndInvoiceNumber(fofoId, searchValue));
1127
        map.put("startDate", startDate);
1128
			countItems = fofoOrders.size();
1128
        map.put("searchValue", searchValue);
1129
		} else if (searchType == SearchType.DATE_RANGE) {
1129
        map.put(ProfitMandiConstants.END_TIME, endDate);
1130
			fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1130
        return map;
1131
			countItems = fofoOrderRepository.selectCountByFofoId(fofoId, startDate, endDate);
1131
    }
1132
		}
1132
 
1133
		Map<String, Object> map = new HashMap<>();
1133
    private String getFofoStoreCode(int fofoId) throws ProfitMandiBusinessException {
1134
 
1134
        FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
1135
		map.put("saleHistories", fofoOrders);
1135
        return fofoStore.getCode();
1136
		map.put("start", offset + 1);
1136
    }
1137
		map.put("size", countItems);
1137
 
1138
		map.put("searchType", searchType);
1138
    private String getValidName(String name) {
1139
		map.put("searchTypes", SearchType.values());
1139
        return name != null ? name : "";
1140
		map.put("startDate", startDate);
1140
    }
1141
		map.put("searchValue", searchValue);
1141
 
1142
		map.put(ProfitMandiConstants.END_TIME, endDate);
1142
    private Set<String> toSerialNumbers(Set<FofoLineItem> fofoLineItems) {
1143
		if (fofoOrders.size() < limit) {
1143
        Set<String> serialNumbers = new HashSet<>();
1144
			map.put("end", offset + fofoOrders.size());
1144
        for (FofoLineItem fofoLineItem : fofoLineItems) {
1145
		} else {
1145
            if (fofoLineItem.getSerialNumber() != null && !fofoLineItem.getSerialNumber().isEmpty()) {
1146
			map.put("end", offset + limit);
1146
                serialNumbers.add(fofoLineItem.getSerialNumber());
1147
		}
1147
            }
1148
		return map;
1148
        }
1149
	}
1149
        return serialNumbers;
1150
 
1150
    }
1151
	public ResponseEntity<?> downloadReportInCsv(org.apache.commons.io.output.ByteArrayOutputStream baos,
1151
 
1152
			List<List<?>> rows, String fileName) {
1152
    private void validateDpPrice(Map<Integer, PriceModel> itemIdMopPriceMap, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1153
		final HttpHeaders headers = new HttpHeaders();
1153
        for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoLineItemMap.entrySet()) {
1154
		headers.set("Content-Type", "text/csv");
1154
            int itemId = entry.getKey();
1155
 
1155
            CustomFofoOrderItem customFofoOrderItem = entry.getValue();
1156
		headers.set("Content-disposition", "inline; filename=" + fileName + ".csv");
1156
            LOGGER.info("CustomFofoOrderItem -- {}", customFofoOrderItem);
1157
		headers.setContentLength(baos.toByteArray().length);
1157
            PriceModel priceModel = itemIdMopPriceMap.get(itemId);
1158
 
1158
            Item item = itemRepository.selectById(itemId);
1159
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1159
            if (!item.getBrand().equals("Live Demo") && (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID || item.getCategoryId() == ProfitMandiConstants.TABLET_CATEGORY_ID || item.getCategoryId() == ProfitMandiConstants.LED_CATEGORY_ID) && customFofoOrderItem.getSerialNumberDetails().stream().filter(x -> org.apache.commons.lang.StringUtils.isNotEmpty(x.getSerialNumber())).collect(Collectors.toList()).size() > 0) {
1160
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1160
                if (Utils.compareFloat(priceModel.getPrice(), customFofoOrderItem.getSellingPrice() + customFofoOrderItem.getDiscountAmount()) > 0) {
1161
 
1161
                    throw new ProfitMandiBusinessException("Selling Price for ", item.getItemDescription(), "FFORDR_1010");
1162
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1162
                }
1163
	}
1163
            } else {
1164
 
1164
                if (!item.getBrand().equals("Live Demo") && priceModel.getPurchasePrice() > customFofoOrderItem.getSellingPrice()) {
1165
	@Override
1165
                    throw new ProfitMandiBusinessException("Selling Price", itemRepository.selectById(itemId).getItemDescription(), "Selling Price should not be less than DP");
1166
	public Map<String, Object> getSaleHistoryPaginated(int fofoId, SearchType searchType, String searchValue,
1166
                }
1167
			LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1167
            }
1168
		List<FofoOrder> fofoOrders = new ArrayList<>();
1168
        }
1169
 
1169
    }
1170
		if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1170
 
1171
			fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, startDate,
1171
    private void validateMopPrice(Map<Integer, PriceModel> itemIdMopPriceMap, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1172
					endDate, offset, limit);
1172
        Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
1173
		} else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1173
        for (Map.Entry<Integer, PriceModel> entry : itemIdMopPriceMap.entrySet()) {
1174
			fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, startDate, endDate,
1174
            CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoLineItemMap.get(entry.getKey());
1175
					offset, limit);
1175
            Item item = itemRepository.selectById(customFofoOrderItem.getItemId());
1176
		} else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1176
            if (!(item.getBrand().equals("Live Demo") || item.getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID || item.getCategoryId() != ProfitMandiConstants.TABLET_CATEGORY_ID) && customFofoOrderItem.getSellingPrice() + customFofoOrderItem.getDiscountAmount() < entry.getValue().getPrice()) {
1177
			fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, startDate, endDate,
1177
                invalidMopItemIdPriceMap.put(entry.getKey(), customFofoOrderItem.getSellingPrice());
1178
					offset, limit);
1178
            }
1179
		} else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1179
        }
1180
			fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, startDate, endDate, offset,
1180
 
1181
					limit);
1181
        if (!invalidMopItemIdPriceMap.isEmpty()) {
1182
 
1182
            LOGGER.error("Invalid itemIds selling prices{} should be greater than mop prices {}", invalidMopItemIdPriceMap, itemIdMopPriceMap);
1183
		} else if (searchType == SearchType.DATE_RANGE) {
1183
            throw new ProfitMandiBusinessException("invalidMopItemIdPrice", invalidMopItemIdPriceMap, "FFORDR_1010");
1184
			fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1184
        }
1185
		}
1185
 
1186
		Map<String, Object> map = new HashMap<>();
1186
    }
1187
		map.put("saleHistories", fofoOrders);
1187
 
1188
		map.put("searchType", searchType);
1188
    private void updateInventoryItemsAndScanRecord(Set<InventoryItem> inventoryItems, int fofoId, Map<Integer, Integer> inventoryItemQuantityUsed, int fofoOrderId) {
1189
		map.put("searchTypes", SearchType.values());
1189
        for (InventoryItem inventoryItem : inventoryItems) {
1190
		map.put("startDate", startDate);
1190
            inventoryItem.setLastScanType(ScanType.SALE);
1191
		map.put("searchValue", searchValue);
1191
            ScanRecord scanRecord = new ScanRecord();
1192
		map.put(ProfitMandiConstants.END_TIME, endDate);
1192
            scanRecord.setInventoryItemId(inventoryItem.getId());
1193
		return map;
1193
            scanRecord.setFofoId(fofoId);
1194
	}
1194
            scanRecord.setOrderId(fofoOrderId);
1195
 
1195
            // correct this
1196
	private String getFofoStoreCode(int fofoId) throws ProfitMandiBusinessException {
1196
            scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
1197
		FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
1197
            scanRecord.setType(ScanType.SALE);
1198
		return fofoStore.getCode();
1198
            scanRecordRepository.persist(scanRecord);
1199
	}
1199
            purchaseReturnItemRepository.deleteById(inventoryItem.getId());
1200
 
1200
 
1201
	private String getValidName(String name) {
1201
        }
1202
		return name != null ? name : "";
1202
    }
1203
	}
1203
 
1204
 
1204
    private void createFofoLineItem(int fofoOrderItemId, Set<InventoryItem> inventoryItems, Map<Integer, Integer> inventoryItemIdQuantityUsed) {
1205
	private Set<String> toSerialNumbers(Set<FofoLineItem> fofoLineItems) {
1205
        for (InventoryItem inventoryItem : inventoryItems) {
1206
		Set<String> serialNumbers = new HashSet<>();
1206
            FofoLineItem fofoLineItem = new FofoLineItem();
1207
		for (FofoLineItem fofoLineItem : fofoLineItems) {
1207
            fofoLineItem.setFofoOrderItemId(fofoOrderItemId);
1208
			if (fofoLineItem.getSerialNumber() != null && !fofoLineItem.getSerialNumber().isEmpty()) {
1208
            fofoLineItem.setSerialNumber(inventoryItem.getSerialNumber());
1209
				serialNumbers.add(fofoLineItem.getSerialNumber());
1209
            fofoLineItem.setInventoryItemId(inventoryItem.getId());
1210
			}
1210
            fofoLineItem.setQuantity(inventoryItemIdQuantityUsed.get(inventoryItem.getId()));
1211
		}
1211
            fofoLineItemRepository.persist(fofoLineItem);
1212
		return serialNumbers;
1212
        }
1213
	}
1213
    }
1214
 
1214
 
1215
	private void validateDpPrice(Map<Integer, PriceModel> itemIdMopPriceMap,
1215
    private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Integer stateId) throws ProfitMandiBusinessException {
1216
			Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1216
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1217
		for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoLineItemMap.entrySet()) {
1217
        fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
1218
			int itemId = entry.getKey();
1218
        fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
1219
			CustomFofoOrderItem customFofoOrderItem = entry.getValue();
1219
        fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
1220
			LOGGER.info("CustomFofoOrderItem -- {}", customFofoOrderItem);
1220
        fofoOrderItem.setOrderId(fofoOrderId);
1221
			PriceModel priceModel = itemIdMopPriceMap.get(itemId);
1221
        TagListing tl = tagListingRepository.selectByItemId(customFofoOrderItem.getItemId());
1222
			Item item = itemRepository.selectById(itemId);
1222
        // In case listing gets removed rebill it using the selling price
1223
			if (!item.getBrand().equals("Live Demo")
1223
        if (tl != null) {
1224
					&& (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID
1224
            fofoOrderItem.setDp(tl.getSellingPrice());
1225
							|| item.getCategoryId() == ProfitMandiConstants.TABLET_CATEGORY_ID
1225
            fofoOrderItem.setMop(tl.getMop());
1226
							|| item.getCategoryId() == ProfitMandiConstants.LED_CATEGORY_ID)
1226
        } else {
1227
					&& customFofoOrderItem.getSerialNumberDetails().stream()
1227
            fofoOrderItem.setDp(customFofoOrderItem.getSellingPrice());
1228
							.filter(x -> org.apache.commons.lang.StringUtils.isNotEmpty(x.getSerialNumber()))
1228
            fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
1229
							.collect(Collectors.toList()).size() > 0) {
1229
        }
1230
				if (Utils.compareFloat(priceModel.getPrice(),
1230
        fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
1231
						customFofoOrderItem.getSellingPrice() + customFofoOrderItem.getDiscountAmount()) > 0) {
1231
 
1232
					throw new ProfitMandiBusinessException("Selling Price for ", item.getItemDescription(),
1232
        Item item = itemMap.get(customFofoOrderItem.getItemId());
1233
							"FFORDR_1010");
1233
        Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1234
				}
1234
        if (stateId != null) {
1235
			} else {
1235
            itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
1236
				if (!item.getBrand().equals("Live Demo")
1236
        } else {
1237
						&& priceModel.getPurchasePrice() > customFofoOrderItem.getSellingPrice()) {
1237
            itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
1238
					throw new ProfitMandiBusinessException("Selling Price",
1238
        }
1239
							itemRepository.selectById(itemId).getItemDescription(),
1239
        for (InventoryItem inventoryItem : inventoryItems) {
1240
							"Selling Price should not be less than DP");
1240
 
1241
				}
1241
            fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getIgstRate());
1242
			}
1242
 
1243
		}
1243
            fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
1244
	}
1244
            fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
1245
 
1245
 
1246
	private void validateMopPrice(Map<Integer, PriceModel> itemIdMopPriceMap,
1246
 
1247
			Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1247
            fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1248
		Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
1248
            break;
1249
		for (Map.Entry<Integer, PriceModel> entry : itemIdMopPriceMap.entrySet()) {
1249
        }
1250
			CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoLineItemMap.get(entry.getKey());
1250
        fofoOrderItem.setBrand(item.getBrand());
1251
			Item item = itemRepository.selectById(customFofoOrderItem.getItemId());
1251
        fofoOrderItem.setModelName(item.getModelName());
1252
			if (!(item.getBrand().equals("Live Demo") || item.getCategoryId() != ProfitMandiConstants.MOBILE_CATEGORY_ID
1252
        fofoOrderItem.setModelNumber(item.getModelNumber());
1253
					|| item.getCategoryId() != ProfitMandiConstants.TABLET_CATEGORY_ID)
1253
        fofoOrderItem.setColor(item.getColor());
1254
					&& customFofoOrderItem.getSellingPrice() + customFofoOrderItem.getDiscountAmount() < entry
1254
        fofoOrderItemRepository.persist(fofoOrderItem);
1255
							.getValue().getPrice()) {
1255
        return fofoOrderItem;
1256
				invalidMopItemIdPriceMap.put(entry.getKey(), customFofoOrderItem.getSellingPrice());
1256
    }
1257
			}
1257
 
1258
		}
1258
    private FofoOrderItem getDummyFofoOrderItem(int itemId, int fofoOrderId, String serialNumber, Integer stateId) throws ProfitMandiBusinessException {
1259
 
1259
        Item item = itemRepository.selectById(itemId);
1260
		if (!invalidMopItemIdPriceMap.isEmpty()) {
1260
        TagListing tl = tagListingRepository.selectByItemId(itemId);
1261
			LOGGER.error("Invalid itemIds selling prices{} should be greater than mop prices {}",
1261
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1262
					invalidMopItemIdPriceMap, itemIdMopPriceMap);
1262
        fofoOrderItem.setItemId(itemId);
1263
			throw new ProfitMandiBusinessException("invalidMopItemIdPrice", invalidMopItemIdPriceMap, "FFORDR_1010");
1263
        fofoOrderItem.setQuantity(1);
1264
		}
1264
        fofoOrderItem.setSellingPrice(tl.getMop());
1265
 
1265
        fofoOrderItem.setOrderId(fofoOrderId);
1266
	}
1266
        // In case listing gets removed rebill it using the selling price
1267
 
1267
        fofoOrderItem.setDp(tl.getSellingPrice());
1268
	private void updateInventoryItemsAndScanRecord(Set<InventoryItem> inventoryItems, int fofoId,
1268
        fofoOrderItem.setMop(tl.getMop());
1269
			Map<Integer, Integer> inventoryItemQuantityUsed, int fofoOrderId) {
1269
        fofoOrderItem.setDiscount(0);
1270
		for (InventoryItem inventoryItem : inventoryItems) {
1270
 
1271
			inventoryItem.setLastScanType(ScanType.SALE);
1271
        Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1272
			ScanRecord scanRecord = new ScanRecord();
1272
        if (stateId != null) {
1273
			scanRecord.setInventoryItemId(inventoryItem.getId());
1273
            itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(Arrays.asList(itemId), stateId);
1274
			scanRecord.setFofoId(fofoId);
1274
        } else {
1275
			scanRecord.setOrderId(fofoOrderId);
1275
            itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId));
1276
			// correct this
1276
        }
1277
			scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
1277
 
1278
			scanRecord.setType(ScanType.SALE);
1278
        fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(itemId).getIgstRate());
1279
			scanRecordRepository.persist(scanRecord);
1279
 
1280
			purchaseReturnItemRepository.deleteById(inventoryItem.getId());
1280
        fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(itemId).getCgstRate());
1281
 
1281
        fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(itemId).getSgstRate());
1282
		}
1282
 
1283
	}
1283
 
1284
 
1284
        fofoOrderItem.setHsnCode(item.getHsnCode());
1285
	private void createFofoLineItem(int fofoOrderItemId, Set<InventoryItem> inventoryItems,
1285
        fofoOrderItem.setBrand(item.getBrand());
1286
			Map<Integer, Integer> inventoryItemIdQuantityUsed) {
1286
        fofoOrderItem.setModelName(item.getModelName());
1287
		for (InventoryItem inventoryItem : inventoryItems) {
1287
        fofoOrderItem.setModelNumber(item.getModelNumber());
1288
			FofoLineItem fofoLineItem = new FofoLineItem();
1288
        fofoOrderItem.setColor(item.getColor());
1289
			fofoLineItem.setFofoOrderItemId(fofoOrderItemId);
1289
 
1290
			fofoLineItem.setSerialNumber(inventoryItem.getSerialNumber());
1290
        Set<FofoLineItem> fofoLineItems = new HashSet<>();
1291
			fofoLineItem.setInventoryItemId(inventoryItem.getId());
1291
        FofoLineItem fli = new FofoLineItem();
1292
			fofoLineItem.setQuantity(inventoryItemIdQuantityUsed.get(inventoryItem.getId()));
1292
        fli.setQuantity(1);
1293
			fofoLineItemRepository.persist(fofoLineItem);
1293
        fli.setSerialNumber(serialNumber);
1294
		}
1294
        fofoLineItems.add(fli);
1295
	}
1295
        fofoOrderItem.setFofoLineItems(fofoLineItems);
1296
 
1296
 
1297
	private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId,
1297
        return fofoOrderItem;
1298
			Map<Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Integer stateId)
1298
    }
1299
			throws ProfitMandiBusinessException {
1299
 
1300
		FofoOrderItem fofoOrderItem = new FofoOrderItem();
1300
    private void updateCurrentInventorySnapshot(List<CurrentInventorySnapshot> currentInventorySnapshots, int fofoId, int itemId, int quantity) throws ProfitMandiBusinessException {
1301
		fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
1301
        for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1302
		fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
1302
            if (currentInventorySnapshot.getItemId() == itemId && currentInventorySnapshot.getFofoId() == fofoId) {
1303
		fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
1303
                currentInventorySnapshotRepository.updateAvailabilityByItemIdAndFofoId(itemId, fofoId, currentInventorySnapshot.getAvailability() - quantity);
1304
		fofoOrderItem.setOrderId(fofoOrderId);
1304
            }
1305
		TagListing tl = tagListingRepository.selectByItemId(customFofoOrderItem.getItemId());
1305
        }
1306
		// In case listing gets removed rebill it using the selling price
1306
    }
1307
		if (tl != null) {
1307
 
1308
			fofoOrderItem.setDp(tl.getSellingPrice());
1308
    private void createPaymentOptions(FofoOrder fofoOrder, Set<CustomPaymentOption> customPaymentOptions) throws ProfitMandiBusinessException {
1309
			fofoOrderItem.setMop(tl.getMop());
1309
        for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1310
		} else {
1310
            if (customPaymentOption.getAmount() > 0) {
1311
			fofoOrderItem.setDp(customFofoOrderItem.getSellingPrice());
1311
                PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
1312
			fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
1312
                paymentOptionTransaction.setReferenceId(fofoOrder.getId());
1313
		}
1313
                paymentOptionTransaction.setPaymentOptionId(customPaymentOption.getPaymentOptionId());
1314
		fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
1314
                paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1315
 
1315
                paymentOptionTransaction.setAmount(customPaymentOption.getAmount());
1316
		Item item = itemMap.get(customFofoOrderItem.getItemId());
1316
                paymentOptionTransaction.setFofoId(fofoOrder.getFofoId());
1317
		Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1317
                paymentOptionTransactionRepository.persist(paymentOptionTransaction);
1318
		Map<Integer, Float> itemIdIgstTaxRateMap = null;
1318
            }
1319
		if (stateId != null) {
1319
        }
1320
			itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
1320
    }
1321
		} else {
1321
 
1322
			itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
1322
    private FofoOrder createAndGetFofoOrder(int customerId, String customerGstNumber, int fofoId, String documentNumber, float totalAmount, int customerAddressId) {
1323
		}
1323
        FofoOrder fofoOrder = new FofoOrder();
1324
		for (InventoryItem inventoryItem : inventoryItems) {
1324
        fofoOrder.setCustomerGstNumber(customerGstNumber);
1325
			if (stateId == null) {
1325
        fofoOrder.setCustomerId(customerId);
1326
				fofoOrderItem.setIgstRate(itemIdIgstTaxRateMap.get(inventoryItem.getItemId()));
1326
        fofoOrder.setFofoId(fofoId);
1327
			} else {
1327
        fofoOrder.setInvoiceNumber(documentNumber);
1328
				fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
1328
        fofoOrder.setTotalAmount(totalAmount);
1329
				fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
1329
        fofoOrder.setCustomerAddressId(customerAddressId);
1330
			}
1330
        fofoOrderRepository.persist(fofoOrder);
1331
 
1331
        return fofoOrder;
1332
			fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1332
    }
1333
			break;
1333
 
1334
		}
1334
    private void validateItemsSerializedNonSerialized(List<Item> items, Map<Integer, CustomFofoOrderItem> customFofoOrderItemMap) throws ProfitMandiBusinessException {
1335
		fofoOrderItem.setBrand(item.getBrand());
1335
        List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
1336
		fofoOrderItem.setModelName(item.getModelName());
1336
        List<Integer> itemIdNonSerializedSerialNumbers = new ArrayList<Integer>();
1337
		fofoOrderItem.setModelNumber(item.getModelNumber());
1337
        for (Item i : items) {
1338
		fofoOrderItem.setColor(item.getColor());
1338
            CustomFofoOrderItem customFofoOrderItem = customFofoOrderItemMap.get(i.getId());
1339
		fofoOrderItemRepository.persist(fofoOrderItem);
1339
            if (i.getType().equals(ItemType.SERIALIZED)) {
1340
		return fofoOrderItem;
1340
                if (customFofoOrderItem == null || customFofoOrderItem.getSerialNumberDetails().isEmpty()) {
1341
	}
1341
                    invalidItemIdSerialNumbers.add(i.getId());
1342
 
1342
                }
1343
	private FofoOrderItem getDummyFofoOrderItem(int itemId, int fofoOrderId, String serialNumber, Integer stateId)
1343
            } else {
1344
			throws ProfitMandiBusinessException {
1344
                Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
1345
		Item item = itemRepository.selectById(itemId);
1345
                if (customFofoOrderItem == null || !serialNumbers.isEmpty()) {
1346
		TagListing tl = tagListingRepository.selectByItemId(itemId);
1346
                    itemIdNonSerializedSerialNumbers.add(i.getId());
1347
		FofoOrderItem fofoOrderItem = new FofoOrderItem();
1347
                }
1348
		fofoOrderItem.setItemId(itemId);
1348
            }
1349
		fofoOrderItem.setQuantity(1);
1349
        }
1350
		fofoOrderItem.setSellingPrice(tl.getMop());
1350
 
1351
		fofoOrderItem.setOrderId(fofoOrderId);
1351
        if (!invalidItemIdSerialNumbers.isEmpty()) {
1352
		// In case listing gets removed rebill it using the selling price
1352
            LOGGER.error("Invalid itemId's serialNumbers for serialized{}", invalidItemIdSerialNumbers);
1353
		fofoOrderItem.setDp(tl.getSellingPrice());
1353
            // itemId's are serialized you are saying these are not serialized
1354
		fofoOrderItem.setMop(tl.getMop());
1354
            throw new ProfitMandiBusinessException("invalidItemIdSerialNumbers", invalidItemIdSerialNumbers, "FFORDR_1013");
1355
		fofoOrderItem.setDiscount(0);
1355
        }
1356
 
1356
 
1357
		Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1357
        if (!itemIdNonSerializedSerialNumbers.isEmpty()) {
1358
		Map<Integer, Float> itemIdIgstTaxRateMap = null;
1358
            LOGGER.error("Invalid itemId's serialNumbers for non serialized{}", itemIdNonSerializedSerialNumbers);
1359
		if (stateId != null) {
1359
            // itemId's are non serialized you are saying these are serialized
1360
			itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(Arrays.asList(itemId), stateId);
1360
            throw new ProfitMandiBusinessException("itemIdNonSerializedSerialNumbers", itemIdNonSerializedSerialNumbers, "FFORDR_1014");
1361
		} else {
1361
        }
1362
			itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId));
1362
    }
1363
		}
1363
 
1364
 
1364
    private void validateCurrentInventorySnapshotQuantities(List<CurrentInventorySnapshot> currentInventorySnapshots, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap) throws ProfitMandiBusinessException {
1365
		if (stateId == null) {
1365
        if (itemIdCustomFofoOrderItemMap.keySet().size() != currentInventorySnapshots.size()) {
1366
			fofoOrderItem.setIgstRate(itemIdIgstTaxRateMap.get(itemId));
1366
            throw new ProfitMandiBusinessException("quantiiesSize", currentInventorySnapshots.size(), "");
1367
		} else {
1367
        }
1368
			fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(itemId).getCgstRate());
1368
        List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); // this is for error
1369
			fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(itemId).getSgstRate());
1369
        LOGGER.info("currentInventorySnapshots " + currentInventorySnapshots);
1370
		}
1370
        LOGGER.info("CustomFofoLineItemMap {}", itemIdCustomFofoOrderItemMap);
1371
 
1371
        for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1372
		fofoOrderItem.setHsnCode(item.getHsnCode());
1372
            CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoOrderItemMap.get(currentInventorySnapshot.getItemId());
1373
		fofoOrderItem.setBrand(item.getBrand());
1373
            LOGGER.info("customFofoOrderItem {}", customFofoOrderItem);
1374
		fofoOrderItem.setModelName(item.getModelName());
1374
            if (customFofoOrderItem.getQuantity() > currentInventorySnapshot.getAvailability()) {
1375
		fofoOrderItem.setModelNumber(item.getModelNumber());
1375
                ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
1376
		fofoOrderItem.setColor(item.getColor());
1376
                itemIdQuantityAvailability.setItemId(customFofoOrderItem.getItemId());
1377
 
1377
                Quantity quantity = new Quantity();
1378
		Set<FofoLineItem> fofoLineItems = new HashSet<>();
1378
                quantity.setAvailable(currentInventorySnapshot.getAvailability());
1379
		FofoLineItem fli = new FofoLineItem();
1379
                quantity.setRequested(customFofoOrderItem.getQuantity());
1380
		fli.setQuantity(1);
1380
                itemIdQuantityAvailability.setQuantity(quantity);
1381
		fli.setSerialNumber(serialNumber);
1381
                itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
1382
		fofoLineItems.add(fli);
1382
            }
1383
		fofoOrderItem.setFofoLineItems(fofoLineItems);
1383
        }
1384
 
1384
 
1385
		return fofoOrderItem;
1385
        if (!itemIdQuantityAvailabilities.isEmpty()) {
1386
	}
1386
            // itemIdQuantity request is not valid
1387
 
1387
            LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
1388
	private void updateCurrentInventorySnapshot(List<CurrentInventorySnapshot> currentInventorySnapshots, int fofoId,
1388
            throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities, "FFORDR_1015");
1389
			int itemId, int quantity) throws ProfitMandiBusinessException {
1389
        }
1390
		for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1390
    }
1391
			if (currentInventorySnapshot.getItemId() == itemId && currentInventorySnapshot.getFofoId() == fofoId) {
1391
 
1392
				currentInventorySnapshotRepository.updateAvailabilityByItemIdAndFofoId(itemId, fofoId,
1392
    private int getItemIdFromSerialNumber(Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap, String serialNumber) {
1393
						currentInventorySnapshot.getAvailability() - quantity);
1393
        int itemId = 0;
1394
			}
1394
        for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoOrderItemMap.entrySet()) {
1395
		}
1395
            Set<SerialNumberDetail> serialNumberDetails = entry.getValue().getSerialNumberDetails();
1396
	}
1396
            for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
1397
 
1397
                if (serialNumberDetail.getSerialNumber().equals(serialNumber)) {
1398
	private void createPaymentOptions(FofoOrder fofoOrder, Set<CustomPaymentOption> customPaymentOptions)
1398
                    itemId = entry.getKey();
1399
			throws ProfitMandiBusinessException {
1399
                    break;
1400
		for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1400
                }
1401
			if (customPaymentOption.getAmount() > 0) {
1401
            }
1402
				PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
1402
        }
1403
				paymentOptionTransaction.setReferenceId(fofoOrder.getId());
1403
        return itemId;
1404
				paymentOptionTransaction.setPaymentOptionId(customPaymentOption.getPaymentOptionId());
1404
    }
1405
				paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1405
 
1406
				paymentOptionTransaction.setAmount(customPaymentOption.getAmount());
1406
    private Map<Integer, Item> toItemMap(List<Item> items) {
1407
				paymentOptionTransaction.setFofoId(fofoOrder.getFofoId());
1407
        Function<Item, Integer> itemIdFunction = new Function<Item, Integer>() {
1408
				paymentOptionTransactionRepository.persist(paymentOptionTransaction);
1408
            @Override
1409
			}
1409
            public Integer apply(Item item) {
1410
		}
1410
                return item.getId();
1411
	}
1411
            }
1412
 
1412
        };
1413
	private FofoOrder createAndGetFofoOrder(int customerId, String customerGstNumber, int fofoId, String documentNumber,
1413
        Function<Item, Item> itemFunction = new Function<Item, Item>() {
1414
			float totalAmount, int customerAddressId) {
1414
            @Override
1415
		FofoOrder fofoOrder = new FofoOrder();
1415
            public Item apply(Item item) {
1416
		fofoOrder.setCustomerGstNumber(customerGstNumber);
1416
                return item;
1417
		fofoOrder.setCustomerId(customerId);
1417
            }
1418
		fofoOrder.setFofoId(fofoId);
1418
        };
1419
		fofoOrder.setInvoiceNumber(documentNumber);
1419
        return items.stream().collect(Collectors.toMap(itemIdFunction, itemFunction));
1420
		fofoOrder.setTotalAmount(totalAmount);
1420
    }
1421
		fofoOrder.setCustomerAddressId(customerAddressId);
1421
 
1422
		fofoOrderRepository.persist(fofoOrder);
1422
    private void setCustomerAddress(CustomerAddress customerAddress, CustomAddress customAddress) {
1423
		return fofoOrder;
1423
        customerAddress.setName(customAddress.getName());
1424
	}
1424
        customerAddress.setLastName(customAddress.getLastName());
1425
 
1425
        customerAddress.setLine1(customAddress.getLine1());
1426
	private void validateItemsSerializedNonSerialized(List<Item> items,
1426
        customerAddress.setLine2(customAddress.getLine2());
1427
			Map<Integer, CustomFofoOrderItem> customFofoOrderItemMap) throws ProfitMandiBusinessException {
1427
        customerAddress.setLandmark(customAddress.getLandmark());
1428
		List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
1428
        customerAddress.setCity(customAddress.getCity());
1429
		List<Integer> itemIdNonSerializedSerialNumbers = new ArrayList<Integer>();
1429
        customerAddress.setPinCode(customAddress.getPinCode());
1430
		for (Item i : items) {
1430
        customerAddress.setState(customAddress.getState());
1431
			CustomFofoOrderItem customFofoOrderItem = customFofoOrderItemMap.get(i.getId());
1431
        customerAddress.setCountry(customAddress.getCountry());
1432
			if (i.getType().equals(ItemType.SERIALIZED)) {
1432
        customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
1433
				if (customFofoOrderItem == null || customFofoOrderItem.getSerialNumberDetails().isEmpty()) {
1433
    }
1434
					invalidItemIdSerialNumbers.add(i.getId());
1434
 
1435
				}
1435
    private CustomAddress createCustomAddress(Address address) {
1436
			} else {
1436
        CustomAddress customAddress = new CustomAddress();
1437
				Set<String> serialNumbers = this
1437
        customAddress.setName(address.getName());
1438
						.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
1438
        customAddress.setLine1(address.getLine1());
1439
				if (customFofoOrderItem == null || !serialNumbers.isEmpty()) {
1439
        customAddress.setLine2(address.getLine2());
1440
					itemIdNonSerializedSerialNumbers.add(i.getId());
1440
        customAddress.setLandmark(address.getLandmark());
1441
				}
1441
        customAddress.setCity(address.getCity());
1442
			}
1442
        customAddress.setPinCode(address.getPinCode());
1443
		}
1443
        customAddress.setState(address.getState());
1444
 
1444
        customAddress.setCountry(address.getCountry());
1445
		if (!invalidItemIdSerialNumbers.isEmpty()) {
1445
        customAddress.setPhoneNumber(address.getPhoneNumber());
1446
			LOGGER.error("Invalid itemId's serialNumbers for serialized{}", invalidItemIdSerialNumbers);
1446
        return customAddress;
1447
			// itemId's are serialized you are saying these are not serialized
1447
    }
1448
			throw new ProfitMandiBusinessException("invalidItemIdSerialNumbers", invalidItemIdSerialNumbers,
1448
 
1449
					"FFORDR_1013");
1449
    private CustomAddress createCustomAddress(CustomerAddress customerAddress) {
1450
		}
1450
        CustomAddress customAddress = new CustomAddress();
1451
 
1451
        customAddress.setName(customerAddress.getName());
1452
		if (!itemIdNonSerializedSerialNumbers.isEmpty()) {
1452
        customAddress.setLastName(customerAddress.getLastName());
1453
			LOGGER.error("Invalid itemId's serialNumbers for non serialized{}", itemIdNonSerializedSerialNumbers);
1453
        customAddress.setLine1(customerAddress.getLine1());
1454
			// itemId's are non serialized you are saying these are serialized
1454
        customAddress.setLine2(customerAddress.getLine2());
1455
			throw new ProfitMandiBusinessException("itemIdNonSerializedSerialNumbers", itemIdNonSerializedSerialNumbers,
1455
        customAddress.setLandmark(customerAddress.getLandmark());
1456
					"FFORDR_1014");
1456
        customAddress.setCity(customerAddress.getCity());
1457
		}
1457
        customAddress.setPinCode(customerAddress.getPinCode());
1458
	}
1458
        customAddress.setState(customerAddress.getState());
1459
 
1459
        customAddress.setCountry(customerAddress.getCountry());
1460
	private void validateCurrentInventorySnapshotQuantities(List<CurrentInventorySnapshot> currentInventorySnapshots,
1460
        customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
1461
			Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap) throws ProfitMandiBusinessException {
1461
        return customAddress;
1462
		if (itemIdCustomFofoOrderItemMap.keySet().size() != currentInventorySnapshots.size()) {
1462
    }
1463
			throw new ProfitMandiBusinessException("quantiiesSize", currentInventorySnapshots.size(), "");
1463
 
1464
		}
1464
    private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount) throws ProfitMandiBusinessException {
1465
		List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); // this is for error
1465
        Set<Integer> paymentOptionIds = new HashSet<>();
1466
		LOGGER.info("currentInventorySnapshots " + currentInventorySnapshots);
1466
 
1467
		LOGGER.info("CustomFofoLineItemMap {}", itemIdCustomFofoOrderItemMap);
1467
        float calculatedAmount = 0;
1468
		for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1468
        for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1469
			CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoOrderItemMap
1469
            paymentOptionIds.add(customPaymentOption.getPaymentOptionId());
1470
					.get(currentInventorySnapshot.getItemId());
1470
            calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
1471
			LOGGER.info("customFofoOrderItem {}", customFofoOrderItem);
1471
        }
1472
			if (customFofoOrderItem.getQuantity() > currentInventorySnapshot.getAvailability()) {
1472
        if (calculatedAmount != totalAmount) {
1473
				ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
1473
            LOGGER.warn("Error occured while validating payment options amount - {} != TotalAmount {}", calculatedAmount, totalAmount);
1474
				itemIdQuantityAvailability.setItemId(customFofoOrderItem.getItemId());
1474
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT, calculatedAmount, "FFORDR_1016");
1475
				Quantity quantity = new Quantity();
1475
        }
1476
				quantity.setAvailable(currentInventorySnapshot.getAvailability());
1476
 
1477
				quantity.setRequested(customFofoOrderItem.getQuantity());
1477
        List<Integer> foundPaymentOptionIds = paymentOptionRepository.selectIdsByIds(paymentOptionIds);
1478
				itemIdQuantityAvailability.setQuantity(quantity);
1478
        if (foundPaymentOptionIds.size() != paymentOptionIds.size()) {
1479
				itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
1479
            paymentOptionIds.removeAll(foundPaymentOptionIds);
1480
			}
1480
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_ID, paymentOptionIds, "FFORDR_1017");
1481
		}
1481
        }
1482
 
1482
    }
1483
		if (!itemIdQuantityAvailabilities.isEmpty()) {
1483
 
1484
			// itemIdQuantity request is not valid
1484
    @Override
1485
			LOGGER.error("Requested quantities should not be greater than currently available quantities {}",
1485
    public List<FofoOrderItem> getByOrderId(int orderId) throws ProfitMandiBusinessException {
1486
					itemIdQuantityAvailabilities);
1486
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(orderId);
1487
			throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities,
1487
        if (!fofoOrderItems.isEmpty()) {
1488
					"FFORDR_1015");
1488
            List<FofoOrderItem> newFofoOrderItems = new ArrayList<>();
1489
		}
1489
            Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = this.toFofoOrderItemIdFofoLineItems(fofoOrderItems);
1490
	}
1490
            Iterator<FofoOrderItem> fofoOrderItemsIterator = fofoOrderItems.iterator();
1491
 
1491
            while (fofoOrderItemsIterator.hasNext()) {
1492
	private int getItemIdFromSerialNumber(Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap,
1492
                FofoOrderItem fofoOrderItem = fofoOrderItemsIterator.next();
1493
			String serialNumber) {
1493
                fofoOrderItem.setFofoLineItems(fofoOrderItemIdFofoLineItemsMap.get(fofoOrderItem.getId()));
1494
		int itemId = 0;
1494
                newFofoOrderItems.add(fofoOrderItem);
1495
		for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoOrderItemMap.entrySet()) {
1495
                fofoOrderItemsIterator.remove();
1496
			Set<SerialNumberDetail> serialNumberDetails = entry.getValue().getSerialNumberDetails();
1496
            }
1497
			for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
1497
            fofoOrderItems = newFofoOrderItems;
1498
				if (serialNumberDetail.getSerialNumber().equals(serialNumber)) {
1498
        }
1499
					itemId = entry.getKey();
1499
        return fofoOrderItems;
1500
					break;
1500
    }
1501
				}
1501
 
1502
			}
1502
    private Set<Integer> toFofoOrderItemIds(List<FofoOrderItem> fofoOrderItems) {
1503
		}
1503
        Function<FofoOrderItem, Integer> fofoOrderItemToFofoOrderItemIdFunction = new Function<FofoOrderItem, Integer>() {
1504
		return itemId;
1504
            @Override
1505
	}
1505
            public Integer apply(FofoOrderItem fofoOrderItem) {
1506
 
1506
                return fofoOrderItem.getId();
1507
	private Map<Integer, Item> toItemMap(List<Item> items) {
1507
            }
1508
		Function<Item, Integer> itemIdFunction = new Function<Item, Integer>() {
1508
        };
1509
			@Override
1509
        return fofoOrderItems.stream().map(fofoOrderItemToFofoOrderItemIdFunction).collect(Collectors.toSet());
1510
			public Integer apply(Item item) {
1510
    }
1511
				return item.getId();
1511
 
1512
			}
1512
    private Map<Integer, Set<FofoLineItem>> toFofoOrderItemIdFofoLineItems(List<FofoOrderItem> fofoOrderItems) {
1513
		};
1513
        Set<Integer> fofoOrderItemIds = this.toFofoOrderItemIds(fofoOrderItems);
1514
		Function<Item, Item> itemFunction = new Function<Item, Item>() {
1514
        List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByFofoOrderItemIds(fofoOrderItemIds);
1515
			@Override
1515
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = new HashMap<>();
1516
			public Item apply(Item item) {
1516
        for (FofoLineItem fofoLineItem : fofoLineItems) {
1517
				return item;
1517
            if (!fofoOrderItemIdFofoLineItemsMap.containsKey(fofoLineItem.getFofoOrderItemId())) {
1518
			}
1518
                Set<FofoLineItem> fofoLineItems2 = new HashSet<>();
1519
		};
1519
                fofoLineItems2.add(fofoLineItem);
1520
		return items.stream().collect(Collectors.toMap(itemIdFunction, itemFunction));
1520
                fofoOrderItemIdFofoLineItemsMap.put(fofoLineItem.getFofoOrderItemId(), fofoLineItems2);
1521
	}
1521
            } else {
1522
 
1522
                fofoOrderItemIdFofoLineItemsMap.get(fofoLineItem.getFofoOrderItemId()).add(fofoLineItem);
1523
	private void setCustomerAddress(CustomerAddress customerAddress, CustomAddress customAddress) {
1523
            }
1524
		customerAddress.setName(customAddress.getName());
1524
        }
1525
		customerAddress.setLastName(customAddress.getLastName());
1525
        return fofoOrderItemIdFofoLineItemsMap;
1526
		customerAddress.setLine1(customAddress.getLine1());
1526
    }
1527
		customerAddress.setLine2(customAddress.getLine2());
1527
 
1528
		customerAddress.setLandmark(customAddress.getLandmark());
1528
    @Override
1529
		customerAddress.setCity(customAddress.getCity());
1529
    public void updateCustomerDetails(CustomCustomer customCustomer, String invoiceNumber) throws ProfitMandiBusinessException {
1530
		customerAddress.setPinCode(customAddress.getPinCode());
1530
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1531
		customerAddress.setState(customAddress.getState());
1531
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
1532
		customerAddress.setCountry(customAddress.getCountry());
1532
        customer.setFirstName(customCustomer.getFirstName());
1533
		customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
1533
        customer.setLastName(customCustomer.getLastName());
1534
	}
1534
        customer.setMobileNumber(customCustomer.getMobileNumber());
1535
 
1535
        customer.setEmailId(customCustomer.getEmailId());
1536
	private CustomAddress createCustomAddress(Address address) {
1536
        customerRepository.persist(customer);
1537
		CustomAddress customAddress = new CustomAddress();
1537
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1538
		customAddress.setName(address.getName());
1538
        if (!customerAddress.getState().equalsIgnoreCase(customCustomer.getAddress().getState())) {
1539
		customAddress.setLine1(address.getLine1());
1539
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1540
		customAddress.setLine2(address.getLine2());
1540
            resetTaxation(fofoOrder.getFofoId(), customerAddress, fofoOrderItems);
1541
		customAddress.setLandmark(address.getLandmark());
1541
        }
1542
		customAddress.setCity(address.getCity());
1542
        this.setCustomerAddress(customerAddress, customCustomer.getAddress());
1543
		customAddress.setPinCode(address.getPinCode());
1543
        customerAddressRepository.persist(customerAddress);
1544
		customAddress.setState(address.getState());
1544
        fofoOrder.setCustomerGstNumber(customCustomer.getGstNumber());
1545
		customAddress.setCountry(address.getCountry());
1545
    }
1546
		customAddress.setPhoneNumber(address.getPhoneNumber());
1546
 
1547
		return customAddress;
1547
    private void resetTaxation(int fofoId, CustomerAddress customerAddress, List<FofoOrderItem> fofoOrderItems) throws ProfitMandiBusinessException {
1548
	}
1548
        int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
1549
 
1549
 
1550
	private CustomAddress createCustomAddress(CustomerAddress customerAddress) {
1550
        Address retailerAddress = addressRepository.selectById(retailerAddressId);
1551
		CustomAddress customAddress = new CustomAddress();
1551
 
1552
		customAddress.setName(customerAddress.getName());
1552
        Integer stateId = null;
1553
		customAddress.setLastName(customerAddress.getLastName());
1553
        if (customerAddress.getState().equalsIgnoreCase(retailerAddress.getState())) {
1554
		customAddress.setLine1(customerAddress.getLine1());
1554
            try {
1555
		customAddress.setLine2(customerAddress.getLine2());
1555
                stateId = Long.valueOf(stateRepository.selectByName(customerAddress.getState()).getId()).intValue();
1556
		customAddress.setLandmark(customerAddress.getLandmark());
1556
            } catch (Exception e) {
1557
		customAddress.setCity(customerAddress.getCity());
1557
                LOGGER.error("Unable to get state rates");
1558
		customAddress.setPinCode(customerAddress.getPinCode());
1558
            }
1559
		customAddress.setState(customerAddress.getState());
1559
        }
1560
		customAddress.setCountry(customerAddress.getCountry());
1560
        List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1561
		customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
1561
        final Map<Integer, GstRate> gstRates;
1562
		return customAddress;
1562
        if (stateId != null) {
1563
	}
1563
            gstRates = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1564
 
1564
        } else {
1565
	private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount)
1565
            gstRates = stateGstRateRepository.getIgstTaxRate(itemIds);
1566
			throws ProfitMandiBusinessException {
1566
        }
1567
		Set<Integer> paymentOptionIds = new HashSet<>();
1567
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
1568
 
1568
            GstRate rate = gstRates.get(fofoOrderItem.getItemId());
1569
		float calculatedAmount = 0;
1569
            fofoOrderItem.setCgstRate(rate.getCgstRate());
1570
		for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1570
            fofoOrderItem.setSgstRate(rate.getSgstRate());
1571
			paymentOptionIds.add(customPaymentOption.getPaymentOptionId());
1571
            fofoOrderItem.setIgstRate(rate.getIgstRate());
1572
			calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
1572
        }
1573
		}
1573
    }
1574
		if (calculatedAmount != totalAmount) {
1574
 
1575
			LOGGER.warn("Error occured while validating payment options amount - {} != TotalAmount {}",
1575
    @Override
1576
					calculatedAmount, totalAmount);
1576
    public CustomerCreditNote badReturn(int fofoId, FoiBadReturnRequest foiBadReturnRequest) throws ProfitMandiBusinessException {
1577
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT,
1577
        FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
1578
					calculatedAmount, "FFORDR_1016");
1578
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(foi.getOrderId());
1579
		}
1579
        if (fofoOrder.getFofoId() != fofoId) {
1580
 
1580
            throw new ProfitMandiBusinessException("Partner Auth", "", "Invalid Order");
1581
		List<Integer> foundPaymentOptionIds = paymentOptionRepository.selectIdsByIds(paymentOptionIds);
1581
        }
1582
		if (foundPaymentOptionIds.size() != paymentOptionIds.size()) {
1582
        int billedQty = foi.getQuantity() - customerReturnItemRepository.selectAllByOrderItemId(foi.getId()).size();
1583
			paymentOptionIds.removeAll(foundPaymentOptionIds);
1583
        if (foiBadReturnRequest.getMarkedBadArr().size() > billedQty) {
1584
			throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_ID, paymentOptionIds,
1584
            throw new ProfitMandiBusinessException("Cant bad return more than what is billed", "", "Invalid Quantity");
1585
					"FFORDR_1017");
1585
        }
1586
		}
1586
        List<CustomerReturnItem> customerReturnItems = new ArrayList<>();
1587
	}
1587
        for (BadReturnRequest badReturnRequest : foiBadReturnRequest.getMarkedBadArr()) {
1588
 
1588
            CustomerReturnItem customerReturnItem = new CustomerReturnItem();
1589
	@Override
1589
            customerReturnItem.setFofoId(fofoId);
1590
	public List<FofoOrderItem> getByOrderId(int orderId) throws ProfitMandiBusinessException {
1590
            customerReturnItem.setFofoOrderItemId(foiBadReturnRequest.getFofoOrderItemId());
1591
		List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(orderId);
1591
            customerReturnItem.setFofoOrderId(fofoOrder.getId());
1592
		if (!fofoOrderItems.isEmpty()) {
1592
            customerReturnItem.setRemarks(badReturnRequest.getRemarks());
1593
			List<FofoOrderItem> newFofoOrderItems = new ArrayList<>();
1593
            customerReturnItem.setInventoryItemId(badReturnRequest.getInventoryItemId());
1594
			Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = this
1594
            customerReturnItem.setQuantity(1);
1595
					.toFofoOrderItemIdFofoLineItems(fofoOrderItems);
1595
            customerReturnItem.setType(ReturnType.BAD);
1596
			Iterator<FofoOrderItem> fofoOrderItemsIterator = fofoOrderItems.iterator();
1596
            // customerReturnItemRepository.persist(customerReturnItem);
1597
			while (fofoOrderItemsIterator.hasNext()) {
1597
            inventoryService.saleReturnInventoryItem(customerReturnItem);
1598
				FofoOrderItem fofoOrderItem = fofoOrderItemsIterator.next();
1598
            customerReturnItems.add(customerReturnItem);
1599
				fofoOrderItem.setFofoLineItems(fofoOrderItemIdFofoLineItemsMap.get(fofoOrderItem.getId()));
1599
        }
1600
				newFofoOrderItems.add(fofoOrderItem);
1600
        CustomerCreditNote creditNote = generateCreditNote(fofoOrder, customerReturnItems);
1601
				fofoOrderItemsIterator.remove();
1601
        for (CustomerReturnItem customerReturnItem : customerReturnItems) {
1602
			}
1602
            purchaseReturnService.returnInventoryItem(fofoId, false, customerReturnItem.getInventoryItemId(), ReturnType.BAD);
1603
			fofoOrderItems = newFofoOrderItems;
1603
        }
1604
		}
1604
        // This should cancel the order
1605
		return fofoOrderItems;
1605
        fofoOrder.setCancelledTimestamp(LocalDateTime.now());
1606
	}
1606
        this.reverseScheme(fofoOrder);
1607
 
1607
        return creditNote;
1608
	private Set<Integer> toFofoOrderItemIds(List<FofoOrderItem> fofoOrderItems) {
1608
    }
1609
		Function<FofoOrderItem, Integer> fofoOrderItemToFofoOrderItemIdFunction = new Function<FofoOrderItem, Integer>() {
1609
 
1610
			@Override
1610
    private CustomerCreditNote generateCreditNote(FofoOrder fofoOrder, List<CustomerReturnItem> customerReturnItems) throws ProfitMandiBusinessException {
1611
			public Integer apply(FofoOrderItem fofoOrderItem) {
1611
 
1612
				return fofoOrderItem.getId();
1612
        InvoiceNumberGenerationSequence sequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoOrder.getFofoId());
1613
			}
1613
        sequence.setCreditNoteSequence(sequence.getCreditNoteSequence() + 1);
1614
		};
1614
        invoiceNumberGenerationSequenceRepository.persist(sequence);
1615
		return fofoOrderItems.stream().map(fofoOrderItemToFofoOrderItemIdFunction).collect(Collectors.toSet());
1615
 
1616
	}
1616
        String creditNoteNumber = sequence.getPrefix() + "/" + sequence.getCreditNoteSequence();
1617
 
1617
        CustomerCreditNote creditNote = new CustomerCreditNote();
1618
	private Map<Integer, Set<FofoLineItem>> toFofoOrderItemIdFofoLineItems(List<FofoOrderItem> fofoOrderItems) {
1618
        creditNote.setCreditNoteNumber(creditNoteNumber);
1619
		Set<Integer> fofoOrderItemIds = this.toFofoOrderItemIds(fofoOrderItems);
1619
        creditNote.setFofoId(fofoOrder.getFofoId());
1620
		List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByFofoOrderItemIds(fofoOrderItemIds);
1620
        creditNote.setFofoOrderId(fofoOrder.getId());
1621
		Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = new HashMap<>();
1621
        creditNote.setFofoOrderItemId(customerReturnItems.get(0).getFofoOrderItemId());
1622
		for (FofoLineItem fofoLineItem : fofoLineItems) {
1622
        creditNote.setSettlementType(SettlementType.UNSETTLED);
1623
			if (!fofoOrderItemIdFofoLineItemsMap.containsKey(fofoLineItem.getFofoOrderItemId())) {
1623
        customerCreditNoteRepository.persist(creditNote);
1624
				Set<FofoLineItem> fofoLineItems2 = new HashSet<>();
1624
 
1625
				fofoLineItems2.add(fofoLineItem);
1625
        for (CustomerReturnItem customerReturnItem : customerReturnItems) {
1626
				fofoOrderItemIdFofoLineItemsMap.put(fofoLineItem.getFofoOrderItemId(), fofoLineItems2);
1626
            customerReturnItem.setCreditNoteId(creditNote.getId());
1627
			} else {
1627
            customerReturnItemRepository.persist(customerReturnItem);
1628
				fofoOrderItemIdFofoLineItemsMap.get(fofoLineItem.getFofoOrderItemId()).add(fofoLineItem);
1628
        }
1629
			}
1629
        // this.returnInventoryItems(inventoryItems, debitNote);
1630
		}
1630
 
1631
		return fofoOrderItemIdFofoLineItemsMap;
1631
        return creditNote;
1632
	}
1632
    }
1633
 
1633
 
1634
	@Override
1634
    @Override
1635
	public void updateCustomerDetails(CustomCustomer customCustomer, String invoiceNumber)
1635
    public CreditNotePdfModel getCreditNotePdfModel(int customerCreditNoteId) throws ProfitMandiBusinessException {
1636
			throws ProfitMandiBusinessException {
1636
        CustomerCreditNote creditNote = customerCreditNoteRepository.selectById(customerCreditNoteId);
1637
		FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1637
        return getCreditNotePdfModel(creditNote);
1638
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
1638
    }
1639
		customer.setFirstName(customCustomer.getFirstName());
1639
 
1640
		customer.setLastName(customCustomer.getLastName());
1640
    private CreditNotePdfModel getCreditNotePdfModel(CustomerCreditNote creditNote) throws ProfitMandiBusinessException {
1641
		customer.setMobileNumber(customCustomer.getMobileNumber());
1641
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(creditNote.getFofoOrderId());
1642
		customer.setEmailId(customCustomer.getEmailId());
1642
        List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository.selectAllByCreditNoteId(creditNote.getId());
1643
		customerRepository.persist(customer);
1643
        CustomCustomer customCustomer = getCustomCustomer(fofoOrder);
1644
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1644
 
1645
		if (!customerAddress.getState().equalsIgnoreCase(customCustomer.getAddress().getState())) {
1645
        Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
1646
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1646
        CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
1647
			resetTaxation(fofoOrder.getFofoId(), customerAddress, fofoOrderItems);
1647
 
1648
		}
1648
        FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(creditNote.getFofoOrderItemId());
1649
		this.setCustomerAddress(customerAddress, customCustomer.getAddress());
1649
        float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
1650
		customerAddressRepository.persist(customerAddress);
1650
        float taxableSellingPrice = fofoOrderItem.getSellingPrice() / (1 + totalTaxRate / 100);
1651
		fofoOrder.setCustomerGstNumber(customCustomer.getGstNumber());
1651
        float taxableDiscountPrice = fofoOrderItem.getDiscount() / (1 + totalTaxRate / 100);
1652
	}
1652
 
1653
 
1653
        CustomOrderItem customFofoOrderItem = new CustomOrderItem();
1654
	private void resetTaxation(int fofoId, CustomerAddress customerAddress, List<FofoOrderItem> fofoOrderItems)
1654
        customFofoOrderItem.setAmount(customerReturnItems.size() * (taxableSellingPrice - taxableDiscountPrice));
1655
			throws ProfitMandiBusinessException {
1655
        customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " " + fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
1656
		int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
1656
 
1657
 
1657
        if (ItemType.SERIALIZED.equals(itemRepository.selectById(fofoOrderItem.getItemId()).getType())) {
1658
		Address retailerAddress = addressRepository.selectById(retailerAddressId);
1658
            Set<Integer> inventoryItemIds = customerReturnItems.stream().map(x -> x.getInventoryItemId()).collect(Collectors.toSet());
1659
 
1659
            List<String> serialNumbers = inventoryItemRepository.selectByIds(inventoryItemIds).stream().map(x -> x.getSerialNumber()).collect(Collectors.toList());
1660
		Integer stateId = null;
1660
            customFofoOrderItem.setDescription(
1661
		if (customerAddress.getState().equalsIgnoreCase(retailerAddress.getState())) {
1661
                    customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
1662
			try {
1662
        }
1663
				stateId = Long.valueOf(stateRepository.selectByName(customerAddress.getState()).getId()).intValue();
1663
 
1664
			} catch (Exception e) {
1664
        customFofoOrderItem.setRate(taxableSellingPrice);
1665
				LOGGER.error("Unable to get state rates");
1665
        customFofoOrderItem.setDiscount(taxableDiscountPrice);
1666
			}
1666
        customFofoOrderItem.setQuantity(customerReturnItems.size());
1667
		}
1667
        customFofoOrderItem.setNetAmount(
1668
		List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1668
                (fofoOrderItem.getSellingPrice() - fofoOrderItem.getDiscount()) * customFofoOrderItem.getQuantity());
1669
		final Map<Integer, GstRate> gstRates;
1669
 
1670
		if (stateId != null) {
1670
        float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
1671
			gstRates = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1671
        float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
1672
		} else {
1672
        float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
1673
			gstRates = new HashMap<>();
1673
        LOGGER.info("fofoOrderItem - {}", fofoOrderItem);
1674
			stateGstRateRepository.getIgstTaxRate(itemIds).entrySet().forEach(x -> {
1674
        customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
1675
				GstRate gstRate = new GstRate();
1675
        customFofoOrderItem.setIgstAmount(igstAmount);
1676
				gstRate.setIgstRate(x.getValue());
1676
        customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
1677
				gstRate.setCgstRate(0f);
1677
        customFofoOrderItem.setCgstAmount(cgstAmount);
1678
				gstRate.setSgstRate(0f);
1678
        customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
1679
				gstRates.put(x.getKey(), gstRate);
1679
        customFofoOrderItem.setSgstAmount(sgstAmount);
1680
 
1680
        customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
1681
			});
1681
        customFofoOrderItem.setOrderId(1);
1682
		}
1682
        customerFofoOrderItems.add(customFofoOrderItem);
1683
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
1683
 
1684
			GstRate rate = gstRates.get(fofoOrderItem.getItemId());
1684
        InvoicePdfModel pdfModel = new InvoicePdfModel();
1685
			fofoOrderItem.setCgstRate(rate.getCgstRate());
1685
        pdfModel.setAuther("NSSPL");
1686
			fofoOrderItem.setSgstRate(rate.getSgstRate());
1686
        pdfModel.setCustomer(customCustomer);
1687
			fofoOrderItem.setIgstRate(rate.getIgstRate());
1687
        pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
1688
		}
1688
        pdfModel.setInvoiceDate(FormattingUtils.formatDate(fofoOrder.getCreateTimestamp()));
1689
	}
1689
        pdfModel.setTitle("Credit Note");
1690
 
1690
        pdfModel.setRetailer(customRetailer);
1691
	@Override
1691
        pdfModel.setTotalAmount(customFofoOrderItem.getNetAmount());
1692
	public CustomerCreditNote badReturn(int fofoId, FoiBadReturnRequest foiBadReturnRequest)
1692
        pdfModel.setOrderItems(customerFofoOrderItems);
1693
			throws ProfitMandiBusinessException {
1693
 
1694
		FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
1694
        CreditNotePdfModel creditNotePdfModel = new CreditNotePdfModel();
1695
		FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(foi.getOrderId());
1695
        creditNotePdfModel.setCreditNoteDate(FormattingUtils.formatDate(creditNote.getCreateTimestamp()));
1696
		if (fofoOrder.getFofoId() != fofoId) {
1696
        creditNotePdfModel.setCreditNoteNumber(creditNote.getCreditNoteNumber());
1697
			throw new ProfitMandiBusinessException("Partner Auth", "", "Invalid Order");
1697
        creditNotePdfModel.setPdfModel(pdfModel);
1698
		}
1698
        return creditNotePdfModel;
1699
		int billedQty = foi.getQuantity() - customerReturnItemRepository.selectAllByOrderItemId(foi.getId()).size();
1699
    }
1700
		if (foiBadReturnRequest.getMarkedBadArr().size() > billedQty) {
1700
 
1701
			throw new ProfitMandiBusinessException("Cant bad return more than what is billed", "", "Invalid Quantity");
1701
    // This will remove the order and maintain order record and reverse inventory
1702
		}
1702
    // and scheme
1703
		List<CustomerReturnItem> customerReturnItems = new ArrayList<>();
1703
    @Override
1704
		for (BadReturnRequest badReturnRequest : foiBadReturnRequest.getMarkedBadArr()) {
1704
    public void cancelOrder(List<String> invoiceNumbers) throws ProfitMandiBusinessException {
1705
			CustomerReturnItem customerReturnItem = new CustomerReturnItem();
1705
        for (String invoiceNumber : invoiceNumbers) {
1706
			customerReturnItem.setFofoId(fofoId);
1706
            // Cancel only when not cancelled
1707
			customerReturnItem.setFofoOrderItemId(foiBadReturnRequest.getFofoOrderItemId());
1707
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1708
			customerReturnItem.setFofoOrderId(fofoOrder.getId());
1708
            if (fofoOrder.getCancelledTimestamp() == null) {
1709
			customerReturnItem.setRemarks(badReturnRequest.getRemarks());
1709
                fofoOrder.setCancelledTimestamp(LocalDateTime.now());
1710
			customerReturnItem.setInventoryItemId(badReturnRequest.getInventoryItemId());
1710
                PaymentOptionTransaction paymentTransaction = new PaymentOptionTransaction();
1711
			customerReturnItem.setQuantity(1);
1711
                paymentTransaction.setAmount(-fofoOrder.getTotalAmount());
1712
			customerReturnItem.setType(ReturnType.BAD);
1712
                paymentTransaction.setFofoId(fofoOrder.getFofoId());
1713
			// customerReturnItemRepository.persist(customerReturnItem);
1713
                paymentTransaction.setReferenceId(fofoOrder.getId());
1714
			inventoryService.saleReturnInventoryItem(customerReturnItem);
1714
                paymentTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1715
			customerReturnItems.add(customerReturnItem);
1715
                paymentTransaction.setPaymentOptionId(1);
1716
		}
1716
                paymentOptionTransactionRepository.persist(paymentTransaction);
1717
		CustomerCreditNote creditNote = generateCreditNote(fofoOrder, customerReturnItems);
1717
 
1718
		for (CustomerReturnItem customerReturnItem : customerReturnItems) {
1718
                List<FofoOrderItem> fois = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1719
			purchaseReturnService.returnInventoryItem(fofoId, false, customerReturnItem.getInventoryItemId(),
1719
                if (fois.size() > 0) {
1720
					ReturnType.BAD);
1720
                    List<InventoryItem> inventoryItems = new ArrayList<>();
1721
		}
1721
                    fois.stream().forEach(x -> {
1722
		// This should cancel the order
1722
                        x.getFofoLineItems().stream().forEach(y -> {
1723
		fofoOrder.setCancelledTimestamp(LocalDateTime.now());
1723
                            inventoryService.rollbackInventory(y.getInventoryItemId(), y.getQuantity(), fofoOrder.getFofoId());
1724
		this.reverseScheme(fofoOrder);
1724
                            inventoryItems.add(inventoryItemRepository.selectById(y.getInventoryItemId()));
1725
		return creditNote;
1725
                        });
1726
	}
1726
                    });
1727
 
1727
                    // if(invoice)
1728
	private CustomerCreditNote generateCreditNote(FofoOrder fofoOrder, List<CustomerReturnItem> customerReturnItems)
1728
                    this.reverseScheme(fofoOrder);
1729
			throws ProfitMandiBusinessException {
1729
                }
1730
 
1730
                insuranceService.cancelInsurance(fofoOrder);
1731
		InvoiceNumberGenerationSequence sequence = invoiceNumberGenerationSequenceRepository
1731
            }
1732
				.selectByFofoId(fofoOrder.getFofoId());
1732
        }
1733
		sequence.setCreditNoteSequence(sequence.getCreditNoteSequence() + 1);
1733
    }
1734
		invoiceNumberGenerationSequenceRepository.persist(sequence);
1734
 
1735
 
1735
    @Override
1736
		String creditNoteNumber = sequence.getPrefix() + "/" + sequence.getCreditNoteSequence();
1736
    public void reverseScheme(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
1737
		CustomerCreditNote creditNote = new CustomerCreditNote();
1737
        String reversalReason = "Order Rolledback/Cancelled/Returned for Invoice #" + fofoOrder.getInvoiceNumber();
1738
		creditNote.setCreditNoteNumber(creditNoteNumber);
1738
        List<FofoOrderItem> fois = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1739
		creditNote.setFofoId(fofoOrder.getFofoId());
1739
        Set<Integer> inventoryItemIds = fois.stream().flatMap(x -> x.getFofoLineItems().stream().map(y -> y.getInventoryItemId())).collect(Collectors.toSet());
1740
		creditNote.setFofoOrderId(fofoOrder.getId());
1740
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds);
1741
		creditNote.setFofoOrderItemId(customerReturnItems.get(0).getFofoOrderItemId());
1741
        schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason, SchemeService.OUT_SCHEME_TYPES);
1742
		creditNote.setSettlementType(SettlementType.UNSETTLED);
1742
        schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason, Arrays.asList(SchemeType.INVESTMENT));
1743
		customerCreditNoteRepository.persist(creditNote);
1743
        schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason, Arrays.asList(SchemeType.ACTIVATION));
1744
 
1744
        schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason, Arrays.asList(SchemeType.SPECIAL_SUPPORT));
1745
		for (CustomerReturnItem customerReturnItem : customerReturnItems) {
1745
 
1746
			customerReturnItem.setCreditNoteId(creditNote.getId());
1746
    }
1747
			customerReturnItemRepository.persist(customerReturnItem);
1747
 
1748
		}
1748
    @Override
1749
		// this.returnInventoryItems(inventoryItems, debitNote);
1749
    public void reverseActivationScheme(List<Integer> inventoryItemIds) throws ProfitMandiBusinessException {
1750
 
1750
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(inventoryItemIds);
1751
		return creditNote;
1751
        for (InventoryItem inventoryItem : inventoryItems) {
1752
	}
1752
            List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByInventoryItemId(inventoryItem.getId());
1753
 
1753
            FofoLineItem fofoLineItem = fofoLineItems.get(0);
1754
	@Override
1754
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(fofoLineItem.getFofoOrderItemId());
1755
	public CreditNotePdfModel getCreditNotePdfModel(int customerCreditNoteId) throws ProfitMandiBusinessException {
1755
            FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(fofoOrderItem.getOrderId());
1756
		CustomerCreditNote creditNote = customerCreditNoteRepository.selectById(customerCreditNoteId);
1756
            String reversalReason = "Scheme rolled back as activation date is invalid for imei " + inventoryItem.getSerialNumber();
1757
		return getCreditNotePdfModel(creditNote);
1757
            schemeService.reverseSchemes(Arrays.asList(inventoryItem), fofoOrder.getId(), reversalReason, Arrays.asList(SchemeType.ACTIVATION));
1758
	}
1758
            schemeService.reverseSchemes(Arrays.asList(inventoryItem), fofoOrder.getId(), reversalReason, Arrays.asList(SchemeType.SPECIAL_SUPPORT));
1759
 
1759
 
1760
	private CreditNotePdfModel getCreditNotePdfModel(CustomerCreditNote creditNote)
1760
        }
1761
			throws ProfitMandiBusinessException {
1761
 
1762
		FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(creditNote.getFofoOrderId());
1762
    }
1763
		List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
1763
 
1764
				.selectAllByCreditNoteId(creditNote.getId());
1764
    @Override
1765
		CustomCustomer customCustomer = getCustomCustomer(fofoOrder);
1765
    public float getSales(int fofoId, LocalDateTime startDate, LocalDateTime endDate) {
1766
 
1766
        Float sales = fofoOrderRepository.selectSaleSumGroupByFofoIds(startDate, endDate).get(fofoId);
1767
		Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
1767
        return sales == null ? 0f : sales;
1768
		CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
1768
    }
1769
 
1769
 
1770
		FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(creditNote.getFofoOrderItemId());
1770
    @Override
1771
		float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
1771
    public LocalDateTime getMaxSalesDate(int fofoId, LocalDateTime startDate, LocalDateTime endDate) {
1772
		float taxableSellingPrice = fofoOrderItem.getSellingPrice() / (1 + totalTaxRate / 100);
1772
        LocalDateTime dateTime = fofoOrderRepository.selectMaxSaleDateGroupByFofoIds(startDate, endDate).get(fofoId);
1773
		float taxableDiscountPrice = fofoOrderItem.getDiscount() / (1 + totalTaxRate / 100);
1773
        return dateTime;
1774
 
1774
    }
1775
		CustomOrderItem customFofoOrderItem = new CustomOrderItem();
1775
 
1776
		customFofoOrderItem.setAmount(customerReturnItems.size() * (taxableSellingPrice - taxableDiscountPrice));
1776
    @Override
1777
		customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " "
1777
    // Only being used internally
1778
				+ fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
1778
    public float getSales(int fofoId, LocalDate onDate) {
1779
 
1779
        LocalDateTime startTime = LocalDateTime.of(onDate, LocalTime.MIDNIGHT);
1780
		if (ItemType.SERIALIZED.equals(itemRepository.selectById(fofoOrderItem.getItemId()).getType())) {
1780
        LocalDateTime endTime = LocalDateTime.of(onDate, LocalTime.MIDNIGHT).plusDays(1);
1781
			Set<Integer> inventoryItemIds = customerReturnItems.stream().map(x -> x.getInventoryItemId())
1781
        return this.getSales(fofoId, startTime, endTime);
1782
					.collect(Collectors.toSet());
1782
    }
1783
			List<String> serialNumbers = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
1783
 
1784
					.map(x -> x.getSerialNumber()).collect(Collectors.toList());
1784
    @Override
1785
			customFofoOrderItem.setDescription(
1785
    public float getSales(LocalDateTime onDate) {
1786
					customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
1786
        // TODO Auto-generated method stub
1787
		}
1787
        return 0;
1788
 
1788
    }
1789
		customFofoOrderItem.setRate(taxableSellingPrice);
1789
 
1790
		customFofoOrderItem.setDiscount(taxableDiscountPrice);
1790
    @Override
1791
		customFofoOrderItem.setQuantity(customerReturnItems.size());
1791
    public float getSales(LocalDateTime startDate, LocalDateTime endDate) {
1792
		customFofoOrderItem.setNetAmount(
1792
        // TODO Auto-generated method stub
1793
				(fofoOrderItem.getSellingPrice() - fofoOrderItem.getDiscount()) * customFofoOrderItem.getQuantity());
1793
        return 0;
1794
 
1794
    }
1795
		float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
1795
 
1796
		float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
1796
    @Override
1797
		float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
1797
    public boolean notifyColorChange(int orderId, int itemId) throws ProfitMandiBusinessException {
1798
		LOGGER.info("fofoOrderItem - {}", fofoOrderItem);
1798
        Order order = orderRepository.selectById(orderId);
1799
		customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
1799
        saholicInventoryService.reservationCountByColor(itemId, order);
1800
		customFofoOrderItem.setIgstAmount(igstAmount);
1800
 
1801
		customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
1801
        order.getLineItem().setItemId(itemId);
1802
		customFofoOrderItem.setCgstAmount(cgstAmount);
1802
        Item item = itemRepository.selectById(itemId);
1803
		customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
1803
        order.getLineItem().setColor(item.getColor());
1804
		customFofoOrderItem.setSgstAmount(sgstAmount);
1804
        return true;
1805
		customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
1805
    }
1806
		customFofoOrderItem.setOrderId(1);
1806
 
1807
		customerFofoOrderItems.add(customFofoOrderItem);
1807
    @Override
1808
 
1808
    public FofoOrder getOrderByInventoryItemId(int inventoryItemId) throws Exception {
1809
		InvoicePdfModel pdfModel = new InvoicePdfModel();
1809
        List<FofoLineItem> lineItems = fofoLineItemRepository.selectByInventoryItemId(inventoryItemId);
1810
		pdfModel.setAuther("NSSPL");
1810
        if (lineItems.size() > 0) {
1811
		pdfModel.setCustomer(customCustomer);
1811
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(lineItems.get(0).getFofoOrderItemId());
1812
		pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
1812
            fofoOrderItem.setFofoLineItems(new HashSet<>(lineItems));
1813
		pdfModel.setInvoiceDate(FormattingUtils.formatDate(fofoOrder.getCreateTimestamp()));
1813
            FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(fofoOrderItem.getOrderId());
1814
		pdfModel.setTitle("Credit Note");
1814
            fofoOrder.setOrderItem(fofoOrderItem);
1815
		pdfModel.setRetailer(customRetailer);
1815
            return fofoOrder;
1816
		pdfModel.setTotalAmount(customFofoOrderItem.getNetAmount());
1816
        } else {
1817
		pdfModel.setOrderItems(customerFofoOrderItems);
1817
            throw new Exception(String.format("Could not find inventoryItemId - %s", inventoryItemId));
1818
 
1818
        }
1819
		CreditNotePdfModel creditNotePdfModel = new CreditNotePdfModel();
1819
    }
1820
		creditNotePdfModel.setCreditNoteDate(FormattingUtils.formatDate(creditNote.getCreateTimestamp()));
1820
 
1821
		creditNotePdfModel.setCreditNoteNumber(creditNote.getCreditNoteNumber());
1821
    @Override
1822
		creditNotePdfModel.setPdfModel(pdfModel);
1822
    public Map<Integer, Long> carryBagCreditCount(int fofoId) throws ProfitMandiBusinessException {
1823
		return creditNotePdfModel;
1823
 
1824
	}
1824
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
1825
 
1825
        LocalDateTime lastCredit = fs.getBagsLastCredited();
1826
	// This will remove the order and maintain order record and reverse inventory
1826
        /*
1827
	// and scheme
1827
         * long carryBagCount = 0; List<FofoOrder> fofoOrders =
1828
	@Override
1828
         * fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(fofoId,
1829
	public void cancelOrder(List<String> invoiceNumbers) throws ProfitMandiBusinessException {
1829
         * lastCredit.atStartOfDay(), LocalDate.now().plusDays(1).atStartOfDay()); for
1830
		for (String invoiceNumber : invoiceNumbers) {
1830
         * (FofoOrder fo : fofoOrders) { carryBagCount +=
1831
			// Cancel only when not cancelled
1831
         * fofoOrderItemRepository.selectByOrderId(fo.getId()).stream() .filter(x ->
1832
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1832
         * x.getSellingPrice() >= 12000).count();
1833
			if (fofoOrder.getCancelledTimestamp() == null) {
1833
         *
1834
				fofoOrder.setCancelledTimestamp(LocalDateTime.now());
1834
         * }
1835
				PaymentOptionTransaction paymentTransaction = new PaymentOptionTransaction();
1835
         */
1836
				paymentTransaction.setAmount(-fofoOrder.getTotalAmount());
1836
 
1837
				paymentTransaction.setFofoId(fofoOrder.getFofoId());
1837
        Session session = sessionFactory.getCurrentSession();
1838
				paymentTransaction.setReferenceId(fofoOrder.getId());
1838
        CriteriaBuilder cb = session.getCriteriaBuilder();
1839
				paymentTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1839
 
1840
				paymentTransaction.setPaymentOptionId(1);
1840
        CriteriaQuery<SimpleEntry> query = cb.createQuery(SimpleEntry.class);
1841
				paymentOptionTransactionRepository.persist(paymentTransaction);
1841
        Root<FofoOrder> fofoOrder = query.from(FofoOrder.class);
1842
 
1842
        Root<FofoOrderItem> fofoOrderItem = query.from(FofoOrderItem.class);
1843
				List<FofoOrderItem> fois = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1843
        Root<TagListing> tagListingRoot = query.from(TagListing.class);
1844
				if (fois.size() > 0) {
1844
        Root<Item> itemRoot = query.from(Item.class);
1845
					List<InventoryItem> inventoryItems = new ArrayList<>();
1845
 
1846
					fois.stream().forEach(x -> {
1846
        Predicate p2 = cb.between(fofoOrder.get(ProfitMandiConstants.CREATE_TIMESTAMP), lastCredit, LocalDate.now().atStartOfDay());
1847
						x.getFofoLineItems().stream().forEach(y -> {
1847
        Predicate p3 = cb.isNull(fofoOrder.get("cancelledTimestamp"));
1848
							inventoryService.rollbackInventory(y.getInventoryItemId(), y.getQuantity(),
1848
        Predicate joinPredicate = cb.and(
1849
									fofoOrder.getFofoId());
1849
                cb.equal(fofoOrder.get(ProfitMandiConstants.ID), fofoOrderItem.get(ProfitMandiConstants.ORDER_ID)), cb.equal(fofoOrderItem.get("itemId"), tagListingRoot.get("itemId")), cb.equal(itemRoot.get("id"), tagListingRoot.get("itemId")), cb.equal(fofoOrder.get(ProfitMandiConstants.FOFO_ID), fofoId));
1850
							inventoryItems.add(inventoryItemRepository.selectById(y.getInventoryItemId()));
1850
        ItemCriteria itemCriteria = new ItemCriteria();
1851
						});
1851
        itemCriteria.setBrands(mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList()));
1852
					});
1852
        float startValue = 12000;
1853
					// if(invoice)
1853
        itemCriteria.setStartPrice(startValue);
1854
					this.reverseScheme(fofoOrder);
1854
        itemCriteria.setEndPrice(0);
1855
				}
1855
        itemCriteria.setFeaturedPhone(false);
1856
				insuranceService.cancelInsurance(fofoOrder);
1856
        itemCriteria.setSmartPhone(true);
1857
			}
1857
        itemCriteria.setCatalogIds(new ArrayList<>());
1858
		}
1858
        itemCriteria.setExcludeCatalogIds(new ArrayList<>());
1859
	}
1859
        Predicate itemPredicate = itemRepository.getItemPredicate(itemCriteria, cb, itemRoot, tagListingRoot.get("itemId"), tagListingRoot.get("sellingPrice"));
1860
 
1860
        Predicate finalPredicate = cb.and(itemPredicate, p2, p3, joinPredicate);
1861
	@Override
1861
        query = query.multiselect(fofoOrder.get(ProfitMandiConstants.FOFO_ID), cb.count(fofoOrder)).where(finalPredicate).groupBy(fofoOrder.get(ProfitMandiConstants.FOFO_ID));
1862
	public void reverseScheme(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
1862
        List<SimpleEntry> simpleEntries = session.createQuery(query).getResultList();
1863
		String reversalReason = "Order Rolledback/Cancelled/Returned for Invoice #" + fofoOrder.getInvoiceNumber();
1863
        Map<Integer, Long> returnMap = new HashMap<>();
1864
		List<FofoOrderItem> fois = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1864
 
1865
		Set<Integer> inventoryItemIds = fois.stream()
1865
        for (SimpleEntry simpleEntry : simpleEntries) {
1866
				.flatMap(x -> x.getFofoLineItems().stream().map(y -> y.getInventoryItemId()))
1866
            returnMap.put((Integer) simpleEntry.getKey(), (Long) simpleEntry.getValue());
1867
				.collect(Collectors.toSet());
1867
        }
1868
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds);
1868
        return returnMap;
1869
		schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason, SchemeService.OUT_SCHEME_TYPES);
-
 
1870
		schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason,
-
 
1871
				Arrays.asList(SchemeType.INVESTMENT));
-
 
1872
		schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason,
-
 
1873
				Arrays.asList(SchemeType.ACTIVATION));
-
 
1874
		schemeService.reverseSchemes(inventoryItems, fofoOrder.getId(), reversalReason,
-
 
1875
				Arrays.asList(SchemeType.SPECIAL_SUPPORT));
-
 
1876
 
-
 
1877
	}
-
 
1878
 
-
 
1879
	@Override
-
 
1880
	public void reverseActivationScheme(List<Integer> inventoryItemIds) throws ProfitMandiBusinessException {
-
 
1881
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(inventoryItemIds);
-
 
1882
		for (InventoryItem inventoryItem : inventoryItems) {
-
 
1883
			List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByInventoryItemId(inventoryItem.getId());
-
 
1884
			FofoLineItem fofoLineItem = fofoLineItems.get(0);
-
 
1885
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(fofoLineItem.getFofoOrderItemId());
-
 
1886
			FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(fofoOrderItem.getOrderId());
-
 
1887
			String reversalReason = "Scheme rolled back as activation date is invalid for imei "
-
 
1888
					+ inventoryItem.getSerialNumber();
-
 
1889
			schemeService.reverseSchemes(Arrays.asList(inventoryItem), fofoOrder.getId(), reversalReason,
-
 
1890
					Arrays.asList(SchemeType.ACTIVATION));
-
 
1891
			schemeService.reverseSchemes(Arrays.asList(inventoryItem), fofoOrder.getId(), reversalReason,
-
 
1892
					Arrays.asList(SchemeType.SPECIAL_SUPPORT));
-
 
1893
 
-
 
1894
		}
-
 
1895
 
-
 
1896
	}
-
 
1897
 
-
 
1898
	@Override
-
 
1899
	public float getSales(int fofoId, LocalDateTime startDate, LocalDateTime endDate) {
-
 
1900
		Float sales = fofoOrderRepository.selectSaleSumGroupByFofoIds(startDate, endDate).get(fofoId);
-
 
1901
		return sales == null ? 0f : sales;
-
 
1902
	}
-
 
1903
 
-
 
1904
	@Override
-
 
1905
	public LocalDateTime getMaxSalesDate(int fofoId, LocalDateTime startDate, LocalDateTime endDate) {
-
 
1906
		LocalDateTime dateTime = fofoOrderRepository.selectMaxSaleDateGroupByFofoIds(startDate, endDate).get(fofoId);
-
 
1907
		return dateTime;
-
 
1908
	}
-
 
1909
 
-
 
1910
	@Override
-
 
1911
	// Only being used internally
-
 
1912
	public float getSales(int fofoId, LocalDate onDate) {
-
 
1913
		LocalDateTime startTime = LocalDateTime.of(onDate, LocalTime.MIDNIGHT);
-
 
1914
		LocalDateTime endTime = LocalDateTime.of(onDate, LocalTime.MIDNIGHT).plusDays(1);
-
 
1915
		return this.getSales(fofoId, startTime, endTime);
-
 
1916
	}
-
 
1917
 
-
 
1918
	@Override
-
 
1919
	public float getSales(LocalDateTime onDate) {
-
 
1920
		// TODO Auto-generated method stub
-
 
1921
		return 0;
-
 
1922
	}
-
 
1923
 
-
 
1924
	@Override
-
 
1925
	public float getSales(LocalDateTime startDate, LocalDateTime endDate) {
-
 
1926
		// TODO Auto-generated method stub
-
 
1927
		return 0;
-
 
1928
	}
-
 
1929
 
-
 
1930
	@Override
-
 
1931
	public boolean notifyColorChange(int orderId, int itemId) throws ProfitMandiBusinessException {
-
 
1932
		Order order = orderRepository.selectById(orderId);
-
 
1933
		saholicInventoryService.reservationCountByColor(itemId, order);
-
 
1934
 
-
 
1935
		order.getLineItem().setItemId(itemId);
-
 
1936
		Item item = itemRepository.selectById(itemId);
-
 
1937
		order.getLineItem().setColor(item.getColor());
-
 
1938
		return true;
-
 
1939
	}
-
 
1940
 
-
 
1941
	@Override
-
 
1942
	public FofoOrder getOrderByInventoryItemId(int inventoryItemId) throws Exception {
-
 
1943
		List<FofoLineItem> lineItems = fofoLineItemRepository.selectByInventoryItemId(inventoryItemId);
-
 
1944
		if (lineItems.size() > 0) {
-
 
1945
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(lineItems.get(0).getFofoOrderItemId());
-
 
1946
			fofoOrderItem.setFofoLineItems(new HashSet<>(lineItems));
-
 
1947
			FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(fofoOrderItem.getOrderId());
-
 
1948
			fofoOrder.setOrderItem(fofoOrderItem);
-
 
1949
			return fofoOrder;
-
 
1950
		} else {
-
 
1951
			throw new Exception(String.format("Could not find inventoryItemId - %s", inventoryItemId));
-
 
1952
		}
-
 
1953
	}
-
 
1954
 
-
 
1955
	@Override
-
 
1956
	public Map<Integer, Long> carryBagCreditCount(int fofoId) throws ProfitMandiBusinessException {
-
 
1957
 
-
 
1958
		FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
-
 
1959
		LocalDateTime lastCredit = fs.getBagsLastCredited();
-
 
1960
		/*
-
 
1961
		 * long carryBagCount = 0; List<FofoOrder> fofoOrders =
-
 
1962
		 * fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(fofoId,
-
 
1963
		 * lastCredit.atStartOfDay(), LocalDate.now().plusDays(1).atStartOfDay()); for
-
 
1964
		 * (FofoOrder fo : fofoOrders) { carryBagCount +=
-
 
1965
		 * fofoOrderItemRepository.selectByOrderId(fo.getId()).stream() .filter(x ->
-
 
1966
		 * x.getSellingPrice() >= 12000).count();
-
 
1967
		 *
-
 
1968
		 * }
-
 
1969
		 */
-
 
1970
 
-
 
1971
		Session session = sessionFactory.getCurrentSession();
-
 
1972
		CriteriaBuilder cb = session.getCriteriaBuilder();
-
 
1973
 
-
 
1974
		CriteriaQuery<SimpleEntry> query = cb.createQuery(SimpleEntry.class);
-
 
1975
		Root<FofoOrder> fofoOrder = query.from(FofoOrder.class);
-
 
1976
		Root<FofoOrderItem> fofoOrderItem = query.from(FofoOrderItem.class);
-
 
1977
		Root<TagListing> tagListingRoot = query.from(TagListing.class);
-
 
1978
		Root<Item> itemRoot = query.from(Item.class);
-
 
1979
 
-
 
1980
		Predicate p2 = cb.between(fofoOrder.get(ProfitMandiConstants.CREATE_TIMESTAMP), lastCredit,
-
 
1981
				LocalDate.now().atStartOfDay());
-
 
1982
		Predicate p3 = cb.isNull(fofoOrder.get("cancelledTimestamp"));
-
 
1983
		Predicate joinPredicate = cb.and(
-
 
1984
				cb.equal(fofoOrder.get(ProfitMandiConstants.ID), fofoOrderItem.get(ProfitMandiConstants.ORDER_ID)),
-
 
1985
				cb.equal(fofoOrderItem.get("itemId"), tagListingRoot.get("itemId")),
-
 
1986
				cb.equal(itemRoot.get("id"), tagListingRoot.get("itemId")),
-
 
1987
				cb.equal(fofoOrder.get(ProfitMandiConstants.FOFO_ID), fofoId));
-
 
1988
		ItemCriteria itemCriteria = new ItemCriteria();
-
 
1989
		itemCriteria.setBrands(mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
-
 
1990
				.collect(Collectors.toList()));
-
 
1991
		float startValue = 12000;
-
 
1992
		itemCriteria.setStartPrice(startValue);
-
 
1993
		itemCriteria.setEndPrice(0);
-
 
1994
		itemCriteria.setFeaturedPhone(false);
-
 
1995
		itemCriteria.setSmartPhone(true);
-
 
1996
		itemCriteria.setCatalogIds(new ArrayList<>());
-
 
1997
		itemCriteria.setExcludeCatalogIds(new ArrayList<>());
-
 
1998
		Predicate itemPredicate = itemRepository.getItemPredicate(itemCriteria, cb, itemRoot, tagListingRoot.get("itemId"), tagListingRoot.get("sellingPrice"));
-
 
1999
		Predicate finalPredicate = cb.and(itemPredicate, p2, p3, joinPredicate);
-
 
2000
		query = query.multiselect(fofoOrder.get(ProfitMandiConstants.FOFO_ID), cb.count(fofoOrder))
-
 
2001
				.where(finalPredicate).groupBy(fofoOrder.get(ProfitMandiConstants.FOFO_ID));
-
 
2002
		List<SimpleEntry> simpleEntries = session.createQuery(query).getResultList();
-
 
2003
		Map<Integer, Long> returnMap = new HashMap<>();
-
 
2004
 
-
 
2005
		for (SimpleEntry simpleEntry : simpleEntries) {
-
 
2006
			returnMap.put((Integer) simpleEntry.getKey(), (Long) simpleEntry.getValue());
-
 
2007
		}
-
 
2008
		return returnMap;
-
 
2009
 
1869
 
2010
	}
1870
    }
2011
}
1871
}
2012
1872