Subversion Repositories SmartDukaan

Rev

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