Subversion Repositories SmartDukaan

Rev

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