Subversion Repositories SmartDukaan

Rev

Rev 32218 | Rev 32545 | 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
 
32019 tejbeer 306
    @RequestMapping(value = "/store/getCustomerById/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
32018 tejbeer 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()));
32218 tejbeer 311
 
32018 tejbeer 312
        return responseSender.ok(customer);
26857 amit.gupta 313
 
32018 tejbeer 314
    }
26652 amit.gupta 315
 
32018 tejbeer 316
    @RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
317
    public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
318
        if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
319
            return responseSender.ok(true);
320
        } else {
321
            return responseSender.ok(false);
322
        }
323
    }
27028 tejbeer 324
 
32018 tejbeer 325
    @RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
326
    public ResponseEntity<?> resetPassword(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
327
        customerService.changePassword(userModel.getMobile(), userModel.getPassword());
328
        return responseSender.ok(true);
329
    }
28339 tejbeer 330
 
32018 tejbeer 331
    @RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
332
    public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
333
        Customer customer = new Customer();
334
        customer.setPassword(userModel.getPassword());
335
        customer.setEmailId(userModel.getEmail());
336
        customer.setFirstName(userModel.getFirstName());
337
        customer.setLastName(userModel.getLastName());
338
        customer.setMobileNumber(userModel.getMobile());
339
        return responseSender.ok(customerService.addCustomer(customer));
340
    }
28339 tejbeer 341
 
32018 tejbeer 342
    @RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
343
    public ResponseEntity<?> confirmOrder(HttpServletRequest request, @RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
344
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
345
        Integer storeId = userInfo.getRetailerId();
346
        createPendingOrderRequest.setFofoId(storeId);
347
        List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
348
        List<CartItem> cartItems = new ArrayList<>();
349
        pendingOrderItems.stream().forEach(x -> {
350
            CartItem ci = new CartItem();
351
            ci.setItemId(x.getItemId());
352
            ci.setQuantity(x.getQuantity());
353
            ci.setSellingPrice(x.getSellingPrice());
354
            cartItems.add(ci);
355
        });
356
        CartResponse cr = this.validateCart(storeId, cartItems);
357
        if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
358
            return responseSender.badRequest("Invalid request");
359
        }
28377 tejbeer 360
 
32018 tejbeer 361
        Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
28377 tejbeer 362
 
32018 tejbeer 363
        PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
364
        if (offlineOrders.contains(pendingOrder.getPayMethod())) {
28391 tejbeer 365
 
32018 tejbeer 366
            Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
28400 tejbeer 367
 
32018 tejbeer 368
            CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
369
            Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
370
            String[] customerEmail = null;
371
            if (Utils.validateEmail(customer.getEmailId())) {
372
                customerEmail = new String[]{customer.getEmailId()};
373
            }
31203 tejbeer 374
 
32018 tejbeer 375
            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 376
 
32018 tejbeer 377
            List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
378
            if (authUserEmails != null) {
379
                authUserEmails = new ArrayList<>();
380
            }
381
            logger.info("authUserEmails {}", authUserEmails);
382
            authUserEmails.addAll(bccTo);
383
            StringBuffer itemBuffer = new StringBuffer();
384
            List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
385
            int totalItems = 0;
386
            String itemNoColor = null;
387
            float maxValue = 0;
388
            for (PendingOrderItem orderItem : orderItems) {
389
                if (maxValue < orderItem.getSellingPrice()) {
390
                    maxValue = orderItem.getSellingPrice();
391
                    itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
392
                }
393
                totalItems += orderItem.getQuantity();
394
            }
395
            if (totalItems > 1) {
396
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
397
                itemBuffer.append(" +").append(totalItems - 1).append(" items");
398
            } else {
399
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
400
            }
401
            String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(), itemBuffer.toString(), pendingOrder.getTotalAmount());
402
            otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28377 tejbeer 403
 
32018 tejbeer 404
            emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
28377 tejbeer 405
 
32018 tejbeer 406
            List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
27028 tejbeer 407
 
32018 tejbeer 408
            emailIds.addAll(
409
                    csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_MARKETING, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3, EscalationType.L4)).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
