Subversion Repositories SmartDukaan

Rev

Rev 36932 | 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.*;
34917 vikas 10
import com.spice.profitmandi.dao.entity.affiliate.AffiliateEarnings;
34902 vikas 11
import com.spice.profitmandi.dao.entity.affiliate.AffiliateProduct;
34444 vikas.jang 12
import com.spice.profitmandi.dao.entity.catalog.LiquidationDetail;
36428 aman 13
import com.spice.profitmandi.dao.entity.catalog.SuperCatalogMapping;
26607 amit.gupta 14
import com.spice.profitmandi.common.solr.SolrService;
28304 amit.gupta 15
import com.spice.profitmandi.common.util.FormattingUtils;
28566 tejbeer 16
import com.spice.profitmandi.common.util.PdfUtils;
28405 amit.gupta 17
import com.spice.profitmandi.common.util.Utils;
26607 amit.gupta 18
import com.spice.profitmandi.common.web.client.RestClient;
19
import com.spice.profitmandi.common.web.util.ResponseSender;
34242 tejus.loha 20
import com.spice.profitmandi.dao.entity.WebEntity.NavBar;
34444 vikas.jang 21
import com.spice.profitmandi.dao.entity.catalog.Bid;
26607 amit.gupta 22
import com.spice.profitmandi.dao.entity.catalog.Item;
34444 vikas.jang 23
import com.spice.profitmandi.dao.entity.catalog.Liquidation;
26607 amit.gupta 24
import com.spice.profitmandi.dao.entity.catalog.TagListing;
33436 ranu 25
import com.spice.profitmandi.dao.entity.dtr.*;
30123 amit.gupta 26
import com.spice.profitmandi.dao.entity.fofo.*;
33399 ranu 27
import com.spice.profitmandi.dao.entity.inventory.State;
31203 tejbeer 28
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26630 amit.gupta 29
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
31573 tejbeer 30
import com.spice.profitmandi.dao.enumuration.dtr.WebListingSource;
27045 tejbeer 31
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
30123 amit.gupta 32
import com.spice.profitmandi.dao.model.*;
33436 ranu 33
import com.spice.profitmandi.dao.model.pendingOrder.PendingOrderDetail;
34902 vikas 34
import com.spice.profitmandi.dao.repository.affiliateLink.AffiliateLinkRepository;
34444 vikas.jang 35
import com.spice.profitmandi.dao.repository.catalog.BidRepository;
26607 amit.gupta 36
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
34444 vikas.jang 37
import com.spice.profitmandi.dao.repository.catalog.LiquidationRepository;
36428 aman 38
import com.spice.profitmandi.dao.repository.catalog.SuperCatalogMappingRepository;
26607 amit.gupta 39
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
28290 tejbeer 40
import com.spice.profitmandi.dao.repository.cs.CsService;
30123 amit.gupta 41
import com.spice.profitmandi.dao.repository.dtr.*;
42
import com.spice.profitmandi.dao.repository.fofo.*;
26607 amit.gupta 43
import com.spice.profitmandi.dao.repository.inventory.ItemAvailabilityCacheRepository;
33399 ranu 44
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
28582 amit.gupta 45
import com.spice.profitmandi.dao.repository.user.UserRepository;
34248 aman.kumar 46
import com.spice.profitmandi.dao.repository.webRepository.NavBarRepository;
34917 vikas 47
import com.spice.profitmandi.dao.service.AffiliateService;
34494 vikas.jang 48
import com.spice.profitmandi.dao.service.BidService;
34882 aman 49
import com.spice.profitmandi.dao.service.OTPResponse;
26784 amit.gupta 50
import com.spice.profitmandi.service.CustomerService;
28377 tejbeer 51
import com.spice.profitmandi.service.EmailService;
35243 aman 52
import com.spice.profitmandi.service.FofoUser;
28377 tejbeer 53
import com.spice.profitmandi.service.NotificationService;
26607 amit.gupta 54
import com.spice.profitmandi.service.authentication.RoleManager;
34444 vikas.jang 55
import com.spice.profitmandi.service.catalog.BiddingModel;
33399 ranu 56
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
57
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
36428 aman 58
import com.spice.profitmandi.service.catalog.SuperCatalogModel;
30123 amit.gupta 59
import com.spice.profitmandi.service.inventory.*;
28566 tejbeer 60
import com.spice.profitmandi.service.order.OrderService;
26683 amit.gupta 61
import com.spice.profitmandi.service.scheme.SchemeService;
26651 amit.gupta 62
import com.spice.profitmandi.service.user.RetailerService;
33514 tejus.loha 63
import com.spice.profitmandi.dao.service.OtpProcessor;
34654 vikas.jang 64
import com.spice.profitmandi.service.wallet.WalletService;
26607 amit.gupta 65
import com.spice.profitmandi.web.res.DealBrands;
66
import com.spice.profitmandi.web.res.DealObjectResponse;
67
import com.spice.profitmandi.web.res.DealsResponse;
68
import com.spice.profitmandi.web.res.ValidateCartResponse;
28322 amit.gupta 69
import com.spice.profitmandi.web.services.PartnerIndexService;
36428 aman 70
import com.spice.profitmandi.service.tag.ItemTagModel;
71
import in.shop2020.model.v1.catalog.status;
34654 vikas.jang 72
import in.shop2020.model.v1.order.WalletReferenceType;
26607 amit.gupta 73
import io.swagger.annotations.ApiImplicitParam;
74
import io.swagger.annotations.ApiImplicitParams;
75
import io.swagger.annotations.ApiOperation;
30123 amit.gupta 76
import org.apache.commons.lang3.StringUtils;
77
import org.apache.http.conn.HttpHostConnectException;
78
import org.apache.logging.log4j.LogManager;
79
import org.apache.logging.log4j.Logger;
80
import org.json.JSONArray;
81
import org.json.JSONObject;
82
import org.springframework.beans.factory.annotation.Autowired;
83
import org.springframework.beans.factory.annotation.Value;
35079 vikas 84
import org.springframework.cache.annotation.Cacheable;
30123 amit.gupta 85
import org.springframework.http.HttpHeaders;
86
import org.springframework.http.HttpStatus;
87
import org.springframework.http.MediaType;
88
import org.springframework.http.ResponseEntity;
89
import org.springframework.stereotype.Controller;
90
import org.springframework.transaction.annotation.Transactional;
33399 ranu 91
import org.springframework.ui.Model;
30123 amit.gupta 92
import org.springframework.web.bind.annotation.*;
26607 amit.gupta 93
 
30123 amit.gupta 94
import javax.servlet.http.HttpServletRequest;
95
import javax.servlet.http.HttpServletResponse;
96
import java.io.ByteArrayOutputStream;
97
import java.io.IOException;
35243 aman 98
import java.time.LocalDate;
30123 amit.gupta 99
import java.time.LocalDateTime;
100
import java.time.LocalTime;
35243 aman 101
import java.time.YearMonth;
30123 amit.gupta 102
import java.time.format.DateTimeFormatter;
103
import java.util.*;
104
import java.util.stream.Collectors;
105
 
