Subversion Repositories SmartDukaan

Rev

Rev 33247 | Rev 33367 | 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;
33213 tejus.loha 8
import com.spice.profitmandi.common.util.FileUtil;
21689 ashik.ali 9
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 10
import com.spice.profitmandi.common.util.StringUtils;
22244 ashik.ali 11
import com.spice.profitmandi.common.web.util.ResponseSender;
33213 tejus.loha 12
import com.spice.profitmandi.dao.entity.auth.AuthUser;
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.*;
33213 tejus.loha 19
import com.spice.profitmandi.dao.entity.transaction.TransactionApproval;
33336 tejus.loha 20
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
23298 ashik.ali 21
import com.spice.profitmandi.dao.entity.user.Address;
23548 ashik.ali 22
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
27046 tejbeer 23
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
33213 tejus.loha 24
import com.spice.profitmandi.dao.enumuration.transaction.TransactionApprovalStatus;
25
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
23638 amit.gupta 26
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
27861 tejbeer 27
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
30322 amit.gupta 28
import com.spice.profitmandi.dao.repository.dtr.*;
29
import com.spice.profitmandi.dao.repository.fofo.*;
24440 amit.gupta 30
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
33336 tejus.loha 31
import com.spice.profitmandi.dao.repository.transaction.*;
23298 ashik.ali 32
import com.spice.profitmandi.dao.repository.user.AddressRepository;
33336 tejus.loha 33
import com.spice.profitmandi.dao.repository.user.CartRepository;
28377 tejbeer 34
import com.spice.profitmandi.service.EmailService;
32251 amit.gupta 35
import com.spice.profitmandi.service.NotificationService;
23798 amit.gupta 36
import com.spice.profitmandi.service.authentication.RoleManager;
25726 amit.gupta 37
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
24440 amit.gupta 38
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
33172 tejus.loha 39
import com.spice.profitmandi.service.order.BulkOrderService;
23366 ashik.ali 40
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 41
import com.spice.profitmandi.service.pricing.PricingService;
33213 tejus.loha 42
import com.spice.profitmandi.service.transaction.TransactionService;
26647 tejbeer 43
import com.spice.profitmandi.service.user.RetailerService;
33336 tejus.loha 44
import com.spice.profitmandi.service.wallet.WalletService;
32405 jai.hind 45
import com.spice.profitmandi.service.whatsapp.WhatsappMessageService;
32855 amit.gupta 46
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
22139 amit.gupta 47
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 48
import com.spice.profitmandi.web.util.CookiesProcessor;
24105 govind 49
import com.spice.profitmandi.web.util.MVCResponseSender;
33336 tejus.loha 50
import in.shop2020.model.v1.order.WalletReferenceType;
30148 amit.gupta 51
import org.apache.logging.log4j.LogManager;
52
import org.apache.logging.log4j.Logger;
32405 jai.hind 53
import org.json.JSONArray;
30148 amit.gupta 54
import org.json.JSONObject;
55
import org.springframework.beans.factory.annotation.Autowired;
56
import org.springframework.core.io.InputStreamResource;
57
import org.springframework.http.HttpHeaders;
58
import org.springframework.http.HttpStatus;
59
import org.springframework.http.MediaType;
60
import org.springframework.http.ResponseEntity;
61
import org.springframework.stereotype.Controller;
62
import org.springframework.transaction.annotation.Transactional;
63
import org.springframework.ui.Model;
64
import org.springframework.web.bind.annotation.*;
33172 tejus.loha 65
import org.springframework.web.multipart.MultipartFile;
21612 ashik.ali 66
 
33336 tejus.loha 67
import javax.mail.MessagingException;
30148 amit.gupta 68
import javax.servlet.http.HttpServletRequest;
69
import javax.servlet.http.HttpServletResponse;
32409 amit.gupta 70
import java.io.ByteArrayInputStream;
71
import java.io.ByteArrayOutputStream;
33336 tejus.loha 72
import java.io.IOException;
32409 amit.gupta 73
import java.io.InputStream;
32271 amit.gupta 74
import java.nio.charset.StandardCharsets;
30148 amit.gupta 75
import java.time.LocalDateTime;
76
import java.time.format.DateTimeFormatter;
77
import java.time.temporal.ChronoUnit;
78
import java.util.*;
79
import java.util.stream.Collectors;
80
 
21612 ashik.ali 81
@Controller
23973 govind 82
@Transactional(rollbackFor = Throwable.class)
21612 ashik.ali 83
public class OrderController {
84
 
33213 tejus.loha 85
    private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 86
 
33213 tejus.loha 87
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
88
    private static final List<String> allowedDoaImeis = Arrays.asList("863903054378477");
89
    @Autowired
90
    NotificationService notificationService;
91
    @Autowired
92
    TransactionApprovalRepository transactionApprovalRepository;
93
    @Autowired
94
    LineItemRepository lineItemRepository;
95
    @Autowired
96
    AuthRepository authRepository;
97
    @Autowired
98
    TransactionService transactionService;
99
    @Autowired
100
    BulkOrderService bulkOrderService;
101
    @Autowired
102
    private CustomerRepository customerRepository;
103
    private boolean accessoriesDeals = true;
104
    @Autowired
105
    private RoleManager roleManager;
106
    @Autowired
107
    private Gson gson;
108
    @Autowired
109
    private CustomerReturnItemRepository customerReturnItemRepository;
110
    @Autowired
111
    private FofoOrderItemRepository fofoOrderItemRepository;
112
    @Autowired
113
    private PaymentOptionRepository paymentOptionRepository;
114
    @Autowired
115
    private StateRepository stateRepository;
116
    @Autowired
117
    private ItemRepository itemRepository;
118
    @Autowired
119
    private MVCResponseSender mvcResponseSender;
120
    @Autowired
121
    private InsuranceService insuranceService;
122
    @Autowired
123
    private FofoOrderRepository fofoOrderRepository;
124
    @Autowired
125
    private CustomerAddressRepository customerAddressRepository;
126
    @Autowired
127
    private InsurancePolicyRepository insurancePolicyRepository;
128
    @Autowired
129
    private InsuranceProviderRepository insuranceProviderRepository;
130
    @Autowired
131
    private CookiesProcessor cookiesProcessor;
132
    @Autowired
133
    private PricingService pricingService;
134
    @Autowired
135
    private OrderService orderService;
136
    @Autowired
137
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
138
    @Autowired
139
    private AddressRepository addressRepository;
140
    @Autowired
141
    private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
142
    @Autowired
143
    private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
144
    @Autowired
145
    private ResponseSender<?> responseSender;
146
    @Autowired
147
    private PendingOrderRepository pendingOrderRepository;
148
    @Autowired
149
    private OrderRepository orderRepository;
150
    @Autowired
151
    private PendingOrderItemRepository pendingOrderItemRepository;
152
    @Autowired
153
    private FofoStoreRepository fofoStoreRepository;
154
    @Autowired
155
    private RetailerService retailerService;
156
    @Autowired
157
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
158
    @Autowired
159
    private TagListingRepository tagListingRepository;
160
    @Autowired
161
    private PendingOrderService pendingOrderService;
162
    @Autowired
163
    private EmailService emailService;
164
    @Autowired
165
    private SolrService commonSolrService;
166
    @Autowired
167
    private MouRepository mouRepository;
168
    @Autowired
169
    private WhatsappMessageService whatsappMessageService;
170
    @Autowired
171
    private TransactionRepository transactionRepository;
33336 tejus.loha 172
    @Autowired
173
    WalletService walletService;
174
    @Autowired
175
    CartRepository cartRepository;
176
    @Autowired
177
    UserWalletRepository userWalletRepository;
28339 tejbeer 178
 
33336 tejus.loha 179
 
33213 tejus.loha 180
    @RequestMapping(value = "/order")
181
    public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model)
