Subversion Repositories SmartDukaan

Rev

Rev 32697 | Rev 32711 | 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;
30162 manish 8
import com.spice.profitmandi.common.util.FileUtil;
31459 amit.gupta 9
import com.spice.profitmandi.common.util.FormattingUtils;
21689 ashik.ali 10
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 11
import com.spice.profitmandi.common.util.StringUtils;
22244 ashik.ali 12
import com.spice.profitmandi.common.web.util.ResponseSender;
23638 amit.gupta 13
import com.spice.profitmandi.dao.entity.catalog.Item;
27861 tejbeer 14
import com.spice.profitmandi.dao.entity.catalog.TagListing;
22217 ashik.ali 15
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
23343 ashik.ali 16
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
23548 ashik.ali 17
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
30322 amit.gupta 18
import com.spice.profitmandi.dao.entity.fofo.*;
23298 ashik.ali 19
import com.spice.profitmandi.dao.entity.user.Address;
23548 ashik.ali 20
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
27046 tejbeer 21
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
30322 amit.gupta 22
import com.spice.profitmandi.dao.model.*;
23638 amit.gupta 23
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
27861 tejbeer 24
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
30322 amit.gupta 25
import com.spice.profitmandi.dao.repository.dtr.*;
26
import com.spice.profitmandi.dao.repository.fofo.*;
24440 amit.gupta 27
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
30162 manish 28
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
23298 ashik.ali 29
import com.spice.profitmandi.dao.repository.user.AddressRepository;
28377 tejbeer 30
import com.spice.profitmandi.service.EmailService;
32251 amit.gupta 31
import com.spice.profitmandi.service.NotificationService;
23798 amit.gupta 32
import com.spice.profitmandi.service.authentication.RoleManager;
25726 amit.gupta 33
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
24440 amit.gupta 34
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
23366 ashik.ali 35
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 36
import com.spice.profitmandi.service.pricing.PricingService;
26647 tejbeer 37
import com.spice.profitmandi.service.user.RetailerService;
32405 jai.hind 38
import com.spice.profitmandi.service.whatsapp.WhatsappMessageService;
22139 amit.gupta 39
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 40
import com.spice.profitmandi.web.util.CookiesProcessor;
24105 govind 41
import com.spice.profitmandi.web.util.MVCResponseSender;
30148 amit.gupta 42
import org.apache.logging.log4j.LogManager;
43
import org.apache.logging.log4j.Logger;
32405 jai.hind 44
import org.json.JSONArray;
30148 amit.gupta 45
import org.json.JSONObject;
46
import org.springframework.beans.factory.annotation.Autowired;
47
import org.springframework.core.io.InputStreamResource;
48
import org.springframework.http.HttpHeaders;
49
import org.springframework.http.HttpStatus;
50
import org.springframework.http.MediaType;
51
import org.springframework.http.ResponseEntity;
52
import org.springframework.stereotype.Controller;
53
import org.springframework.transaction.annotation.Transactional;
54
import org.springframework.ui.Model;
55
import org.springframework.web.bind.annotation.*;
21612 ashik.ali 56
 
30148 amit.gupta 57
import javax.servlet.http.HttpServletRequest;
58
import javax.servlet.http.HttpServletResponse;
32409 amit.gupta 59
import java.io.ByteArrayInputStream;
60
import java.io.ByteArrayOutputStream;
61
import java.io.InputStream;
32271 amit.gupta 62
import java.nio.charset.StandardCharsets;
30148 amit.gupta 63
import java.time.LocalDate;
64
import java.time.LocalDateTime;
31416 tejbeer 65
import java.time.LocalTime;
30148 amit.gupta 66
import java.time.format.DateTimeFormatter;
67
import java.time.temporal.ChronoUnit;
68
import java.util.*;
69
import java.util.stream.Collectors;
70
 
21612 ashik.ali 71
@Controller
23973 govind 72
@Transactional(rollbackFor = Throwable.class)
21612 ashik.ali 73
public class OrderController {
74
 
32251 amit.gupta 75
    private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 76
 
32251 amit.gupta 77
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
78
    private static final List<String> allowedDoaImeis = Arrays.asList("863903054378477");
79
    @Autowired
80
    NotificationService notificationService;
81
    @Autowired
82
    private CustomerRepository customerRepository;
83
    private boolean accessoriesDeals = true;
84
    @Autowired
85
    private RoleManager roleManager;
86
    @Autowired
87
    private Gson gson;
88
    @Autowired
89
    private CustomerReturnItemRepository customerReturnItemRepository;
90
    @Autowired
91
    private FofoOrderItemRepository fofoOrderItemRepository;
92
    @Autowired
93
    private PaymentOptionRepository paymentOptionRepository;
94
    @Autowired
95
    private StateRepository stateRepository;
96
    @Autowired
97
    private ItemRepository itemRepository;
98
    @Autowired
99
    private MVCResponseSender mvcResponseSender;
100
    @Autowired
101
    private InsuranceService insuranceService;
102
    @Autowired
103
    private FofoOrderRepository fofoOrderRepository;
104
    @Autowired
105
    private CustomerAddressRepository customerAddressRepository;
106
    @Autowired
107
    private InsurancePolicyRepository insurancePolicyRepository;
108
    @Autowired
109
    private InsuranceProviderRepository insuranceProviderRepository;
110
    @Autowired
111
    private CookiesProcessor cookiesProcessor;
112
    @Autowired
113
    private PricingService pricingService;
114
    @Autowired
115
    private OrderService orderService;
116
    @Autowired
117
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
118
    @Autowired
119
    private AddressRepository addressRepository;
120
    @Autowired
121
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
122
    @Autowired
123
    private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
124
    @Autowired
125
    private ResponseSender<?> responseSender;
126
    @Autowired
127
    private PendingOrderRepository pendingOrderRepository;
128
    @Autowired
129
    private OrderRepository orderRepository;
130
    @Autowired
131
    private PendingOrderItemRepository pendingOrderItemRepository;
132
    @Autowired
133
    private FofoStoreRepository fofoStoreRepository;
134
    @Autowired
135
    private RetailerService retailerService;
136
    @Autowired
137
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
138
    @Autowired
139
    private TagListingRepository tagListingRepository;
140
    @Autowired
141
    private PendingOrderService pendingOrderService;
142
    @Autowired
143
    private EmailService emailService;
144
    @Autowired
145
    private SolrService commonSolrService;
146
    @Autowired
147
    private MouRepository mouRepository;
28339 tejbeer 148
 
32405 jai.hind 149
    @Autowired
150
    private WhatsappMessageService whatsappMessageService;
151
 
32251 amit.gupta 152
    @RequestMapping(value = "/order")
153
    public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model)
154
            throws ProfitMandiBusinessException {
155
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23973 govind 156
 
32251 amit.gupta 157
        int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
158
        Address address = addressRepository.selectById(addressId);
21985 kshitij.so 159
 
32251 amit.gupta 160
        List<CartFofo> cartItems = orderService.cartCheckout(cartData);
161
        Set<Integer> itemIds = new HashSet<>();
162
        List<Integer> poIds = new ArrayList<>();
163
        List<Integer> poItemIds = new ArrayList<>();
164
        for (CartFofo cartFofo : cartItems) {
165
            itemIds.add(cartFofo.getItemId());
166
            if (cartFofo.getPoId() != 0) {
167
                poIds.add(cartFofo.getPoId());
168
                poItemIds.add(cartFofo.getPoItemId());
169
            }
170
        }
23973 govind 171
 
32251 amit.gupta 172
        PendingOrder po = null;
173
        Customer customer = null;
174
        PendingOrderItem poi = null;
175
        Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds,
176
                loginDetails.getFofoId());
177
        List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
178
                .selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
27046 tejbeer 179
 
32251 amit.gupta 180
        if (!poIds.isEmpty()) {
181
            po = pendingOrderRepository.selectById(poIds.get(0));
182
            customer = customerRepository.selectById(po.getCustomerId());
183
            if (!offlineOrders.contains(po.getPayMethod())) {
184
                paymentOptionIds.add(23);
185
            }
186
        }
23973 govind 187
 
32251 amit.gupta 188
        if (!poItemIds.isEmpty()) {
189
            poi = pendingOrderItemRepository.selectById(poItemIds.get(0));
190
        }
21985 kshitij.so 191
 
32251 amit.gupta 192
        // List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new
193
        // HashSet<>(paymentOptionIds));
29642 amit.gupta 194
 
32251 amit.gupta 195
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectActiveOption();
24844 amit.gupta 196
 
32251 amit.gupta 197
        LOGGER.info("pendingOrder" + po);
198
        LOGGER.info("pendingOrderItem" + poi);
23973 govind 199
 
32251 amit.gupta 200
        LOGGER.info("mopPriceMap {}", mopPriceMap);
201
        model.addAttribute("stateNames",
202
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
203
        model.addAttribute("retailerStateName", address.getState());
204
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
205
        model.addAttribute("pendingPO", gson.toJson(po));
21985 kshitij.so 206
 
32251 amit.gupta 207
        model.addAttribute("cartItems", cartItems);
208
        model.addAttribute("pendingOrder", po);
209
        model.addAttribute("pendingOrderItem", poi);
24844 amit.gupta 210
 
32251 amit.gupta 211
        model.addAttribute("mopPriceMap", mopPriceMap);
212
        model.addAttribute("paymentOptions", paymentOptions);
213
        model.addAttribute("accessoriesDeals", accessoriesDeals);
214
        return "order-index";
215
    }
24105 govind 216
 
32251 amit.gupta 217
    @RequestMapping(value = "/checkplans", method = RequestMethod.GET)
218
    public String getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
219
                                     @RequestParam int itemId) throws ProfitMandiBusinessException {
220
        LOGGER.info("Request received at url : {}", request.getRequestURI());
21985 kshitij.so 221
 
32251 amit.gupta 222
        try {
223
            String response = mvcResponseSender.createResponseString(this.getPlans(price, itemId));
224
            model.addAttribute("response1", response);
225
        } catch (Exception e) {
226
            // TODO Auto-generated catch block
227
            LOGGER.info(e.getMessage(), e);
228
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
229
        }
23973 govind 230
 
32251 amit.gupta 231
        return "response";
232
    }
