Subversion Repositories SmartDukaan

Rev

Rev 35737 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21612 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
26817 amit.gupta 3
import com.google.gson.Gson;
23203 ashik.ali 4
import com.spice.profitmandi.common.enumuration.SearchType;
21612 ashik.ali 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30322 amit.gupta 6
import com.spice.profitmandi.common.model.*;
28339 tejbeer 7
import com.spice.profitmandi.common.solr.SolrService;
33213 tejus.loha 8
import com.spice.profitmandi.common.util.FileUtil;
21689 ashik.ali 9
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 10
import com.spice.profitmandi.common.util.StringUtils;
22244 ashik.ali 11
import com.spice.profitmandi.common.web.util.ResponseSender;
33213 tejus.loha 12
import com.spice.profitmandi.dao.entity.auth.AuthUser;
33795 ranu 13
import com.spice.profitmandi.dao.entity.catalog.CustomerOffer;
14
import com.spice.profitmandi.dao.entity.catalog.CustomerOfferItem;
23638 amit.gupta 15
import com.spice.profitmandi.dao.entity.catalog.Item;
27861 tejbeer 16
import com.spice.profitmandi.dao.entity.catalog.TagListing;
33400 ranu 17
import com.spice.profitmandi.dao.entity.cs.Position;
34798 ranu 18
import com.spice.profitmandi.dao.entity.dtr.*;
30322 amit.gupta 19
import com.spice.profitmandi.dao.entity.fofo.*;
34194 ranu 20
import com.spice.profitmandi.dao.entity.transaction.EInvoiceDetails;
21
import com.spice.profitmandi.dao.entity.transaction.Order;
22
import com.spice.profitmandi.dao.entity.transaction.TransactionApproval;
23
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
23298 ashik.ali 24
import com.spice.profitmandi.dao.entity.user.Address;
33400 ranu 25
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
23548 ashik.ali 26
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
27046 tejbeer 27
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
33213 tejus.loha 28
import com.spice.profitmandi.dao.enumuration.transaction.TransactionApprovalStatus;
34788 ranu 29
import com.spice.profitmandi.dao.model.ItemWiseCustomerOfferSummaryModel;
34168 tejus.loha 30
import com.spice.profitmandi.dao.model.hdfc.IrnResetOrderModel;
33213 tejus.loha 31
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33795 ranu 32
import com.spice.profitmandi.dao.repository.catalog.*;
33400 ranu 33
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
30322 amit.gupta 34
import com.spice.profitmandi.dao.repository.dtr.*;
35
import com.spice.profitmandi.dao.repository.fofo.*;
24440 amit.gupta 36
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
33336 tejus.loha 37
import com.spice.profitmandi.dao.repository.transaction.*;
23298 ashik.ali 38
import com.spice.profitmandi.dao.repository.user.AddressRepository;
33336 tejus.loha 39
import com.spice.profitmandi.dao.repository.user.CartRepository;
34474 aman.kumar 40
import com.spice.profitmandi.dao.service.ScratchService;
28377 tejbeer 41
import com.spice.profitmandi.service.EmailService;
32251 amit.gupta 42
import com.spice.profitmandi.service.NotificationService;
23798 amit.gupta 43
import com.spice.profitmandi.service.authentication.RoleManager;
34798 ranu 44
import com.spice.profitmandi.service.integrations.bharti.model.PlanVariant;
45
import com.spice.profitmandi.service.integrations.icicilombard.IciciLombardService;
35726 vikas 46
import com.spice.profitmandi.service.integrations.pinelabs.PinelabsOfferCacheService;
47
import com.spice.profitmandi.service.integrations.pinelabs.dto.Tenure;
34798 ranu 48
import com.spice.profitmandi.service.integrations.icicilombard.model.AfinityQuoteModel;
34805 ranu 49
import com.spice.profitmandi.service.integrations.icicilombard.model.AfinityQuoteResponseModel;
35269 ranu 50
import com.spice.profitmandi.service.integrations.oneassist.OneAssistService;
51
import com.spice.profitmandi.service.integrations.oneassist.model.CancelPlanRequestModel;
25726 amit.gupta 52
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
24440 amit.gupta 53
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
33172 tejus.loha 54
import com.spice.profitmandi.service.order.BulkOrderService;
23366 ashik.ali 55
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 56
import com.spice.profitmandi.service.pricing.PricingService;
33696 amit.gupta 57
import com.spice.profitmandi.service.transaction.SDCreditService;
33213 tejus.loha 58
import com.spice.profitmandi.service.transaction.TransactionService;
26647 tejbeer 59
import com.spice.profitmandi.service.user.RetailerService;
33336 tejus.loha 60
import com.spice.profitmandi.service.wallet.WalletService;
32405 jai.hind 61
import com.spice.profitmandi.service.whatsapp.WhatsappMessageService;
32855 amit.gupta 62
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
22139 amit.gupta 63
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 64
import com.spice.profitmandi.web.util.CookiesProcessor;
24105 govind 65
import com.spice.profitmandi.web.util.MVCResponseSender;
33336 tejus.loha 66
import in.shop2020.model.v1.order.WalletReferenceType;
30148 amit.gupta 67
import org.apache.logging.log4j.LogManager;
68
import org.apache.logging.log4j.Logger;
32405 jai.hind 69
import org.json.JSONArray;
30148 amit.gupta 70
import org.json.JSONObject;
71
import org.springframework.beans.factory.annotation.Autowired;
72
import org.springframework.core.io.InputStreamResource;
73
import org.springframework.http.HttpHeaders;
74
import org.springframework.http.HttpStatus;
75
import org.springframework.http.MediaType;
76
import org.springframework.http.ResponseEntity;
77
import org.springframework.stereotype.Controller;
78
import org.springframework.transaction.annotation.Transactional;
79
import org.springframework.ui.Model;
80
import org.springframework.web.bind.annotation.*;
33172 tejus.loha 81
import org.springframework.web.multipart.MultipartFile;
21612 ashik.ali 82
 
33336 tejus.loha 83
import javax.mail.MessagingException;
30148 amit.gupta 84
import javax.servlet.http.HttpServletRequest;
85
import javax.servlet.http.HttpServletResponse;
34805 ranu 86
import java.io.*;
32271 amit.gupta 87
import java.nio.charset.StandardCharsets;
34805 ranu 88
import java.nio.file.Files;
33367 ranu 89
import java.time.LocalDate;
30148 amit.gupta 90
import java.time.LocalDateTime;
91
import java.time.format.DateTimeFormatter;
92
import java.time.temporal.ChronoUnit;
93
import java.util.*;
94
import java.util.stream.Collectors;
95
 
21612 ashik.ali 96
@Controller
23973 govind 97
@Transactional(rollbackFor = Throwable.class)
21612 ashik.ali 98
public class OrderController {
99
 
33213 tejus.loha 100
    private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 101
 
33213 tejus.loha 102
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
103
    private static final List<String> allowedDoaImeis = Arrays.asList("863903054378477");
104
    @Autowired
105
    NotificationService notificationService;
106
    @Autowired
107
    TransactionApprovalRepository transactionApprovalRepository;
108
    @Autowired
109
    LineItemRepository lineItemRepository;
110
    @Autowired
111
    AuthRepository authRepository;
112
    @Autowired
113
    TransactionService transactionService;
114
    @Autowired
115
    BulkOrderService bulkOrderService;
116
    @Autowired
117
    private CustomerRepository customerRepository;
35737 amit 118
    private static final boolean accessoriesDeals = true;
33213 tejus.loha 119
    @Autowired
120
    private RoleManager roleManager;
121
    @Autowired
122
    private Gson gson;
123
    @Autowired
124
    private CustomerReturnItemRepository customerReturnItemRepository;
125
    @Autowired
126
    private FofoOrderItemRepository fofoOrderItemRepository;
127
    @Autowired
128
    private PaymentOptionRepository paymentOptionRepository;
129
    @Autowired
130
    private StateRepository stateRepository;
131
    @Autowired
132
    private ItemRepository itemRepository;
133
    @Autowired
134
    private MVCResponseSender mvcResponseSender;
135
    @Autowired
136
    private InsuranceService insuranceService;
137
    @Autowired
138
    private FofoOrderRepository fofoOrderRepository;
139
    @Autowired
140
    private CustomerAddressRepository customerAddressRepository;
141
    @Autowired
142
    private InsurancePolicyRepository insurancePolicyRepository;
143
    @Autowired
144
    private InsuranceProviderRepository insuranceProviderRepository;
145
    @Autowired
146
    private CookiesProcessor cookiesProcessor;
147
    @Autowired
148
    private PricingService pricingService;
149
    @Autowired
150
    private OrderService orderService;
151
    @Autowired
152
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
153
    @Autowired
154
    private AddressRepository addressRepository;
155
    @Autowired
156
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
157
    @Autowired
158
    private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
159
    @Autowired
160
    private ResponseSender<?> responseSender;
161
    @Autowired
162
    private PendingOrderRepository pendingOrderRepository;
163
    @Autowired
164
    private OrderRepository orderRepository;
165
    @Autowired
166
    private PendingOrderItemRepository pendingOrderItemRepository;
167
    @Autowired
168
    private FofoStoreRepository fofoStoreRepository;
169
    @Autowired
170
    private RetailerService retailerService;
171
    @Autowired
172
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
173
    @Autowired
174
    private TagListingRepository tagListingRepository;
175
    @Autowired
176
    private PendingOrderService pendingOrderService;
177
    @Autowired
178
    private EmailService emailService;
179
    @Autowired
180
    private SolrService commonSolrService;
181
    @Autowired
182
    private MouRepository mouRepository;
183
    @Autowired
184
    private WhatsappMessageService whatsappMessageService;
185
    @Autowired
186
    private TransactionRepository transactionRepository;
33336 tejus.loha 187
    @Autowired
188
    WalletService walletService;
189
    @Autowired
190
    CartRepository cartRepository;
191
    @Autowired
192
    UserWalletRepository userWalletRepository;
28339 tejbeer 193
 
33795 ranu 194
    @Autowired
195
    private CatalogRepository catalogRepository;
33336 tejus.loha 196
 
33400 ranu 197
    @Autowired
33795 ranu 198
    private CustomerOfferRepository customerOfferRepository;
199
 
200
    @Autowired
201
    private CustomerOfferItemRepository customerOfferItemRepository;
202
 
203
    @Autowired
204
    private WebOfferRepository webOfferRepository;
205
 
206
    @Autowired
33400 ranu 207
    PositionRepository positionRepository;
32405 jai.hind 208
 
33437 ranu 209
    @Autowired
210
    PendingOrderPlanRepository pendingOrderPlanRepository;
24105 govind 211
 
34168 tejus.loha 212
    @Autowired
213
    PartnerOnBoardingPanelRepository partnerOnBoardingPanelRepository;
214
 
215
    @Autowired
216
    SDCreditService sdCreditService;
217
 
34798 ranu 218
    @Autowired
219
    IciciPolicyTrackerRepository iciciPolicyTrackerRepository;
34788 ranu 220
 
221
    @Autowired
34474 aman.kumar 222
    ScratchService scratchService;
34798 ranu 223
 
34788 ranu 224
    @Autowired
34798 ranu 225
    IciciLombardService iciciLombardService;
34788 ranu 226
 
35726 vikas 227
    @Autowired
228
    PinelabsOfferCacheService pinelabsOfferCacheService;
229
 
33419 amit.gupta 230
    @RequestMapping(value = "/wa-send-invoice", method = RequestMethod.GET)
231
    public String sendWhatsappMessage(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) {
232
        try {
233
            this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(orderId));
234
        } catch (Exception e) {
35737 amit 235
            LOGGER.error("Could not send whatsapp message for order {}", orderId, e);
33419 amit.gupta 236
        }
237
        model.addAttribute("response1", true);
238
        return "response";
239
    }
240
 
33213 tejus.loha 241
    @RequestMapping(value = "/get-order", method = RequestMethod.GET)
242
    public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId,
