Subversion Repositories SmartDukaan

Rev

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