23973 govind 233
 
32251 amit.gupta 234
    @RequestMapping(value = "/get-order", method = RequestMethod.GET)
235
    public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId,
236
                           Model model) throws ProfitMandiBusinessException {
237
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
238
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
239
        List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
32627 ranu 240
        CustomerAddress customerAddress = null;
241
        if (fofoOrder.getCustomerAddressId() != 0) {
242
            customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
243
        }
244
 
32251 amit.gupta 245
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
32627 ranu 246
        if (customerAddress != null) {
247
            customerAddress.setPhoneNumber(customer.getMobileNumber());
248
        }
249
        LOGGER.info("Added to get invoice - {}, {}", customer, 123);
32251 amit.gupta 250
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
251
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
252
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
253
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
254
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
255
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
256
        this.addInsuranceProvider(insurancePolicies);
21985 kshitij.so 257
 
32251 amit.gupta 258
        model.addAttribute("fofoOrder", fofoOrder);
259
        model.addAttribute("fofoLineItems", fofoLineItems);
32627 ranu 260
        if (customerAddress != null) {
261
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
32637 amit.gupta 262
        } else {
263
            model.addAttribute("customerBillingAddress", "");
264
 
32627 ranu 265
        }
32251 amit.gupta 266
        model.addAttribute("customerBillingAddressObj", customerAddress);
32627 ranu 267
        model.addAttribute("customerDetailsObj", customer);
32251 amit.gupta 268
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
269
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
270
        model.addAttribute("insurancePolicies", insurancePolicies);
271
        return "order-details";
272
    }
23973 govind 273
 
32251 amit.gupta 274
    private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(
275
            List<InsuranceProvider> insuranceProviders) {
276
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
277
        for (InsuranceProvider insuranceProvider : insuranceProviders) {
278
            insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
279
        }
280
        return insuranceProviderIdInsuranceProviderMap;
281
    }
23973 govind 282
 
32251 amit.gupta 283
    private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies) {
284
        if (insurancePolicies.isEmpty()) {
285
            return;
286
        }
287
        Set<Integer> insuranceProviderIds = new HashSet<>();
288
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
289
            insuranceProviderIds.add(insurancePolicy.getProviderId());
290
        }
291
        LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
292
        List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
293
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this
294
                .toInsuranceProviderIdInsuranceProvider(insuranceProviders);
295
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
296
            insurancePolicy
297
                    .setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
298
        }
299
    }
23973 govind 300
 
32251 amit.gupta 301
    @RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
302
    public String getSaleDetails(HttpServletRequest request,
303
                                 @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
304
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
305
        boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
306
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
307
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
308
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
309
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
310
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
23973 govind 311
 
32251 amit.gupta 312
        // Added Migration info as we lost it.
313
        if (paymentOptionTransactions == null || paymentOptionTransactions.size() == 0) {
314
            PaymentOptionTransaction pot = new PaymentOptionTransaction();
315
            pot.setAmount(fofoOrder.getTotalAmount());
316
            pot.setCreateTimestamp(fofoOrder.getCreateTimestamp());
317
            // Mark it paid through cash
318
            pot.setPaymentOptionId(1);
319
            pot.setReferenceType(PaymentOptionReferenceType.ORDER);
320
            paymentOptionTransactionRepository.persist(pot);
321
            paymentOptionTransactions.add(pot);
322
            LOGGER.info("Added to get invoice");
323
        }
324
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
325
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
326
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
327
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
328
        this.addInsuranceProvider(insurancePolicies);
329
        Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
330
            try {
331
                return itemRepository.selectById(x.getItemId());
332
            } catch (ProfitMandiBusinessException e) {
333
                // TODO Auto-generated catch block
334
                return null;
335
            }
336
        }));
337
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
338
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23973 govind 339
 
32251 amit.gupta 340
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
341
                .collect(Collectors.toMap(foi -> foi.getId(),
342
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
23973 govind 343
 
32251 amit.gupta 344
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
23973 govind 345
 
32251 amit.gupta 346
        for (FofoOrderItem foi : fofoOrderItems) {
347
            for (FofoLineItem fli : foi.getFofoLineItems()) {
348
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
349
            }
350
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
351
                    .selectAllByOrderItemId(foi.getId());
352
            this.markDoa(fofoOrder, foi, isAdmin);
353
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
354
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
355
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
356
            }
357
        }
23973 govind 358
 
32251 amit.gupta 359
        LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
360
        model.addAttribute("fofoOrder", fofoOrder);
361
        model.addAttribute("itemsMap", itemsMap);
362
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
363
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
364
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
365
        model.addAttribute("fofoOrderItemIdLineItemMap", fofoOrderItemIdLineItemMap);
30426 tejbeer 366
 
32251 amit.gupta 367
        model.addAttribute("fofoOrderItems", fofoOrderItems);
368
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
32637 amit.gupta 369
        if (customerAddress != null) {
370
 
371
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
372
        } else {
373
            model.addAttribute("customerBillingAddress", "");
374
 
375
        }
32251 amit.gupta 376
        model.addAttribute("customerBillingAddressObj", customerAddress);
377
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
378
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
379
        model.addAttribute("insurancePolicies", insurancePolicies);
380
        model.addAttribute("markDefective", this.markDefective(fofoOrder));
381
        return "sale-details";
382
    }
30426 tejbeer 383
 
32251 amit.gupta 384
    private void markDoa(FofoOrder fofoOrder, FofoOrderItem foi, boolean isAdmin) {
385
        if (isAdmin) {
386
            foi.setDoa(true);
387
            return;
388
        }
389
        boolean isImei = foi.getFofoLineItems().stream()
390
                .anyMatch(x -> org.apache.commons.lang3.StringUtils.isNotEmpty(x.getSerialNumber())
391
                        && allowedDoaImeis.contains(x.getSerialNumber()));
392
        LocalDateTime buyDate = fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS);
393
        LocalDateTime curDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
394
        if (buyDate.isAfter(curDate.minusDays(45)) || isImei) {
395
            foi.setDoa(true);
396
        } else
397
            foi.setDoa(
398
                    foi.getBrand().equals("Nokia") && foi.getCost() < 4990 && buyDate.isAfter(curDate.minusYears(1)));
399
    }
26647 tejbeer 400
 
32251 amit.gupta 401
    private boolean markDefective(FofoOrder fofoOrder) {
402
        return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(180)
403
                .isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
26647 tejbeer 404
 
32251 amit.gupta 405
    }
26647 tejbeer 406
 
32251 amit.gupta 407
    @RequestMapping(value = "/getSearchOrder")
408
    public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
409
        return "search-order";
410
    }
26647 tejbeer 411
 
32251 amit.gupta 412
    @RequestMapping(value = "/getInvoiceSearchOrder")
413
    public String getInvoiceSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
414
        return "invoices-cancel";
415
    }
27861 tejbeer 416
 
32251 amit.gupta 417
    @RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
418
    public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer,
419
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
420
            throws Exception {
28339 tejbeer 421
 
32251 amit.gupta 422
        orderService.updateCustomerDetails(customCustomer, invoiceNumber);
423
        return this.getSearchOrderDetails(request, invoiceNumber, model);
424
    }
28339 tejbeer 425
 
32251 amit.gupta 426
    @RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
427
    public String getSearchOrderDetails(HttpServletRequest request,
428
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
429
            throws Exception {
28339 tejbeer 430
 
32251 amit.gupta 431
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
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);
28420 tejbeer 449
 
32251 amit.gupta 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
        }
23973 govind 460
 
32251 amit.gupta 461
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
462
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23973 govind 463
 
32251 amit.gupta 464
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
465
                .collect(Collectors.toMap(foi -> foi.getId(),
466
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
28339 tejbeer 467
 
32251 amit.gupta 468
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
28339 tejbeer 469
 
32251 amit.gupta 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
    }
28339 tejbeer 500
 
32251 amit.gupta 501
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(
502
            List<PaymentOptionTransaction> paymentOptionTransactions) {
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
    }
28339 tejbeer 514
 
32251 amit.gupta 515
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMapUsingPaymentOptions(
516
            List<Integer> fofoPartnerPaymentOptions) {
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
    }
28339 tejbeer 525
 
32251 amit.gupta 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
    }
31375 tejbeer 535
 
32251 amit.gupta 536
    @RequestMapping(value = "/create-order", method = RequestMethod.POST)
537
    public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest,
538
                              Model model) throws ProfitMandiBusinessException {
539
        // throw new ProfitMandiBusinessException("Billing is on hold temporarily",
540
        // "Billing is on hold temporarily", "Billing is on hold temporarily");
541
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
542
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
28339 tejbeer 543
 
32251 amit.gupta 544
        int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId(), accessoriesDeals);
28339 tejbeer 545
 
32251 amit.gupta 546
        LOGGER.info("Order has been created successfully...");
547
        try {
548
            this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(fofoOrderId));
549
        } catch (Exception e) {
550
            LOGGER.info("Could not send whatsapp message");
551
            e.printStackTrace();
552
        }
553
        return "redirect:/get-order/?orderId=" + fofoOrderId;
554
    }
28339 tejbeer 555
 
32251 amit.gupta 556
    private void sendWhatsappInvoice(FofoOrder fofoOrder) throws Exception {
557
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
558
        CustomRetailer retailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
559
        String message = String.format("Dear %s,\n" +
32326 amit.gupta 560
                "Thank you for your purchase from SmartDukaan store - %s, %s.\n" +
32251 amit.gupta 561
                "Your purchase invoice is attached for your reference.\n" +
562
                "\n" +
563
                "Download our app for offers and updates on new products.\n" +
32269 amit.gupta 564
                "https://www.smartdukaan.com/b2c\n" +
32251 amit.gupta 565
                "\n" +
566
                "Best Regards\n" +
567
                "SmartDukaan", customer.getFirstName(), retailer.getBusinessName(), retailer.getAddress().getCity());
32508 amit.gupta 568
        boolean sentMessage = notificationService.isWhatMessageSend(customer.getMobileNumber());
569
        if (sentMessage) {
570
            notificationService.sendWhatsappMediaMessage(message, customer.getMobileNumber(), this.getPublicInvoiceUrl(fofoOrder.getInvoiceNumber()), this.getFileName(fofoOrder.getInvoiceNumber()));
571
        }
32251 amit.gupta 572
    }