243
                           Model model) throws ProfitMandiBusinessException {
244
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
245
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
246
        List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
247
        CustomerAddress customerAddress = null;
248
        if (fofoOrder.getCustomerAddressId() != 0) {
249
            customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
250
        }
23973 govind 251
 
33213 tejus.loha 252
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
253
        if (customerAddress != null) {
254
            customerAddress.setPhoneNumber(customer.getMobileNumber());
255
        }
256
        LOGGER.info("Added to get invoice - {}, {}", customer, 123);
257
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
258
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
259
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
260
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
261
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
262
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
263
        this.addInsuranceProvider(insurancePolicies);
32627 ranu 264
 
33213 tejus.loha 265
        model.addAttribute("fofoOrder", fofoOrder);
266
        model.addAttribute("fofoLineItems", fofoLineItems);
267
        if (customerAddress != null) {
268
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
269
        } else {
270
            model.addAttribute("customerBillingAddress", "");
21985 kshitij.so 271
 
33213 tejus.loha 272
        }
273
        model.addAttribute("customerBillingAddressObj", customerAddress);
274
        model.addAttribute("customerDetailsObj", customer);
275
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
276
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
277
        model.addAttribute("insurancePolicies", insurancePolicies);
278
        return "order-details";
279
    }
32637 amit.gupta 280
 
33213 tejus.loha 281
    private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(
282
            List<InsuranceProvider> insuranceProviders) {
283
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
284
        for (InsuranceProvider insuranceProvider : insuranceProviders) {
285
            insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
286
        }
287
        return insuranceProviderIdInsuranceProviderMap;
288
    }
23973 govind 289
 
33247 ranu 290
    private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies) throws ProfitMandiBusinessException {
33213 tejus.loha 291
        if (insurancePolicies.isEmpty()) {
292
            return;
293
        }
294
        Set<Integer> insuranceProviderIds = new HashSet<>();
295
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
296
            insuranceProviderIds.add(insurancePolicy.getProviderId());
297
        }
298
        LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
299
        List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
300
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this
301
                .toInsuranceProviderIdInsuranceProvider(insuranceProviders);
302
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
303
            insurancePolicy
304
                    .setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
305
        }
306
    }
23973 govind 307
 
33213 tejus.loha 308
    @RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
309
    public String getSaleDetails(HttpServletRequest request,
310
                                 @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
311
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
312
        boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
313
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
314
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
315
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
316
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
317
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
23973 govind 318
 
33213 tejus.loha 319
        // Added Migration info as we lost it.
320
        if (paymentOptionTransactions == null || paymentOptionTransactions.size() == 0) {
321
            PaymentOptionTransaction pot = new PaymentOptionTransaction();
322
            pot.setAmount(fofoOrder.getTotalAmount());
323
            pot.setCreateTimestamp(fofoOrder.getCreateTimestamp());
324
            // Mark it paid through cash
325
            pot.setPaymentOptionId(1);
326
            pot.setReferenceType(PaymentOptionReferenceType.ORDER);
327
            paymentOptionTransactionRepository.persist(pot);
328
            paymentOptionTransactions.add(pot);
329
            LOGGER.info("Added to get invoice");
330
        }
331
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
332
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
333
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
334
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
335
        this.addInsuranceProvider(insurancePolicies);
35737 amit 336
        Set<Integer> itemIds = fofoOrderItems.stream().map(FofoOrderItem::getItemId).collect(Collectors.toSet());
337
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemIds).stream()
338
                .collect(Collectors.toMap(Item::getId, item -> item));
33213 tejus.loha 339
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
340
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23973 govind 341
 
35737 amit 342
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = new HashMap<>();
33213 tejus.loha 343
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
23973 govind 344
 
33213 tejus.loha 345
        for (FofoOrderItem foi : fofoOrderItems) {
35737 amit 346
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
347
                    .selectAllByOrderItemId(foi.getId());
348
            foiIdCustomerReturnInventoryItemsMap.put(foi.getId(), customerReturnItems);
33213 tejus.loha 349
            for (FofoLineItem fli : foi.getFofoLineItems()) {
350
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
351
            }
352
            this.markDoa(fofoOrder, foi, isAdmin);
353
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
354
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
355
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
356
            }
357
        }
23973 govind 358
 
33213 tejus.loha 359
        LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
360
        model.addAttribute("fofoOrder", fofoOrder);
361
        model.addAttribute("itemsMap", itemsMap);
362
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
363
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
364
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
365
        model.addAttribute("fofoOrderItemIdLineItemMap", fofoOrderItemIdLineItemMap);
23973 govind 366
 
33213 tejus.loha 367
        model.addAttribute("fofoOrderItems", fofoOrderItems);
368
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
369
        if (customerAddress != null) {
30426 tejbeer 370
 
33213 tejus.loha 371
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
372
        } else {
373
            model.addAttribute("customerBillingAddress", "");
32637 amit.gupta 374
 
33213 tejus.loha 375
        }
376
        model.addAttribute("customerBillingAddressObj", customerAddress);
377
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
378
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
379
        model.addAttribute("insurancePolicies", insurancePolicies);
380
        model.addAttribute("markDefective", this.markDefective(fofoOrder));
381
        return "sale-details";
382
    }
32637 amit.gupta 383
 
33213 tejus.loha 384
    private void markDoa(FofoOrder fofoOrder, FofoOrderItem foi, boolean isAdmin) {
385
        if (isAdmin) {
386
            foi.setDoa(true);
387
            return;
388
        }
389
        boolean isImei = foi.getFofoLineItems().stream()
390
                .anyMatch(x -> org.apache.commons.lang3.StringUtils.isNotEmpty(x.getSerialNumber())
391
                        && allowedDoaImeis.contains(x.getSerialNumber()));
392
        LocalDateTime buyDate = fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS);
393
        LocalDateTime curDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
394
        if (buyDate.isAfter(curDate.minusDays(45)) || isImei) {
395
            foi.setDoa(true);
396
        } else
397
            foi.setDoa(
398
                    foi.getBrand().equals("Nokia") && foi.getCost() < 4990 && buyDate.isAfter(curDate.minusYears(1)));
399
    }
30426 tejbeer 400
 
33213 tejus.loha 401
    private boolean markDefective(FofoOrder fofoOrder) {
402
        return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(180)
403
                .isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
26647 tejbeer 404
 
33213 tejus.loha 405
    }
26647 tejbeer 406
 
33213 tejus.loha 407
    @RequestMapping(value = "/getSearchOrder")
408
    public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
409
        return "search-order";
410
    }
26647 tejbeer 411
 
33213 tejus.loha 412
    @RequestMapping(value = "/getInvoiceSearchOrder")
413
    public String getInvoiceSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
414
        return "invoices-cancel";
415
    }
33172 tejus.loha 416
 
33213 tejus.loha 417
    @RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
418
    public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer,
419
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
420
            throws Exception {
34338 ranu 421
        LOGGER.info("CustomCustomer {}", customCustomer);
33172 tejus.loha 422
 
33213 tejus.loha 423
        orderService.updateCustomerDetails(customCustomer, invoiceNumber);
424
        return this.getSearchOrderDetails(request, invoiceNumber, model);
425
    }
33172 tejus.loha 426
 
33213 tejus.loha 427
    @RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
428
    public String getSearchOrderDetails(HttpServletRequest request,
429
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
430
            throws Exception {
33172 tejus.loha 431
 
33213 tejus.loha 432
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
34474 aman.kumar 433
        if (fofoOrder == null) {
434
            throw new ProfitMandiBusinessException("invalid invoice number", "invoice - " + invoiceNumber, "Please enter valid invoice number");
34181 tejus.loha 435
        }
436
 
33213 tejus.loha 437
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
438
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
439
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
440
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = paymentOptionRepository.selectActiveOption().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
441
        List<Integer> fofoPartnerPaymentOptions = new ArrayList<>(paymentOptionIdPaymentOptionMap.keySet());
35737 amit 442
        Set<Integer> searchItemIds = fofoOrderItems.stream().map(FofoOrderItem::getItemId).collect(Collectors.toSet());
35746 amit 443
        Map<Integer, Item> itemsMap = searchItemIds.isEmpty()
444
                ? new HashMap<>()
445
                : itemRepository.selectByIds(searchItemIds).stream()
446
                        .collect(Collectors.toMap(Item::getId, item -> item));
35737 amit 447
        LOGGER.info("fofoPartnerPaymentOptions {}", fofoPartnerPaymentOptions);
33213 tejus.loha 448
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
449
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
35737 amit 450
        LOGGER.info("paymentOptionTransactions {}", paymentOptionTransactions);
26647 tejbeer 451
 
33213 tejus.loha 452
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
453
                .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
35737 amit 454
        LOGGER.info("paymentOptionIdPaymentOptionTransactionMap {}", paymentOptionIdPaymentOptionTransactionMap.keySet());
33213 tejus.loha 455
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
456
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
457
        this.addInsuranceProvider(insurancePolicies);
458
        model.addAttribute("fofoOrder", fofoOrder);
459
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
460
            fofoOrderItem.setDoa(true);
461
        }
27861 tejbeer 462
 
33213 tejus.loha 463
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
464
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
28339 tejbeer 465
 
35737 amit 466
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = new HashMap<>();
33213 tejus.loha 467
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
28339 tejbeer 468
 
33213 tejus.loha 469
        for (FofoOrderItem foi : fofoOrderItems) {
35737 amit 470
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
471
                    .selectAllByOrderItemId(foi.getId());
472
            foiIdCustomerReturnInventoryItemsMap.put(foi.getId(), customerReturnItems);
33213 tejus.loha 473
            for (FofoLineItem fli : foi.getFofoLineItems()) {
474
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
475
            }
476
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
477
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
478
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
479
            }
480
        }
481
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
482
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
483
        model.addAttribute("fofoOrderItems", fofoOrderItems);
484
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
485
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
486
        model.addAttribute("itemsMap", itemsMap);
487
        model.addAttribute("markDefective", true);
488
        model.addAttribute("customer", customer);
489
        model.addAttribute("customerAddress", customerAddress);
490
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
491
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
492
        model.addAttribute("paymentOptionIdPaymentOptionTransactionMap", paymentOptionIdPaymentOptionTransactionMap);
493
        model.addAttribute("insurancePolicies", insurancePolicies);
494
        model.addAttribute("fofoPartnerPaymentOptions", fofoPartnerPaymentOptions);
495
        model.addAttribute("totalNumberOfPaymentOptionId", fofoPartnerPaymentOptions.size());
496
        model.addAttribute("stateNames",
497
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
498
        return "search-order-details";
499
    }
28420 tejbeer 500
 
33213 tejus.loha 501
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(
33247 ranu 502
            List<PaymentOptionTransaction> paymentOptionTransactions) throws ProfitMandiBusinessException {
33213 tejus.loha 503
        Set<Integer> paymentOptionIds = new HashSet<>();
504
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
505
            paymentOptionIds.add(paymentOptionTransaction.getPaymentOptionId());
506
        }
507
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(paymentOptionIds);
508
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
509
        for (PaymentOption paymentOption : paymentOptions) {
510
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
511
        }
512
        return paymentOptionIdPaymentOptionMap;
513
    }
23973 govind 514
 
33213 tejus.loha 515
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMapUsingPaymentOptions(
33247 ranu 516
            List<Integer> fofoPartnerPaymentOptions) throws ProfitMandiBusinessException {
33213 tejus.loha 517
        List<PaymentOption> paymentOptions = paymentOptionRepository
518
                .selectByIds(new HashSet<>(fofoPartnerPaymentOptions));
519
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
520
        for (PaymentOption paymentOption : paymentOptions) {
521
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
522
        }
523
        return paymentOptionIdPaymentOptionMap;
524
    }
23973 govind 525
 
33213 tejus.loha 526
    private Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap(
527
            List<PaymentOptionTransaction> paymentOptionTransactions) {
528
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = new HashMap<>();
529
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
530
            paymentOptionIdPaymentOptionTransactionMap.put(paymentOptionTransaction.getPaymentOptionId(),
531
                    paymentOptionTransaction);
532
        }
533
        return paymentOptionIdPaymentOptionTransactionMap;
534
    }
28339 tejbeer 535
 
33437 ranu 536
    @RequestMapping(value = "/checkplans", method = RequestMethod.GET)
537
    public String getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
538
                                     @RequestParam int itemId, @RequestParam int poiId) throws ProfitMandiBusinessException {
539
        LOGGER.info("Request received at url : {}", request.getRequestURI());
28339 tejbeer 540
 
33437 ranu 541
        try {
542
            String response = mvcResponseSender.createResponseString(this.getPlans(price, itemId, poiId));
543
            model.addAttribute("response1", response);
544
        } catch (Exception e) {
545
            // TODO Auto-generated catch block
546
            LOGGER.info(e.getMessage(), e);
547
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
33213 tejus.loha 548
        }
33400 ranu 549
 
33437 ranu 550
        return "response";
33213 tejus.loha 551
    }
28339 tejbeer 552
 
34798 ranu 553
    @RequestMapping(value = "/getPlanQuote", method = RequestMethod.GET)
