Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
26607 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.eclipsesource.json.JsonObject;
4
import com.google.gson.Gson;
5
import com.google.gson.reflect.TypeToken;
28377 tejbeer 6
import com.spice.profitmandi.common.enumuration.MessageType;
26607 amit.gupta 7
import com.spice.profitmandi.common.enumuration.SchemeType;
8
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30123 amit.gupta 9
import com.spice.profitmandi.common.model.*;
26607 amit.gupta 10
import com.spice.profitmandi.common.solr.SolrService;
28304 amit.gupta 11
import com.spice.profitmandi.common.util.FormattingUtils;
28566 tejbeer 12
import com.spice.profitmandi.common.util.PdfUtils;
28405 amit.gupta 13
import com.spice.profitmandi.common.util.Utils;
26607 amit.gupta 14
import com.spice.profitmandi.common.web.client.RestClient;
15
import com.spice.profitmandi.common.web.util.ResponseSender;
16
import com.spice.profitmandi.dao.entity.catalog.Item;
17
import com.spice.profitmandi.dao.entity.catalog.TagListing;
29515 tejbeer 18
import com.spice.profitmandi.dao.entity.dtr.ScratchOffer;
28377 tejbeer 19
import com.spice.profitmandi.dao.entity.dtr.User;
26745 amit.gupta 20
import com.spice.profitmandi.dao.entity.dtr.WebListing;
28374 amit.gupta 21
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
30123 amit.gupta 22
import com.spice.profitmandi.dao.entity.fofo.*;
31203 tejbeer 23
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26630 amit.gupta 24
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
31573 tejbeer 25
import com.spice.profitmandi.dao.enumuration.dtr.WebListingSource;
29515 tejbeer 26
import com.spice.profitmandi.dao.enumuration.inventory.ScratchedGift;
27045 tejbeer 27
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
30123 amit.gupta 28
import com.spice.profitmandi.dao.model.*;
26607 amit.gupta 29
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
30
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
28290 tejbeer 31
import com.spice.profitmandi.dao.repository.cs.CsService;
30123 amit.gupta 32
import com.spice.profitmandi.dao.repository.dtr.*;
33
import com.spice.profitmandi.dao.repository.fofo.*;
26607 amit.gupta 34
import com.spice.profitmandi.dao.repository.inventory.ItemAvailabilityCacheRepository;
28582 amit.gupta 35
import com.spice.profitmandi.dao.repository.user.UserRepository;
26784 amit.gupta 36
import com.spice.profitmandi.service.CustomerService;
28377 tejbeer 37
import com.spice.profitmandi.service.EmailService;
38
import com.spice.profitmandi.service.NotificationService;
26607 amit.gupta 39
import com.spice.profitmandi.service.authentication.RoleManager;
30123 amit.gupta 40
import com.spice.profitmandi.service.inventory.*;
28566 tejbeer 41
import com.spice.profitmandi.service.order.OrderService;
26683 amit.gupta 42
import com.spice.profitmandi.service.scheme.SchemeService;
26651 amit.gupta 43
import com.spice.profitmandi.service.user.RetailerService;
26630 amit.gupta 44
import com.spice.profitmandi.web.processor.OtpProcessor;
26607 amit.gupta 45
import com.spice.profitmandi.web.res.DealBrands;
46
import com.spice.profitmandi.web.res.DealObjectResponse;
47
import com.spice.profitmandi.web.res.DealsResponse;
48
import com.spice.profitmandi.web.res.ValidateCartResponse;
28322 amit.gupta 49
import com.spice.profitmandi.web.services.PartnerIndexService;
26607 amit.gupta 50
import io.swagger.annotations.ApiImplicitParam;
51
import io.swagger.annotations.ApiImplicitParams;
52
import io.swagger.annotations.ApiOperation;
30123 amit.gupta 53
import org.apache.commons.lang3.StringUtils;
54
import org.apache.http.conn.HttpHostConnectException;
55
import org.apache.logging.log4j.LogManager;
56
import org.apache.logging.log4j.Logger;
57
import org.json.JSONArray;
58
import org.json.JSONObject;
59
import org.springframework.beans.factory.annotation.Autowired;
60
import org.springframework.beans.factory.annotation.Value;
61
import org.springframework.core.io.InputStreamResource;
62
import org.springframework.http.HttpHeaders;
63
import org.springframework.http.HttpStatus;
64
import org.springframework.http.MediaType;
65
import org.springframework.http.ResponseEntity;
66
import org.springframework.stereotype.Controller;
67
import org.springframework.transaction.annotation.Transactional;
68
import org.springframework.web.bind.annotation.*;
26607 amit.gupta 69
 
30123 amit.gupta 70
import javax.servlet.http.HttpServletRequest;
71
import javax.servlet.http.HttpServletResponse;
72
import java.io.ByteArrayInputStream;
73
import java.io.ByteArrayOutputStream;
74
import java.io.IOException;
75
import java.io.InputStream;
31445 tejbeer 76
import java.time.LocalDate;
30123 amit.gupta 77
import java.time.LocalDateTime;
78
import java.time.LocalTime;
79
import java.time.format.DateTimeFormatter;
80
import java.util.*;
81
import java.util.stream.Collectors;
82
 
