Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21612 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
26817 amit.gupta 3
import com.google.gson.Gson;
23203 ashik.ali 4
import com.spice.profitmandi.common.enumuration.SearchType;
21612 ashik.ali 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30322 amit.gupta 6
import com.spice.profitmandi.common.model.*;
28339 tejbeer 7
import com.spice.profitmandi.common.solr.SolrService;
33213 tejus.loha 8
import com.spice.profitmandi.common.util.FileUtil;
21689 ashik.ali 9
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 10
import com.spice.profitmandi.common.util.StringUtils;
22244 ashik.ali 11
import com.spice.profitmandi.common.web.util.ResponseSender;
33213 tejus.loha 12
import com.spice.profitmandi.dao.entity.auth.AuthUser;
33795 ranu 13
import com.spice.profitmandi.dao.entity.catalog.CustomerOffer;
14
import com.spice.profitmandi.dao.entity.catalog.CustomerOfferItem;
23638 amit.gupta 15
import com.spice.profitmandi.dao.entity.catalog.Item;
27861 tejbeer 16
import com.spice.profitmandi.dao.entity.catalog.TagListing;
33400 ranu 17
import com.spice.profitmandi.dao.entity.cs.Position;
22217 ashik.ali 18
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
23343 ashik.ali 19
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
23548 ashik.ali 20
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
33795 ranu 21
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
30322 amit.gupta 22
import com.spice.profitmandi.dao.entity.fofo.*;
34194 ranu 23
import com.spice.profitmandi.dao.entity.transaction.EInvoiceDetails;
24
import com.spice.profitmandi.dao.entity.transaction.Order;
25
import com.spice.profitmandi.dao.entity.transaction.TransactionApproval;
26
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
23298 ashik.ali 27
import com.spice.profitmandi.dao.entity.user.Address;
33400 ranu 28
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
23548 ashik.ali 29
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
27046 tejbeer 30
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
33213 tejus.loha 31
import com.spice.profitmandi.dao.enumuration.transaction.TransactionApprovalStatus;
34168 tejus.loha 32
import com.spice.profitmandi.dao.model.hdfc.IrnResetOrderModel;
33213 tejus.loha 33
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33795 ranu 34
import com.spice.profitmandi.dao.repository.catalog.*;
33400 ranu 35
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
30322 amit.gupta 36
import com.spice.profitmandi.dao.repository.dtr.*;
37
import com.spice.profitmandi.dao.repository.fofo.*;
24440 amit.gupta 38
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
33336 tejus.loha 39
import com.spice.profitmandi.dao.repository.transaction.*;
23298 ashik.ali 40
import com.spice.profitmandi.dao.repository.user.AddressRepository;
33336 tejus.loha 41
import com.spice.profitmandi.dao.repository.user.CartRepository;
34474 aman.kumar 42
import com.spice.profitmandi.dao.service.ScratchService;
28377 tejbeer 43
import com.spice.profitmandi.service.EmailService;
32251 amit.gupta 44
import com.spice.profitmandi.service.NotificationService;
23798 amit.gupta 45
import com.spice.profitmandi.service.authentication.RoleManager;
25726 amit.gupta 46
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
24440 amit.gupta 47
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
33172 tejus.loha 48
import com.spice.profitmandi.service.order.BulkOrderService;
23366 ashik.ali 49
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 50
import com.spice.profitmandi.service.pricing.PricingService;
33696 amit.gupta 51
import com.spice.profitmandi.service.transaction.SDCreditService;
33213 tejus.loha 52
import com.spice.profitmandi.service.transaction.TransactionService;
26647 tejbeer 53
import com.spice.profitmandi.service.user.RetailerService;
33336 tejus.loha 54
import com.spice.profitmandi.service.wallet.WalletService;
32405 jai.hind 55
import com.spice.profitmandi.service.whatsapp.WhatsappMessageService;
32855 amit.gupta 56
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
22139 amit.gupta 57
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 58
import com.spice.profitmandi.web.util.CookiesProcessor;
24105 govind 59
import com.spice.profitmandi.web.util.MVCResponseSender;
33336 tejus.loha 60
import in.shop2020.model.v1.order.WalletReferenceType;
30148 amit.gupta 61
import org.apache.logging.log4j.LogManager;
62
import org.apache.logging.log4j.Logger;
32405 jai.hind 63
import org.json.JSONArray;
30148 amit.gupta 64
import org.json.JSONObject;
65
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.core.io.InputStreamResource;
67
import org.springframework.http.HttpHeaders;
68
import org.springframework.http.HttpStatus;
69
import org.springframework.http.MediaType;
70
import org.springframework.http.ResponseEntity;
71
import org.springframework.stereotype.Controller;
72
import org.springframework.transaction.annotation.Transactional;
73
import org.springframework.ui.Model;
74
import org.springframework.web.bind.annotation.*;
33172 tejus.loha 75
import org.springframework.web.multipart.MultipartFile;
21612 ashik.ali 76
 
33336 tejus.loha 77
import javax.mail.MessagingException;
30148 amit.gupta 78
import javax.servlet.http.HttpServletRequest;
79
import javax.servlet.http.HttpServletResponse;
32409 amit.gupta 80
import java.io.ByteArrayInputStream;
81
import java.io.ByteArrayOutputStream;
33336 tejus.loha 82
import java.io.IOException;
32409 amit.gupta 83
import java.io.InputStream;
32271 amit.gupta 84
import java.nio.charset.StandardCharsets;
33367 ranu 85
import java.time.LocalDate;
30148 amit.gupta 86
import java.time.LocalDateTime;
87
import java.time.format.DateTimeFormatter;
88
import java.time.temporal.ChronoUnit;
89
import java.util.*;
90
import java.util.stream.Collectors;
91
 
21612 ashik.ali 92
@Controller
23973 govind 93
@Transactional(rollbackFor = Throwable.class)
21612 ashik.ali 94
public class OrderController {
95
 
33213 tejus.loha 96
    private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 97
 
33213 tejus.loha 98
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
99
    private static final List<String> allowedDoaImeis = Arrays.asList("863903054378477");
100
    @Autowired
101
    NotificationService notificationService;
102
    @Autowired
103
    TransactionApprovalRepository transactionApprovalRepository;
104
    @Autowired
105
    LineItemRepository lineItemRepository;
106
    @Autowired
107
    AuthRepository authRepository;
108
    @Autowired
109
    TransactionService transactionService;
110
    @Autowired
111
    BulkOrderService bulkOrderService;
112
    @Autowired
113
    private CustomerRepository customerRepository;
114
    private boolean accessoriesDeals = true;
115
    @Autowired
116
    private RoleManager roleManager;
117
    @Autowired
118
    private Gson gson;
119
    @Autowired
120
    private CustomerReturnItemRepository customerReturnItemRepository;
121
    @Autowired
122
    private FofoOrderItemRepository fofoOrderItemRepository;
123
    @Autowired
124
    private PaymentOptionRepository paymentOptionRepository;
125
    @Autowired
126
    private StateRepository stateRepository;
127
    @Autowired
128
    private ItemRepository itemRepository;
129
    @Autowired
130
    private MVCResponseSender mvcResponseSender;
131
    @Autowired
132
    private InsuranceService insuranceService;
133
    @Autowired
134
    private FofoOrderRepository fofoOrderRepository;
135
    @Autowired
136
    private CustomerAddressRepository customerAddressRepository;
137
    @Autowired
138
    private InsurancePolicyRepository insurancePolicyRepository;
139
    @Autowired
140
    private InsuranceProviderRepository insuranceProviderRepository;
141
    @Autowired
142
    private CookiesProcessor cookiesProcessor;
143
    @Autowired
144
    private PricingService pricingService;
145
    @Autowired
146
    private OrderService orderService;
147
    @Autowired
148
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
149
    @Autowired
150
    private AddressRepository addressRepository;
151
    @Autowired
152
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
153
    @Autowired
154
    private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
155
    @Autowired
156
    private ResponseSender<?> responseSender;
157
    @Autowired
158
    private PendingOrderRepository pendingOrderRepository;
159
    @Autowired
160
    private OrderRepository orderRepository;
161
    @Autowired
162
    private PendingOrderItemRepository pendingOrderItemRepository;
163
    @Autowired
164
    private FofoStoreRepository fofoStoreRepository;
165
    @Autowired
166
    private RetailerService retailerService;
167
    @Autowired
168
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
169
    @Autowired
170
    private TagListingRepository tagListingRepository;
171
    @Autowired
172
    private PendingOrderService pendingOrderService;
173
    @Autowired
174
    private EmailService emailService;
175
    @Autowired
176
    private SolrService commonSolrService;
177
    @Autowired
178
    private MouRepository mouRepository;
179
    @Autowired
180
    private WhatsappMessageService whatsappMessageService;
181
    @Autowired
182
    private TransactionRepository transactionRepository;
33336 tejus.loha 183
    @Autowired
184
    WalletService walletService;
185
    @Autowired
186
    CartRepository cartRepository;
187
    @Autowired
188
    UserWalletRepository userWalletRepository;
28339 tejbeer 189
 
33795 ranu 190
    @Autowired
191
    private CatalogRepository catalogRepository;
33336 tejus.loha 192
 
33400 ranu 193
    @Autowired
33795 ranu 194
    private CustomerOfferRepository customerOfferRepository;
195
 
196
    @Autowired
197
    private CustomerOfferItemRepository customerOfferItemRepository;
198
 
199
    @Autowired
200
    private WebOfferRepository webOfferRepository;
201
 
202
    @Autowired
33400 ranu 203
    PositionRepository positionRepository;
32405 jai.hind 204
 
33437 ranu 205
    @Autowired
206
    PendingOrderPlanRepository pendingOrderPlanRepository;
24105 govind 207
 
34168 tejus.loha 208
    @Autowired
209
    PartnerOnBoardingPanelRepository partnerOnBoardingPanelRepository;
210
 
211
    @Autowired
212
    SDCreditService sdCreditService;
213
 
34474 aman.kumar 214
    @Autowired
215
    ScratchService scratchService;
216
 
33419 amit.gupta 217
    @RequestMapping(value = "/wa-send-invoice", method = RequestMethod.GET)
218
    public String sendWhatsappMessage(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) {
219
        try {
220
            this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(orderId));
221
        } catch (Exception e) {
222
            LOGGER.info("Could not send whatsapp message");
223
            e.printStackTrace();
224
        }
225
        model.addAttribute("response1", true);
226
        return "response";
227
    }