182
            throws ProfitMandiBusinessException {
183
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32405 jai.hind 184
 
33213 tejus.loha 185
        int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
186
        Address address = addressRepository.selectById(addressId);
23973 govind 187
 
33213 tejus.loha 188
        List<CartFofo> cartItems = orderService.cartCheckout(cartData);
189
        Set<Integer> itemIds = new HashSet<>();
190
        List<Integer> poIds = new ArrayList<>();
191
        List<Integer> poItemIds = new ArrayList<>();
192
        for (CartFofo cartFofo : cartItems) {
193
            itemIds.add(cartFofo.getItemId());
194
            if (cartFofo.getPoId() != 0) {
195
                poIds.add(cartFofo.getPoId());
196
                poItemIds.add(cartFofo.getPoItemId());
197
            }
198
        }
21985 kshitij.so 199
 
33213 tejus.loha 200
        PendingOrder po = null;
201
        Customer customer = null;
202
        PendingOrderItem poi = null;
203
        Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds,
204
                loginDetails.getFofoId());
205
        List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
206
                .selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
23973 govind 207
 
33213 tejus.loha 208
        if (!poIds.isEmpty()) {
209
            po = pendingOrderRepository.selectById(poIds.get(0));
210
            customer = customerRepository.selectById(po.getCustomerId());
211
            if (!offlineOrders.contains(po.getPayMethod())) {
212
                paymentOptionIds.add(23);
213
            }
214
        }
27046 tejbeer 215
 
33213 tejus.loha 216
        if (!poItemIds.isEmpty()) {
217
            poi = pendingOrderItemRepository.selectById(poItemIds.get(0));
218
        }
23973 govind 219
 
33213 tejus.loha 220
        // List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new
221
        // HashSet<>(paymentOptionIds));
21985 kshitij.so 222
 
33213 tejus.loha 223
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectActiveOption();
29642 amit.gupta 224
 
33213 tejus.loha 225
        LOGGER.info("pendingOrder" + po);
226
        LOGGER.info("pendingOrderItem" + poi);
24844 amit.gupta 227
 
33213 tejus.loha 228
        LOGGER.info("mopPriceMap {}", mopPriceMap);
229
        model.addAttribute("stateNames",
230
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
231
        model.addAttribute("retailerStateName", address.getState());
232
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
233
        model.addAttribute("pendingPO", gson.toJson(po));
23973 govind 234
 
33213 tejus.loha 235
        model.addAttribute("cartItems", cartItems);
236
        model.addAttribute("pendingOrder", po);
237
        model.addAttribute("pendingOrderItem", poi);
21985 kshitij.so 238
 
33213 tejus.loha 239
        model.addAttribute("mopPriceMap", mopPriceMap);
240
        model.addAttribute("paymentOptions", paymentOptions);
241
        model.addAttribute("accessoriesDeals", accessoriesDeals);
242
        return "order-index";
243
    }
24844 amit.gupta 244
 
33213 tejus.loha 245
    @RequestMapping(value = "/checkplans", method = RequestMethod.GET)
246
    public String getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
247
                                     @RequestParam int itemId) throws ProfitMandiBusinessException {
248
        LOGGER.info("Request received at url : {}", request.getRequestURI());
24105 govind 249
 
33213 tejus.loha 250
        try {
251
            String response = mvcResponseSender.createResponseString(this.getPlans(price, itemId));
252
            model.addAttribute("response1", response);
253
        } catch (Exception e) {
254
            // TODO Auto-generated catch block
255
            LOGGER.info(e.getMessage(), e);
256
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
257
        }
21985 kshitij.so 258
 
33213 tejus.loha 259
        return "response";
260
    }
23973 govind 261
 
33213 tejus.loha 262
    @RequestMapping(value = "/get-order", method = RequestMethod.GET)
263
    public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId,
264
                           Model model) throws ProfitMandiBusinessException {
265
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
266
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
267
        List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
268
        CustomerAddress customerAddress = null;
269
        if (fofoOrder.getCustomerAddressId() != 0) {
270
            customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
271
        }
23973 govind 272
 
33213 tejus.loha 273
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
274
        if (customerAddress != null) {
275
            customerAddress.setPhoneNumber(customer.getMobileNumber());
276
        }
277
        LOGGER.info("Added to get invoice - {}, {}", customer, 123);
278
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
279
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
280
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
281
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
282
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
283
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
284
        this.addInsuranceProvider(insurancePolicies);
32627 ranu 285
 
33213 tejus.loha 286
        model.addAttribute("fofoOrder", fofoOrder);
287
        model.addAttribute("fofoLineItems", fofoLineItems);
288
        if (customerAddress != null) {
289
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
290
        } else {
291
            model.addAttribute("customerBillingAddress", "");
21985 kshitij.so 292
 
33213 tejus.loha 293
        }
294
        model.addAttribute("customerBillingAddressObj", customerAddress);
295
        model.addAttribute("customerDetailsObj", customer);
296
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
297
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
298
        model.addAttribute("insurancePolicies", insurancePolicies);
299
        return "order-details";
300
    }
32637 amit.gupta 301
 
33213 tejus.loha 302
    private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(
303
            List<InsuranceProvider> insuranceProviders) {
304
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
305
        for (InsuranceProvider insuranceProvider : insuranceProviders) {
306
            insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
307
        }
308
        return insuranceProviderIdInsuranceProviderMap;
309
    }
23973 govind 310
 
33247 ranu 311
    private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies) throws ProfitMandiBusinessException {
33213 tejus.loha 312
        if (insurancePolicies.isEmpty()) {
313
            return;
314
        }
315
        Set<Integer> insuranceProviderIds = new HashSet<>();
316
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
317
            insuranceProviderIds.add(insurancePolicy.getProviderId());
318
        }
319
        LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
320
        List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
321
        Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this
322
                .toInsuranceProviderIdInsuranceProvider(insuranceProviders);
323
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
324
            insurancePolicy
325
                    .setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
326
        }
327
    }
23973 govind 328
 
33213 tejus.loha 329
    @RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
330
    public String getSaleDetails(HttpServletRequest request,
331
                                 @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
332
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
333
        boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
334
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
335
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
336
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
337
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
338
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
23973 govind 339
 
33213 tejus.loha 340
        // Added Migration info as we lost it.
341
        if (paymentOptionTransactions == null || paymentOptionTransactions.size() == 0) {
342
            PaymentOptionTransaction pot = new PaymentOptionTransaction();
343
            pot.setAmount(fofoOrder.getTotalAmount());
344
            pot.setCreateTimestamp(fofoOrder.getCreateTimestamp());
345
            // Mark it paid through cash
346
            pot.setPaymentOptionId(1);
347
            pot.setReferenceType(PaymentOptionReferenceType.ORDER);
348
            paymentOptionTransactionRepository.persist(pot);
349
            paymentOptionTransactions.add(pot);
350
            LOGGER.info("Added to get invoice");
351
        }
352
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
353
                .paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
354
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
355
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
356
        this.addInsuranceProvider(insurancePolicies);
357
        Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
358
            try {
359
                return itemRepository.selectById(x.getItemId());
360
            } catch (ProfitMandiBusinessException e) {
361
                // TODO Auto-generated catch block
362
                return null;
363
            }
364
        }));
365
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
366
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23973 govind 367
 
33213 tejus.loha 368
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
369
                .collect(Collectors.toMap(foi -> foi.getId(),
370
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
23973 govind 371
 
33213 tejus.loha 372
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
23973 govind 373
 
33213 tejus.loha 374
        for (FofoOrderItem foi : fofoOrderItems) {
375
            for (FofoLineItem fli : foi.getFofoLineItems()) {
376
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
377
            }
378
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
379
                    .selectAllByOrderItemId(foi.getId());
380
            this.markDoa(fofoOrder, foi, isAdmin);
381
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
382
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
383
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
384
            }
385
        }
23973 govind 386
 
33213 tejus.loha 387
        LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
388
        model.addAttribute("fofoOrder", fofoOrder);
389
        model.addAttribute("itemsMap", itemsMap);
390
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
391
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
392
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
393
        model.addAttribute("fofoOrderItemIdLineItemMap", fofoOrderItemIdLineItemMap);
23973 govind 394
 
33213 tejus.loha 395
        model.addAttribute("fofoOrderItems", fofoOrderItems);
396
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
397
        if (customerAddress != null) {
30426 tejbeer 398
 
33213 tejus.loha 399
            model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
400
        } else {
401
            model.addAttribute("customerBillingAddress", "");
32637 amit.gupta 402
 
33213 tejus.loha 403
        }
404
        model.addAttribute("customerBillingAddressObj", customerAddress);
405
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
406
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
407
        model.addAttribute("insurancePolicies", insurancePolicies);
408
        model.addAttribute("markDefective", this.markDefective(fofoOrder));
409
        return "sale-details";
410
    }