34788 ranu 554
    public String getPlanQuote(HttpServletRequest request, Model model,
35002 ranu 555
                               @RequestParam String planCode, @RequestParam int sumInsured, @RequestParam String manufacturedDate, @RequestParam int itemId, @RequestParam String planName) throws ProfitMandiBusinessException {
34788 ranu 556
 
557
        try {
34798 ranu 558
 
559
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
560
            LocalDate manufactured = LocalDate.parse(manufacturedDate, formatter);
561
 
34788 ranu 562
            PlanVariant planVariant = insuranceService.getICICIPremiumByVariantId(planCode);
563
 
35066 amit 564
            LOGGER.info("planVariant111 {}", planVariant);
34788 ranu 565
 
566
            String correlationId = UUID.randomUUID().toString();
567
            IciciPolicyTracker policyTracker = new IciciPolicyTracker();
568
            policyTracker.setCorrelationId(correlationId);
569
            iciciPolicyTrackerRepository.persist(policyTracker);
570
 
571
            // Policy validity (1 year from today)
572
            LocalDate today = LocalDate.now();
573
            LocalDate oneYearLater = today.plusYears(1);
574
 
575
            String itemBrand = itemRepository.selectById(itemId).getBrand();
576
 
577
            AfinityQuoteModel quoteModel = new AfinityQuoteModel();
35002 ranu 578
            quoteModel.setProductCode(iciciLombardService.PRODUCT_CODE_STAGGING);
579
            quoteModel.setPlanCode(String.valueOf(planVariant.getOurPlanId()));
580
            quoteModel.setPlanName(planName);
581
            quoteModel.setSumInsured((int) sumInsured);
34788 ranu 582
            quoteModel.setPolicyStartDate(today.toString());          // format: yyyy-MM-dd
583
            quoteModel.setPolicyEndDate(oneYearLater.toString());
35002 ranu 584
            quoteModel.setTaxEffectiveDate(today.toString());
585
            quoteModel.setPolicyType("New");
586
            quoteModel.setIlgicStateName(iciciLombardService.PARTY_STATE_NAME);
34805 ranu 587
            quoteModel.setPartyStateName(iciciLombardService.PARTY_STATE_NAME);
35002 ranu 588
            quoteModel.setUserLevel("UW3");
589
            quoteModel.setNoOfClaimsAllowed(999);
590
            quoteModel.setMakeAndModelOfGadget("High");
591
            quoteModel.setPremiumBeforeEndorsementCancellation(0);
592
            quoteModel.setGeographicalLimit("WithinIndia");
593
            quoteModel.setTransactionDate(today.toString());
594
            quoteModel.setEndorsementEffectiveDate(today.toString());
595
            quoteModel.setRegisteredCustomer(true);
34788 ranu 596
            quoteModel.setCorrelationId(correlationId);
597
 
35002 ranu 598
            // Set cover details
599
            AfinityQuoteModel.CoverDetail coverDetail = new AfinityQuoteModel.CoverDetail();
600
            coverDetail.setName("Accidental Damage");
601
            coverDetail.setPremium(0);
602
 
603
            // Set risk details
604
            AfinityQuoteModel.RiskDetail riskDetail = new AfinityQuoteModel.RiskDetail();
605
            riskDetail.setRiskSIComponent("MOBILE");
606
            riskDetail.setCoverDetails(Arrays.asList(coverDetail));
607
 
608
            quoteModel.setRisksDetails(Arrays.asList(riskDetail));
609
 
34805 ranu 610
            AfinityQuoteResponseModel afinityQuoteResponseModel = iciciLombardService.hitAfinityQuote(quoteModel);
611
            float planDp = insuranceService.getPlanDp(afinityQuoteResponseModel.getTotalPremium(), planVariant.getCoverage());
612
 
613
            Map<String, Object> responseMap = new HashMap<>();
614
            responseMap.put("afinityQuoteModel", afinityQuoteResponseModel);
615
            responseMap.put("planDp", planDp);
616
            model.addAttribute("response1", mvcResponseSender.createResponseString(responseMap));
34788 ranu 617
        } catch (Exception e) {
618
            // TODO Auto-generated catch block
619
            LOGGER.info(e.getMessage(), e);
620
            throw new ProfitMandiBusinessException("Plans", "Plans Quote", "Error qutotation insurance plans");
621
        }
622
 
623
        return "response";
34798 ranu 624
    }
34788 ranu 625
 
34204 tejus.loha 626
    private boolean sendWhatsappInvoice(FofoOrder fofoOrder) throws Exception {
627
        return this.sendWhatsappInvoice(fofoOrder, "");
34179 tejus.loha 628
    }
629
 
34204 tejus.loha 630
    private boolean sendWhatsappInvoice(FofoOrder fofoOrder, String whatsAppNo) throws Exception {
631
        boolean shouldSendWhatsappMessage = notificationService.shouldSendWhatsappMessage(whatsAppNo);
34474 aman.kumar 632
        boolean isSend = false;
34204 tejus.loha 633
        if (shouldSendWhatsappMessage) {
634
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
635
            String mobileNumber;
636
            if (!whatsAppNo.isEmpty()) {
34474 aman.kumar 637
                mobileNumber = whatsAppNo;
638
            } else {
639
                mobileNumber = customer.getMobileNumber();
640
            }
641
            CustomRetailer retailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
642
            String message = String.format("Dear %s,\n" +
643
                    "Thank you for your purchase from SmartDukaan store - %s, %s.\n" +
644
                    "Your purchase invoice is attached for your reference.\n" +
645
                    "\n" +
646
                    "Download our app for offers and updates on new products.\n" +
647
                    "https://www.smartdukaan.com/b2c\n" +
648
                    "\n" +
649
                    "Best Regards\n" +
650
                    "SmartDukaan", customer.getFirstName(), retailer.getBusinessName(), retailer.getAddress().getCity());
34204 tejus.loha 651
 
34474 aman.kumar 652
            isSend = notificationService.sendWhatsappMediaMessage(message, mobileNumber, this.getPublicInvoiceUrl(fofoOrder.getInvoiceNumber()),
33213 tejus.loha 653
                    this.getFileName(fofoOrder.getInvoiceNumber()), WhatsappMessageType.DOCUMENT);
654
        }
34204 tejus.loha 655
        return isSend;
33213 tejus.loha 656
    }
28339 tejbeer 657
 
33213 tejus.loha 658
    private String getFileName(String invoiceNumber) {
659
        return "INV-" + invoiceNumber.replace("/", "-") + ".pdf";
660
    }
31375 tejbeer 661
 
33213 tejus.loha 662
    private String getPublicInvoiceUrl(String invoiceNumber) {
663
        String base64Encoded = Base64.getMimeEncoder().encodeToString(invoiceNumber.getBytes(StandardCharsets.UTF_8));
664
        String publicUrl = "https://partners.smartdukaan.com/wa-invoice-send/" + base64Encoded + ".pdf";
665
        LOGGER.info("Public Whatsapp Url for Invoice Message - {}", publicUrl);
666
        return publicUrl;
667
    }
28339 tejbeer 668
 
33213 tejus.loha 669
    @RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
670
    public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest,
671
                                       Model model) throws ProfitMandiBusinessException {
672
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
673
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
674
        CustomerCreditNote custmoerCreditNote;
675
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
676
            FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
677
            FofoOrder fo = fofoOrderRepository.selectByOrderId(foi.getOrderId());
34168 tejus.loha 678
            custmoerCreditNote = orderService.badReturn(fofoDetails.getEmailId(), fo.getFofoId(), foiBadReturnRequest);
33213 tejus.loha 679
        } else {
680
            custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
681
        }
682
        return responseSender.ok(custmoerCreditNote.getId());
683
    }
28339 tejbeer 684
 
33213 tejus.loha 685
    @GetMapping(value = "/wa-invoice-send/{invoiceHash}")
686
    public ResponseEntity<?> generateInvoice(@PathVariable String invoiceHash) throws ProfitMandiBusinessException {
687
        String decodedInvoiceNumber = new String(Base64.getMimeDecoder().decode(invoiceHash));
688
        LOGGER.info("Invoice Hash {}", invoiceHash);
28339 tejbeer 689
 
23973 govind 690
 
33213 tejus.loha 691
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(decodedInvoiceNumber);
24844 amit.gupta 692
 
33213 tejus.loha 693
        InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
24844 amit.gupta 694
 
33213 tejus.loha 695
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
696
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
697
        final HttpHeaders headers = new HttpHeaders();
698
        //headers.setContentDispositionFormData("inline", number + ".pdf");
699
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + pdfModel.getInvoiceNumber() + ".pdf");
700
        int contentLength = byteArrayOutputStream.toByteArray().length;
701
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
702
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
703
        return ResponseEntity.ok()
704
                .headers(headers)
705
                .contentLength(contentLength)
706
                .contentType(MediaType.parseMediaType("application/pdf"))
707
                .body(inputStreamResource);
708
    }
23973 govind 709
 
33213 tejus.loha 710
    @RequestMapping(value = "/wa-listen", method = RequestMethod.POST)
711
    public ResponseEntity<?> listenWhatsappStatus(@RequestBody String whatsappJsonResponse) {
712
        LOGGER.info("whatsappJsonResponse {}", whatsappJsonResponse);
713
        //jaihind
714
        //  String jsonString = "[{\"srcAddr\":\"TESTSM\",\"channel\":\"WHATSAPP\",\"externalId\":\"4977024756456780043-180044363908187691\",\"cause\":\"SUCCESS\",\"errorCode\":\"000\",\"destAddr\":\"919813272029\",\"eventType\":\"DELIVERED\",\"eventTs\":1692848106000}]";
715
        JSONArray jsonArray = new JSONArray(whatsappJsonResponse);
716
        for (int i = 0; i < jsonArray.length(); i++) {
32711 amit.gupta 717
 
33213 tejus.loha 718
            JSONObject jsonObject = jsonArray.getJSONObject(i);
719
            String externalId = jsonObject.getString("externalId");
720
            String destAddr = jsonObject.getString("destAddr");
721
            String eventType = jsonObject.getString("eventType");
722
            whatsappMessageService.setWhatsappResponse(externalId, destAddr, eventType);
723
        }
724
        //jaihind
725
        return responseSender.ok("Success");
32711 amit.gupta 726
 
33213 tejus.loha 727
    }
32271 amit.gupta 728
 
33213 tejus.loha 729
    @RequestMapping(value = "/generateInvoice")
730
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
35081 ranu 731
                                             @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
732
        LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
733
                ProfitMandiConstants.ORDER_ID, orderId);
734
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
735
        InvoicePdfModel pdfModel = null;
736
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
737
            pdfModel = orderService.getInvoicePdfModel(orderId);
738
        } else {
739
            pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
740
        }
741
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
742
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
743
 
744
        // Step 1: Generate invoice PDF
745
        ByteArrayOutputStream invoiceOutput = new ByteArrayOutputStream();
746
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), invoiceOutput);
747
        byte[] invoicePdf = invoiceOutput.toByteArray();
748
 
749
        // Step 2: Load all policy certificate PDFs
750
        List<byte[]> pdfFiles = new ArrayList<>();
751
        pdfFiles.add(invoicePdf); // first add invoice
752
 
753
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
754
            if (insurancePolicy.getProviderId() == 6) {
755
                String policyNumber = insurancePolicy.getPolicyNumber();
756
                String safePolicyNo = policyNumber.replace("/", "-");
757
                String filePath = "/uploads/policy-certificate-" + safePolicyNo + ".pdf";
758
                File file = new File(filePath);
759
 
760
                if (file.exists()) {
761
                    try {
762
                        byte[] policyPdf = Files.readAllBytes(file.toPath());
763
                        pdfFiles.add(policyPdf);
764
                    } catch (IOException e) {
765
                        LOGGER.error("Failed to read policy PDF: {}", filePath, e);
766
                    }
767
                } else {
768
                    LOGGER.warn("Policy PDF not found: {}", filePath);
769
                }
770
            }
771
        }
772
 
773
        // Step 3: Merge all PDFs
774
        byte[] mergedPdf;
775
        try {
776
            mergedPdf = PdfUtils.mergePdfFiles(pdfFiles);
777
        } catch (Exception e) {
778
            LOGGER.error("Error merging PDFs", e);
779
            throw new ProfitMandiBusinessException("Failed to generate merged PDF", "", "");
780
        }
781
 
782
        // Step 4: Return merged PDF as response
783
        HttpHeaders headers = new HttpHeaders();
784
        headers.setContentType(MediaType.APPLICATION_PDF);