228
 
33213 tejus.loha 229
    @RequestMapping(value = "/get-order", method = RequestMethod.GET)
230
    public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId,
231
                           Model model) throws ProfitMandiBusinessException {
232
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
233
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
234
        List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
235
        CustomerAddress customerAddress = null;
236
        if (fofoOrder.getCustomerAddressId() != 0) {
237
            customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
238
        }
23973 govind 239
 
33213 tejus.loha 240
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
241
        if (customerAddress != null) {
242
            customerAddress.setPhoneNumber(customer.getMobileNumber());
243
        }
244
        LOGGER.info("Added to get invoice - {}, {}", customer, 123);
245
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
246
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
247
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
248
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
249
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
250
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
251
        this.addInsuranceProvider(insurancePolicies);
32627 ranu 252
 
33213 tejus.loha 253
        model.addAttribute("fofoOrder", fofoOrder);
254
        model.addAttribute("fofoLineItems", fofoLineItems);
255
        if (customerAddress != null) {
256
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
257
        } else {
258
            model.addAttribute("customerBillingAddress", "");
21985 kshitij.so 259
 
33213 tejus.loha 260
        }
261
        model.addAttribute("customerBillingAddressObj", customerAddress);
262
        model.addAttribute("customerDetailsObj", customer);
263
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
264
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
265
        model.addAttribute("insurancePolicies", insurancePolicies);
266
        return "order-details";
267
    }
32637 amit.gupta 268
 
33213 tejus.loha 269
    private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(
270
            List<InsuranceProvider> insuranceProviders) {
271
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
272
        for (InsuranceProvider insuranceProvider : insuranceProviders) {
273
            insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
274
        }
275
        return insuranceProviderIdInsuranceProviderMap;
276
    }
23973 govind 277
 
33247 ranu 278
    private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies) throws ProfitMandiBusinessException {
33213 tejus.loha 279
        if (insurancePolicies.isEmpty()) {
280
            return;
281
        }
282
        Set<Integer> insuranceProviderIds = new HashSet<>();
283
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
284
            insuranceProviderIds.add(insurancePolicy.getProviderId());
285
        }
286
        LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
287
        List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
288
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this
289
                .toInsuranceProviderIdInsuranceProvider(insuranceProviders);
290
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
291
            insurancePolicy
292
                    .setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
293
        }
294
    }
23973 govind 295
 
33213 tejus.loha 296
    @RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
297
    public String getSaleDetails(HttpServletRequest request,
298
                                 @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
299
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
300
        boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
301
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
302
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
303
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
304
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
305
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
23973 govind 306
 
33213 tejus.loha 307
        // Added Migration info as we lost it.
308
        if (paymentOptionTransactions == null || paymentOptionTransactions.size() == 0) {
309
            PaymentOptionTransaction pot = new PaymentOptionTransaction();
310
            pot.setAmount(fofoOrder.getTotalAmount());
311
            pot.setCreateTimestamp(fofoOrder.getCreateTimestamp());
312
            // Mark it paid through cash
313
            pot.setPaymentOptionId(1);
314
            pot.setReferenceType(PaymentOptionReferenceType.ORDER);
315
            paymentOptionTransactionRepository.persist(pot);
316
            paymentOptionTransactions.add(pot);
317
            LOGGER.info("Added to get invoice");
318
        }
319
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
320
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
321
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
322
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
323
        this.addInsuranceProvider(insurancePolicies);
324
        Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
325
            try {
326
                return itemRepository.selectById(x.getItemId());
327
            } catch (ProfitMandiBusinessException e) {
328
                // TODO Auto-generated catch block
329
                return null;
330
            }
331
        }));
332
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
333
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23973 govind 334
 
33213 tejus.loha 335
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
336
                .collect(Collectors.toMap(foi -> foi.getId(),
337
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
23973 govind 338
 
33213 tejus.loha 339
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
23973 govind 340
 
33213 tejus.loha 341
        for (FofoOrderItem foi : fofoOrderItems) {
342
            for (FofoLineItem fli : foi.getFofoLineItems()) {
343
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
344
            }
345
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
346
                    .selectAllByOrderItemId(foi.getId());
347
            this.markDoa(fofoOrder, foi, isAdmin);
348
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
349
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
350
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
351
            }
352
        }
23973 govind 353
 
33213 tejus.loha 354
        LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
355
        model.addAttribute("fofoOrder", fofoOrder);
356
        model.addAttribute("itemsMap", itemsMap);
357
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
358
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
359
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
360
        model.addAttribute("fofoOrderItemIdLineItemMap", fofoOrderItemIdLineItemMap);
23973 govind 361
 
33213 tejus.loha 362
        model.addAttribute("fofoOrderItems", fofoOrderItems);
363
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
364
        if (customerAddress != null) {
30426 tejbeer 365
 
33213 tejus.loha 366
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
367
        } else {
368
            model.addAttribute("customerBillingAddress", "");
32637 amit.gupta 369
 
33213 tejus.loha 370
        }
371
        model.addAttribute("customerBillingAddressObj", customerAddress);
372
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
373
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
374
        model.addAttribute("insurancePolicies", insurancePolicies);
375
        model.addAttribute("markDefective", this.markDefective(fofoOrder));
376
        return "sale-details";
377
    }
32637 amit.gupta 378
 
33213 tejus.loha 379
    private void markDoa(FofoOrder fofoOrder, FofoOrderItem foi, boolean isAdmin) {
380
        if (isAdmin) {
381
            foi.setDoa(true);
382
            return;
383
        }
384
        boolean isImei = foi.getFofoLineItems().stream()
385
                .anyMatch(x -> org.apache.commons.lang3.StringUtils.isNotEmpty(x.getSerialNumber())
386
                        && allowedDoaImeis.contains(x.getSerialNumber()));
387
        LocalDateTime buyDate = fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS);
388
        LocalDateTime curDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
389
        if (buyDate.isAfter(curDate.minusDays(45)) || isImei) {
390
            foi.setDoa(true);
391
        } else
392
            foi.setDoa(
393
                    foi.getBrand().equals("Nokia") && foi.getCost() < 4990 && buyDate.isAfter(curDate.minusYears(1)));
394
    }
30426 tejbeer 395
 
33213 tejus.loha 396
    private boolean markDefective(FofoOrder fofoOrder) {
397
        return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(180)
398
                .isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
26647 tejbeer 399
 
33213 tejus.loha 400
    }
26647 tejbeer 401
 
33213 tejus.loha 402
    @RequestMapping(value = "/getSearchOrder")
403
    public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
404
        return "search-order";
405
    }
26647 tejbeer 406
 
33213 tejus.loha 407
    @RequestMapping(value = "/getInvoiceSearchOrder")
408
    public String getInvoiceSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
409
        return "invoices-cancel";
410
    }
33172 tejus.loha 411
 
33213 tejus.loha 412
    @RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
413
    public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer,
414
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
415
            throws Exception {
34338 ranu 416
        LOGGER.info("CustomCustomer {}", customCustomer);
33172 tejus.loha 417
 
33213 tejus.loha 418
        orderService.updateCustomerDetails(customCustomer, invoiceNumber);
419
        return this.getSearchOrderDetails(request, invoiceNumber, model);
420
    }
33172 tejus.loha 421
 
33213 tejus.loha 422
    @RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
423
    public String getSearchOrderDetails(HttpServletRequest request,
424
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
425
            throws Exception {
33172 tejus.loha 426
 
33213 tejus.loha 427
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
34474 aman.kumar 428
        if (fofoOrder == null) {
429
            throw new ProfitMandiBusinessException("invalid invoice number", "invoice - " + invoiceNumber, "Please enter valid invoice number");
34181 tejus.loha 430
        }
431
 
33213 tejus.loha 432
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
433
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
434
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
435
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = paymentOptionRepository.selectActiveOption().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
436
        List<Integer> fofoPartnerPaymentOptions = new ArrayList<>(paymentOptionIdPaymentOptionMap.keySet());
437
        Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
438
            try {
439
                return itemRepository.selectById(x.getItemId());
440
            } catch (ProfitMandiBusinessException e) {
441
                // TODO Auto-generated catch block
442
                return null;
443
            }
444
        }));
445
        LOGGER.info("fofoPartnerPaymentOptions" + fofoPartnerPaymentOptions);
446
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
447
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
448
        LOGGER.info("paymentOptionTransactions" + paymentOptionTransactions);
26647 tejbeer 449
 
33213 tejus.loha 450
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
451
                .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
452
        LOGGER.info("paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
453
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
454
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
455
        this.addInsuranceProvider(insurancePolicies);
456
        model.addAttribute("fofoOrder", fofoOrder);
457
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
458
            fofoOrderItem.setDoa(true);
459
        }
27861 tejbeer 460
 
33213 tejus.loha 461
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
462
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
28339 tejbeer 463
 
33213 tejus.loha 464
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
465
                .collect(Collectors.toMap(foi -> foi.getId(),
466
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
28339 tejbeer 467
 
33213 tejus.loha 468
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
28339 tejbeer 469
 
33213 tejus.loha 470
        for (FofoOrderItem foi : fofoOrderItems) {
471
            for (FofoLineItem fli : foi.getFofoLineItems()) {
472
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
473
            }
474
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
475
                    .selectAllByOrderItemId(foi.getId());
476
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
477
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
478
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
479
            }
480
        }
481
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
482
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
483
        model.addAttribute("fofoOrderItems", fofoOrderItems);
484
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
485
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
486
        model.addAttribute("itemsMap", itemsMap);
487
        model.addAttribute("markDefective", true);
488
        model.addAttribute("customer", customer);
489
        model.addAttribute("customerAddress", customerAddress);
490
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
491
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
492
        model.addAttribute("paymentOptionIdPaymentOptionTransactionMap", paymentOptionIdPaymentOptionTransactionMap);
493
        model.addAttribute("insurancePolicies", insurancePolicies);
494
        model.addAttribute("fofoPartnerPaymentOptions", fofoPartnerPaymentOptions);
495
        model.addAttribute("totalNumberOfPaymentOptionId", fofoPartnerPaymentOptions.size());
496
        model.addAttribute("stateNames",
497
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
498
        return "search-order-details";
499
    }
28420 tejbeer 500
 
33213 tejus.loha 501
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(
33247 ranu 502
            List<PaymentOptionTransaction> paymentOptionTransactions) throws ProfitMandiBusinessException {
33213 tejus.loha 503
        Set<Integer> paymentOptionIds = new HashSet<>();
504
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
505
            paymentOptionIds.add(paymentOptionTransaction.getPaymentOptionId());
506
        }
507
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(paymentOptionIds);
508
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
509
        for (PaymentOption paymentOption : paymentOptions) {
510
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
511
        }
512
        return paymentOptionIdPaymentOptionMap;
513
    }