410
            emailIds.add("tarun.verma@smartdukaan.com");
411
            emailIds.add("devkinandan.lal@smartdukaan.com");
412
            emailIds.add("tejbeer.kaur@shop2020.in");
413
            List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
414
            List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
26630 amit.gupta 415
 
32018 tejbeer 416
            logger.info("userIds" + userIds);
417
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
418
            sendNotificationModel.setCampaignName("Online Order Alert");
419
            sendNotificationModel.setTitle("Online Order Update");
420
            sendNotificationModel.setMessage(String.format(
421
                    "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."));
422
            sendNotificationModel.setType("url");
423
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
424
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
425
            sendNotificationModel.setMessageType(MessageType.notification);
426
            int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
427
            sendNotificationModel.setUserIds(Arrays.asList(userId));
428
            notificationService.sendNotification(sendNotificationModel);
26857 amit.gupta 429
 
32018 tejbeer 430
            SendNotificationModel snm = new SendNotificationModel();
431
            snm.setCampaignName("Online Order Alert");
432
            snm.setTitle("Online Order Update");
433
            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."));
434
            snm.setType("url");
435
            snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
436
            snm.setExpiresat(LocalDateTime.now().plusDays(1));
437
            snm.setMessageType(MessageType.notification);
438
            snm.setUserIds(userIds);
439
            notificationService.sendNotification(snm);
26857 amit.gupta 440
 
32018 tejbeer 441
        }
442
        return responseSender.ok(returnMap);
26857 amit.gupta 443
 
32018 tejbeer 444
    }
28287 amit.gupta 445
 
32018 tejbeer 446
    @RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
447
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
448
    @ApiOperation(value = "Get brand list and count for category")
449
    public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
450
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
451
        Integer storeId = userInfo.getRetailerId();
452
        CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
26923 amit.gupta 453
 
32018 tejbeer 454
        return responseSender.ok(customRetailer.getAddress());
28566 tejbeer 455
 
32018 tejbeer 456
    }
28566 tejbeer 457
 
32018 tejbeer 458
    @RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
459
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
460
    @ApiOperation(value = "Get brand list and count for category")
461
    public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
462
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
463
        int fofoId = ProfitMandiConstants.DEFAULT_STORE;
464
        if (pincodePartners.size() > 0) {
465
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
466
            List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
467
            if (fofoStores.size() > 0) {
468
                fofoId = fofoStores.get(0).getId();
469
            }
28566 tejbeer 470
 
32018 tejbeer 471
        }
472
        return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
473
    }
28566 tejbeer 474
 