23973 govind 573
 
32251 amit.gupta 574
    private String getFileName(String invoiceNumber) {
32270 amit.gupta 575
        return "INV-" + invoiceNumber.replace("/", "-") + ".pdf";
32251 amit.gupta 576
    }
24844 amit.gupta 577
 
32251 amit.gupta 578
    private String getPublicInvoiceUrl(String invoiceNumber) {
32271 amit.gupta 579
        String base64Encoded = Base64.getMimeEncoder().encodeToString(invoiceNumber.getBytes(StandardCharsets.UTF_8));
580
        String publicUrl = "https://partners.smartdukaan.com/wa-invoice-send/" + base64Encoded + ".pdf";
32710 amit.gupta 581
        LOGGER.info("Public Whatsapp Url for Invoice Message - {}", publicUrl);
32251 amit.gupta 582
        return publicUrl;
583
    }
24844 amit.gupta 584
 
32251 amit.gupta 585
    @RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
586
    public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest,
587
                                       Model model) throws ProfitMandiBusinessException {
588
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
589
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
590
        CustomerCreditNote custmoerCreditNote;
591
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
592
            FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
593
            FofoOrder fo = fofoOrderRepository.selectByOrderId(foi.getOrderId());
594
            custmoerCreditNote = orderService.badReturn(fo.getFofoId(), foiBadReturnRequest);
595
        } else {
596
            custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
597
        }
598
        return responseSender.ok(custmoerCreditNote.getId());
599
    }
23973 govind 600
 
32271 amit.gupta 601
    @GetMapping(value = "/wa-invoice-send/{invoiceHash}")
602
    public ResponseEntity<?> generateInvoice(@PathVariable String invoiceHash) throws ProfitMandiBusinessException {
603
        String decodedInvoiceNumber = new String(Base64.getMimeDecoder().decode(invoiceHash));
604
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(decodedInvoiceNumber);
605
 
32251 amit.gupta 606
        InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
24087 amit.gupta 607
 
32251 amit.gupta 608
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
609
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
610
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
611
        final HttpHeaders headers = new HttpHeaders();
612
        //headers.setContentDispositionFormData("inline", number + ".pdf");
613
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + pdfModel.getInvoiceNumber() + ".pdf");
614
        int contentLength = byteArrayOutputStream.toByteArray().length;
615
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
616
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
617
        return ResponseEntity.ok()
618
                .headers(headers)
619
                .contentLength(contentLength)
620
                .contentType(MediaType.parseMediaType("application/pdf"))
621
                .body(inputStreamResource);
622
    }
23973 govind 623
 
32254 amit.gupta 624
    @RequestMapping(value = "/wa-listen", method = RequestMethod.POST)
32251 amit.gupta 625
    public ResponseEntity<?> listenWhatsappStatus(@RequestBody String whatsappJsonResponse) {
626
        LOGGER.info("whatsappJsonResponse {}", whatsappJsonResponse);
32405 jai.hind 627
        //jaihind
32409 amit.gupta 628
        //  String jsonString = "[{\"srcAddr\":\"TESTSM\",\"channel\":\"WHATSAPP\",\"externalId\":\"4977024756456780043-180044363908187691\",\"cause\":\"SUCCESS\",\"errorCode\":\"000\",\"destAddr\":\"919813272029\",\"eventType\":\"DELIVERED\",\"eventTs\":1692848106000}]";
32405 jai.hind 629
        JSONArray jsonArray = new JSONArray(whatsappJsonResponse);
32409 amit.gupta 630
        for (int i = 0; i < jsonArray.length(); i++) {
32405 jai.hind 631
 
632
            JSONObject jsonObject = jsonArray.getJSONObject(i);
633
            String externalId = jsonObject.getString("externalId");
634
            String destAddr = jsonObject.getString("destAddr");
635
            String eventType = jsonObject.getString("eventType");
32409 amit.gupta 636
            whatsappMessageService.setWhatsappResponse(externalId, destAddr, eventType);
32405 jai.hind 637
        }
638
        //jaihind
32251 amit.gupta 639
        return responseSender.ok("Success");
32405 jai.hind 640
 
32251 amit.gupta 641
    }
32409 amit.gupta 642
 
32251 amit.gupta 643
    @RequestMapping(value = "/generateInvoice")
644
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
645
                                             @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
646
        LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
647
                ProfitMandiConstants.ORDER_ID, orderId);
648
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
649
        InvoicePdfModel pdfModel = null;
650
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
651
            pdfModel = orderService.getInvoicePdfModel(orderId);
652
        } else {
653
            pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
654
        }
655
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
656
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
657
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
658
        final HttpHeaders headers = new HttpHeaders();
659
        headers.setContentType(MediaType.APPLICATION_PDF);
660
        headers.setContentDispositionFormData("inline", "invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
661
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
662
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
663
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
664
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
665
    }
23973 govind 666
 
32251 amit.gupta 667
    @RequestMapping(value = "/generateInvoices")
668
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
669
                                             @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, @RequestParam int partnerId)
670
            throws ProfitMandiBusinessException {
671
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
672
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
673
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
674
            List<Integer> orderIds = fofoOrderRepository.selectByFofoId(partnerId, startDate, endDate, 0, 0).stream()
675
                    .map(x -> x.getId()).collect(Collectors.toList());
676
            for (int orderId : orderIds) {
677
                pdfModels.add(orderService.getInvoicePdfModel(orderId));
678
            }
679
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
680
            PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
681
            LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
682
            final HttpHeaders headers = new HttpHeaders();
683
            headers.setContentType(MediaType.APPLICATION_PDF);
684
            headers.set("Content-disposition", "inline; filename=invoice-" + partnerId + ".pdf");
685
            headers.setContentLength(byteArrayOutputStream.toByteArray().length);
686
            final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
687
            final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
688
            return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
689
        } else {
690
            throw new ProfitMandiBusinessException("Auth", fofoDetails.getEmailId(), "Unauthorised access");
691
        }
692
    }
23654 amit.gupta 693
 
32251 amit.gupta 694
    @RequestMapping(value = "/saleHistory")
695
    public String saleHistory(HttpServletRequest request,
696
                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
697
                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
698
                              @RequestParam(required = false) LocalDateTime startTime,
699
                              @RequestParam(required = false) LocalDateTime endTime,
700
                              @RequestParam(name = "offset", defaultValue = "0") int offset,
701
                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
702
            throws ProfitMandiBusinessException {
703
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23654 amit.gupta 704
 
32251 amit.gupta 705
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
706
                startTime, endTime, offset, limit);
707
        model.addAllAttributes(map);
708
        return "sale-history";
709
    }
23973 govind 710
 
32251 amit.gupta 711
    @RequestMapping(value = "/downloadInvoices")
712
    public ResponseEntity<?> downloadInvoices(HttpServletRequest request,
713
                                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
714
                                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
715
                                              @RequestParam(required = false) LocalDateTime startTime,
716
                                              @RequestParam(required = false) LocalDateTime endTime,
717
                                              @RequestParam(name = "offset", defaultValue = "0") int offset,
718
                                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
719
            throws ProfitMandiBusinessException {
720
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23973 govind 721
 
32251 amit.gupta 722
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
723
                startTime, endTime, offset, 100);
724
        List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
29707 tejbeer 725
 
32251 amit.gupta 726
        if (fofoOrders.size() == 0) {
727
            throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
728
        }
23973 govind 729
 
32251 amit.gupta 730
        final HttpHeaders headers = new HttpHeaders();
731
        headers.setContentType(MediaType.APPLICATION_PDF);
732
        headers.set("Content-disposition", "inline; filename=invoices.pdf");
733
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
734
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
735
        for (FofoOrder fofoOrder : fofoOrders) {
736
            try {
737
                pdfModels.add(orderService.getInvoicePdfModel(fofoOrder.getId()));
738
            } catch (Exception e) {
739
                LOGGER.info("could not create invoice for {}, invoice number {}", fofoOrder.getId(),
740
                        fofoOrder.getInvoiceNumber());
741
            }
742
        }
743
        PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
744
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
745
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
746
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
747
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
748
    }
23973 govind 749
 
32251 amit.gupta 750
    @RequestMapping(value = "/credit-note/{creditNoteId}")
751
    public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId)