26607 amit.gupta 83
@Controller
84
@Transactional(rollbackFor = Throwable.class)
85
public class StoreController {
86
 
32018 tejbeer 87
    private static final Logger logger = LogManager.getLogger(StoreController.class);
26630 amit.gupta 88
 
32018 tejbeer 89
    private static final LocalTime CUTOFF_TIME = LocalTime.of(15, 0);
26745 amit.gupta 90
 
32018 tejbeer 91
    private static final List<Integer> TAG_IDS = Arrays.asList(4);
26745 amit.gupta 92
 
32018 tejbeer 93
    @Autowired
94
    CustomerAddressRepository customerAddressRepository;
28392 tejbeer 95
 
32018 tejbeer 96
    @Autowired
97
    WebOfferRepository webOfferRepository;
26607 amit.gupta 98
 
32018 tejbeer 99
    @Value("${new.solr.url}")
100
    private String solrUrl;
28345 tejbeer 101
 
32018 tejbeer 102
    @Autowired
103
    private PartnerIndexService partnerIndexService;
28345 tejbeer 104
 
32018 tejbeer 105
    @Autowired
106
    InventoryService inventoryService;
27045 tejbeer 107
 
32018 tejbeer 108
    @Autowired
109
    UserAccountRepository userAccountRepository;
26923 amit.gupta 110
 
32018 tejbeer 111
    @Value("${python.api.host}")
112
    private String host;
26833 amit.gupta 113
 
32018 tejbeer 114
    @Autowired
115
    CustomerService customerService;
26607 amit.gupta 116
 
32018 tejbeer 117
    @Value("${python.api.port}")
118
    private int port;
26923 amit.gupta 119
 
32018 tejbeer 120
    @Autowired
121
    private SaholicInventoryService saholicInventoryService;
26607 amit.gupta 122
 
32018 tejbeer 123
    @Autowired
124
    private PincodePartnerRepository pincodePartnerRepository;
26715 amit.gupta 125
 
32018 tejbeer 126
    @Autowired
127
    private FofoStoreRepository fofoStoreRepository;
26745 amit.gupta 128
 
32018 tejbeer 129
    @Autowired
130
    private RetailerService retailerService;
26861 tejbeer 131
 
32018 tejbeer 132
    @Autowired
133
    private PendingOrderRepository pendingOrderRepository;
26861 tejbeer 134
 
32018 tejbeer 135
    @Autowired
136
    private PendingOrderItemRepository pendingOrderItemRepository;
26652 amit.gupta 137
 
32018 tejbeer 138
    @Autowired
139
    private PendingOrderService pendingOrderService;
26648 amit.gupta 140
 
32018 tejbeer 141
    @Autowired
142
    private CustomerRepository customerRepository;
26774 amit.gupta 143
 
32018 tejbeer 144
    @Autowired
145
    private SolrService commonSolrService;
26607 amit.gupta 146
 
32018 tejbeer 147
    @Autowired
148
    private OtpProcessor otpProcessor;
26630 amit.gupta 149
 
32018 tejbeer 150
    @Autowired
151
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
26607 amit.gupta 152
 
32018 tejbeer 153
    @Autowired
154
    private ResponseSender<?> responseSender;
26607 amit.gupta 155
 
32018 tejbeer 156
    @Autowired
157
    private TagListingRepository tagListingRepository;
26607 amit.gupta 158
 
32018 tejbeer 159
    @Autowired
160
    private ItemRepository itemRepository;
26701 amit.gupta 161
 
32018 tejbeer 162
    @Autowired
163
    private SchemeService schemeService;
26607 amit.gupta 164
 
32018 tejbeer 165
    @Autowired
166
    private UserRepository userRepository;
28566 tejbeer 167
 
32018 tejbeer 168
    @Autowired
169
    private ItemAvailabilityCacheRepository itemAvailabilityCacheRepository;
26607 amit.gupta 170
 
32018 tejbeer 171
    @Autowired
172
    private WebListingRepository webListingRepository;
26745 amit.gupta 173
 
32018 tejbeer 174
    @Autowired
175
    private WebProductListingRepository webProductListingRepository;
26745 amit.gupta 176
 
32018 tejbeer 177
    @Autowired
178
    private RoleManager roleManagerService;
26607 amit.gupta 179
 
32018 tejbeer 180
    @Autowired
181
    EmailService emailService;
27028 tejbeer 182
 
32018 tejbeer 183
    @Autowired
184
    CsService csService;
28339 tejbeer 185
 
32018 tejbeer 186
    @Autowired
187
    private NotificationService notificationService;
28377 tejbeer 188
 
32018 tejbeer 189
    @Autowired
190
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
28377 tejbeer 191
 
32018 tejbeer 192
    @Autowired
193
    private FofoOrderRepository fofoOrderRepository;
28566 tejbeer 194
 
32018 tejbeer 195
    @Autowired
196
    private FofoOrderItemRepository fofoOrderItemRepository;
28566 tejbeer 197
 
32018 tejbeer 198
    @Autowired
199
    private OrderService orderService;
29515 tejbeer 200
 
32018 tejbeer 201
    @Autowired
202
    private ScratchOfferRepository scratchOfferRepository;
203
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
28339 tejbeer 204
 
32018 tejbeer 205
    List<String> filterableParams = Arrays.asList("brand");
26607 amit.gupta 206
 
32018 tejbeer 207
    @RequestMapping(value = "/store/entity/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
208
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
209
    @ApiOperation(value = "Get unit deal object")
210
    public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id) throws ProfitMandiBusinessException {
211
        List<FofoCatalogResponse> dealResponses = new ArrayList<>();
212
        List<Integer> tagIds = Arrays.asList(4);
213
        FofoCatalogResponse fofoCatalogResponse = null;
214
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
215
        if (roleManagerService.isPartner(userInfo.getRoleIds())) {
216
            String categoryId = "(3 OR 6)";
26745 amit.gupta 217
 
32018 tejbeer 218
            RestClient rc = new RestClient();
219
            Map<String, String> params = new HashMap<>();
220
            List<String> mandatoryQ = new ArrayList<>();
221
            String catalogString = "catalog" + id;
26607 amit.gupta 222
 
32018 tejbeer 223
            mandatoryQ.add(String.format("+(categoryId_i:%s) +(id:%s) +{!parent which=\"id:%s\"} tagId_i:(%s)", categoryId, catalogString, catalogString, StringUtils.join(tagIds, " ")));
26668 amit.gupta 224
 
32018 tejbeer 225
            params.put("q", StringUtils.join(mandatoryQ, " "));
226
            params.put("fl", "*, [child parentFilter=id:catalog*]");
227
            params.put("sort", "rank_i asc, create_s desc");
228
            params.put("wt", "json");
229
            String response = null;
230
            try {
231
                response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
232
            } catch (HttpHostConnectException e) {
233
                throw new ProfitMandiBusinessException("", "", "Could not connect to host");
234
            }
235
            JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
236
            JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
237
            dealResponses = getCatalogResponse(docs, false, userInfo.getRetailerId());
238
            fofoCatalogResponse = dealResponses.get(0);
239
            fofoCatalogResponse.setWebOffers(webOfferRepository.selectAllActiveOffers().get(fofoCatalogResponse.getCatalogId()));
28467 tejbeer 240
 
32018 tejbeer 241
        } else {
242
            return responseSender.badRequest(
243
                    new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
244
        }
245
        return responseSender.ok(dealResponses.get(0));
246
    }
26668 amit.gupta 247
 
32018 tejbeer 248
    private Object toDealObject(JsonObject jsonObject) {
249
        if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
250
            return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
251
        }
252
        return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
253
    }
26607 amit.gupta 254
 
32018 tejbeer 255
    @RequestMapping(value = "/store/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
256
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
257
    @ApiOperation(value = "Get brand list and count for category")
258
    public ResponseEntity<?> getBrands(HttpServletRequest request, @RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
259
        logger.info("Request " + request.getParameterMap());
260
        String response = null;
261
        // TODO: move to properties
262
        String uri = ProfitMandiConstants.URL_BRANDS;
263
        RestClient rc = new RestClient();
264
        Map<String, String> params = new HashMap<>();
265
        params.put("category_id", category_id);
266
        List<DealBrands> dealBrandsResponse = null;
267
        try {
268
            response = rc.get(SchemeType.HTTP, host, port, uri, params);
269
        } catch (HttpHostConnectException e) {
270
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
271
        }
26607 amit.gupta 272
 
32018 tejbeer 273
        dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
274
        }.getType());
26607 amit.gupta 275
 
32018 tejbeer 276
        return responseSender.ok(dealBrandsResponse);
277
    }
