Subversion Repositories SmartDukaan

Rev

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