23973 govind 514
 
33213 tejus.loha 515
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMapUsingPaymentOptions(
33247 ranu 516
            List<Integer> fofoPartnerPaymentOptions) throws ProfitMandiBusinessException {
33213 tejus.loha 517
        List<PaymentOption> paymentOptions = paymentOptionRepository
518
                .selectByIds(new HashSet<>(fofoPartnerPaymentOptions));
519
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
520
        for (PaymentOption paymentOption : paymentOptions) {
521
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
522
        }
523
        return paymentOptionIdPaymentOptionMap;
524
    }
23973 govind 525
 
33213 tejus.loha 526
    private Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap(
527
            List<PaymentOptionTransaction> paymentOptionTransactions) {
528
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = new HashMap<>();
529
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
530
            paymentOptionIdPaymentOptionTransactionMap.put(paymentOptionTransaction.getPaymentOptionId(),
531
                    paymentOptionTransaction);
532
        }
533
        return paymentOptionIdPaymentOptionTransactionMap;
534
    }
28339 tejbeer 535
 
33437 ranu 536
    @RequestMapping(value = "/checkplans", method = RequestMethod.GET)
537
    public String getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
538
                                     @RequestParam int itemId, @RequestParam int poiId) throws ProfitMandiBusinessException {
539
        LOGGER.info("Request received at url : {}", request.getRequestURI());
28339 tejbeer 540
 
33437 ranu 541
        try {
542
            String response = mvcResponseSender.createResponseString(this.getPlans(price, itemId, poiId));
543
            model.addAttribute("response1", response);
544
        } catch (Exception e) {
545
            // TODO Auto-generated catch block
546
            LOGGER.info(e.getMessage(), e);
547
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
33213 tejus.loha 548
        }
33400 ranu 549
 
33437 ranu 550
        return "response";
33213 tejus.loha 551
    }
28339 tejbeer 552
 
34204 tejus.loha 553
    private boolean sendWhatsappInvoice(FofoOrder fofoOrder) throws Exception {
554
        return this.sendWhatsappInvoice(fofoOrder, "");
34179 tejus.loha 555
    }
556
 
34204 tejus.loha 557
    private boolean sendWhatsappInvoice(FofoOrder fofoOrder, String whatsAppNo) throws Exception {
558
        boolean shouldSendWhatsappMessage = notificationService.shouldSendWhatsappMessage(whatsAppNo);
34474 aman.kumar 559
        boolean isSend = false;
34204 tejus.loha 560
        if (shouldSendWhatsappMessage) {
561
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
562
            String mobileNumber;
563
            if (!whatsAppNo.isEmpty()) {
34474 aman.kumar 564
                mobileNumber = whatsAppNo;
565
            } else {
566
                mobileNumber = customer.getMobileNumber();
567
            }
568
            CustomRetailer retailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
569
            String message = String.format("Dear %s,\n" +
570
                    "Thank you for your purchase from SmartDukaan store - %s, %s.\n" +
571
                    "Your purchase invoice is attached for your reference.\n" +
572
                    "\n" +
573
                    "Download our app for offers and updates on new products.\n" +
574
                    "https://www.smartdukaan.com/b2c\n" +
575
                    "\n" +
576
                    "Best Regards\n" +
577
                    "SmartDukaan", customer.getFirstName(), retailer.getBusinessName(), retailer.getAddress().getCity());
34204 tejus.loha 578
 
34474 aman.kumar 579
            isSend = notificationService.sendWhatsappMediaMessage(message, mobileNumber, this.getPublicInvoiceUrl(fofoOrder.getInvoiceNumber()),
33213 tejus.loha 580
                    this.getFileName(fofoOrder.getInvoiceNumber()), WhatsappMessageType.DOCUMENT);
581
        }
34204 tejus.loha 582
        return isSend;
33213 tejus.loha 583
    }
28339 tejbeer 584
 
33213 tejus.loha 585
    private String getFileName(String invoiceNumber) {
586
        return "INV-" + invoiceNumber.replace("/", "-") + ".pdf";
587
    }
31375 tejbeer 588
 
33213 tejus.loha 589
    private String getPublicInvoiceUrl(String invoiceNumber) {
590
        String base64Encoded = Base64.getMimeEncoder().encodeToString(invoiceNumber.getBytes(StandardCharsets.UTF_8));
591
        String publicUrl = "https://partners.smartdukaan.com/wa-invoice-send/" + base64Encoded + ".pdf";
592
        LOGGER.info("Public Whatsapp Url for Invoice Message - {}", publicUrl);
593
        return publicUrl;
594
    }
28339 tejbeer 595
 
33213 tejus.loha 596
    @RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
597
    public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest,
598
                                       Model model) throws ProfitMandiBusinessException {
599
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
600
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
601
        CustomerCreditNote custmoerCreditNote;
602
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
603
            FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
604
            FofoOrder fo = fofoOrderRepository.selectByOrderId(foi.getOrderId());
34168 tejus.loha 605
            custmoerCreditNote = orderService.badReturn(fofoDetails.getEmailId(), fo.getFofoId(), foiBadReturnRequest);
33213 tejus.loha 606
        } else {
607
            custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
608
        }
609
        return responseSender.ok(custmoerCreditNote.getId());
610
    }
28339 tejbeer 611
 
33213 tejus.loha 612
    @GetMapping(value = "/wa-invoice-send/{invoiceHash}")
613
    public ResponseEntity<?> generateInvoice(@PathVariable String invoiceHash) throws ProfitMandiBusinessException {
614
        String decodedInvoiceNumber = new String(Base64.getMimeDecoder().decode(invoiceHash));
615
        LOGGER.info("Invoice Hash {}", invoiceHash);
28339 tejbeer 616
 
23973 govind 617
 
33213 tejus.loha 618
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(decodedInvoiceNumber);
24844 amit.gupta 619
 
33213 tejus.loha 620
        InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
24844 amit.gupta 621
 
33213 tejus.loha 622
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
623
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
624
        final HttpHeaders headers = new HttpHeaders();
625
        //headers.setContentDispositionFormData("inline", number + ".pdf");
626
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + pdfModel.getInvoiceNumber() + ".pdf");
627
        int contentLength = byteArrayOutputStream.toByteArray().length;
628
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
629
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
630
        return ResponseEntity.ok()
631
                .headers(headers)
632
                .contentLength(contentLength)
633
                .contentType(MediaType.parseMediaType("application/pdf"))
634
                .body(inputStreamResource);
635
    }
23973 govind 636
 
33213 tejus.loha 637
    @RequestMapping(value = "/wa-listen", method = RequestMethod.POST)
638
    public ResponseEntity<?> listenWhatsappStatus(@RequestBody String whatsappJsonResponse) {
639
        LOGGER.info("whatsappJsonResponse {}", whatsappJsonResponse);
640
        //jaihind
641
        //  String jsonString = "[{\"srcAddr\":\"TESTSM\",\"channel\":\"WHATSAPP\",\"externalId\":\"4977024756456780043-180044363908187691\",\"cause\":\"SUCCESS\",\"errorCode\":\"000\",\"destAddr\":\"919813272029\",\"eventType\":\"DELIVERED\",\"eventTs\":1692848106000}]";
642
        JSONArray jsonArray = new JSONArray(whatsappJsonResponse);
643
        for (int i = 0; i < jsonArray.length(); i++) {
32711 amit.gupta 644
 
33213 tejus.loha 645
            JSONObject jsonObject = jsonArray.getJSONObject(i);
646
            String externalId = jsonObject.getString("externalId");
647
            String destAddr = jsonObject.getString("destAddr");
648
            String eventType = jsonObject.getString("eventType");
649
            whatsappMessageService.setWhatsappResponse(externalId, destAddr, eventType);
650
        }
651
        //jaihind
652
        return responseSender.ok("Success");
32711 amit.gupta 653
 
33213 tejus.loha 654
    }
32271 amit.gupta 655
 
33213 tejus.loha 656
    @RequestMapping(value = "/generateInvoice")
657
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
658
                                             @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
659
        LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
660
                ProfitMandiConstants.ORDER_ID, orderId);
661
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
662
        InvoicePdfModel pdfModel = null;
663
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
664
            pdfModel = orderService.getInvoicePdfModel(orderId);
665
        } else {
666
            pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
667
        }
668
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
669
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
670
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
671
        final HttpHeaders headers = new HttpHeaders();
672
        headers.setContentType(MediaType.APPLICATION_PDF);
673
        headers.setContentDispositionFormData("inline", "invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
674
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
675
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
676
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
677
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
678
    }
24087 amit.gupta 679
 
33213 tejus.loha 680
    @RequestMapping(value = "/generateInvoices")
681
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
682
                                             @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, @RequestParam int partnerId)
683
            throws ProfitMandiBusinessException {
684
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
685
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
686
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
687
            List<Integer> orderIds = fofoOrderRepository.selectByFofoId(partnerId, startDate, endDate, 0, 0).stream()
688
                    .map(x -> x.getId()).collect(Collectors.toList());
689
            for (int orderId : orderIds) {
690
                pdfModels.add(orderService.getInvoicePdfModel(orderId));
691
            }
692
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
693
            PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
694
            LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
695
            final HttpHeaders headers = new HttpHeaders();
696
            headers.setContentType(MediaType.APPLICATION_PDF);
697
            headers.set("Content-disposition", "inline; filename=invoice-" + partnerId + ".pdf");
698
            headers.setContentLength(byteArrayOutputStream.toByteArray().length);
699
            final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
700
            final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
701
            return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
702
        } else {
703
            throw new ProfitMandiBusinessException("Auth", fofoDetails.getEmailId(), "Unauthorised access");
704
        }