785
        headers.setContentDispositionFormData("inline", "invoice-with-policies-" + pdfModel.getInvoiceNumber() + ".pdf");
786
        headers.setContentLength(mergedPdf.length);
787
 
788
        InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(mergedPdf));
789
        return new ResponseEntity<>(resource, headers, HttpStatus.OK);
790
    }
791
 
792
   /* @RequestMapping(value = "/generateInvoice")
793
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
35066 amit 794
                                             @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, @RequestParam(required = false) PrinterType printerType) throws ProfitMandiBusinessException {
33213 tejus.loha 795
        LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
796
                ProfitMandiConstants.ORDER_ID, orderId);
797
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
798
        InvoicePdfModel pdfModel = null;
35066 amit 799
        int fofoId;
33213 tejus.loha 800
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
801
            pdfModel = orderService.getInvoicePdfModel(orderId);
35066 amit 802
            fofoId = pdfModel.getCustomer().getCustomerId();
33213 tejus.loha 803
        } else {
804
            pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
35066 amit 805
            fofoId = fofoDetails.getFofoId();
33213 tejus.loha 806
        }
35066 amit 807
 
808
        if (printerType == null) {
809
            FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
810
            //printerType = fs.getPrinterType();
811
        }
812
 
813
 
34805 ranu 814
        FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
815
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
816
 
817
        // Step 1: Generate invoice PDF
818
        ByteArrayOutputStream invoiceOutput = new ByteArrayOutputStream();
35066 amit 819
 
820
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), printerType, invoiceOutput);
34805 ranu 821
        byte[] invoicePdf = invoiceOutput.toByteArray();
822
 
823
        // Step 2: Load all policy certificate PDFs
824
        List<byte[]> pdfFiles = new ArrayList<>();
825
        pdfFiles.add(invoicePdf); // first add invoice
826
 
827
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
35076 ranu 828
            if (insurancePolicy.getProviderId() == 6) {
829
                String policyNumber = insurancePolicy.getPolicyNumber();
830
                String safePolicyNo = policyNumber.replace("/", "-");
831
                String filePath = "/uploads/policy-certificate-" + safePolicyNo + ".pdf";
832
                File file = new File(filePath);
34805 ranu 833
 
35076 ranu 834
                if (file.exists()) {
835
                    try {
836
                        byte[] policyPdf = Files.readAllBytes(file.toPath());
837
                        pdfFiles.add(policyPdf);
838
                    } catch (IOException e) {
839
                        LOGGER.error("Failed to read policy PDF: {}", filePath, e);
840
                    }
841
                } else {
842
                    LOGGER.warn("Policy PDF not found: {}", filePath);
34805 ranu 843
                }
844
            }
35076 ranu 845
 
34805 ranu 846
        }
847
 
848
        // Step 3: Merge all PDFs
849
        byte[] mergedPdf;
850
        try {
851
            mergedPdf = PdfUtils.mergePdfFiles(pdfFiles);
852
        } catch (Exception e) {
853
            LOGGER.error("Error merging PDFs", e);
854
            throw new ProfitMandiBusinessException("Failed to generate merged PDF", "", "");
855
        }
856
 
857
        // Step 4: Return merged PDF as response
858
        HttpHeaders headers = new HttpHeaders();
33213 tejus.loha 859
        headers.setContentType(MediaType.APPLICATION_PDF);
34805 ranu 860
        headers.setContentDispositionFormData("inline", "invoice-with-policies-" + pdfModel.getInvoiceNumber() + ".pdf");
861
        headers.setContentLength(mergedPdf.length);
862
 
863
        InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(mergedPdf));
864
        return new ResponseEntity<>(resource, headers, HttpStatus.OK);
35081 ranu 865
    }*/
24087 amit.gupta 866
 
33213 tejus.loha 867
    @RequestMapping(value = "/generateInvoices")
868
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
869
                                             @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, @RequestParam int partnerId)
870
            throws ProfitMandiBusinessException {
871
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
872
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
873
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
874
            List<Integer> orderIds = fofoOrderRepository.selectByFofoId(partnerId, startDate, endDate, 0, 0).stream()
875
                    .map(x -> x.getId()).collect(Collectors.toList());
876
            for (int orderId : orderIds) {
877
                pdfModels.add(orderService.getInvoicePdfModel(orderId));
878
            }
879
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
880
            PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
881
            LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
882
            final HttpHeaders headers = new HttpHeaders();
883
            headers.setContentType(MediaType.APPLICATION_PDF);
884
            headers.set("Content-disposition", "inline; filename=invoice-" + partnerId + ".pdf");
885
            headers.setContentLength(byteArrayOutputStream.toByteArray().length);
886
            final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
887
            final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
888
            return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
889
        } else {
890
            throw new ProfitMandiBusinessException("Auth", fofoDetails.getEmailId(), "Unauthorised access");
891
        }
892
    }
23973 govind 893
 
33213 tejus.loha 894
    @RequestMapping(value = "/saleHistory")
895
    public String saleHistory(HttpServletRequest request,
896
                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
897
                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
898
                              @RequestParam(required = false) LocalDateTime startTime,
899
                              @RequestParam(required = false) LocalDateTime endTime,
900
                              @RequestParam(name = "offset", defaultValue = "0") int offset,
901
                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
902
            throws ProfitMandiBusinessException {
903
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32405 jai.hind 904
 
33213 tejus.loha 905
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
906
                startTime, endTime, offset, limit);
907
        model.addAllAttributes(map);
908
        return "sale-history";
909
    }
32405 jai.hind 910
 
33213 tejus.loha 911
    @RequestMapping(value = "/downloadInvoices")
912
    public ResponseEntity<?> downloadInvoices(HttpServletRequest request,
913
                                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
914
                                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
915
                                              @RequestParam(required = false) LocalDateTime startTime,
916
                                              @RequestParam(required = false) LocalDateTime endTime,
917
                                              @RequestParam(name = "offset", defaultValue = "0") int offset,
918
                                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
919
            throws ProfitMandiBusinessException {
920
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32409 amit.gupta 921
 
33213 tejus.loha 922
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
923
                startTime, endTime, offset, 100);
924
        List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
23973 govind 925
 
33213 tejus.loha 926
        if (fofoOrders.size() == 0) {
927
            throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
928
        }
23654 amit.gupta 929
 
33213 tejus.loha 930
        final HttpHeaders headers = new HttpHeaders();
931
        headers.setContentType(MediaType.APPLICATION_PDF);
932
        headers.set("Content-disposition", "inline; filename=invoices.pdf");
933
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
934
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
935
        for (FofoOrder fofoOrder : fofoOrders) {
936
            try {
937
                pdfModels.add(orderService.getInvoicePdfModel(fofoOrder.getId()));
938
            } catch (Exception e) {
939
                LOGGER.info("could not create invoice for {}, invoice number {}", fofoOrder.getId(),
940
                        fofoOrder.getInvoiceNumber());
941
            }
942
        }
943
        PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
944
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
945
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
946
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
947
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
948
    }
23654 amit.gupta 949
 
33213 tejus.loha 950
    @RequestMapping(value = "/credit-note/{creditNoteId}")
951
    public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId)
952
            throws ProfitMandiBusinessException {
953
        CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
954
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
955
        PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
956
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
957
        final HttpHeaders headers = new HttpHeaders();
958
        headers.setContentType(MediaType.APPLICATION_PDF);
959
        headers.set("Content-disposition",
960
                "inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
961
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
962
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
963
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
964
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
965
    }
23973 govind 966
 
33213 tejus.loha 967
    @RequestMapping(value = "/getPaginatedSaleHistory")
968
    public String getSaleHistoryPaginated(HttpServletRequest request,
969
                                          @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
970
                                          @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
971
                                          @RequestParam(required = false) LocalDateTime startTime,
972
                                          @RequestParam(required = false) LocalDateTime endTime,
973
                                          @RequestParam(name = "offset", defaultValue = "0") int offset,
974
                                          @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
975
            throws ProfitMandiBusinessException {
976
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
977
        Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType,
978
                searchValue, startTime, endTime, offset, limit);
979
        model.addAllAttributes(map);
980
        return "sale-history-paginated";
981
    }
23973 govind 982
 
33213 tejus.loha 983
    @PutMapping(value = "/updatePaymentTransaction")
984
    public String updateTransactionDetails(HttpServletRequest request, @RequestParam String referenceType,
985
                                           @RequestParam int fofoId, @RequestParam int referenceId,
986
                                           @RequestBody PartnerOptionsAndItemAmountModel partnerOptionsAndItemAmountModel,
987
                                           @RequestParam float totalAmount, Model model) throws Exception {
29707 tejbeer 988
 
33213 tejus.loha 989
        List<PaymentOptionTransactionModel> paymentOptionTransactionModels = partnerOptionsAndItemAmountModel
990
                .getPaymentOptionTransactionModel();
991
        LOGGER.info(paymentOptionTransactionModels);
992
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, referenceId);
35737 amit 993
        LOGGER.info("fofoOrder: {}", fofoOrder);
33213 tejus.loha 994
        fofoOrder.setTotalAmount(totalAmount);
995
        List<FofoItemIdAmountModel> fofoItemIdAmountModel = partnerOptionsAndItemAmountModel.getItemAmountModel();
35737 amit 996
 
997
        Set<Integer> fimItemIds = fofoItemIdAmountModel.stream().map(FofoItemIdAmountModel::getItemId).collect(Collectors.toSet());
998
        Map<Integer, Item> fimItemMap = itemRepository.selectByIds(fimItemIds).stream()
999
                .collect(Collectors.toMap(Item::getId, item -> item));
1000
        Map<Integer, TagListing> fimTagMap = tagListingRepository.selectByItemIds(fimItemIds);
1001
        List<Integer> fimFofoItemIds = fofoItemIdAmountModel.stream().map(FofoItemIdAmountModel::getFofoItemId).collect(Collectors.toList());
1002
        Map<Integer, FofoOrderItem> fimFofoItemMap = fofoOrderItemRepository.selectByIds(fimFofoItemIds).stream()
1003
                .collect(Collectors.toMap(FofoOrderItem::getId, foi -> foi));
1004
 
33213 tejus.loha 1005
        for (FofoItemIdAmountModel fim : fofoItemIdAmountModel) {
35737 amit 1006
            LOGGER.info("fim: {}", fim.getFofoItemId());
1007
            LOGGER.info("fimAmount: {}", fim.getAmount());
1008
            Item item = fimItemMap.get(fim.getItemId());
1009
            TagListing tagListing = fimTagMap.get(item.getId());
1010
            FofoOrderItem fofoOrderItem = fimFofoItemMap.get(fim.getFofoItemId());
1011
            LOGGER.info("category: {}", item.getCategoryId());
33213 tejus.loha 1012
            if (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID) {
1013
                if (fofoOrderItem.getMop() <= fim.getAmount()) {
23973 govind 1014
 
33213 tejus.loha 1015
                    if (fim.getAmount() <= tagListing.getMrp()) {
1016
                        fofoOrderItem.setSellingPrice(fim.getAmount());
1017
                    } else {
1018
                        throw new ProfitMandiBusinessException("Amount", fim.getAmount(),
1019
                                "Sum of amount is not less than  to MRP");
1020
                    }
23973 govind 1021
 
35737 amit 1022
                    LOGGER.info("fofoOrderItem2: {}", fofoOrderItem);
23973 govind 1023
 
33213 tejus.loha 1024
                } else {
1025
                    // TODO below mop condition need to added added
1026
                    fofoOrderItem.setSellingPrice(fim.getAmount());
1027
                }
23973 govind 1028
 
33213 tejus.loha 1029
            } else {
1030
                fofoOrderItem.setSellingPrice(fim.getAmount());
35737 amit 1031
                LOGGER.info("fofoOrderItem1: {}", fofoOrderItem);
27819 tejbeer 1032
 
33213 tejus.loha 1033
            }
35737 amit 1034
            LOGGER.info("fofoOrderItem: {}", fofoOrderItem);
23973 govind 1035
 
33213 tejus.loha 1036
        }
23973 govind 1037
 
33213 tejus.loha 1038
        /*
1039
         * for (PaymentOptionTransactionModel paymentOptionTransactionModel :
1040
         * paymentOptionTransactionModels) { amount = amount +
1041
         * paymentOptionTransactionModel.getAmount(); } LOGGER.info("FofoOrder amount" +
1042
         * fofoOrder.getUnitPrice() + "amount" + amount); if (amount ==
1043
         * fofoOrder.getUnitPrice()) {
1044
         */
1045
        if (paymentOptionTransactionModels.size() > 0) {
1046
            List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
1047
                    .selectByReferenceIdAndType(referenceId, PaymentOptionReferenceType.ORDER);
1048
            Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
1049
                    .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
35737 amit 1050
            LOGGER.info("paymentOptionIdPaymentOptionTransactionMap: {}", paymentOptionIdPaymentOptionTransactionMap.keySet());
33213 tejus.loha 1051
            for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
1052
                if (paymentOptionIdPaymentOptionTransactionMap
1053
                        .containsKey(paymentOptionTransactionModel.getPaymentOptionId())) {
23973 govind 1054
 
33213 tejus.loha 1055
                    PaymentOptionTransaction paymentOptionTransaction = paymentOptionIdPaymentOptionTransactionMap
1056
                            .get(paymentOptionTransactionModel.getPaymentOptionId());
31739 amit.gupta 1057
 
33213 tejus.loha 1058
                    if (paymentOptionTransactionModel.getAmount() == 0) {
1059
                        paymentOptionTransactionRepository.delete(paymentOptionTransaction);
1060
                        LOGGER.info("deleted successfully");
1061
                    } else {
24844 amit.gupta 1062
 
33213 tejus.loha 1063
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
1064
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
1065
                        LOGGER.info("updated successfully");
24281 amit.gupta 1066
 
33213 tejus.loha 1067
                    }
1068
                } else {
1069
                    if (paymentOptionTransactionModel.getAmount() > 0) {
1070
                        PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
1071
                        paymentOptionTransaction.setReferenceId(referenceId);
1072
                        paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
1073
                        paymentOptionTransaction.setPaymentOptionId(paymentOptionTransactionModel.getPaymentOptionId());
1074
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
1075
                        paymentOptionTransaction.setFofoId(fofoId);
1076
                        paymentOptionTransaction.setCreateTimestamp(fofoOrder.getCreateTimestamp());
1077
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
1078
                        LOGGER.info("inserted successfully");
1079
                    }
1080
                }
24281 amit.gupta 1081
 
33213 tejus.loha 1082
            }
24281 amit.gupta 1083
 
33213 tejus.loha 1084
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1085
        }
