Subversion Repositories SmartDukaan

Rev

Rev 32145 | Rev 32219 | 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
 
32218 tejbeer 3
import java.io.ByteArrayInputStream;
4
import java.io.InputStream;
5
import java.time.LocalDate;
6
import java.time.LocalDateTime;
7
import java.time.LocalTime;
8
import java.util.AbstractMap.SimpleEntry;
9
import java.util.ArrayList;
10
import java.util.Arrays;
11
import java.util.HashMap;
12
import java.util.HashSet;
13
import java.util.Iterator;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Optional;
17
import java.util.Random;
18
import java.util.Set;
19
import java.util.function.Function;
20
import java.util.stream.Collectors;
21
 
22
import javax.persistence.criteria.CriteriaBuilder;
23
import javax.persistence.criteria.CriteriaQuery;
24
import javax.persistence.criteria.Predicate;
25
import javax.persistence.criteria.Root;
26
 
27
import org.apache.logging.log4j.LogManager;
28
import org.apache.logging.log4j.Logger;
29
import org.hibernate.Session;
30
import org.hibernate.SessionFactory;
31
import org.json.JSONObject;
32
import org.springframework.beans.factory.annotation.Autowired;
33
import org.springframework.beans.factory.annotation.Qualifier;
34
import org.springframework.beans.factory.annotation.Value;
35
import org.springframework.cache.annotation.Cacheable;
36
import org.springframework.core.io.InputStreamResource;
37
import org.springframework.http.HttpHeaders;
38
import org.springframework.http.HttpStatus;
39
import org.springframework.http.ResponseEntity;
40
import org.springframework.stereotype.Component;
41
 
24264 amit.gupta 42
import com.spice.profitmandi.common.enumuration.ItemType;
23202 ashik.ali 43
import com.spice.profitmandi.common.enumuration.SearchType;
22859 ashik.ali 44
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32218 tejbeer 45
import com.spice.profitmandi.common.model.BadReturnRequest;
46
import com.spice.profitmandi.common.model.CartFofo;
47
import com.spice.profitmandi.common.model.CreateOrderRequest;
48
import com.spice.profitmandi.common.model.CreditNotePdfModel;
49
import com.spice.profitmandi.common.model.CustomAddress;
50
import com.spice.profitmandi.common.model.CustomCustomer;
51
import com.spice.profitmandi.common.model.CustomFofoOrderItem;
52
import com.spice.profitmandi.common.model.CustomInsurancePolicy;
53
import com.spice.profitmandi.common.model.CustomOrderItem;
54
import com.spice.profitmandi.common.model.CustomPaymentOption;
55
import com.spice.profitmandi.common.model.CustomRetailer;
56
import com.spice.profitmandi.common.model.FoiBadReturnRequest;
57
import com.spice.profitmandi.common.model.GstRate;
58
import com.spice.profitmandi.common.model.InsuranceModel;
59
import com.spice.profitmandi.common.model.InvoicePdfModel;
60
import com.spice.profitmandi.common.model.ItemIdQuantityAvailability;
61
import com.spice.profitmandi.common.model.PriceModel;
62
import com.spice.profitmandi.common.model.ProfitMandiConstants;
63
import com.spice.profitmandi.common.model.Quantity;
64
import com.spice.profitmandi.common.model.SerialNumberDetail;
23650 amit.gupta 65
import com.spice.profitmandi.common.util.FormattingUtils;
22859 ashik.ali 66
import com.spice.profitmandi.common.util.StringUtils;
23172 ashik.ali 67
import com.spice.profitmandi.common.util.Utils;
29515 tejbeer 68
import com.spice.profitmandi.common.web.client.RestClient;
22859 ashik.ali 69
import com.spice.profitmandi.dao.entity.catalog.Item;
25103 amit.gupta 70
import com.spice.profitmandi.dao.entity.catalog.TagListing;
32218 tejbeer 71
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
72
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
73
import com.spice.profitmandi.dao.entity.dtr.Retailer;
74
import com.spice.profitmandi.dao.entity.dtr.ScratchOffer;
75
import com.spice.profitmandi.dao.entity.dtr.User;
76
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
77
import com.spice.profitmandi.dao.entity.fofo.Customer;
78
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
79
import com.spice.profitmandi.dao.entity.fofo.CustomerCreditNote;
80
import com.spice.profitmandi.dao.entity.fofo.CustomerReturnItem;
81
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
82
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
83
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
84
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
85
import com.spice.profitmandi.dao.entity.fofo.HygieneData;
86
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
87
import com.spice.profitmandi.dao.entity.fofo.InvoiceNumberGenerationSequence;
88
import com.spice.profitmandi.dao.entity.fofo.LiveDemoSerialNumber;
89
import com.spice.profitmandi.dao.entity.fofo.PendingOrder;
90
import com.spice.profitmandi.dao.entity.fofo.PendingOrderItem;
91
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
28978 amit.gupta 92
import com.spice.profitmandi.dao.entity.inventory.State;
24917 tejbeer 93
import com.spice.profitmandi.dao.entity.transaction.Order;
22859 ashik.ali 94
import com.spice.profitmandi.dao.entity.user.Address;
95
import com.spice.profitmandi.dao.entity.user.Counter;
96
import com.spice.profitmandi.dao.entity.user.PrivateDealUser;
27516 amit.gupta 97
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
24264 amit.gupta 98
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
23546 ashik.ali 99
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
23650 amit.gupta 100
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
22859 ashik.ali 101
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
23655 amit.gupta 102
import com.spice.profitmandi.dao.enumuration.fofo.SettlementType;
29515 tejbeer 103
import com.spice.profitmandi.dao.enumuration.inventory.ScratchedGift;
28339 tejbeer 104
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
22859 ashik.ali 105
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
26817 amit.gupta 106
import com.spice.profitmandi.dao.repository.catalog.StateGstRateRepository;
24823 amit.gupta 107
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
32218 tejbeer 108
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
109
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
110
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
111
import com.spice.profitmandi.dao.repository.dtr.Mongo;
112
import com.spice.profitmandi.dao.repository.dtr.PaymentOptionTransactionRepository;
113
import com.spice.profitmandi.dao.repository.dtr.PolicyNumberGenerationSequenceRepository;
114
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
115
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
116
import com.spice.profitmandi.dao.repository.dtr.ScratchOfferRepository;
117
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
118
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
119
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
120
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
121
import com.spice.profitmandi.dao.repository.fofo.CustomerCreditNoteRepository;
122
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
123
import com.spice.profitmandi.dao.repository.fofo.CustomerReturnItemRepository;
124
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
125
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
126
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
127
import com.spice.profitmandi.dao.repository.fofo.HygieneDataRepository;
128
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
129
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
130
import com.spice.profitmandi.dao.repository.fofo.LiveDemoBillingRespository;
131
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
132
import com.spice.profitmandi.dao.repository.fofo.PendingOrderItemRepository;
133
import com.spice.profitmandi.dao.repository.fofo.PendingOrderRepository;
134
import com.spice.profitmandi.dao.repository.fofo.PurchaseReturnItemRepository;
135
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24854 amit.gupta 136
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
24917 tejbeer 137
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
22859 ashik.ali 138
import com.spice.profitmandi.dao.repository.user.AddressRepository;
139
import com.spice.profitmandi.dao.repository.user.CounterRepository;
140
import com.spice.profitmandi.dao.repository.user.PrivateDealUserRepository;
27516 amit.gupta 141
import com.spice.profitmandi.dao.repository.warehouse.WarehouseInventoryItemRepository;
25724 amit.gupta 142
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
31274 amit.gupta 143
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
23418 ashik.ali 144
import com.spice.profitmandi.service.inventory.InventoryService;
23655 amit.gupta 145
import com.spice.profitmandi.service.inventory.PurchaseReturnService;
26891 amit.gupta 146
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
28166 tejbeer 147
import com.spice.profitmandi.service.offers.ItemCriteria;
22859 ashik.ali 148
import com.spice.profitmandi.service.pricing.PricingService;
149
import com.spice.profitmandi.service.scheme.SchemeService;
23655 amit.gupta 150
import com.spice.profitmandi.service.user.RetailerService;
23395 amit.gupta 151
import com.spice.profitmandi.service.wallet.WalletService;
22859 ashik.ali 152
 