705
    }
23973 govind 706
 
33213 tejus.loha 707
    @RequestMapping(value = "/saleHistory")
708
    public String saleHistory(HttpServletRequest request,
709
                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
710
                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
711
                              @RequestParam(required = false) LocalDateTime startTime,
712
                              @RequestParam(required = false) LocalDateTime endTime,
713
                              @RequestParam(name = "offset", defaultValue = "0") int offset,
714
                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
715
            throws ProfitMandiBusinessException {
716
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32405 jai.hind 717
 
33213 tejus.loha 718
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
719
                startTime, endTime, offset, limit);
720
        model.addAllAttributes(map);
721
        return "sale-history";
722
    }
32405 jai.hind 723
 
33213 tejus.loha 724
    @RequestMapping(value = "/downloadInvoices")
725
    public ResponseEntity<?> downloadInvoices(HttpServletRequest request,
726
                                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
727
                                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
728
                                              @RequestParam(required = false) LocalDateTime startTime,
729
                                              @RequestParam(required = false) LocalDateTime endTime,
730
                                              @RequestParam(name = "offset", defaultValue = "0") int offset,
731
                                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
732
            throws ProfitMandiBusinessException {
733
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32409 amit.gupta 734
 
33213 tejus.loha 735
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
736
                startTime, endTime, offset, 100);
737
        List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
23973 govind 738
 
33213 tejus.loha 739
        if (fofoOrders.size() == 0) {
740
            throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
741
        }
23654 amit.gupta 742
 
33213 tejus.loha 743
        final HttpHeaders headers = new HttpHeaders();
744
        headers.setContentType(MediaType.APPLICATION_PDF);
745
        headers.set("Content-disposition", "inline; filename=invoices.pdf");
746
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
747
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
748
        for (FofoOrder fofoOrder : fofoOrders) {
749
            try {
750
                pdfModels.add(orderService.getInvoicePdfModel(fofoOrder.getId()));
751
            } catch (Exception e) {
752
                LOGGER.info("could not create invoice for {}, invoice number {}", fofoOrder.getId(),
753
                        fofoOrder.getInvoiceNumber());
754
            }
755
        }
756
        PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
757
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
758
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
759
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
760
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
761
    }
23654 amit.gupta 762
 
33213 tejus.loha 763
    @RequestMapping(value = "/credit-note/{creditNoteId}")
764
    public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId)
765
            throws ProfitMandiBusinessException {
766
        CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
767
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
768
        PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
769
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
770
        final HttpHeaders headers = new HttpHeaders();
771
        headers.setContentType(MediaType.APPLICATION_PDF);
772
        headers.set("Content-disposition",
773
                "inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
774
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
775
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
776
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
777
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
778
    }
23973 govind 779
 
33213 tejus.loha 780
    @RequestMapping(value = "/getPaginatedSaleHistory")
781
    public String getSaleHistoryPaginated(HttpServletRequest request,
782
                                          @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
783
                                          @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
784
                                          @RequestParam(required = false) LocalDateTime startTime,
785
                                          @RequestParam(required = false) LocalDateTime endTime,
786
                                          @RequestParam(name = "offset", defaultValue = "0") int offset,
787
                                          @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
788
            throws ProfitMandiBusinessException {
789
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
790
        Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType,
791
                searchValue, startTime, endTime, offset, limit);
792
        model.addAllAttributes(map);
793
        return "sale-history-paginated";
794
    }
23973 govind 795
 
33213 tejus.loha 796
    @PutMapping(value = "/updatePaymentTransaction")
797
    public String updateTransactionDetails(HttpServletRequest request, @RequestParam String referenceType,
798
                                           @RequestParam int fofoId, @RequestParam int referenceId,
799
                                           @RequestBody PartnerOptionsAndItemAmountModel partnerOptionsAndItemAmountModel,
800
                                           @RequestParam float totalAmount, Model model) throws Exception {
29707 tejbeer 801
 
33213 tejus.loha 802
        List<PaymentOptionTransactionModel> paymentOptionTransactionModels = partnerOptionsAndItemAmountModel
803
                .getPaymentOptionTransactionModel();
804
        LOGGER.info(paymentOptionTransactionModels);
805
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, referenceId);
806
        LOGGER.info("sdssd" + fofoOrder);
807
        fofoOrder.setTotalAmount(totalAmount);
808
        List<FofoItemIdAmountModel> fofoItemIdAmountModel = partnerOptionsAndItemAmountModel.getItemAmountModel();
809
        for (FofoItemIdAmountModel fim : fofoItemIdAmountModel) {
810
            LOGGER.info("fim" + fim.getFofoItemId());
23973 govind 811
 
33213 tejus.loha 812
            LOGGER.info("fimAmount" + fim.getAmount());
813
            Item item = itemRepository.selectById(fim.getItemId());
814
            TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
815
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(fim.getFofoItemId());
816
            LOGGER.info("category" + item.getCategoryId());
817
            if (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID) {
818
                if (fofoOrderItem.getMop() <= fim.getAmount()) {
23973 govind 819
 
33213 tejus.loha 820
                    if (fim.getAmount() <= tagListing.getMrp()) {
821
                        fofoOrderItem.setSellingPrice(fim.getAmount());
822
                    } else {
823
                        throw new ProfitMandiBusinessException("Amount", fim.getAmount(),
824
                                "Sum of amount is not less than  to MRP");
825
                    }
23973 govind 826
 
33213 tejus.loha 827
                    LOGGER.info("fofoOrderItem2" + fofoOrderItem);
23973 govind 828
 
33213 tejus.loha 829
                } else {
830
                    // TODO below mop condition need to added added
831
                    fofoOrderItem.setSellingPrice(fim.getAmount());
832
                }
23973 govind 833
 
33213 tejus.loha 834
            } else {
835
                fofoOrderItem.setSellingPrice(fim.getAmount());
836
                LOGGER.info("fofoOrderItem1" + fofoOrderItem);
27819 tejbeer 837
 
33213 tejus.loha 838
            }
839
            LOGGER.info("fofoOrderItem" + fofoOrderItem);
23973 govind 840
 
33213 tejus.loha 841
        }
23973 govind 842
 
33213 tejus.loha 843
        /*
844
         * for (PaymentOptionTransactionModel paymentOptionTransactionModel :
845
         * paymentOptionTransactionModels) { amount = amount +
846
         * paymentOptionTransactionModel.getAmount(); } LOGGER.info("FofoOrder amount" +
847
         * fofoOrder.getUnitPrice() + "amount" + amount); if (amount ==
848
         * fofoOrder.getUnitPrice()) {
849
         */
850
        if (paymentOptionTransactionModels.size() > 0) {
851
            List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
852
                    .selectByReferenceIdAndType(referenceId, PaymentOptionReferenceType.ORDER);
853
            Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
854
                    .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
855
            LOGGER.info(
856
                    "paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
857
            for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
858
                if (paymentOptionIdPaymentOptionTransactionMap
859
                        .containsKey(paymentOptionTransactionModel.getPaymentOptionId())) {
23973 govind 860
 
33213 tejus.loha 861
                    PaymentOptionTransaction paymentOptionTransaction = paymentOptionIdPaymentOptionTransactionMap
862
                            .get(paymentOptionTransactionModel.getPaymentOptionId());
31739 amit.gupta 863
 
33213 tejus.loha 864
                    if (paymentOptionTransactionModel.getAmount() == 0) {
865
                        paymentOptionTransactionRepository.delete(paymentOptionTransaction);
866
                        LOGGER.info("deleted successfully");
867
                    } else {
24844 amit.gupta 868
 
33213 tejus.loha 869
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
870
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
871
                        LOGGER.info("updated successfully");
24281 amit.gupta 872
 
33213 tejus.loha 873
                    }
874
                } else {
875
                    if (paymentOptionTransactionModel.getAmount() > 0) {
876
                        PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
877
                        paymentOptionTransaction.setReferenceId(referenceId);
878
                        paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
879
                        paymentOptionTransaction.setPaymentOptionId(paymentOptionTransactionModel.getPaymentOptionId());
880
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
881
                        paymentOptionTransaction.setFofoId(fofoId);
882
                        paymentOptionTransaction.setCreateTimestamp(fofoOrder.getCreateTimestamp());
883
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
884
                        LOGGER.info("inserted successfully");
885
                    }
886
                }
24281 amit.gupta 887
 
33213 tejus.loha 888
            }
24281 amit.gupta 889
 
33213 tejus.loha 890
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
891
        }
892
        /*
893
         * else
894
         *
895
         * { throw new ProfitMandiBusinessException("Amount", amount,
896
         * "Sum of amount is not equal to total amount"); }
897
         */
23973 govind 898
 
33213 tejus.loha 899
        return "response";
23973 govind 900
 
33213 tejus.loha 901
    }
24105 govind 902
 
33437 ranu 903
    @RequestMapping(value = "/order")
904
    public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model)
33213 tejus.loha 905
            throws ProfitMandiBusinessException {
33437 ranu 906
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
907
 
908
        int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
909
        Address address = addressRepository.selectById(addressId);
910
 
911
        List<CartFofo> cartItems = orderService.cartCheckout(cartData);
912
        Set<Integer> itemIds = new HashSet<>();
913
        List<Integer> poIds = new ArrayList<>();
914
        List<Integer> poItemIds = new ArrayList<>();
915
        for (CartFofo cartFofo : cartItems) {
916
            itemIds.add(cartFofo.getItemId());
917
            if (cartFofo.getPoId() != 0) {
918
                poIds.add(cartFofo.getPoId());
919
                poItemIds.add(cartFofo.getPoItemId());
920
            }
921
        }
922
 
923
        PendingOrder po = null;
924
        Customer customer = null;
925
        PendingOrderItem poi = null;
926
        Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds,
927
                loginDetails.getFofoId());
928
        List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
929
                .selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
930
 
931
        if (!poIds.isEmpty()) {
932
            po = pendingOrderRepository.selectById(poIds.get(0));
933
            customer = customerRepository.selectById(po.getCustomerId());
934
            if (!offlineOrders.contains(po.getPayMethod())) {
935
                paymentOptionIds.add(23);
936
            }
937
        }
938
 
