Subversion Repositories SmartDukaan

Rev

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