Subversion Repositories SmartDukaan

Rev

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