32637 amit.gupta 411
 
33213 tejus.loha 412
    private void markDoa(FofoOrder fofoOrder, FofoOrderItem foi, boolean isAdmin) {
413
        if (isAdmin) {
414
            foi.setDoa(true);
415
            return;
416
        }
417
        boolean isImei = foi.getFofoLineItems().stream()
418
                .anyMatch(x -> org.apache.commons.lang3.StringUtils.isNotEmpty(x.getSerialNumber())
419
                        && allowedDoaImeis.contains(x.getSerialNumber()));
420
        LocalDateTime buyDate = fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS);
421
        LocalDateTime curDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
422
        if (buyDate.isAfter(curDate.minusDays(45)) || isImei) {
423
            foi.setDoa(true);
424
        } else
425
            foi.setDoa(
426
                    foi.getBrand().equals("Nokia") && foi.getCost() < 4990 && buyDate.isAfter(curDate.minusYears(1)));
427
    }
30426 tejbeer 428
 
33213 tejus.loha 429
    private boolean markDefective(FofoOrder fofoOrder) {
430
        return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(180)
431
                .isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
26647 tejbeer 432
 
33213 tejus.loha 433
    }
26647 tejbeer 434
 
33213 tejus.loha 435
    @RequestMapping(value = "/getSearchOrder")
436
    public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
437
        return "search-order";
438
    }
26647 tejbeer 439
 
33213 tejus.loha 440
    @RequestMapping(value = "/getInvoiceSearchOrder")
441
    public String getInvoiceSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
442
        return "invoices-cancel";
443
    }
33172 tejus.loha 444
 
33213 tejus.loha 445
    @RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
446
    public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer,
447
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
448
            throws Exception {
33172 tejus.loha 449
 
33213 tejus.loha 450
        orderService.updateCustomerDetails(customCustomer, invoiceNumber);
451
        return this.getSearchOrderDetails(request, invoiceNumber, model);
452
    }
33172 tejus.loha 453
 
33213 tejus.loha 454
    @RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
455
    public String getSearchOrderDetails(HttpServletRequest request,
456
                                        @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
457
            throws Exception {
33172 tejus.loha 458
 
33213 tejus.loha 459
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
460
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
461
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
462
        CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
463
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = paymentOptionRepository.selectActiveOption().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
464
        List<Integer> fofoPartnerPaymentOptions = new ArrayList<>(paymentOptionIdPaymentOptionMap.keySet());
465
        Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
466
            try {
467
                return itemRepository.selectById(x.getItemId());
468
            } catch (ProfitMandiBusinessException e) {
469
                // TODO Auto-generated catch block
470
                return null;
471
            }
472
        }));
473
        LOGGER.info("fofoPartnerPaymentOptions" + fofoPartnerPaymentOptions);
474
        List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
475
                .selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
476
        LOGGER.info("paymentOptionTransactions" + paymentOptionTransactions);
26647 tejbeer 477
 
33213 tejus.loha 478
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
479
                .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
480
        LOGGER.info("paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
481
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
482
                .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
483
        this.addInsuranceProvider(insurancePolicies);
484
        model.addAttribute("fofoOrder", fofoOrder);
485
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
486
            fofoOrderItem.setDoa(true);
487
        }
27861 tejbeer 488
 
33213 tejus.loha 489
        Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
490
                .collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
28339 tejbeer 491
 
33213 tejus.loha 492
        Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
493
                .collect(Collectors.toMap(foi -> foi.getId(),
494
                        foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
28339 tejbeer 495
 
33213 tejus.loha 496
        Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
28339 tejbeer 497
 
33213 tejus.loha 498
        for (FofoOrderItem foi : fofoOrderItems) {
499
            for (FofoLineItem fli : foi.getFofoLineItems()) {
500
                inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
501
            }
502
            List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
503
                    .selectAllByOrderItemId(foi.getId());
504
            for (CustomerReturnItem customerReturnItem : customerReturnItems) {
505
                inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
506
                        inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
507
            }
508
        }
509
        model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
510
                StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
511
        model.addAttribute("fofoOrderItems", fofoOrderItems);
512
        model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
513
        model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
514
        model.addAttribute("itemsMap", itemsMap);
515
        model.addAttribute("markDefective", true);
516
        model.addAttribute("customer", customer);
517
        model.addAttribute("customerAddress", customerAddress);
518
        model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
519
        model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
520
        model.addAttribute("paymentOptionIdPaymentOptionTransactionMap", paymentOptionIdPaymentOptionTransactionMap);
521
        model.addAttribute("insurancePolicies", insurancePolicies);
522
        model.addAttribute("fofoPartnerPaymentOptions", fofoPartnerPaymentOptions);
523
        model.addAttribute("totalNumberOfPaymentOptionId", fofoPartnerPaymentOptions.size());
524
        model.addAttribute("stateNames",
525
                stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
526
        return "search-order-details";
527
    }
28420 tejbeer 528
 
33213 tejus.loha 529
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(
33247 ranu 530
            List<PaymentOptionTransaction> paymentOptionTransactions) throws ProfitMandiBusinessException {
33213 tejus.loha 531
        Set<Integer> paymentOptionIds = new HashSet<>();
532
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
533
            paymentOptionIds.add(paymentOptionTransaction.getPaymentOptionId());
534
        }
535
        List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(paymentOptionIds);
536
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
537
        for (PaymentOption paymentOption : paymentOptions) {
538
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
539
        }
540
        return paymentOptionIdPaymentOptionMap;
541
    }
23973 govind 542
 
33213 tejus.loha 543
    private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMapUsingPaymentOptions(
33247 ranu 544
            List<Integer> fofoPartnerPaymentOptions) throws ProfitMandiBusinessException {
33213 tejus.loha 545
        List<PaymentOption> paymentOptions = paymentOptionRepository
546
                .selectByIds(new HashSet<>(fofoPartnerPaymentOptions));
547
        Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
548
        for (PaymentOption paymentOption : paymentOptions) {
549
            paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
550
        }
551
        return paymentOptionIdPaymentOptionMap;
552
    }
23973 govind 553
 
33213 tejus.loha 554
    private Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap(
555
            List<PaymentOptionTransaction> paymentOptionTransactions) {
556
        Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = new HashMap<>();
557
        for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
558
            paymentOptionIdPaymentOptionTransactionMap.put(paymentOptionTransaction.getPaymentOptionId(),
559
                    paymentOptionTransaction);
560
        }
561
        return paymentOptionIdPaymentOptionTransactionMap;
562
    }
28339 tejbeer 563
 
33213 tejus.loha 564
    @RequestMapping(value = "/create-order", method = RequestMethod.POST)
565
    public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest,
566
                              Model model) throws ProfitMandiBusinessException {
567
        // throw new ProfitMandiBusinessException("Billing is on hold temporarily",
568
        // "Billing is on hold temporarily", "Billing is on hold temporarily");
569
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
570
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
28339 tejbeer 571
 
33213 tejus.loha 572
        int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId(), accessoriesDeals);
28339 tejbeer 573
 
33213 tejus.loha 574
        LOGGER.info("Order has been created successfully...");
575
        try {
576
            this.sendWhatsappInvoice(fofoOrderRepository.selectByOrderId(fofoOrderId));
577
        } catch (Exception e) {
578
            LOGGER.info("Could not send whatsapp message");
579
            e.printStackTrace();
580
        }
581
        return "redirect:/get-order/?orderId=" + fofoOrderId;
582
    }
28339 tejbeer 583
 
33213 tejus.loha 584
    private void sendWhatsappInvoice(FofoOrder fofoOrder) throws Exception {
585
        Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
586
        CustomRetailer retailer = retailerService.getFofoRetailer(fofoOrder.getFofoId());
587
        String message = String.format("Dear %s,\n" +
588
                "Thank you for your purchase from SmartDukaan store - %s, %s.\n" +
589
                "Your purchase invoice is attached for your reference.\n" +
590
                "\n" +
591
                "Download our app for offers and updates on new products.\n" +
592
                "https://www.smartdukaan.com/b2c\n" +
593
                "\n" +
594
                "Best Regards\n" +
595
                "SmartDukaan", customer.getFirstName(), retailer.getBusinessName(), retailer.getAddress().getCity());
596
        boolean sentMessage = notificationService.isWhatMessageSend(customer.getMobileNumber());
597
        if (sentMessage) {
598
            notificationService.sendWhatsappMediaMessage(message, customer.getMobileNumber(), this.getPublicInvoiceUrl(fofoOrder.getInvoiceNumber()),
599
                    this.getFileName(fofoOrder.getInvoiceNumber()), WhatsappMessageType.DOCUMENT);
600
        }
601
    }