26607 amit.gupta 278
 
32018 tejbeer 279
    @RequestMapping(value = "/store/listing/{listingUrl}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
280
    public ResponseEntity<?> bestSellers(HttpServletRequest request, @PathVariable String listingUrl) throws Exception {
281
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
282
        WebListing webListing = webListingRepository.selectByUrl(listingUrl);
283
        webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
284
        return responseSender.ok(webListing);
285
    }
26654 amit.gupta 286
 
32018 tejbeer 287
    @RequestMapping(value = "/store/otp/generateOTP", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
288
    public ResponseEntity<?> generateOtp(HttpServletRequest request, @RequestParam String mobile) throws Exception {
26630 amit.gupta 289
 
32018 tejbeer 290
        return responseSender.ok(otpProcessor.generateOtp(mobile, OtpType.REGISTRATION));
26630 amit.gupta 291
 
32018 tejbeer 292
    }
26652 amit.gupta 293
 
32018 tejbeer 294
    @RequestMapping(value = "/store/checkmobile/{mobile}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
295
    public ResponseEntity<?> checkRegistrationUsingMobile(HttpServletRequest request, @PathVariable String mobile) throws Exception {
296
        try {
297
            Customer customer = customerRepository.selectByMobileNumber(mobile);
298
            customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
299
            return responseSender.ok(new CustomerModel(true, customer));
300
        } catch (Exception e) {
301
            return responseSender.ok(new CustomerModel(false, null));
302
        }
303
    }
26833 amit.gupta 304
 
26923 amit.gupta 305
 
32018 tejbeer 306
    @RequestMapping(value = "/store/getCustomerById", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
307
    public ResponseEntity<?> getCustomerById(HttpServletRequest request, @PathVariable int id) throws Exception {
26774 amit.gupta 308
 
32018 tejbeer 309
        Customer customer = customerRepository.selectById(id);
310
        customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
311
        return responseSender.ok(customer);
26857 amit.gupta 312
 
32018 tejbeer 313
    }
26652 amit.gupta 314
 
32018 tejbeer 315
    @RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
316
    public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
317
        if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
318
            return responseSender.ok(true);
319
        } else {
320
            return responseSender.ok(false);
321
        }
322
    }
27028 tejbeer 323
 
32018 tejbeer 324
    @RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
325
    public ResponseEntity<?> resetPassword(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
326
        customerService.changePassword(userModel.getMobile(), userModel.getPassword());
327
        return responseSender.ok(true);
328
    }
28339 tejbeer 329
 
32018 tejbeer 330
    @RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
331
    public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
332
        Customer customer = new Customer();
333
        customer.setPassword(userModel.getPassword());
334
        customer.setEmailId(userModel.getEmail());
335
        customer.setFirstName(userModel.getFirstName());
336
        customer.setLastName(userModel.getLastName());
337
        customer.setMobileNumber(userModel.getMobile());
338
        return responseSender.ok(customerService.addCustomer(customer));
339
    }
28339 tejbeer 340
 
32018 tejbeer 341
    @RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
342
    public ResponseEntity<?> confirmOrder(HttpServletRequest request, @RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
343
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
344
        Integer storeId = userInfo.getRetailerId();
345
        createPendingOrderRequest.setFofoId(storeId);
346
        List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
347
        List<CartItem> cartItems = new ArrayList<>();
348
        pendingOrderItems.stream().forEach(x -> {
349
            CartItem ci = new CartItem();
350
            ci.setItemId(x.getItemId());
351
            ci.setQuantity(x.getQuantity());
352
            ci.setSellingPrice(x.getSellingPrice());
353
            cartItems.add(ci);
354
        });
355
        CartResponse cr = this.validateCart(storeId, cartItems);
356
        if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
357
            return responseSender.badRequest("Invalid request");
358
        }
28377 tejbeer 359
 
32018 tejbeer 360
        Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
28377 tejbeer 361
 
32018 tejbeer 362
        PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
363
        if (offlineOrders.contains(pendingOrder.getPayMethod())) {
28391 tejbeer 364
 
32018 tejbeer 365
            Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
28400 tejbeer 366
 
32018 tejbeer 367
            CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
368
            Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
369
            String[] customerEmail = null;
370
            if (Utils.validateEmail(customer.getEmailId())) {
371
                customerEmail = new String[]{customer.getEmailId()};
372
            }
31203 tejbeer 373
 
32018 tejbeer 374
            List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in", "devkinandan.lal@smartdukaan.com", customRetailer.getEmail());
28394 tejbeer 375
 
32018 tejbeer 376
            List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
377
            if (authUserEmails != null) {
378
                authUserEmails = new ArrayList<>();
379
            }
380
            logger.info("authUserEmails {}", authUserEmails);
381
            authUserEmails.addAll(bccTo);
382
            StringBuffer itemBuffer = new StringBuffer();
383
            List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
384
            int totalItems = 0;
385
            String itemNoColor = null;
386
            float maxValue = 0;
387
            for (PendingOrderItem orderItem : orderItems) {
388
                if (maxValue < orderItem.getSellingPrice()) {
389
                    maxValue = orderItem.getSellingPrice();
390
                    itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
391
                }
392
                totalItems += orderItem.getQuantity();
393
            }
394
            if (totalItems > 1) {
395
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
396
                itemBuffer.append(" +").append(totalItems - 1).append(" items");
397
            } else {
398
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
399
            }
400
            String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(), itemBuffer.toString(), pendingOrder.getTotalAmount());
401
            otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28377 tejbeer 402
 
32018 tejbeer 403
            emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
28377 tejbeer 404
 
32018 tejbeer 405
            List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
27028 tejbeer 406
 
32018 tejbeer 407
            emailIds.addAll(
408
                    csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_MARKETING, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3, EscalationType.L4)).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