939
        if (!poItemIds.isEmpty()) {
940
            poi = pendingOrderItemRepository.selectById(poItemIds.get(0));
941
        }
942
 
943
        // List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new
944
        // HashSet<>(paymentOptionIds));
945
 
946
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectActiveOption();
947
 
948
        LOGGER.info("pendingOrder" + po);
949
        LOGGER.info("pendingOrderItem" + poi);
950
 
951
        int onlineSellingPrice = 0;
952
        Map<Integer, PendingOrderItem> itemIdAndPoiMap = new HashMap<>();
953
 
954
        if (po != null) {
955
            List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(po.getId());
956
            if (!(po.getPayMethod().equals("EMIOD") || po.getPayMethod().equals("POD"))) {
957
                for (CartFofo cartItem : cartItems) {
958
                    PendingOrderItem pendingOItem = pendingOrderItemRepository.selectById(cartItem.getPoItemId());
959
                    PendingOrderPlan pendingOrderPlan = pendingOrderPlanRepository.selectByPoid(cartItem.getPoItemId());
960
                    if (pendingOrderPlan != null) {
961
                        onlineSellingPrice += pendingOItem.getSellingPrice() * pendingOItem.getQuantity() + pendingOrderPlan.getPremiumPrice() * pendingOItem.getQuantity();
962
                    } else {
963
                        onlineSellingPrice += pendingOItem.getSellingPrice() * pendingOItem.getQuantity();
964
                    }
965
                }
966
            }
967
 
968
            itemIdAndPoiMap = pendingOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> pendingOrderItemRepository.selectById(x.getId())));
969
        }
970
 
33795 ranu 971
 
972
//        get the list of customer item for every item code start here
973
//        ...............................................................
974
 
975
        List<Map<Integer, List<CustomerOfferItem>>> itemOfferItemMapList = new ArrayList<>();
976
 
977
 
978
        LocalDateTime todayDate = LocalDateTime.now();
979
        LocalDate todayDate2 = LocalDate.now();
980
 
981
        Map<Integer, List<CustomerOfferItem>> offerItemMap = new HashMap<>();
982
        Map<Integer, List<WebOffer>> webOfferMap = new HashMap<>();
983
 
984
        List<CustomerOffer> customerOffers = customerOfferRepository.selectOffersByDate(todayDate);
985
        List<Integer> customerOfferIds = customerOffers.stream().map(x -> x.getId()).distinct().collect(Collectors.toList());
986
        for (CartFofo cartItem : cartItems) {
987
            Item item = itemRepository.selectById(cartItem.getItemId());
33907 amit.gupta 988
            if (customerOfferIds.size() > 0) {
33795 ranu 989
 
33907 amit.gupta 990
                List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferIds(customerOfferIds, item.getCatalogItemId(), todayDate2);
33795 ranu 991
 
33907 amit.gupta 992
                List<CustomerOfferItem> filteredCustomerOfferItems = customerOfferItems.stream()
993
                        .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate2))
994
                        .collect(Collectors.toList());
33795 ranu 995
 
33907 amit.gupta 996
                offerItemMap.put(item.getId(), filteredCustomerOfferItems);
997
            }
33818 ranu 998
 
33907 amit.gupta 999
 
33795 ranu 1000
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(item.getCatalogItemId());
1001
            webOfferMap.put(item.getId(), webOffers);
1002
        }
1003
 
1004
//        get the list of customer item for every item code end here
1005
//        ...............................................................
1006
 
33437 ranu 1007
        LOGGER.info("itemIdAndPoiMap {}", itemIdAndPoiMap);
1008
        LOGGER.info("mopPriceMap {}", mopPriceMap);
1009
        model.addAttribute("stateNames",
1010
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
1011
        model.addAttribute("retailerStateName", address.getState());
1012
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1013
        model.addAttribute("pendingPO", gson.toJson(po));
1014
 
1015
        model.addAttribute("cartItems", cartItems);
1016
        model.addAttribute("pendingOrder", po);
1017
        model.addAttribute("pendingOrderItem", poi);
1018
        model.addAttribute("itemIdAndPoiMap", itemIdAndPoiMap);
1019
        model.addAttribute("onlineSellingPrice", onlineSellingPrice);
1020
 
1021
        model.addAttribute("mopPriceMap", mopPriceMap);
1022
        model.addAttribute("paymentOptions", paymentOptions);
1023
        model.addAttribute("accessoriesDeals", accessoriesDeals);
33795 ranu 1024
        model.addAttribute("offerItemMap", offerItemMap);
1025
        model.addAttribute("webOfferMap", webOfferMap);
33437 ranu 1026
        return "order-index";
1027
    }
1028
 
1029
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId, int poiId)
1030
            throws ProfitMandiBusinessException {
33213 tejus.loha 1031
        try {
33437 ranu 1032
            Map<String, List<MobileInsurancePlan>> productDurationPlans = new HashMap<>();
1033
            PendingOrderPlan pendingOrderPlan = null;
1034
            if (poiId > 0) {
1035
                pendingOrderPlan = pendingOrderPlanRepository.selectByPoid(poiId);
1036
            }
1037
            if (pendingOrderPlan != null) {
33715 ranu 1038
                MobileInsurancePlan productDurationPlan = insuranceService.getPlanById(String.valueOf(pendingOrderPlan.getPlanId()), sellingPrice);
33437 ranu 1039
                productDurationPlans.put(pendingOrderPlan.getPlanName(), Collections.singletonList(productDurationPlan));
1040
 
1041
            } else {
1042
                productDurationPlans = insuranceService.getAllPlans(itemId,
1043
                        sellingPrice, false);
1044
            }
1045
 
33213 tejus.loha 1046
            return productDurationPlans;
1047
        } catch (Exception e) {
1048
            LOGGER.info(e, e);
1049
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance",
1050
                    "Could not fetch insurance Plans");
1051
        }
24105 govind 1052
 
33213 tejus.loha 1053
    }
23973 govind 1054
 
33795 ranu 1055
 
1056
    @GetMapping("/getItemWiseUpgradeOffer")
1057
    public String getItemWiseUpgradeOffer(HttpServletRequest request, @RequestParam int itemId, Model model)
1058
            throws ProfitMandiBusinessException {
1059
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1060
 
1061
        Item item = itemRepository.selectById(itemId);
1062
 
1063
        LocalDateTime todayDate = LocalDateTime.now();
1064
        LocalDate todayDate2 = LocalDate.now();
1065
 
1066
        List<CustomerOffer> customerOffers = customerOfferRepository.selectOffersByDate(todayDate);
1067
        Map<Integer, CustomerOffer> customerOfferMap = customerOffers.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1068
        List<Integer> customerOfferIds = customerOffers.stream().map(x -> x.getId()).distinct().collect(Collectors.toList());
1069
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferIds(customerOfferIds, item.getCatalogItemId(), todayDate2);
1070
 
33818 ranu 1071
        List<CustomerOfferItem> filteredCustomerOfferItems = customerOfferItems.stream()
33822 ranu 1072
                .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate2))
33818 ranu 1073
                .collect(Collectors.toList());
1074
 
33795 ranu 1075
        List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(item.getCatalogItemId());
1076
 
1077
        model.addAttribute("webOffers", webOffers);
1078
        model.addAttribute("customerOfferMap", customerOfferMap);
33818 ranu 1079
        model.addAttribute("customerOfferItems", filteredCustomerOfferItems);
33795 ranu 1080
 
1081
        return "upgrade-customer-offer-model";
1082
    }
1083
 
33213 tejus.loha 1084
    @GetMapping("/insuranceDetails")
1085
    public String getInsuranceDetails(HttpServletRequest request,
1086
                                      @RequestParam(name = "offset", defaultValue = "0") int offset,
1087
                                      @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1088
            throws ProfitMandiBusinessException {
1089
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1090
        long size = 0;
1091
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
1092
                offset, limit);
1093
        size = insurancePolicyRepository.selectCountByRetailerId(loginDetails.getFofoId());
1094
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
1095
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
1096
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
1097
        if (size < limit) {
1098
            model.addAttribute("end", offset + size);
1099
        } else {
1100
            model.addAttribute("end", offset + limit);
1101
        }
1102
        model.addAttribute("start", offset + 1);
1103
        model.addAttribute("size", size);
1104
        model.addAttribute("insurancePolicies", insurancePolicies);
1105
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
1106
        return "insurance-details";
1107
    }
28339 tejbeer 1108
 
33213 tejus.loha 1109
    @GetMapping("/insuranceDetailsPaginated")
1110
    public String getInsuranceDetailsPaginated(HttpServletRequest request,
1111
                                               @RequestParam(name = "offset", defaultValue = "0") int offset,
1112
                                               @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1113
            throws ProfitMandiBusinessException {
1114
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1115
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
1116
                offset, limit);
1117
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
1118
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
1119
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
1120
        model.addAttribute("insurancePolicies", insurancePolicies);
1121
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
1122
        return "insurance-details-paginated";
1123
    }
23973 govind 1124
 
33213 tejus.loha 1125
    @GetMapping("/getMouForm")
1126
    public String getMouForm(HttpServletRequest request, Model model) throws Exception {
1127
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 1128
 
33213 tejus.loha 1129
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
1130
        if (mou != null) {
1131
            if (mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
1132
                model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1133
            } else {
1134
                model.addAttribute("response1", mvcResponseSender.createResponseString(false));
1135
            }
32238 amit.gupta 1136
 
33213 tejus.loha 1137
        } else {
1138
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
32238 amit.gupta 1139
 
33213 tejus.loha 1140
        }
1141
        return "response";
32238 amit.gupta 1142
 
33213 tejus.loha 1143
    }
23973 govind 1144
 
33213 tejus.loha 1145
    @GetMapping("/pendingOrders")
1146
    public String getPendingOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1147
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1148
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1149
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
1150
        if (mou == null) {
1151
            mou = new Mou();
1152
            mou.setFofoId(loginDetails.getFofoId());
1153
            mou.setCreateTimestamp(LocalDateTime.now());
1154
            mou.setUpdateTimestamp(LocalDateTime.now());
1155
            mouRepository.persist(mou);
1156
        } else if (!mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
1157
            mou.setUpdateTimestamp(LocalDateTime.now());
1158
        }
24844 amit.gupta 1159
 