28339 tejbeer 602
 
33213 tejus.loha 603
    private String getFileName(String invoiceNumber) {
604
        return "INV-" + invoiceNumber.replace("/", "-") + ".pdf";
605
    }
31375 tejbeer 606
 
33213 tejus.loha 607
    private String getPublicInvoiceUrl(String invoiceNumber) {
608
        String base64Encoded = Base64.getMimeEncoder().encodeToString(invoiceNumber.getBytes(StandardCharsets.UTF_8));
609
        String publicUrl = "https://partners.smartdukaan.com/wa-invoice-send/" + base64Encoded + ".pdf";
610
        LOGGER.info("Public Whatsapp Url for Invoice Message - {}", publicUrl);
611
        return publicUrl;
612
    }
28339 tejbeer 613
 
33213 tejus.loha 614
    @RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
615
    public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest,
616
                                       Model model) throws ProfitMandiBusinessException {
617
        LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
618
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
619
        CustomerCreditNote custmoerCreditNote;
620
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
621
            FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
622
            FofoOrder fo = fofoOrderRepository.selectByOrderId(foi.getOrderId());
623
            custmoerCreditNote = orderService.badReturn(fo.getFofoId(), foiBadReturnRequest);
624
        } else {
625
            custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
626
        }
627
        return responseSender.ok(custmoerCreditNote.getId());
628
    }
28339 tejbeer 629
 
33213 tejus.loha 630
    @GetMapping(value = "/wa-invoice-send/{invoiceHash}")
631
    public ResponseEntity<?> generateInvoice(@PathVariable String invoiceHash) throws ProfitMandiBusinessException {
632
        String decodedInvoiceNumber = new String(Base64.getMimeDecoder().decode(invoiceHash));
633
        LOGGER.info("Invoice Hash {}", invoiceHash);
28339 tejbeer 634
 
23973 govind 635
 
33213 tejus.loha 636
        FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(decodedInvoiceNumber);
24844 amit.gupta 637
 
33213 tejus.loha 638
        InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
24844 amit.gupta 639
 
33213 tejus.loha 640
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
641
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
642
        final HttpHeaders headers = new HttpHeaders();
643
        //headers.setContentDispositionFormData("inline", number + ".pdf");
644
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + pdfModel.getInvoiceNumber() + ".pdf");
645
        int contentLength = byteArrayOutputStream.toByteArray().length;
646
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
647
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
648
        return ResponseEntity.ok()
649
                .headers(headers)
650
                .contentLength(contentLength)
651
                .contentType(MediaType.parseMediaType("application/pdf"))
652
                .body(inputStreamResource);
653
    }
23973 govind 654
 
33213 tejus.loha 655
    @RequestMapping(value = "/wa-listen", method = RequestMethod.POST)
656
    public ResponseEntity<?> listenWhatsappStatus(@RequestBody String whatsappJsonResponse) {
657
        LOGGER.info("whatsappJsonResponse {}", whatsappJsonResponse);
658
        //jaihind
659
        //  String jsonString = "[{\"srcAddr\":\"TESTSM\",\"channel\":\"WHATSAPP\",\"externalId\":\"4977024756456780043-180044363908187691\",\"cause\":\"SUCCESS\",\"errorCode\":\"000\",\"destAddr\":\"919813272029\",\"eventType\":\"DELIVERED\",\"eventTs\":1692848106000}]";
660
        JSONArray jsonArray = new JSONArray(whatsappJsonResponse);
661
        for (int i = 0; i < jsonArray.length(); i++) {
32711 amit.gupta 662
 
33213 tejus.loha 663
            JSONObject jsonObject = jsonArray.getJSONObject(i);
664
            String externalId = jsonObject.getString("externalId");
665
            String destAddr = jsonObject.getString("destAddr");
666
            String eventType = jsonObject.getString("eventType");
667
            whatsappMessageService.setWhatsappResponse(externalId, destAddr, eventType);
668
        }
669
        //jaihind
670
        return responseSender.ok("Success");
32711 amit.gupta 671
 
33213 tejus.loha 672
    }
32271 amit.gupta 673
 
33213 tejus.loha 674
    @RequestMapping(value = "/generateInvoice")
675
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
676
                                             @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
677
        LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
678
                ProfitMandiConstants.ORDER_ID, orderId);
679
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
680
        InvoicePdfModel pdfModel = null;
681
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
682
            pdfModel = orderService.getInvoicePdfModel(orderId);
683
        } else {
684
            pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
685
        }
686
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
687
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
688
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
689
        final HttpHeaders headers = new HttpHeaders();
690
        headers.setContentType(MediaType.APPLICATION_PDF);
691
        headers.setContentDispositionFormData("inline", "invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
692
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
693
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
694
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
695
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
696
    }
24087 amit.gupta 697
 
33213 tejus.loha 698
    @RequestMapping(value = "/generateInvoices")
699
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
700
                                             @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, @RequestParam int partnerId)
701
            throws ProfitMandiBusinessException {
702
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
703
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
704
        if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
705
            List<Integer> orderIds = fofoOrderRepository.selectByFofoId(partnerId, startDate, endDate, 0, 0).stream()
706
                    .map(x -> x.getId()).collect(Collectors.toList());
707
            for (int orderId : orderIds) {
708
                pdfModels.add(orderService.getInvoicePdfModel(orderId));
709
            }
710
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
711
            PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
712
            LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
713
            final HttpHeaders headers = new HttpHeaders();
714
            headers.setContentType(MediaType.APPLICATION_PDF);
715
            headers.set("Content-disposition", "inline; filename=invoice-" + partnerId + ".pdf");
716
            headers.setContentLength(byteArrayOutputStream.toByteArray().length);
717
            final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
718
            final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
719
            return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
720
        } else {
721
            throw new ProfitMandiBusinessException("Auth", fofoDetails.getEmailId(), "Unauthorised access");
722
        }
723
    }
23973 govind 724
 
33213 tejus.loha 725
    @RequestMapping(value = "/saleHistory")
726
    public String saleHistory(HttpServletRequest request,
727
                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
728
                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
729
                              @RequestParam(required = false) LocalDateTime startTime,
730
                              @RequestParam(required = false) LocalDateTime endTime,
731
                              @RequestParam(name = "offset", defaultValue = "0") int offset,
732
                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
733
            throws ProfitMandiBusinessException {
734
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32405 jai.hind 735
 
33213 tejus.loha 736
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
737
                startTime, endTime, offset, limit);
738
        model.addAllAttributes(map);
739
        return "sale-history";
740
    }
32405 jai.hind 741
 
33213 tejus.loha 742
    @RequestMapping(value = "/downloadInvoices")
743
    public ResponseEntity<?> downloadInvoices(HttpServletRequest request,
744
                                              @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
745
                                              @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
746
                                              @RequestParam(required = false) LocalDateTime startTime,
747
                                              @RequestParam(required = false) LocalDateTime endTime,
748
                                              @RequestParam(name = "offset", defaultValue = "0") int offset,
749
                                              @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
750
            throws ProfitMandiBusinessException {
751
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
32409 amit.gupta 752
 
33213 tejus.loha 753
        Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
754
                startTime, endTime, offset, 100);
755
        List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
23973 govind 756
 
33213 tejus.loha 757
        if (fofoOrders.size() == 0) {
758
            throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
759
        }
23654 amit.gupta 760
 
33213 tejus.loha 761
        final HttpHeaders headers = new HttpHeaders();
762
        headers.setContentType(MediaType.APPLICATION_PDF);
763
        headers.set("Content-disposition", "inline; filename=invoices.pdf");
764
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
765
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
766
        for (FofoOrder fofoOrder : fofoOrders) {
767
            try {
768
                pdfModels.add(orderService.getInvoicePdfModel(fofoOrder.getId()));
769
            } catch (Exception e) {
770
                LOGGER.info("could not create invoice for {}, invoice number {}", fofoOrder.getId(),
771
                        fofoOrder.getInvoiceNumber());
772
            }
773
        }
774
        PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
775
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
776
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
777
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
778
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
779
    }