153
@Component
154
public class OrderServiceImpl implements OrderService {
155
 
32145 tejbeer 156
    private static final Logger LOGGER = LogManager.getLogger(OrderServiceImpl.class);
22859 ashik.ali 157
 
32145 tejbeer 158
    private static Map<String, Integer> serialNumberOrderIdMap = new HashMap<>();
31030 amit.gupta 159
 
32145 tejbeer 160
    static {
161
        serialNumberOrderIdMap.put("862897055749275", 67228);
162
    }
31030 amit.gupta 163
 
32145 tejbeer 164
    @Autowired
165
    @Qualifier("fofoInventoryItemRepository")
166
    private InventoryItemRepository inventoryItemRepository;
27083 amit.gupta 167
 
32145 tejbeer 168
    @Autowired
169
    private StateGstRateRepository stateGstRateRepository;
23650 amit.gupta 170
 
32145 tejbeer 171
    @Autowired
172
    private SaholicInventoryService saholicInventoryService;
27083 amit.gupta 173
 
32145 tejbeer 174
    @Autowired
175
    private LiveDemoBillingRespository liveDemoBillingRespository;
24823 amit.gupta 176
 
32145 tejbeer 177
    @Autowired
178
    private InsuranceService insuranceService;
25724 amit.gupta 179
 
32145 tejbeer 180
    @Autowired
181
    private WalletService walletService;
22859 ashik.ali 182
 
32145 tejbeer 183
    @Autowired
184
    @Qualifier("fofoCurrentInventorySnapshotRepository")
185
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
22859 ashik.ali 186
 
32145 tejbeer 187
    @Autowired
188
    private InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
22859 ashik.ali 189
 
32145 tejbeer 190
    @Autowired
191
    private PurchaseReturnService purchaseReturnService;
23655 amit.gupta 192
 
32145 tejbeer 193
    @Autowired
194
    private RetailerService retailerService;
23655 amit.gupta 195
 
32145 tejbeer 196
    @Autowired
197
    private CustomerRepository customerRepository;
23650 amit.gupta 198
 
32145 tejbeer 199
    @Autowired
200
    private PurchaseReturnItemRepository purchaseReturnItemRepository;
22859 ashik.ali 201
 
32145 tejbeer 202
    @Autowired
203
    private AddressRepository addressRepository;
22859 ashik.ali 204
 
32145 tejbeer 205
    @Autowired
206
    private FofoLineItemRepository fofoLineItemRepository;
22859 ashik.ali 207
 
32145 tejbeer 208
    @Autowired
209
    private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
27516 amit.gupta 210
 
32145 tejbeer 211
    @Autowired
212
    private FofoOrderItemRepository fofoOrderItemRepository;
23650 amit.gupta 213
 
32145 tejbeer 214
    @Autowired
215
    private PaymentOptionRepository paymentOptionRepository;
22859 ashik.ali 216
 
32145 tejbeer 217
    @Autowired
218
    private CustomerReturnItemRepository customerReturnItemRepository;
23650 amit.gupta 219
 
32145 tejbeer 220
    @Autowired
221
    @Qualifier("fofoScanRecordRepository")
222
    private ScanRecordRepository scanRecordRepository;
22859 ashik.ali 223
 
32145 tejbeer 224
    @Autowired
225
    private FofoOrderRepository fofoOrderRepository;
22859 ashik.ali 226
 
32145 tejbeer 227
    @Autowired
228
    private RetailerRepository retailerRepository;
22859 ashik.ali 229
 
32145 tejbeer 230
    @Autowired
231
    private UserRepository userRepository;
22859 ashik.ali 232
 
32145 tejbeer 233
    @Autowired
234
    private UserAccountRepository userAccountRepository;
22859 ashik.ali 235
 
32145 tejbeer 236
    @Autowired
237
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
22859 ashik.ali 238
 
32145 tejbeer 239
    @Autowired
240
    private CustomerAddressRepository customerAddressRepository;
22859 ashik.ali 241
 
32145 tejbeer 242
    @Autowired
243
    @Qualifier("catalogItemRepository")
244
    private ItemRepository itemRepository;
23650 amit.gupta 245
 
32145 tejbeer 246
    @Autowired
247
    private InsuranceProviderRepository insuranceProviderRepository;
23650 amit.gupta 248
 
32145 tejbeer 249
    @Autowired
250
    private InsurancePolicyRepository insurancePolicyRepository;
24917 tejbeer 251
 
32145 tejbeer 252
    @Autowired
253
    private StateRepository stateRepository;
23650 amit.gupta 254
 
32145 tejbeer 255
    @Autowired
256
    private PolicyNumberGenerationSequenceRepository policyNumberGenerationSequenceRepository;
23650 amit.gupta 257
 
32145 tejbeer 258
    @Autowired
259
    private PricingService pricingService;
23650 amit.gupta 260
 
32145 tejbeer 261
    @Autowired
262
    private PrivateDealUserRepository privateDealUserRepository;
23650 amit.gupta 263
 
32145 tejbeer 264
    @Autowired
265
    private TagListingRepository tagListingRepository;
24823 amit.gupta 266
 
32145 tejbeer 267
    @Autowired
268
    private CounterRepository counterRepository;
23650 amit.gupta 269
 
32145 tejbeer 270
    @Autowired
271
    private FofoStoreRepository fofoStoreRepository;
23650 amit.gupta 272
 
32145 tejbeer 273
    @Autowired
274
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
23650 amit.gupta 275
 
32145 tejbeer 276
    @Autowired
277
    private SchemeService schemeService;
23650 amit.gupta 278
 
32145 tejbeer 279
    private static final List<Integer> orderIdsConsumed = new ArrayList<>();
28166 tejbeer 280
 
32145 tejbeer 281
    @Autowired
282
    @Qualifier("fofoInventoryService")
283
    private InventoryService inventoryService;
23650 amit.gupta 284
 
32145 tejbeer 285
    @Autowired
286
    private CustomerCreditNoteRepository customerCreditNoteRepository;
23650 amit.gupta 287
 
32145 tejbeer 288
    @Autowired
289
    private OrderRepository orderRepository;
24917 tejbeer 290
 
32145 tejbeer 291
    @Autowired
292
    private HygieneDataRepository hygieneDataRepository;
25640 tejbeer 293
 
32145 tejbeer 294
    @Autowired
295
    private SessionFactory sessionFactory;
28166 tejbeer 296
 
32145 tejbeer 297
    @Autowired
298
    private Mongo mongoClient;
28964 tejbeer 299
 
32145 tejbeer 300
    @Autowired
301
    private PendingOrderRepository pendingOrderRepository;
28964 tejbeer 302
 
32145 tejbeer 303
    @Autowired
304
    private PendingOrderItemRepository pendingOrderItemRepository;
28166 tejbeer 305
 
32145 tejbeer 306
    @Autowired
307
    private ScratchOfferRepository scratchOfferRepository;
29515 tejbeer 308
 
32145 tejbeer 309
    @Autowired
310
    RestClient restClient;
29515 tejbeer 311
 
32145 tejbeer 312
    @Value("${prod}")
313
    private boolean prodEnv;
29515 tejbeer 314
 
32145 tejbeer 315
    private static final String SMS_GATEWAY = "http://api.pinnacle.in/index.php/sms/send";
316
    private static final String SENDER = "SMTDKN";
29515 tejbeer 317
 
32145 tejbeer 318
    public static final String APP_DOWNLOAD_BILLING_TEMPLATE_ID = "1507163542403945677";
29515 tejbeer 319
 
32145 tejbeer 320
    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 321
 
32145 tejbeer 322
    @Override
323
    public int createOrder(CreateOrderRequest createOrderRequest, int fofoId, boolean accessoriesDeals) throws ProfitMandiBusinessException {
324
        LOGGER.info("fofoId -- {} Order Request -- {}", fofoId, createOrderRequest);
325
        CustomCustomer customCustomer = createOrderRequest.getCustomer();
326
        Customer customer = customerRepository.selectById(customCustomer.getCustomerId());
22872 ashik.ali 327
 
32145 tejbeer 328
        if (!StringUtils.isValidGstNumber(customCustomer.getGstNumber())) {
329
            LOGGER.error("invalid customer gstNumber {} ", customCustomer.getGstNumber());
330
            throw new ProfitMandiBusinessException(ProfitMandiConstants.CUSTOMER_GST_NUMBER, customCustomer.getGstNumber(), "VE_1072");
331
        }
23650 amit.gupta 332
 
32145 tejbeer 333
        Map<Integer, Integer> itemIdQuantity = new HashMap<>(); // this is for error
334
        Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap = new HashMap<>();
335
        Map<Integer, Float> lineItemPrice = new HashMap<>(); // this is for pricing error
23650 amit.gupta 336
 
32145 tejbeer 337
        float totalAmount = 0;
338
        boolean noGST = false;
339
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
340
            // itemIds.add(customFofoOrderItem.getItemId());
341
            Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
342
            if (!serialNumbers.isEmpty() && customFofoOrderItem.getQuantity() != serialNumbers.size()) {
343
                itemIdQuantity.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
344
            }
345
            if (!(customFofoOrderItem.getSellingPrice() > 0)) {
346
                lineItemPrice.put(customFofoOrderItem.getItemId(), customFofoOrderItem.getSellingPrice());
347
            } else {
348
                totalAmount = totalAmount + customFofoOrderItem.getSellingPrice() * customFofoOrderItem.getQuantity();
349
                for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
350
                    if (serialNumberDetail.getAmount() > 0) {
351
                        totalAmount = totalAmount + serialNumberDetail.getAmount();
352
                    }
353
                }
354
            }
23650 amit.gupta 355
 
32145 tejbeer 356
            itemIdCustomFofoOrderItemMap.put(customFofoOrderItem.getItemId(), customFofoOrderItem);
357
        }
358
        if (!itemIdQuantity.isEmpty()) {
359
            // if item quantity does not match with given serialnumbers size
360
            LOGGER.error("itemId's quantity should be equal to given serialnumber size {} ", itemIdQuantity);
361
            throw new ProfitMandiBusinessException("itemIdQuantity", itemIdQuantity, "FFORDR_1001");
362
            // return "error";
363
        }
23650 amit.gupta 364
 
32145 tejbeer 365
        this.validatePaymentOptionsAndTotalAmount(createOrderRequest.getPaymentOptions(), totalAmount);
23650 amit.gupta 366
 
32145 tejbeer 367
        if (!lineItemPrice.isEmpty()) {
368
            // given fofo line item price must be greater than zero
369
            LOGGER.error("requested itemId's selling price must greater than 0");
370
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PRICE, lineItemPrice, "FFORDR_1002");
371
        }
22859 ashik.ali 372
 
32145 tejbeer 373
        List<CurrentInventorySnapshot> currentInventorySnapshots = currentInventorySnapshotRepository.selectByFofoItemIds(fofoId, itemIdCustomFofoOrderItemMap.keySet());
23650 amit.gupta 374
 
32145 tejbeer 375
        this.validateCurrentInventorySnapshotQuantities(currentInventorySnapshots, itemIdCustomFofoOrderItemMap);
22859 ashik.ali 376
 
32145 tejbeer 377
        List<Item> items = itemRepository.selectByIds(itemIdCustomFofoOrderItemMap.keySet());
378
        if (items.size() != itemIdCustomFofoOrderItemMap.keySet().size()) {
379
            LOGGER.error("Requested ItemIds not found in catalog");
380
            // invalid itemIds
381
            throw new ProfitMandiBusinessException("invalidItemIds", itemIdCustomFofoOrderItemMap.keySet(), "FFORDR_1003");
382
        }
23650 amit.gupta 383
 
32145 tejbeer 384
        Map<Integer, Item> itemMap = this.toItemMap(items);
23650 amit.gupta 385
 
32145 tejbeer 386
        Set<Integer> nonSerializedItemIds = new HashSet<>();
387
        Set<String> serialNumbers = new HashSet<>();
388
        List<InsuranceModel> insuredModels = new ArrayList<>();
389
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
390
            Item item = itemMap.get(customFofoOrderItem.getItemId());
391
            noGST = item.getHsnCode().equals("NOGST");
392
            if (item.getType().equals(ItemType.SERIALIZED)) {
393
                for (SerialNumberDetail serialNumberDetail : customFofoOrderItem.getSerialNumberDetails()) {
394
                    serialNumbers.add(serialNumberDetail.getSerialNumber());
395
                    if (serialNumberDetail.getAmount() > 0) {
396
                        if (customer.getEmailId() == null || customer.getEmailId().equals("")) {
397
                            throw new ProfitMandiBusinessException("Email Id is required for insurance", "Email Id is required for insurance", "Email Id is required for insurance");
398
                        }
399
                        InsuranceModel im = new InsuranceModel();
400
                        im.setBrand(item.getBrand());
401
                        im.setColor(item.getColor());
402
                        im.setModelName(item.getModelName() + item.getModelNumber());
403
                        im.setInsuranceAmount(serialNumberDetail.getAmount());
404
                        im.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
405
                        im.setInsuranceId(serialNumberDetail.getInsurance());
406
                        im.setSerialNumber(serialNumberDetail.getSerialNumber());
407
                        im.setMemory(serialNumberDetail.getMemory());
408
                        im.setRam(serialNumberDetail.getRam());
409
                        im.setMfgDate(serialNumberDetail.getMfgDate());
410
                        insuredModels.add(im);
411
                        // Check for free insurance code
412
                        try {
413
                            Map<String, List<MobileInsurancePlan>> mobileInsurancePlanMap = insuranceService.getAllPlans(item.getId(), im.getDeviceSellingPrice());
414
                            MobileInsurancePlan mobileInsurancePlan = mobileInsurancePlanMap.entrySet().stream().flatMap(x -> x.getValue().stream()).filter(x -> x.getProductId().equals(serialNumberDetail.getInsurance())).findFirst().get();
415
                            LOGGER.info("OneAssist Plan - {}", mobileInsurancePlanMap);
416
                            LOGGER.info("SerialNumber Detqail InsuranceId - {}", serialNumberDetail.getInsurance());
417
                            LOGGER.info("product description - {}", mobileInsurancePlan);
418
                            if (mobileInsurancePlan.getPlanName().equals("OneAssist Damage Protection Plan")) {
419
                                MobileInsurancePlan freePlan = mobileInsurancePlanMap.get("Prolong Extendended Warranty(SmartDukaan Special Price)").get(0);
420
                                InsuranceModel imFree = new InsuranceModel();
421
                                imFree.setBrand(item.getBrand());
422
                                imFree.setColor(item.getColor());
423
                                imFree.setModelName(item.getModelName() + item.getModelNumber());
424
                                imFree.setInsuranceAmount(0);
425
                                imFree.setDeviceSellingPrice(customFofoOrderItem.getSellingPrice());
426
                                imFree.setInsuranceId(freePlan.getProductId());
427
                                imFree.setSerialNumber(serialNumberDetail.getSerialNumber());
428
                                imFree.setMemory(serialNumberDetail.getMemory());
429
                                imFree.setRam(serialNumberDetail.getRam());
430
                                imFree.setMfgDate(serialNumberDetail.getMfgDate());
431
                                insuredModels.add(imFree);
432
                            }
433
                        } catch (Exception e) {
434
                            LOGGER.error("Exception - {}", e);
435
                            throw new ProfitMandiBusinessException("problem fetching plans", "problem fetching plans", "problem fetching plans");
436
                        }
437
                    }
31274 amit.gupta 438
 
32145 tejbeer 439
                }
440
            } else {
441
                nonSerializedItemIds.add(customFofoOrderItem.getItemId());
442
            }
443
        }
23650 amit.gupta 444
 
32145 tejbeer 445
        Map<Integer, Set<InventoryItem>> serializedInventoryItemMap = new HashMap<>();
446
        Map<Integer, Set<InventoryItem>> nonSerializedInventoryItemMap = new HashMap<>();
447
        // Map<String, Float> serialNumberItemPrice = new HashMap<>();
23650 amit.gupta 448
 
32145 tejbeer 449
        if (!serialNumbers.isEmpty()) {
450
            List<InventoryItem> serializedInventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, serialNumbers, false);
451
            LOGGER.info("serializedInventoryItems {}", serializedInventoryItems);
452
            for (InventoryItem inventoryItem : serializedInventoryItems) {
453
                if (inventoryItem.getGoodQuantity() == 1) {
454
                    if (serializedInventoryItemMap.containsKey(inventoryItem.getItemId())) {
455
                        serializedInventoryItemMap.get(inventoryItem.getItemId()).add(inventoryItem);
456
                    } else {
457
                        Set<InventoryItem> itemIdInventoryItems = new HashSet<>();
458
                        itemIdInventoryItems.add(inventoryItem);
459
                        serializedInventoryItemMap.put(inventoryItem.getItemId(), itemIdInventoryItems);
460
                    }
461
                }
462
            }
