Subversion Repositories SmartDukaan

Rev

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