26607 amit.gupta 106
@Controller
107
@Transactional(rollbackFor = Throwable.class)
108
public class StoreController {
109
 
32018 tejbeer 110
    private static final Logger logger = LogManager.getLogger(StoreController.class);
26630 amit.gupta 111
 
32018 tejbeer 112
    private static final LocalTime CUTOFF_TIME = LocalTime.of(15, 0);
26745 amit.gupta 113
 
32018 tejbeer 114
    private static final List<Integer> TAG_IDS = Arrays.asList(4);
26745 amit.gupta 115
 
32018 tejbeer 116
    @Autowired
117
    CustomerAddressRepository customerAddressRepository;
28392 tejbeer 118
 
32018 tejbeer 119
    @Autowired
120
    WebOfferRepository webOfferRepository;
26607 amit.gupta 121
 
32018 tejbeer 122
    @Value("${new.solr.url}")
123
    private String solrUrl;
28345 tejbeer 124
 
32018 tejbeer 125
    @Autowired
126
    private PartnerIndexService partnerIndexService;
28345 tejbeer 127
 
32018 tejbeer 128
    @Autowired
129
    InventoryService inventoryService;
27045 tejbeer 130
 
32018 tejbeer 131
    @Autowired
132
    UserAccountRepository userAccountRepository;
26923 amit.gupta 133
 
32018 tejbeer 134
    @Value("${python.api.host}")
135
    private String host;
26833 amit.gupta 136
 
32018 tejbeer 137
    @Autowired
138
    CustomerService customerService;
26607 amit.gupta 139
 
32018 tejbeer 140
    @Value("${python.api.port}")
141
    private int port;
26923 amit.gupta 142
 
32018 tejbeer 143
    @Autowired
144
    private SaholicInventoryService saholicInventoryService;
26607 amit.gupta 145
 
32018 tejbeer 146
    @Autowired
147
    private PincodePartnerRepository pincodePartnerRepository;
26715 amit.gupta 148
 
32018 tejbeer 149
    @Autowired
150
    private FofoStoreRepository fofoStoreRepository;
26745 amit.gupta 151
 
32018 tejbeer 152
    @Autowired
153
    private RetailerService retailerService;
26861 tejbeer 154
 
32018 tejbeer 155
    @Autowired
156
    private PendingOrderRepository pendingOrderRepository;
26861 tejbeer 157
 
32018 tejbeer 158
    @Autowired
159
    private PendingOrderItemRepository pendingOrderItemRepository;
26652 amit.gupta 160
 
32018 tejbeer 161
    @Autowired
162
    private PendingOrderService pendingOrderService;
26648 amit.gupta 163
 
32018 tejbeer 164
    @Autowired
165
    private CustomerRepository customerRepository;
26774 amit.gupta 166
 
32018 tejbeer 167
    @Autowired
168
    private SolrService commonSolrService;
26607 amit.gupta 169
 
32018 tejbeer 170
    @Autowired
171
    private OtpProcessor otpProcessor;
26630 amit.gupta 172
 
32018 tejbeer 173
    @Autowired
174
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
26607 amit.gupta 175
 
32018 tejbeer 176
    @Autowired
177
    private ResponseSender<?> responseSender;
26607 amit.gupta 178
 
32018 tejbeer 179
    @Autowired
180
    private TagListingRepository tagListingRepository;
26607 amit.gupta 181
 
32018 tejbeer 182
    @Autowired
183
    private ItemRepository itemRepository;
26701 amit.gupta 184
 
32018 tejbeer 185
    @Autowired
186
    private SchemeService schemeService;
26607 amit.gupta 187
 
32018 tejbeer 188
    @Autowired
36428 aman 189
    private SuperCatalogMappingRepository superCatalogMappingRepository;
190
 
191
    @Autowired
192
    private Mongo mongoClient;
193
 
194
    @Autowired
32018 tejbeer 195
    private UserRepository userRepository;
28566 tejbeer 196
 
32018 tejbeer 197
    @Autowired
198
    private ItemAvailabilityCacheRepository itemAvailabilityCacheRepository;
26607 amit.gupta 199
 
32018 tejbeer 200
    @Autowired
201
    private WebListingRepository webListingRepository;
26745 amit.gupta 202
 
32018 tejbeer 203
    @Autowired
204
    private WebProductListingRepository webProductListingRepository;
26745 amit.gupta 205
 
32018 tejbeer 206
    @Autowired
207
    private RoleManager roleManagerService;
26607 amit.gupta 208
 
32018 tejbeer 209
    @Autowired
210
    EmailService emailService;
27028 tejbeer 211
 
32018 tejbeer 212
    @Autowired
213
    CsService csService;
28339 tejbeer 214
 
32018 tejbeer 215
    @Autowired
216
    private NotificationService notificationService;
28377 tejbeer 217
 
32018 tejbeer 218
    @Autowired
219
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
28377 tejbeer 220
 
32018 tejbeer 221
    @Autowired
222
    private FofoOrderRepository fofoOrderRepository;
28566 tejbeer 223
 
32018 tejbeer 224
    @Autowired
225
    private FofoOrderItemRepository fofoOrderItemRepository;
28566 tejbeer 226
 
32018 tejbeer 227
    @Autowired
228
    private OrderService orderService;
29515 tejbeer 229
 
32018 tejbeer 230
    @Autowired
33436 ranu 231
    InsurancePolicyRepository insurancePolicyRepository;
232
 
233
    @Autowired
34444 vikas.jang 234
    LiquidationRepository liquidationRepository;
235
 
236
    @Autowired
33436 ranu 237
    PendingOrderPlanRepository pendingOrderPlanRepository;
238
 
239
    @Autowired
32018 tejbeer 240
    private ScratchOfferRepository scratchOfferRepository;
241
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
28339 tejbeer 242
 
34242 tejus.loha 243
    @Autowired
244
    NavBarRepository navBarRepository;
245
 
34444 vikas.jang 246
    @Autowired
247
    BidRepository bidRepository;
248
 
34494 vikas.jang 249
    @Autowired
250
    BidService bidService;
251
 
34654 vikas.jang 252
    @Autowired
253
    WalletService walletService;
254
 
34902 vikas 255
    @Autowired
256
    AffiliateLinkRepository affiliateLinkRepository;
257
 
34917 vikas 258
    @Autowired
259
    AffiliateService affiliateService;
260
 
35243 aman 261
    @Autowired
262
    FofoUser fofoUser;
263
 
37144 amit 264
    @Autowired
265
    private com.spice.profitmandi.web.services.PartnerSolrClient partnerSolrClient;
266
 
267
    @Autowired
268
    private com.spice.profitmandi.service.catalog.BrandsService brandsService;
269
 
32018 tejbeer 270
    List<String> filterableParams = Arrays.asList("brand");
26607 amit.gupta 271
 
32018 tejbeer 272
    @RequestMapping(value = "/store/entity/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
273
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
274
    @ApiOperation(value = "Get unit deal object")
275
    public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id) throws ProfitMandiBusinessException {
276
        List<FofoCatalogResponse> dealResponses = new ArrayList<>();
277
        List<Integer> tagIds = Arrays.asList(4);
278
        FofoCatalogResponse fofoCatalogResponse = null;
279
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
280
        if (roleManagerService.isPartner(userInfo.getRoleIds())) {
281
            String categoryId = "(3 OR 6)";
26745 amit.gupta 282
 
32018 tejbeer 283
            Map<String, String> params = new HashMap<>();
284
            List<String> mandatoryQ = new ArrayList<>();
285
            String catalogString = "catalog" + id;
26607 amit.gupta 286
 
32018 tejbeer 287
            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 288
 
32018 tejbeer 289
            params.put("q", StringUtils.join(mandatoryQ, " "));
290
            params.put("fl", "*, [child parentFilter=id:catalog*]");
291
            params.put("sort", "rank_i asc, create_s desc");
292
            params.put("wt", "json");
37144 amit 293
            JSONArray docs = partnerSolrClient.selectDocs(params, userInfo.getRetailerId());
32018 tejbeer 294
            dealResponses = getCatalogResponse(docs, false, userInfo.getRetailerId());
295
            fofoCatalogResponse = dealResponses.get(0);
296
            fofoCatalogResponse.setWebOffers(webOfferRepository.selectAllActiveOffers().get(fofoCatalogResponse.getCatalogId()));
28467 tejbeer 297
 
32018 tejbeer 298
        } else {
299
            return responseSender.badRequest(
300
                    new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
301
        }
302
        return responseSender.ok(dealResponses.get(0));
303
    }
26668 amit.gupta 304
 
32018 tejbeer 305
    private Object toDealObject(JsonObject jsonObject) {
306
        if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
307
            return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
308
        }
309
        return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
310
    }
26607 amit.gupta 311
 
32018 tejbeer 312
    @RequestMapping(value = "/store/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
313
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
314
    @ApiOperation(value = "Get brand list and count for category")
315
    public ResponseEntity<?> getBrands(HttpServletRequest request, @RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
316
        logger.info("Request " + request.getParameterMap());
317
        String response = null;
318
        // TODO: move to properties
319
        String uri = ProfitMandiConstants.URL_BRANDS;
320
        RestClient rc = new RestClient();
321
        Map<String, String> params = new HashMap<>();
322
        params.put("category_id", category_id);
323
        List<DealBrands> dealBrandsResponse = null;
324
        try {
325
            response = rc.get(SchemeType.HTTP, host, port, uri, params);
326
        } catch (HttpHostConnectException e) {
327
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
328
        }
26607 amit.gupta 329
 
32018 tejbeer 330
        dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
331
        }.getType());
26607 amit.gupta 332
 
37144 amit 333
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
334
        List<String> restrictedBrands = brandsService.restrictedBrands(userInfo.getRetailerId());
335
        dealBrandsResponse = dealBrandsResponse.stream().filter(x -> !restrictedBrands.contains(x.getBrand()))
336
                .collect(Collectors.toList());
337
 
32018 tejbeer 338
        return responseSender.ok(dealBrandsResponse);
339
    }
26607 amit.gupta 340
 