463
        }
23418 ashik.ali 464
 
32145 tejbeer 465
        if (!nonSerializedItemIds.isEmpty()) {
466
            List<InventoryItem> nonSerializedInventoryItems = inventoryItemRepository.selectByFofoIdItemIds(fofoId, nonSerializedItemIds);
467
            LOGGER.info("nonSerializedInventoryItems {}", nonSerializedInventoryItems);
468
            for (InventoryItem it : nonSerializedInventoryItems) {
469
                if (it.getGoodQuantity() > 0) {
470
                    if (nonSerializedInventoryItemMap.containsKey(it.getItemId())) {
471
                        nonSerializedInventoryItemMap.get(it.getItemId()).add(it);
472
                    } else {
473
                        Set<InventoryItem> tmp = new HashSet<>();
474
                        tmp.add(it);
475
                        nonSerializedInventoryItemMap.put(it.getItemId(), tmp);
476
                    }
477
                }
478
            }
479
        }
23650 amit.gupta 480
 
32145 tejbeer 481
        this.validateItemsSerializedNonSerialized(items, itemIdCustomFofoOrderItemMap);
22859 ashik.ali 482
 
32145 tejbeer 483
        Map<Integer, Set<InventoryItem>> inventoryItemsToBill = new HashMap<>();
484
        Map<Integer, Integer> inventoryItemIdQuantityUsed = new HashMap<>(); // to keep track of inventoryitem quanity
485
        // used for scan records insertion
22859 ashik.ali 486
 
32145 tejbeer 487
        LOGGER.info("itemMap keys {}", itemMap.keySet());
488
        // Lets reduce quantity and decide what inventory items to use.
489
        for (Item item : items) {
490
            if (item.getType().equals(ItemType.SERIALIZED)) {
491
                // TODO:handle null
492
                if (serializedInventoryItemMap.get(item.getId()) == null || itemIdCustomFofoOrderItemMap.get(item.getId()).getSerialNumberDetails().size() != serializedInventoryItemMap.get(item.getId()).size()) {
24440 amit.gupta 493
 
32145 tejbeer 494
                    List<String> invalidSerialNumbers = itemIdCustomFofoOrderItemMap.get(item.getId()).getSerialNumberDetails().stream().map(x -> x.getSerialNumber()).collect(Collectors.toList());
495
                    throw new ProfitMandiBusinessException("invalidSerialNumbers", invalidSerialNumbers, "FFORDR_1004");
496
                }
497
                List<String> serialNumberList = liveDemoBillingRespository.selectAllSerialNumber();
24823 amit.gupta 498
 
32145 tejbeer 499
                Set<InventoryItem> inventoryItemsSerializedserialized = serializedInventoryItemMap.get(item.getId());
500
                for (InventoryItem inventoryItem : inventoryItemsSerializedserialized) {
501
                    inventoryItem.setGoodQuantity(0);
502
                    inventoryItemIdQuantityUsed.put(inventoryItem.getId(), 1);
503
                    if (serialNumberList.contains(inventoryItem.getSerialNumber())) {
504
                        LiveDemoSerialNumber liveDemoSerialNumber = liveDemoBillingRespository.selectBySerialNumber(inventoryItem.getSerialNumber());
505
                        liveDemoBillingRespository.delete(liveDemoSerialNumber);
506
                    }
507
                }
508
                inventoryItemsToBill.put(item.getId(), inventoryItemsSerializedserialized);
509
            } else {
510
                Set<InventoryItem> inventoryItemsNonSerialized = nonSerializedInventoryItemMap.get(item.getId());
511
                int quantityToBill = itemIdCustomFofoOrderItemMap.get(item.getId()).getQuantity();
512
                int totalLeft = quantityToBill;
513
                Set<InventoryItem> inventoryItemsNonSerializedUsed = new HashSet<>();
514
                if (inventoryItemsNonSerialized != null) {
515
                    for (InventoryItem inventoryItem : inventoryItemsNonSerialized) {
516
                        if (totalLeft > 0) {
517
                            int toUse = Math.min(totalLeft, inventoryItem.getGoodQuantity());
518
                            inventoryItemIdQuantityUsed.put(inventoryItem.getId(), toUse);
519
                            inventoryItem.setGoodQuantity(inventoryItem.getGoodQuantity() - toUse);
520
                            totalLeft = totalLeft - toUse;
521
                            inventoryItemsNonSerializedUsed.add(inventoryItem);
522
                        }
523
                    }
524
                }
23650 amit.gupta 525
 
32145 tejbeer 526
                if (totalLeft > 0) {
527
                    // not enough quanity for non-serialized
528
                    LOGGER.error("not enough quanity for non-serialized");
529
                    throw new ProfitMandiBusinessException("notEnoughQuantityForNonSerialized", totalLeft, "FFORDR_1005");
530
                }
531
                inventoryItemsToBill.put(item.getId(), inventoryItemsNonSerializedUsed);
532
            }
533
        }
23650 amit.gupta 534
 
32145 tejbeer 535
        Map<Integer, PriceModel> itemIdMopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIdCustomFofoOrderItemMap.keySet(), fofoId);
536
        LOGGER.info("itemIdMopMap {}", itemIdMopPriceMap);
537
        if (accessoriesDeals) {
538
            this.validateDpPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
539
        } else {
540
            this.validateMopPrice(itemIdMopPriceMap, itemIdCustomFofoOrderItemMap);
541
        }
23650 amit.gupta 542
 
32145 tejbeer 543
        String fofoStoreCode = this.getFofoStoreCode(fofoId);
544
        String documentNumber = null;
545
        if (noGST) {
546
            documentNumber = this.getSecurityDepositNumber(fofoId, fofoStoreCode);
24275 amit.gupta 547
 
32145 tejbeer 548
        } else {
549
            documentNumber = this.getInvoiceNumber(fofoId, fofoStoreCode);
550
        }
22859 ashik.ali 551
 
32145 tejbeer 552
        CustomerAddress customerAddress = customer.getCustomerAddress().stream().filter(x -> x.getId() == customCustomer.getCustomerAddressId()).findFirst().get();
23650 amit.gupta 553
 
32145 tejbeer 554
        FofoOrder fofoOrder = this.createAndGetFofoOrder(customer.getId(), customCustomer.getGstNumber(), fofoId, documentNumber, totalAmount, customerAddress.getId());
23650 amit.gupta 555
 
32145 tejbeer 556
        this.createPaymentOptions(fofoOrder, createOrderRequest.getPaymentOptions());
23650 amit.gupta 557
 
32145 tejbeer 558
        int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoId);
23650 amit.gupta 559
 
32145 tejbeer 560
        Address retailerAddress = addressRepository.selectById(retailerAddressId);
23650 amit.gupta 561
 
32145 tejbeer 562
        Integer stateId = null;
563
        if (customerAddress.getState().equals(retailerAddress.getState())) {
564
            try {
565
                State state = stateRepository.selectByName(customerAddress.getState());
566
                stateId = Long.valueOf(state.getId()).intValue();
567
            } catch (Exception e) {
568
                LOGGER.error("Unable to get state rates");
569
            }
570
        }
23650 amit.gupta 571
 
32145 tejbeer 572
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
573
            FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), stateId);
23650 amit.gupta 574
 
32145 tejbeer 575
            Set<InventoryItem> inventoryItems = inventoryItemsToBill.get(customFofoOrderItem.getItemId());
23650 amit.gupta 576
 
32145 tejbeer 577
            this.createFofoLineItem(fofoOrderItem.getId(), inventoryItems, inventoryItemIdQuantityUsed);
23650 amit.gupta 578
 
32145 tejbeer 579
            this.updateCurrentInventorySnapshot(currentInventorySnapshots, fofoId, customFofoOrderItem.getItemId(), customFofoOrderItem.getQuantity());
23650 amit.gupta 580
 
32145 tejbeer 581
            this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
582
        }
23650 amit.gupta 583
 
32145 tejbeer 584
        List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
25647 tejbeer 585
 
32145 tejbeer 586
        boolean smartPhone = false;
587
        for (FofoOrderItem fofoItem : fofoItems) {
588
            Item orderItem = itemRepository.selectById(fofoItem.getItemId());
589
            if (orderItem.isSmartPhone()) {
590
                smartPhone = true;
591
            }
31172 tejbeer 592
 
32145 tejbeer 593
        }
31172 tejbeer 594
 
32145 tejbeer 595
        if (smartPhone) {
596
            this.createAndGetHygieneData(fofoOrder.getId(), fofoOrder.getFofoId());
597
        }
598
        // insurance calculation is insurance flag is enabled
599
        //
600
        if (insuredModels.size() > 0) {
601
            LOGGER.info("Processing insurane for serialNumbers");
602
            LOGGER.info("InsuranceModels {}", insuredModels);
603
            LocalDate customerDateOfBirth = LocalDate.from(createOrderRequest.getCustomer().getDateOfBirth());
604
            fofoOrder.setDateOfBirth(customerDateOfBirth);
605
            for (InsuranceModel insuranceModel : insuredModels) {
606
                LOGGER.info("Creating insurance for {}", insuranceModel.getInsuranceId());
607
                insuranceService.createInsurance(fofoOrder, insuranceModel);
608
            }
609
        }
28339 tejbeer 610
 
32145 tejbeer 611
        schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31993 amit.gupta 612
 
32145 tejbeer 613
        if (createOrderRequest.getPoId() != 0) {
614
            PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
615
            po.setBilledAmount(po.getBilledAmount() + totalAmount);
616
            PendingOrderItem poi = pendingOrderItemRepository.selectById(createOrderRequest.getPoItemId());
617
            poi.setStatus(OrderStatus.BILLED);
618
            poi.setBilledTimestamp(LocalDateTime.now());
619
        }
29515 tejbeer 620
 
32218 tejbeer 621
        LocalDate startDate = LocalDate.of(2023, 07, 22);
622
        LocalDate endDate = LocalDate.of(2023, 07, 23);
29515 tejbeer 623
 
32218 tejbeer 624
 
32145 tejbeer 625
        if (smartPhone) {
32218 tejbeer 626
            LOGGER.error("hellloooo23 {}", "kjhkjhkjhkjhkjhkjh23");
627
 
32145 tejbeer 628
            if (LocalDateTime.now().isAfter(startDate.atStartOfDay()) && LocalDateTime.now().isBefore(endDate.atStartOfDay())) {
29515 tejbeer 629
 
32145 tejbeer 630
                try {
631
                    this.sendAppDownloadBillingOffer(customer.getMobileNumber());
632
                } catch (Exception e) {
633
                    // TODO Auto-generated catch block
634
                    e.printStackTrace();
635
                }
32218 tejbeer 636
                LOGGER.info("hellloooo {}", "kjhkjhkjhkjhkjhkjh");
637
 
638
                this.createScratchOffer(fofoId, fofoOrder.getInvoiceNumber(), fofoOrder.getCustomerId());
32145 tejbeer 639
            }
640
        }
641
        return fofoOrder.getId();
642
    }
23650 amit.gupta 643
 
32145 tejbeer 644
    public void sendAppDownloadBillingOffer(String mobileNumber) throws Exception {
645
        // In case of Cant receive SMS?
646
        // String mailMessage = java.text.MessageFormat.format(text, otp.getOtp());
647
        String sdurl = "http://surl.li/anhfn";
648
        try {
649
            if (prodEnv) {
650
                this.sendSms(APP_DOWNLOAD_BILLING_TEMPLATE_ID, String.format(APP_DOWNLOAD_BILLING_OFFER, sdurl), mobileNumber);
651
            }
652
        } catch (Exception e) {
653
            e.printStackTrace();
654
        }
29515 tejbeer 655
 
32145 tejbeer 656
    }
29515 tejbeer 657
 
32145 tejbeer 658
    public void sendSms(String dltTemplateId, String message, String mobileNumber) throws Exception {
659
        Map<String, String> map = new HashMap<>();
29515 tejbeer 660
 
32145 tejbeer 661
        map.put("sender", SENDER);
662
        map.put("messagetype", "TXT");
663
        map.put("apikey", "b866f7-c6c483-682ff5-054420-ad9e2c");
29515 tejbeer 664
 
32145 tejbeer 665
        map.put("numbers", "91" + mobileNumber);
666
        LOGGER.info("Message {}", message);
667
        // OTP Message Template
668
        map.put("message", message);
669
        map.put("dlttempid", dltTemplateId);
29515 tejbeer 670
 
32145 tejbeer 671
        String response = restClient.post(SMS_GATEWAY, map, new HashMap<>());
672
        LOGGER.info(response);
29515 tejbeer 673
 
32145 tejbeer 674
    }