752
            throws ProfitMandiBusinessException {
753
        CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
754
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
755
        PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
756
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
757
        final HttpHeaders headers = new HttpHeaders();
758
        headers.setContentType(MediaType.APPLICATION_PDF);
759
        headers.set("Content-disposition",
760
                "inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
761
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
762
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
763
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
764
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
765
    }
23973 govind 766
 
32251 amit.gupta 767
    @RequestMapping(value = "/getPaginatedSaleHistory")
768
    public String getSaleHistoryPaginated(HttpServletRequest request,
769
                                          @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
770
                                          @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
771
                                          @RequestParam(required = false) LocalDateTime startTime,
772
                                          @RequestParam(required = false) LocalDateTime endTime,
773
                                          @RequestParam(name = "offset", defaultValue = "0") int offset,
774
                                          @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
775
            throws ProfitMandiBusinessException {
776
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
777
        Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType,
778
                searchValue, startTime, endTime, offset, limit);
779
        model.addAllAttributes(map);
780
        return "sale-history-paginated";
781
    }
23973 govind 782
 
32251 amit.gupta 783
    @PutMapping(value = "/updatePaymentTransaction")
784
    public String updateTransactionDetails(HttpServletRequest request, @RequestParam String referenceType,
785
                                           @RequestParam int fofoId, @RequestParam int referenceId,
786
                                           @RequestBody PartnerOptionsAndItemAmountModel partnerOptionsAndItemAmountModel,
787
                                           @RequestParam float totalAmount, Model model) throws Exception {
23973 govind 788
 
32251 amit.gupta 789
        List<PaymentOptionTransactionModel> paymentOptionTransactionModels = partnerOptionsAndItemAmountModel
790
                .getPaymentOptionTransactionModel();
791
        LOGGER.info(paymentOptionTransactionModels);
792
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, referenceId);
793
        LOGGER.info("sdssd" + fofoOrder);
794
        fofoOrder.setTotalAmount(totalAmount);
795
        List<FofoItemIdAmountModel> fofoItemIdAmountModel = partnerOptionsAndItemAmountModel.getItemAmountModel();
796
        for (FofoItemIdAmountModel fim : fofoItemIdAmountModel) {
797
            LOGGER.info("fim" + fim.getFofoItemId());
27819 tejbeer 798
 
32251 amit.gupta 799
            LOGGER.info("fimAmount" + fim.getAmount());
800
            Item item = itemRepository.selectById(fim.getItemId());
801
            TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
802
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(fim.getFofoItemId());
803
            LOGGER.info("category" + item.getCategoryId());
804
            if (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID) {
805
                if (fofoOrderItem.getMop() <= fim.getAmount()) {
23973 govind 806
 
32251 amit.gupta 807
                    if (fim.getAmount() <= tagListing.getMrp()) {
808
                        fofoOrderItem.setSellingPrice(fim.getAmount());
809
                    } else {
810
                        throw new ProfitMandiBusinessException("Amount", fim.getAmount(),
811
                                "Sum of amount is not less than  to MRP");
812
                    }
23973 govind 813
 
32251 amit.gupta 814
                    LOGGER.info("fofoOrderItem2" + fofoOrderItem);
23973 govind 815
 
32251 amit.gupta 816
                } else {
817
                    // TODO below mop condition need to added added
818
                    fofoOrderItem.setSellingPrice(fim.getAmount());
819
                }
31739 amit.gupta 820
 
32251 amit.gupta 821
            } else {
822
                fofoOrderItem.setSellingPrice(fim.getAmount());
823
                LOGGER.info("fofoOrderItem1" + fofoOrderItem);
24844 amit.gupta 824
 
32251 amit.gupta 825
            }
826
            LOGGER.info("fofoOrderItem" + fofoOrderItem);
24281 amit.gupta 827
 
32251 amit.gupta 828
        }
24281 amit.gupta 829
 
32251 amit.gupta 830
        /*
831
         * for (PaymentOptionTransactionModel paymentOptionTransactionModel :
832
         * paymentOptionTransactionModels) { amount = amount +
833
         * paymentOptionTransactionModel.getAmount(); } LOGGER.info("FofoOrder amount" +
834
         * fofoOrder.getUnitPrice() + "amount" + amount); if (amount ==
835
         * fofoOrder.getUnitPrice()) {
836
         */
837
        if (paymentOptionTransactionModels.size() > 0) {
838
            List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
839
                    .selectByReferenceIdAndType(referenceId, PaymentOptionReferenceType.ORDER);
840
            Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
841
                    .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
842
            LOGGER.info(
843
                    "paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
844
            for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
845
                if (paymentOptionIdPaymentOptionTransactionMap
846
                        .containsKey(paymentOptionTransactionModel.getPaymentOptionId())) {
24281 amit.gupta 847
 
32251 amit.gupta 848
                    PaymentOptionTransaction paymentOptionTransaction = paymentOptionIdPaymentOptionTransactionMap
849
                            .get(paymentOptionTransactionModel.getPaymentOptionId());
23973 govind 850
 
32251 amit.gupta 851
                    if (paymentOptionTransactionModel.getAmount() == 0) {
852
                        paymentOptionTransactionRepository.delete(paymentOptionTransaction);
853
                        LOGGER.info("deleted successfully");
854
                    } else {
23973 govind 855
 
32251 amit.gupta 856
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
857
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
858
                        LOGGER.info("updated successfully");
24105 govind 859
 
32251 amit.gupta 860
                    }
861
                } else {
862
                    if (paymentOptionTransactionModel.getAmount() > 0) {
863
                        PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
864
                        paymentOptionTransaction.setReferenceId(referenceId);
865
                        paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
866
                        paymentOptionTransaction.setPaymentOptionId(paymentOptionTransactionModel.getPaymentOptionId());
867
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
868
                        paymentOptionTransaction.setFofoId(fofoId);
869
                        paymentOptionTransaction.setCreateTimestamp(fofoOrder.getCreateTimestamp());
870
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
871
                        LOGGER.info("inserted successfully");
872
                    }
873
                }
24105 govind 874
 
32251 amit.gupta 875
            }
23973 govind 876
 
32251 amit.gupta 877
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
878
        }
879
        /*
880
         * else
881
         *
882
         * { throw new ProfitMandiBusinessException("Amount", amount,
883
         * "Sum of amount is not equal to total amount"); }
884
         */
28339 tejbeer 885
 
32251 amit.gupta 886
        return "response";
23973 govind 887
 
32251 amit.gupta 888
    }
21985 kshitij.so 889
 
32251 amit.gupta 890
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId)
891
            throws ProfitMandiBusinessException {
892
        try {
893
            Map<String, List<MobileInsurancePlan>> productDurationPlans = insuranceService.getAllPlans(itemId,
894
                    sellingPrice);
895
            return productDurationPlans;
896
        } catch (Exception e) {
897
            LOGGER.info(e, e);
898
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance",
899
                    "Could not fetch insurance Plans");
900
        }
32238 amit.gupta 901
 
32251 amit.gupta 902
    }
32238 amit.gupta 903
 
32251 amit.gupta 904
    @GetMapping("/insuranceDetails")
905
    public String getInsuranceDetails(HttpServletRequest request,
906
                                      @RequestParam(name = "offset", defaultValue = "0") int offset,
907
                                      @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
908
            throws ProfitMandiBusinessException {
909
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
910
        long size = 0;
911
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
912
                offset, limit);
913
        size = insurancePolicyRepository.selectCountByRetailerId(loginDetails.getFofoId());
914
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
915
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
916
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
917
        if (size < limit) {
918
            model.addAttribute("end", offset + size);
919
        } else {
920
            model.addAttribute("end", offset + limit);
921
        }
922
        model.addAttribute("start", offset + 1);
923
        model.addAttribute("size", size);
924
        model.addAttribute("insurancePolicies", insurancePolicies);
925
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
926
        return "insurance-details";
927
    }
32238 amit.gupta 928
 
32251 amit.gupta 929
    @GetMapping("/insuranceDetailsPaginated")
930
    public String getInsuranceDetailsPaginated(HttpServletRequest request,
931
                                               @RequestParam(name = "offset", defaultValue = "0") int offset,
932
                                               @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
933
            throws ProfitMandiBusinessException {
934
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
935
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
936
                offset, limit);
937
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
938
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
939
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
940
        model.addAttribute("insurancePolicies", insurancePolicies);
941
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
942
        return "insurance-details-paginated";
943
    }
23973 govind 944
 
32251 amit.gupta 945
    @GetMapping("/getMouForm")
946
    public String getMouForm(HttpServletRequest request, Model model) throws Exception {
947
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
24844 amit.gupta 948
 
32251 amit.gupta 949
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
950
        if (mou != null) {
951
            if (mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
952
                model.addAttribute("response1", mvcResponseSender.createResponseString(true));
953
            } else {
954
                model.addAttribute("response1", mvcResponseSender.createResponseString(false));
955
            }
23973 govind 956
 
32251 amit.gupta 957
        } else {
958
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
23973 govind 959
 
32251 amit.gupta 960
        }
961
        return "response";
25092 amit.gupta 962
 
32251 amit.gupta 963
    }
25092 amit.gupta 964
 
32251 amit.gupta 965
    @GetMapping("/pendingOrders")
966
    public String getPendingOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
967
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
968
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
969
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
970
        if (mou == null) {
971
            mou = new Mou();
972
            mou.setFofoId(loginDetails.getFofoId());
973
            mou.setCreateTimestamp(LocalDateTime.now());
974
            mou.setUpdateTimestamp(LocalDateTime.now());
975
            mouRepository.persist(mou);
976
        } else if (!mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
977
            mou.setUpdateTimestamp(LocalDateTime.now());
978
        }
25092 amit.gupta 979
 
32251 amit.gupta 980
        List<PendingOrderItem> pendingOrderItem = null;
25092 amit.gupta 981
 
32251 amit.gupta 982
        pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.PROCESSING,
983
                loginDetails.getFofoId());
23973 govind 984
 
32251 amit.gupta 985
        Map<String, Object> map = null;
22291 ashik.ali 986
 
32251 amit.gupta 987
        map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
988
        model.addAttribute("inventoryMap", map.get("inventoryMap"));
27861 tejbeer 989
 
32251 amit.gupta 990
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
28190 tejbeer 991
 
32251 amit.gupta 992
        LOGGER.info("partnerInventoryMap" + map.get("partnerInventoryMap"));
993
        model.addAttribute("isAdmin", isAdmin);
994
        return "pending_fofo_order";
27861 tejbeer 995
 
32251 amit.gupta 996
    }
27861 tejbeer 997
 
32251 amit.gupta 998
    @GetMapping("/billedOrders")
999
    public String getBilledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1000
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1001
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27861 tejbeer 1002
 
32251 amit.gupta 1003
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1004
 
32251 amit.gupta 1005
        if (isAdmin) {
27861 tejbeer 1006
 
32251 amit.gupta 1007
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.BILLED);
27861 tejbeer 1008
 
32251 amit.gupta 1009
        } else {
1010
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.BILLED,
1011
                    loginDetails.getFofoId());
1012
        }
24105 govind 1013
 
32251 amit.gupta 1014
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
24105 govind 1015
 
32251 amit.gupta 1016
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1017
        model.addAttribute("isAdmin", isAdmin);
1018
        return "billed_order_item";
1019
    }
24105 govind 1020
 
32251 amit.gupta 1021
    @GetMapping("/settledOrders")
1022
    public String getSettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1023
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1024
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
24105 govind 1025
 
32251 amit.gupta 1026
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1027
 
32251 amit.gupta 1028
        if (isAdmin) {
24105 govind 1029
 
32251 amit.gupta 1030
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.SETTLED);
27861 tejbeer 1031
 
32251 amit.gupta 1032
        } else {
1033
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.SETTLED,
1034
                    loginDetails.getFofoId());
1035
        }
24105 govind 1036
 
32251 amit.gupta 1037
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
27861 tejbeer 1038
 
32251 amit.gupta 1039
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1040
        model.addAttribute("isAdmin", isAdmin);
