Subversion Repositories SmartDukaan

Rev

Rev 37312 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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