32018 tejbeer 341
    @RequestMapping(value = "/store/listing/{listingUrl}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
342
    public ResponseEntity<?> bestSellers(HttpServletRequest request, @PathVariable String listingUrl) throws Exception {
343
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
344
        WebListing webListing = webListingRepository.selectByUrl(listingUrl);
345
        webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
346
        return responseSender.ok(webListing);
347
    }
26654 amit.gupta 348
 
32018 tejbeer 349
    @RequestMapping(value = "/store/otp/generateOTP", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
350
    public ResponseEntity<?> generateOtp(HttpServletRequest request, @RequestParam String mobile) throws Exception {
26630 amit.gupta 351
 
32018 tejbeer 352
        return responseSender.ok(otpProcessor.generateOtp(mobile, OtpType.REGISTRATION));
26630 amit.gupta 353
 
32018 tejbeer 354
    }
26652 amit.gupta 355
 
32018 tejbeer 356
    @RequestMapping(value = "/store/checkmobile/{mobile}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
34882 aman 357
    public ResponseEntity<?> checkRegistrationUsingMobile(HttpServletRequest request, @PathVariable String mobile ,@RequestParam(required = false, defaultValue = "false") boolean isSmartSeller) throws Exception {
32018 tejbeer 358
        try {
359
            Customer customer = customerRepository.selectByMobileNumber(mobile);
360
            customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
34882 aman 361
            if(isSmartSeller){
34917 vikas 362
                //ToDo: Send welcome mail
34882 aman 363
                customer.setSmartSeller(isSmartSeller);
34917 vikas 364
                List<String> bccTo = Arrays.asList("sdtech@smartdukaan.com", "sriwant.wariz@smartdukaan.com");
365
                String[] userEmail = new String[]{customer.getEmailId()};
366
                emailService.sendMailWithAttachments("Welcome to SmartDukaan's SmartSeller", "welcome-smartseller.vm", null, userEmail, null, bccTo.toArray(new String[0]));
34882 aman 367
            }
32018 tejbeer 368
            return responseSender.ok(new CustomerModel(true, customer));
369
        } catch (Exception e) {
370
            return responseSender.ok(new CustomerModel(false, null));
371
        }
372
    }
26833 amit.gupta 373
 
34477 aman.kumar 374
 
32019 tejbeer 375
    @RequestMapping(value = "/store/getCustomerById/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
32018 tejbeer 376
    public ResponseEntity<?> getCustomerById(HttpServletRequest request, @PathVariable int id) throws Exception {
26774 amit.gupta 377
 
32018 tejbeer 378
        Customer customer = customerRepository.selectById(id);
379
        customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
32218 tejbeer 380
 
32018 tejbeer 381
        return responseSender.ok(customer);
26857 amit.gupta 382
 
32018 tejbeer 383
    }
26652 amit.gupta 384
 
32018 tejbeer 385
    @RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
386
    public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
387
        if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
388
            return responseSender.ok(true);
389
        } else {
34899 aman 390
            return responseSender.badRequest("Invalid Credentials");
32018 tejbeer 391
        }
392
    }
27028 tejbeer 393
 
32018 tejbeer 394
    @RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
34190 aman.kumar 395
    public ResponseEntity<?> resetPassword(@RequestBody UserModel userModel) throws Exception {
34247 aman.kumar 396
        if ((userModel.getMobile() == null || userModel.getMobile().isEmpty()) && (userModel.getPassword() == null || userModel.getPassword().isEmpty())) {
397
            throw new ProfitMandiBusinessException("error", "", "all field are required");
398
        }
34259 aman.kumar 399
        try {
400
            customerService.resetPassword(userModel.getMobile(), userModel.getPassword());
401
        } catch (ProfitMandiBusinessException p) {
402
            throw new ProfitMandiBusinessException("error", "", "An error occurred while resetting password");
403
        }
34247 aman.kumar 404
 
32018 tejbeer 405
        return responseSender.ok(true);
406
    }
34242 tejus.loha 407
 
34190 aman.kumar 408
    @RequestMapping(value = "/store/changePassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
409
    public ResponseEntity<?> changePassword(@RequestBody UserModel userModel) throws Exception {
34259 aman.kumar 410
        logger.info("UserModel - " + userModel);
411
        if ((userModel.getOldPassword() == null || userModel.getOldPassword().isEmpty()) && (userModel.getMobile() == null || userModel.getMobile().isEmpty()) && (userModel.getPassword() == null || userModel.getPassword().isEmpty())) {
34247 aman.kumar 412
            throw new ProfitMandiBusinessException("error", "", "all fields are required");
34190 aman.kumar 413
        }
34259 aman.kumar 414
        try {
415
            customerService.changePassword(userModel.getMobile(), userModel.getOldPassword(), userModel.getPassword());
416
        } catch (ProfitMandiBusinessException p) {
34247 aman.kumar 417
            throw new ProfitMandiBusinessException("error", "", "An error occurred while changing password");
418
        }
419
        return responseSender.ok(true);
34190 aman.kumar 420
    }
28339 tejbeer 421
 
32018 tejbeer 422
    @RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
423
    public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
424
        Customer customer = new Customer();
425
        customer.setPassword(userModel.getPassword());
426
        customer.setEmailId(userModel.getEmail());
427
        customer.setFirstName(userModel.getFirstName());
428
        customer.setLastName(userModel.getLastName());
429
        customer.setMobileNumber(userModel.getMobile());
34882 aman 430
        customer.setSmartSeller(userModel.getIsSmartSeller());
34917 vikas 431
        if (userModel.getIsSmartSeller()){
432
            if (userModel.getReferralCode() != null && !userModel.getReferralCode().isEmpty()) {
433
                int referrerId = Integer.parseInt(userModel.getReferralCode().substring(2));
434
                AffiliateEarnings earnings = new AffiliateEarnings();
435
                earnings.setType(ProfitMandiConstants.EARNING_TYPE.REFERRAL);
436
                earnings.setAffiliateCode(userModel.getReferralCode());
437
                earnings.setPoints(ProfitMandiConstants.SMARTSELLER_REFERRAL_POINTS);
438
                earnings.setAmount((float) ProfitMandiConstants.SMARTSELLER_REFERRAL_POINTS);
439
                earnings.setCustomerId(referrerId);
440
                earnings.setOrderId(referrerId);
441
                earnings.setItemId(referrerId);
442
                earnings.setExpireAt(LocalDateTime.now().plusYears(1));
443
                affiliateService.createEarnings(earnings);
444
                customer.setReferralCode(userModel.getReferralCode());
445
            }
446
            List<String> bccTo = Arrays.asList("sdtech@smartdukaan.com", "sriwant.wariz@smartdukaan.com");
447
            String[] userEmail = new String[]{userModel.getEmail()};
448
            emailService.sendMailWithAttachments("Welcome to SmartDukaan's SmartSeller", "welcome-smartseller.vm", null, userEmail, null, bccTo.toArray(new String[0]));
449
        }
32018 tejbeer 450
        return responseSender.ok(customerService.addCustomer(customer));
451
    }
34882 aman 452
    @RequestMapping(value = "/store/signinWithOtp", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
453
    public ResponseEntity<?> signInWithOtp(HttpServletRequest request,
454
                                           @RequestBody OtpLoginRequest otpLoginRequest) throws Exception {
455
        OTPResponse otpResponse = otpProcessor.validateOtp(
456
                otpLoginRequest.getReferenceId(),
457
                otpLoginRequest.getMobile(),
458
                otpLoginRequest.getOtp()
459
        );
460
        if (otpResponse.isResult()) {
461
            return responseSender.ok(true);
462
        } else {
463
            return responseSender.badRequest("Invalid otp please check again");
464
        }
465
    }
28339 tejbeer 466
 
33573 amit.gupta 467
    @RequestMapping(value = "/store/checkplans", method = RequestMethod.GET)
33436 ranu 468
    public ResponseEntity<?> getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
33573 amit.gupta 469
                                                @RequestParam int itemId) throws ProfitMandiBusinessException {
33399 ranu 470
        logger.info("Request received at url : {}", request.getRequestURI());
471
 
472
        try {
33436 ranu 473
            Map<String, List<MobileInsurancePlan>> response = this.getPlans(price, itemId);
474
            List<MobileInsurancePlan> combinedPlans = new ArrayList<>();
475
            for (List<MobileInsurancePlan> plans : response.values()) {
476
                combinedPlans.addAll(plans);
477
            }
478
            return responseSender.ok(combinedPlans);
33399 ranu 479
        } catch (Exception e) {
480
            logger.info(e.getMessage(), e);
481
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
482
        }
483
 
484
    }
485
 
486
    @Autowired
487
    InsuranceService insuranceService;
488
 
489
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId)
490
            throws ProfitMandiBusinessException {
491
        try {
33573 amit.gupta 492
            Map<String, List<MobileInsurancePlan>> productDurationPlans = insuranceService.getAllPlans(itemId, sellingPrice, true);
34822 ranu 493
            Map<String, List<MobileInsurancePlan>> filteredPlans = productDurationPlans.entrySet()
494
                    .stream()
495
                    .collect(Collectors.toMap(
496
                            Map.Entry::getKey,
497
                            e -> e.getValue().stream()
34823 ranu 498
                                    .filter(plan -> "5".equals(plan.getProviderId()))
34822 ranu 499
                                    .collect(Collectors.toList())
500
                    ));
501
            return filteredPlans;
33399 ranu 502
        } catch (Exception e) {
503
            logger.info(e, e);
34247 aman.kumar 504
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance", "Could not fetch insurance Plans");
33399 ranu 505
        }
506
 
507
    }
508
 
32018 tejbeer 509
    @RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
510
    public ResponseEntity<?> confirmOrder(HttpServletRequest request, @RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
511
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
512
        Integer storeId = userInfo.getRetailerId();
513
        createPendingOrderRequest.setFofoId(storeId);
514
        List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
515
        List<CartItem> cartItems = new ArrayList<>();
516
        pendingOrderItems.stream().forEach(x -> {
517
            CartItem ci = new CartItem();
518
            ci.setItemId(x.getItemId());
519
            ci.setQuantity(x.getQuantity());
520
            ci.setSellingPrice(x.getSellingPrice());
34902 vikas 521
            ci.setSmartSellerId(x.getSmartSellerId());
33436 ranu 522
            ci.setPendingOrderItemPolicyPlan(x.getPendingOrderItemPolicyPlan());
32018 tejbeer 523
            cartItems.add(ci);
524
        });
33573 amit.gupta 525
        logger.info("cartItems {}", cartItems);
32018 tejbeer 526
        CartResponse cr = this.validateCart(storeId, cartItems);
34239 vikas.jang 527
        logger.info("CartResponse cr {}", cr);
32018 tejbeer 528
        if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
34186 vikas.jang 529
            return responseSender.badRequest(cr.getCartMessages());
32018 tejbeer 530
        }
28377 tejbeer 531
 
32018 tejbeer 532
        Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
28377 tejbeer 533
 
32018 tejbeer 534
        PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
535
        if (offlineOrders.contains(pendingOrder.getPayMethod())) {
28391 tejbeer 536
 
32018 tejbeer 537
            Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
28400 tejbeer 538
 
32018 tejbeer 539
            CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
540
            Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
541
            String[] customerEmail = null;
542
            if (Utils.validateEmail(customer.getEmailId())) {
543
                customerEmail = new String[]{customer.getEmailId()};
544
            }
31203 tejbeer 545
 
32616 amit.gupta 546
            List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "ranu.rajput@smartdukaan.com", "devkinandan.lal@smartdukaan.com", customRetailer.getEmail());
28394 tejbeer 547
 
32018 tejbeer 548
            List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
549
            if (authUserEmails != null) {
550
                authUserEmails = new ArrayList<>();
551
            }
552
            logger.info("authUserEmails {}", authUserEmails);
553
            authUserEmails.addAll(bccTo);
554
            StringBuffer itemBuffer = new StringBuffer();
555
            List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
556
            int totalItems = 0;
557
            String itemNoColor = null;
558
            float maxValue = 0;
559
            for (PendingOrderItem orderItem : orderItems) {
560
                if (maxValue < orderItem.getSellingPrice()) {
561
                    maxValue = orderItem.getSellingPrice();
562
                    itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
563
                }
564
                totalItems += orderItem.getQuantity();
565
            }
566
            if (totalItems > 1) {
567
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
568
                itemBuffer.append(" +").append(totalItems - 1).append(" items");
569
            } else {
570
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
571
            }
572
            String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(), itemBuffer.toString(), pendingOrder.getTotalAmount());
573
            otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28377 tejbeer 574
 
32018 tejbeer 575
            emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
28377 tejbeer 576
 
32018 tejbeer 577
            List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
27028 tejbeer 578
 
32018 tejbeer 579
            emailIds.addAll(
580
                    csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_MARKETING, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3, EscalationType.L4)).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
581
            emailIds.add("tarun.verma@smartdukaan.com");
582
            emailIds.add("devkinandan.lal@smartdukaan.com");
34917 vikas 583
            emailIds.add("sdtech@smartdukaan.com");
584
            emailIds.add("sourcing@smartdukaan.com");
32018 tejbeer 585
            List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
586
            List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
26630 amit.gupta 587
 
32018 tejbeer 588
            logger.info("userIds" + userIds);
589
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
590
            sendNotificationModel.setCampaignName("Online Order Alert");
591
            sendNotificationModel.setTitle("Online Order Update");
592
            sendNotificationModel.setMessage(String.format(
593
                    "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."));
594
            sendNotificationModel.setType("url");
34902 vikas 595
            sendNotificationModel.setUrl("https://smartdukaan.com/pages/home/notifications");
32018 tejbeer 596
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
597
            sendNotificationModel.setMessageType(MessageType.notification);
598
            int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
599
            sendNotificationModel.setUserIds(Arrays.asList(userId));
600
            notificationService.sendNotification(sendNotificationModel);
26857 amit.gupta 601
 
32018 tejbeer 602
            SendNotificationModel snm = new SendNotificationModel();
603
            snm.setCampaignName("Online Order Alert");
604
            snm.setTitle("Online Order Update");
605
            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."));
606
            snm.setType("url");
35758 vikas 607
            snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
32018 tejbeer 608
            snm.setExpiresat(LocalDateTime.now().plusDays(1));
609
            snm.setMessageType(MessageType.notification);
610
            snm.setUserIds(userIds);
611
            notificationService.sendNotification(snm);
26857 amit.gupta 612
 
32018 tejbeer 613
        }
614
        return responseSender.ok(returnMap);
26857 amit.gupta 615
 
32018 tejbeer 616
    }
617
    @RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
618
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
619
    @ApiOperation(value = "Get brand list and count for category")
620
    public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
621
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
622
        Integer storeId = userInfo.getRetailerId();
623
        CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
26923 amit.gupta 624
 
32018 tejbeer 625
        return responseSender.ok(customRetailer.getAddress());
28566 tejbeer 626
 
32018 tejbeer 627
    }
34190 aman.kumar 628
    @RequestMapping(value = "/store/address/defaultAddress/{addressId}/{customerId}", method = RequestMethod.POST)
629
    @ApiImplicitParams({
630
            @ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")
631
    })
632
    @ApiOperation(value = "Set default address for a store")
34259 aman.kumar 633
    public ResponseEntity<?> setDefaultAddress(HttpServletRequest request, @PathVariable int addressId, @PathVariable int customerId) throws Exception {
34190 aman.kumar 634
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
635
        CustomerAddress defaultAddress;
636
        try {
637
            defaultAddress = customerAddressRepository.selectById(addressId);
638
        } catch (ProfitMandiBusinessException e) {
639
            return responseSender.badRequest("Address not found.");
640
        }
641
        logger.info("CustomerID: {}", customerId);
642
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerId);
643
        logger.info("customerAddresses: {}", customerAddresses);
644
        for (CustomerAddress addr : customerAddresses) {
34259 aman.kumar 645
            if (addr.getDefault() ) {
34190 aman.kumar 646
                addr.setDefault(false);
647
            }
648
        }
649
        defaultAddress.setDefault(true);
650
        return responseSender.ok("Default address updated successfully.");
651
    }
28566 tejbeer 652
 
32018 tejbeer 653
    @RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
654
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
655
    @ApiOperation(value = "Get brand list and count for category")
656
    public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
657
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
658
        int fofoId = ProfitMandiConstants.DEFAULT_STORE;
659
        if (pincodePartners.size() > 0) {
660
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
661
            List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
662
            if (fofoStores.size() > 0) {
663
                fofoId = fofoStores.get(0).getId();
664
            }
28566 tejbeer 665
 
32018 tejbeer 666
        }
667
        return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
668
    }
28566 tejbeer 669
 
