Subversion Repositories SmartDukaan

Rev

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