409
            emailIds.add("tarun.verma@smartdukaan.com");
410
            emailIds.add("devkinandan.lal@smartdukaan.com");
411
            emailIds.add("tejbeer.kaur@shop2020.in");
412
            List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
413
            List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
26630 amit.gupta 414
 
32018 tejbeer 415
            logger.info("userIds" + userIds);
416
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
417
            sendNotificationModel.setCampaignName("Online Order Alert");
418
            sendNotificationModel.setTitle("Online Order Update");
419
            sendNotificationModel.setMessage(String.format(
420
                    "You have new Online Order. Please check your Dashboard. In case of an activation scheme pls ensure the handset is activated, payout will be processed as per brand's activation report."));
421
            sendNotificationModel.setType("url");
422
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
423
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
424
            sendNotificationModel.setMessageType(MessageType.notification);
425
            int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
426
            sendNotificationModel.setUserIds(Arrays.asList(userId));
427
            notificationService.sendNotification(sendNotificationModel);
26857 amit.gupta 428
 
32018 tejbeer 429
            SendNotificationModel snm = new SendNotificationModel();
430
            snm.setCampaignName("Online Order Alert");
431
            snm.setTitle("Online Order Update");
432
            snm.setMessage(String.format("Your Partner " + customRetailer.getBusinessName() + " have new Online Order. Please inform your partner. In case of an activation scheme pls ensure the handset is activated, payout will be processed as per brand's activation report."));
433
            snm.setType("url");
434
            snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
435
            snm.setExpiresat(LocalDateTime.now().plusDays(1));
436
            snm.setMessageType(MessageType.notification);
437
            snm.setUserIds(userIds);
438
            notificationService.sendNotification(snm);
26857 amit.gupta 439
 
32018 tejbeer 440
        }
441
        return responseSender.ok(returnMap);
26857 amit.gupta 442
 
32018 tejbeer 443
    }
28287 amit.gupta 444
 
32018 tejbeer 445
    @RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
446
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
447
    @ApiOperation(value = "Get brand list and count for category")
448
    public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
449
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
450
        Integer storeId = userInfo.getRetailerId();
451
        CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
26923 amit.gupta 452
 
32018 tejbeer 453
        return responseSender.ok(customRetailer.getAddress());
28566 tejbeer 454
 
32018 tejbeer 455
    }
28566 tejbeer 456
 
32018 tejbeer 457
    @RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
458
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
459
    @ApiOperation(value = "Get brand list and count for category")
460
    public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
461
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
462
        int fofoId = ProfitMandiConstants.DEFAULT_STORE;
463
        if (pincodePartners.size() > 0) {
464
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
465
            List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
466
            if (fofoStores.size() > 0) {
467
                fofoId = fofoStores.get(0).getId();
468
            }
28566 tejbeer 469
 
32018 tejbeer 470
        }
471
        return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
472
    }
28566 tejbeer 473
 
32018 tejbeer 474
    @RequestMapping(value = "/store/addresses", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
475
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
476
    @ApiOperation(value = "Get brand list and count for category")
477
    public ResponseEntity<?> getStoresByPincod(HttpServletRequest request, @RequestParam String pincode, @RequestParam(name = "fofoCode", defaultValue = "", required = false) String fofoCode) throws Exception {
28566 tejbeer 478
 
32018 tejbeer 479
        List<CustomRetailer> customerRetailers = new ArrayList<>();
28566 tejbeer 480
 
32018 tejbeer 481
        logger.info("fofoCode" + fofoCode);
30426 tejbeer 482
 
32018 tejbeer 483
        if (fofoCode != null) {
484
            FofoStore fs = fofoStoreRepository.selectByStoreCode(fofoCode.toUpperCase());
485
            PincodePartner pp = pincodePartnerRepository.selectPartnerByPincode(pincode, fs.getId());
486
            if (pp != null) {
487
                return responseSender.ok(customerRetailers.add(retailerService.getFofoRetailer(pp.getFofoId())));
488
            } else {
30426 tejbeer 489
 
32018 tejbeer 490
                List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
491
                if (pincodePartners.size() > 0) {
28566 tejbeer 492
 
32018 tejbeer 493
                    List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
494
                    List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 495
 
32018 tejbeer 496
                    Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 497
 
32018 tejbeer 498
                    Map<Integer, CustomRetailer> customerRetailerMap = activefofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
28566 tejbeer 499
 
32018 tejbeer 500
                    customerRetailers.addAll(customerRetailerMap.values());
30426 tejbeer 501
 
32018 tejbeer 502
                }
503
                return responseSender.ok(customerRetailers);
30426 tejbeer 504
 
32018 tejbeer 505
            }
506
        } else {
28566 tejbeer 507
 
32018 tejbeer 508
            List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
509
            if (pincodePartners.size() > 0) {
510
                List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
511
                List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 512
 
32018 tejbeer 513
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 514
 
32018 tejbeer 515
                Map<Integer, CustomRetailer> customerRetailerMap = activefofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
28566 tejbeer 516
 
32018 tejbeer 517
                customerRetailers.addAll(customerRetailerMap.values());
518
            }
28298 tejbeer 519
 
32018 tejbeer 520
            return responseSender.ok(customerRetailers);
30426 tejbeer 521
 
32018 tejbeer 522
        }
30426 tejbeer 523
 
32018 tejbeer 524
    }
30426 tejbeer 525
 
32018 tejbeer 526
    @RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
527
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
528
    @ApiOperation(value = "Get brand list and count for category")
529
    public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
530
        List<CustomRetailer> customerRetailers = new ArrayList<>();
531
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28298 tejbeer 532
 
32018 tejbeer 533
        if (!pincodePartners.isEmpty()) {
534
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
535
            List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28298 tejbeer 536
 
32018 tejbeer 537
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 538
 
32018 tejbeer 539
            Map<Integer, CustomRetailer> customerRetailerMap = activefofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
27049 tejbeer 540
 
32018 tejbeer 541
            customerRetailers.addAll(customerRetailerMap.values());
542
        }
27049 tejbeer 543
 
32018 tejbeer 544
        logger.info("customerRetailers" + customerRetailers);
545
        return responseSender.ok(customerRetailers);
546
    }
