Subversion Repositories SmartDukaan

Rev

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