29515 tejbeer 675
 
676
 
32218 tejbeer 677
    private void createScratchOffer(int fofoId, String invoiceNumber, int customerId) {
29515 tejbeer 678
 
32218 tejbeer 679
        Map<Integer, ScratchedGift> giftSeries = new HashMap<>();
680
        giftSeries.put(1, ScratchedGift.MINI_CHOPPER);
681
        giftSeries.put(2, ScratchedGift.FRUIT_JUICER);
682
        giftSeries.put(3, ScratchedGift.STEAM_IRON);
683
 
684
        LocalDate startDate = LocalDate.of(2023, 07, 22);
685
        LocalDate endDate = LocalDate.of(2023, 07, 23);
686
 
687
 
688
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoIdBetweenCreatedTimeStamp(fofoId, startDate.atStartOfDay(), endDate.atStartOfDay());
689
        ScratchedGift gift = ScratchedGift.BLNT;
690
 
691
        Random random = new Random();
692
        int rand = 0;
693
 
694
        LOGGER.info("Processing insurane for serialNumbers");
695
 
696
        while (true) {
697
            rand = random.nextInt(4);
698
            if (rand != 0) break;
699
        }
700
 
701
        LOGGER.info("rand {}", rand);
702
 
703
        if (fofoOrders.isEmpty()) {
704
 
705
            gift = giftSeries.get(rand);
706
 
707
            LOGGER.info("gift11 {}", gift);
708
 
709
        } else {
710
 
711
            List<String> invoiceNumbers = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).map(x -> x.getInvoiceNumber()).collect(Collectors.toList());
712
 
713
 
714
            List<ScratchOffer> scratchOffers = scratchOfferRepository.selectByInvoiceNumbers(invoiceNumbers);
715
 
716
 
717
            if (scratchOffers.isEmpty()) {
718
 
719
                gift = giftSeries.get(rand);
720
                LOGGER.info("gift3 {}", gift);
721
 
722
 
723
            } else {
724
 
725
                List<ScratchOffer> bigGifts = scratchOffers.stream().filter(x -> !x.getOfferName().equals(ScratchedGift.BLNT) && !x.getOfferName().equals(ScratchedGift.EW)).collect(Collectors.toList());
726
                LOGGER.info("bigGifts {}", bigGifts);
727
 
728
                if (bigGifts.size() <= 10) {
729
                    List<Integer> scratchCustomerIds = scratchOffers.stream().map(x -> x.getCustomerId()).collect(Collectors.toList());
730
 
731
                    if (scratchCustomerIds.contains(customerId)) {
732
 
733
 
734
                        gift = ScratchedGift.BLNT;
735
 
736
                        LOGGER.info("gift2 {}", gift);
737
 
738
                    } else {
739
 
740
                        int miniChopper = (int) bigGifts.stream().filter(x -> x.getOfferName().equals(ScratchedGift.MINI_CHOPPER)).count();
741
                        int fruitJuicer = (int) bigGifts.stream().filter(x -> x.getOfferName().equals(ScratchedGift.FRUIT_JUICER)).count();
742
                        int streanIron = (int) bigGifts.stream().filter(x -> x.getOfferName().equals(ScratchedGift.STEAM_IRON)).count();
743
                        LOGGER.info("miniChopper {}", miniChopper);
744
 
745
                        LOGGER.info("fruitJuicer {}", fruitJuicer);
746
 
747
 
748
                        LOGGER.info("streanIron {}", streanIron);
749
 
750
 
751
                        if (rand == 1) {
752
                            if (miniChopper < 4) {
753
                                LOGGER.info("miniChopper {}", miniChopper);
754
 
755
 
756
                                gift = giftSeries.get(rand);
757
                            }
758
                        }
759
 
760
                        if (rand == 2) {
761
                            if (fruitJuicer < 3) {
762
 
763
                                LOGGER.info("fruitJuicer {}", fruitJuicer);
764
 
765
                                gift = giftSeries.get(rand);
766
                            }
767
                        }
768
 
769
                        if (rand == 3) {
770
                            if (streanIron < 3) {
771
 
772
                                LOGGER.info("streanIron {}", streanIron);
773
 
774
 
775
                                gift = giftSeries.get(rand);
776
 
777
                            }
778
                        }
779
 
780
                        LOGGER.info("gift4 {}", gift);
781
                    }
782
                }
783
            }
784
 
785
 
786
        }
787
 
788
 
789
        //  LocalDateTime endDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 27, 21, 00);
790
 
32145 tejbeer 791
        ScratchOffer so2 = new ScratchOffer();
792
        so2.setInvoiceNumber(invoiceNumber);
793
        so2.setScratched(false);
794
        so2.setCreatedTimestamp(LocalDateTime.now());
32218 tejbeer 795
        so2.setExpiredTimestamp(LocalDateTime.now().plusDays(1));
796
        so2.setOfferName(gift);
32145 tejbeer 797
        so2.setCustomerId(customerId);
32218 tejbeer 798
        so2.setUnlockedAt(LocalDateTime.now());
32145 tejbeer 799
        LocalDate date = LocalDate.now();
32218 tejbeer 800
        /* LocalDateTime seven = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 19, 0);
32145 tejbeer 801
        LocalDateTime nine = LocalDateTime.of(date.getYear(), date.getMonth(), date.getDayOfMonth(), 21, 0);
32218 tejbeer 802
 
32145 tejbeer 803
        if (LocalDateTime.now().isAfter(seven)) {
32218 tejbeer 804
        so2.setUnlockedAt(nine.plusDays(1));
32145 tejbeer 805
        } else {
32218 tejbeer 806
        so2.setUnlockedAt(nine);
807
        }*/
31057 tejbeer 808
 
32218 tejbeer 809
 
32145 tejbeer 810
        scratchOfferRepository.persist(so2);
29515 tejbeer 811
 
32218 tejbeer 812
 
813
        ScratchOffer so = new ScratchOffer();
814
        so.setInvoiceNumber(invoiceNumber);
815
        so.setOfferName(ScratchedGift.EW);
816
        so.setScratched(false);
817
        so.setCreatedTimestamp(LocalDateTime.now());
818
        so.setExpiredTimestamp(so.getCreatedTimestamp().plusDays(1));
819
        so.setUnlockedAt(LocalDateTime.now());
820
        so.setCustomerId(customerId);
821
        scratchOfferRepository.persist(so);
822
 
823
 
32145 tejbeer 824
    }
29515 tejbeer 825
 
32145 tejbeer 826
    private HygieneData createAndGetHygieneData(int id, int fofoId) {
827
        HygieneData hygieneData = new HygieneData();
828
        hygieneData.setOrderId(id);
829
        hygieneData.setFofoId(fofoId);
830
        hygieneData.setCreatedTimestamp(LocalDateTime.now());
831
        hygieneDataRepository.persist(hygieneData);
25640 tejbeer 832
 
32145 tejbeer 833
        return hygieneData;
834
    }
25640 tejbeer 835
 
32145 tejbeer 836
    @Override
837
    public String getInvoiceNumber(int fofoId, String fofoStoreCode) {
838
        InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
839
        try {
840
            invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
841
            invoiceNumberGenerationSequence.setSequence(invoiceNumberGenerationSequence.getSequence() + 1);
842
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
843
            invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
844
            invoiceNumberGenerationSequence.setFofoId(fofoId);
845
            invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
846
            invoiceNumberGenerationSequence.setSequence(1);
847
        }
848
        invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
849
        return invoiceNumberGenerationSequence.getPrefix() + "/" + invoiceNumberGenerationSequence.getSequence();
850
    }
24275 amit.gupta 851
 
32145 tejbeer 852
    private String getSecurityDepositNumber(int fofoId, String fofoStoreCode) {
853
        InvoiceNumberGenerationSequence invoiceNumberGenerationSequence = null;
854
        try {
855
            invoiceNumberGenerationSequence = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoId);
856
            invoiceNumberGenerationSequence.setChallanNumberSequence(invoiceNumberGenerationSequence.getChallanNumberSequence() + 1);
857
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
858
            invoiceNumberGenerationSequence = new InvoiceNumberGenerationSequence();
859
            invoiceNumberGenerationSequence.setFofoId(fofoId);
860
            invoiceNumberGenerationSequence.setPrefix(fofoStoreCode);
861
            invoiceNumberGenerationSequence.setChallanNumberSequence(1);
862
        }
863
        invoiceNumberGenerationSequenceRepository.persist(invoiceNumberGenerationSequence);
864
        return invoiceNumberGenerationSequence.getPrefix() + "/SEC" + invoiceNumberGenerationSequence.getChallanNumberSequence();
865
    }
24226 amit.gupta 866
 
32145 tejbeer 867
    private Set<String> serialNumberDetailsToSerialNumbers(Set<SerialNumberDetail> serialNumberDetails) {
868
        Set<String> serialNumbers = new HashSet<>();
869
        for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
870
            if (serialNumberDetail.getSerialNumber() != null && !serialNumberDetail.getSerialNumber().isEmpty()) {
871
                serialNumbers.add(serialNumberDetail.getSerialNumber());
872
            }
873
        }
874
        return serialNumbers;
875
    }
23650 amit.gupta 876
 
32145 tejbeer 877
    @Override
878
    public InvoicePdfModel getInvoicePdfModel(int orderId) throws ProfitMandiBusinessException {
879
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
880
        return this.getInvoicePdfModel(fofoOrder);
881
    }
23650 amit.gupta 882
 
32145 tejbeer 883
    @Override
884
    @Cacheable(value = "order.dummymodel", cacheManager = "oneDayCacheManager")
885
    public InvoicePdfModel getDummyPdfModel(String serialNumber) throws ProfitMandiBusinessException {
886
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectWarehouseInventoryItemBySerailNumbers(Arrays.asList(serialNumber));
887
        if (warehouseInventoryItems.size() > 0) {
888
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItems.get(0);
889
            int currentQuantity = warehouseInventoryItems.get(0).getCurrentQuantity();
890
            if (currentQuantity > 0) {
891
                throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number exist in our warehouse");
892
            } else {
893
                try {
894
                    InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(serialNumber);
895
                    if (inventoryItem.getGoodQuantity() > 0) {
896
                        throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number is not yet billed by the partner");
897
                    } else {
898
                        List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItem.getId());
899
                        Optional<ScanRecord> scanRecord = scanRecords.stream().filter(x -> x.getOrderId() != 0).findFirst();
900
                        if (scanRecord.isPresent()) {
901
                            FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.get().getOrderId());
902
                            orderIdsConsumed.add(fofoOrder.getId());
903
                            return this.getInvoicePdfModel(fofoOrder);
904
                        } else {
905
                            throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number returned by partner, but in transit");
906
                        }
907
                    }
908
                } catch (Exception e) {
909
                    int itemId = warehouseInventoryItem.getItemId();
910
                    if (serialNumberOrderIdMap.containsKey(serialNumber)) {
911
                        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(serialNumberOrderIdMap.get(serialNumber));
912
                        InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
913
                        this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
914
                        return pdfModel;
915
                    }
916
                    // Map this serialNumber for dummy billing
917
                    LocalDateTime grnDate = warehouseInventoryItem.getCreated();
918
                    Random random = new Random();
919
                    int randomDays = random.ints(2, 15).findFirst().getAsInt();
920
                    LocalDateTime saleDate = grnDate.plusDays(randomDays);
921
                    if (saleDate.isAfter(LocalDate.now().atStartOfDay())) {
922
                        saleDate = LocalDateTime.now().minusDays(2);
923
                    }
924
                    Random offsetRandom = new Random();
925
                    int offset = offsetRandom.ints(2, 100).findFirst().getAsInt();
926
                    FofoOrder fofoOrder = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset);
927
                    while (orderIdsConsumed.contains(fofoOrder.getId())) {
928
                        Random offsetRandom2 = new Random();
929
                        int offset2 = offsetRandom2.ints(2, 100).findFirst().getAsInt();
930
                        FofoOrder fofoOrder2 = fofoOrderRepository.selectFirstOrderAfterDate(saleDate, offset2);
931
                        if (fofoOrder2 != null) {
932
                            fofoOrder = fofoOrder2;
933
                        }
934
                    }
935
                    InvoicePdfModel pdfModel = this.getInvoicePdfModel(fofoOrder.getId());
936
                    orderIdsConsumed.add(fofoOrder.getId());
937
                    this.modifyDummyModel(fofoOrder, pdfModel, itemId, serialNumber);
938
                    return pdfModel;
27516 amit.gupta 939
 
32145 tejbeer 940
                }
