Subversion Repositories SmartDukaan

Rev

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

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