Subversion Repositories SmartDukaan

Rev

Rev 32634 | Rev 32672 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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