32018 tejbeer 670
    @RequestMapping(value = "/store/addresses", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
671
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
672
    @ApiOperation(value = "Get brand list and count for category")
673
    public ResponseEntity<?> getStoresByPincod(HttpServletRequest request, @RequestParam String pincode, @RequestParam(name = "fofoCode", defaultValue = "", required = false) String fofoCode) throws Exception {
28566 tejbeer 674
 
32018 tejbeer 675
        List<CustomRetailer> customerRetailers = new ArrayList<>();
28566 tejbeer 676
 
32018 tejbeer 677
        logger.info("fofoCode" + fofoCode);
30426 tejbeer 678
 
32018 tejbeer 679
        if (fofoCode != null) {
680
            FofoStore fs = fofoStoreRepository.selectByStoreCode(fofoCode.toUpperCase());
681
            PincodePartner pp = pincodePartnerRepository.selectPartnerByPincode(pincode, fs.getId());
682
            if (pp != null) {
683
                return responseSender.ok(customerRetailers.add(retailerService.getFofoRetailer(pp.getFofoId())));
684
            } else {
30426 tejbeer 685
 
32018 tejbeer 686
                List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
687
                if (pincodePartners.size() > 0) {
28566 tejbeer 688
 
32018 tejbeer 689
                    List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
690
                    List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 691
 
32018 tejbeer 692
                    Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 693
 
32018 tejbeer 694
                    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 695
 
32018 tejbeer 696
                    customerRetailers.addAll(customerRetailerMap.values());
30426 tejbeer 697
 
32018 tejbeer 698
                }
699
                return responseSender.ok(customerRetailers);
30426 tejbeer 700
 
32018 tejbeer 701
            }
702
        } else {
28566 tejbeer 703
 
32018 tejbeer 704
            List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
705
            if (pincodePartners.size() > 0) {
706
                List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
707
                List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 708
 
32018 tejbeer 709
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 710
 
32018 tejbeer 711
                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 712
 
32018 tejbeer 713
                customerRetailers.addAll(customerRetailerMap.values());
714
            }
28298 tejbeer 715
 
32018 tejbeer 716
            return responseSender.ok(customerRetailers);
30426 tejbeer 717
 
32018 tejbeer 718
        }
30426 tejbeer 719
 
32018 tejbeer 720
    }
30426 tejbeer 721
 
32018 tejbeer 722
    @RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
723
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
724
    @ApiOperation(value = "Get brand list and count for category")
725
    public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
726
        List<CustomRetailer> customerRetailers = new ArrayList<>();
727
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28298 tejbeer 728
 
32018 tejbeer 729
        if (!pincodePartners.isEmpty()) {
730
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
731
            List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28298 tejbeer 732
 
32018 tejbeer 733
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 734
 
32018 tejbeer 735
            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 736
 
32018 tejbeer 737
            customerRetailers.addAll(customerRetailerMap.values());
738
        }
27049 tejbeer 739
 
32018 tejbeer 740
        logger.info("customerRetailers" + customerRetailers);
741
        return responseSender.ok(customerRetailers);
742
    }
26855 tejbeer 743
 
32018 tejbeer 744
    @RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
745
    public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 746
 
747
        List<PendingOrderDetail> pendingOrderDetails = new ArrayList<>();
32018 tejbeer 748
        List<Integer> catalogIds = new ArrayList<>();
749
        List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
26855 tejbeer 750
 
32018 tejbeer 751
        if (!pendingOrders.isEmpty()) {
752
            for (PendingOrder po : pendingOrders) {
753
                List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
754
                for (PendingOrderItem pendingOrderItem : pois) {
755
                    Item item = itemRepository.selectById(pendingOrderItem.getItemId());
756
                    pendingOrderItem.setItemName(item.getItemDescription());
34287 vikas.jang 757
                    FofoOrderItem fofoItem = fofoOrderItemRepository.selectByPendingOrderItemId(pendingOrderItem.getId());
758
                    if (fofoItem != null) pendingOrderItem.setFofoOrderItem(fofoItem);
32018 tejbeer 759
                    catalogIds.add(item.getCatalogItemId());
760
                }
26855 tejbeer 761
 
32018 tejbeer 762
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
26855 tejbeer 763
 
32018 tejbeer 764
                for (PendingOrderItem poi : pois) {
33436 ranu 765
                    PendingOrderDetail pendingOrderDetail = new PendingOrderDetail();
32018 tejbeer 766
                    Item item = itemRepository.selectById(poi.getItemId());
34287 vikas.jang 767
                    if(contentMap.containsKey(item.getCatalogItemId())) {
768
                        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
769
                        pendingOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
770
                    } else {
771
                        pendingOrderDetail.setImageUrl(ProfitMandiConstants.NO_IMAGE);
772
                    }
33436 ranu 773
                    pendingOrderDetail.setBrand(item.getBrand());
774
                    pendingOrderDetail.setColor(item.getColor());
775
                    pendingOrderDetail.setPendingOrderItemId(poi.getId());
776
                    pendingOrderDetail.setId(poi.getOrderId());
34287 vikas.jang 777
                    if(poi.getFofoOrderItem() != null && poi.getFofoOrderItem().getOrderId() > 0) pendingOrderDetail.setFofoOrderId(poi.getFofoOrderItem().getOrderId());
33436 ranu 778
                    pendingOrderDetail.setItemId(poi.getItemId());
779
                    pendingOrderDetail.setModelName(item.getModelName());
780
                    pendingOrderDetail.setModelNumber(item.getModelNumber());
781
                    pendingOrderDetail.setQuantity(poi.getQuantity());
782
                    pendingOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
783
                    pendingOrderDetail.setStatus(poi.getStatus());
784
                    pendingOrderDetail.setTotalPrice(poi.getSellingPrice());
785
                    pendingOrderDetail.setPayMethod(po.getPayMethod());
786
                    pendingOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
787
                    pendingOrderDetail.setPendingOrderPlan(pendingOrderPlanRepository.selectByPoid(poi.getId()));
788
                    pendingOrderDetails.add(pendingOrderDetail);
32018 tejbeer 789
                }
790
            }
791
        }
28566 tejbeer 792
 
33436 ranu 793
        return responseSender.ok(pendingOrderDetails);
32018 tejbeer 794
    }
28566 tejbeer 795
 
32018 tejbeer 796
    @RequestMapping(value = "/store/invoiceOrder", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
797
    public ResponseEntity<?> getOrderInvoiceDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 798
        List<CustomerOrderAndInsuranceDetails> customerOrderAndInsuranceDetails = new ArrayList<>();
32018 tejbeer 799
        List<Integer> catalogIds = new ArrayList<>();
800
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectOrderByCustomerId(id, offset, limit);
28566 tejbeer 801
 
32018 tejbeer 802
        if (!fofoOrders.isEmpty()) {
803
            for (FofoOrder fo : fofoOrders) {
804
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fo.getId());
805
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
806
                    Item item = itemRepository.selectById(fofoOrderItem.getItemId());
807
                    fofoOrderItem.setItemName(item.getItemDescription());
808
                    catalogIds.add(item.getCatalogItemId());
809
                }
28566 tejbeer 810
 
32018 tejbeer 811
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
812
                for (FofoOrderItem foi : fofoOrderItems) {
33436 ranu 813
                    CustomerOrderAndInsuranceDetails customerOrderDetail = new CustomerOrderAndInsuranceDetails();
32018 tejbeer 814
                    Item item = itemRepository.selectById(foi.getItemId());
815
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
816
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
817
                    customerOrderDetail.setBrand(item.getBrand());
818
                    customerOrderDetail.setColor(item.getColor());
819
                    customerOrderDetail.setFofoOrderItemId(foi.getId());
820
                    customerOrderDetail.setFofoOrderId(foi.getOrderId());
821
                    customerOrderDetail.setItemId(foi.getItemId());
822
                    customerOrderDetail.setModelName(item.getModelName());
823
                    customerOrderDetail.setModelNumber(item.getModelNumber());
824
                    customerOrderDetail.setQuantity(foi.getQuantity());
825
                    customerOrderDetail.setTotalPrice(foi.getSellingPrice());
826
                    customerOrderDetail.setCreatedTimeStamp(foi.getCreateTimestamp());
827
                    customerOrderDetail.setInvoiceNumber(fo.getInvoiceNumber());
828
                    customerOrderDetail.setCancelledTimestamp(fo.getCancelledTimestamp());
33436 ranu 829
                    customerOrderDetail.setInsurancePolicies(insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fo.getInvoiceNumber()));
830
                    customerOrderAndInsuranceDetails.add(customerOrderDetail);
32018 tejbeer 831
                }
33436 ranu 832
 
32018 tejbeer 833
            }
28566 tejbeer 834
 
32018 tejbeer 835
        }
33436 ranu 836
        return responseSender.ok(customerOrderAndInsuranceDetails);
32018 tejbeer 837
    }
28566 tejbeer 838
 
36377 vikas 839
    @RequestMapping(value = "/store/generateInvoice", method = RequestMethod.GET, produces = MediaType.APPLICATION_PDF_VALUE)
840
    public ResponseEntity<byte[]> generateInvoice(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
32018 tejbeer 841
        InvoicePdfModel pdfModel = null;
842
        FofoOrder fo = fofoOrderRepository.selectByOrderId(orderId);
843
        pdfModel = orderService.getInvoicePdfModel(fo.getFofoId(), orderId);
844
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
845
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
846
        try {
847
            byteArrayOutputStream.close();
848
        } catch (IOException e) {
849
            e.printStackTrace();
850
        }
36377 vikas 851
        byte[] pdfBytes = byteArrayOutputStream.toByteArray();
32018 tejbeer 852
        final HttpHeaders headers = new HttpHeaders();
853
        headers.setContentType(MediaType.APPLICATION_PDF);
854
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
855
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
856
        headers.add("Pragma", "no-cache");
857
        headers.add("Expires", "0");
36377 vikas 858
        headers.setContentLength(pdfBytes.length);
859
        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
28287 amit.gupta 860
 
32018 tejbeer 861
    }
26607 amit.gupta 862
 
32018 tejbeer 863
    @RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
35079 vikas 864
    @Cacheable(value = "storesListing", cacheManager = "thirtyMinsTimeOutCacheManager")
32018 tejbeer 865
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
866
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
867
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32546 amit.gupta 868
        for (WebListing webListing : webListings) {
869
            webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
870
        }
871
        return responseSender.ok(webListings);
872
    }
33399 ranu 873
 
874
    @Autowired
875
    StateRepository stateRepository;
876
 