1086
        /*
1087
         * else
1088
         *
1089
         * { throw new ProfitMandiBusinessException("Amount", amount,
1090
         * "Sum of amount is not equal to total amount"); }
1091
         */
23973 govind 1092
 
33213 tejus.loha 1093
        return "response";
23973 govind 1094
 
33213 tejus.loha 1095
    }
24105 govind 1096
 
33437 ranu 1097
    @RequestMapping(value = "/order")
1098
    public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model)
33213 tejus.loha 1099
            throws ProfitMandiBusinessException {
33437 ranu 1100
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1101
 
1102
        int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
1103
        Address address = addressRepository.selectById(addressId);
1104
 
1105
        List<CartFofo> cartItems = orderService.cartCheckout(cartData);
1106
        Set<Integer> itemIds = new HashSet<>();
1107
        List<Integer> poIds = new ArrayList<>();
1108
        List<Integer> poItemIds = new ArrayList<>();
1109
        for (CartFofo cartFofo : cartItems) {
1110
            itemIds.add(cartFofo.getItemId());
1111
            if (cartFofo.getPoId() != 0) {
1112
                poIds.add(cartFofo.getPoId());
1113
                poItemIds.add(cartFofo.getPoItemId());
1114
            }
1115
        }
1116
 
1117
        PendingOrder po = null;
1118
        Customer customer = null;
1119
        PendingOrderItem poi = null;
1120
        Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds,
1121
                loginDetails.getFofoId());
1122
        List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
1123
                .selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
1124
 
1125
        if (!poIds.isEmpty()) {
1126
            po = pendingOrderRepository.selectById(poIds.get(0));
1127
            customer = customerRepository.selectById(po.getCustomerId());
1128
            if (!offlineOrders.contains(po.getPayMethod())) {
1129
                paymentOptionIds.add(23);
1130
            }
1131
        }
1132
 
1133
        if (!poItemIds.isEmpty()) {
1134
            poi = pendingOrderItemRepository.selectById(poItemIds.get(0));
1135
        }
1136
 
1137
        // List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new
1138
        // HashSet<>(paymentOptionIds));
1139
 
1140
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectActiveOption();
1141
 
35737 amit 1142
        LOGGER.info("pendingOrder: {}", po);
1143
        LOGGER.info("pendingOrderItem: {}", poi);
33437 ranu 1144
 
1145
        int onlineSellingPrice = 0;
1146
        Map<Integer, PendingOrderItem> itemIdAndPoiMap = new HashMap<>();
1147
 
1148
        if (po != null) {
1149
            List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(po.getId());
35737 amit 1150
            Map<Integer, PendingOrderItem> poiByIdMap = pendingOrderItems.stream()
1151
                    .collect(Collectors.toMap(PendingOrderItem::getId, x -> x));
33437 ranu 1152
            if (!(po.getPayMethod().equals("EMIOD") || po.getPayMethod().equals("POD"))) {
1153
                for (CartFofo cartItem : cartItems) {
35737 amit 1154
                    PendingOrderItem pendingOItem = poiByIdMap.get(cartItem.getPoItemId());
33437 ranu 1155
                    PendingOrderPlan pendingOrderPlan = pendingOrderPlanRepository.selectByPoid(cartItem.getPoItemId());
1156
                    if (pendingOrderPlan != null) {
1157
                        onlineSellingPrice += pendingOItem.getSellingPrice() * pendingOItem.getQuantity() + pendingOrderPlan.getPremiumPrice() * pendingOItem.getQuantity();
1158
                    } else {
1159
                        onlineSellingPrice += pendingOItem.getSellingPrice() * pendingOItem.getQuantity();
1160
                    }
1161
                }
1162
            }
1163
 
35737 amit 1164
            itemIdAndPoiMap = pendingOrderItems.stream().collect(Collectors.toMap(PendingOrderItem::getItemId, x -> x));
33437 ranu 1165
        }
1166
 
33795 ranu 1167
 
1168
//        get the list of customer item for every item code start here
1169
//        ...............................................................
1170
 
1171
        LocalDateTime todayDate = LocalDateTime.now();
1172
        LocalDate todayDate2 = LocalDate.now();
1173
 
1174
        Map<Integer, List<CustomerOfferItem>> offerItemMap = new HashMap<>();
1175
        Map<Integer, List<WebOffer>> webOfferMap = new HashMap<>();
1176
 
1177
        List<CustomerOffer> customerOffers = customerOfferRepository.selectOffersByDate(todayDate);
1178
        List<Integer> customerOfferIds = customerOffers.stream().map(x -> x.getId()).distinct().collect(Collectors.toList());
34788 ranu 1179
        /*for (CartFofo cartItem : cartItems) {
33795 ranu 1180
            Item item = itemRepository.selectById(cartItem.getItemId());
33907 amit.gupta 1181
            if (customerOfferIds.size() > 0) {
33795 ranu 1182
 
33907 amit.gupta 1183
                List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferIds(customerOfferIds, item.getCatalogItemId(), todayDate2);
33795 ranu 1184
 
33907 amit.gupta 1185
                List<CustomerOfferItem> filteredCustomerOfferItems = customerOfferItems.stream()
1186
                        .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate2))
1187
                        .collect(Collectors.toList());
33795 ranu 1188
 
33907 amit.gupta 1189
                offerItemMap.put(item.getId(), filteredCustomerOfferItems);
1190
            }
33818 ranu 1191
 
33907 amit.gupta 1192
 
33795 ranu 1193
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(item.getCatalogItemId());
1194
            webOfferMap.put(item.getId(), webOffers);
34788 ranu 1195
        }*/
1196
 
1197
 
1198
        Map<Integer, ItemWiseCustomerOfferSummaryModel> offerItemSummaryMap = new HashMap<>();
35737 amit 1199
        Map<Integer, Item> cartItemMap = itemRepository.selectByIds(itemIds).stream()
1200
                .collect(Collectors.toMap(Item::getId, item -> item));
34788 ranu 1201
 
1202
        for (CartFofo cartItem : cartItems) {
35737 amit 1203
            Item item = cartItemMap.get(cartItem.getItemId());
34838 amit 1204
            List<CustomerOfferItem> customerOfferItems = null;
1205
            if (customerOfferIds.size() > 0) {
1206
                customerOfferItems = customerOfferItemRepository
1207
                        .selectByOfferIds(customerOfferIds, item.getCatalogItemId(), todayDate2)
1208
                        .stream()
1209
                        .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate2))
1210
                        .collect(Collectors.toList());
1211
            }
34788 ranu 1212
 
1213
 
1214
            ItemWiseCustomerOfferSummaryModel summary = new ItemWiseCustomerOfferSummaryModel();
1215
            summary.setItemId(item.getId());
1216
            summary.setCatalogId(item.getCatalogItemId());
1217
 
34838 amit 1218
            if (customerOfferItems != null) {
1219
                for (CustomerOfferItem coi : customerOfferItems) {
1220
                    String key = coi.getOfferType().name() + "-" + coi.getCustomerOfferId();
34788 ranu 1221
 
34838 amit 1222
                    ItemWiseCustomerOfferSummaryModel.OfferTypeSummary typeSummary =
1223
                            summary.getOfferTypeMap().computeIfAbsent(key, k -> {
1224
                                ItemWiseCustomerOfferSummaryModel.OfferTypeSummary ts = new ItemWiseCustomerOfferSummaryModel.OfferTypeSummary();
1225
                                ts.setOfferType(coi.getOfferType());
1226
                                ts.setCustomerOfferId(coi.getCustomerOfferId());
1227
                                return ts;
1228
                            });
34788 ranu 1229
 
34838 amit 1230
                    typeSummary.setTotalSchemePayout(typeSummary.getTotalSchemePayout() + coi.getSchemePayout());
1231
                    typeSummary.setTotalDealerPayout(typeSummary.getTotalDealerPayout() + coi.getDealerPayout());
1232
                    typeSummary.getDescriptions().add(coi.getAdditionalInfo());
1233
                    typeSummary.getOfferItemIds().add(coi.getId());
1234
                }
34788 ranu 1235
            }
1236
 
1237
            offerItemSummaryMap.put(item.getId(), summary);
33795 ranu 1238
        }
1239
 
34788 ranu 1240
 
33795 ranu 1241
//        get the list of customer item for every item code end here
1242
//        ...............................................................
1243
 
33437 ranu 1244
        LOGGER.info("itemIdAndPoiMap {}", itemIdAndPoiMap);
1245
        LOGGER.info("mopPriceMap {}", mopPriceMap);
1246
        model.addAttribute("stateNames",
1247
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
1248
        model.addAttribute("retailerStateName", address.getState());
1249
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1250
        model.addAttribute("pendingPO", gson.toJson(po));
1251
 
1252
        model.addAttribute("cartItems", cartItems);
1253
        model.addAttribute("pendingOrder", po);
1254
        model.addAttribute("pendingOrderItem", poi);
1255
        model.addAttribute("itemIdAndPoiMap", itemIdAndPoiMap);
1256
        model.addAttribute("onlineSellingPrice", onlineSellingPrice);
1257
 
1258
        model.addAttribute("mopPriceMap", mopPriceMap);
1259
        model.addAttribute("paymentOptions", paymentOptions);
1260
        model.addAttribute("accessoriesDeals", accessoriesDeals);
33795 ranu 1261
        model.addAttribute("webOfferMap", webOfferMap);
34788 ranu 1262
        model.addAttribute("offerItemSummaryMap", offerItemSummaryMap);
35726 vikas 1263
 
1264
        // Fetch pinelabs offers from cache and group by issuer display name
1265
        Map<Integer, Map<String, List<Tenure>>> pinelabsOfferMap =
1266
                pinelabsOfferCacheService.getGroupedCachedOffersForItems(new ArrayList<>(itemIds));
1267
        model.addAttribute("pinelabsOfferMap", pinelabsOfferMap);
1268
 
33437 ranu 1269
        return "order-index";
1270
    }
1271
 