32018 tejbeer 475
    @RequestMapping(value = "/store/addresses", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
476
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
477
    @ApiOperation(value = "Get brand list and count for category")
478
    public ResponseEntity<?> getStoresByPincod(HttpServletRequest request, @RequestParam String pincode, @RequestParam(name = "fofoCode", defaultValue = "", required = false) String fofoCode) throws Exception {
28566 tejbeer 479
 
32018 tejbeer 480
        List<CustomRetailer> customerRetailers = new ArrayList<>();
28566 tejbeer 481
 
32018 tejbeer 482
        logger.info("fofoCode" + fofoCode);
30426 tejbeer 483
 
32018 tejbeer 484
        if (fofoCode != null) {
485
            FofoStore fs = fofoStoreRepository.selectByStoreCode(fofoCode.toUpperCase());
486
            PincodePartner pp = pincodePartnerRepository.selectPartnerByPincode(pincode, fs.getId());
487
            if (pp != null) {
488
                return responseSender.ok(customerRetailers.add(retailerService.getFofoRetailer(pp.getFofoId())));
489
            } else {
30426 tejbeer 490
 
32018 tejbeer 491
                List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
492
                if (pincodePartners.size() > 0) {
28566 tejbeer 493
 
32018 tejbeer 494
                    List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
495
                    List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 496
 
32018 tejbeer 497
                    Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 498
 
32018 tejbeer 499
                    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 500
 
32018 tejbeer 501
                    customerRetailers.addAll(customerRetailerMap.values());
30426 tejbeer 502
 
32018 tejbeer 503
                }
504
                return responseSender.ok(customerRetailers);
30426 tejbeer 505
 
32018 tejbeer 506
            }
507
        } else {
28566 tejbeer 508
 
32018 tejbeer 509
            List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
510
            if (pincodePartners.size() > 0) {
511
                List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
512
                List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 513
 
32018 tejbeer 514
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 515
 
32018 tejbeer 516
                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 517
 
32018 tejbeer 518
                customerRetailers.addAll(customerRetailerMap.values());
519
            }
28298 tejbeer 520
 
32018 tejbeer 521
            return responseSender.ok(customerRetailers);
30426 tejbeer 522
 
32018 tejbeer 523
        }
30426 tejbeer 524
 
32018 tejbeer 525
    }
30426 tejbeer 526
 
32018 tejbeer 527
    @RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
528
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
529
    @ApiOperation(value = "Get brand list and count for category")
530
    public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
531
        List<CustomRetailer> customerRetailers = new ArrayList<>();
532
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28298 tejbeer 533
 
32018 tejbeer 534
        if (!pincodePartners.isEmpty()) {
535
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
536
            List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28298 tejbeer 537
 
32018 tejbeer 538
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 539
 
32018 tejbeer 540
            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 541
 
32018 tejbeer 542
            customerRetailers.addAll(customerRetailerMap.values());
543
        }
27049 tejbeer 544
 
32018 tejbeer 545
        logger.info("customerRetailers" + customerRetailers);
546
        return responseSender.ok(customerRetailers);
547
    }
26855 tejbeer 548
 
32018 tejbeer 549
    @RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
550
    public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
551
        List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
552
        List<Integer> catalogIds = new ArrayList<>();
553
        List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
26855 tejbeer 554
 
32018 tejbeer 555
        if (!pendingOrders.isEmpty()) {
556
            for (PendingOrder po : pendingOrders) {
557
                List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
558
                for (PendingOrderItem pendingOrderItem : pois) {
559
                    Item item = itemRepository.selectById(pendingOrderItem.getItemId());
560
                    pendingOrderItem.setItemName(item.getItemDescription());
561
                    catalogIds.add(item.getCatalogItemId());
562
                }
26855 tejbeer 563
 
32018 tejbeer 564
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
26855 tejbeer 565
 
32018 tejbeer 566
                for (PendingOrderItem poi : pois) {
28566 tejbeer 567
 
32018 tejbeer 568
                    CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
28566 tejbeer 569
 
32018 tejbeer 570
                    Item item = itemRepository.selectById(poi.getItemId());
571
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
572
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
573
                    customerOrderDetail.setBrand(item.getBrand());
574
                    customerOrderDetail.setColor(item.getColor());
575
                    customerOrderDetail.setPendingOrderItemId(poi.getId());
576
                    customerOrderDetail.setId(poi.getOrderId());
577
                    customerOrderDetail.setItemId(poi.getItemId());
578
                    customerOrderDetail.setModelName(item.getModelName());
579
                    customerOrderDetail.setModelNumber(item.getModelNumber());
580
                    customerOrderDetail.setQuantity(poi.getQuantity());
581
                    customerOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
582
                    customerOrderDetail.setStatus(poi.getStatus());
583
                    customerOrderDetail.setTotalPrice(poi.getSellingPrice());
584
                    customerOrderDetail.setPayMethod(po.getPayMethod());
585
                    customerOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
586
                    customerOrderDetails.add(customerOrderDetail);
587
                }
588
            }
589
        }
28566 tejbeer 590
 
32018 tejbeer 591
        return responseSender.ok(customerOrderDetails);
592
    }
28566 tejbeer 593
 