23654 amit.gupta 780
 
33213 tejus.loha 781
    @RequestMapping(value = "/credit-note/{creditNoteId}")
782
    public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId)
783
            throws ProfitMandiBusinessException {
784
        CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
785
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
786
        PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
787
        LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
788
        final HttpHeaders headers = new HttpHeaders();
789
        headers.setContentType(MediaType.APPLICATION_PDF);
790
        headers.set("Content-disposition",
791
                "inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
792
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
793
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
794
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
795
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
796
    }
23973 govind 797
 
33213 tejus.loha 798
    @RequestMapping(value = "/getPaginatedSaleHistory")
799
    public String getSaleHistoryPaginated(HttpServletRequest request,
800
                                          @RequestParam(name = "searchValue", defaultValue = "") String searchValue,
801
                                          @RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
802
                                          @RequestParam(required = false) LocalDateTime startTime,
803
                                          @RequestParam(required = false) LocalDateTime endTime,
804
                                          @RequestParam(name = "offset", defaultValue = "0") int offset,
805
                                          @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
806
            throws ProfitMandiBusinessException {
807
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
808
        Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType,
809
                searchValue, startTime, endTime, offset, limit);
810
        model.addAllAttributes(map);
811
        return "sale-history-paginated";
812
    }
23973 govind 813
 
33213 tejus.loha 814
    @PutMapping(value = "/updatePaymentTransaction")
815
    public String updateTransactionDetails(HttpServletRequest request, @RequestParam String referenceType,
816
                                           @RequestParam int fofoId, @RequestParam int referenceId,
817
                                           @RequestBody PartnerOptionsAndItemAmountModel partnerOptionsAndItemAmountModel,
818
                                           @RequestParam float totalAmount, Model model) throws Exception {
29707 tejbeer 819
 
33213 tejus.loha 820
        List<PaymentOptionTransactionModel> paymentOptionTransactionModels = partnerOptionsAndItemAmountModel
821
                .getPaymentOptionTransactionModel();
822
        LOGGER.info(paymentOptionTransactionModels);
823
        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, referenceId);
824
        LOGGER.info("sdssd" + fofoOrder);
825
        fofoOrder.setTotalAmount(totalAmount);
826
        List<FofoItemIdAmountModel> fofoItemIdAmountModel = partnerOptionsAndItemAmountModel.getItemAmountModel();
827
        for (FofoItemIdAmountModel fim : fofoItemIdAmountModel) {
828
            LOGGER.info("fim" + fim.getFofoItemId());
23973 govind 829
 
33213 tejus.loha 830
            LOGGER.info("fimAmount" + fim.getAmount());
831
            Item item = itemRepository.selectById(fim.getItemId());
832
            TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
833
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectById(fim.getFofoItemId());
834
            LOGGER.info("category" + item.getCategoryId());
835
            if (item.getCategoryId() == ProfitMandiConstants.MOBILE_CATEGORY_ID) {
836
                if (fofoOrderItem.getMop() <= fim.getAmount()) {
23973 govind 837
 
33213 tejus.loha 838
                    if (fim.getAmount() <= tagListing.getMrp()) {
839
                        fofoOrderItem.setSellingPrice(fim.getAmount());
840
                    } else {
841
                        throw new ProfitMandiBusinessException("Amount", fim.getAmount(),
842
                                "Sum of amount is not less than  to MRP");
843
                    }
23973 govind 844
 
33213 tejus.loha 845
                    LOGGER.info("fofoOrderItem2" + fofoOrderItem);
23973 govind 846
 
33213 tejus.loha 847
                } else {
848
                    // TODO below mop condition need to added added
849
                    fofoOrderItem.setSellingPrice(fim.getAmount());
850
                }
23973 govind 851
 
33213 tejus.loha 852
            } else {
853
                fofoOrderItem.setSellingPrice(fim.getAmount());
854
                LOGGER.info("fofoOrderItem1" + fofoOrderItem);
27819 tejbeer 855
 
33213 tejus.loha 856
            }
857
            LOGGER.info("fofoOrderItem" + fofoOrderItem);
23973 govind 858
 
33213 tejus.loha 859
        }
23973 govind 860
 
33213 tejus.loha 861
        /*
862
         * for (PaymentOptionTransactionModel paymentOptionTransactionModel :
863
         * paymentOptionTransactionModels) { amount = amount +
864
         * paymentOptionTransactionModel.getAmount(); } LOGGER.info("FofoOrder amount" +
865
         * fofoOrder.getUnitPrice() + "amount" + amount); if (amount ==
866
         * fofoOrder.getUnitPrice()) {
867
         */
868
        if (paymentOptionTransactionModels.size() > 0) {
869
            List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository
870
                    .selectByReferenceIdAndType(referenceId, PaymentOptionReferenceType.ORDER);
871
            Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
872
                    .paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
873
            LOGGER.info(
874
                    "paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
875
            for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
876
                if (paymentOptionIdPaymentOptionTransactionMap
877
                        .containsKey(paymentOptionTransactionModel.getPaymentOptionId())) {
23973 govind 878
 
33213 tejus.loha 879
                    PaymentOptionTransaction paymentOptionTransaction = paymentOptionIdPaymentOptionTransactionMap
880
                            .get(paymentOptionTransactionModel.getPaymentOptionId());
31739 amit.gupta 881
 
33213 tejus.loha 882
                    if (paymentOptionTransactionModel.getAmount() == 0) {
883
                        paymentOptionTransactionRepository.delete(paymentOptionTransaction);
884
                        LOGGER.info("deleted successfully");
885
                    } else {
24844 amit.gupta 886
 
33213 tejus.loha 887
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
888
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
889
                        LOGGER.info("updated successfully");
24281 amit.gupta 890
 
33213 tejus.loha 891
                    }
892
                } else {
893
                    if (paymentOptionTransactionModel.getAmount() > 0) {
894
                        PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
895
                        paymentOptionTransaction.setReferenceId(referenceId);
896
                        paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
897
                        paymentOptionTransaction.setPaymentOptionId(paymentOptionTransactionModel.getPaymentOptionId());
898
                        paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
899
                        paymentOptionTransaction.setFofoId(fofoId);
900
                        paymentOptionTransaction.setCreateTimestamp(fofoOrder.getCreateTimestamp());
901
                        paymentOptionTransactionRepository.persist(paymentOptionTransaction);
902
                        LOGGER.info("inserted successfully");
903
                    }
904
                }
24281 amit.gupta 905
 
33213 tejus.loha 906
            }
24281 amit.gupta 907
 
33213 tejus.loha 908
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
909
        }
910
        /*
911
         * else
912
         *
913
         * { throw new ProfitMandiBusinessException("Amount", amount,
914
         * "Sum of amount is not equal to total amount"); }
915
         */
23973 govind 916
 
33213 tejus.loha 917
        return "response";
23973 govind 918
 
33213 tejus.loha 919
    }
24105 govind 920
 
33213 tejus.loha 921
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId)
922
            throws ProfitMandiBusinessException {
923
        try {
924
            Map<String, List<MobileInsurancePlan>> productDurationPlans = insuranceService.getAllPlans(itemId,
925
                    sellingPrice);
926
            return productDurationPlans;
927
        } catch (Exception e) {
928
            LOGGER.info(e, e);
929
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance",
930
                    "Could not fetch insurance Plans");
931
        }
24105 govind 932
 
33213 tejus.loha 933
    }
23973 govind 934
 
33213 tejus.loha 935
    @GetMapping("/insuranceDetails")
936
    public String getInsuranceDetails(HttpServletRequest request,
937
                                      @RequestParam(name = "offset", defaultValue = "0") int offset,
938
                                      @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
939
            throws ProfitMandiBusinessException {
940
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
941
        long size = 0;
942
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
943
                offset, limit);
944
        size = insurancePolicyRepository.selectCountByRetailerId(loginDetails.getFofoId());
945
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
946
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
947
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
948
        if (size < limit) {
949
            model.addAttribute("end", offset + size);
950
        } else {
951
            model.addAttribute("end", offset + limit);
952
        }
953
        model.addAttribute("start", offset + 1);
954
        model.addAttribute("size", size);
955
        model.addAttribute("insurancePolicies", insurancePolicies);
956
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
957
        return "insurance-details";
958
    }