941
            }
942
        } else {
943
            throw new ProfitMandiBusinessException("Serial Number", serialNumber, "Serial Number does not exist in our warehouse");
944
        }
945
    }
27516 amit.gupta 946
 
32145 tejbeer 947
    void modifyDummyModel(FofoOrder fofoOrder, InvoicePdfModel pdfModel, int itemId, String serialNumber) throws ProfitMandiBusinessException {
28166 tejbeer 948
 
32145 tejbeer 949
        int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
27516 amit.gupta 950
 
32145 tejbeer 951
        Address retailerAddress = addressRepository.selectById(retailerAddressId);
952
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
27516 amit.gupta 953
 
32145 tejbeer 954
        CustomerAddress customerAddress = customer.getCustomerAddress().stream().filter(x -> x.getId() == fofoOrder.getCustomerAddressId()).findFirst().get();
27516 amit.gupta 955
 
32145 tejbeer 956
        Integer stateId = null;
957
        if (customerAddress.getState().equals(retailerAddress.getState())) {
958
            try {
959
                // stateId =
960
                // Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
30527 tejbeer 961
 
32145 tejbeer 962
                stateId = Long.valueOf(stateRepository.selectByName(customerAddress.getState()).getId()).intValue();
963
            } catch (Exception e) {
964
                LOGGER.error("Unable to get state rates");
965
            }
966
        }
967
        CustomOrderItem cli = pdfModel.getOrderItems().stream().findFirst().get();
968
        List<FofoOrderItem> fofoOrderItems = Arrays.asList(this.getDummyFofoOrderItem(itemId, fofoOrder.getId(), serialNumber, stateId));
969
        pdfModel.setPaymentOptions(pdfModel.getPaymentOptions().stream().limit(1).collect(Collectors.toList()));
970
        CustomPaymentOption paymentOption = pdfModel.getPaymentOptions().get(0);
971
        paymentOption.setAmount(fofoOrderItems.get(0).getMop());
972
        Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
973
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
974
            CustomOrderItem customFofoOrderItem = new CustomOrderItem();
975
            float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
976
            float taxableSellingPrice = fofoOrderItem.getSellingPrice() / (1 + totalTaxRate / 100);
977
            float taxableDiscountPrice = fofoOrderItem.getDiscount() / (1 + totalTaxRate / 100);
27516 amit.gupta 978
 
32145 tejbeer 979
            customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
980
            customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " " + fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
981
            Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
982
            // LOGGER.info("serialNumbers {}", serialNumbers);
983
            // LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
984
            if (!serialNumbers.isEmpty()) {
985
                customFofoOrderItem.setDescription(
986
                        customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
987
            }
988
            customFofoOrderItem.setRate(taxableSellingPrice);
989
            customFofoOrderItem.setDiscount(taxableDiscountPrice);
990
            customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
991
            customFofoOrderItem.setNetAmount(
992
                    (fofoOrderItem.getSellingPrice() - fofoOrderItem.getDiscount()) * fofoOrderItem.getQuantity());
993
            float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
994
            float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
995
            float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
996
            customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
997
            customFofoOrderItem.setIgstAmount(igstAmount);
998
            customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
999
            customFofoOrderItem.setCgstAmount(cgstAmount);
1000
            customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
1001
            customFofoOrderItem.setSgstAmount(sgstAmount);
1002
            customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
1003
            customerFofoOrderItems.add(customFofoOrderItem);
1004
        }
1005
        pdfModel.setTotalAmount(paymentOption.getAmount());
1006
        pdfModel.setOrderItems(customerFofoOrderItems);
28166 tejbeer 1007
 
32145 tejbeer 1008
    }
27516 amit.gupta 1009
 
32145 tejbeer 1010
    private InvoicePdfModel getInvoicePdfModel(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
23650 amit.gupta 1011
 
32145 tejbeer 1012
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository.selectByReferenceIdAndTypes(fofoOrder.getId(), Arrays.asList(PaymentOptionReferenceType.ORDER, PaymentOptionReferenceType.INSURANCE));
23650 amit.gupta 1013
 
32145 tejbeer 1014
        List<CustomPaymentOption> paymentOptions = new ArrayList<>();
23552 amit.gupta 1015
 
32145 tejbeer 1016
        InvoicePdfModel pdfModel = new InvoicePdfModel();
1017
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
1018
            CustomPaymentOption cpi = new CustomPaymentOption();
1019
            cpi.setAmount(paymentOptionTransaction.getAmount());
1020
            cpi.setPaymentOption(
1021
                    paymentOptionRepository.selectById(paymentOptionTransaction.getPaymentOptionId()).getName());
1022
            paymentOptions.add(cpi);
1023
        }
1024
        List<FofoOrderItem> fofoOrderItems = this.getByOrderId(fofoOrder.getId());
24215 amit.gupta 1025
 
32145 tejbeer 1026
        pdfModel.setTitle("Retailer Invoice");
1027
        Optional<FofoOrderItem> fofoOrderItemOptional = fofoOrderItems.stream().findAny();
1028
        if (fofoOrderItemOptional.isPresent() && fofoOrderItemOptional.get().equals("NOGST")) {
1029
            pdfModel.setTitle("Security Deposit Receipt");
1030
        }
1031
        pdfModel.setPaymentOptions(paymentOptions);
1032
        pdfModel.setAuther("SmartDukaan");
1033
        pdfModel.setInvoiceDate(FormattingUtils.formatDate(fofoOrder.getCreateTimestamp()));
23650 amit.gupta 1034
 
32145 tejbeer 1035
        // insurance calculation
1036
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
1037
        Set<CustomInsurancePolicy> customInsurancePolicies = new HashSet<>();
1038
        final float totalInsuranceTaxRate = 18;
1039
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
1040
            float taxableInsurancePrice = insurancePolicy.getSaleAmount() / (1 + totalInsuranceTaxRate / 100);
1041
            CustomInsurancePolicy customInsurancePolicy = new CustomInsurancePolicy();
1042
            customInsurancePolicy.setDescription(insurancePolicy.getPolicyPlan() + " for Device #" + insurancePolicy.getSerialNumber() + "\n Plan Reference - " + insurancePolicy.getPolicyNumber());
1043
            customInsurancePolicy.setHsnCode("998716");
1044
            customInsurancePolicy.setRate(taxableInsurancePrice);
1045
            customInsurancePolicy.setIgstRate(18);
1046
            customInsurancePolicy.setIgstAmount(taxableInsurancePrice * 18 / 100);
1047
            customInsurancePolicy.setCgstRate(9);
1048
            customInsurancePolicy.setCgstAmount(taxableInsurancePrice * 9 / 100);
1049
            customInsurancePolicy.setSgstRate(9);
1050
            customInsurancePolicy.setSgstAmount(taxableInsurancePrice * 9 / 100);
1051
            customInsurancePolicy.setNetAmount(insurancePolicy.getSaleAmount());
1052
            customInsurancePolicies.add(customInsurancePolicy);
1053
        }
1054
        pdfModel.setInsurancePolicies(customInsurancePolicies);
24275 amit.gupta 1055
 
32145 tejbeer 1056
        pdfModel.setCustomer(getCustomCustomer(fofoOrder));
1057
        pdfModel.setInvoiceNumber(fofoOrder.getInvoiceNumber());
1058
        pdfModel.setTotalAmount(fofoOrder.getTotalAmount());
23650 amit.gupta 1059
 
32145 tejbeer 1060
        Retailer retailer = retailerRepository.selectById(fofoOrder.getFofoId());
1061
        PrivateDealUser privateDealUser = null;
1062
        try {
1063
            privateDealUser = privateDealUserRepository.selectById(retailer.getId());
1064
        } catch (ProfitMandiBusinessException profitMandiBusinessException) {
1065
            LOGGER.error("Private Deal User not found : ", profitMandiBusinessException);
1066
        }
23650 amit.gupta 1067
 
32145 tejbeer 1068
        User user = userRepository.selectById(userAccountRepository.selectUserIdByRetailerId(retailer.getId()));
1069
        CustomRetailer customRetailer = new CustomRetailer();
1070
        customRetailer.setBusinessName(retailer.getName());
1071
        customRetailer.setMobileNumber(user.getMobileNumber());
1072
        // customRetailer.setTinNumber(retailer.getNumber());
1073
        if (privateDealUser == null) {
1074
            customRetailer.setGstNumber(null);
1075
        } else {
1076
            if (null != privateDealUser.getCounterId()) {
1077
                Counter counter = counterRepository.selectById(privateDealUser.getCounterId());
1078
                customRetailer.setGstNumber(counter.getGstin());
1079
            } else {
1080
                customRetailer.setGstNumber(null);
1081
            }
1082
        }
1083
        Address retailerAddress = addressRepository.selectById(retailerRegisteredAddressRepository.selectAddressIdByRetailerId(retailer.getId()));
1084
        customRetailer.setAddress(this.createCustomAddress(retailerAddress));
1085
        pdfModel.setRetailer(customRetailer);
23650 amit.gupta 1086
 
32145 tejbeer 1087
        Set<CustomOrderItem> customerFofoOrderItems = new HashSet<>();
1088
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
1089
            float discount = fofoOrderItem.getDiscount();
1090
            CustomOrderItem customFofoOrderItem = new CustomOrderItem();
1091
            float totalTaxRate = fofoOrderItem.getIgstRate() + fofoOrderItem.getSgstRate() + fofoOrderItem.getCgstRate();
1092
            float taxableSellingPrice = (fofoOrderItem.getSellingPrice() + discount) / (1 + totalTaxRate / 100);
1093
            float taxableDiscountPrice = discount / (1 + totalTaxRate / 100);
23650 amit.gupta 1094
 
32145 tejbeer 1095
            customFofoOrderItem.setAmount(fofoOrderItem.getQuantity() * (taxableSellingPrice - taxableDiscountPrice));
1096
            customFofoOrderItem.setDescription(fofoOrderItem.getBrand() + " " + fofoOrderItem.getModelName() + " " + fofoOrderItem.getModelNumber() + "-" + fofoOrderItem.getColor());
1097
            Set<String> serialNumbers = this.toSerialNumbers(fofoOrderItem.getFofoLineItems());
1098
            // LOGGER.info("serialNumbers {}", serialNumbers);
1099
            // LOGGER.info("serialNumbers is empty {}", serialNumbers.isEmpty());
1100
            if (!serialNumbers.isEmpty()) {
1101
                customFofoOrderItem.setDescription(
1102
                        customFofoOrderItem.getDescription() + "\n IMEIS - " + String.join(", ", serialNumbers));
1103
            }
1104
            customFofoOrderItem.setRate(taxableSellingPrice);
1105
            customFofoOrderItem.setDiscount(taxableDiscountPrice);
1106
            customFofoOrderItem.setQuantity(fofoOrderItem.getQuantity());
1107
            customFofoOrderItem.setNetAmount(fofoOrderItem.getSellingPrice() * fofoOrderItem.getQuantity());
1108
            float igstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getIgstRate()) / 100;
1109
            float cgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getCgstRate()) / 100;
1110
            float sgstAmount = (customFofoOrderItem.getAmount() * fofoOrderItem.getSgstRate()) / 100;
1111
            customFofoOrderItem.setIgstRate(fofoOrderItem.getIgstRate());
1112
            customFofoOrderItem.setIgstAmount(igstAmount);
1113
            customFofoOrderItem.setCgstRate(fofoOrderItem.getCgstRate());
1114
            customFofoOrderItem.setCgstAmount(cgstAmount);
1115
            customFofoOrderItem.setSgstRate(fofoOrderItem.getSgstRate());
1116
            customFofoOrderItem.setSgstAmount(sgstAmount);
1117
            customFofoOrderItem.setHsnCode(fofoOrderItem.getHsnCode());
1118
            customerFofoOrderItems.add(customFofoOrderItem);
1119
        }
1120
        pdfModel.setOrderItems(customerFofoOrderItems);
1121
        String partnerAddressStateCode = stateRepository.selectByName(pdfModel.getRetailer().getAddress().getState()).getCode();
