Subversion Repositories SmartDukaan

Rev

Rev 32672 | Rev 32764 | 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
    }
32724 amit.gupta 1993
 
1994
    @Override
1995
    public boolean refundOrder(int orderId, String refundedBy, String refundReason) throws ProfitMandiBusinessException {
1996
        /*def refund_order(order_id, refunded_by, reason):
1997
        """
1998
        If the order is in RTO_RECEIVED_PRESTINE, DOA_CERT_VALID or DOA_CERT_INVALID state, it does the following:
1999
            1. Creates a refund request for batch processing.
2000
            2. Creates a return order for the warehouse executive to return the shipped material.
2001
            3. Marks the current order as RTO_REFUNDED, DOA_VALID_REFUNDED or DOA_INVALID_REFUNDED final states.
2002
 
2003
        If the order is in SUBMITTED_FOR_PROCESSING or INVENTORY_LOW state, it does the following:
2004
            1. Creates a refund request for batch processing.
2005
            2. Cancels the reservation of the item in the warehouse.
2006
            3. Marks the current order as the REFUNDED final state.
2007
 
2008
        For all COD orders, if the order is in INIT, SUBMITTED_FOR_PROCESSING or INVENTORY_LOW state, it does the following:
2009
            1. Cancels the reservation of the item in the warehouse.
2010
            2. Marks the current order as CANCELED.
2011
 
2012
        In all cases, it updates the reason for cancellation or refund and the person who performed the action.
2013
 
2014
        Returns True if it is successful, False otherwise.
2015
 
2016
        Throws an exception if the order with the given id couldn't be found.
2017
 
2018
        Parameters:
2019
         - order_id
2020
         - refunded_by
2021
         - reason
2022
        """
2023
        LOGGER.info("Refunding order id: {}", orderId);
2024
        Order order = orderRepository.selectById(orderId);
2025
 
2026
        if order.cod:
2027
        logging.info("Refunding COD order with status " + str(order.status))
2028
        status_transition = refund_status_transition
2029
        if order.status not in status_transition.keys():
2030
        raise TransactionServiceException(114, "This order can't be refunded")
2031
 
2032
        if order.status in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
2033
        __update_inventory_reservation(order, refund=True)
2034
        order.statusDescription = "Order Cancelled"
2035
            #Shipment Id and Airway Bill No should be none in case of Cancellation
2036
        order.logisticsTransactionId = None
2037
        order.tracking_id = None
2038
        order.airwaybill_no = None
2039
        elif order.status == OrderStatus.BILLED:
2040
        __create_return_order(order)
2041
        order.statusDescription = "Order Cancelled"
2042
        elif order.status in [OrderStatus.RTO_RECEIVED_PRESTINE, OrderStatus.RTO_RECEIVED_DAMAGED, OrderStatus.RTO_LOST_IN_TRANSIT]:
2043
        if order.status != OrderStatus.RTO_LOST_IN_TRANSIT:
2044
        __create_return_order(order)
2045
        order.statusDescription = "RTO Refunded"
2046
        elif order.status in [OrderStatus.LOST_IN_TRANSIT]:
2047
            #__create_return_order(order)
2048
        order.statusDescription = "Lost in Transit Refunded"
2049
        elif order.status in [OrderStatus.DOA_CERT_INVALID, OrderStatus.DOA_CERT_VALID, OrderStatus.DOA_RECEIVED_DAMAGED, OrderStatus.DOA_LOST_IN_TRANSIT] :
2050
        if order.status != OrderStatus.DOA_LOST_IN_TRANSIT:
2051
        __create_return_order(order)
2052
        __create_refund(order, 0, 'Should be unreachable for now')
2053
        order.statusDescription = "DOA Refunded"
2054
        elif order.status in [OrderStatus.RET_PRODUCT_UNUSABLE, OrderStatus.RET_PRODUCT_USABLE, OrderStatus.RET_RECEIVED_DAMAGED, OrderStatus.RET_LOST_IN_TRANSIT] :
2055
        if order.status != OrderStatus.RET_LOST_IN_TRANSIT:
2056
        __create_return_order(order)
2057
        __create_refund(order, 0, 'Should be unreachable for now')
2058
        order.statusDescription = "Return Refunded"
2059
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
2060
        if order.previousStatus in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
2061
        __update_inventory_reservation(order, refund=True)
2062
        order.statusDescription = "Order Cancelled on customer request"
2063
        elif order.previousStatus == OrderStatus.BILLED:
2064
        __create_return_order(order)
2065
        order.statusDescription = "Order Cancelled on customer request"
2066
        order.received_return_timestamp = datetime.datetime.now()
2067
    else:
2068
        status_transition = {OrderStatus.LOST_IN_TRANSIT : OrderStatus.LOST_IN_TRANSIT_REFUNDED,
2069
                OrderStatus.RTO_RECEIVED_PRESTINE : OrderStatus.RTO_REFUNDED,
2070
                OrderStatus.RTO_RECEIVED_DAMAGED : OrderStatus.RTO_DAMAGED_REFUNDED,
2071
                OrderStatus.RTO_LOST_IN_TRANSIT : OrderStatus.RTO_LOST_IN_TRANSIT_REFUNDED,
2072
                OrderStatus.DOA_CERT_INVALID : OrderStatus.DOA_INVALID_REFUNDED,
2073
                OrderStatus.DOA_CERT_VALID : OrderStatus.DOA_VALID_REFUNDED,
2074
                OrderStatus.DOA_RECEIVED_DAMAGED : OrderStatus.DOA_REFUNDED_RCVD_DAMAGED,
2075
                OrderStatus.DOA_LOST_IN_TRANSIT : OrderStatus.DOA_REFUNDED_LOST_IN_TRANSIT,
2076
                OrderStatus.RET_PRODUCT_UNUSABLE : OrderStatus.RET_PRODUCT_UNUSABLE_REFUNDED,
2077
                OrderStatus.RET_PRODUCT_USABLE : OrderStatus.RET_PRODUCT_USABLE_REFUNDED,
2078
                OrderStatus.RET_RECEIVED_DAMAGED : OrderStatus.RET_REFUNDED_RCVD_DAMAGED,
2079
                OrderStatus.RET_LOST_IN_TRANSIT : OrderStatus.RET_REFUNDED_LOST_IN_TRANSIT,
2080
                OrderStatus.SUBMITTED_FOR_PROCESSING : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2081
                OrderStatus.INVENTORY_LOW : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2082
                OrderStatus.LOW_INV_PO_RAISED : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2083
                OrderStatus.LOW_INV_REVERSAL_IN_PROCESS : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2084
                OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2085
                OrderStatus.ACCEPTED : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2086
                OrderStatus.BILLED : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
2087
                OrderStatus.CANCEL_REQUEST_CONFIRMED : OrderStatus.CANCELLED_ON_CUSTOMER_REQUEST,
2088
                OrderStatus.PAYMENT_FLAGGED : OrderStatus.PAYMENT_FLAGGED_DENIED
2089
                     }
2090
        if order.status not in status_transition.keys():
2091
        raise TransactionServiceException(114, "This order can't be refunded")
2092
 
2093
        if order.status in [OrderStatus.RTO_RECEIVED_PRESTINE, OrderStatus.RTO_RECEIVED_DAMAGED, OrderStatus.RTO_LOST_IN_TRANSIT] :
2094
        if order.status != OrderStatus.RTO_LOST_IN_TRANSIT:
2095
        __create_return_order(order)
2096
        __create_refund(order, order.wallet_amount, 'Order #{0} is RTO refunded'.format(order.id))
2097
        order.statusDescription = "RTO Refunded"
2098
            #Start:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
2099
        try:
2100
        crmServiceClient = CRMClient().get_client()
2101
        ticket =Ticket()
2102
        activity = Activity()
2103
 
2104
        description = "Creating Ticket for " + order.statusDescription + " Order"
2105
        ticket.creatorId = 1
2106
        ticket.assigneeId = 34
2107
        ticket.category = TicketCategory.RTO_REFUND
2108
        ticket.priority = TicketPriority.MEDIUM
2109
        ticket.status = TicketStatus.OPEN
2110
        ticket.description = description
2111
        ticket.orderId = order.id
2112
 
2113
        activity.creatorId = 1
2114
        activity.ticketAssigneeId = ticket.assigneeId
2115
        activity.type = ActivityType.OTHER
2116
        activity.description = description
2117
        activity.ticketCategory = ticket.category
2118
        activity.ticketDescription = ticket.description
2119
        activity.ticketPriority = ticket.priority
2120
        activity.ticketStatus = ticket.status
2121
 
2122
        ticket.customerId= order.customer_id
2123
        ticket.customerEmailId = order.customer_email
2124
        ticket.customerMobileNumber = order.customer_mobilenumber
2125
        ticket.customerName = order.customer_name
2126
        activity.customerId = ticket.customerId
2127
        activity.customerEmailId = order.customer_email
2128
        activity.customerMobileNumber = order.customer_mobilenumber
2129
        activity.customerName = order.customer_name
2130
 
2131
        crmServiceClient.insertTicket(ticket, activity)
2132
 
2133
        except:
2134
        print "Ticket for RTO Refund is not created."
2135
            #End:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
2136
        elif order.status in [OrderStatus.LOST_IN_TRANSIT]:
2137
            #__create_return_order(order)
2138
        __create_refund(order, order.wallet_amount, 'Order #{0} is Lost in Transit'.format(order.id))
2139
        order.statusDescription = "Lost in Transit Refunded"
2140
        elif order.status in [OrderStatus.DOA_CERT_INVALID, OrderStatus.DOA_CERT_VALID, OrderStatus.DOA_RECEIVED_DAMAGED, OrderStatus.DOA_LOST_IN_TRANSIT] :
2141
        if order.status != OrderStatus.DOA_LOST_IN_TRANSIT:
2142
        __create_return_order(order)
2143
        __create_refund(order, 0, 'This should be unreachable')
2144
        order.statusDescription = "DOA Refunded"
2145
        elif order.status in [OrderStatus.RET_PRODUCT_UNUSABLE, OrderStatus.RET_PRODUCT_USABLE, OrderStatus.RET_RECEIVED_DAMAGED, OrderStatus.RET_LOST_IN_TRANSIT] :
2146
        if order.status != OrderStatus.RET_LOST_IN_TRANSIT:
2147
        __create_return_order(order)
2148
        __create_refund(order, 0, 'This should be unreachable')
2149
        order.statusDescription = "Return Refunded"
2150
        elif order.status in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
2151
        __update_inventory_reservation(order, refund=True)
2152
        order.statusDescription = "Order Refunded"
2153
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
2154
        if order.previousStatus in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.PAYMENT_FLAGGED, OrderStatus.ACCEPTED]:
2155
        __update_inventory_reservation(order, refund=True)
2156
        order.statusDescription = "Order Cancelled on customer request"
2157
        elif order.previousStatus == OrderStatus.BILLED:
2158
        __create_refund(order, order.wallet_amount,  'Order #{0} Cancelled on customer request'.format(order.id))
2159
        order.statusDescription = "Order Cancelled on customer request"
2160
 
2161
        elif order.status == OrderStatus.PAYMENT_FLAGGED:
2162
        __update_inventory_reservation(order, refund=True)
2163
        order.statusDescription = "Order Cancelled due to payment flagged"
2164
 
2165
    # For orders that are cancelled after being billed, we need to scan in the scanned out
2166
    # inventory item and change availability accordingly
2167
        inventoryClient = InventoryClient().get_client()
2168
        warehouse = inventoryClient.getWarehouse(order.warehouse_id)
2169
        if warehouse.billingType == BillingType.OURS or warehouse.billingType == BillingType.OURS_EXTERNAL:
2170
        #Now BILLED orders can also be refunded directly with low inventory cancellations
2171
        if order.status in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH]:
2172
        __create_refund(order, order.wallet_amount, reason)
2173
        if order.status in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH] or (order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED and order.previousStatus in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH]):
2174
        lineitem = order.lineitems[0]
2175
        catalogClient = CatalogClient().get_client()
2176
        item = catalogClient.getItem(lineitem.item_id)
2177
        warehouseClient = WarehouseClient().get_client()
2178
        if warehouse.billingType == BillingType.OURS:
2179
        if ItemType.SERIALIZED == item.type:
2180
        for serial_number in str(lineitem.serial_number).split(','):
2181
        warehouseClient.scanSerializedItemForOrder(serial_number, ScanType.SALE_RET, order.id, order.fulfilmentWarehouseId, 1, order.warehouse_id)
2182
                else:
2183
        warehouseClient.scanForOrder(None, ScanType.SALE_RET, lineitem.quantity, order.id, order.fulfilmentWarehouseId, order.warehouse_id)
2184
        if warehouse.billingType == BillingType.OURS_EXTERNAL:
2185
        warehouseClient.scanForOursExternalSaleReturn(order.id, lineitem.transfer_price)
2186
        if order.freebieItemId:
2187
        warehouseClient.scanfreebie(order.id, order.freebieItemId, 0, ScanType.SALE_RET)
2188
 
2189
        order.status = status_transition[order.status]
2190
        order.statusDescription = OrderStatus._VALUES_TO_NAMES[order.status]
2191
        order.refund_timestamp = datetime.datetime.now()
2192
        order.refunded_by = refunded_by
2193
        order.refund_reason = reason
2194
    #to re evaluate the shipping charge if any order is being cancelled.
2195
    #_revaluate_shiping(order_id)
2196
        session.commit()
2197
        return True*/
2198
        return true;
2199
    }
2200
 
2201
    @Autowired
2202
    DebitNoteRepository debitNoteRepository;
2203
 
2204
    //initiate refund only if the stock is returned
2205
 
25724 amit.gupta 2206
}