33213 tejus.loha 1160
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.PROCESSING,
1161
                loginDetails.getFofoId());
23973 govind 1162
 
34387 vikas.jang 1163
        Map<String, List<PendingOrderPlan>> pendingOrderPlansMap = pendingOrderPlanRepository.selectAll().stream()
1164
                .collect(Collectors.groupingBy(PendingOrderPlan::getPlanId));
33213 tejus.loha 1165
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, loginDetails.getFofoId());
1166
        model.addAttribute("inventoryMap", map.get("inventoryMap"));
33437 ranu 1167
        model.addAttribute("pendingOrderPlansMap", pendingOrderPlansMap);
33213 tejus.loha 1168
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
23973 govind 1169
 
33213 tejus.loha 1170
        model.addAttribute("isAdmin", isAdmin);
1171
        return "pending_fofo_order";
25092 amit.gupta 1172
 
33213 tejus.loha 1173
    }
25092 amit.gupta 1174
 
33400 ranu 1175
    @RequestMapping(value = "/create-order", method = RequestMethod.POST)
1176
    public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest,
34194 ranu 1177
                              Model model) throws Exception {
33400 ranu 1178
        // throw new ProfitMandiBusinessException("Billing is on hold temporarily",
1179
        // "Billing is on hold temporarily", "Billing is on hold temporarily");
1180
        LOGGER.info("request at uri {}", request.getRequestURI());
1181
        LOGGER.info("request body {}", createOrderRequest);
1182
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1183
        int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId(), accessoriesDeals);
34479 tejus.loha 1184
//        try {
1185
//            scratchService.processScratchOffer(fofoOrderId, createOrderRequest.getPaymentOptions(), createOrderRequest.getFofoOrderItems());
1186
//        } catch (Exception e) {
1187
//            LOGGER.info("Exception during processScratchOffer - " + e.getMessage());
1188
//        }
1189
 
34179 tejus.loha 1190
        LOGGER.info("Order has been created successfully...");
33400 ranu 1191
        return "redirect:/get-order/?orderId=" + fofoOrderId;
1192
    }
1193
 
33213 tejus.loha 1194
    @GetMapping("/billedOrders")
1195
    public String getBilledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1196
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1197
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
25092 amit.gupta 1198
 
33400 ranu 1199
        List<PendingOrderItem> pendingOrderItems;
23973 govind 1200
 
33213 tejus.loha 1201
        if (isAdmin) {
27861 tejbeer 1202
 
33400 ranu 1203
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.BILLED);
27861 tejbeer 1204
 
33213 tejus.loha 1205
        } else {
33400 ranu 1206
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.BILLED,
33213 tejus.loha 1207
                    loginDetails.getFofoId());
33400 ranu 1208
 
1209
 
33213 tejus.loha 1210
        }
27861 tejbeer 1211
 
33400 ranu 1212
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, loginDetails.getFofoId());
1213
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
27861 tejbeer 1214
 
33213 tejus.loha 1215
        model.addAttribute("isAdmin", isAdmin);
1216
        return "billed_order_item";
1217
    }
27861 tejbeer 1218
 
33213 tejus.loha 1219
    @GetMapping("/settledOrders")
1220
    public String getSettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1221
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1222
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27861 tejbeer 1223
 
33213 tejus.loha 1224
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1225
 
33213 tejus.loha 1226
        if (isAdmin) {
24105 govind 1227
 
33213 tejus.loha 1228
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.SETTLED);
24105 govind 1229
 
33213 tejus.loha 1230
        } else {
1231
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.SETTLED,
1232
                    loginDetails.getFofoId());
1233
        }
24105 govind 1234
 
33213 tejus.loha 1235
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
24105 govind 1236
 
33400 ranu 1237
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
33213 tejus.loha 1238
        model.addAttribute("isAdmin", isAdmin);
1239
        return "settled_order_item";
1240
    }
27861 tejbeer 1241
 
33213 tejus.loha 1242
    @GetMapping("/unsettledOrders")
1243
    public String getunsettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1244
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1245
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
24105 govind 1246
 
33213 tejus.loha 1247
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1248
 
33213 tejus.loha 1249
        if (isAdmin) {
24105 govind 1250
 
33213 tejus.loha 1251
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.UNSETTLED);
27861 tejbeer 1252
 
33213 tejus.loha 1253
        } else {
1254
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.UNSETTLED,
1255
                    loginDetails.getFofoId());
1256
        }
24440 amit.gupta 1257
 
33213 tejus.loha 1258
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
25726 amit.gupta 1259
 
33400 ranu 1260
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
33213 tejus.loha 1261
        model.addAttribute("isAdmin", isAdmin);
1262
        return "unsettled_order_item";
1263
    }
24880 govind 1264
 
33213 tejus.loha 1265
    @GetMapping("/getPendingOrderItem")
1266
    public String getPendingOrderItem(HttpServletRequest request, @RequestParam int orderId, Model model)
1267
            throws ProfitMandiBusinessException {
1268
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1269
        Map<Integer, Item> itemMap = new HashMap<>();
1270
        Map<Integer, CurrentInventorySnapshot> inventoryMap = new HashMap<>();
1271
        PendingOrder pendingPO = pendingOrderRepository.selectById(orderId);
1272
        Customer customer = customerRepository.selectById(pendingPO.getCustomerId());
1273
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(orderId);
1274
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1275
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1276
            CurrentInventorySnapshot cis = currentInventorySnapshotRepository
1277
                    .selectByItemAndFofoId(pendingOrderItem.getItemId(), pendingPO.getFofoId());
1278
            itemMap.put(pendingOrderItem.getItemId(), item);
1279
            LOGGER.info("cis" + cis);
1280
            inventoryMap.put(pendingOrderItem.getItemId(), cis);
1281
        }
28339 tejbeer 1282
 
33213 tejus.loha 1283
        LOGGER.info("inventoryMap" + inventoryMap);
1284
        model.addAttribute("pendingOrderItems", pendingOrderItems);
1285
        model.addAttribute("itemMap", itemMap);
1286
        model.addAttribute("inventoryMap", inventoryMap);
1287
        model.addAttribute("pendingPO", gson.toJson(pendingPO));
1288
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1289
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1290
        return "pending-order-item";
1291
    }
28339 tejbeer 1292
 
33213 tejus.loha 1293
    @RequestMapping(value = "/getPendingOrderItemById", method = RequestMethod.GET)
1294
    public String getPendingOrderItemById(HttpServletRequest request, @RequestParam int id, Model model)
1295
            throws Exception {
27046 tejbeer 1296
 
33213 tejus.loha 1297
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1298
        model.addAttribute("pendingOrderItem", pendingOrderItem);
1299
        return "cancel-pending-order";
1300
    }
27046 tejbeer 1301
 
33213 tejus.loha 1302
    @RequestMapping(value = "/getPendingOrderChangePartnerById", method = RequestMethod.GET)
33367 ranu 1303
    public String getPendingOrderChangePartnerById(HttpServletRequest request, @RequestParam int id, @RequestParam String pinCode, Model model)
33213 tejus.loha 1304
            throws Exception {
28350 tejbeer 1305
 
33213 tejus.loha 1306
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
33374 ranu 1307
        Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(true);
33213 tejus.loha 1308
        model.addAttribute("customRetailersMap", customRetailersMap);
1309
        model.addAttribute("pendingOrder", pendingOrder);
1310
        return "change-partner-po";
1311
    }
28358 tejbeer 1312
 
33213 tejus.loha 1313
    @RequestMapping(value = "/changePendingOrderPartner", method = RequestMethod.POST)
1314
    public String changePendingOrderPartner(HttpServletRequest request, @RequestParam int id, @RequestParam int fofoId,
1315
                                            Model model) throws Exception {
28350 tejbeer 1316
 
33213 tejus.loha 1317
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1318
        pendingOrder.setFofoId(fofoId);
1319
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1320
 
33213 tejus.loha 1321
        return "response";
1322
    }
28339 tejbeer 1323
 
33213 tejus.loha 1324
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
1325
    public String cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String reason,
1326
                                         Model model) throws Exception {
28339 tejbeer 1327
 
33213 tejus.loha 1328
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1329
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
28339 tejbeer 1330
 
33213 tejus.loha 1331
        pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1332
        pendingOrderItem.setStatusDescription(loginDetails.getEmailId());
1333
        pendingOrderItem.setRemark(reason);
1334
        pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1335
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
27046 tejbeer 1336
 
33213 tejus.loha 1337
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1338
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1339
 
33213 tejus.loha 1340
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
26647 tejbeer 1341
 
33213 tejus.loha 1342
        List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1343
 
33213 tejus.loha 1344
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1345
        pendingOrderItem.setItemName(item.getItemDescription());
1346
        catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1347
 
33213 tejus.loha 1348
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1349
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1350
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1351
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1352
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28339 tejbeer 1353
 
33213 tejus.loha 1354
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1355
 
33213 tejus.loha 1356
        Map<String, Object> emailModel = new HashMap<>();
1357
        emailModel.put("customer", customerAddress);
1358
        emailModel.put("pendingOrder", pendingOrder);
1359
        emailModel.put("date", dateTimeFormatter);
1360
        LOGGER.info("emal" + customer.getEmailId());
1361
        String[] customerEmail = null;
1362
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1363
            customerEmail = new String[]{customer.getEmailId()};
28339 tejbeer 1364
 
34211 vikas.jang 1365
            List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
28339 tejbeer 1366
 
33213 tejus.loha 1367
            emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel,
1368
                    customerEmail, null, bccTo.toArray(new String[0]));
28339 tejbeer 1369
 
33213 tejus.loha 1370
        }
28339 tejbeer 1371
 
33213 tejus.loha 1372
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1373
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1374
                && !status.contains(OrderStatus.CLAIMED)) {
1375
            pendingOrder.setStatus(OrderStatus.CLOSED);
1376
        }
1377
        pendingOrderItemRepository.persist(pendingOrderItem);
28339 tejbeer 1378
 
33213 tejus.loha 1379
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1380
 
33213 tejus.loha 1381
        return "response";
1382
    }
28339 tejbeer 1383
 
33400 ranu 1384
    @GetMapping("/claimedOrders")
1385
    public String getclaimedOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
33213 tejus.loha 1386
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
33400 ranu 1387
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1388
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1389
                .collect(Collectors.toList());
