Subversion Repositories SmartDukaan

Rev

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

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