32018 tejbeer 594
    @RequestMapping(value = "/store/invoiceOrder", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
595
    public ResponseEntity<?> getOrderInvoiceDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
596
        List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
597
        List<Integer> catalogIds = new ArrayList<>();
598
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectOrderByCustomerId(id, offset, limit);
28566 tejbeer 599
 
32018 tejbeer 600
        if (!fofoOrders.isEmpty()) {
601
            for (FofoOrder fo : fofoOrders) {
602
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fo.getId());
603
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
604
                    Item item = itemRepository.selectById(fofoOrderItem.getItemId());
605
                    fofoOrderItem.setItemName(item.getItemDescription());
606
                    catalogIds.add(item.getCatalogItemId());
607
                }
28566 tejbeer 608
 
32018 tejbeer 609
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
610
                for (FofoOrderItem foi : fofoOrderItems) {
28566 tejbeer 611
 
32018 tejbeer 612
                    CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
28566 tejbeer 613
 
32018 tejbeer 614
                    Item item = itemRepository.selectById(foi.getItemId());
615
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
616
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
617
                    customerOrderDetail.setBrand(item.getBrand());
618
                    customerOrderDetail.setColor(item.getColor());
619
                    customerOrderDetail.setFofoOrderItemId(foi.getId());
620
                    customerOrderDetail.setFofoOrderId(foi.getOrderId());
621
                    customerOrderDetail.setItemId(foi.getItemId());
622
                    customerOrderDetail.setModelName(item.getModelName());
623
                    customerOrderDetail.setModelNumber(item.getModelNumber());
624
                    customerOrderDetail.setQuantity(foi.getQuantity());
625
                    customerOrderDetail.setTotalPrice(foi.getSellingPrice());
626
                    customerOrderDetail.setCreatedTimeStamp(foi.getCreateTimestamp());
627
                    customerOrderDetail.setInvoiceNumber(fo.getInvoiceNumber());
628
                    customerOrderDetail.setCancelledTimestamp(fo.getCancelledTimestamp());
629
                    customerOrderDetails.add(customerOrderDetail);
630
                }
631
            }
28566 tejbeer 632
 
32018 tejbeer 633
        }
634
        return responseSender.ok(customerOrderDetails);
635
    }
28566 tejbeer 636
 
32018 tejbeer 637
    @RequestMapping(value = "/store/generateInvoice", method = RequestMethod.GET)
638
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
639
        InvoicePdfModel pdfModel = null;
640
        FofoOrder fo = fofoOrderRepository.selectByOrderId(orderId);
641
        pdfModel = orderService.getInvoicePdfModel(fo.getFofoId(), orderId);
642
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
643
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
644
        try {
645
            byteArrayOutputStream.close();
646
        } catch (IOException e) {
647
            // TODO Auto-generated catch block
648
            e.printStackTrace();
649
        }
650
        final HttpHeaders headers = new HttpHeaders();
651
        headers.setContentType(MediaType.APPLICATION_PDF);
652
        // headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
26745 amit.gupta 653
 
32018 tejbeer 654
        headers.setContentType(MediaType.parseMediaType("application/pdf"));
655
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
656
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
657
        headers.add("Pragma", "no-cache");
658
        headers.add("Expires", "0");
28287 amit.gupta 659
 
32018 tejbeer 660
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
661
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
662
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
663
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
664
        // return responseSender.ok(new
665
        // ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(),
666
        // headers,HttpStatus.OK));
667
        /*
668
         * ResponseEntity<byte[]> response = new
669
         * ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(), headers,
670
         * HttpStatus.OK); return response;
671
         */
26923 amit.gupta 672
 
32018 tejbeer 673
    }
26607 amit.gupta 674
 
32018 tejbeer 675
    @RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
676
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
677
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
678
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32544 amit.gupta 679
        Iterator<WebListing> webListingIterator = webListings.iterator();
680
        while (webListingIterator.hasNext()) {
681
            WebListing webListing = webListingIterator.next();
682
            List<FofoCatalogResponse> catalogResponses = getDealResponses(userInfo, webListing);
683
            boolean isAvailable = catalogResponses.stream().anyMatch(x->x.getItems().stream().anyMatch(y->y.getAvailability()>0));
684
            if(!isAvailable) {
685
                webListings.remove(webListing);
686
            }
32018 tejbeer 687
        }
32544 amit.gupta 688
 
32018 tejbeer 689
        return responseSender.ok(webListings);