1041
        return "settled_order_item";
1042
    }
24440 amit.gupta 1043
 
32251 amit.gupta 1044
    @GetMapping("/unsettledOrders")
1045
    public String getunsettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1046
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1047
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
25726 amit.gupta 1048
 
32251 amit.gupta 1049
        List<PendingOrderItem> pendingOrderItem = null;
24880 govind 1050
 
32251 amit.gupta 1051
        if (isAdmin) {
25092 amit.gupta 1052
 
32251 amit.gupta 1053
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.UNSETTLED);
26647 tejbeer 1054
 
32251 amit.gupta 1055
        } else {
1056
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.UNSETTLED,
1057
                    loginDetails.getFofoId());
1058
        }
28420 tejbeer 1059
 
32251 amit.gupta 1060
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
28425 tejbeer 1061
 
32251 amit.gupta 1062
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1063
        model.addAttribute("isAdmin", isAdmin);
1064
        return "unsettled_order_item";
1065
    }
28420 tejbeer 1066
 
32251 amit.gupta 1067
    @GetMapping("/claimedOrders")
1068
    public String getclaimedOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1069
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1070
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1071
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1072
                .collect(Collectors.toList());
28420 tejbeer 1073
 
32251 amit.gupta 1074
        List<PendingOrderItem> pendingOrderItem = null;
28420 tejbeer 1075
 
32251 amit.gupta 1076
        if (isAdmin) {
26647 tejbeer 1077
 
32251 amit.gupta 1078
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.CLAIMED);
1079
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28339 tejbeer 1080
 
32251 amit.gupta 1081
            Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1082
                    .filter(x -> x != null).collect(Collectors.toList()).stream()
1083
                    .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1084
            model.addAttribute("customRetailersMap", customRetailersMap);
28339 tejbeer 1085
 
32251 amit.gupta 1086
        } else {
1087
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.CLAIMED,
1088
                    loginDetails.getFofoId());
1089
        }
27046 tejbeer 1090
 
32251 amit.gupta 1091
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
27046 tejbeer 1092
 
32251 amit.gupta 1093
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1094
        model.addAttribute("isAdmin", isAdmin);
1095
        return "claim_raised_order_item";
1096
    }
28350 tejbeer 1097
 
32251 amit.gupta 1098
    @GetMapping("/getPendingOrderItem")
1099
    public String getPendingOrderItem(HttpServletRequest request, @RequestParam int orderId, Model model)
1100
            throws ProfitMandiBusinessException {
1101
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1102
        Map<Integer, Item> itemMap = new HashMap<>();
1103
        Map<Integer, CurrentInventorySnapshot> inventoryMap = new HashMap<>();
1104
        PendingOrder pendingPO = pendingOrderRepository.selectById(orderId);
1105
        Customer customer = customerRepository.selectById(pendingPO.getCustomerId());
1106
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(orderId);
1107
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1108
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1109
            CurrentInventorySnapshot cis = currentInventorySnapshotRepository
1110
                    .selectByItemAndFofoId(pendingOrderItem.getItemId(), pendingPO.getFofoId());
1111
            itemMap.put(pendingOrderItem.getItemId(), item);
1112
            LOGGER.info("cis" + cis);
1113
            inventoryMap.put(pendingOrderItem.getItemId(), cis);
1114
        }
28358 tejbeer 1115
 
32251 amit.gupta 1116
        LOGGER.info("inventoryMap" + inventoryMap);
1117
        model.addAttribute("pendingOrderItems", pendingOrderItems);
1118
        model.addAttribute("itemMap", itemMap);
1119
        model.addAttribute("inventoryMap", inventoryMap);
1120
        model.addAttribute("pendingPO", gson.toJson(pendingPO));
1121
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1122
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1123
        return "pending-order-item";
1124
    }
28350 tejbeer 1125
 
32251 amit.gupta 1126
    @RequestMapping(value = "/getPendingOrderItemById", method = RequestMethod.GET)
1127
    public String getPendingOrderItemById(HttpServletRequest request, @RequestParam int id, Model model)
1128
            throws Exception {
28339 tejbeer 1129
 
32251 amit.gupta 1130
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1131
        model.addAttribute("pendingOrderItem", pendingOrderItem);
1132
        return "cancel-pending-order";
1133
    }
28339 tejbeer 1134
 
32251 amit.gupta 1135
    @RequestMapping(value = "/getPendingOrderChangePartnerById", method = RequestMethod.GET)
1136
    public String getPendingOrderChangePartnerById(HttpServletRequest request, @RequestParam int id, Model model)
1137
            throws Exception {
28339 tejbeer 1138
 
32251 amit.gupta 1139
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1140
        Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(true);
1141
        model.addAttribute("customRetailersMap", customRetailersMap);
1142
        model.addAttribute("pendingOrder", pendingOrder);
1143
        return "change-partner-po";
1144
    }
28339 tejbeer 1145
 
32251 amit.gupta 1146
    @RequestMapping(value = "/changePendingOrderPartner", method = RequestMethod.POST)
1147
    public String changePendingOrderPartner(HttpServletRequest request, @RequestParam int id, @RequestParam int fofoId,
1148
                                            Model model) throws Exception {
27046 tejbeer 1149
 
32251 amit.gupta 1150
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1151
        pendingOrder.setFofoId(fofoId);
1152
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1153
 
32251 amit.gupta 1154
        return "response";
1155
    }
26647 tejbeer 1156
 
32251 amit.gupta 1157
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
1158
    public String cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String reason,
1159
                                         Model model) throws Exception {
28339 tejbeer 1160
 
32251 amit.gupta 1161
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1162
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
28339 tejbeer 1163
 
32251 amit.gupta 1164
        pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1165
        pendingOrderItem.setStatusDescription(loginDetails.getEmailId());
1166
        pendingOrderItem.setRemark(reason);
1167
        pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1168
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28339 tejbeer 1169
 
32251 amit.gupta 1170
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1171
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1172
 
32251 amit.gupta 1173
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
28339 tejbeer 1174
 
32251 amit.gupta 1175
        List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1176
 
32251 amit.gupta 1177
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1178
        pendingOrderItem.setItemName(item.getItemDescription());
1179
        catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1180
 
32251 amit.gupta 1181
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1182
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1183
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1184
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1185
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28339 tejbeer 1186
 
32251 amit.gupta 1187
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1188
 
32251 amit.gupta 1189
        Map<String, Object> emailModel = new HashMap<>();
1190
        emailModel.put("customer", customerAddress);
1191
        emailModel.put("pendingOrder", pendingOrder);
1192
        emailModel.put("date", dateTimeFormatter);
1193
        LOGGER.info("emal" + customer.getEmailId());
1194
        String[] customerEmail = null;
1195
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1196
            customerEmail = new String[]{customer.getEmailId()};
28339 tejbeer 1197
 
32251 amit.gupta 1198
            List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
28339 tejbeer 1199
 
32251 amit.gupta 1200
            emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel,
1201
                    customerEmail, null, bccTo.toArray(new String[0]));
28339 tejbeer 1202
 
32251 amit.gupta 1203
        }
28339 tejbeer 1204
 
32251 amit.gupta 1205
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1206
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1207
                && !status.contains(OrderStatus.CLAIMED)) {
1208
            pendingOrder.setStatus(OrderStatus.CLOSED);
1209
        }
1210
        pendingOrderItemRepository.persist(pendingOrderItem);
28339 tejbeer 1211
 
32251 amit.gupta 1212
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1213
 
32251 amit.gupta 1214
        return "response";
1215
    }
28339 tejbeer 1216
 
32251 amit.gupta 1217
    @RequestMapping(value = "/deliveredPendingOrderItem", method = RequestMethod.POST)
1218
    public String deliveredPendingOrderItem(HttpServletRequest request, @RequestParam int id, Model model)
1219
            throws Exception {
28339 tejbeer 1220
 
32251 amit.gupta 1221
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1222
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1223
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
30426 tejbeer 1224
 
32251 amit.gupta 1225
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1226
            pendingOrderItem.setStatus(OrderStatus.UNSETTLED);
1227
            pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
28339 tejbeer 1228
 
32251 amit.gupta 1229
        } else {
1230
            pendingOrderItem.setStatus(OrderStatus.SETTLED);
1231
            pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
28339 tejbeer 1232
 
32251 amit.gupta 1233
        }
28339 tejbeer 1234
 
32251 amit.gupta 1235
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1236
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1237
 
32251 amit.gupta 1238
        List<Integer> catalogIds = new ArrayList<>();
26647 tejbeer 1239
 
32251 amit.gupta 1240
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1241
        pendingOrderItem.setItemName(item.getItemDescription());
1242
        catalogIds.add(item.getCatalogItemId());
26721 tejbeer 1243
 
32251 amit.gupta 1244
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1245
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1246
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1247
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1248
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
27046 tejbeer 1249
 
32251 amit.gupta 1250
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28352 tejbeer 1251
 
32251 amit.gupta 1252
        Map<String, Object> emailModel = new HashMap<>();
1253
        emailModel.put("customer", customerAddress);
1254
        emailModel.put("pendingOrder", pendingOrder);
1255
        emailModel.put("date", dateTimeFormatter);
1256
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1257
        String[] customerEmail = null;
1258
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1259
            customerEmail = new String[]{customer.getEmailId()};
1260
            List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
28437 tejbeer 1261
 
32251 amit.gupta 1262
            emailService.sendMailWithAttachments("Order Delivered with SmartDukaan", "order-delivered.vm", emailModel,
1263
                    customerEmail, null, bccTo.toArray(new String[0]));
28437 tejbeer 1264
 
32251 amit.gupta 1265
        }
1266
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1267
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1268
                && !status.contains(OrderStatus.CLAIMED)) {
1269
            pendingOrder.setStatus(OrderStatus.CLOSED);
1270
        }
1271
        pendingOrderItemRepository.persist(pendingOrderItem);
1272
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28437 tejbeer 1273
 
32251 amit.gupta 1274
        return "response";
1275
    }
28437 tejbeer 1276
 
32251 amit.gupta 1277
    @RequestMapping(value = "/raiseClaimOrderItem", method = RequestMethod.POST)
1278
    public String raiseClaimOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28437 tejbeer 1279
 