26855 tejbeer 547
 
32018 tejbeer 548
    @RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
549
    public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
550
        List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
551
        List<Integer> catalogIds = new ArrayList<>();
552
        List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
26855 tejbeer 553
 
32018 tejbeer 554
        if (!pendingOrders.isEmpty()) {
555
            for (PendingOrder po : pendingOrders) {
556
                List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
557
                for (PendingOrderItem pendingOrderItem : pois) {
558
                    Item item = itemRepository.selectById(pendingOrderItem.getItemId());
559
                    pendingOrderItem.setItemName(item.getItemDescription());
560
                    catalogIds.add(item.getCatalogItemId());
561
                }
26855 tejbeer 562
 
32018 tejbeer 563
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
26855 tejbeer 564
 
32018 tejbeer 565
                for (PendingOrderItem poi : pois) {
28566 tejbeer 566
 
32018 tejbeer 567
                    CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
28566 tejbeer 568
 
32018 tejbeer 569
                    Item item = itemRepository.selectById(poi.getItemId());
570
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
571
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
572
                    customerOrderDetail.setBrand(item.getBrand());
573
                    customerOrderDetail.setColor(item.getColor());
574
                    customerOrderDetail.setPendingOrderItemId(poi.getId());
575
                    customerOrderDetail.setId(poi.getOrderId());
576
                    customerOrderDetail.setItemId(poi.getItemId());
577
                    customerOrderDetail.setModelName(item.getModelName());
578
                    customerOrderDetail.setModelNumber(item.getModelNumber());
579
                    customerOrderDetail.setQuantity(poi.getQuantity());
580
                    customerOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
581
                    customerOrderDetail.setStatus(poi.getStatus());
582
                    customerOrderDetail.setTotalPrice(poi.getSellingPrice());
583
                    customerOrderDetail.setPayMethod(po.getPayMethod());
584
                    customerOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
585
                    customerOrderDetails.add(customerOrderDetail);
586
                }
587
            }
588
        }
28566 tejbeer 589
 
32018 tejbeer 590
        return responseSender.ok(customerOrderDetails);
591
    }
28566 tejbeer 592
 
32018 tejbeer 593
    @RequestMapping(value = "/store/invoiceOrder", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
594
    public ResponseEntity<?> getOrderInvoiceDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
595
        List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
596
        List<Integer> catalogIds = new ArrayList<>();
597
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectOrderByCustomerId(id, offset, limit);
28566 tejbeer 598
 
32018 tejbeer 599
        if (!fofoOrders.isEmpty()) {
600
            for (FofoOrder fo : fofoOrders) {
601
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fo.getId());
602
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
603
                    Item item = itemRepository.selectById(fofoOrderItem.getItemId());
604
                    fofoOrderItem.setItemName(item.getItemDescription());
605
                    catalogIds.add(item.getCatalogItemId());
606
                }
28566 tejbeer 607
 
32018 tejbeer 608
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
609
                for (FofoOrderItem foi : fofoOrderItems) {
28566 tejbeer 610
 
32018 tejbeer 611
                    CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
28566 tejbeer 612
 
32018 tejbeer 613
                    Item item = itemRepository.selectById(foi.getItemId());
614
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
615
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
616
                    customerOrderDetail.setBrand(item.getBrand());
617
                    customerOrderDetail.setColor(item.getColor());
618
                    customerOrderDetail.setFofoOrderItemId(foi.getId());
619
                    customerOrderDetail.setFofoOrderId(foi.getOrderId());
620
                    customerOrderDetail.setItemId(foi.getItemId());
621
                    customerOrderDetail.setModelName(item.getModelName());
622
                    customerOrderDetail.setModelNumber(item.getModelNumber());
623
                    customerOrderDetail.setQuantity(foi.getQuantity());
624
                    customerOrderDetail.setTotalPrice(foi.getSellingPrice());
625
                    customerOrderDetail.setCreatedTimeStamp(foi.getCreateTimestamp());
626
                    customerOrderDetail.setInvoiceNumber(fo.getInvoiceNumber());
627
                    customerOrderDetail.setCancelledTimestamp(fo.getCancelledTimestamp());
628
                    customerOrderDetails.add(customerOrderDetail);
629
                }
630
            }
28566 tejbeer 631
 
32018 tejbeer 632
        }
633
        return responseSender.ok(customerOrderDetails);
634
    }
28566 tejbeer 635
 
32018 tejbeer 636
    @RequestMapping(value = "/store/generateInvoice", method = RequestMethod.GET)
637
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
638
        InvoicePdfModel pdfModel = null;
639
        FofoOrder fo = fofoOrderRepository.selectByOrderId(orderId);
640
        pdfModel = orderService.getInvoicePdfModel(fo.getFofoId(), orderId);
641
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
642
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
643
        try {
644
            byteArrayOutputStream.close();
645
        } catch (IOException e) {
646
            // TODO Auto-generated catch block
647
            e.printStackTrace();
648
        }
649
        final HttpHeaders headers = new HttpHeaders();
650
        headers.setContentType(MediaType.APPLICATION_PDF);
651
        // headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