690
    }
26607 amit.gupta 691
 
32018 tejbeer 692
    private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing) throws ProfitMandiBusinessException {
693
        List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
694
        if (webProducts.size() == 0) {
695
            return new ArrayList<>();
696
        }
697
        RestClient rc = new RestClient();
698
        Map<String, String> params = new HashMap<>();
699
        List<String> mandatoryQ = new ArrayList<>();
700
        mandatoryQ.add(String.format(
701
                "+{!parent which=\"catalogId_i:" + StringUtils.join(webProducts, " ") + "\"} tagId_i:(%s)", StringUtils.join(TAG_IDS, " ")));
702
        params.put("q", StringUtils.join(mandatoryQ, " "));
703
        params.put("fl", "*, [child parentFilter=id:catalog*]");
704
        // params.put("sort", "create_s desc");
705
        params.put("start", String.valueOf(0));
706
        params.put("rows", String.valueOf(100));
707
        params.put("wt", "json");
708
        String response = null;
709
        try {
710
            response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
711
        } catch (HttpHostConnectException e) {
712
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
713
        }
714
        JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
715
        JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
716
        List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
717
        return dealResponse;
718
    }
26607 amit.gupta 719
 
32018 tejbeer 720
    @RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
721
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
722
    @ApiOperation(value = "Get brand list and count for category")
723
    public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest) throws Exception {
724
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
725
        Integer storeId = userInfo.getRetailerId();
726
        ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()), "Success", "Items added to cart successfully");
727
        return responseSender.ok(vc);
728
    }
26607 amit.gupta 729
 
32018 tejbeer 730
    // Validate Cart for B2C Customers
731
    private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
732
        cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
733
        List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
734
        Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId, itemIds);
735
        CartResponse cartResponse = new CartResponse();
736
        List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
737
        cartResponse.setCartItems(cartItemResponseModels);
738
        Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
739
        logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 740
 
32018 tejbeer 741
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26652 amit.gupta 742
 
32018 tejbeer 743
        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 744
 
32018 tejbeer 745
        List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId()).collect(Collectors.toList());
26607 amit.gupta 746
 
32018 tejbeer 747
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27030 amit.gupta 748
 
32018 tejbeer 749
        // cartResponse.getCartItems()
750
        int cartMessageChanged = 0;
751
        int cartMessageOOS = 0;
752
        int totalAmount = 0;
753
        int totalQty = 0;
754
        for (CartItem cartItem : cartItems) {
755
            Item item = itemsMap.get(cartItem.getItemId());
756
            TagListing tagListing = tagListingMap.get(cartItem.getItemId());
757
            Float cashback = schemeService.getCatalogSchemeCashBack().get(itemsMap.get(cartItem.getItemId()).getCatalogItemId());
758
            cashback = cashback == null ? 0 : cashback;
759
            float itemSellingPrice = tagListing.getMop() - cashback;
760
            CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
761
            cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
762
            if (itemSellingPrice != cartItem.getSellingPrice()) {
763
                cartItemResponseModel.setSellingPrice(itemSellingPrice);
764
                cartMessageChanged++;
765
            }
766
            int estimate = -2;
767
            LocalDateTime promiseDeliveryTime = LocalDateTime.now();
768
            int qtyRequired = (int) cartItem.getQuantity();
769
            AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
770
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
771
            if (availabilityModel.getStoreAvailability() >= qtyRequired) {
772
                estimate = 0;
773
            } else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
774
                estimate = 2;
775
            } else if (availabilityModel.getStoreAvailability() > 0) {
776
                estimate = 0;
777
                qtyRequired = availabilityModel.getStoreAvailability();
778
                cartMessageChanged++;
779
            } else if (availabilityModel.getWarehouseAvailability() > 0) {
780
                qtyRequired = availabilityModel.getWarehouseAvailability();
781
                estimate = 2;
782
                cartMessageChanged++;
783
            } else {
784
                qtyRequired = 0;
785
                cartMessageChanged++;
786
            }
787
            cartItemResponseModel.setQuantity(qtyRequired);
788
            if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
