Subversion Repositories SmartDukaan

Rev

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