28339 tejbeer 959
 
33213 tejus.loha 960
    @GetMapping("/insuranceDetailsPaginated")
961
    public String getInsuranceDetailsPaginated(HttpServletRequest request,
962
                                               @RequestParam(name = "offset", defaultValue = "0") int offset,
963
                                               @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
964
            throws ProfitMandiBusinessException {
965
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
966
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
967
                offset, limit);
968
        Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
969
                .selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
970
                .stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
971
        model.addAttribute("insurancePolicies", insurancePolicies);
972
        model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
973
        return "insurance-details-paginated";
974
    }
23973 govind 975
 
33213 tejus.loha 976
    @GetMapping("/getMouForm")
977
    public String getMouForm(HttpServletRequest request, Model model) throws Exception {
978
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
21985 kshitij.so 979
 
33213 tejus.loha 980
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
981
        if (mou != null) {
982
            if (mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
983
                model.addAttribute("response1", mvcResponseSender.createResponseString(true));
984
            } else {
985
                model.addAttribute("response1", mvcResponseSender.createResponseString(false));
986
            }
32238 amit.gupta 987
 
33213 tejus.loha 988
        } else {
989
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
32238 amit.gupta 990
 
33213 tejus.loha 991
        }
992
        return "response";
32238 amit.gupta 993
 
33213 tejus.loha 994
    }
23973 govind 995
 
33213 tejus.loha 996
    @GetMapping("/pendingOrders")
997
    public String getPendingOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
998
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
999
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1000
        Mou mou = mouRepository.selectByFofoId(loginDetails.getFofoId());
1001
        if (mou == null) {
1002
            mou = new Mou();
1003
            mou.setFofoId(loginDetails.getFofoId());
1004
            mou.setCreateTimestamp(LocalDateTime.now());
1005
            mou.setUpdateTimestamp(LocalDateTime.now());
1006
            mouRepository.persist(mou);
1007
        } else if (!mou.getUpdateTimestamp().getMonth().equals(LocalDateTime.now().getMonth())) {
1008
            mou.setUpdateTimestamp(LocalDateTime.now());
1009
        }
24844 amit.gupta 1010
 
33213 tejus.loha 1011
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.PROCESSING,
1012
                loginDetails.getFofoId());
23973 govind 1013
 
33213 tejus.loha 1014
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, loginDetails.getFofoId());
1015
        model.addAttribute("inventoryMap", map.get("inventoryMap"));
1016
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
23973 govind 1017
 
33213 tejus.loha 1018
        model.addAttribute("isAdmin", isAdmin);
1019
        return "pending_fofo_order";
25092 amit.gupta 1020
 
33213 tejus.loha 1021
    }
25092 amit.gupta 1022
 
33213 tejus.loha 1023
    @GetMapping("/billedOrders")
1024
    public String getBilledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1025
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1026
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
25092 amit.gupta 1027
 
33213 tejus.loha 1028
        List<PendingOrderItem> pendingOrderItem;
23973 govind 1029
 
33213 tejus.loha 1030
        if (isAdmin) {
27861 tejbeer 1031
 
33213 tejus.loha 1032
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.BILLED);
27861 tejbeer 1033
 
33213 tejus.loha 1034
        } else {
1035
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.BILLED,
1036
                    loginDetails.getFofoId());
1037
        }
27861 tejbeer 1038
 
33213 tejus.loha 1039
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
27861 tejbeer 1040
 
33213 tejus.loha 1041
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1042
        model.addAttribute("isAdmin", isAdmin);
1043
        return "billed_order_item";
1044
    }
27861 tejbeer 1045
 
33213 tejus.loha 1046
    @GetMapping("/settledOrders")
1047
    public String getSettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1048
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1049
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27861 tejbeer 1050
 
33213 tejus.loha 1051
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1052
 
33213 tejus.loha 1053
        if (isAdmin) {
24105 govind 1054
 
33213 tejus.loha 1055
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.SETTLED);
24105 govind 1056
 
33213 tejus.loha 1057
        } else {
1058
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.SETTLED,
1059
                    loginDetails.getFofoId());
1060
        }
24105 govind 1061
 
33213 tejus.loha 1062
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
24105 govind 1063
 
33213 tejus.loha 1064
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1065
        model.addAttribute("isAdmin", isAdmin);
1066
        return "settled_order_item";
1067
    }
27861 tejbeer 1068
 
33213 tejus.loha 1069
    @GetMapping("/unsettledOrders")
1070
    public String getunsettledOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1071
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1072
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
24105 govind 1073
 
33213 tejus.loha 1074
        List<PendingOrderItem> pendingOrderItem = null;
27861 tejbeer 1075
 
33213 tejus.loha 1076
        if (isAdmin) {
24105 govind 1077
 
33213 tejus.loha 1078
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.UNSETTLED);
27861 tejbeer 1079
 
33213 tejus.loha 1080
        } else {
1081
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.UNSETTLED,
1082
                    loginDetails.getFofoId());
1083
        }
24440 amit.gupta 1084
 
33213 tejus.loha 1085
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
25726 amit.gupta 1086
 
33213 tejus.loha 1087
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1088
        model.addAttribute("isAdmin", isAdmin);
1089
        return "unsettled_order_item";
1090
    }
24880 govind 1091
 
33213 tejus.loha 1092
    @GetMapping("/claimedOrders")
1093
    public String getclaimedOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1094
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1095
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
1096
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1097
                .collect(Collectors.toList());
25092 amit.gupta 1098
 
33213 tejus.loha 1099
        List<PendingOrderItem> pendingOrderItem = null;
26647 tejbeer 1100
 
33213 tejus.loha 1101
        if (isAdmin) {
28420 tejbeer 1102
 
33213 tejus.loha 1103
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatus(OrderStatus.CLAIMED);
1104
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28425 tejbeer 1105
 
33213 tejus.loha 1106
            Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1107
                    .filter(x -> x != null).collect(Collectors.toList()).stream()
1108
                    .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1109
            model.addAttribute("customRetailersMap", customRetailersMap);
28420 tejbeer 1110
 
33213 tejus.loha 1111
        } else {
1112
            pendingOrderItem = pendingOrderItemRepository.selectOrderItemByStatusAndFofoId(OrderStatus.CLAIMED,
1113
                    loginDetails.getFofoId());
1114
        }
28420 tejbeer 1115
 
33213 tejus.loha 1116
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItem, loginDetails.getFofoId());
28420 tejbeer 1117
 
33213 tejus.loha 1118
        model.addAttribute("pendingOrderItem", map.get("pendingOrderItem"));
1119
        model.addAttribute("isAdmin", isAdmin);
1120
        return "claim_raised_order_item";
1121
    }
26647 tejbeer 1122
 
33213 tejus.loha 1123
    @GetMapping("/getPendingOrderItem")
1124
    public String getPendingOrderItem(HttpServletRequest request, @RequestParam int orderId, Model model)
1125
            throws ProfitMandiBusinessException {
1126
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1127
        Map<Integer, Item> itemMap = new HashMap<>();
1128
        Map<Integer, CurrentInventorySnapshot> inventoryMap = new HashMap<>();
1129
        PendingOrder pendingPO = pendingOrderRepository.selectById(orderId);
1130
        Customer customer = customerRepository.selectById(pendingPO.getCustomerId());
1131
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(orderId);
1132
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1133
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1134
            CurrentInventorySnapshot cis = currentInventorySnapshotRepository
1135
                    .selectByItemAndFofoId(pendingOrderItem.getItemId(), pendingPO.getFofoId());
1136
            itemMap.put(pendingOrderItem.getItemId(), item);
1137
            LOGGER.info("cis" + cis);
1138
            inventoryMap.put(pendingOrderItem.getItemId(), cis);
1139
        }
28339 tejbeer 1140
 
33213 tejus.loha 1141
        LOGGER.info("inventoryMap" + inventoryMap);
1142
        model.addAttribute("pendingOrderItems", pendingOrderItems);
1143
        model.addAttribute("itemMap", itemMap);
1144
        model.addAttribute("inventoryMap", inventoryMap);
1145
        model.addAttribute("pendingPO", gson.toJson(pendingPO));