28339 tejbeer 1390
 
33400 ranu 1391
        List<PendingOrderItem> pendingOrderItem = null;
28339 tejbeer 1392
 
33400 ranu 1393
        if (isAdmin) {
28339 tejbeer 1394
 
33400 ranu 1395
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.CLAIMED);
1396
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28339 tejbeer 1397
 
33400 ranu 1398
            Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1399
                    .filter(x -> x != null).collect(Collectors.toList()).stream()
1400
                    .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1401
            model.addAttribute("customRetailersMap", customRetailersMap);
28339 tejbeer 1402
 
33400 ranu 1403
        } else {
1404
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.CLAIMED,
1405
                    loginDetails.getFofoId());
1406
        }
30426 tejbeer 1407
 
33400 ranu 1408
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
28339 tejbeer 1409
 
33400 ranu 1410
        model.addAttribute("pendingOrderItems", map.get("pendingOrderItems"));
1411
        model.addAttribute("isAdmin", isAdmin);
1412
        return "claim_raised_order_item";
33213 tejus.loha 1413
    }
27046 tejbeer 1414
 
33213 tejus.loha 1415
    @RequestMapping(value = "/raiseClaimOrderItem", method = RequestMethod.POST)
1416
    public String raiseClaimOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28352 tejbeer 1417
 
33213 tejus.loha 1418
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1419
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1420
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28437 tejbeer 1421
 
33213 tejus.loha 1422
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1423
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1424
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
28437 tejbeer 1425
 
33213 tejus.loha 1426
        }
1427
        pendingOrderItemRepository.persist(pendingOrderItem);
1428
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28437 tejbeer 1429
 
33213 tejus.loha 1430
        return "response";
1431
    }
28437 tejbeer 1432
 
33213 tejus.loha 1433
    @RequestMapping(value = "/verifyOrderItem", method = RequestMethod.POST)
1434
    public String verifyOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28437 tejbeer 1435
 
33213 tejus.loha 1436
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1437
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1438
        pendingOrderItem.setVerifiedTimestamp(LocalDateTime.now());
28352 tejbeer 1439
 
33213 tejus.loha 1440
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1441
 
33213 tejus.loha 1442
        return "response";
1443
    }
26721 tejbeer 1444
 
33213 tejus.loha 1445
    @RequestMapping(value = "/cancelOrderByInvoice", method = RequestMethod.POST)
1446
    public String cancelOrder(HttpServletRequest request, @RequestParam List<String> invoiceNumbers, Model model)
1447
            throws Exception {
1448
        orderService.cancelOrder(invoiceNumbers);
1449
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1450
 
33213 tejus.loha 1451
        return "response";
1452
    }
28352 tejbeer 1453
 
33213 tejus.loha 1454
    @RequestMapping(value = "/getOnlineOrder", method = RequestMethod.GET)
1455
    public String cancelOrder(HttpServletRequest request, Model model) throws Exception {
1456
        return "online-order";
1457
    }
28352 tejbeer 1458
 
33400 ranu 1459
    @RequestMapping(value = "/deliveredPendingOrderItem", method = RequestMethod.POST)
1460
    public String deliveredPendingOrderItem(HttpServletRequest request, @RequestParam(name = "id") int pendingOrderItemId, Model model)
1461
            throws Exception {
1462
 
1463
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1464
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(pendingOrderItemId);
1465
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1466
 
1467
        //Prepaid payment successful
1468
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1469
            //pendingOrderItem.setStatus(OrderStatus.UNSETTLED);
1470
//            pendingOrderItem.setSettled(false);
1471
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1472
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
1473
        } else {
1474
            pendingOrderItem.setStatus(OrderStatus.SETTLED);
1475
        }
1476
        pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
1477
 
1478
        List<OrderStatus> pendingOrderItemStatusList = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1479
                .map(x -> x.getStatus()).collect(Collectors.toList());
1480
 
1481
        List<Integer> catalogIds = new ArrayList<>();
1482
 
1483
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1484
        pendingOrderItem.setItemName(item.getItemDescription());
1485
        catalogIds.add(item.getCatalogItemId());
1486
 
1487
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1488
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1489
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1490
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1491
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
1492
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
1493
        Map<String, Object> emailModel = new HashMap<>();
1494
        emailModel.put("customer", customerAddress);
1495
        emailModel.put("pendingOrder", pendingOrder);
1496
        emailModel.put("date", dateTimeFormatter);
1497
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1498
        String[] customerEmail = null;
1499
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1500
            customerEmail = new String[]{customer.getEmailId()};
34211 vikas.jang 1501
            List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
33400 ranu 1502
 
1503
            emailService.sendMailWithAttachments("Order Delivered with SmartDukaan", "order-delivered.vm", emailModel,
1504
                    customerEmail, null, bccTo.toArray(new String[0]));
1505
 
1506
        }
1507
        if (!pendingOrderItemStatusList.contains(OrderStatus.PENDING) && !pendingOrderItemStatusList.contains(OrderStatus.PROCESSING)
1508
                && !pendingOrderItemStatusList.contains(OrderStatus.BILLED) && !pendingOrderItemStatusList.contains(OrderStatus.UNSETTLED)
1509
                && !pendingOrderItemStatusList.contains(OrderStatus.CLAIMED)) {
1510
            pendingOrder.setStatus(OrderStatus.CLOSED);
1511
        }
1512
        pendingOrderItemRepository.persist(pendingOrderItem);
1513
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1514
 
1515
        return "response";
1516
    }
1517
 
33213 tejus.loha 1518
    @GetMapping("/getAllOrdersByStatus")
1519
    public String getAllOrdersByStatus(HttpServletRequest request, @RequestParam OrderStatus status,
1520
                                       @RequestParam(required = false) LocalDateTime startTime,
1521
                                       @RequestParam(required = false) LocalDateTime endTime, Model model) throws ProfitMandiBusinessException {
1522
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1523
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
33437 ranu 1524
        boolean isAccountsL2AndL3 = false;
33400 ranu 1525
        if (isAdmin) {
1526
            AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1527
            List<Position> positions = positionRepository.selectPositionByAuthId(authUser.getId());
1528
            for (Position position : positions) {
33437 ranu 1529
                if (((position.getEscalationType().equals(EscalationType.L2) || position.getEscalationType().equals(EscalationType.L3))
33400 ranu 1530
                        && position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS)) {
33437 ranu 1531
                    isAccountsL2AndL3 = true;
33400 ranu 1532
                    break;
1533
                }
1534
            }
1535
        }
1536
 
33213 tejus.loha 1537
        LOGGER.info("startTime {}", startTime);
1538
        LOGGER.info("endTime {}", endTime);
28352 tejbeer 1539
 
33213 tejus.loha 1540
        List<PendingOrderItem> pendingOrderItems;
1541
        if (startTime == null) {
33367 ranu 1542
            LocalDate date = LocalDate.now().minusDays(15);
1543
            if (status.equals(OrderStatus.PENDING)) {
1544
                pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(Collections.singletonList(status), date.atStartOfDay(), LocalDateTime.now());
1545
            } else {
1546
                pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(status);
1547
            }
1548
 
33213 tejus.loha 1549
        } else {
1550
            List<OrderStatus> statusList = new ArrayList<>();
1551
            if (status.equals(OrderStatus.DELIVERED)) {
1552
                statusList.add(OrderStatus.SETTLED);
1553
                statusList.add(OrderStatus.UNSETTLED);
1554
            } else {
1555
                statusList.add(status);
1556
            }
1557
            pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(statusList,
1558
                    startTime.toLocalDate().atStartOfDay(), endTime);
1559
        }
28352 tejbeer 1560
 
33213 tejus.loha 1561
        List<Integer> pendingOrderIds = pendingOrderItems.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
28352 tejbeer 1562
 
33213 tejus.loha 1563
        List<Integer> fofoIds = pendingOrderRepository.selectByIds(pendingOrderIds)
1564
                .stream().map(x -> x.getFofoId()).distinct().collect(Collectors.toList());
28356 tejbeer 1565
 
33213 tejus.loha 1566
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28352 tejbeer 1567
 
33213 tejus.loha 1568
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1569
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1570
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1571
        model.addAttribute("customRetailersMap", customRetailersMap);
28352 tejbeer 1572
 
33213 tejus.loha 1573
        LOGGER.info("customRetailersMap {}", customRetailersMap);
28339 tejbeer 1574
 
33213 tejus.loha 1575
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, 0);
32697 ranu 1576
 
33213 tejus.loha 1577
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
1578
        model.addAttribute("partnerInventoryMap", map.get("partnerInventoryMap"));
32697 ranu 1579
 
33213 tejus.loha 1580
        model.addAttribute("isAdmin", isAdmin);
33437 ranu 1581
        model.addAttribute("isAccountsL2AndL3", isAccountsL2AndL3);
33213 tejus.loha 1582
        return "online-order-item";
1583
    }
32697 ranu 1584
 
33400 ranu 1585
    @RequestMapping(value = "/onlinePaymentAddToPartnerWallet", method = RequestMethod.POST)
1586
    public String onlinePaymentAddToPartnerWallet(HttpServletRequest request, @RequestParam int id,
1587
                                                  Model model) throws Exception {
1588
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1589
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1590
        int fofoId = pendingOrder.getFofoId();
1591
        double deductionPayment = (pendingOrderItem.getSellingPrice() * 2.36) / 100;
1592
        walletService.addAmountToWallet(fofoId, id, WalletReferenceType.ONLINE_ORDER_PAYMENT, "Online Order Payment", pendingOrderItem.getSellingPrice(), LocalDateTime.now());
1593
        walletService.consumeAmountFromWallet(fofoId, id,
1594
                WalletReferenceType.ONLINE_GATEWAY_FEE, "Payment Gatewayfee", (float) deductionPayment, LocalDateTime.now());
1595
 
1596
        pendingOrderItem.setStatus(OrderStatus.CLOSED);
1597
        pendingOrder.setStatus(OrderStatus.CLOSED);
1598
 
1599
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1600
 
1601
        return "response";
1602
    }
1603
 
33213 tejus.loha 1604
    //TODO Tejus
1605
    @RequestMapping(value = "/getBulkOrder")