789
                estimate = estimate + 1;
790
                promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
791
            }
792
            totalQty += qtyRequired;
793
            totalAmount += qtyRequired * itemSellingPrice;
794
            cartItemResponseModel.setEstimate(estimate);
795
            cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
796
            cartItemResponseModel.setItemId(cartItem.getItemId());
797
            cartItemResponseModel.setMinBuyQuantity(1);
798
            cartItemResponseModel.setQuantity(qtyRequired);
799
            cartItemResponseModel.setQuantityStep(1);
800
            cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
801
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
802
            cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
803
            cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
804
            cartItemResponseModel.setColor(item.getColor());
805
            cartItemResponseModels.add(cartItemResponseModel);
806
        }
807
        cartResponse.setCartItems(cartItemResponseModels);
808
        cartResponse.setCartMessageChanged(cartMessageChanged);
809
        cartResponse.setCartMessageOOS(cartMessageOOS);
810
        int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
811
        cartResponse.setMaxEstimate(maxEstimate);
812
        cartResponse.setTotalAmount(totalAmount);
813
        cartResponse.setTotalQty(totalQty);
26607 amit.gupta 814
 
32018 tejbeer 815
        return cartResponse;
26923 amit.gupta 816
 
32018 tejbeer 817
    }
27069 tejbeer 818
 
32018 tejbeer 819
    @RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
820
    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 {
821
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
822
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
823
        FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
824
        sort = "w" + fs.getWarehouseId() + "_i desc";
825
        dealResponse = this.getCatalogResponse(
826
                commonSolrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false), false, userInfo.getRetailerId());
827
        return responseSender.ok(dealResponse);
828
    }
26923 amit.gupta 829
 
32018 tejbeer 830
    private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws ProfitMandiBusinessException {
831
        Map<Integer, Integer> ourItemAvailabilityMap = null;
832
        Map<Integer, Integer> partnerStockAvailabilityMap = null;
833
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
834
        List<Integer> tagIds = Arrays.asList(4);
835
        if (docs.length() > 0) {
836
            HashSet<Integer> itemsSet = new HashSet<>();
837
            for (int i = 0; i < docs.length(); i++) {
838
                JSONObject doc = docs.getJSONObject(i);
839
                if (doc.has("_childDocuments_")) {
840
                    for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
841
                        JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
842
                        int itemId = childItem.getInt("itemId_i");
843
                        itemsSet.add(itemId);
844
                    }
845
                }
846
            }
847
            if (itemsSet.size() == 0) {
848
                return dealResponse;
849
            }
850
            if (fofoId > 0) {
851
                partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
852
            }
853
            ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
854
        }
26833 amit.gupta 855
 
32018 tejbeer 856
        for (int i = 0; i < docs.length(); i++) {
857
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
858
            JSONObject doc = docs.getJSONObject(i);
859
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
860
            ffdr.setCatalogId(doc.getInt("catalogId_i"));
861
            ffdr.setImageUrl(doc.getString("imageUrl_s"));
862
            ffdr.setTitle(doc.getString("title_s"));
863
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
864
            if (webOffers != null && webOffers.size() > 0) {
865
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
866
            }
867
            try {
868
                ffdr.setFeature(doc.getString("feature_s"));
869
            } catch (Exception e) {
870
                ffdr.setFeature(null);
871
            }
872
            ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
873
            if (doc.has("_childDocuments_")) {
874
                for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
875
                    JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
876
                    int itemId = childItem.getInt("itemId_i");
877
                    float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
878
                    if (fofoAvailabilityInfoMap.containsKey(itemId)) {
879
                        if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
880
                            fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
881
                            fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
882
                        }
883
                    } else {
884
                        FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
885
                        fdi.setSellingPrice(sellingPrice);
886
                        fdi.setMrp(childItem.getDouble("mrp_f"));
887
                        fdi.setMop((float) childItem.getDouble("mop_f"));
888
                        fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
889
                        fdi.setTagId(childItem.getInt("tagId_i"));
890
                        fdi.setItem_id(itemId);
891
                        Float cashBack = schemeService.getCatalogSchemeCashBack().get(ffdr.getCatalogId());
892
                        cashBack = cashBack == null ? 0 : cashBack;
893
                        // TODO:Dont commit
894
                        // fdi.setCashback(Math.min(100, fdi.getMop()));
895
                        fdi.setCashback(cashBack);
896
                        fdi.setMinBuyQuantity(1);
897
                        int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0 : partnerStockAvailabilityMap.get(itemId);
898
                        int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0 : Math.max(0, ourItemAvailabilityMap.get(itemId));
899
                        fdi.setActive(partnerAvailability > 0);
900
                        // fdi.setActive(true);
901
                        fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
902
                        fdi.setQuantityStep(1);
903
                        fdi.setMaxQuantity(fdi.getAvailability());
904
                        fofoAvailabilityInfoMap.put(itemId, fdi);
905
                    }
906
                }