26745 amit.gupta 652
 
32018 tejbeer 653
        headers.setContentType(MediaType.parseMediaType("application/pdf"));
654
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
655
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
656
        headers.add("Pragma", "no-cache");
657
        headers.add("Expires", "0");
28287 amit.gupta 658
 
32018 tejbeer 659
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
660
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
661
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
662
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
663
        // return responseSender.ok(new
664
        // ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(),
665
        // headers,HttpStatus.OK));
666
        /*
667
         * ResponseEntity<byte[]> response = new
668
         * ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(), headers,
669
         * HttpStatus.OK); return response;
670
         */
26923 amit.gupta 671
 
32018 tejbeer 672
    }
26607 amit.gupta 673
 
32018 tejbeer 674
    @RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
675
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
676
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
677
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
678
        for (WebListing webListing : webListings) {
679
            webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
680
        }
681
        return responseSender.ok(webListings);
682
    }
26607 amit.gupta 683
 
32018 tejbeer 684
    private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing) throws ProfitMandiBusinessException {
685
        List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
686
        if (webProducts.size() == 0) {
687
            return new ArrayList<>();
688
        }
689
        RestClient rc = new RestClient();
690
        Map<String, String> params = new HashMap<>();
691
        List<String> mandatoryQ = new ArrayList<>();
692
        mandatoryQ.add(String.format(
693
                "+{!parent which=\"catalogId_i:" + StringUtils.join(webProducts, " ") + "\"} tagId_i:(%s)", StringUtils.join(TAG_IDS, " ")));
694
        params.put("q", StringUtils.join(mandatoryQ, " "));
695
        params.put("fl", "*, [child parentFilter=id:catalog*]");
696
        // params.put("sort", "create_s desc");
697
        params.put("start", String.valueOf(0));
698
        params.put("rows", String.valueOf(100));
699
        params.put("wt", "json");
700
        String response = null;
701
        try {
702
            response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
703
        } catch (HttpHostConnectException e) {
704
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
705
        }
706
        JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
707
        JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
708
        List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
709
        return dealResponse;
710
    }
26607 amit.gupta 711
 
32018 tejbeer 712
    @RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
713
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
714
    @ApiOperation(value = "Get brand list and count for category")
715
    public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest) throws Exception {
716
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
717
        Integer storeId = userInfo.getRetailerId();
718
        ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()), "Success", "Items added to cart successfully");
719
        return responseSender.ok(vc);
720
    }
26607 amit.gupta 721
 
32018 tejbeer 722
    // Validate Cart for B2C Customers
723
    private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
724
        cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
725
        List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
726
        Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId, itemIds);
727
        CartResponse cartResponse = new CartResponse();
728
        List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
729
        cartResponse.setCartItems(cartItemResponseModels);
730
        Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
731
        logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 732
 
32018 tejbeer 733
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26652 amit.gupta 734
 
32018 tejbeer 735
        Map<Integer, TagListing> tagListingMap = tagListingRepository.selectByItemIdsAndTagIds(new HashSet<>(itemIds), new HashSet<>(Arrays.asList(4))).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x));
26923 amit.gupta 736
 
32018 tejbeer 737
        List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId()).collect(Collectors.toList());
26607 amit.gupta 738
 
32018 tejbeer 739
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27030 amit.gupta 740
 
32018 tejbeer 741
        // cartResponse.getCartItems()
742
        int cartMessageChanged = 0;
743
        int cartMessageOOS = 0;
744
        int totalAmount = 0;
745
        int totalQty = 0;
746
        for (CartItem cartItem : cartItems) {
747
            Item item = itemsMap.get(cartItem.getItemId());
748
            TagListing tagListing = tagListingMap.get(cartItem.getItemId());
749
            Float cashback = schemeService.getCatalogSchemeCashBack().get(itemsMap.get(cartItem.getItemId()).getCatalogItemId());
750
            cashback = cashback == null ? 0 : cashback;
751
            float itemSellingPrice = tagListing.getMop() - cashback;
752
            CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
753
            cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
754
            if (itemSellingPrice != cartItem.getSellingPrice()) {
755
                cartItemResponseModel.setSellingPrice(itemSellingPrice);
756
                cartMessageChanged++;
757
            }
758
            int estimate = -2;
759
            LocalDateTime promiseDeliveryTime = LocalDateTime.now();
760
            int qtyRequired = (int) cartItem.getQuantity();
761
            AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
762
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
763
            if (availabilityModel.getStoreAvailability() >= qtyRequired) {
764
                estimate = 0;
765
            } else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
766
                estimate = 2;
767
            } else if (availabilityModel.getStoreAvailability() > 0) {
768
                estimate = 0;
769
                qtyRequired = availabilityModel.getStoreAvailability();
770
                cartMessageChanged++;
771
            } else if (availabilityModel.getWarehouseAvailability() > 0) {
772
                qtyRequired = availabilityModel.getWarehouseAvailability();
773
                estimate = 2;
774
                cartMessageChanged++;
775
            } else {
776
                qtyRequired = 0;
777
                cartMessageChanged++;
778
            }
779
            cartItemResponseModel.setQuantity(qtyRequired);
780
            if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
781
                estimate = estimate + 1;
782
                promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
783
            }
784
            totalQty += qtyRequired;
785
            totalAmount += qtyRequired * itemSellingPrice;
786
            cartItemResponseModel.setEstimate(estimate);
787
            cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
788
            cartItemResponseModel.setItemId(cartItem.getItemId());
789
            cartItemResponseModel.setMinBuyQuantity(1);
790
            cartItemResponseModel.setQuantity(qtyRequired);
791
            cartItemResponseModel.setQuantityStep(1);
792
            cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
793
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
794
            cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
795
            cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
796
            cartItemResponseModel.setColor(item.getColor());
797
            cartItemResponseModels.add(cartItemResponseModel);
798
        }
799
        cartResponse.setCartItems(cartItemResponseModels);
800
        cartResponse.setCartMessageChanged(cartMessageChanged);
801
        cartResponse.setCartMessageOOS(cartMessageOOS);
802
        int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
803
        cartResponse.setMaxEstimate(maxEstimate);
804
        cartResponse.setTotalAmount(totalAmount);