877
    @RequestMapping(value = "/store/stateList", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
878
    public ResponseEntity<?> getStateList(HttpServletRequest request) throws Exception {
879
        List<State> states = stateRepository.selectAll();
880
        return responseSender.ok(states);
881
    }
32546 amit.gupta 882
    /*@RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
883
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
884
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
885
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32544 amit.gupta 886
        Iterator<WebListing> webListingIterator = webListings.iterator();
887
        while (webListingIterator.hasNext()) {
888
            WebListing webListing = webListingIterator.next();
889
            List<FofoCatalogResponse> catalogResponses = getDealResponses(userInfo, webListing);
890
            boolean isAvailable = catalogResponses.stream().anyMatch(x->x.getItems().stream().anyMatch(y->y.getAvailability()>0));
32545 amit.gupta 891
            webListing.setFofoCatalogResponses(catalogResponses);
32544 amit.gupta 892
            if(!isAvailable) {
893
                webListings.remove(webListing);
894
            }
32018 tejbeer 895
        }
32544 amit.gupta 896
 
32018 tejbeer 897
        return responseSender.ok(webListings);
32546 amit.gupta 898
    }*/
26607 amit.gupta 899
 
32018 tejbeer 900
    private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing) throws ProfitMandiBusinessException {
901
        List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
902
        if (webProducts.size() == 0) {
903
            return new ArrayList<>();
904
        }
905
        Map<String, String> params = new HashMap<>();
906
        List<String> mandatoryQ = new ArrayList<>();
907
        mandatoryQ.add(String.format(
33599 amit.gupta 908
                "+{!parent which=\"catalogId_i:(" + StringUtils.join(webProducts, " ") + ")\"} tagId_i:(%s)", StringUtils.join(TAG_IDS, " ")));
32018 tejbeer 909
        params.put("q", StringUtils.join(mandatoryQ, " "));
910
        params.put("fl", "*, [child parentFilter=id:catalog*]");
911
        // params.put("sort", "create_s desc");
912
        params.put("start", String.valueOf(0));
913
        params.put("rows", String.valueOf(100));
914
        params.put("wt", "json");
37144 amit 915
        JSONArray docs = partnerSolrClient.selectDocs(params, userInfo.getRetailerId());
32018 tejbeer 916
        List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
917
        return dealResponse;
918
    }
26607 amit.gupta 919
 
32018 tejbeer 920
    @RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
921
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
922
    @ApiOperation(value = "Get brand list and count for category")
923
    public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest) throws Exception {
924
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
34902 vikas 925
        logger.info("cartRequest: {}",cartRequest);
32018 tejbeer 926
        Integer storeId = userInfo.getRetailerId();
927
        ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()), "Success", "Items added to cart successfully");
928
        return responseSender.ok(vc);
929
    }
26607 amit.gupta 930
 
32018 tejbeer 931
    // Validate Cart for B2C Customers
932
    private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
33436 ranu 933
 
33573 amit.gupta 934
        logger.info("cartItems {}", cartItems);
32018 tejbeer 935
        cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
936
        List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
937
        Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId, itemIds);
938
        CartResponse cartResponse = new CartResponse();
939
        List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
940
        cartResponse.setCartItems(cartItemResponseModels);
941
        Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
942
        logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 943
 
32018 tejbeer 944
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26652 amit.gupta 945
 
32018 tejbeer 946
        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 947
 
32018 tejbeer 948
        List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId()).collect(Collectors.toList());
26607 amit.gupta 949
 
32018 tejbeer 950
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27030 amit.gupta 951
 
32018 tejbeer 952
        // cartResponse.getCartItems()
953
        int cartMessageChanged = 0;
954
        int cartMessageOOS = 0;
955
        int totalAmount = 0;
956
        int totalQty = 0;
34186 vikas.jang 957
        List<CartMessage> itemMessages = new ArrayList<>();
32018 tejbeer 958
        for (CartItem cartItem : cartItems) {
959
            Item item = itemsMap.get(cartItem.getItemId());
34186 vikas.jang 960
            CartMessage itemMsg = new CartMessage();
32018 tejbeer 961
            TagListing tagListing = tagListingMap.get(cartItem.getItemId());
32977 amit.gupta 962
            int catalogId = itemsMap.get(cartItem.getItemId()).getCatalogItemId();
963
            Float cashback = schemeService.getCatalogSchemeCashBack(storeId, Arrays.asList(catalogId))
964
                    .get(itemsMap.get(cartItem.getItemId()).getCatalogItemId());
32018 tejbeer 965
            cashback = cashback == null ? 0 : cashback;
966
            float itemSellingPrice = tagListing.getMop() - cashback;
967
            CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
968
            cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
33436 ranu 969
            cartItemResponseModel.setPendingOrderItemPolicyPlan(cartItem.getPendingOrderItemPolicyPlan());
34259 aman.kumar 970
            logger.info("itemSellingPrice: {}", itemSellingPrice);
971
            logger.info("cartItem: {}", cartItem.getSellingPrice());
972
            logger.info("cashback: {}", cashback);
32018 tejbeer 973
            if (itemSellingPrice != cartItem.getSellingPrice()) {
34186 vikas.jang 974
                itemMsg.setType("price");
34259 aman.kumar 975
                itemMsg.setMessageText("Price has changed to " + itemSellingPrice);
32018 tejbeer 976
                cartItemResponseModel.setSellingPrice(itemSellingPrice);
977
                cartMessageChanged++;
978
            }
979
            int estimate = -2;
980
            LocalDateTime promiseDeliveryTime = LocalDateTime.now();
981
            int qtyRequired = (int) cartItem.getQuantity();
982
            AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
983
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
984
            if (availabilityModel.getStoreAvailability() >= qtyRequired) {
34239 vikas.jang 985
                itemMsg.setType("estimate0");
34259 aman.kumar 986
                itemMsg.setMessageText("Store availability is " + availabilityModel.getStoreAvailability());
32018 tejbeer 987
                estimate = 0;
988
            } else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
34239 vikas.jang 989
                itemMsg.setType("estimate2");
34259 aman.kumar 990
                itemMsg.setMessageText("Store availability is " + availabilityModel.getWarehouseAvailability());
32018 tejbeer 991
                estimate = 2;
992
            } else if (availabilityModel.getStoreAvailability() > 0) {
993
                estimate = 0;
994
                qtyRequired = availabilityModel.getStoreAvailability();
995
                cartMessageChanged++;
34186 vikas.jang 996
                itemMsg.setType("quantity0");
34259 aman.kumar 997
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 998
            } else if (availabilityModel.getWarehouseAvailability() > 0) {
999
                qtyRequired = availabilityModel.getWarehouseAvailability();
1000
                estimate = 2;
1001
                cartMessageChanged++;
34186 vikas.jang 1002
                itemMsg.setType("quantity2");
34259 aman.kumar 1003
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 1004
            } else {
1005
                qtyRequired = 0;
1006
                cartMessageChanged++;
34186 vikas.jang 1007
                itemMsg.setType("item");
1008
                itemMsg.setMessageText(item.getItemDescriptionNoColor() + " is out of stock");
32018 tejbeer 1009
            }
1010
            cartItemResponseModel.setQuantity(qtyRequired);
1011
            if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
1012
                estimate = estimate + 1;
1013
                promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
1014
            }
1015
            totalQty += qtyRequired;
33573 amit.gupta 1016
            if (cartItem.getPendingOrderItemPolicyPlan() != null) {
1017
                totalAmount += qtyRequired * itemSellingPrice + qtyRequired * cartItem.getPendingOrderItemPolicyPlan().getPrice();
1018
            } else {
33436 ranu 1019
                totalAmount += qtyRequired * itemSellingPrice;
1020
            }
34902 vikas 1021
            AffiliateProduct product = affiliateLinkRepository.findByCode(cartItem.getSmartSellerId());
33436 ranu 1022
 
34902 vikas 1023
            logger.info("product ===: {}", product);
1024
 
1025
            if (product != null && !product.getExpiryDate().isBefore(LocalDateTime.now())) {
1026
                cartItemResponseModel.setSmartSellerId(cartItem.getSmartSellerId());
1027
            }
1028
 
32018 tejbeer 1029
            cartItemResponseModel.setEstimate(estimate);
1030
            cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
1031
            cartItemResponseModel.setItemId(cartItem.getItemId());
1032
            cartItemResponseModel.setMinBuyQuantity(1);
1033
            cartItemResponseModel.setQuantity(qtyRequired);
34884 vikas 1034
            cartItemResponseModel.setCategoryId(item.getCategoryId());
32018 tejbeer 1035
            cartItemResponseModel.setQuantityStep(1);
1036
            cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
1037
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
1038
            cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
1039
            cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
1040
            cartItemResponseModel.setColor(item.getColor());
1041
            cartItemResponseModels.add(cartItemResponseModel);
34186 vikas.jang 1042
            itemMessages.add(itemMsg);
32018 tejbeer 1043
        }
1044
        cartResponse.setCartItems(cartItemResponseModels);
34186 vikas.jang 1045
        cartResponse.setCartMessages(itemMessages);
32018 tejbeer 1046
        cartResponse.setCartMessageChanged(cartMessageChanged);
1047
        cartResponse.setCartMessageOOS(cartMessageOOS);
1048
        int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
1049
        cartResponse.setMaxEstimate(maxEstimate);
1050
        cartResponse.setTotalAmount(totalAmount);
1051
        cartResponse.setTotalQty(totalQty);
26607 amit.gupta 1052
 
32018 tejbeer 1053
        return cartResponse;
26923 amit.gupta 1054
 
32018 tejbeer 1055
    }
27069 tejbeer 1056
 
32018 tejbeer 1057
    @RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
33573 amit.gupta 1058
    public ResponseEntity<?> partnerStock(HttpServletRequest request, @RequestParam(required = false, defaultValue = "3") String categoryId, @RequestParam int offset,
34444 vikas.jang 1059
      @RequestParam int limit, @RequestParam(required = false) String sort, @RequestParam(required = false) String brand,
1060
      @RequestParam(value = "subCategoryId", required = false) int subCategoryId, @RequestParam(required = false) String queryTerm,
1061
      @RequestParam(required = false) String listing, @RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
32018 tejbeer 1062
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
36428 aman 1063
        int dbCategoryId = mapFrontendCategoryToDb(categoryId);
1064
        List<FofoCatalogResponse> dealResponse = getCatalogResponseFromDb(
36932 ranu 1065
                dbCategoryId, userInfo.getRetailerId(), offset, limit, brand, queryTerm, subCategoryId, partnerStockOnly);
32018 tejbeer 1066
        return responseSender.ok(dealResponse);
1067
    }
26923 amit.gupta 1068
 
36428 aman 1069
    private int mapFrontendCategoryToDb(String frontendCategoryId) {
1070
        if ("3".equals(frontendCategoryId)) return 10006;
1071
        try {
1072
            return Integer.parseInt(frontendCategoryId);
1073
        } catch (NumberFormatException e) {
1074
            return 10006;
1075
        }
1076
    }
1077
 
1078
    private List<FofoCatalogResponse> getCatalogResponseFromDb(int dbCategoryId, int fofoId, int offset, int limit,
36932 ranu 1079
                                                                String brand, String queryTerm, int subCategoryId,
1080
                                                                boolean partnerStockOnly) throws ProfitMandiBusinessException {
36428 aman 1081
        List<status> statuses = Arrays.asList(status.ACTIVE, status.PAUSED_BY_RISK, status.PARTIALLY_ACTIVE);
1082
        List<ItemTagModel> itemTagModels = tagListingRepository.getItemTagByCategoryAndStatus(dbCategoryId, statuses);
1083
 
1084
        List<String> excludeBrands = Arrays.asList("Dummy", "FOC HANDSET", "FOC", "Live Demo");
1085
 
36932 ranu 1086
        // Sell-mode (partnerStockOnly): fetch partner stock first so we can prune
1087
        // catalogs to in-stock items only before any other lookups. This cuts the
1088
        // work for warehouse/cashback/image batches and skips empty catalogs entirely.
1089
        Map<Integer, Integer> partnerStockMap = Collections.emptyMap();
1090
        if (fofoId > 0) {
1091
            partnerStockMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream()
1092
                    .collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability(), (a, b) -> a));
1093
        }
1094
        final Map<Integer, Integer> psMap = partnerStockMap;