33336 tejus.loha 1606
    public String getBulkOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException, MessagingException, IOException {
33213 tejus.loha 1607
        return "bulk-order";
1608
    }
32697 ranu 1609
 
33213 tejus.loha 1610
    @PostMapping(value = "/bulkOrder/upload")
1611
    public String uploadCatalog(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model)
1612
            throws Exception {
1613
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1614
        int authId = authRepository.selectByEmailOrMobile(fofoDetails.getEmailId()).getId();
1615
        LOGGER.info("authId - {}", authId);
1616
        bulkOrderService.parseBulkOrders(file, authId);
1617
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1618
        return "response";
1619
    }
32697 ranu 1620
 
33213 tejus.loha 1621
    // This method is use for sending all pending transaction to Transation Approval menu
1622
    @RequestMapping(value = "/transaction/pendingApprovals", method = RequestMethod.GET)
1623
    public String getTransactionApproval(HttpServletRequest request, Model model) throws Exception {
33219 tejus.loha 1624
        List<TransactionApproval> transactionApprovals = transactionApprovalRepository.selectAllPending();
1625
        LOGGER.info("list of Approval transaction Id " + transactionApprovals);
33336 tejus.loha 1626
        List<TransactionApprovalModel> approvalModelList = bulkOrderService.getAllPendingTransactionApproval();
33213 tejus.loha 1627
        model.addAttribute("approvalModelList", approvalModelList);
1628
        return "transaction/transaction-approvals";
1629
    }
33092 tejus.loha 1630
 
33213 tejus.loha 1631
    @RequestMapping(value = "transaction/approval", method = RequestMethod.PUT)
1632
    public String transactionApproval(HttpServletRequest request, Model model,
1633
                                      @RequestParam int transactionId,
1634
                                      @RequestParam String remark,
1635
                                      @RequestParam TransactionApprovalStatus transactionApprovalStatus
1636
    ) throws Exception {
1637
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1638
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1639
        int approvalId = authUser.getId();
1640
        String approvedBy = authUser.getFullName();
1641
        LocalDateTime approvedOn = LocalDateTime.now();
1642
        this.updateApprovalStatus(transactionId, approvalId, approvedBy, approvedOn, remark, transactionApprovalStatus);
1643
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1644
        return "response";
1645
 
1646
    }
1647
 
33696 amit.gupta 1648
 
33213 tejus.loha 1649
    private void updateApprovalStatus(int transactionId, int approvalId, String approvedBy, LocalDateTime approvedOn, String remark, TransactionApprovalStatus transactionApprovalStatus) throws Exception {
1650
        TransactionApproval transactionApproval = transactionApprovalRepository.selectById(transactionId);
33336 tejus.loha 1651
        int retailerId = transactionRepository.selectById(transactionId).getRetailerId();
33213 tejus.loha 1652
        if (!transactionApproval.getStatus().equals(TransactionApprovalStatus.PENDING)) {
1653
            throw new ProfitMandiBusinessException("Transaction already Processed", "Transaction already Processed", "Transaction already Processed");
1654
        }
1655
        transactionApproval.setStatus(transactionApprovalStatus);
1656
        transactionApproval.setRemark(remark);
1657
        transactionApproval.setApprovalId(approvalId);
1658
        transactionApproval.setApprovedBy(approvedBy);
1659
        transactionApproval.setApprovedOn(approvedOn);
1660
        if (transactionApprovalStatus.equals(TransactionApprovalStatus.APPROVED)) {
34313 ranu 1661
            transactionService.processTransaction(transactionId, 0);
33336 tejus.loha 1662
        } else {
1663
            float totalAmount = 0;
1664
            // referense id = transaction id
1665
            // here refund the amount of an order
1666
            List<UserWalletHistory> uwhList = walletService.getAllByReference(retailerId, transactionId, WalletReferenceType.PURCHASE);
33687 amit.gupta 1667
            //Refund only if any amount is deducted from wallet for that particular Transaction
33696 amit.gupta 1668
            if (uwhList.size() > 0) {
33687 amit.gupta 1669
                totalAmount = -uwhList.get(0).getAmount();
1670
                walletService.refundToWallet(retailerId, totalAmount, transactionId, WalletReferenceType.PURCHASE, "Order canceled");
34733 amit.gupta 1671
                sdCreditService.settleBlockedLoan(transactionId, totalAmount);
33687 amit.gupta 1672
            }
33213 tejus.loha 1673
        }
1674
    }
1675
 
1676
    @RequestMapping(value = "/bulkOrderTemplate", method = RequestMethod.GET)
1677
    public ResponseEntity<?> bulkOrderTemplate() throws Exception {
1678
        List<List<?>> rows = new ArrayList<>();
1679
        rows.add(Arrays.asList("Mahaveer", "Change description for your reference", "175139287", "28264", "0", "4"));
1680
        rows.add(Arrays.asList("Mahaveer", "Price =0 means system price", "175139287", "28268", "0", "7"));
1681
        rows.add(Arrays.asList("Jas", "You give custom price also ", "171273247", "28264", "300", "3"));
1682
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1683
                .getCSVByteStream(Arrays.asList("Partner name", "Description", "Partner Id", "Item Id", "Price", "Quantity"), rows);
1684
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Bulk order template");
1685
 
1686
        return responseEntity;
1687
 
1688
    }
34168 tejus.loha 1689
 
1690
    @Autowired
1691
    EInvoiceDetailsRepository eInvoiceDetailsRepository;
1692
 
1693
    @GetMapping("/resetIrnGeneratedPanel")
1694
    public String resetIrnGeneratedPanel() {
1695
        return "reset-irn-panel";
1696
    }
1697
 
1698
    @GetMapping("/getTransactionForIrnReset")
1699
    public String getTransactionForIrnReset(@RequestParam String invoiceNumber, Model model) throws Exception {
1700
        List<String> invoiceNumbers = Arrays.asList(invoiceNumber.split(","));
1701
        List<EInvoiceDetails> eInvoiceDetailsList = eInvoiceDetailsRepository.selectByInvoiceNumbers(invoiceNumbers);
1702
        if (invoiceNumbers.size() == eInvoiceDetailsList.size()) {
1703
            model.addAttribute("irnResetOrderModelList", new ArrayList<>());
1704
            model.addAttribute("notEligibleInvoiceNumbers", invoiceNumber);
1705
            return "eligible-irn-reset-orders";
1706
        }
1707
        Set<String> existingInvoiceInEInvoiceDtl = eInvoiceDetailsList.stream().map(x -> x.getInvoiceNumber()).collect(Collectors.toSet());
1708
        List<String> missingInvoiceInEInvoiceDtl = invoiceNumbers.stream().filter(x -> !existingInvoiceInEInvoiceDtl.contains(x)).collect(Collectors.toList());
1709
 
1710
        List<Order> orderList = orderRepository.selectByInvoiceNumbers(missingInvoiceInEInvoiceDtl).stream().filter(x -> x.getIrnGenerated() != null).collect(Collectors.toList());
1711
        Map<String, List<Order>> invoiceMap = orderList.stream().collect(Collectors.groupingBy(x -> x.getInvoiceNumber()));
1712
        Set<String> notEligibleInvoiceNumbers = new HashSet<>();
1713
        notEligibleInvoiceNumbers.addAll(existingInvoiceInEInvoiceDtl);
1714
        List<IrnResetOrderModel> irnResetOrderModelList = new ArrayList<>();
1715
        for (Map.Entry<String, List<Order>> invoiceMapEntry : invoiceMap.entrySet()) {
1716
            String invoice = invoiceMapEntry.getKey();
1717
            List<Order> orders = invoiceMapEntry.getValue();
1718
            boolean isEligible = !orders.isEmpty() && orders.stream().allMatch(x -> x.getBillingTimestamp().toLocalDate().isAfter(LocalDate.now().minusDays(5)) && x.getIrnGenerated() != null);
1719
            if (isEligible) {
1720
                Order order = orders.get(0);
1721
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(order.getRetailerId());
1722
 
1723
                IrnResetOrderModel irnResetOrderModel = new IrnResetOrderModel();
1724
                irnResetOrderModel.setName(partnerOnBoardingPanelRepository.selectByCode(fofoStore.getCode()).getOutLetName());
1725
                irnResetOrderModel.setInvoiceNumber(order.getInvoiceNumber());
1726
                irnResetOrderModel.setInvoiceDate(order.getBillingTimestamp());
1727
                irnResetOrderModel.setWarehouseId(ProfitMandiConstants.WAREHOUSE_MAP.get(order.getWarehouseId()));
1728
                irnResetOrderModel.setTotalOrderValue(orders.stream().mapToDouble(Order::getTotalAmount).sum());
1729
                irnResetOrderModelList.add(irnResetOrderModel);
1730
            } else {
1731
                notEligibleInvoiceNumbers.add(invoice);
1732
            }
1733
        }
1734
        model.addAttribute("irnResetOrderModelList", irnResetOrderModelList);
1735
        model.addAttribute("notEligibleInvoiceNumbers", notEligibleInvoiceNumbers.stream().collect(Collectors.joining(", ")));
1736
        return "eligible-irn-reset-orders";
1737
    }
1738
 
1739
    @PutMapping("/resetOrdersIrn")
1740
    public String resetIrn(@RequestParam String invoiceNumbers, Model model) throws Exception {
1741
        List<String> invoices = new ArrayList<>();
1742
        if (!invoiceNumbers.isEmpty()) {
1743
            invoices = Arrays.asList(invoiceNumbers.split(","));
1744
        }
1745
        List<Order> orderList = orderRepository.selectByInvoiceNumbers(invoices);
1746
        orderList.forEach(order -> {
1747
            order.setIrnGenerated(null);
1748
        });
1749
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1750
        return "response";
1751
    }
34179 tejus.loha 1752
 
34474 aman.kumar 1753
    @PutMapping(value = "/sendInvoiceOnWhatsApp")
1754
    public String sendInvoiceOnWhatsApp(HttpServletRequest request, @RequestParam int orderId, @RequestParam String whatsAppMobile, Model model) throws Exception {
1755
        boolean isSend = this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(orderId), whatsAppMobile);
1756
        model.addAttribute("response1", isSend);
34179 tejus.loha 1757
        return "response";
1758
    }
1759
 
1760
 
32409 amit.gupta 1761
}
32405 jai.hind 1762