1272
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId, int poiId)
1273
            throws ProfitMandiBusinessException {
33213 tejus.loha 1274
        try {
33437 ranu 1275
            Map<String, List<MobileInsurancePlan>> productDurationPlans = new HashMap<>();
1276
            PendingOrderPlan pendingOrderPlan = null;
1277
            if (poiId > 0) {
1278
                pendingOrderPlan = pendingOrderPlanRepository.selectByPoid(poiId);
1279
            }
1280
            if (pendingOrderPlan != null) {
33715 ranu 1281
                MobileInsurancePlan productDurationPlan = insuranceService.getPlanById(String.valueOf(pendingOrderPlan.getPlanId()), sellingPrice);
33437 ranu 1282
                productDurationPlans.put(pendingOrderPlan.getPlanName(), Collections.singletonList(productDurationPlan));
1283
 
1284
            } else {
1285
                productDurationPlans = insuranceService.getAllPlans(itemId,
1286
                        sellingPrice, false);
1287
            }
1288
 
33213 tejus.loha 1289
            return productDurationPlans;
1290
        } catch (Exception e) {
1291
            LOGGER.info(e, e);
1292
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance",
1293
                    "Could not fetch insurance Plans");
1294
        }
24105 govind 1295
 
33213 tejus.loha 1296
    }
23973 govind 1297
 
33795 ranu 1298
 
1299
    @GetMapping("/getItemWiseUpgradeOffer")
1300
    public String getItemWiseUpgradeOffer(HttpServletRequest request, @RequestParam int itemId, Model model)
1301
            throws ProfitMandiBusinessException {
1302
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1303
 
1304
        Item item = itemRepository.selectById(itemId);
1305
 
1306
        LocalDateTime todayDate = LocalDateTime.now();
1307
        LocalDate todayDate2 = LocalDate.now();
1308
 
1309
        List<CustomerOffer> customerOffers = customerOfferRepository.selectOffersByDate(todayDate);
1310
        Map<Integer, CustomerOffer> customerOfferMap = customerOffers.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1311
        List<Integer> customerOfferIds = customerOffers.stream().map(x -> x.getId()).distinct().collect(Collectors.toList());
1312
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferIds(customerOfferIds, item.getCatalogItemId(), todayDate2);
1313
 
33818 ranu 1314
        List<CustomerOfferItem> filteredCustomerOfferItems = customerOfferItems.stream()
33822 ranu 1315
                .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate2))
33818 ranu 1316
                .collect(Collectors.toList());
1317
 
33795 ranu 1318
        List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(item.getCatalogItemId());
1319
 
1320
        model.addAttribute("webOffers", webOffers);
1321
        model.addAttribute("customerOfferMap", customerOfferMap);
33818 ranu 1322
        model.addAttribute("customerOfferItems", filteredCustomerOfferItems);
33795 ranu 1323
 
1324
        return "upgrade-customer-offer-model";
1325
    }
1326
 
33213 tejus.loha 1327
    @GetMapping("/insuranceDetails")
1328
    public String getInsuranceDetails(HttpServletRequest request,
1329
                                      @RequestParam(name = "offset", defaultValue = "0") int offset,
1330
                                      @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1331
            throws ProfitMandiBusinessException {
1332
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1333
        long size = 0;
1334
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
1335
                offset, limit);
1336
        size = insurancePolicyRepository.selectCountByRetailerId(loginDetails.getFofoId());
1337
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
1338
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
1339
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
1340
        if (size < limit) {
1341
            model.addAttribute("end", offset + size);
1342
        } else {
1343
            model.addAttribute("end", offset + limit);
1344
        }
1345
        model.addAttribute("start", offset + 1);
1346
        model.addAttribute("size", size);
1347
        model.addAttribute("insurancePolicies", insurancePolicies);
1348
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
1349
        return "insurance-details";
1350
    }
28339 tejbeer 1351
 
33213 tejus.loha 1352
    @GetMapping("/insuranceDetailsPaginated")
1353
    public String getInsuranceDetailsPaginated(HttpServletRequest request,
1354
                                               @RequestParam(name = "offset", defaultValue = "0") int offset,
1355
                                               @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1356
            throws ProfitMandiBusinessException {
1357
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1358
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
1359
                offset, limit);
1360
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
1361
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
1362
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
1363
        model.addAttribute("insurancePolicies", insurancePolicies);
1364
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
1365
        return "insurance-details-paginated";
1366
    }
23973 govind 1367
 
33213 tejus.loha 1368
    @GetMapping("/getMouForm")
1369
    public String getMouForm(HttpServletRequest request, Model model) throws Exception {
1370
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 1371
 
33213 tejus.loha 1372
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
1373
        if (mou != null) {
1374
            if (mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
1375
                model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1376
            } else {
1377
                model.addAttribute("response1", mvcResponseSender.createResponseString(false));
1378
            }
32238 amit.gupta 1379
 
33213 tejus.loha 1380
        } else {
1381
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
32238 amit.gupta 1382
 
33213 tejus.loha 1383
        }
1384
        return "response";
32238 amit.gupta 1385
 
33213 tejus.loha 1386
    }
23973 govind 1387
 
33213 tejus.loha 1388
    @GetMapping("/pendingOrders")
1389
    public String getPendingOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1390
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1391
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1392
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
1393
        if (mou == null) {
1394
            mou = new Mou();
1395
            mou.setFofoId(loginDetails.getFofoId());
1396
            mou.setCreateTimestamp(LocalDateTime.now());
1397
            mou.setUpdateTimestamp(LocalDateTime.now());
1398
            mouRepository.persist(mou);
1399
        } else if (!mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
1400
            mou.setUpdateTimestamp(LocalDateTime.now());
1401
        }
24844 amit.gupta 1402
 
33213 tejus.loha 1403
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.PROCESSING,
1404
                loginDetails.getFofoId());
23973 govind 1405
 
34387 vikas.jang 1406
        Map<String, List<PendingOrderPlan>> pendingOrderPlansMap = pendingOrderPlanRepository.selectAll().stream()
1407
                .collect(Collectors.groupingBy(PendingOrderPlan::getPlanId));
33213 tejus.loha 1408
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, loginDetails.getFofoId());
1409
        model.addAttribute("inventoryMap", map.get("inventoryMap"));
33437 ranu 1410
        model.addAttribute("pendingOrderPlansMap", pendingOrderPlansMap);
33213 tejus.loha 1411
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
23973 govind 1412
 
33213 tejus.loha 1413
        model.addAttribute("isAdmin", isAdmin);
1414
        return "pending_fofo_order";
25092 amit.gupta 1415
 
33213 tejus.loha 1416
    }
25092 amit.gupta 1417
 
33400 ranu 1418
    @RequestMapping(value = "/create-order", method = RequestMethod.POST)
1419
    public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest,
34194 ranu 1420
                              Model model) throws Exception {
33400 ranu 1421
        // throw new ProfitMandiBusinessException("Billing is on hold temporarily",
1422
        // "Billing is on hold temporarily", "Billing is on hold temporarily");
1423
        LOGGER.info("request at uri {}", request.getRequestURI());
1424
        LOGGER.info("request body {}", createOrderRequest);
1425
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1426
        int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId(), accessoriesDeals);
35084 aman 1427
        try {
35064 aman 1428
            Set<Integer> fofoOrderItemIds = createOrderRequest.getFofoOrderItems()
1429
                    .stream().map(CustomFofoOrderItem::getItemId).collect(Collectors.toSet());
1430
            scratchService.processScratchOffer(fofoOrderId, createOrderRequest.getPaymentOptions(), fofoOrderItemIds);
1431
        } catch (Exception e) {
35095 aman 1432
            LOGGER.error("Exception during processScratchOffer for order {}: {}", fofoOrderId, e.getMessage(), e);
35084 aman 1433
        }
34479 tejus.loha 1434
 
34179 tejus.loha 1435
        LOGGER.info("Order has been created successfully...");
33400 ranu 1436
        return "redirect:/get-order/?orderId=" + fofoOrderId;
1437
    }
1438
 
33213 tejus.loha 1439
    @GetMapping("/billedOrders")
1440
    public String getBilledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1441
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1442
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
25092 amit.gupta 1443
 
33400 ranu 1444
        List<PendingOrderItem> pendingOrderItems;
23973 govind 1445
 
33213 tejus.loha 1446
        if (isAdmin) {
27861 tejbeer 1447
 
33400 ranu 1448
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.BILLED);
27861 tejbeer 1449
 
33213 tejus.loha 1450
        } else {
33400 ranu 1451
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.BILLED,
33213 tejus.loha 1452
                    loginDetails.getFofoId());
33400 ranu 1453
 
1454
 
33213 tejus.loha 1455
        }
27861 tejbeer 1456
 
33400 ranu 1457
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, loginDetails.getFofoId());
1458
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
27861 tejbeer 1459
 
33213 tejus.loha 1460
        model.addAttribute("isAdmin", isAdmin);
1461
        return "billed_order_item";
1462
    }
27861 tejbeer 1463
 
33213 tejus.loha 1464
    @GetMapping("/settledOrders")
1465
    public String getSettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1466
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1467
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27861 tejbeer 1468
 
33213 tejus.loha 1469
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1470
 
33213 tejus.loha 1471
        if (isAdmin) {
24105 govind 1472
 
33213 tejus.loha 1473
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.SETTLED);
24105 govind 1474
 
33213 tejus.loha 1475
        } else {
1476
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.SETTLED,
1477
                    loginDetails.getFofoId());
1478
        }
24105 govind 1479
 
33213 tejus.loha 1480
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
24105 govind 1481
 
33400 ranu 1482
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
33213 tejus.loha 1483
        model.addAttribute("isAdmin", isAdmin);
1484
        return "settled_order_item";
1485
    }
27861 tejbeer 1486
 
33213 tejus.loha 1487
    @GetMapping("/unsettledOrders")
1488
    public String getunsettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1489
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1490
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
24105 govind 1491
 
33213 tejus.loha 1492
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1493
 
33213 tejus.loha 1494
        if (isAdmin) {
24105 govind 1495
 
33213 tejus.loha 1496
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.UNSETTLED);
27861 tejbeer 1497
 
33213 tejus.loha 1498
        } else {
1499
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.UNSETTLED,
1500
                    loginDetails.getFofoId());
1501
        }
24440 amit.gupta 1502
 
33213 tejus.loha 1503
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
25726 amit.gupta 1504
 
33400 ranu 1505
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
33213 tejus.loha 1506
        model.addAttribute("isAdmin", isAdmin);
1507
        return "unsettled_order_item";
1508
    }
24880 govind 1509
 
33213 tejus.loha 1510
    @GetMapping("/getPendingOrderItem")
1511
    public String getPendingOrderItem(HttpServletRequest request, @RequestParam int orderId, Model model)
1512
            throws ProfitMandiBusinessException {
1513
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1514
        Map<Integer, Item> itemMap = new HashMap<>();
1515
        Map<Integer, CurrentInventorySnapshot> inventoryMap = new HashMap<>();
1516
        PendingOrder pendingPO = pendingOrderRepository.selectById(orderId);
1517
        Customer customer = customerRepository.selectById(pendingPO.getCustomerId());
1518
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(orderId);
35737 amit 1519
        Set<Integer> poItemIds = pendingOrderItems.stream().map(PendingOrderItem::getItemId).collect(Collectors.toSet());
1520
        itemMap = itemRepository.selectByIds(poItemIds).stream()
1521
                .collect(Collectors.toMap(Item::getId, item -> item));
1522
        List<CurrentInventorySnapshot> snapshots = currentInventorySnapshotRepository
1523
                .selectByFofoItemIds(pendingPO.getFofoId(), poItemIds);
1524
        for (CurrentInventorySnapshot cis : snapshots) {
1525
            LOGGER.info("cis: {}", cis);
1526
            inventoryMap.put(cis.getItemId(), cis);
33213 tejus.loha 1527
        }
28339 tejbeer 1528
 
35737 amit 1529
        LOGGER.info("inventoryMap: {}", inventoryMap);
33213 tejus.loha 1530
        model.addAttribute("pendingOrderItems", pendingOrderItems);
1531
        model.addAttribute("itemMap", itemMap);
1532
        model.addAttribute("inventoryMap", inventoryMap);
1533
        model.addAttribute("pendingPO", gson.toJson(pendingPO));
1534
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1535
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1536
        return "pending-order-item";
1537
    }
28339 tejbeer 1538
 
33213 tejus.loha 1539
    @RequestMapping(value = "/getPendingOrderItemById", method = RequestMethod.GET)
1540
    public String getPendingOrderItemById(HttpServletRequest request, @RequestParam int id, Model model)
1541
            throws Exception {
27046 tejbeer 1542
 
33213 tejus.loha 1543
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1544
        model.addAttribute("pendingOrderItem", pendingOrderItem);
1545
        return "cancel-pending-order";
1546
    }
27046 tejbeer 1547
 
33213 tejus.loha 1548
    @RequestMapping(value = "/getPendingOrderChangePartnerById", method = RequestMethod.GET)