1122
        String customerAddressStateCode = stateRepository.selectByName(pdfModel.getCustomer().getAddress().getState()).getCode();
1123
        pdfModel.setPartnerAddressStateCode(partnerAddressStateCode);
1124
        pdfModel.setCustomerAddressStateCode(customerAddressStateCode);
1125
        pdfModel.setCancelled(fofoOrder.getCancelledTimestamp() != null);
1126
        List<String> tncs = new ArrayList<>();
1127
        tncs.add("I agree that goods received are in good working condition");
1128
        tncs.add("Goods once sold cannot be exchanged or taken back");
1129
        tncs.add("Warranty for the goods received by me is the responsibility of the manufacturer only.");
1130
        tncs.add("Customer needs to activate the handset at the time of delivery to be eligible for the discount");
1131
        tncs.add(
1132
                "Tempered Glass Replacement will be done only for the Mobile Phone which was purchased from SmartDukaan");
1133
        tncs.add(
1134
                "Customers requesting Tempered Glass Replacement will have to bring the broken tempered glass, either pasted on the phone or along with the phone");
1135
        tncs.add("Service fee of Rs.20 will be chargeable for each Tempered Glass Replacement");
1136
        if (pdfModel.getInsurancePolicies() != null && pdfModel.getInsurancePolicies().size() > 0) {
1137
            tncs.add("Damage protection provided is the responisibility of Protection Provider only");
1138
        }
1139
        pdfModel.setTncs(tncs);
1140
        return pdfModel;
23650 amit.gupta 1141
 
32145 tejbeer 1142
    }
23650 amit.gupta 1143
 
32145 tejbeer 1144
    private CustomCustomer getCustomCustomer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
1145
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
1146
        CustomCustomer customCustomer = new CustomCustomer();
1147
        customCustomer.setFirstName(customer.getFirstName());
1148
        customCustomer.setLastName(customer.getLastName());
1149
        customCustomer.setEmailId(customer.getEmailId());
1150
        customCustomer.setMobileNumber(customer.getMobileNumber());
1151
        customCustomer.setGstNumber(fofoOrder.getCustomerGstNumber());
1152
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1153
        customCustomer.setAddress(this.createCustomAddress(customerAddress));
1154
        return customCustomer;
1155
    }
23655 amit.gupta 1156
 
32145 tejbeer 1157
    @Override
1158
    public InvoicePdfModel getInvoicePdfModel(int fofoId, int orderId) throws ProfitMandiBusinessException {
1159
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, orderId);
1160
        return this.getInvoicePdfModel(fofoOrder);
1161
    }
23650 amit.gupta 1162
 
32145 tejbeer 1163
    public String getBillingAddress(CustomerAddress customerAddress) {
1164
        StringBuilder address = new StringBuilder();
1165
        if ((customerAddress.getLine1() != null) && (!customerAddress.getLine1().isEmpty())) {
1166
            address.append(customerAddress.getLine1());
1167
            address.append(", ");
1168
        }
22859 ashik.ali 1169
 
32145 tejbeer 1170
        if ((customerAddress.getLine2() != null) && (!customerAddress.getLine2().isEmpty())) {
1171
            address.append(customerAddress.getLine2());
1172
            address.append(", ");
1173
        }
22859 ashik.ali 1174
 
32145 tejbeer 1175
        if ((customerAddress.getLandmark() != null) && (!customerAddress.getLandmark().isEmpty())) {
1176
            address.append(customerAddress.getLandmark());
1177
            address.append(", ");
1178
        }
22859 ashik.ali 1179
 
32145 tejbeer 1180
        if ((customerAddress.getCity() != null) && (!customerAddress.getCity().isEmpty())) {
1181
            address.append(customerAddress.getCity());
1182
            address.append(", ");
1183
        }
22859 ashik.ali 1184
 
32145 tejbeer 1185
        if ((customerAddress.getState() != null) && (!customerAddress.getState().isEmpty())) {
1186
            address.append(customerAddress.getState());
1187
        }
22859 ashik.ali 1188
 
32145 tejbeer 1189
        if ((customerAddress.getPinCode() != null) && (!customerAddress.getPinCode().isEmpty())) {
1190
            address.append("- ");
1191
            address.append(customerAddress.getPinCode());
1192
        }
22859 ashik.ali 1193
 
32145 tejbeer 1194
        return address.toString();
1195
    }
23650 amit.gupta 1196
 
32145 tejbeer 1197
    @Override
1198
    public List<CartFofo> cartCheckout(String cartJson) throws ProfitMandiBusinessException {
1199
        try {
1200
            JSONObject cartObject = new JSONObject(cartJson);
1201
            Iterator<?> keys = cartObject.keys();
23650 amit.gupta 1202
 
32145 tejbeer 1203
            Set<Integer> itemIds = new HashSet<>();
1204
            List<CartFofo> cartItems = new ArrayList<CartFofo>();
23650 amit.gupta 1205
 
32145 tejbeer 1206
            while (keys.hasNext()) {
1207
                String key = (String) keys.next();
1208
                if (cartObject.get(key) instanceof JSONObject) {
1209
                    LOGGER.info(cartObject.get(key).toString());
1210
                }
1211
                CartFofo cf = new CartFofo();
1212
                cf.setItemId(cartObject.getJSONObject(key).getInt("itemId"));
1213
                cf.setQuantity(cartObject.getJSONObject(key).getInt("quantity"));
1214
                if (cartObject.getJSONObject(key).has("poId")) {
23650 amit.gupta 1215
 
32145 tejbeer 1216
                    cf.setPoId(cartObject.getJSONObject(key).getInt("poId"));
1217
                    cf.setPoItemId(cartObject.getJSONObject(key).getInt("poItemId"));
1218
                }
1219
                if (cf.getQuantity() <= 0) {
1220
                    continue;
1221
                }
1222
                cartItems.add(cf);
1223
                itemIds.add(cartObject.getJSONObject(key).getInt("itemId"));
1224
            }
1225
            Map<Integer, Item> itemMap = new HashMap<Integer, Item>();
1226
            if (itemIds.size() > 0) {
1227
                List<Item> items = itemRepository.selectByIds(itemIds);
1228
                for (Item i : items) {
1229
                    itemMap.put(i.getId(), i);
1230
                }
23650 amit.gupta 1231
 
32145 tejbeer 1232
            }
1233
            for (CartFofo cf : cartItems) {
1234
                Item i = itemMap.get(cf.getItemId());
1235
                if (i == null) {
1236
                    continue;
1237
                }
1238
                cf.setDisplayName(getValidName(i.getBrand()) + " " + getValidName(i.getModelName()) + " " + getValidName(i.getModelNumber()) + " " + getValidName(i.getColor()).replaceAll("\\s+", " "));
1239
                cf.setItemType(i.getType());
1240
            }
1241
            return cartItems;
1242
        } catch (Exception e) {
1243
            LOGGER.error("Unable to Prepare cart to place order...", e);
1244
            throw new ProfitMandiBusinessException("cartData", cartJson, "FFORDR_1006");
1245
        }
1246
    }
23650 amit.gupta 1247
 
32145 tejbeer 1248
    @Override
1249
    public Map<String, Object> getSaleHistory(int fofoId, SearchType searchType, String searchValue, LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1250
        long countItems = 0;
1251
        List<FofoOrder> fofoOrders = new ArrayList<>();
23650 amit.gupta 1252
 
32145 tejbeer 1253
        if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1254
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, null, null, offset, limit);
1255
            countItems = fofoOrderRepository.selectCountByCustomerMobileNumber(fofoId, searchValue, null, null);
1256
        } else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1257
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, null, null, offset, limit);
1258
            countItems = fofoOrderRepository.selectCountByCustomerName(fofoId, searchValue, null, null);
1259
        } else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1260
            fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, null, null, offset, limit);
1261
            countItems = fofoOrderRepository.selectCountBySerialNumber(fofoId, searchValue, null, null);
1262
        } else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1263
            fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, null, null, offset, limit);
1264
            countItems = fofoOrderRepository.selectCountByItemName(fofoId, searchValue, null, null);
1265
        } else if (searchType == SearchType.INVOICE_NUMBER && !searchValue.isEmpty()) {
1266
            fofoOrders = Arrays.asList(fofoOrderRepository.selectByFofoIdAndInvoiceNumber(fofoId, searchValue));
1267
            countItems = fofoOrders.size();
1268
        } else if (searchType == SearchType.DATE_RANGE) {
1269
            fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1270
            countItems = fofoOrderRepository.selectCountByFofoId(fofoId, startDate, endDate);
1271
        }
1272
        Map<String, Object> map = new HashMap<>();
23650 amit.gupta 1273
 
32145 tejbeer 1274
        map.put("saleHistories", fofoOrders);
1275
        map.put("start", offset + 1);
1276
        map.put("size", countItems);
1277
        map.put("searchType", searchType);
1278
        map.put("searchTypes", SearchType.values());
1279
        map.put("startDate", startDate);
1280
        map.put("searchValue", searchValue);
1281
        map.put(ProfitMandiConstants.END_TIME, endDate);
1282
        if (fofoOrders.size() < limit) {
1283
            map.put("end", offset + fofoOrders.size());
1284
        } else {
1285
            map.put("end", offset + limit);
1286
        }
1287
        return map;
1288
    }
30426 tejbeer 1289
 
32145 tejbeer 1290
    public ResponseEntity<?> downloadReportInCsv(org.apache.commons.io.output.ByteArrayOutputStream baos, List<List<?>> rows, String fileName) {
1291
        final HttpHeaders headers = new HttpHeaders();
1292
        headers.set("Content-Type", "text/csv");
30426 tejbeer 1293
 
32145 tejbeer 1294
        headers.set("Content-disposition", "inline; filename=" + fileName + ".csv");
1295
        headers.setContentLength(baos.toByteArray().length);
23202 ashik.ali 1296
 
32145 tejbeer 1297
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1298
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
30426 tejbeer 1299
 
32145 tejbeer 1300
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1301
    }
30157 manish 1302
 
32145 tejbeer 1303
    @Override
1304
    public Map<String, Object> getSaleHistoryPaginated(int fofoId, SearchType searchType, String searchValue, LocalDateTime startDate, LocalDateTime endDate, int offset, int limit) throws ProfitMandiBusinessException {
1305
        List<FofoOrder> fofoOrders = new ArrayList<>();
23650 amit.gupta 1306
 
32145 tejbeer 1307
        if (searchType == SearchType.CUSTOMER_MOBILE_NUMBER && !searchValue.isEmpty()) {
1308
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerMobileNumber(fofoId, searchValue, startDate, endDate, offset, limit);
1309
        } else if (searchType == SearchType.CUSTOMER_NAME && !searchValue.isEmpty()) {
1310
            fofoOrders = fofoOrderRepository.selectByFofoIdAndCustomerName(fofoId, searchValue, startDate, endDate, offset, limit);
1311
        } else if (searchType == SearchType.IMEI && !searchValue.isEmpty()) {
1312
            fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchValue, startDate, endDate, offset, limit);
1313
        } else if (searchType == SearchType.ITEM_NAME && !searchValue.isEmpty()) {
1314
            fofoOrders = fofoOrderRepository.selectByFofoIdAndItemName(fofoId, searchValue, startDate, endDate, offset, limit);
24275 amit.gupta 1315
 
32145 tejbeer 1316
        } else if (searchType == SearchType.DATE_RANGE) {
1317
            fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startDate, endDate, offset, limit);
1318
        }
1319
        Map<String, Object> map = new HashMap<>();
1320
        map.put("saleHistories", fofoOrders);
1321
        map.put("searchType", searchType);
1322
        map.put("searchTypes", SearchType.values());
1323
        map.put("startDate", startDate);
1324
        map.put("searchValue", searchValue);
1325
        map.put(ProfitMandiConstants.END_TIME, endDate);
1326
        return map;
1327
    }
23650 amit.gupta 1328
 
32145 tejbeer 1329
    private String getFofoStoreCode(int fofoId) throws ProfitMandiBusinessException {
1330
        FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
1331
        return fofoStore.getCode();
1332
    }
23650 amit.gupta 1333
 
32145 tejbeer 1334
    private String getValidName(String name) {
1335
        return name != null ? name : "";
1336
    }
23650 amit.gupta 1337
 
