Subversion Repositories SmartDukaan

Rev

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