Subversion Repositories SmartDukaan

Rev

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