33367 ranu 1549
    public String getPendingOrderChangePartnerById(HttpServletRequest request, @RequestParam int id, @RequestParam String pinCode, Model model)
33213 tejus.loha 1550
            throws Exception {
28350 tejbeer 1551
 
33213 tejus.loha 1552
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
33374 ranu 1553
        Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(true);
33213 tejus.loha 1554
        model.addAttribute("customRetailersMap", customRetailersMap);
1555
        model.addAttribute("pendingOrder", pendingOrder);
1556
        return "change-partner-po";
1557
    }
28358 tejbeer 1558
 
33213 tejus.loha 1559
    @RequestMapping(value = "/changePendingOrderPartner", method = RequestMethod.POST)
1560
    public String changePendingOrderPartner(HttpServletRequest request, @RequestParam int id, @RequestParam int fofoId,
1561
                                            Model model) throws Exception {
28350 tejbeer 1562
 
33213 tejus.loha 1563
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1564
        pendingOrder.setFofoId(fofoId);
1565
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1566
 
33213 tejus.loha 1567
        return "response";
1568
    }
28339 tejbeer 1569
 
33213 tejus.loha 1570
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
1571
    public String cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String reason,
1572
                                         Model model) throws Exception {
28339 tejbeer 1573
 
33213 tejus.loha 1574
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1575
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
28339 tejbeer 1576
 
33213 tejus.loha 1577
        pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1578
        pendingOrderItem.setStatusDescription(loginDetails.getEmailId());
1579
        pendingOrderItem.setRemark(reason);
1580
        pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1581
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
27046 tejbeer 1582
 
33213 tejus.loha 1583
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1584
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1585
 
33213 tejus.loha 1586
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
26647 tejbeer 1587
 
33213 tejus.loha 1588
        List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1589
 
33213 tejus.loha 1590
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1591
        pendingOrderItem.setItemName(item.getItemDescription());
1592
        catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1593
 
33213 tejus.loha 1594
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1595
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1596
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1597
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1598
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28339 tejbeer 1599
 
33213 tejus.loha 1600
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1601
 
33213 tejus.loha 1602
        Map<String, Object> emailModel = new HashMap<>();
1603
        emailModel.put("customer", customerAddress);
1604
        emailModel.put("pendingOrder", pendingOrder);
1605
        emailModel.put("date", dateTimeFormatter);
35737 amit 1606
        LOGGER.info("email: {}", customer.getEmailId());
33213 tejus.loha 1607
        String[] customerEmail = null;
1608
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1609
            customerEmail = new String[]{customer.getEmailId()};
28339 tejbeer 1610
 
34211 vikas.jang 1611
            List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
28339 tejbeer 1612
 
33213 tejus.loha 1613
            emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel,
1614
                    customerEmail, null, bccTo.toArray(new String[0]));
28339 tejbeer 1615
 
33213 tejus.loha 1616
        }
28339 tejbeer 1617
 
33213 tejus.loha 1618
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1619
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1620
                && !status.contains(OrderStatus.CLAIMED)) {
1621
            pendingOrder.setStatus(OrderStatus.CLOSED);
1622
        }
1623
        pendingOrderItemRepository.persist(pendingOrderItem);
28339 tejbeer 1624
 
33213 tejus.loha 1625
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1626
 
33213 tejus.loha 1627
        return "response";
1628
    }
28339 tejbeer 1629
 
33400 ranu 1630
    @GetMapping("/claimedOrders")
1631
    public String getclaimedOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
33213 tejus.loha 1632
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
33400 ranu 1633
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1634
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1635
                .collect(Collectors.toList());
28339 tejbeer 1636
 
33400 ranu 1637
        List<PendingOrderItem> pendingOrderItem = null;
28339 tejbeer 1638
 
33400 ranu 1639
        if (isAdmin) {
28339 tejbeer 1640
 
33400 ranu 1641
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.CLAIMED);
1642
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28339 tejbeer 1643
 
33400 ranu 1644
            Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1645
                    .filter(x -> x != null).collect(Collectors.toList()).stream()
1646
                    .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1647
            model.addAttribute("customRetailersMap", customRetailersMap);
28339 tejbeer 1648
 
33400 ranu 1649
        } else {
1650
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.CLAIMED,
1651
                    loginDetails.getFofoId());
1652
        }
30426 tejbeer 1653
 
33400 ranu 1654
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
28339 tejbeer 1655
 
33400 ranu 1656
        model.addAttribute("pendingOrderItems", map.get("pendingOrderItems"));
1657
        model.addAttribute("isAdmin", isAdmin);
1658
        return "claim_raised_order_item";
33213 tejus.loha 1659
    }
27046 tejbeer 1660
 
33213 tejus.loha 1661
    @RequestMapping(value = "/raiseClaimOrderItem", method = RequestMethod.POST)
1662
    public String raiseClaimOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28352 tejbeer 1663
 
33213 tejus.loha 1664
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1665
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1666
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28437 tejbeer 1667
 
33213 tejus.loha 1668
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1669
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1670
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
28437 tejbeer 1671
 
33213 tejus.loha 1672
        }
1673
        pendingOrderItemRepository.persist(pendingOrderItem);
1674
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28437 tejbeer 1675
 
33213 tejus.loha 1676
        return "response";
1677
    }
28437 tejbeer 1678
 
33213 tejus.loha 1679
    @RequestMapping(value = "/verifyOrderItem", method = RequestMethod.POST)
1680
    public String verifyOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28437 tejbeer 1681
 
33213 tejus.loha 1682
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1683
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1684
        pendingOrderItem.setVerifiedTimestamp(LocalDateTime.now());
28352 tejbeer 1685
 
33213 tejus.loha 1686
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1687
 
33213 tejus.loha 1688
        return "response";
1689
    }
26721 tejbeer 1690
 
33213 tejus.loha 1691
    @RequestMapping(value = "/cancelOrderByInvoice", method = RequestMethod.POST)
1692
    public String cancelOrder(HttpServletRequest request, @RequestParam List<String> invoiceNumbers, Model model)
1693
            throws Exception {
1694
        orderService.cancelOrder(invoiceNumbers);
1695
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1696
 
33213 tejus.loha 1697
        return "response";
1698
    }
28352 tejbeer 1699
 
33213 tejus.loha 1700
    @RequestMapping(value = "/getOnlineOrder", method = RequestMethod.GET)
1701
    public String cancelOrder(HttpServletRequest request, Model model) throws Exception {
1702
        return "online-order";
1703
    }
28352 tejbeer 1704
 
33400 ranu 1705
    @RequestMapping(value = "/deliveredPendingOrderItem", method = RequestMethod.POST)
1706
    public String deliveredPendingOrderItem(HttpServletRequest request, @RequestParam(name = "id") int pendingOrderItemId, Model model)
1707
            throws Exception {
1708
 
1709
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1710
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(pendingOrderItemId);
1711
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1712
 
1713
        //Prepaid payment successful
1714
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1715
            //pendingOrderItem.setStatus(OrderStatus.UNSETTLED);
1716
//            pendingOrderItem.setSettled(false);
1717
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1718
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
1719
        } else {
1720
            pendingOrderItem.setStatus(OrderStatus.SETTLED);
1721
        }
1722
        pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
1723
 
1724
        List<OrderStatus> pendingOrderItemStatusList = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1725
                .map(x -> x.getStatus()).collect(Collectors.toList());
1726
 
1727
        List<Integer> catalogIds = new ArrayList<>();
1728
 
1729
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1730
        pendingOrderItem.setItemName(item.getItemDescription());
1731
        catalogIds.add(item.getCatalogItemId());
1732
 
1733
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1734
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1735
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1736
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1737
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
1738
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
1739
        Map<String, Object> emailModel = new HashMap<>();
1740
        emailModel.put("customer", customerAddress);
1741
        emailModel.put("pendingOrder", pendingOrder);
1742
        emailModel.put("date", dateTimeFormatter);
1743
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1744
        String[] customerEmail = null;
1745
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1746
            customerEmail = new String[]{customer.getEmailId()};
34211 vikas.jang 1747
            List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
33400 ranu 1748
 
1749
            emailService.sendMailWithAttachments("Order Delivered with SmartDukaan", "order-delivered.vm", emailModel,
1750
                    customerEmail, null, bccTo.toArray(new String[0]));
1751
 
1752
        }
1753
        if (!pendingOrderItemStatusList.contains(OrderStatus.PENDING) && !pendingOrderItemStatusList.contains(OrderStatus.PROCESSING)
1754
                && !pendingOrderItemStatusList.contains(OrderStatus.BILLED) && !pendingOrderItemStatusList.contains(OrderStatus.UNSETTLED)
1755
                && !pendingOrderItemStatusList.contains(OrderStatus.CLAIMED)) {
1756
            pendingOrder.setStatus(OrderStatus.CLOSED);
1757
        }
1758
        pendingOrderItemRepository.persist(pendingOrderItem);
1759
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1760
 
1761
        return "response";
1762
    }
1763
 
33213 tejus.loha 1764
    @GetMapping("/getAllOrdersByStatus")
1765
    public String getAllOrdersByStatus(HttpServletRequest request, @RequestParam OrderStatus status,
1766
                                       @RequestParam(required = false) LocalDateTime startTime,
1767
                                       @RequestParam(required = false) LocalDateTime endTime, Model model) throws ProfitMandiBusinessException {
1768
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1769
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
33437 ranu 1770
        boolean isAccountsL2AndL3 = false;
33400 ranu 1771
        if (isAdmin) {
1772
            AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1773
            List<Position> positions = positionRepository.selectPositionByAuthId(authUser.getId());
1774
            for (Position position : positions) {
33437 ranu 1775
                if (((position.getEscalationType().equals(EscalationType.L2) || position.getEscalationType().equals(EscalationType.L3))
33400 ranu 1776
                        && position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS)) {
33437 ranu 1777
                    isAccountsL2AndL3 = true;
33400 ranu 1778
                    break;
1779
                }
1780
            }
1781
        }
1782
 
33213 tejus.loha 1783
        LOGGER.info("startTime {}", startTime);
1784
        LOGGER.info("endTime {}", endTime);
28352 tejbeer 1785
 
33213 tejus.loha 1786
        List<PendingOrderItem> pendingOrderItems;
1787
        if (startTime == null) {
33367 ranu 1788
            LocalDate date = LocalDate.now().minusDays(15);
1789
            if (status.equals(OrderStatus.PENDING)) {
1790
                pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(Collections.singletonList(status), date.atStartOfDay(), LocalDateTime.now());
1791
            } else {
1792
                pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(status);
1793
            }
1794
 
33213 tejus.loha 1795
        } else {
1796
            List<OrderStatus> statusList = new ArrayList<>();
1797
            if (status.equals(OrderStatus.DELIVERED)) {
1798
                statusList.add(OrderStatus.SETTLED);
1799
                statusList.add(OrderStatus.UNSETTLED);
1800
            } else {
1801
                statusList.add(status);
1802
            }
1803
            pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(statusList,
1804
                    startTime.toLocalDate().atStartOfDay(), endTime);
1805
        }
28352 tejbeer 1806
 
33213 tejus.loha 1807
        List<Integer> pendingOrderIds = pendingOrderItems.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
28352 tejbeer 1808
 
33213 tejus.loha 1809
        List<Integer> fofoIds = pendingOrderRepository.selectByIds(pendingOrderIds)
1810
                .stream().map(x -> x.getFofoId()).distinct().collect(Collectors.toList());
28356 tejbeer 1811
 
33213 tejus.loha 1812
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28352 tejbeer 1813
 
33213 tejus.loha 1814
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1815
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1816
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1817
        model.addAttribute("customRetailersMap", customRetailersMap);
28352 tejbeer 1818
 
33213 tejus.loha 1819
        LOGGER.info("customRetailersMap {}", customRetailersMap);
28339 tejbeer 1820
 
33213 tejus.loha 1821
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, 0);
32697 ranu 1822
 
33213 tejus.loha 1823
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
1824
        model.addAttribute("partnerInventoryMap", map.get("partnerInventoryMap"));
32697 ranu 1825
 
33213 tejus.loha 1826
        model.addAttribute("isAdmin", isAdmin);
33437 ranu 1827
        model.addAttribute("isAccountsL2AndL3", isAccountsL2AndL3);
33213 tejus.loha 1828
        return "online-order-item";
1829
    }
32697 ranu 1830
 
33400 ranu 1831
    @RequestMapping(value = "/onlinePaymentAddToPartnerWallet", method = RequestMethod.POST)