32251 amit.gupta 1280
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1281
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1282
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28352 tejbeer 1283
 
32251 amit.gupta 1284
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1285
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1286
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
26721 tejbeer 1287
 
32251 amit.gupta 1288
        }
1289
        pendingOrderItemRepository.persist(pendingOrderItem);
1290
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1291
 
32251 amit.gupta 1292
        return "response";
1293
    }
26721 tejbeer 1294
 
32251 amit.gupta 1295
    @RequestMapping(value = "/verifyOrderItem", method = RequestMethod.POST)
1296
    public String verifyOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28352 tejbeer 1297
 
32251 amit.gupta 1298
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1299
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1300
        pendingOrderItem.setVerifiedTimestamp(LocalDateTime.now());
28352 tejbeer 1301
 
32251 amit.gupta 1302
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28352 tejbeer 1303
 
32251 amit.gupta 1304
        return "response";
1305
    }
28352 tejbeer 1306
 
32251 amit.gupta 1307
    @RequestMapping(value = "/cancelOrderByInvoice", method = RequestMethod.POST)
1308
    public String cancelOrder(HttpServletRequest request, @RequestParam List<String> invoiceNumbers, Model model)
1309
            throws Exception {
1310
        orderService.cancelOrder(invoiceNumbers);
1311
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28352 tejbeer 1312
 
32251 amit.gupta 1313
        return "response";
1314
    }
28352 tejbeer 1315
 
32251 amit.gupta 1316
    @RequestMapping(value = "/getOnlineOrder", method = RequestMethod.GET)
1317
    public String cancelOrder(HttpServletRequest request, Model model) throws Exception {
1318
        return "online-order";
1319
    }
28356 tejbeer 1320
 
32251 amit.gupta 1321
    @GetMapping("/getAllOrdersByStatus")
1322
    public String getAllOrdersByStatus(HttpServletRequest request, @RequestParam OrderStatus status,
1323
                                       @RequestParam(required = false) LocalDateTime startTime,
1324
                                       @RequestParam(required = false) LocalDateTime endTime, Model model) throws ProfitMandiBusinessException {
1325
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1326
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
28352 tejbeer 1327
 
32251 amit.gupta 1328
        LOGGER.info("startTime" + startTime);
1329
        LOGGER.info("endTime" + endTime);
28352 tejbeer 1330
 
32697 ranu 1331
        List<PendingOrderItem> pendingOrderItems;
32251 amit.gupta 1332
        if (startTime == null) {
32697 ranu 1333
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(status);
32251 amit.gupta 1334
        } else {
1335
            List<OrderStatus> statusList = new ArrayList<>();
1336
            if (status.equals(OrderStatus.DELIVERED)) {
1337
                statusList.add(OrderStatus.SETTLED);
1338
                statusList.add(OrderStatus.UNSETTLED);
1339
            } else {
1340
                statusList.add(status);
1341
            }
32697 ranu 1342
            pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(statusList,
32251 amit.gupta 1343
                    startTime.toLocalDate().atStartOfDay(), endTime);
1344
        }
28339 tejbeer 1345
 
32697 ranu 1346
        List<Integer> pendingOrderIds = pendingOrderItems.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
1347
 
1348
        List<Integer> fofoIds = pendingOrderRepository.selectByIds(pendingOrderIds)
1349
                .stream().map(x -> x.getFofoId()).distinct().collect(Collectors.toList());
1350
 
1351
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1352
 
1353
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1354
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1355
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1356
        model.addAttribute("customRetailersMap", customRetailersMap);
1357
 
1358
        LOGGER.info("customRetailersMap {}", customRetailersMap);
1359
 
1360
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, 0);
1361
 
1362
        model.addAttribute("pendingOrderItems", map.get("pendingOrderItems"));
32251 amit.gupta 1363
        model.addAttribute("partnerInventoryMap", map.get("partnerInventoryMap"));
28339 tejbeer 1364
 
32251 amit.gupta 1365
        model.addAttribute("isAdmin", isAdmin);
1366
        return "online-order-item";
1367
    }
28339 tejbeer 1368
 
32251 amit.gupta 1369
    @RequestMapping(value = "/franchiseeSalesReport", method = RequestMethod.GET)
1370
    public String getFranchiseeSalesReport(HttpServletRequest request, Model model)
1371
            throws ProfitMandiBusinessException {
1372
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
28339 tejbeer 1373
 
32251 amit.gupta 1374
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1375
        LocalDateTime currentStartMonth = currentDate.minusDays(30).toLocalDate().atStartOfDay();
1376
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoDetails.getFofoId());
28339 tejbeer 1377
 
32251 amit.gupta 1378
        List<FocoSaleReportModel> focoSaleReportList = fofoOrderRepository.selectFocoSaleReport(fofoDetails.getFofoId(),
1379
                fs.getCode(), currentStartMonth, currentDate);
28339 tejbeer 1380
 
32251 amit.gupta 1381
        LOGGER.info("focoSaleReportList {}", focoSaleReportList);
28339 tejbeer 1382
 
32251 amit.gupta 1383
        model.addAttribute("startDate", currentDate.minusDays(30).toLocalDate());
1384
        model.addAttribute("endDate", LocalDate.now());
1385
        model.addAttribute("focoSaleReportList", focoSaleReportList);
1386
        return "foco-sale-report";
1387
    }
28339 tejbeer 1388
 
32251 amit.gupta 1389
    @RequestMapping(value = "/downloadFranchiseeSales", method = RequestMethod.GET)
1390
    public ResponseEntity<?> getdownloadFranchiseeSales(HttpServletRequest request,
1391
                                                        @RequestParam(name = "startDate", required = true, defaultValue = "") LocalDate startDate,
1392
                                                        @RequestParam(name = "endDate", required = true, defaultValue = "") LocalDate endDate, Model model)
1393
            throws Exception {
1394
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1395
        List<List<?>> rows = new ArrayList<>();
28339 tejbeer 1396
 
32251 amit.gupta 1397
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoDetails.getFofoId());
1398
        List<FocoSaleReportModel> focoSaleReportList = fofoOrderRepository.selectFocoSaleReport(fofoDetails.getFofoId(),
1399
                fs.getCode(), startDate.atStartOfDay(), endDate.atStartOfDay());
1400
        LOGGER.info("FocoSaleReportList {}", focoSaleReportList);
28339 tejbeer 1401
 
32251 amit.gupta 1402
        for (FocoSaleReportModel fsr : focoSaleReportList) {
28339 tejbeer 1403
 
32251 amit.gupta 1404
            rows.add(Arrays.asList(fsr.getCode(), fsr.getName(), fsr.getCity(), fsr.getState(), fsr.getRegion(),
1405
                    fsr.getItemId(), fsr.getBrand(), fsr.getModelName(), fsr.getModelNumber(), fsr.getColor(),
1406
                    fsr.getQuantity(), fsr.getDp(), fsr.getSellingPrice(), fsr.getMop(), fsr.getSerialNumber(),
1407
                    FormattingUtils.format(fsr.getCreateDate()), fsr.getCustomerName(), fsr.getCustomerPhone(),
1408
                    fsr.getCustomerCity(), fsr.getCustomerPincode(), fsr.getInvoiceNumber(), fsr.getPurchaseReference(),
1409
                    fsr.getCustomerGstNumber(), FormattingUtils.format(fsr.getCancelledTimestamp()),
1410
                    FormattingUtils.format(fsr.getGrnCompleteDate()), fsr.getHygieneRating(), fsr.getRating(),
1411
                    fsr.getStatus(), fsr.getRemark(), FormattingUtils.format(fsr.getCreatedTimestamp()),
1412
                    FormattingUtils.format(fsr.getDisposedTimestamp()),
1413
                    FormattingUtils.format(fsr.getNextTimestamp()),
1414
                    FormattingUtils.format(fsr.getActivationTimestamp()),
1415
                    FormattingUtils.format(fsr.getActivationTimestamp()), fsr.getLabel()));
28339 tejbeer 1416
 
32251 amit.gupta 1417
        }
28339 tejbeer 1418
 
32251 amit.gupta 1419
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1420
                Arrays.asList("Code", "Name", "City", "State", "Region", "Item Id", "Brand", "Model Name",
1421
                        "Model Number", "Color", "Quantity", "Dp", "Selling_Price", "mop", "Serial Number",
1422
                        "Create Date", "Customer Name", "Customer Phone", "Customer City", " Customer Pincode",
1423
                        "Invoice  Number", "Purchase Reference", "Customer Gst Number", " Cancelled Timestamp",
1424
                        "GRN Complete Date", "Hygiene Rating", "Rating", "Status", "Remark", "Created Timestamp",
1425
                        "Disposed Timestamp", " Next Timestamp", "Activation Timestamp", "Create Timestamp", "Label"),
1426
                rows);
28339 tejbeer 1427
 
32251 amit.gupta 1428
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Franchisee Sales Report");
28339 tejbeer 1429
 
32251 amit.gupta 1430
        return responseEntity;
28339 tejbeer 1431
 
32251 amit.gupta 1432
    }
28339 tejbeer 1433
 
32251 amit.gupta 1434
    @RequestMapping(value = "/downloadWalletSummaryReport", method = RequestMethod.GET)
1435
    public ResponseEntity<?> getDownloadWalletSummaryReport(HttpServletRequest request,
1436
                                                            @RequestParam(name = "startDate", required = true, defaultValue = "") LocalDate startDate,
1437
                                                            @RequestParam(name = "endDate", required = true, defaultValue = "") LocalDate endDate, Model model)