32145 tejbeer 1338
    private Set<String> toSerialNumbers(Set<FofoLineItem> fofoLineItems) {
1339
        Set<String> serialNumbers = new HashSet<>();
1340
        for (FofoLineItem fofoLineItem : fofoLineItems) {
1341
            if (fofoLineItem.getSerialNumber() != null && !fofoLineItem.getSerialNumber().isEmpty()) {
1342
                serialNumbers.add(fofoLineItem.getSerialNumber());
1343
            }
1344
        }
1345
        return serialNumbers;
1346
    }
23650 amit.gupta 1347
 
32145 tejbeer 1348
    private void validateDpPrice(Map<Integer, PriceModel> itemIdMopPriceMap, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1349
        for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoLineItemMap.entrySet()) {
1350
            int itemId = entry.getKey();
1351
            CustomFofoOrderItem customFofoOrderItem = entry.getValue();
1352
            LOGGER.info("CustomFofoOrderItem -- {}", customFofoOrderItem);
1353
            PriceModel priceModel = itemIdMopPriceMap.get(itemId);
1354
            Item item = itemRepository.selectById(itemId);
1355
            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) {
1356
                if (Utils.compareFloat(priceModel.getPrice(), customFofoOrderItem.getSellingPrice() + customFofoOrderItem.getDiscountAmount()) > 0) {
1357
                    throw new ProfitMandiBusinessException("Selling Price for ", item.getItemDescription(), "FFORDR_1010");
1358
                }
1359
            } else {
1360
                if (!item.getBrand().equals("Live Demo") && priceModel.getPurchasePrice() > customFofoOrderItem.getSellingPrice()) {
1361
                    throw new ProfitMandiBusinessException("Selling Price", itemRepository.selectById(itemId).getItemDescription(), "Selling Price should not be less than DP");
1362
                }
1363
            }
1364
        }
1365
    }
24275 amit.gupta 1366
 
32145 tejbeer 1367
    private void validateMopPrice(Map<Integer, PriceModel> itemIdMopPriceMap, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoLineItemMap) throws ProfitMandiBusinessException {
1368
        Map<Integer, Float> invalidMopItemIdPriceMap = new HashMap<>();
1369
        for (Map.Entry<Integer, PriceModel> entry : itemIdMopPriceMap.entrySet()) {
1370
            CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoLineItemMap.get(entry.getKey());
1371
            Item item = itemRepository.selectById(customFofoOrderItem.getItemId());
1372
            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()) {
1373
                invalidMopItemIdPriceMap.put(entry.getKey(), customFofoOrderItem.getSellingPrice());
1374
            }
1375
        }
23650 amit.gupta 1376
 
32145 tejbeer 1377
        if (!invalidMopItemIdPriceMap.isEmpty()) {
1378
            LOGGER.error("Invalid itemIds selling prices{} should be greater than mop prices {}", invalidMopItemIdPriceMap, itemIdMopPriceMap);
1379
            throw new ProfitMandiBusinessException("invalidMopItemIdPrice", invalidMopItemIdPriceMap, "FFORDR_1010");
1380
        }
23650 amit.gupta 1381
 
32145 tejbeer 1382
    }
23650 amit.gupta 1383
 
32145 tejbeer 1384
    private void updateInventoryItemsAndScanRecord(Set<InventoryItem> inventoryItems, int fofoId, Map<Integer, Integer> inventoryItemQuantityUsed, int fofoOrderId) {
1385
        for (InventoryItem inventoryItem : inventoryItems) {
1386
            inventoryItem.setLastScanType(ScanType.SALE);
1387
            ScanRecord scanRecord = new ScanRecord();
1388
            scanRecord.setInventoryItemId(inventoryItem.getId());
1389
            scanRecord.setFofoId(fofoId);
1390
            scanRecord.setOrderId(fofoOrderId);
1391
            // correct this
1392
            scanRecord.setQuantity(inventoryItemQuantityUsed.get(inventoryItem.getId()));
1393
            scanRecord.setType(ScanType.SALE);
1394
            scanRecordRepository.persist(scanRecord);
1395
            purchaseReturnItemRepository.deleteById(inventoryItem.getId());
23650 amit.gupta 1396
 
32145 tejbeer 1397
        }
1398
    }
23650 amit.gupta 1399
 
32145 tejbeer 1400
    private void createFofoLineItem(int fofoOrderItemId, Set<InventoryItem> inventoryItems, Map<Integer, Integer> inventoryItemIdQuantityUsed) {
1401
        for (InventoryItem inventoryItem : inventoryItems) {
1402
            FofoLineItem fofoLineItem = new FofoLineItem();
1403
            fofoLineItem.setFofoOrderItemId(fofoOrderItemId);
1404
            fofoLineItem.setSerialNumber(inventoryItem.getSerialNumber());
1405
            fofoLineItem.setInventoryItemId(inventoryItem.getId());
1406
            fofoLineItem.setQuantity(inventoryItemIdQuantityUsed.get(inventoryItem.getId()));
1407
            fofoLineItemRepository.persist(fofoLineItem);
1408
        }
1409
    }
23650 amit.gupta 1410
 
32145 tejbeer 1411
    private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Integer stateId) throws ProfitMandiBusinessException {
1412
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1413
        fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
1414
        fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
1415
        fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
1416
        fofoOrderItem.setOrderId(fofoOrderId);
1417
        TagListing tl = tagListingRepository.selectByItemId(customFofoOrderItem.getItemId());
1418
        // In case listing gets removed rebill it using the selling price
1419
        if (tl != null) {
1420
            fofoOrderItem.setDp(tl.getSellingPrice());
1421
            fofoOrderItem.setMop(tl.getMop());
1422
        } else {
1423
            fofoOrderItem.setDp(customFofoOrderItem.getSellingPrice());
1424
            fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
1425
        }
1426
        fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
24823 amit.gupta 1427
 
32145 tejbeer 1428
        Item item = itemMap.get(customFofoOrderItem.getItemId());
1429
        Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1430
        if (stateId != null) {
1431
            itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
1432
        } else {
1433
            itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
1434
        }
1435
        for (InventoryItem inventoryItem : inventoryItems) {
23650 amit.gupta 1436
 
32145 tejbeer 1437
            fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getIgstRate());
23650 amit.gupta 1438
 
32145 tejbeer 1439
            fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
1440
            fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
27516 amit.gupta 1441
 
1442
 
32145 tejbeer 1443
            fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1444
            break;
1445
        }
1446
        fofoOrderItem.setBrand(item.getBrand());
1447
        fofoOrderItem.setModelName(item.getModelName());
1448
        fofoOrderItem.setModelNumber(item.getModelNumber());
1449
        fofoOrderItem.setColor(item.getColor());
1450
        fofoOrderItemRepository.persist(fofoOrderItem);
1451
        return fofoOrderItem;
1452
    }
27516 amit.gupta 1453
 
32145 tejbeer 1454
    private FofoOrderItem getDummyFofoOrderItem(int itemId, int fofoOrderId, String serialNumber, Integer stateId) throws ProfitMandiBusinessException {
1455
        Item item = itemRepository.selectById(itemId);
1456
        TagListing tl = tagListingRepository.selectByItemId(itemId);
1457
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1458
        fofoOrderItem.setItemId(itemId);
1459
        fofoOrderItem.setQuantity(1);
1460
        fofoOrderItem.setSellingPrice(tl.getMop());
1461
        fofoOrderItem.setOrderId(fofoOrderId);
1462
        // In case listing gets removed rebill it using the selling price
1463
        fofoOrderItem.setDp(tl.getSellingPrice());
1464
        fofoOrderItem.setMop(tl.getMop());
1465
        fofoOrderItem.setDiscount(0);
27516 amit.gupta 1466
 
32145 tejbeer 1467
        Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1468
        if (stateId != null) {
1469
            itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(Arrays.asList(itemId), stateId);
1470
        } else {
1471
            itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId));
1472
        }
27516 amit.gupta 1473
 
32145 tejbeer 1474
        fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(itemId).getIgstRate());
27516 amit.gupta 1475
 
32145 tejbeer 1476
        fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(itemId).getCgstRate());
1477
        fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(itemId).getSgstRate());
23650 amit.gupta 1478
 
1479
 
32145 tejbeer 1480
        fofoOrderItem.setHsnCode(item.getHsnCode());
1481
        fofoOrderItem.setBrand(item.getBrand());
1482
        fofoOrderItem.setModelName(item.getModelName());
1483
        fofoOrderItem.setModelNumber(item.getModelNumber());
1484
        fofoOrderItem.setColor(item.getColor());
23650 amit.gupta 1485
 
32145 tejbeer 1486
        Set<FofoLineItem> fofoLineItems = new HashSet<>();
1487
        FofoLineItem fli = new FofoLineItem();
1488
        fli.setQuantity(1);
1489
        fli.setSerialNumber(serialNumber);
1490
        fofoLineItems.add(fli);
1491
        fofoOrderItem.setFofoLineItems(fofoLineItems);
22859 ashik.ali 1492
 
32145 tejbeer 1493
        return fofoOrderItem;
1494
    }
22859 ashik.ali 1495
 
32145 tejbeer 1496
    private void updateCurrentInventorySnapshot(List<CurrentInventorySnapshot> currentInventorySnapshots, int fofoId, int itemId, int quantity) throws ProfitMandiBusinessException {
1497
        for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1498
            if (currentInventorySnapshot.getItemId() == itemId && currentInventorySnapshot.getFofoId() == fofoId) {
1499
                currentInventorySnapshotRepository.updateAvailabilityByItemIdAndFofoId(itemId, fofoId, currentInventorySnapshot.getAvailability() - quantity);
1500
            }
1501
        }
1502
    }
23650 amit.gupta 1503
 
32145 tejbeer 1504
    private void createPaymentOptions(FofoOrder fofoOrder, Set<CustomPaymentOption> customPaymentOptions) throws ProfitMandiBusinessException {
1505
        for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1506
            if (customPaymentOption.getAmount() > 0) {
1507
                PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
1508
                paymentOptionTransaction.setReferenceId(fofoOrder.getId());
1509
                paymentOptionTransaction.setPaymentOptionId(customPaymentOption.getPaymentOptionId());
1510
                paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1511
                paymentOptionTransaction.setAmount(customPaymentOption.getAmount());
1512
                paymentOptionTransaction.setFofoId(fofoOrder.getFofoId());
1513
                paymentOptionTransactionRepository.persist(paymentOptionTransaction);
1514
            }
1515
        }
1516
    }
22859 ashik.ali 1517
 
32145 tejbeer 1518
    private FofoOrder createAndGetFofoOrder(int customerId, String customerGstNumber, int fofoId, String documentNumber, float totalAmount, int customerAddressId) {
1519
        FofoOrder fofoOrder = new FofoOrder();
1520
        fofoOrder.setCustomerGstNumber(customerGstNumber);
1521
        fofoOrder.setCustomerId(customerId);
1522
        fofoOrder.setFofoId(fofoId);
1523
        fofoOrder.setInvoiceNumber(documentNumber);
1524
        fofoOrder.setTotalAmount(totalAmount);
1525
        fofoOrder.setCustomerAddressId(customerAddressId);
1526
        fofoOrderRepository.persist(fofoOrder);
1527
        return fofoOrder;
1528
    }
23650 amit.gupta 1529
 
32145 tejbeer 1530
    private void validateItemsSerializedNonSerialized(List<Item> items, Map<Integer, CustomFofoOrderItem> customFofoOrderItemMap) throws ProfitMandiBusinessException {
1531
        List<Integer> invalidItemIdSerialNumbers = new ArrayList<Integer>();
1532
        List<Integer> itemIdNonSerializedSerialNumbers = new ArrayList<Integer>();
1533
        for (Item i : items) {
1534
            CustomFofoOrderItem customFofoOrderItem = customFofoOrderItemMap.get(i.getId());
1535
            if (i.getType().equals(ItemType.SERIALIZED)) {
1536
                if (customFofoOrderItem == null || customFofoOrderItem.getSerialNumberDetails().isEmpty()) {
1537
                    invalidItemIdSerialNumbers.add(i.getId());
1538
                }
1539
            } else {
1540
                Set<String> serialNumbers = this.serialNumberDetailsToSerialNumbers(customFofoOrderItem.getSerialNumberDetails());
1541
                if (customFofoOrderItem == null || !serialNumbers.isEmpty()) {
1542
                    itemIdNonSerializedSerialNumbers.add(i.getId());
1543
                }
1544
            }
1545
        }
23650 amit.gupta 1546
 
32145 tejbeer 1547
        if (!invalidItemIdSerialNumbers.isEmpty()) {
1548
            LOGGER.error("Invalid itemId's serialNumbers for serialized{}", invalidItemIdSerialNumbers);
1549
            // itemId's are serialized you are saying these are not serialized
1550
            throw new ProfitMandiBusinessException("invalidItemIdSerialNumbers", invalidItemIdSerialNumbers, "FFORDR_1013");
1551
        }
22859 ashik.ali 1552
 
32145 tejbeer 1553
        if (!itemIdNonSerializedSerialNumbers.isEmpty()) {
1554
            LOGGER.error("Invalid itemId's serialNumbers for non serialized{}", itemIdNonSerializedSerialNumbers);
1555
            // itemId's are non serialized you are saying these are serialized
1556
            throw new ProfitMandiBusinessException("itemIdNonSerializedSerialNumbers", itemIdNonSerializedSerialNumbers, "FFORDR_1014");
1557
        }
1558
    }