805
        cartResponse.setTotalQty(totalQty);
26607 amit.gupta 806
 
32018 tejbeer 807
        return cartResponse;
26923 amit.gupta 808
 
32018 tejbeer 809
    }
27069 tejbeer 810
 
32018 tejbeer 811
    @RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
812
    public ResponseEntity<?> partnerStock(HttpServletRequest request, @RequestParam(value = "categoryId", required = false, defaultValue = "3") String categoryId, @RequestParam(value = "offset") String offset, @RequestParam(value = "limit") String limit, @RequestParam(value = "sort", required = false) String sort, @RequestParam(value = "brand", required = false) String brand, @RequestParam(value = "subCategoryId", required = false) int subCategoryId, @RequestParam(value = "q", required = false) String queryTerm, @RequestParam(required = false) String listing, @RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
813
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
814
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
815
        FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
816
        sort = "w" + fs.getWarehouseId() + "_i desc";
817
        dealResponse = this.getCatalogResponse(
818
                commonSolrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false), false, userInfo.getRetailerId());
819
        return responseSender.ok(dealResponse);
820
    }
26923 amit.gupta 821
 
32018 tejbeer 822
    private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws ProfitMandiBusinessException {
823
        Map<Integer, Integer> ourItemAvailabilityMap = null;
824
        Map<Integer, Integer> partnerStockAvailabilityMap = null;
825
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
826
        List<Integer> tagIds = Arrays.asList(4);
827
        if (docs.length() > 0) {
828
            HashSet<Integer> itemsSet = new HashSet<>();
829
            for (int i = 0; i < docs.length(); i++) {
830
                JSONObject doc = docs.getJSONObject(i);
831
                if (doc.has("_childDocuments_")) {
832
                    for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
833
                        JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
834
                        int itemId = childItem.getInt("itemId_i");
835
                        itemsSet.add(itemId);
836
                    }
837
                }
838
            }
839
            if (itemsSet.size() == 0) {
840
                return dealResponse;
841
            }
842
            if (fofoId > 0) {
843
                partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
844
            }
845
            ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
846
        }
26833 amit.gupta 847
 
32018 tejbeer 848
        for (int i = 0; i < docs.length(); i++) {
849
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
850
            JSONObject doc = docs.getJSONObject(i);
851
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
852
            ffdr.setCatalogId(doc.getInt("catalogId_i"));
853
            ffdr.setImageUrl(doc.getString("imageUrl_s"));
854
            ffdr.setTitle(doc.getString("title_s"));
855
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
856
            if (webOffers != null && webOffers.size() > 0) {
857
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
858
            }
859
            try {
860
                ffdr.setFeature(doc.getString("feature_s"));
861
            } catch (Exception e) {
862
                ffdr.setFeature(null);
863
            }
864
            ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
865
            if (doc.has("_childDocuments_")) {
866
                for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
867
                    JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
868
                    int itemId = childItem.getInt("itemId_i");
869
                    float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
870
                    if (fofoAvailabilityInfoMap.containsKey(itemId)) {
871
                        if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
872
                            fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
873
                            fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
874
                        }
875
                    } else {
876
                        FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
877
                        fdi.setSellingPrice(sellingPrice);
878
                        fdi.setMrp(childItem.getDouble("mrp_f"));
879
                        fdi.setMop((float) childItem.getDouble("mop_f"));
880
                        fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
881
                        fdi.setTagId(childItem.getInt("tagId_i"));
882
                        fdi.setItem_id(itemId);
883
                        Float cashBack = schemeService.getCatalogSchemeCashBack().get(ffdr.getCatalogId());
884
                        cashBack = cashBack == null ? 0 : cashBack;
885
                        // TODO:Dont commit
886
                        // fdi.setCashback(Math.min(100, fdi.getMop()));
887
                        fdi.setCashback(cashBack);
888
                        fdi.setMinBuyQuantity(1);
889
                        int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0 : partnerStockAvailabilityMap.get(itemId);
890
                        int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0 : Math.max(0, ourItemAvailabilityMap.get(itemId));
891
                        fdi.setActive(partnerAvailability > 0);
892
                        // fdi.setActive(true);
893
                        fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
894
                        fdi.setQuantityStep(1);
895
                        fdi.setMaxQuantity(fdi.getAvailability());
896
                        fofoAvailabilityInfoMap.put(itemId, fdi);
897
                    }
898
                }
899
            }
900
            if (fofoAvailabilityInfoMap.values().size() > 0) {
901
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder()).thenComparingInt(y -> -y.getAvailability())).collect(Collectors.toList()));
902
                dealResponse.add(ffdr);
903
            }
904
        }
905
        return dealResponse.stream().sorted(Comparator.comparing(FofoCatalogResponse::getItems, (s1, s2) -> (s2.get(0).isActive() ? 1 : 0) - (s1.get(0).isActive() ? 1 : 0)).thenComparing(FofoCatalogResponse::getItems, (x, y) -> y.get(0).getAvailability() - x.get(0).getAvailability())).collect(Collectors.toList());
906
    }
26857 amit.gupta 907
 
32018 tejbeer 908
    @GetMapping(value = "store/order-status/{pendingOrderId}")
909
    public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId) throws Exception {
910
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
911
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
912
        List<Integer> catalogIds = new ArrayList<>();
913
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
914
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
915
            pendingOrderItem.setItemName(item.getItemDescription());
916
            catalogIds.add(item.getCatalogItemId());
917
        }
918
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
919
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
920
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
921
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
922
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
923
        }
924
        pendingOrder.setPendingOrderItems(pendingOrderItems);
27045 tejbeer 925
 
32018 tejbeer 926
        return responseSender.ok(pendingOrder);
927
    }
28345 tejbeer 928
 
32018 tejbeer 929
    @RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
930
    public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
931
        return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
932
    }
26861 tejbeer 933
 
32018 tejbeer 934
    @RequestMapping(value = "/store/address", method = RequestMethod.POST)
935
    public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress) throws Throwable {
936
        customerAddressRepository.persist(customerAddress);
937
        return responseSender.ok(customerAddress);
938
    }
27045 tejbeer 939
 
32018 tejbeer 940
    @RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
941
    public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
