Subversion Repositories SmartDukaan

Rev

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