1095
 
36428 aman 1096
        Map<Integer, List<ItemTagModel>> catalogGrouped = itemTagModels.stream()
1097
                .filter(itm -> !excludeBrands.contains(itm.getItem().getBrand()))
1098
                .filter(itm -> brand == null || brand.isEmpty() || itm.getItem().getBrand().equalsIgnoreCase(brand))
1099
                .filter(itm -> queryTerm == null || queryTerm.isEmpty() || queryTerm.equals("null")
1100
                        || matchesSearchQuery(itm.getItem(), queryTerm))
1101
                .filter(itm -> subCategoryId == 0 || itm.getItem().getCategoryId() == subCategoryId)
36932 ranu 1102
                // Drop items the partner has zero of when sell-mode demands in-stock only.
1103
                .filter(itm -> !partnerStockOnly || psMap.getOrDefault(itm.getItem().getId(), 0) > 0)
36428 aman 1104
                .collect(Collectors.groupingBy(itm -> itm.getItem().getCatalogItemId()));
1105
 
1106
        if (catalogGrouped.isEmpty()) {
1107
            return new ArrayList<>();
1108
        }
1109
 
1110
        Set<Integer> allItemIds = catalogGrouped.values().stream()
1111
                .flatMap(List::stream)
1112
                .map(itm -> itm.getItem().getId())
1113
                .collect(Collectors.toSet());
1114
 
1115
        Map<Integer, Integer> warehouseStockMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(allItemIds));
1116
 
1117
        Map<Integer, List<WebOffer>> webOfferMap = webOfferRepository.selectAllActiveOffers();
1118
 
1119
        List<SuperCatalogModel> superCatalogModels = superCatalogMappingRepository.selectJoinedData();
1120
        List<SuperCatalogMapping> superCatalogs = superCatalogMappingRepository.selectAll();
1121
 
1122
        List<Integer> allCatalogIds = new ArrayList<>(catalogGrouped.keySet());
1123
 
1124
        Map<Integer, Float> cashBackCache = fofoId > 0
1125
                ? schemeService.getCatalogSchemeCashBack(fofoId, allCatalogIds)
1126
                : new HashMap<>();
1127
 
1128
        Map<Long, ContentPojo> imageCache = mongoClient.getEntitiesByIds(
1129
                allCatalogIds.stream().map(Integer::longValue).collect(Collectors.toList()));
1130
 
1131
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
1132
 
1133
        for (Map.Entry<Integer, List<ItemTagModel>> entry : catalogGrouped.entrySet()) {
1134
            int catalogId = entry.getKey();
1135
            List<ItemTagModel> catalogItems = entry.getValue();
1136
            Item firstItem = catalogItems.get(0).getItem();
1137
 
1138
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
1139
            ffdr.setCatalogId(catalogId);
1140
 
1141
            String title = Arrays.asList(firstItem.getBrand(), firstItem.getModelName(), firstItem.getModelNumber())
1142
                    .stream().filter(s -> s != null && !s.isEmpty()).collect(Collectors.joining(" "));
1143
            ffdr.setTitle(title);
1144
            ContentPojo cachedEntity = imageCache.get((long) catalogId);
1145
            String imageUrl = cachedEntity != null ? cachedEntity.getDefaultImageUrl() : null;
1146
            ffdr.setImageUrl(imageUrl != null ? imageUrl : "https://images.smartdukaan.com/uploads/campaigns/" + catalogId + ".jpg");
1147
            ffdr.setBrand(firstItem.getBrand());
1148
            ffdr.setIsSmartPhone(firstItem.isSmartPhone());
1149
            ffdr.setFeature(null);
1150
 
1151
            Optional<SuperCatalogModel> scMapping = superCatalogModels.stream()
1152
                    .filter(m -> m.getCatalogId() == catalogId).findFirst();
1153
            if (scMapping.isPresent()) {
1154
                ffdr.setSuperCatalogId(scMapping.get().getSuperCatalogId());
1155
                ffdr.setSuperCatalogTitle(scMapping.get().getSuperCatalogName());
1156
                ffdr.setSuperCatalogVariants(buildVariantsJson(superCatalogs, scMapping.get().getSuperCatalogId(), itemTagModels));
1157
            } else {
1158
                ffdr.setSuperCatalogId(0);
1159
                ffdr.setSuperCatalogTitle(title);
1160
                ffdr.setSuperCatalogVariants("[]");
1161
            }
1162
 
1163
            List<WebOffer> webOffers = webOfferMap.get(catalogId);
1164
            if (webOffers != null && !webOffers.isEmpty()) {
1165
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
1166
            }
1167
 
1168
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
1169
            for (ItemTagModel itm : catalogItems) {
1170
                Item item = itm.getItem();
1171
                TagListing tl = itm.getTagListing();
1172
                int itemId = item.getId();
1173
                float sellingPrice = tl.getSellingPrice();
1174
 
1175
                if (fofoAvailabilityInfoMap.containsKey(itemId)) {
1176
                    if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
1177
                        fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
1178
                        fofoAvailabilityInfoMap.get(itemId).setMop(tl.getMop());
1179
                    }
1180
                } else {
1181
                    FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
1182
                    fdi.setSellingPrice(sellingPrice);
1183
                    fdi.setMrp(tl.getMrp());
1184
                    fdi.setMop(tl.getMop());
1185
                    fdi.setColor(item.getColor() != null ? item.getColor().replace("f_", "") : "");
1186
                    fdi.setTagId(tl.getTagId());
1187
                    fdi.setItem_id(itemId);
1188
                    fdi.setCatalog_id(catalogId);
1189
 
1190
                    Float cb = cashBackCache.get(catalogId);
1191
                    fdi.setCashback(cb != null ? cb : 0f);
1192
                    fdi.setMinBuyQuantity(1);
1193
 
1194
                    int partnerAvailability = partnerStockMap.getOrDefault(itemId, 0);
1195
                    int ourStockAvailability = Math.max(0, warehouseStockMap.getOrDefault(itemId, 0));
1196
                    fdi.setActive(partnerAvailability > 0);
1197
                    fdi.setPartnerAvailability(partnerAvailability);
1198
                    fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
1199
                    fdi.setQuantityStep(1);
1200
                    fdi.setMaxQuantity(fdi.getAvailability());
1201
 
1202
                    fofoAvailabilityInfoMap.put(itemId, fdi);
1203
                }
1204
            }
1205
 
1206
            if (!fofoAvailabilityInfoMap.isEmpty()) {
1207
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream()
1208
                        .sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder())
1209
                                .thenComparingInt(y -> -y.getAvailability()))
1210
                        .collect(Collectors.toList()));
1211
                dealResponse.add(ffdr);
1212
            }
1213
        }
1214
 
1215
        dealResponse.sort(Comparator.comparing(FofoCatalogResponse::getItems,
1216
                (s1, s2) -> (s2.get(0).isActive() ? 1 : 0) - (s1.get(0).isActive() ? 1 : 0))
1217
                .thenComparing(FofoCatalogResponse::getItems,
1218
                        (x, y) -> y.get(0).getAvailability() - x.get(0).getAvailability()));
1219
 
1220
        int start = Math.min(offset, dealResponse.size());
1221
        int end = Math.min(offset + limit, dealResponse.size());
1222
        return dealResponse.subList(start, end);
1223
    }
1224
 
1225
    private boolean matchesSearchQuery(Item item, String query) {
1226
        String q = query.toLowerCase();
1227
        String searchable = String.join(" ",
1228
                item.getBrand() != null ? item.getBrand() : "",
1229
                item.getModelName() != null ? item.getModelName() : "",
1230
                item.getModelNumber() != null ? item.getModelNumber() : "",
1231
                item.getColor() != null ? item.getColor() : "").toLowerCase();
1232
        for (String term : q.split("\\s+")) {
1233
            if (!searchable.contains(term)) return false;
1234
        }
1235
        return true;
1236
    }
1237
 
1238
    private String buildVariantsJson(List<SuperCatalogMapping> superCatalogs, int superCatalogId, List<ItemTagModel> itemTagModels) {
1239
        List<Map<String, Object>> variantList = new ArrayList<>();
1240
        List<SuperCatalogMapping> matchingVariants = superCatalogs.stream()
1241
                .filter(m -> m.getSuperCatalogId() == superCatalogId)
1242
                .collect(Collectors.toList());
1243
 
1244
        for (SuperCatalogMapping variant : matchingVariants) {
1245
            if (variant.getVariantName() == null) continue;
1246
            boolean hasActiveTag = itemTagModels.stream()
1247
                    .anyMatch(tag -> tag.getItem().getCatalogItemId() == variant.getCatalogId() && tag.getTagListing().isActive());
1248
            if (!hasActiveTag) continue;
1249
 
1250
            ItemTagModel tagModel = itemTagModels.stream()
1251
                    .filter(tag -> tag.getItem().getCatalogItemId() == variant.getCatalogId())
1252
                    .findFirst().orElse(null);
1253
 
1254
            Map<String, Object> variantObj = new HashMap<>();
1255
            variantObj.put("catalogId", variant.getCatalogId());
1256
            variantObj.put("variantName", variant.getVariantName());
1257
            variantObj.put("mrp", tagModel != null ? tagModel.getTagListing().getMrp() : 0.0);
1258
            variantObj.put("mop", tagModel != null ? tagModel.getTagListing().getMop() : 0.0);
1259
            variantObj.put("sellingPrice", tagModel != null ? tagModel.getTagListing().getSellingPrice() : 0.0);
1260
            variantList.add(variantObj);
1261
        }
1262
 
1263
        if (variantList.isEmpty()) return "[]";
1264
        return new Gson().toJson(variantList);
1265
    }
1266
 
32018 tejbeer 1267
    private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws ProfitMandiBusinessException {
1268
        Map<Integer, Integer> ourItemAvailabilityMap = null;
1269
        Map<Integer, Integer> partnerStockAvailabilityMap = null;
1270
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
1271
        List<Integer> tagIds = Arrays.asList(4);
1272
        if (docs.length() > 0) {
1273
            HashSet<Integer> itemsSet = new HashSet<>();
1274
            for (int i = 0; i < docs.length(); i++) {
1275
                JSONObject doc = docs.getJSONObject(i);
1276
                if (doc.has("_childDocuments_")) {
1277
                    for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1278
                        JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1279
                        int itemId = childItem.getInt("itemId_i");
1280
                        itemsSet.add(itemId);
1281
                    }
1282
                }
1283
            }
1284
            if (itemsSet.size() == 0) {
1285
                return dealResponse;
1286
            }
1287
            if (fofoId > 0) {
1288
                partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1289
            }
1290
            ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
1291
        }
26833 amit.gupta 1292
 