907
            }
908
            if (fofoAvailabilityInfoMap.values().size() > 0) {
909
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder()).thenComparingInt(y -> -y.getAvailability())).collect(Collectors.toList()));
910
                dealResponse.add(ffdr);
911
            }
912
        }
913
        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());
914
    }
26857 amit.gupta 915
 
32018 tejbeer 916
    @GetMapping(value = "store/order-status/{pendingOrderId}")
917
    public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId) throws Exception {
918
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
919
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
920
        List<Integer> catalogIds = new ArrayList<>();
921
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
922
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
923
            pendingOrderItem.setItemName(item.getItemDescription());
924
            catalogIds.add(item.getCatalogItemId());
925
        }
926
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
927
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
928
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
929
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
930
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
931
        }
932
        pendingOrder.setPendingOrderItems(pendingOrderItems);
27045 tejbeer 933
 
32018 tejbeer 934
        return responseSender.ok(pendingOrder);
935
    }
28345 tejbeer 936
 
32018 tejbeer 937
    @RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
938
    public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
939
        return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
940
    }
26861 tejbeer 941
 
32018 tejbeer 942
    @RequestMapping(value = "/store/address", method = RequestMethod.POST)
943
    public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress) throws Throwable {
944
        customerAddressRepository.persist(customerAddress);
945
        return responseSender.ok(customerAddress);
946
    }
27045 tejbeer 947
 
32018 tejbeer 948
    @RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
949
    public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
950
        CustomerAddress cust = customerAddressRepository.selectById(id);
951
        cust.setActive(false);
952
        return responseSender.ok(cust);
953
    }
27048 tejbeer 954
 
32018 tejbeer 955
    @RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
956
    public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer) throws Throwable {
957
        Customer cust = customerRepository.selectById(customer.getId());
958
        cust.setGender(customer.getGender());
959
        cust.setProfileImageId(customer.getProfileImageId());
960
        cust.setDob(customer.getDob());
961
        return responseSender.ok(cust);
962
    }
27048 tejbeer 963
 
32018 tejbeer 964
    @RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
965
    public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state, @PathVariable String city, @PathVariable String storeCode) throws Throwable {
966
        logger.info("Store code {}", storeCode);
967
        Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
968
        logger.info("retailer id {}", map.get(storeCode));
969
        String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
970
        String html = partnerIndexService.getPartnerIndexHtml();
971
        logger.info("html {}", html);
972
        html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan", String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
973
        response.getWriter().write(html);
974
    }
27048 tejbeer 975
 
32018 tejbeer 976
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
977
    public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id,
28339 tejbeer 978
 
32018 tejbeer 979
                                                    @RequestParam String statusDescription, @RequestParam String reason) throws Exception {
28339 tejbeer 980
 
32018 tejbeer 981
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
982
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
983
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
984
        if (pendingOrderItem.getBilledTimestamp() == null) {
985
            pendingOrderItem.setStatus(OrderStatus.CANCELLED);
986
            pendingOrderItem.setRemark(reason);
987
            pendingOrderItem.setStatusDescription("cancel by self");
988
            pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
989
            List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream().map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 990
 
32018 tejbeer 991
            if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING) && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED) && !status.contains(OrderStatus.CLAIMED)) {
992
                pendingOrder.setStatus(OrderStatus.CLOSED);
993
            }