22859 ashik.ali 1559
 
32145 tejbeer 1560
    private void validateCurrentInventorySnapshotQuantities(List<CurrentInventorySnapshot> currentInventorySnapshots, Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap) throws ProfitMandiBusinessException {
1561
        if (itemIdCustomFofoOrderItemMap.keySet().size() != currentInventorySnapshots.size()) {
1562
            throw new ProfitMandiBusinessException("quantiiesSize", currentInventorySnapshots.size(), "");
1563
        }
1564
        List<ItemIdQuantityAvailability> itemIdQuantityAvailabilities = new ArrayList<>(); // this is for error
1565
        LOGGER.info("currentInventorySnapshots " + currentInventorySnapshots);
1566
        LOGGER.info("CustomFofoLineItemMap {}", itemIdCustomFofoOrderItemMap);
1567
        for (CurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {
1568
            CustomFofoOrderItem customFofoOrderItem = itemIdCustomFofoOrderItemMap.get(currentInventorySnapshot.getItemId());
1569
            LOGGER.info("customFofoOrderItem {}", customFofoOrderItem);
1570
            if (customFofoOrderItem.getQuantity() > currentInventorySnapshot.getAvailability()) {
1571
                ItemIdQuantityAvailability itemIdQuantityAvailability = new ItemIdQuantityAvailability();
1572
                itemIdQuantityAvailability.setItemId(customFofoOrderItem.getItemId());
1573
                Quantity quantity = new Quantity();
1574
                quantity.setAvailable(currentInventorySnapshot.getAvailability());
1575
                quantity.setRequested(customFofoOrderItem.getQuantity());
1576
                itemIdQuantityAvailability.setQuantity(quantity);
1577
                itemIdQuantityAvailabilities.add(itemIdQuantityAvailability);
1578
            }
1579
        }
22859 ashik.ali 1580
 
32145 tejbeer 1581
        if (!itemIdQuantityAvailabilities.isEmpty()) {
1582
            // itemIdQuantity request is not valid
1583
            LOGGER.error("Requested quantities should not be greater than currently available quantities {}", itemIdQuantityAvailabilities);
1584
            throw new ProfitMandiBusinessException("itemIdQuantityAvailabilities", itemIdQuantityAvailabilities, "FFORDR_1015");
1585
        }
1586
    }
22859 ashik.ali 1587
 
32145 tejbeer 1588
    private int getItemIdFromSerialNumber(Map<Integer, CustomFofoOrderItem> itemIdCustomFofoOrderItemMap, String serialNumber) {
1589
        int itemId = 0;
1590
        for (Map.Entry<Integer, CustomFofoOrderItem> entry : itemIdCustomFofoOrderItemMap.entrySet()) {
1591
            Set<SerialNumberDetail> serialNumberDetails = entry.getValue().getSerialNumberDetails();
1592
            for (SerialNumberDetail serialNumberDetail : serialNumberDetails) {
1593
                if (serialNumberDetail.getSerialNumber().equals(serialNumber)) {
1594
                    itemId = entry.getKey();
1595
                    break;
1596
                }
1597
            }
1598
        }
1599
        return itemId;
1600
    }
23650 amit.gupta 1601
 
32145 tejbeer 1602
    private Map<Integer, Item> toItemMap(List<Item> items) {
1603
        Function<Item, Integer> itemIdFunction = new Function<Item, Integer>() {
1604
            @Override
1605
            public Integer apply(Item item) {
1606
                return item.getId();
1607
            }
1608
        };
1609
        Function<Item, Item> itemFunction = new Function<Item, Item>() {
1610
            @Override
1611
            public Item apply(Item item) {
1612
                return item;
1613
            }
1614
        };
1615
        return items.stream().collect(Collectors.toMap(itemIdFunction, itemFunction));
1616
    }
23650 amit.gupta 1617
 
32145 tejbeer 1618
    private void setCustomerAddress(CustomerAddress customerAddress, CustomAddress customAddress) {
1619
        customerAddress.setName(customAddress.getName());
1620
        customerAddress.setLastName(customAddress.getLastName());
1621
        customerAddress.setLine1(customAddress.getLine1());
1622
        customerAddress.setLine2(customAddress.getLine2());
1623
        customerAddress.setLandmark(customAddress.getLandmark());
1624
        customerAddress.setCity(customAddress.getCity());
1625
        customerAddress.setPinCode(customAddress.getPinCode());
1626
        customerAddress.setState(customAddress.getState());
1627
        customerAddress.setCountry(customAddress.getCountry());
1628
        customerAddress.setPhoneNumber(customAddress.getPhoneNumber());
1629
    }
23650 amit.gupta 1630
 
32145 tejbeer 1631
    private CustomAddress createCustomAddress(Address address) {
1632
        CustomAddress customAddress = new CustomAddress();
1633
        customAddress.setName(address.getName());
1634
        customAddress.setLine1(address.getLine1());
1635
        customAddress.setLine2(address.getLine2());
1636
        customAddress.setLandmark(address.getLandmark());
1637
        customAddress.setCity(address.getCity());
1638
        customAddress.setPinCode(address.getPinCode());
1639
        customAddress.setState(address.getState());
1640
        customAddress.setCountry(address.getCountry());
1641
        customAddress.setPhoneNumber(address.getPhoneNumber());
1642
        return customAddress;
1643
    }
23650 amit.gupta 1644
 
32145 tejbeer 1645
    private CustomAddress createCustomAddress(CustomerAddress customerAddress) {
1646
        CustomAddress customAddress = new CustomAddress();
1647
        customAddress.setName(customerAddress.getName());
1648
        customAddress.setLastName(customerAddress.getLastName());
1649
        customAddress.setLine1(customerAddress.getLine1());
1650
        customAddress.setLine2(customerAddress.getLine2());
1651
        customAddress.setLandmark(customerAddress.getLandmark());
1652
        customAddress.setCity(customerAddress.getCity());
1653
        customAddress.setPinCode(customerAddress.getPinCode());
1654
        customAddress.setState(customerAddress.getState());
1655
        customAddress.setCountry(customerAddress.getCountry());
1656
        customAddress.setPhoneNumber(customerAddress.getPhoneNumber());
1657
        return customAddress;
1658
    }
23650 amit.gupta 1659
 
32145 tejbeer 1660
    private void validatePaymentOptionsAndTotalAmount(Set<CustomPaymentOption> customPaymentOptions, float totalAmount) throws ProfitMandiBusinessException {
1661
        Set<Integer> paymentOptionIds = new HashSet<>();
23650 amit.gupta 1662
 
32145 tejbeer 1663
        float calculatedAmount = 0;
1664
        for (CustomPaymentOption customPaymentOption : customPaymentOptions) {
1665
            paymentOptionIds.add(customPaymentOption.getPaymentOptionId());
1666
            calculatedAmount = calculatedAmount + customPaymentOption.getAmount();
1667
        }
1668
        if (calculatedAmount != totalAmount) {
1669
            LOGGER.warn("Error occured while validating payment options amount - {} != TotalAmount {}", calculatedAmount, totalAmount);
1670
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_CALCULATED_AMOUNT, calculatedAmount, "FFORDR_1016");
1671
        }
23418 ashik.ali 1672
 
32145 tejbeer 1673
        List<Integer> foundPaymentOptionIds = paymentOptionRepository.selectIdsByIds(paymentOptionIds);
1674
        if (foundPaymentOptionIds.size() != paymentOptionIds.size()) {
1675
            paymentOptionIds.removeAll(foundPaymentOptionIds);
1676
            throw new ProfitMandiBusinessException(ProfitMandiConstants.PAYMENT_OPTION_ID, paymentOptionIds, "FFORDR_1017");
1677
        }
1678
    }
25101 amit.gupta 1679
 
32145 tejbeer 1680
    @Override
1681
    public List<FofoOrderItem> getByOrderId(int orderId) throws ProfitMandiBusinessException {
1682
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(orderId);
1683
        if (!fofoOrderItems.isEmpty()) {
1684
            List<FofoOrderItem> newFofoOrderItems = new ArrayList<>();
1685
            Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = this.toFofoOrderItemIdFofoLineItems(fofoOrderItems);
1686
            Iterator<FofoOrderItem> fofoOrderItemsIterator = fofoOrderItems.iterator();
1687
            while (fofoOrderItemsIterator.hasNext()) {
1688
                FofoOrderItem fofoOrderItem = fofoOrderItemsIterator.next();
1689
                fofoOrderItem.setFofoLineItems(fofoOrderItemIdFofoLineItemsMap.get(fofoOrderItem.getId()));
1690
                newFofoOrderItems.add(fofoOrderItem);
1691
                fofoOrderItemsIterator.remove();
1692
            }
1693
            fofoOrderItems = newFofoOrderItems;
1694
        }
1695
        return fofoOrderItems;
1696
    }
25101 amit.gupta 1697
 
32145 tejbeer 1698
    private Set<Integer> toFofoOrderItemIds(List<FofoOrderItem> fofoOrderItems) {
1699
        Function<FofoOrderItem, Integer> fofoOrderItemToFofoOrderItemIdFunction = new Function<FofoOrderItem, Integer>() {
1700
            @Override
1701
            public Integer apply(FofoOrderItem fofoOrderItem) {
1702
                return fofoOrderItem.getId();
1703
            }
1704
        };
1705
        return fofoOrderItems.stream().map(fofoOrderItemToFofoOrderItemIdFunction).collect(Collectors.toSet());
1706
    }
25101 amit.gupta 1707
 
32145 tejbeer 1708
    private Map<Integer, Set<FofoLineItem>> toFofoOrderItemIdFofoLineItems(List<FofoOrderItem> fofoOrderItems) {
1709
        Set<Integer> fofoOrderItemIds = this.toFofoOrderItemIds(fofoOrderItems);
1710
        List<FofoLineItem> fofoLineItems = fofoLineItemRepository.selectByFofoOrderItemIds(fofoOrderItemIds);
1711
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap = new HashMap<>();
1712
        for (FofoLineItem fofoLineItem : fofoLineItems) {
1713
            if (!fofoOrderItemIdFofoLineItemsMap.containsKey(fofoLineItem.getFofoOrderItemId())) {
1714
                Set<FofoLineItem> fofoLineItems2 = new HashSet<>();
1715
                fofoLineItems2.add(fofoLineItem);
1716
                fofoOrderItemIdFofoLineItemsMap.put(fofoLineItem.getFofoOrderItemId(), fofoLineItems2);
1717
            } else {
1718
                fofoOrderItemIdFofoLineItemsMap.get(fofoLineItem.getFofoOrderItemId()).add(fofoLineItem);
1719
            }
1720
        }
1721
        return fofoOrderItemIdFofoLineItemsMap;
1722
    }
25101 amit.gupta 1723
 
32145 tejbeer 1724
    @Override
1725
    public void updateCustomerDetails(CustomCustomer customCustomer, String invoiceNumber) throws ProfitMandiBusinessException {
1726
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1727
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
1728
        customer.setFirstName(customCustomer.getFirstName());
1729
        customer.setLastName(customCustomer.getLastName());
1730
        customer.setMobileNumber(customCustomer.getMobileNumber());
1731
        customer.setEmailId(customCustomer.getEmailId());
1732
        customerRepository.persist(customer);
1733
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1734
        if (!customerAddress.getState().equalsIgnoreCase(customCustomer.getAddress().getState())) {
1735
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1736
            resetTaxation(fofoOrder.getFofoId(), customerAddress, fofoOrderItems);
1737
        }
1738
        this.setCustomerAddress(customerAddress, customCustomer.getAddress());
1739
        customerAddressRepository.persist(customerAddress);
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
    }
25724 amit.gupta 2067
}