Subversion Repositories SmartDukaan

Rev

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