1438
            throws Exception {
28339 tejbeer 1439
 
32251 amit.gupta 1440
        List<List<?>> rows = new ArrayList<>();
1441
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1442
        List<WalletSummaryReportModel> walletSummartList = fofoOrderRepository.selectWalletSummaryReport(
1443
                fofoDetails.getFofoId(), startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
1444
        LOGGER.info("walletSummartList {}", walletSummartList);
1445
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
28339 tejbeer 1446
 
32251 amit.gupta 1447
        for (WalletSummaryReportModel walletSummary : walletSummartList) {
28344 tejbeer 1448
 
32251 amit.gupta 1449
            rows.add(Arrays.asList(walletSummary.getId(), walletSummary.getCode(), walletSummary.getName(),
1450
                    walletSummary.getEmail(), walletSummary.getPhone(), walletSummary.getAmount(),
1451
                    walletSummary.getRefundableAmount(), walletSummary.getReference(), walletSummary.getReferenceType(),
1452
                    FormattingUtils.format(walletSummary.getBusinessTimestamp())));
28350 tejbeer 1453
 
32251 amit.gupta 1454
        }
28350 tejbeer 1455
 
32251 amit.gupta 1456
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1457
                .getCSVByteStream(Arrays.asList("Id", "Code", "Name", "Email", "Phone", "Amount", "Refundable_amount",
1458
                        "Reference", "Reference_type", "Business_timestamp", "Description"), rows);
28344 tejbeer 1459
 
32251 amit.gupta 1460
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Wallet Statement Report");
27819 tejbeer 1461
 
32251 amit.gupta 1462
        return responseEntity;
27819 tejbeer 1463
 
32251 amit.gupta 1464
    }
28358 tejbeer 1465
 
32251 amit.gupta 1466
    @RequestMapping(value = "/walletSummaryReport", method = RequestMethod.GET)
1467
    public String getWalletSummaryReport(HttpServletRequest request, Model model) throws Exception {
1468
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
28358 tejbeer 1469
 
32251 amit.gupta 1470
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1471
        LocalDateTime currentStartMonth = currentDate.minusDays(30).toLocalDate().atStartOfDay();
28420 tejbeer 1472
 
32251 amit.gupta 1473
        List<WalletSummaryReportModel> walletSummartList = fofoOrderRepository
1474
                .selectWalletSummaryReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1475
        LOGGER.info("walletSummartList {}", walletSummartList);
28420 tejbeer 1476
 
32251 amit.gupta 1477
        model.addAttribute("startDate", currentDate.minusDays(30).toLocalDate());
1478
        model.addAttribute("endDate", LocalDate.now());
1479
        model.addAttribute("walletSummartList", walletSummartList);
28358 tejbeer 1480
 
32251 amit.gupta 1481
        return "wallet-summary-report";
1482
    }
30426 tejbeer 1483
 
32251 amit.gupta 1484
    @RequestMapping(value = "/pendingIndentReport", method = RequestMethod.GET)
1485
    public String getPendingIndentReport(HttpServletRequest request, Model model) throws Exception {
1486
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
28358 tejbeer 1487
 
32251 amit.gupta 1488
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1489
        LocalDateTime currentStartMonth = currentDate.minusMonths(2).toLocalDate().atStartOfDay();
28358 tejbeer 1490
 
32251 amit.gupta 1491
        List<PendingIndentReportModel> pendingIndentReports = fofoOrderRepository
1492
                .selectPendingIndentReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1493
        LOGGER.info("pendingIndentReports {}", pendingIndentReports);
28358 tejbeer 1494
 
32251 amit.gupta 1495
        model.addAttribute("startDate", currentDate.minusMonths(2).toLocalDate());
1496
        model.addAttribute("endDate", LocalDate.now());
1497
        model.addAttribute("pendingIndentReports", pendingIndentReports);
30426 tejbeer 1498
 
32251 amit.gupta 1499
        return "pending-indent-report";
1500
    }
30426 tejbeer 1501
 
32251 amit.gupta 1502
    @RequestMapping(value = "/pendingIndentReportDownload", method = RequestMethod.GET)
1503
    public ResponseEntity<?> getPendingIndentReportDownload(HttpServletRequest request, Model model) throws Exception {
1504
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1505
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1506
        LocalDateTime currentStartMonth = currentDate.minusMonths(2).toLocalDate().atStartOfDay();
1507
        List<List<?>> rows = new ArrayList<>();
1508
        List<PendingIndentReportModel> pendingIndentReports = fofoOrderRepository
1509
                .selectPendingIndentReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1510
        LOGGER.info("pendingIndentReports {}", pendingIndentReports);
1511
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
28377 tejbeer 1512
 
32251 amit.gupta 1513
        for (PendingIndentReportModel pir : pendingIndentReports) {
30426 tejbeer 1514
 
32251 amit.gupta 1515
            rows.add(Arrays.asList(pir.getTransactionId(), pir.getOrderId(),
1516
                    pir.getCreatTimestamp().format(dateTimeFormatter), pir.getItemId(), pir.getBrand(),
1517
                    pir.getModelName(), pir.getModelNumber(), pir.getColor(), pir.getQuantity(), pir.getUnitPrice(),
1518
                    pir.getWalletAmount(), pir.getStatus(), pir.getInvoiceNumber(),
1519
                    pir.getBillingTimestamp().format(dateTimeFormatter)));
30426 tejbeer 1520
 
32251 amit.gupta 1521
        }
30426 tejbeer 1522
 
32251 amit.gupta 1523
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList(
1524
                "Transaction Id", "Order Id", "Created_At", "Item_Id", "Brand", "Model Name", "Model Number", "Color",
1525
                "Quantity", "Unit Price", "Wallet Deduction", "Status", "Invoice Number", "Billing Timestamp"), rows);
30162 manish 1526
 
32251 amit.gupta 1527
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Order Status Summary Report");
31384 tejbeer 1528
 
32251 amit.gupta 1529
        return responseEntity;
1530
    }
30162 manish 1531
 
32251 amit.gupta 1532
    @RequestMapping(value = "/schemePayoutReport", method = RequestMethod.GET)
1533
    public String getSchemePayoutReport(HttpServletRequest request, Model model) throws Exception {
1534
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30162 manish 1535
 
32251 amit.gupta 1536
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1537
        LocalDateTime startDate = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30162 manish 1538
 
32251 amit.gupta 1539
        List<SchemePayoutReportModel> schemePayoutReports = fofoOrderRepository
1540
                .selectSchemePayoutReport(fofoDetails.getFofoId(), startDate, currentDate);
1541
        LOGGER.info("schemePayoutReports {}", schemePayoutReports);
30162 manish 1542
 
32251 amit.gupta 1543
        model.addAttribute("startDate", currentDate.minusMonths(3).toLocalDate());
1544
        model.addAttribute("endDate", LocalDate.now());
1545
        model.addAttribute("schemePayoutReports", schemePayoutReports);
30162 manish 1546
 
32251 amit.gupta 1547
        return "scheme-payout-report";
1548
    }
30162 manish 1549
 
32251 amit.gupta 1550
    @RequestMapping(value = "/selectPartnerBillingSummaryReport", method = RequestMethod.GET)
1551
    public String getselectPartnerBillingSummaryReport(HttpServletRequest request, Model model) throws Exception {
1552
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30426 tejbeer 1553
 
32251 amit.gupta 1554
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1555
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30162 manish 1556
 
32251 amit.gupta 1557
        List<PartnerBillingSummaryModel> partnerBillingSummaryReports = fofoOrderRepository
1558
                .selectPartnerBillingSummaryReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
30162 manish 1559
 
32251 amit.gupta 1560
        model.addAttribute("startDate", currentDate.minusMonths(3).toLocalDate());
1561
        model.addAttribute("endDate", LocalDate.now());
1562
        model.addAttribute("partnerBillingSummaryReports", partnerBillingSummaryReports);
30162 manish 1563
 
32251 amit.gupta 1564
        return "partner-billing-summary-report";
1565
    }
30162 manish 1566
 
32251 amit.gupta 1567
    @RequestMapping(value = "/priceDropReport", method = RequestMethod.GET)
1568
    public String getSelectPriceDropReport(HttpServletRequest request, Model model) throws Exception {
1569
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30162 manish 1570
 
32251 amit.gupta 1571
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1572
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30162 manish 1573
 
32251 amit.gupta 1574
        List<PriceDropReportModel> priceDropReports = orderRepository.selectPriceDropReport(fofoDetails.getFofoId(),
1575
                currentStartMonth, currentDate);
30162 manish 1576
 
32251 amit.gupta 1577
        model.addAttribute("startDate", currentDate.minusMonths(3).toLocalDate());
1578
        model.addAttribute("endDate", LocalDate.now());
1579
        model.addAttribute("priceDropReports", priceDropReports);
30162 manish 1580
 
32251 amit.gupta 1581
        return "price-drop-report";
1582
    }
30426 tejbeer 1583
 
32251 amit.gupta 1584
    @RequestMapping(value = "/downloadPriceDropReport", method = RequestMethod.GET)
1585
    public ResponseEntity<?> getSelectDownloadPriceDropReport(HttpServletRequest request,
1586
                                                              @RequestParam(name = "startDate", required = true, defaultValue = "") LocalDate startDate,
1587
                                                              @RequestParam(name = "endDate", required = true, defaultValue = "") LocalDate endDate, Model model)
1588
            throws Exception {
1589
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30162 manish 1590
 
32251 amit.gupta 1591
        List<List<?>> rows = new ArrayList<>();
1592
        List<PriceDropReportModel> priceDropReports = orderRepository.selectPriceDropReport(fofoDetails.getFofoId(),
1593
                startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
30426 tejbeer 1594
 
32251 amit.gupta 1595
        for (PriceDropReportModel pdr : priceDropReports) {
30426 tejbeer 1596
 
32251 amit.gupta 1597
            rows.add(Arrays.asList(pdr.getCode(), pdr.getId(), pdr.getBrand(), pdr.getModelName(), pdr.getModelNumber(),
1598
                    pdr.getAffectedOn(), pdr.getAmount(), pdr.getPartnerPayout(), pdr.getImei(), pdr.getStatus(),
1599
                    pdr.getUpdateTimestamp(), pdr.getRejectionReason()));
30426 tejbeer 1600
 
32251 amit.gupta 1601
        }
1602
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1603
                .getCSVByteStream(Arrays.asList("code", "Price_Drop_Id", "brand", "model_name", "model_number",
1604
                        "affected_on", "amount", "partner_payout", "Imei", "status", "processed_on", "Reason"), rows);
30426 tejbeer 1605
 
32251 amit.gupta 1606
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "price drop report");
30162 manish 1607
 
32251 amit.gupta 1608
        return responseEntity;
30426 tejbeer 1609
 
32251 amit.gupta 1610
    }
30426 tejbeer 1611
 