942
        CustomerAddress cust = customerAddressRepository.selectById(id);
943
        cust.setActive(false);
944
        return responseSender.ok(cust);
945
    }
27048 tejbeer 946
 
32018 tejbeer 947
    @RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
948
    public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer) throws Throwable {
949
        Customer cust = customerRepository.selectById(customer.getId());
950
        cust.setGender(customer.getGender());
951
        cust.setProfileImageId(customer.getProfileImageId());
952
        cust.setDob(customer.getDob());
953
        return responseSender.ok(cust);
954
    }
27048 tejbeer 955
 
32018 tejbeer 956
    @RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
957
    public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state, @PathVariable String city, @PathVariable String storeCode) throws Throwable {
958
        logger.info("Store code {}", storeCode);
959
        Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
960
        logger.info("retailer id {}", map.get(storeCode));
961
        String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
962
        String html = partnerIndexService.getPartnerIndexHtml();
963
        logger.info("html {}", html);
964
        html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan", String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
965
        response.getWriter().write(html);
966
    }
27048 tejbeer 967
 
32018 tejbeer 968
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
969
    public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id,
28339 tejbeer 970
 
32018 tejbeer 971
                                                    @RequestParam String statusDescription, @RequestParam String reason) throws Exception {
28339 tejbeer 972
 
32018 tejbeer 973
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
974
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
975
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
976
        if (pendingOrderItem.getBilledTimestamp() == null) {
977
            pendingOrderItem.setStatus(OrderStatus.CANCELLED);
978
            pendingOrderItem.setRemark(reason);
979
            pendingOrderItem.setStatusDescription("cancel by self");
980
            pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
981
            List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream().map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 982
 
32018 tejbeer 983
            if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING) && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED) && !status.contains(OrderStatus.CLAIMED)) {
984
                pendingOrder.setStatus(OrderStatus.CLOSED);
985
            }
28339 tejbeer 986
 
32018 tejbeer 987
            pendingOrderItemRepository.persist(pendingOrderItem);
988
            String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
989
            otpProcessor.sendSms(OtpProcessor.SELF_CANCELLED_TEMPLATE_ID, String.format(OtpProcessor.SELF_CANCELLED_TEMPLATE, pendingOrder.getId(), StringUtils.abbreviate(itemDescription, 30), FormattingUtils.format(pendingOrderItem.getCancelledTimestamp())), customer.getMobileNumber());
28339 tejbeer 990
 
32018 tejbeer 991
            List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 992
 
32018 tejbeer 993
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
994
            pendingOrderItem.setItemName(item.getItemDescription());
995
            catalogIds.add(item.getCatalogItemId());
28339 tejbeer 996
 
32018 tejbeer 997
            Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
998
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
999
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1000
            pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1001
            CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28355 tejbeer 1002
 
32018 tejbeer 1003
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1004
 
32018 tejbeer 1005
            Map<String, Object> emailModel = new HashMap<>();
1006
            emailModel.put("customer", customerAddress);
1007
            emailModel.put("pendingOrder", pendingOrder);
1008
            emailModel.put("date", dateTimeFormatter);
27048 tejbeer 1009
 
32018 tejbeer 1010
            String[] customerEmail = null;
1011
            if (customer.getEmailId() != null) {
1012
                customerEmail = new String[]{customer.getEmailId()};
27048 tejbeer 1013
 
32018 tejbeer 1014
                List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
29515 tejbeer 1015
 
32018 tejbeer 1016
                emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
29515 tejbeer 1017
 
32018 tejbeer 1018
            }
1019
        }
29515 tejbeer 1020
 
32018 tejbeer 1021
        return responseSender.ok(true);
29515 tejbeer 1022
 
32018 tejbeer 1023
    }
31444 tejbeer 1024
 
32018 tejbeer 1025
    @RequestMapping(value = "/store/checkEligibilityStoreOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1026
    public ResponseEntity<?> checkEligibilityStoreOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1027
 
32018 tejbeer 1028
        boolean eligibility = false;
29515 tejbeer 1029
 
32018 tejbeer 1030
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 14, 0, 0);
29515 tejbeer 1031
 
32018 tejbeer 1032
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, startDate.toLocalDate());
29515 tejbeer 1033
 
32018 tejbeer 1034
        if (!scratchOffers.isEmpty()) {
1035
            eligibility = true;
31457 tejbeer 1036
 
32018 tejbeer 1037
        } else {
1038
            eligibility = false;
1039
        }
31457 tejbeer 1040
 
32018 tejbeer 1041
        return responseSender.ok(eligibility);
1042
    }
29515 tejbeer 1043
 
32018 tejbeer 1044
    @RequestMapping(value = "/store/ScratchOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1045
    public ResponseEntity<?> scratchOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1046
 
32018 tejbeer 1047
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 14, 0, 0);
29515 tejbeer 1048
 
32018 tejbeer 1049
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, startDate.toLocalDate());
29515 tejbeer 1050
 
32018 tejbeer 1051
        // List<ScratchOffer> scratchOffers =
1052
        // scratchOfferRepository.selectBycCustomerId(id);
1053
        for (ScratchOffer so : scratchOffers) {
1054
            LocalDateTime endDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 27, 21, 00);
29515 tejbeer 1055
 
32018 tejbeer 1056
            if (so.getOfferName() != null) {
1057
                so.setExpiredTimestamp(endDate);
1058
            }
1059
            if (LocalDateTime.now().isAfter(so.getUnlockedAt())) {
1060
                so.setUnlocked(true);
1061
            } else {
1062
                so.setUnlocked(false);
1063
            }
1064
        }
29515 tejbeer 1065
 
32018 tejbeer 1066
        return responseSender.ok(scratchOffers);
1067
    }
1068
 
1069
    @RequestMapping(value = "/store/ScratchedOffer", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1070
    public ResponseEntity<?> scratchedOffer(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
1071
 
1072
        ScratchOffer scratchOffer = scratchOfferRepository.selectById(id);
1073
        scratchOffer.setScratched(true);
1074
        scratchOffer.setScracthedAt(LocalDateTime.now());
1075
 
1076
        return responseSender.ok(true);
1077
    }
1078
 
26607 amit.gupta 1079
}