32018 tejbeer 1293
        for (int i = 0; i < docs.length(); i++) {
1294
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
1295
            JSONObject doc = docs.getJSONObject(i);
1296
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
1297
            ffdr.setCatalogId(doc.getInt("catalogId_i"));
1298
            ffdr.setImageUrl(doc.getString("imageUrl_s"));
1299
            ffdr.setTitle(doc.getString("title_s"));
34239 vikas.jang 1300
            ffdr.setSuperCatalogTitle(doc.getString("superCatalog_s"));
1301
            ffdr.setSuperCatalogId(doc.getInt("superCatalog_i"));
1302
            ffdr.setSuperCatalogVariants(doc.getString("superCatalogVariants_s"));
32018 tejbeer 1303
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
1304
            if (webOffers != null && webOffers.size() > 0) {
1305
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
1306
            }
1307
            try {
1308
                ffdr.setFeature(doc.getString("feature_s"));
1309
            } catch (Exception e) {
1310
                ffdr.setFeature(null);
1311
            }
1312
            ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
33314 ranu 1313
 
32018 tejbeer 1314
            if (doc.has("_childDocuments_")) {
1315
                for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1316
                    JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1317
                    int itemId = childItem.getInt("itemId_i");
36376 aman 1318
                    // Solr sometimes outlives the DB row (stale index, soft-deleted Item,
1319
                    // cache lag). One bad row shouldn't 400 the whole catalogue — treat
1320
                    // a missing row as "not a smartphone" and keep going.
1321
                    try {
1322
                        ffdr.setIsSmartPhone(itemRepository.selectById(itemId).isSmartPhone());
1323
                    } catch (ProfitMandiBusinessException e) {
1324
                        logger.warn("partnerStock: itemId {} present in Solr but missing from DB — skipping isSmartPhone", itemId);
1325
                        ffdr.setIsSmartPhone(false);
1326
                    }
32018 tejbeer 1327
                    float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
1328
                    if (fofoAvailabilityInfoMap.containsKey(itemId)) {
1329
                        if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
1330
                            fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
1331
                            fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
1332
                        }
1333
                    } else {
1334
                        FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
1335
                        fdi.setSellingPrice(sellingPrice);
1336
                        fdi.setMrp(childItem.getDouble("mrp_f"));
1337
                        fdi.setMop((float) childItem.getDouble("mop_f"));
1338
                        fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
1339
                        fdi.setTagId(childItem.getInt("tagId_i"));
1340
                        fdi.setItem_id(itemId);
34196 ranu 1341
                        fdi.setCatalog_id(doc.getInt("catalogId_i"));
32977 amit.gupta 1342
                        Float cashBack = schemeService.getCatalogSchemeCashBack(fofoId, Arrays.asList(ffdr.getCatalogId())).get(ffdr.getCatalogId());
32018 tejbeer 1343
                        cashBack = cashBack == null ? 0 : cashBack;
1344
                        // TODO:Dont commit
1345
                        // fdi.setCashback(Math.min(100, fdi.getMop()));
1346
                        fdi.setCashback(cashBack);
1347
                        fdi.setMinBuyQuantity(1);
1348
                        int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0 : partnerStockAvailabilityMap.get(itemId);
1349
                        int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0 : Math.max(0, ourItemAvailabilityMap.get(itemId));
1350
                        fdi.setActive(partnerAvailability > 0);
1351
                        // fdi.setActive(true);
34239 vikas.jang 1352
                        fdi.setPartnerAvailability(partnerAvailability);
32018 tejbeer 1353
                        fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
1354
                        fdi.setQuantityStep(1);
1355
                        fdi.setMaxQuantity(fdi.getAvailability());
1356
                        fofoAvailabilityInfoMap.put(itemId, fdi);
1357
                    }
1358
                }
1359
            }
1360
            if (fofoAvailabilityInfoMap.values().size() > 0) {
1361
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder()).thenComparingInt(y -> -y.getAvailability())).collect(Collectors.toList()));
1362
                dealResponse.add(ffdr);
1363
            }
1364
        }
1365
        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());
1366
    }
26857 amit.gupta 1367
 
32018 tejbeer 1368
    @GetMapping(value = "store/order-status/{pendingOrderId}")
1369
    public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId) throws Exception {
1370
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
1371
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
1372
        List<Integer> catalogIds = new ArrayList<>();
1373
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
34477 aman.kumar 1374
            //TODO : Amit feedback use poItemId instead of poId change Param name
1375
            // when list is supposed then use method names as selectAllBy instead selectBy of
1376
            //check for unique constraint
1377
            List<PendingOrderPlan> policyPlans = pendingOrderPlanRepository.selectByPoId(pendingOrderItem.getId());
1378
            pendingOrderItem.setPendingOrderItemPolicyPlan(policyPlans);
32018 tejbeer 1379
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1380
            pendingOrderItem.setItemName(item.getItemDescription());
34186 vikas.jang 1381
            pendingOrderItem.setCatalogId(item.getCatalogItemId());
32018 tejbeer 1382
            catalogIds.add(item.getCatalogItemId());
1383
        }
1384
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1385
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1386
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1387
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1388
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1389
        }
1390
        pendingOrder.setPendingOrderItems(pendingOrderItems);
27045 tejbeer 1391
 
32018 tejbeer 1392
        return responseSender.ok(pendingOrder);
1393
    }
28345 tejbeer 1394
 
32018 tejbeer 1395
    @RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
1396
    public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
1397
        return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
1398
    }
26861 tejbeer 1399
 
32018 tejbeer 1400
    @RequestMapping(value = "/store/address", method = RequestMethod.POST)
1401
    public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress) throws Throwable {
34259 aman.kumar 1402
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerAddress.getCustomerId());
1403
        if (customerAddresses.isEmpty()) {
1404
            customerAddress.setDefault(true);
1405
        } else {
1406
            customerAddress.setDefault(false);
1407
        }
32018 tejbeer 1408
        customerAddressRepository.persist(customerAddress);
1409
        return responseSender.ok(customerAddress);
1410
    }
27045 tejbeer 1411
 
32018 tejbeer 1412
    @RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
1413
    public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
1414
        CustomerAddress cust = customerAddressRepository.selectById(id);
34259 aman.kumar 1415
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByCustomerId(cust.getCustomerId());
32018 tejbeer 1416
        cust.setActive(false);
34259 aman.kumar 1417
        if(cust.getDefault()){
1418
            List<CustomerAddress> activeAddresses = customerAddresses.stream()
1419
                    .filter(a -> a.getActive() && a.getId() != id)
1420
                    .sorted(Comparator.comparing(CustomerAddress::getUpdateTimestamp).reversed())
1421
                    .collect(Collectors.toList());
1422
 
1423
            if (!activeAddresses.isEmpty()) {
1424
                CustomerAddress newDefault = activeAddresses.get(0);
1425
                newDefault.setDefault(true);
1426
            }
1427
        }
32018 tejbeer 1428
        return responseSender.ok(cust);
1429
    }
27048 tejbeer 1430
 
32018 tejbeer 1431
    @RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
1432
    public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer) throws Throwable {
1433
        Customer cust = customerRepository.selectById(customer.getId());
1434
        cust.setGender(customer.getGender());
1435
        cust.setProfileImageId(customer.getProfileImageId());
34186 vikas.jang 1436
        cust.setEmailId(customer.getEmailId());
32018 tejbeer 1437
        cust.setDob(customer.getDob());
1438
        return responseSender.ok(cust);
1439
    }
27048 tejbeer 1440
 
32018 tejbeer 1441
    @RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
1442
    public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state, @PathVariable String city, @PathVariable String storeCode) throws Throwable {
1443
        logger.info("Store code {}", storeCode);
1444
        Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
1445
        logger.info("retailer id {}", map.get(storeCode));
1446
        String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
1447
        String html = partnerIndexService.getPartnerIndexHtml();
1448
        logger.info("html {}", html);
1449
        html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan", String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
1450
        response.getWriter().write(html);
1451
    }
27048 tejbeer 1452
 
32018 tejbeer 1453
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
34186 vikas.jang 1454
    public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String statusDescription, @RequestParam String reason) throws Exception {
28339 tejbeer 1455
 
32018 tejbeer 1456
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1457
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1458
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1459
        if (pendingOrderItem.getBilledTimestamp() == null) {
1460
            pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1461
            pendingOrderItem.setRemark(reason);
1462
            pendingOrderItem.setStatusDescription("cancel by self");
1463
            pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1464
            List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream().map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1465
 
32018 tejbeer 1466
            if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING) && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED) && !status.contains(OrderStatus.CLAIMED)) {
1467
                pendingOrder.setStatus(OrderStatus.CLOSED);
1468
            }
28339 tejbeer 1469
 
32018 tejbeer 1470
            pendingOrderItemRepository.persist(pendingOrderItem);
1471
            String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
1472
            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 1473
 
32018 tejbeer 1474
            List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1475
 
32018 tejbeer 1476
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1477
            pendingOrderItem.setItemName(item.getItemDescription());
1478
            catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1479
 
32018 tejbeer 1480
            Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1481
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1482
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1483
            pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1484
            CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28355 tejbeer 1485
 
32018 tejbeer 1486
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1487
 
32018 tejbeer 1488
            Map<String, Object> emailModel = new HashMap<>();
1489
            emailModel.put("customer", customerAddress);
1490
            emailModel.put("pendingOrder", pendingOrder);
1491
            emailModel.put("date", dateTimeFormatter);
27048 tejbeer 1492
 
32018 tejbeer 1493
            String[] customerEmail = null;
1494
            if (customer.getEmailId() != null) {
1495
                customerEmail = new String[]{customer.getEmailId()};
27048 tejbeer 1496
 
34186 vikas.jang 1497
                List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
29515 tejbeer 1498
 
32018 tejbeer 1499
                emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
29515 tejbeer 1500
 
32018 tejbeer 1501
            }
1502
        }
29515 tejbeer 1503
 
32018 tejbeer 1504
        return responseSender.ok(true);
29515 tejbeer 1505
 
32018 tejbeer 1506
    }
31444 tejbeer 1507
 
32018 tejbeer 1508
    @RequestMapping(value = "/store/checkEligibilityStoreOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1509
    public ResponseEntity<?> checkEligibilityStoreOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1510
 
32018 tejbeer 1511
        boolean eligibility = false;
29515 tejbeer 1512
 
34186 vikas.jang 1513
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1514
 
32018 tejbeer 1515
        if (!scratchOffers.isEmpty()) {
1516
            eligibility = true;
31457 tejbeer 1517
 
32018 tejbeer 1518
        }
1519
        return responseSender.ok(eligibility);
1520
    }
29515 tejbeer 1521
 
32018 tejbeer 1522
    @RequestMapping(value = "/store/ScratchOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1523
    public ResponseEntity<?> scratchOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1524
 
34186 vikas.jang 1525
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1526
 
32218 tejbeer 1527
        logger.info("scratchOffers {}", scratchOffers);
32018 tejbeer 1528
        // List<ScratchOffer> scratchOffers =
1529
        // scratchOfferRepository.selectBycCustomerId(id);
1530
        for (ScratchOffer so : scratchOffers) {
1531
            if (LocalDateTime.now().isAfter(so.getUnlockedAt())) {
1532
                so.setUnlocked(true);
1533
            } else {
1534
                so.setUnlocked(false);
1535
            }
34371 ranu 1536
            LocalDateTime expiredTimestamp = ProfitMandiConstants.SCRATCH_OFFER_END_DATE.plusDays(0).atTime(LocalTime.MAX);
32671 ranu 1537
            so.setExpiredTimestamp(expiredTimestamp);
33573 amit.gupta 1538
            if (LocalDateTime.now().isAfter(expiredTimestamp)) {
32671 ranu 1539
                so.setExpired(true);
1540
            }
32018 tejbeer 1541
        }
29515 tejbeer 1542
 
32018 tejbeer 1543
        return responseSender.ok(scratchOffers);
1544
    }