32251 amit.gupta 1612
    @RequestMapping(value = "/downloadPartnerBillingSummaryReport", method = RequestMethod.GET)
1613
    public ResponseEntity<?> getdownloadPartnerBillingSummaryReport(HttpServletRequest request,
1614
                                                                    @RequestParam(name = "startDate", required = true, defaultValue = "") LocalDate startDate,
1615
                                                                    @RequestParam(name = "endDate", required = true, defaultValue = "") LocalDate endDate, Model model)
1616
            throws Exception {
30426 tejbeer 1617
 
32251 amit.gupta 1618
        List<List<?>> rows = new ArrayList<>();
1619
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30426 tejbeer 1620
 
32251 amit.gupta 1621
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1622
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30162 manish 1623
 
32251 amit.gupta 1624
        List<PartnerBillingSummaryModel> partnerBillingSummaryReports = fofoOrderRepository
1625
                .selectPartnerBillingSummaryReport(fofoDetails.getFofoId(), startDate.atStartOfDay(),
1626
                        endDate.atTime(LocalTime.MAX));
30426 tejbeer 1627
 
32251 amit.gupta 1628
        for (PartnerBillingSummaryModel pbsr : partnerBillingSummaryReports) {
30426 tejbeer 1629
 
32251 amit.gupta 1630
            rows.add(Arrays.asList(pbsr.getId(),
1631
                    FormattingUtils.format(pbsr.getCreateTimestamp()),
1632
                    FormattingUtils.format(pbsr.getBillingTimestamp()),
1633
                    FormattingUtils.format(pbsr.getDeliveryTimestamp()),
1634
                    FormattingUtils.format(pbsr.getPartnerGrnTimestamp()),
1635
                    pbsr.getTransactionId(),
1636
                    pbsr.getLogisticsTransactionId(), pbsr.getAirwayBillNumber(), pbsr.getStatusSubGroup(),
1637
                    pbsr.getStatusName(), pbsr.getRetailerId(), pbsr.getRetailerName(), pbsr.getItemId(),
1638
                    pbsr.getBrand(), pbsr.getModelName(), pbsr.getModelNumber(), pbsr.getColor(), pbsr.getUnitPrice(),
1639
                    pbsr.getQuantity(), pbsr.getTotalPrice(), pbsr.getInvoiceNumber(), pbsr.getIgstRate(),
1640
                    pbsr.getCgstRate(), pbsr.getSgstRate()));
30162 manish 1641
 
32251 amit.gupta 1642
        }
30426 tejbeer 1643
 
32251 amit.gupta 1644
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("OrderId",
1645
                "Created On", "Billed On", "Delivered On", "Grned On", "Transaction_id", "master_order_id",
1646
                "airwaybill_no", "statusSubGroupp", "statusName", "customer_id", "customer_name", "Item_Id", "brand",
1647
                "model_name", "model_number", "color", "selling_price", "Quantity", "total_price", "invoice_number",
1648
                "igstrate", "cgstrate", "sgstrate"), rows);
30426 tejbeer 1649
 
32251 amit.gupta 1650
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Billing Statement Report");
30426 tejbeer 1651
 
32251 amit.gupta 1652
        return responseEntity;
30162 manish 1653
 
32251 amit.gupta 1654
    }
30426 tejbeer 1655
 
32251 amit.gupta 1656
    @RequestMapping(value = "/invoiceSchemeOutSummaryReport", method = RequestMethod.GET)
1657
    public String getInvoiceSchemeOutSummaryReport(HttpServletRequest request, Model model) throws Exception {
1658
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30426 tejbeer 1659
 
32251 amit.gupta 1660
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1661
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30426 tejbeer 1662
 
32251 amit.gupta 1663
        List<FocoSchemeOutReportModel> focoSchemeOutReports = fofoOrderRepository
1664
                .selectInvoiceSchemeOutSummaryReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1665
        LOGGER.info("focoSchemeOutReportModel {}", focoSchemeOutReports);
30426 tejbeer 1666
 
32251 amit.gupta 1667
        model.addAttribute("startDate", currentDate.minusMonths(3).toLocalDate());
1668
        model.addAttribute("endDate", LocalDate.now());
1669
        model.addAttribute("focoSchemeOutReports", focoSchemeOutReports);
30426 tejbeer 1670
 
32251 amit.gupta 1671
        return "invoicewise-scheme-out-report";
1672
    }
30426 tejbeer 1673
 
32251 amit.gupta 1674
    @RequestMapping(value = "/downloadInvoiceSchemeOutSummaryReport", method = RequestMethod.GET)
1675
    public ResponseEntity<?> getDownloadInvoiceSchemeOutSummaryReport(HttpServletRequest request, Model model)
1676
            throws Exception {
1677
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30426 tejbeer 1678
 
32251 amit.gupta 1679
        List<List<?>> rows = new ArrayList<>();
1680
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1681
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30426 tejbeer 1682
 
32251 amit.gupta 1683
        List<FocoSchemeOutReportModel> focoSchemeOutReports = fofoOrderRepository
1684
                .selectInvoiceSchemeOutSummaryReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1685
        LOGGER.info("focoSchemeOutReportModel {}", focoSchemeOutReports);
30426 tejbeer 1686
 
32251 amit.gupta 1687
        for (FocoSchemeOutReportModel fsor : focoSchemeOutReports) {
1688
            rows.add(Arrays.asList(fsor.getInvoiceNumber(), fsor.getQuantity(), fsor.getBrand(), fsor.getModelName(),
1689
                    fsor.getModelNumber(), fsor.getColor(), fsor.getAmount()));
30426 tejbeer 1690
 
32251 amit.gupta 1691
        }
30426 tejbeer 1692
 
32251 amit.gupta 1693
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1694
                Arrays.asList("InvoiceNumber", "Quantity", "Brand", "Model Name", "Model Number", "Color", "Amount"),
1695
                rows);
30426 tejbeer 1696
 
32251 amit.gupta 1697
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows,
1698
                "invoice wise scheme out Summary Report");
30426 tejbeer 1699
 
32251 amit.gupta 1700
        return responseEntity;
1701
    }
30426 tejbeer 1702
 
32251 amit.gupta 1703
    @RequestMapping(value = "/schemePayoutReportDownload", method = RequestMethod.GET)
1704
    public ResponseEntity<?> getSchemePayoutReportDownload(HttpServletRequest request,
1705
                                                           @RequestParam(name = "startDate", required = true, defaultValue = "") LocalDate startDate,
1706
                                                           @RequestParam(name = "endDate", required = true, defaultValue = "") LocalDate endDate, Model model)
1707
            throws Exception {
1708
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
30426 tejbeer 1709
 
32251 amit.gupta 1710
        List<List<?>> rows = new ArrayList<>();
1711
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1712
        LocalDateTime currentStartMonth = currentDate.minusMonths(3).toLocalDate().atStartOfDay();
30162 manish 1713
 
32251 amit.gupta 1714
        List<SchemePayoutReportModel> schemePayoutReports = fofoOrderRepository
1715
                .selectSchemePayoutReport(fofoDetails.getFofoId(), currentStartMonth, currentDate);
1716
        LOGGER.info("schemePayoutReports {}", schemePayoutReports);
30426 tejbeer 1717
 
32251 amit.gupta 1718
        for (SchemePayoutReportModel spr : schemePayoutReports) {
30426 tejbeer 1719
 
32251 amit.gupta 1720
            rows.add(Arrays.asList(spr.getId(), spr.getSerialNumber(), spr.getBrand(), spr.getModelName(),
1721
                    spr.getModelNumber(), spr.getColor(), spr.getSchemeInDp(), spr.getSchemeOutDp(), spr.getSchemeId(),
1722
                    spr.getName(), spr.getType(), spr.getAmountType(), spr.getPurchaseReference(),
1723
                    spr.getInvoiceNumber(), spr.getSioAmount(), spr.getStatus(), spr.getStatusDescription(),
1724
                    spr.getCreateTimestamp(), spr.getRolledBackTimestamp()));
30162 manish 1725
 
32251 amit.gupta 1726
        }
1727
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("Item_Id",
1728
                "serial_number", "Brand", "Model Name", "Model Number", "Color", "Scheme_IN_DP", "Scheme_out_dp",
1729
                "Scheme_Id", "Name", "Type", "amount", "Purchase_Invoice", "SALE_INOVOICE", "Amount", "status",
1730
                "description", "create_timestamp", "rolled_back_timestamp"), rows);
30162 manish 1731
 
32251 amit.gupta 1732
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Scheme Payout Summary Report");
30426 tejbeer 1733
 
32251 amit.gupta 1734
        return responseEntity;
1735
    }
30426 tejbeer 1736
 
32251 amit.gupta 1737
    @GetMapping("/getAllOnlineOrder")
1738
    public String getAllOrders(HttpServletRequest request, @RequestParam(required = false) LocalDate date, Model model)
1739
            throws ProfitMandiBusinessException {
1740
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1741
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1742
        if (date == null) {
1743
            date = LocalDate.now().minusDays(3);
1744
        }
30177 manish 1745
 
32251 amit.gupta 1746
        LOGGER.info("date" + date);
1747
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1748
                .collect(Collectors.toList());
30426 tejbeer 1749
 
32251 amit.gupta 1750
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
30426 tejbeer 1751
 
32251 amit.gupta 1752
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1753
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1754
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
30426 tejbeer 1755
 
32251 amit.gupta 1756
        model.addAttribute("customRetailersMap", customRetailersMap);
30177 manish 1757
 
32251 amit.gupta 1758
        List<PendingOrderItem> pendingOrderItem = null;
30426 tejbeer 1759
 
32251 amit.gupta 1760
        pendingOrderItem = pendingOrderItemRepository.selectAll(date.atStartOfDay(), LocalDateTime.now());
30177 manish 1761
 
32251 amit.gupta 1762
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, 0);
30177 manish 1763
 
32251 amit.gupta 1764
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1765
        model.addAttribute("partnerInventoryMap", map.get("partnerInventoryMap"));
1766
        model.addAttribute("date", date);
1767
        model.addAttribute("isAdmin", isAdmin);
1768
        return "online-all-order-item";
1769
    }
32409 amit.gupta 1770
}
32405 jai.hind 1771
 
1772
 
1773
 
1774
 
1775