1146
        model.addAttribute("pendingPOCustomer", gson.toJson(customer));
1147
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1148
        return "pending-order-item";
1149
    }
28339 tejbeer 1150
 
33213 tejus.loha 1151
    @RequestMapping(value = "/getPendingOrderItemById", method = RequestMethod.GET)
1152
    public String getPendingOrderItemById(HttpServletRequest request, @RequestParam int id, Model model)
1153
            throws Exception {
27046 tejbeer 1154
 
33213 tejus.loha 1155
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1156
        model.addAttribute("pendingOrderItem", pendingOrderItem);
1157
        return "cancel-pending-order";
1158
    }
27046 tejbeer 1159
 
33213 tejus.loha 1160
    @RequestMapping(value = "/getPendingOrderChangePartnerById", method = RequestMethod.GET)
1161
    public String getPendingOrderChangePartnerById(HttpServletRequest request, @RequestParam int id, Model model)
1162
            throws Exception {
28350 tejbeer 1163
 
33213 tejus.loha 1164
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1165
        Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(true);
1166
        model.addAttribute("customRetailersMap", customRetailersMap);
1167
        model.addAttribute("pendingOrder", pendingOrder);
1168
        return "change-partner-po";
1169
    }
28358 tejbeer 1170
 
33213 tejus.loha 1171
    @RequestMapping(value = "/changePendingOrderPartner", method = RequestMethod.POST)
1172
    public String changePendingOrderPartner(HttpServletRequest request, @RequestParam int id, @RequestParam int fofoId,
1173
                                            Model model) throws Exception {
28350 tejbeer 1174
 
33213 tejus.loha 1175
        PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
1176
        pendingOrder.setFofoId(fofoId);
1177
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1178
 
33213 tejus.loha 1179
        return "response";
1180
    }
28339 tejbeer 1181
 
33213 tejus.loha 1182
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
1183
    public String cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String reason,
1184
                                         Model model) throws Exception {
28339 tejbeer 1185
 
33213 tejus.loha 1186
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1187
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
28339 tejbeer 1188
 
33213 tejus.loha 1189
        pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1190
        pendingOrderItem.setStatusDescription(loginDetails.getEmailId());
1191
        pendingOrderItem.setRemark(reason);
1192
        pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1193
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
27046 tejbeer 1194
 
33213 tejus.loha 1195
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1196
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1197
 
33213 tejus.loha 1198
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
26647 tejbeer 1199
 
33213 tejus.loha 1200
        List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1201
 
33213 tejus.loha 1202
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1203
        pendingOrderItem.setItemName(item.getItemDescription());
1204
        catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1205
 
33213 tejus.loha 1206
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1207
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1208
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1209
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1210
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28339 tejbeer 1211
 
33213 tejus.loha 1212
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1213
 
33213 tejus.loha 1214
        Map<String, Object> emailModel = new HashMap<>();
1215
        emailModel.put("customer", customerAddress);
1216
        emailModel.put("pendingOrder", pendingOrder);
1217
        emailModel.put("date", dateTimeFormatter);
1218
        LOGGER.info("emal" + customer.getEmailId());
1219
        String[] customerEmail = null;
1220
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1221
            customerEmail = new String[]{customer.getEmailId()};
28339 tejbeer 1222
 
33213 tejus.loha 1223
            List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
28339 tejbeer 1224
 
33213 tejus.loha 1225
            emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel,
1226
                    customerEmail, null, bccTo.toArray(new String[0]));
28339 tejbeer 1227
 
33213 tejus.loha 1228
        }
28339 tejbeer 1229
 
33213 tejus.loha 1230
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1231
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1232
                && !status.contains(OrderStatus.CLAIMED)) {
1233
            pendingOrder.setStatus(OrderStatus.CLOSED);
1234
        }
1235
        pendingOrderItemRepository.persist(pendingOrderItem);
28339 tejbeer 1236
 
33213 tejus.loha 1237
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28339 tejbeer 1238
 
33213 tejus.loha 1239
        return "response";
1240
    }
28339 tejbeer 1241
 
33213 tejus.loha 1242
    @RequestMapping(value = "/deliveredPendingOrderItem", method = RequestMethod.POST)
1243
    public String deliveredPendingOrderItem(HttpServletRequest request, @RequestParam int id, Model model)
1244
            throws Exception {
28339 tejbeer 1245
 
33213 tejus.loha 1246
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1247
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1248
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28339 tejbeer 1249
 
33213 tejus.loha 1250
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1251
            pendingOrderItem.setStatus(OrderStatus.UNSETTLED);
1252
            pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
28339 tejbeer 1253
 
33213 tejus.loha 1254
        } else {
1255
            pendingOrderItem.setStatus(OrderStatus.SETTLED);
1256
            pendingOrderItem.setDeliveredTimestamp(LocalDateTime.now());
28339 tejbeer 1257
 
33213 tejus.loha 1258
        }
28339 tejbeer 1259
 
33213 tejus.loha 1260
        List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
1261
                .map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1262
 
33213 tejus.loha 1263
        List<Integer> catalogIds = new ArrayList<>();
30426 tejbeer 1264
 
33213 tejus.loha 1265
        Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1266
        pendingOrderItem.setItemName(item.getItemDescription());
1267
        catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1268
 
33213 tejus.loha 1269
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1270
        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1271
        pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1272
        pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1273
        CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
1274
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
1275
        Map<String, Object> emailModel = new HashMap<>();
1276
        emailModel.put("customer", customerAddress);
1277
        emailModel.put("pendingOrder", pendingOrder);
1278
        emailModel.put("date", dateTimeFormatter);
1279
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1280
        String[] customerEmail = null;
1281
        if (customer.getEmailId() != null && !customer.getEmailId().isEmpty()) {
1282
            customerEmail = new String[]{customer.getEmailId()};
1283
            List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
28339 tejbeer 1284
 
33213 tejus.loha 1285
            emailService.sendMailWithAttachments("Order Delivered with SmartDukaan", "order-delivered.vm", emailModel,
1286
                    customerEmail, null, bccTo.toArray(new String[0]));
26647 tejbeer 1287
 
33213 tejus.loha 1288
        }
1289
        if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
1290
                && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
1291
                && !status.contains(OrderStatus.CLAIMED)) {
1292
            pendingOrder.setStatus(OrderStatus.CLOSED);
1293
        }
1294
        pendingOrderItemRepository.persist(pendingOrderItem);
1295
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1296
 
33213 tejus.loha 1297
        return "response";
1298
    }
27046 tejbeer 1299
 
33213 tejus.loha 1300
    @RequestMapping(value = "/raiseClaimOrderItem", method = RequestMethod.POST)
1301
    public String raiseClaimOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28352 tejbeer 1302
 
33213 tejus.loha 1303
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1304
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1305
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28437 tejbeer 1306
 
33213 tejus.loha 1307
        if (pendingOrder.getTotalAmount() == pendingOrder.getPaidAmount()) {
1308
            pendingOrderItem.setStatus(OrderStatus.CLAIMED);
1309
            pendingOrderItem.setClaimedTimestamp(LocalDateTime.now());
28437 tejbeer 1310
 
33213 tejus.loha 1311
        }
1312
        pendingOrderItemRepository.persist(pendingOrderItem);
1313
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
28437 tejbeer 1314
 
33213 tejus.loha 1315
        return "response";
1316
    }
28437 tejbeer 1317
 
33213 tejus.loha 1318
    @RequestMapping(value = "/verifyOrderItem", method = RequestMethod.POST)
1319
    public String verifyOrderItem(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
28437 tejbeer 1320
 
33213 tejus.loha 1321
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1322
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1323
        pendingOrderItem.setVerifiedTimestamp(LocalDateTime.now());
28352 tejbeer 1324
 
33213 tejus.loha 1325
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1326
 
33213 tejus.loha 1327
        return "response";
1328
    }
26721 tejbeer 1329
 
33213 tejus.loha 1330
    @RequestMapping(value = "/cancelOrderByInvoice", method = RequestMethod.POST)
1331
    public String cancelOrder(HttpServletRequest request, @RequestParam List<String> invoiceNumbers, Model model)
1332
            throws Exception {
1333
        orderService.cancelOrder(invoiceNumbers);
1334
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
26721 tejbeer 1335
 
33213 tejus.loha 1336
        return "response";
1337
    }