28339 tejbeer 994
 
32018 tejbeer 995
            pendingOrderItemRepository.persist(pendingOrderItem);
996
            String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
997
            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 998
 
32018 tejbeer 999
            List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1000
 
32018 tejbeer 1001
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1002
            pendingOrderItem.setItemName(item.getItemDescription());
1003
            catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1004
 
32018 tejbeer 1005
            Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1006
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1007
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1008
            pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1009
            CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28355 tejbeer 1010
 
32018 tejbeer 1011
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1012
 
32018 tejbeer 1013
            Map<String, Object> emailModel = new HashMap<>();
1014
            emailModel.put("customer", customerAddress);
1015
            emailModel.put("pendingOrder", pendingOrder);
1016
            emailModel.put("date", dateTimeFormatter);
27048 tejbeer 1017
 
32018 tejbeer 1018
            String[] customerEmail = null;
1019
            if (customer.getEmailId() != null) {
1020
                customerEmail = new String[]{customer.getEmailId()};
27048 tejbeer 1021
 
32018 tejbeer 1022
                List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
29515 tejbeer 1023
 
32018 tejbeer 1024
                emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
29515 tejbeer 1025
 
32018 tejbeer 1026
            }
1027
        }
29515 tejbeer 1028
 
32018 tejbeer 1029
        return responseSender.ok(true);
29515 tejbeer 1030
 
32018 tejbeer 1031
    }
31444 tejbeer 1032
 
32018 tejbeer 1033
    @RequestMapping(value = "/store/checkEligibilityStoreOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1034
    public ResponseEntity<?> checkEligibilityStoreOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1035
 
32018 tejbeer 1036
        boolean eligibility = false;
29515 tejbeer 1037
 
32218 tejbeer 1038
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 22, 0, 0);
29515 tejbeer 1039
 
32018 tejbeer 1040
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, startDate.toLocalDate());
29515 tejbeer 1041
 
32018 tejbeer 1042
        if (!scratchOffers.isEmpty()) {
1043
            eligibility = true;
31457 tejbeer 1044
 
32018 tejbeer 1045
        } else {
1046
            eligibility = false;
1047
        }
31457 tejbeer 1048
 
32018 tejbeer 1049
        return responseSender.ok(eligibility);
1050
    }
29515 tejbeer 1051
 
32018 tejbeer 1052
    @RequestMapping(value = "/store/ScratchOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1053
    public ResponseEntity<?> scratchOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1054
 
32218 tejbeer 1055
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 22, 0, 0);
29515 tejbeer 1056
 
32018 tejbeer 1057
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, startDate.toLocalDate());
29515 tejbeer 1058
 
32218 tejbeer 1059
 
1060
        logger.info("scratchOffers {}", scratchOffers);
32018 tejbeer 1061
        // List<ScratchOffer> scratchOffers =
1062
        // scratchOfferRepository.selectBycCustomerId(id);
1063
        for (ScratchOffer so : scratchOffers) {
1064
            LocalDateTime endDate = LocalDateTime.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 27, 21, 00);
29515 tejbeer 1065
 
32218 tejbeer 1066
 
32018 tejbeer 1067
            if (LocalDateTime.now().isAfter(so.getUnlockedAt())) {
1068
                so.setUnlocked(true);
1069
            } else {
1070
                so.setUnlocked(false);
1071
            }
1072
        }
29515 tejbeer 1073
 
32018 tejbeer 1074
        return responseSender.ok(scratchOffers);
1075
    }
1076
 
1077
    @RequestMapping(value = "/store/ScratchedOffer", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1078
    public ResponseEntity<?> scratchedOffer(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
1079
 
1080
        ScratchOffer scratchOffer = scratchOfferRepository.selectById(id);
1081
        scratchOffer.setScratched(true);
1082
        scratchOffer.setScracthedAt(LocalDateTime.now());
1083
 
1084
        return responseSender.ok(true);
1085
    }
1086
 
26607 amit.gupta 1087
}