1545
 
1546
    @RequestMapping(value = "/store/ScratchedOffer", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1547
    public ResponseEntity<?> scratchedOffer(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
1548
 
1549
        ScratchOffer scratchOffer = scratchOfferRepository.selectById(id);
1550
        scratchOffer.setScratched(true);
1551
        scratchOffer.setScracthedAt(LocalDateTime.now());
1552
 
1553
        return responseSender.ok(true);
1554
    }
1555
 
34242 tejus.loha 1556
    @RequestMapping(value = "/store/navbar", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1557
    public ResponseEntity<?> navBars() throws Exception {
1558
        List<NavBar> navBars = navBarRepository.selectAllActive();
1559
        return responseSender.ok(navBars);
1560
    }
1561
 
35243 aman 1562
 
1563
    @RequestMapping(value = "/getMonthSale", method = RequestMethod.GET)
1564
    public ResponseEntity<?> getMonthsale(HttpServletRequest request) throws Exception {
1565
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1566
        int fofoId = userInfo.getRetailerId();
1567
        logger.info("getting the user resonse {} ",userInfo);
1568
        Map<String, MonthSaleModel> monthSaleMap = new HashMap<>();
1569
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
1570
        int dayOfMonth = curDate.getDayOfMonth();
1571
        YearMonth yearMonth = YearMonth.now();
35309 aman 1572
        for (int i = 0; i <= 6; i++) {
35243 aman 1573
            LocalDateTime startOfMonth = curDate.withDayOfMonth(1).minusMonths(i);
1574
            int lengthOfMonth = YearMonth.from(startOfMonth).lengthOfMonth();
1575
            logger.info("Start of previous Month {}, start of next month Month {}", startOfMonth, startOfMonth.plusMonths(1));
1576
            double monthSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(startOfMonth, startOfMonth.plusMonths(1), fofoId, false).get(fofoId);
1577
            double mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(startOfMonth, startOfMonth.plusDays(Math.min(dayOfMonth, lengthOfMonth)), fofoId, false).get(fofoId);
1578
 
1579
            MonthSaleModel ms = new MonthSaleModel();
1580
            ms.setMtdSales(fofoUser.format((long) mtdSales));
1581
            ms.setMonthlySales(fofoUser.format(((long) monthSales)));
1582
            ms.setMonth(startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1583
            monthSaleMap.put(String.valueOf(i), ms);
1584
        }
1585
        logger.info("getting the month sale map {}",monthSaleMap);
1586
        return responseSender.ok(monthSaleMap);
1587
    }
1588
    @RequestMapping(value = "/getBrandwisePartnerSale", method = RequestMethod.GET)
1589
    @ResponseBody
1590
    public ResponseEntity<?> getBrandwisePartnerSale(HttpServletRequest request, @RequestParam(name = "month", required = true, defaultValue = "0") int month, Model model) throws Exception {
1591
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1592
        int fofoId = userInfo.getRetailerId();
1593
        List<BrandWisePartnerSaleModel> brandWisePartnerSaleModels = fofoStoreRepository.selectBrandWiseMonthlyPartnerSale(Collections.singletonList(fofoId), month);
1594
        List<Map<String, Object>> response = new ArrayList<>();
1595
        for (BrandWisePartnerSaleModel m : brandWisePartnerSaleModels) {
1596
            Map<String, Object> row = new HashMap<>();
1597
            row.put("brand", m.getBrand());
1598
            row.put("lms", fofoUser.format(m.getLms()));
1599
            row.put("lmsQty", m.getLmsQty());
1600
            row.put("mtd", fofoUser.format(m.getMtd()));
1601
            row.put("mtdQty", m.getMtdQty());
1602
            row.put("lmtd", fofoUser.format(m.getLmtd()));
1603
            row.put("lmtdQty", m.getLmtdQty());
1604
            row.put("amtd", fofoUser.format(m.getAmtd()));
1605
            response.add(row);
1606
        }
1607
        logger.info("brandItemWisePartnerSaleModels {}", response);
1608
        return responseSender.ok(response);
1609
    }
1610
    @RequestMapping(value = "/getBrandItemwisePartnerSale", method = RequestMethod.GET)
1611
    @ResponseBody
1612
    public ResponseEntity<?> getBrandItemwisePartnerSale(HttpServletRequest request, @RequestParam(name = "month", required = true, defaultValue = "0") int month, @RequestParam(name = "brand") String brand) throws Exception {
1613
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1614
        int fofoId = userInfo.getRetailerId();
1615
        List<BrandItemWisePartnerSaleModel> brandItemWisePartnerSaleModels = fofoStoreRepository.selectPartnerBrandItemMonthlySale(Collections.singletonList(fofoId), month, brand);
1616
        logger.info("getting brandwise item sale {}",brandItemWisePartnerSaleModels);
1617
        return responseSender.ok(brandItemWisePartnerSaleModels);
1618
    }
1619
 
1620
 
34444 vikas.jang 1621
    @RequestMapping(value = "/store/clearance", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1622
    public ResponseEntity<?> getLiquidations() throws Exception {
1623
        List<Integer> catalogIds = new ArrayList<>();
1624
        Map<Integer, JSONObject> contentMap = null;
34545 vikas.jang 1625
        List<Liquidation> liquidations = liquidationRepository.selectAllByStatus(ProfitMandiConstants.LIQUIDATION_ENUM.PUBLISHED);
34242 tejus.loha 1626
 
34444 vikas.jang 1627
        if (!liquidations.isEmpty()) {
1628
            for (Liquidation liquidation : liquidations) catalogIds.add(liquidation.getCatalogId());
1629
            contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1630
        }
1631
 
1632
        List<LiquidationDetail> resultList = new ArrayList<>();
1633
 
1634
        if (contentMap != null) {
1635
            for (Liquidation liquidation : liquidations) {
1636
                List<Bid> bidList = bidRepository.selectBidByLiquidationId(liquidation.getId());
1637
                LiquidationDetail liquidationDetail = new LiquidationDetail();
1638
                if(contentMap.containsKey(liquidation.getCatalogId())) {
1639
                    JSONObject jsonObj = contentMap.get(liquidation.getCatalogId());
1640
                    liquidationDetail.setLiquidationId(liquidation.getId());
1641
                    liquidationDetail.setImageURL(jsonObj.getString("imageUrl_s"));
1642
                    liquidationDetail.setItemName(jsonObj.getString("title_s"));
1643
                    liquidationDetail.setBrand(jsonObj.getString("title_s"));
1644
                    liquidationDetail.setCatalogId(jsonObj.getInt("catalogId_i"));
1645
                    liquidationDetail.setMrp(jsonObj.getFloat("mop_f"));
1646
                    liquidationDetail.setMop(jsonObj.getFloat("mop_f"));
1647
                    liquidationDetail.setDp(jsonObj.getFloat("dp_f"));
1648
                    liquidationDetail.setSuperCatalogs(jsonObj.getString("superCatalogVariants_s"));
1649
                    liquidationDetail.setStartDate(liquidation.getStartDate());
1650
                    liquidationDetail.setEndDate(liquidation.getEndDate());
1651
                    liquidationDetail.setSellingPrice(liquidation.getPrice());
1652
                    liquidationDetail.setAvailableQuantity(liquidation.getQuantity());
34494 vikas.jang 1653
                    liquidationDetail.setIncrementStep(liquidation.getIncrementStep());
34444 vikas.jang 1654
                    liquidationDetail.setBidList(bidList);
1655
                    resultList.add(liquidationDetail);
1656
                }
1657
            }
1658
        }
1659
 
1660
        return responseSender.ok(resultList);
1661
    }
1662
 
1663
    @RequestMapping(value = "/store/clearance/bid", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1664
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
1665
    public ResponseEntity<?> saveBidding(HttpServletRequest request, @RequestBody BiddingModel biddingModel) throws Exception {
34446 vikas.jang 1666
        LocalDateTime now = LocalDateTime.now();
34476 vikas.jang 1667
        Liquidation liquidation = liquidationRepository.selectLiquidationById(biddingModel.getLiquidationId());
1668
        LocalDateTime endDateTime = LocalDateTime.of(liquidation.getEndDate().toLocalDate(), LocalTime.of(ProfitMandiConstants.BID_END_HOUR, ProfitMandiConstants.BID_END_MIN));
34494 vikas.jang 1669
        List<Bid> biddings = bidRepository.selectBidByLiquidationId(biddingModel.getLiquidationId());
34476 vikas.jang 1670
        if (now.isAfter(endDateTime)) {
34494 vikas.jang 1671
            return responseSender.badRequest("Bid on this product has been closed");
34446 vikas.jang 1672
        }
34444 vikas.jang 1673
        Bid bid = null;
1674
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1675
        if (biddingModel.getId() != null && biddingModel.getId() > 0) {
1676
            bid = bidRepository.selectById(biddingModel.getId());
1677
            if (bid == null) {
34494 vikas.jang 1678
                return responseSender.badRequest("Bidding record not found with ID: " + biddingModel.getId());
34444 vikas.jang 1679
            }
1680
        } else {
1681
            bid = new Bid();
1682
        }
34476 vikas.jang 1683
        logger.info("biddingModel {}: ",biddingModel);
34444 vikas.jang 1684
        bid.setLiquidationId(biddingModel.getLiquidationId());
1685
        bid.setBiddingAmount(biddingModel.getBiddingAmount());
1686
        bid.setFofoId(userInfo.getRetailerId());
1687
        bid.setItemName(biddingModel.getItemName());
1688
        bid.setQuantity(biddingModel.getBidQty());
1689
        bid.setStatus(ProfitMandiConstants.BID_ENUM.PENDING);
1690
        bid.setCreatedAt(LocalDateTime.now());
34562 ranu 1691
        if (biddingModel.getId() == null) {
1692
            bidRepository.persist(bid);
34654 vikas.jang 1693
            //debit 500 from wallet
34878 vikas 1694
            try {
1695
                String reason = "Advance security for "+bid.getItemName()+" bid";
35211 vikas 1696
                String message = "Dear Partner, We have Debited Rs "+ProfitMandiConstants.BID_CHARGES+" as booking amount against your bidding of Model No. "+bid.getItemName()+". We will adjust this amount from your order amount if the bid gets approved.";
34878 vikas 1697
                walletService.consumeAmountFromWallet(bid.getFofoId(),
1698
                        bid.getId(),
1699
                        WalletReferenceType.ADVANCE_SECURITY,
1700
                        reason, ProfitMandiConstants.BID_CHARGES,
1701
                        bid.getCreatedAt(),false);
1702
                bidService.sendPushNotification(message,"Bidding Update!",Arrays.asList(bid.getFofoId()));
1703
            } catch (Exception e) {
1704
                logger.info("WalletDebit: {}",e.getMessage());
1705
            }
34562 ranu 1706
        }
34494 vikas.jang 1707
        if (biddings.size() > 1) {
1708
            for (Bid bidding : biddings) {
34562 ranu 1709
                if (!(bid.getFofoId().equals(bidding.getFofoId()))) bidService.notifyPartner(bidding.getFofoId(), bid, ProfitMandiConstants.BID_ENUM.UPDATE);
34494 vikas.jang 1710
            }
1711
        }
1712
        return responseSender.ok("Bid placed successfully!");
34444 vikas.jang 1713
    }
1714
 
1715
 
26607 amit.gupta 1716
}