1832
    public String onlinePaymentAddToPartnerWallet(HttpServletRequest request, @RequestParam int id,
1833
                                                  Model model) throws Exception {
1834
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1835
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1836
        int fofoId = pendingOrder.getFofoId();
1837
        double deductionPayment = (pendingOrderItem.getSellingPrice() * 2.36) / 100;
1838
        walletService.addAmountToWallet(fofoId, id, WalletReferenceType.ONLINE_ORDER_PAYMENT, "Online Order Payment", pendingOrderItem.getSellingPrice(), LocalDateTime.now());
1839
        walletService.consumeAmountFromWallet(fofoId, id,
1840
                WalletReferenceType.ONLINE_GATEWAY_FEE, "Payment Gatewayfee", (float) deductionPayment, LocalDateTime.now());
1841
 
1842
        pendingOrderItem.setStatus(OrderStatus.CLOSED);
1843
        pendingOrder.setStatus(OrderStatus.CLOSED);
1844
 
1845
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1846
 
1847
        return "response";
1848
    }
1849
 
33213 tejus.loha 1850
    //TODO Tejus
1851
    @RequestMapping(value = "/getBulkOrder")
33336 tejus.loha 1852
    public String getBulkOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException, MessagingException, IOException {
33213 tejus.loha 1853
        return "bulk-order";
1854
    }
32697 ranu 1855
 
33213 tejus.loha 1856
    @PostMapping(value = "/bulkOrder/upload")
1857
    public String uploadCatalog(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model)
1858
            throws Exception {
1859
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1860
        int authId = authRepository.selectByEmailOrMobile(fofoDetails.getEmailId()).getId();
1861
        LOGGER.info("authId - {}", authId);
1862
        bulkOrderService.parseBulkOrders(file, authId);
1863
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1864
        return "response";
1865
    }
32697 ranu 1866
 
33213 tejus.loha 1867
    // This method is use for sending all pending transaction to Transation Approval menu
1868
    @RequestMapping(value = "/transaction/pendingApprovals", method = RequestMethod.GET)
1869
    public String getTransactionApproval(HttpServletRequest request, Model model) throws Exception {
33219 tejus.loha 1870
        List<TransactionApproval> transactionApprovals = transactionApprovalRepository.selectAllPending();
35737 amit 1871
        LOGGER.info("list of Approval transaction Id: {}", transactionApprovals);
33336 tejus.loha 1872
        List<TransactionApprovalModel> approvalModelList = bulkOrderService.getAllPendingTransactionApproval();
33213 tejus.loha 1873
        model.addAttribute("approvalModelList", approvalModelList);
1874
        return "transaction/transaction-approvals";
1875
    }
33092 tejus.loha 1876
 
33213 tejus.loha 1877
    @RequestMapping(value = "transaction/approval", method = RequestMethod.PUT)
1878
    public String transactionApproval(HttpServletRequest request, Model model,
1879
                                      @RequestParam int transactionId,
1880
                                      @RequestParam String remark,
1881
                                      @RequestParam TransactionApprovalStatus transactionApprovalStatus
1882
    ) throws Exception {
1883
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1884
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1885
        int approvalId = authUser.getId();
1886
        String approvedBy = authUser.getFullName();
1887
        LocalDateTime approvedOn = LocalDateTime.now();
1888
        this.updateApprovalStatus(transactionId, approvalId, approvedBy, approvedOn, remark, transactionApprovalStatus);
1889
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1890
        return "response";
1891
 
1892
    }
1893
 
33696 amit.gupta 1894
 
33213 tejus.loha 1895
    private void updateApprovalStatus(int transactionId, int approvalId, String approvedBy, LocalDateTime approvedOn, String remark, TransactionApprovalStatus transactionApprovalStatus) throws Exception {
1896
        TransactionApproval transactionApproval = transactionApprovalRepository.selectById(transactionId);
33336 tejus.loha 1897
        int retailerId = transactionRepository.selectById(transactionId).getRetailerId();
33213 tejus.loha 1898
        if (!transactionApproval.getStatus().equals(TransactionApprovalStatus.PENDING)) {
1899
            throw new ProfitMandiBusinessException("Transaction already Processed", "Transaction already Processed", "Transaction already Processed");
1900
        }
1901
        transactionApproval.setStatus(transactionApprovalStatus);
1902
        transactionApproval.setRemark(remark);
1903
        transactionApproval.setApprovalId(approvalId);
1904
        transactionApproval.setApprovedBy(approvedBy);
1905
        transactionApproval.setApprovedOn(approvedOn);
1906
        if (transactionApprovalStatus.equals(TransactionApprovalStatus.APPROVED)) {
34313 ranu 1907
            transactionService.processTransaction(transactionId, 0);
33336 tejus.loha 1908
        } else {
1909
            float totalAmount = 0;
1910
            // referense id = transaction id
1911
            // here refund the amount of an order
1912
            List<UserWalletHistory> uwhList = walletService.getAllByReference(retailerId, transactionId, WalletReferenceType.PURCHASE);
33687 amit.gupta 1913
            //Refund only if any amount is deducted from wallet for that particular Transaction
33696 amit.gupta 1914
            if (uwhList.size() > 0) {
33687 amit.gupta 1915
                totalAmount = -uwhList.get(0).getAmount();
1916
                walletService.refundToWallet(retailerId, totalAmount, transactionId, WalletReferenceType.PURCHASE, "Order canceled");
34733 amit.gupta 1917
                sdCreditService.settleBlockedLoan(transactionId, totalAmount);
33687 amit.gupta 1918
            }
33213 tejus.loha 1919
        }
1920
    }
1921
 
1922
    @RequestMapping(value = "/bulkOrderTemplate", method = RequestMethod.GET)
1923
    public ResponseEntity<?> bulkOrderTemplate() throws Exception {
1924
        List<List<?>> rows = new ArrayList<>();
1925
        rows.add(Arrays.asList("Mahaveer", "Change description for your reference", "175139287", "28264", "0", "4"));
1926
        rows.add(Arrays.asList("Mahaveer", "Price =0 means system price", "175139287", "28268", "0", "7"));
1927
        rows.add(Arrays.asList("Jas", "You give custom price also ", "171273247", "28264", "300", "3"));
1928
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1929
                .getCSVByteStream(Arrays.asList("Partner name", "Description", "Partner Id", "Item Id", "Price", "Quantity"), rows);
1930
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Bulk order template");
1931
 
1932
        return responseEntity;
1933
 
1934
    }
34168 tejus.loha 1935
 
1936
    @Autowired
1937
    EInvoiceDetailsRepository eInvoiceDetailsRepository;
1938
 
1939
    @GetMapping("/resetIrnGeneratedPanel")
1940
    public String resetIrnGeneratedPanel() {
1941
        return "reset-irn-panel";
1942
    }
1943
 
1944
    @GetMapping("/getTransactionForIrnReset")
1945
    public String getTransactionForIrnReset(@RequestParam String invoiceNumber, Model model) throws Exception {
1946
        List<String> invoiceNumbers = Arrays.asList(invoiceNumber.split(","));
1947
        List<EInvoiceDetails> eInvoiceDetailsList = eInvoiceDetailsRepository.selectByInvoiceNumbers(invoiceNumbers);
1948
        if (invoiceNumbers.size() == eInvoiceDetailsList.size()) {
1949
            model.addAttribute("irnResetOrderModelList", new ArrayList<>());
1950
            model.addAttribute("notEligibleInvoiceNumbers", invoiceNumber);
1951
            return "eligible-irn-reset-orders";
1952
        }
1953
        Set<String> existingInvoiceInEInvoiceDtl = eInvoiceDetailsList.stream().map(x -> x.getInvoiceNumber()).collect(Collectors.toSet());
1954
        List<String> missingInvoiceInEInvoiceDtl = invoiceNumbers.stream().filter(x -> !existingInvoiceInEInvoiceDtl.contains(x)).collect(Collectors.toList());
1955
 
1956
        List<Order> orderList = orderRepository.selectByInvoiceNumbers(missingInvoiceInEInvoiceDtl).stream().filter(x -> x.getIrnGenerated() != null).collect(Collectors.toList());
1957
        Map<String, List<Order>> invoiceMap = orderList.stream().collect(Collectors.groupingBy(x -> x.getInvoiceNumber()));
1958
        Set<String> notEligibleInvoiceNumbers = new HashSet<>();
1959
        notEligibleInvoiceNumbers.addAll(existingInvoiceInEInvoiceDtl);
1960
        List<IrnResetOrderModel> irnResetOrderModelList = new ArrayList<>();
1961
        for (Map.Entry<String, List<Order>> invoiceMapEntry : invoiceMap.entrySet()) {
1962
            String invoice = invoiceMapEntry.getKey();
1963
            List<Order> orders = invoiceMapEntry.getValue();
35066 amit 1964
            LocalDate earlierDate = LocalDate.now().minusDays(5);
1965
            boolean isEligible = !orders.isEmpty() && orders.stream().allMatch(x -> x.getBillingTimestamp().toLocalDate().isAfter(earlierDate) && x.getIrnGenerated() != null);
34168 tejus.loha 1966
            if (isEligible) {
1967
                Order order = orders.get(0);
1968
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(order.getRetailerId());
1969
 
1970
                IrnResetOrderModel irnResetOrderModel = new IrnResetOrderModel();
1971
                irnResetOrderModel.setName(partnerOnBoardingPanelRepository.selectByCode(fofoStore.getCode()).getOutLetName());
1972
                irnResetOrderModel.setInvoiceNumber(order.getInvoiceNumber());
1973
                irnResetOrderModel.setInvoiceDate(order.getBillingTimestamp());
1974
                irnResetOrderModel.setWarehouseId(ProfitMandiConstants.WAREHOUSE_MAP.get(order.getWarehouseId()));
1975
                irnResetOrderModel.setTotalOrderValue(orders.stream().mapToDouble(Order::getTotalAmount).sum());
1976
                irnResetOrderModelList.add(irnResetOrderModel);
1977
            } else {
1978
                notEligibleInvoiceNumbers.add(invoice);
1979
            }
1980
        }
1981
        model.addAttribute("irnResetOrderModelList", irnResetOrderModelList);
1982
        model.addAttribute("notEligibleInvoiceNumbers", notEligibleInvoiceNumbers.stream().collect(Collectors.joining(", ")));
1983
        return "eligible-irn-reset-orders";
1984
    }
1985
 
1986
    @PutMapping("/resetOrdersIrn")
1987
    public String resetIrn(@RequestParam String invoiceNumbers, Model model) throws Exception {
1988
        List<String> invoices = new ArrayList<>();
1989
        if (!invoiceNumbers.isEmpty()) {
1990
            invoices = Arrays.asList(invoiceNumbers.split(","));
1991
        }
1992
        List<Order> orderList = orderRepository.selectByInvoiceNumbers(invoices);
1993
        orderList.forEach(order -> {
1994
            order.setIrnGenerated(null);
1995
        });
1996
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1997
        return "response";
1998
    }
34179 tejus.loha 1999
 
34474 aman.kumar 2000
    @PutMapping(value = "/sendInvoiceOnWhatsApp")
2001
    public String sendInvoiceOnWhatsApp(HttpServletRequest request, @RequestParam int orderId, @RequestParam String whatsAppMobile, Model model) throws Exception {
2002
        boolean isSend = this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(orderId), whatsAppMobile);
2003
        model.addAttribute("response1", isSend);
34179 tejus.loha 2004
        return "response";
2005
    }
2006
 
35269 ranu 2007
    @Autowired
2008
    OneAssistService oneAssistService;
34179 tejus.loha 2009
 
35269 ranu 2010
    @RequestMapping(value = "/cancelInsuranceWithoutInvoice/{applicationNumber}/{memberShipNumber}", method = RequestMethod.GET)
2011
    public String cancelInsuranceWithoutInvoice(HttpServletRequest request, @PathVariable int applicationNumber, @PathVariable int memberShipNumber, Model model) throws Exception {
2012
        CancelPlanRequestModel cancelPlanRequestModel = new CancelPlanRequestModel();
2013
        cancelPlanRequestModel.setMembershipId(Long.parseLong(String.valueOf(memberShipNumber)));
2014
        cancelPlanRequestModel.setApplicationNo(applicationNumber + "");
2015
        oneAssistService.cancelCertificate(cancelPlanRequestModel);
2016
 
2017
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
2018
 
2019
        return "response";
2020
 
2021
    }
2022
 
32409 amit.gupta 2023
}
32405 jai.hind 2024