28352 tejbeer 1338
 
33213 tejus.loha 1339
    @RequestMapping(value = "/getOnlineOrder", method = RequestMethod.GET)
1340
    public String cancelOrder(HttpServletRequest request, Model model) throws Exception {
1341
        return "online-order";
1342
    }
28352 tejbeer 1343
 
33213 tejus.loha 1344
    @GetMapping("/getAllOrdersByStatus")
1345
    public String getAllOrdersByStatus(HttpServletRequest request, @RequestParam OrderStatus status,
1346
                                       @RequestParam(required = false) LocalDateTime startTime,
1347
                                       @RequestParam(required = false) LocalDateTime endTime, Model model) throws ProfitMandiBusinessException {
1348
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1349
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
28352 tejbeer 1350
 
33213 tejus.loha 1351
        LOGGER.info("startTime {}", startTime);
1352
        LOGGER.info("endTime {}", endTime);
28352 tejbeer 1353
 
33213 tejus.loha 1354
        List<PendingOrderItem> pendingOrderItems;
1355
        if (startTime == null) {
1356
            pendingOrderItems = pendingOrderItemRepository.selectOrderItemByStatus(status);
1357
        } else {
1358
            List<OrderStatus> statusList = new ArrayList<>();
1359
            if (status.equals(OrderStatus.DELIVERED)) {
1360
                statusList.add(OrderStatus.SETTLED);
1361
                statusList.add(OrderStatus.UNSETTLED);
1362
            } else {
1363
                statusList.add(status);
1364
            }
1365
            pendingOrderItems = pendingOrderItemRepository.selectByStatusAndCreateTimestamp(statusList,
1366
                    startTime.toLocalDate().atStartOfDay(), endTime);
1367
        }
28352 tejbeer 1368
 
33213 tejus.loha 1369
        List<Integer> pendingOrderIds = pendingOrderItems.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
28352 tejbeer 1370
 
33213 tejus.loha 1371
        List<Integer> fofoIds = pendingOrderRepository.selectByIds(pendingOrderIds)
1372
                .stream().map(x -> x.getFofoId()).distinct().collect(Collectors.toList());
28356 tejbeer 1373
 
33213 tejus.loha 1374
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28352 tejbeer 1375
 
33213 tejus.loha 1376
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1377
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1378
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1379
        model.addAttribute("customRetailersMap", customRetailersMap);
28352 tejbeer 1380
 
33213 tejus.loha 1381
        LOGGER.info("customRetailersMap {}", customRetailersMap);
28339 tejbeer 1382
 
33213 tejus.loha 1383
        Map<String, Object> map = pendingOrderService.getItemOrders(pendingOrderItems, 0);
32697 ranu 1384
 
33213 tejus.loha 1385
        model.addAttribute("pendingOrderItems", (List<PendingOrderItem>) map.get("pendingOrderItems"));
1386
        model.addAttribute("partnerInventoryMap", map.get("partnerInventoryMap"));
32697 ranu 1387
 
33213 tejus.loha 1388
        model.addAttribute("isAdmin", isAdmin);
1389
        return "online-order-item";
1390
    }
32697 ranu 1391
 
33213 tejus.loha 1392
    //TODO Tejus
1393
    @RequestMapping(value = "/getBulkOrder")
33336 tejus.loha 1394
    public String getBulkOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException, MessagingException, IOException {
33213 tejus.loha 1395
        return "bulk-order";
1396
    }
32697 ranu 1397
 
33213 tejus.loha 1398
    @PostMapping(value = "/bulkOrder/upload")
1399
    public String uploadCatalog(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model)
1400
            throws Exception {
1401
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
1402
        int authId = authRepository.selectByEmailOrMobile(fofoDetails.getEmailId()).getId();
1403
        LOGGER.info("authId - {}", authId);
1404
        bulkOrderService.parseBulkOrders(file, authId);
1405
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1406
        return "response";
1407
    }
32697 ranu 1408
 
33213 tejus.loha 1409
    // This method is use for sending all pending transaction to Transation Approval menu
1410
    @RequestMapping(value = "/transaction/pendingApprovals", method = RequestMethod.GET)
1411
    public String getTransactionApproval(HttpServletRequest request, Model model) throws Exception {
33219 tejus.loha 1412
        List<TransactionApproval> transactionApprovals = transactionApprovalRepository.selectAllPending();
1413
        LOGGER.info("list of Approval transaction Id " + transactionApprovals);
33336 tejus.loha 1414
        List<TransactionApprovalModel> approvalModelList = bulkOrderService.getAllPendingTransactionApproval();
33213 tejus.loha 1415
        model.addAttribute("approvalModelList", approvalModelList);
1416
        return "transaction/transaction-approvals";
1417
    }
33092 tejus.loha 1418
 
33213 tejus.loha 1419
    @RequestMapping(value = "transaction/approval", method = RequestMethod.PUT)
1420
    public String transactionApproval(HttpServletRequest request, Model model,
1421
                                      @RequestParam int transactionId,
1422
                                      @RequestParam String remark,
1423
                                      @RequestParam TransactionApprovalStatus transactionApprovalStatus
1424
    ) throws Exception {
1425
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1426
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
1427
        int approvalId = authUser.getId();
1428
        String approvedBy = authUser.getFullName();
1429
        LocalDateTime approvedOn = LocalDateTime.now();
1430
        this.updateApprovalStatus(transactionId, approvalId, approvedBy, approvedOn, remark, transactionApprovalStatus);
1431
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1432
        return "response";
1433
 
1434
    }
1435
 
1436
    private void updateApprovalStatus(int transactionId, int approvalId, String approvedBy, LocalDateTime approvedOn, String remark, TransactionApprovalStatus transactionApprovalStatus) throws Exception {
1437
        TransactionApproval transactionApproval = transactionApprovalRepository.selectById(transactionId);
33336 tejus.loha 1438
        int retailerId = transactionRepository.selectById(transactionId).getRetailerId();
33213 tejus.loha 1439
        if (!transactionApproval.getStatus().equals(TransactionApprovalStatus.PENDING)) {
1440
            throw new ProfitMandiBusinessException("Transaction already Processed", "Transaction already Processed", "Transaction already Processed");
1441
        }
1442
        transactionApproval.setStatus(transactionApprovalStatus);
1443
        transactionApproval.setRemark(remark);
1444
        transactionApproval.setApprovalId(approvalId);
1445
        transactionApproval.setApprovedBy(approvedBy);
1446
        transactionApproval.setApprovedOn(approvedOn);
1447
        if (transactionApprovalStatus.equals(TransactionApprovalStatus.APPROVED)) {
1448
            transactionService.processTransaction(transactionId);
33336 tejus.loha 1449
        } else {
1450
            float totalAmount = 0;
1451
            // referense id = transaction id
1452
            // here refund the amount of an order
1453
            List<UserWalletHistory> uwhList = walletService.getAllByReference(retailerId, transactionId, WalletReferenceType.PURCHASE);
1454
            // Do is negative so that add amount in wallet
1455
            totalAmount = -uwhList.get(0).getAmount();
1456
            walletService.refundToWallet(retailerId, totalAmount, transactionId, WalletReferenceType.PURCHASE, "Order canceled");
33213 tejus.loha 1457
        }
1458
    }
1459
 
1460
    @RequestMapping(value = "/bulkOrderTemplate", method = RequestMethod.GET)
1461
    public ResponseEntity<?> bulkOrderTemplate() throws Exception {
1462
        List<List<?>> rows = new ArrayList<>();
1463
        rows.add(Arrays.asList("Mahaveer", "Change description for your reference", "175139287", "28264", "0", "4"));
1464
        rows.add(Arrays.asList("Mahaveer", "Price =0 means system price", "175139287", "28268", "0", "7"));
1465
        rows.add(Arrays.asList("Jas", "You give custom price also ", "171273247", "28264", "300", "3"));
1466
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1467
                .getCSVByteStream(Arrays.asList("Partner name", "Description", "Partner Id", "Item Id", "Price", "Quantity"), rows);
1468
        ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "Bulk order template");
1469
 
1470
        return responseEntity;
1471
 
1472
    }
32409 amit.gupta 1473
}
32405 jai.hind 1474
 
1475
 
1476
 
1477
 
1478