Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
26607 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.eclipsesource.json.JsonObject;
4
import com.google.gson.Gson;
5
import com.google.gson.reflect.TypeToken;
28377 tejbeer 6
import com.spice.profitmandi.common.enumuration.MessageType;
26607 amit.gupta 7
import com.spice.profitmandi.common.enumuration.SchemeType;
8
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30123 amit.gupta 9
import com.spice.profitmandi.common.model.*;
34444 vikas.jang 10
import com.spice.profitmandi.dao.entity.catalog.LiquidationDetail;
26607 amit.gupta 11
import com.spice.profitmandi.common.solr.SolrService;
28304 amit.gupta 12
import com.spice.profitmandi.common.util.FormattingUtils;
28566 tejbeer 13
import com.spice.profitmandi.common.util.PdfUtils;
28405 amit.gupta 14
import com.spice.profitmandi.common.util.Utils;
26607 amit.gupta 15
import com.spice.profitmandi.common.web.client.RestClient;
16
import com.spice.profitmandi.common.web.util.ResponseSender;
34242 tejus.loha 17
import com.spice.profitmandi.dao.entity.WebEntity.NavBar;
34444 vikas.jang 18
import com.spice.profitmandi.dao.entity.catalog.Bid;
26607 amit.gupta 19
import com.spice.profitmandi.dao.entity.catalog.Item;
34444 vikas.jang 20
import com.spice.profitmandi.dao.entity.catalog.Liquidation;
26607 amit.gupta 21
import com.spice.profitmandi.dao.entity.catalog.TagListing;
33436 ranu 22
import com.spice.profitmandi.dao.entity.dtr.*;
30123 amit.gupta 23
import com.spice.profitmandi.dao.entity.fofo.*;
33399 ranu 24
import com.spice.profitmandi.dao.entity.inventory.State;
31203 tejbeer 25
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26630 amit.gupta 26
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
31573 tejbeer 27
import com.spice.profitmandi.dao.enumuration.dtr.WebListingSource;
27045 tejbeer 28
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
30123 amit.gupta 29
import com.spice.profitmandi.dao.model.*;
33436 ranu 30
import com.spice.profitmandi.dao.model.pendingOrder.PendingOrderDetail;
34444 vikas.jang 31
import com.spice.profitmandi.dao.repository.catalog.BidRepository;
26607 amit.gupta 32
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
34444 vikas.jang 33
import com.spice.profitmandi.dao.repository.catalog.LiquidationRepository;
26607 amit.gupta 34
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
28290 tejbeer 35
import com.spice.profitmandi.dao.repository.cs.CsService;
30123 amit.gupta 36
import com.spice.profitmandi.dao.repository.dtr.*;
37
import com.spice.profitmandi.dao.repository.fofo.*;
26607 amit.gupta 38
import com.spice.profitmandi.dao.repository.inventory.ItemAvailabilityCacheRepository;
33399 ranu 39
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
28582 amit.gupta 40
import com.spice.profitmandi.dao.repository.user.UserRepository;
34248 aman.kumar 41
import com.spice.profitmandi.dao.repository.webRepository.NavBarRepository;
34494 vikas.jang 42
import com.spice.profitmandi.dao.service.BidService;
26784 amit.gupta 43
import com.spice.profitmandi.service.CustomerService;
28377 tejbeer 44
import com.spice.profitmandi.service.EmailService;
45
import com.spice.profitmandi.service.NotificationService;
26607 amit.gupta 46
import com.spice.profitmandi.service.authentication.RoleManager;
34444 vikas.jang 47
import com.spice.profitmandi.service.catalog.BiddingModel;
33399 ranu 48
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
49
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
30123 amit.gupta 50
import com.spice.profitmandi.service.inventory.*;
28566 tejbeer 51
import com.spice.profitmandi.service.order.OrderService;
26683 amit.gupta 52
import com.spice.profitmandi.service.scheme.SchemeService;
26651 amit.gupta 53
import com.spice.profitmandi.service.user.RetailerService;
33514 tejus.loha 54
import com.spice.profitmandi.dao.service.OtpProcessor;
34654 vikas.jang 55
import com.spice.profitmandi.service.wallet.WalletService;
26607 amit.gupta 56
import com.spice.profitmandi.web.res.DealBrands;
57
import com.spice.profitmandi.web.res.DealObjectResponse;
58
import com.spice.profitmandi.web.res.DealsResponse;
59
import com.spice.profitmandi.web.res.ValidateCartResponse;
28322 amit.gupta 60
import com.spice.profitmandi.web.services.PartnerIndexService;
34654 vikas.jang 61
import in.shop2020.model.v1.order.WalletReferenceType;
26607 amit.gupta 62
import io.swagger.annotations.ApiImplicitParam;
63
import io.swagger.annotations.ApiImplicitParams;
64
import io.swagger.annotations.ApiOperation;
30123 amit.gupta 65
import org.apache.commons.lang3.StringUtils;
66
import org.apache.http.conn.HttpHostConnectException;
67
import org.apache.logging.log4j.LogManager;
68
import org.apache.logging.log4j.Logger;
69
import org.json.JSONArray;
70
import org.json.JSONObject;
71
import org.springframework.beans.factory.annotation.Autowired;
72
import org.springframework.beans.factory.annotation.Value;
73
import org.springframework.core.io.InputStreamResource;
74
import org.springframework.http.HttpHeaders;
75
import org.springframework.http.HttpStatus;
76
import org.springframework.http.MediaType;
77
import org.springframework.http.ResponseEntity;
78
import org.springframework.stereotype.Controller;
79
import org.springframework.transaction.annotation.Transactional;
33399 ranu 80
import org.springframework.ui.Model;
30123 amit.gupta 81
import org.springframework.web.bind.annotation.*;
26607 amit.gupta 82
 
30123 amit.gupta 83
import javax.servlet.http.HttpServletRequest;
84
import javax.servlet.http.HttpServletResponse;
85
import java.io.ByteArrayInputStream;
86
import java.io.ByteArrayOutputStream;
87
import java.io.IOException;
88
import java.io.InputStream;
34446 vikas.jang 89
import java.time.LocalDate;
30123 amit.gupta 90
import java.time.LocalDateTime;
91
import java.time.LocalTime;
92
import java.time.format.DateTimeFormatter;
93
import java.util.*;
94
import java.util.stream.Collectors;
95
 
26607 amit.gupta 96
@Controller
97
@Transactional(rollbackFor = Throwable.class)
98
public class StoreController {
99
 
32018 tejbeer 100
    private static final Logger logger = LogManager.getLogger(StoreController.class);
26630 amit.gupta 101
 
32018 tejbeer 102
    private static final LocalTime CUTOFF_TIME = LocalTime.of(15, 0);
26745 amit.gupta 103
 
32018 tejbeer 104
    private static final List<Integer> TAG_IDS = Arrays.asList(4);
26745 amit.gupta 105
 
32018 tejbeer 106
    @Autowired
107
    CustomerAddressRepository customerAddressRepository;
28392 tejbeer 108
 
32018 tejbeer 109
    @Autowired
110
    WebOfferRepository webOfferRepository;
26607 amit.gupta 111
 
32018 tejbeer 112
    @Value("${new.solr.url}")
113
    private String solrUrl;
28345 tejbeer 114
 
32018 tejbeer 115
    @Autowired
116
    private PartnerIndexService partnerIndexService;
28345 tejbeer 117
 
32018 tejbeer 118
    @Autowired
119
    InventoryService inventoryService;
27045 tejbeer 120
 
32018 tejbeer 121
    @Autowired
122
    UserAccountRepository userAccountRepository;
26923 amit.gupta 123
 
32018 tejbeer 124
    @Value("${python.api.host}")
125
    private String host;
26833 amit.gupta 126
 
32018 tejbeer 127
    @Autowired
128
    CustomerService customerService;
26607 amit.gupta 129
 
32018 tejbeer 130
    @Value("${python.api.port}")
131
    private int port;
26923 amit.gupta 132
 
32018 tejbeer 133
    @Autowired
134
    private SaholicInventoryService saholicInventoryService;
26607 amit.gupta 135
 
32018 tejbeer 136
    @Autowired
137
    private PincodePartnerRepository pincodePartnerRepository;
26715 amit.gupta 138
 
32018 tejbeer 139
    @Autowired
140
    private FofoStoreRepository fofoStoreRepository;
26745 amit.gupta 141
 
32018 tejbeer 142
    @Autowired
143
    private RetailerService retailerService;
26861 tejbeer 144
 
32018 tejbeer 145
    @Autowired
146
    private PendingOrderRepository pendingOrderRepository;
26861 tejbeer 147
 
32018 tejbeer 148
    @Autowired
149
    private PendingOrderItemRepository pendingOrderItemRepository;
26652 amit.gupta 150
 
32018 tejbeer 151
    @Autowired
152
    private PendingOrderService pendingOrderService;
26648 amit.gupta 153
 
32018 tejbeer 154
    @Autowired
155
    private CustomerRepository customerRepository;
26774 amit.gupta 156
 
32018 tejbeer 157
    @Autowired
158
    private SolrService commonSolrService;
26607 amit.gupta 159
 
32018 tejbeer 160
    @Autowired
161
    private OtpProcessor otpProcessor;
26630 amit.gupta 162
 
32018 tejbeer 163
    @Autowired
164
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
26607 amit.gupta 165
 
32018 tejbeer 166
    @Autowired
167
    private ResponseSender<?> responseSender;
26607 amit.gupta 168
 
32018 tejbeer 169
    @Autowired
170
    private TagListingRepository tagListingRepository;
26607 amit.gupta 171
 
32018 tejbeer 172
    @Autowired
173
    private ItemRepository itemRepository;
26701 amit.gupta 174
 
32018 tejbeer 175
    @Autowired
176
    private SchemeService schemeService;
26607 amit.gupta 177
 
32018 tejbeer 178
    @Autowired
179
    private UserRepository userRepository;
28566 tejbeer 180
 
32018 tejbeer 181
    @Autowired
182
    private ItemAvailabilityCacheRepository itemAvailabilityCacheRepository;
26607 amit.gupta 183
 
32018 tejbeer 184
    @Autowired
185
    private WebListingRepository webListingRepository;
26745 amit.gupta 186
 
32018 tejbeer 187
    @Autowired
188
    private WebProductListingRepository webProductListingRepository;
26745 amit.gupta 189
 
32018 tejbeer 190
    @Autowired
191
    private RoleManager roleManagerService;
26607 amit.gupta 192
 
32018 tejbeer 193
    @Autowired
194
    EmailService emailService;
27028 tejbeer 195
 
32018 tejbeer 196
    @Autowired
197
    CsService csService;
28339 tejbeer 198
 
32018 tejbeer 199
    @Autowired
200
    private NotificationService notificationService;
28377 tejbeer 201
 
32018 tejbeer 202
    @Autowired
203
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
28377 tejbeer 204
 
32018 tejbeer 205
    @Autowired
206
    private FofoOrderRepository fofoOrderRepository;
28566 tejbeer 207
 
32018 tejbeer 208
    @Autowired
209
    private FofoOrderItemRepository fofoOrderItemRepository;
28566 tejbeer 210
 
32018 tejbeer 211
    @Autowired
212
    private OrderService orderService;
29515 tejbeer 213
 
32018 tejbeer 214
    @Autowired
33436 ranu 215
    InsurancePolicyRepository insurancePolicyRepository;
216
 
217
    @Autowired
34444 vikas.jang 218
    LiquidationRepository liquidationRepository;
219
 
220
    @Autowired
33436 ranu 221
    PendingOrderPlanRepository pendingOrderPlanRepository;
222
 
223
    @Autowired
32018 tejbeer 224
    private ScratchOfferRepository scratchOfferRepository;
225
    private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
28339 tejbeer 226
 
34242 tejus.loha 227
    @Autowired
228
    NavBarRepository navBarRepository;
229
 
34444 vikas.jang 230
    @Autowired
231
    BidRepository bidRepository;
232
 
34494 vikas.jang 233
    @Autowired
234
    BidService bidService;
235
 
34654 vikas.jang 236
    @Autowired
237
    WalletService walletService;
238
 
32018 tejbeer 239
    List<String> filterableParams = Arrays.asList("brand");
26607 amit.gupta 240
 
32018 tejbeer 241
    @RequestMapping(value = "/store/entity/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
242
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
243
    @ApiOperation(value = "Get unit deal object")
244
    public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id) throws ProfitMandiBusinessException {
245
        List<FofoCatalogResponse> dealResponses = new ArrayList<>();
246
        List<Integer> tagIds = Arrays.asList(4);
247
        FofoCatalogResponse fofoCatalogResponse = null;
248
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
249
        if (roleManagerService.isPartner(userInfo.getRoleIds())) {
250
            String categoryId = "(3 OR 6)";
26745 amit.gupta 251
 
32018 tejbeer 252
            RestClient rc = new RestClient();
253
            Map<String, String> params = new HashMap<>();
254
            List<String> mandatoryQ = new ArrayList<>();
255
            String catalogString = "catalog" + id;
26607 amit.gupta 256
 
32018 tejbeer 257
            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 258
 
32018 tejbeer 259
            params.put("q", StringUtils.join(mandatoryQ, " "));
260
            params.put("fl", "*, [child parentFilter=id:catalog*]");
261
            params.put("sort", "rank_i asc, create_s desc");
262
            params.put("wt", "json");
263
            String response = null;
264
            try {
265
                response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
266
            } catch (HttpHostConnectException e) {
267
                throw new ProfitMandiBusinessException("", "", "Could not connect to host");
268
            }
269
            JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
270
            JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
271
            dealResponses = getCatalogResponse(docs, false, userInfo.getRetailerId());
272
            fofoCatalogResponse = dealResponses.get(0);
273
            fofoCatalogResponse.setWebOffers(webOfferRepository.selectAllActiveOffers().get(fofoCatalogResponse.getCatalogId()));
28467 tejbeer 274
 
32018 tejbeer 275
        } else {
276
            return responseSender.badRequest(
277
                    new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
278
        }
279
        return responseSender.ok(dealResponses.get(0));
280
    }
26668 amit.gupta 281
 
32018 tejbeer 282
    private Object toDealObject(JsonObject jsonObject) {
283
        if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
284
            return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
285
        }
286
        return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
287
    }
26607 amit.gupta 288
 
32018 tejbeer 289
    @RequestMapping(value = "/store/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
290
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
291
    @ApiOperation(value = "Get brand list and count for category")
292
    public ResponseEntity<?> getBrands(HttpServletRequest request, @RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
293
        logger.info("Request " + request.getParameterMap());
294
        String response = null;
295
        // TODO: move to properties
296
        String uri = ProfitMandiConstants.URL_BRANDS;
297
        RestClient rc = new RestClient();
298
        Map<String, String> params = new HashMap<>();
299
        params.put("category_id", category_id);
300
        List<DealBrands> dealBrandsResponse = null;
301
        try {
302
            response = rc.get(SchemeType.HTTP, host, port, uri, params);
303
        } catch (HttpHostConnectException e) {
304
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
305
        }
26607 amit.gupta 306
 
32018 tejbeer 307
        dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
308
        }.getType());
26607 amit.gupta 309
 
32018 tejbeer 310
        return responseSender.ok(dealBrandsResponse);
311
    }
26607 amit.gupta 312
 
32018 tejbeer 313
    @RequestMapping(value = "/store/listing/{listingUrl}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
314
    public ResponseEntity<?> bestSellers(HttpServletRequest request, @PathVariable String listingUrl) throws Exception {
315
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
316
        WebListing webListing = webListingRepository.selectByUrl(listingUrl);
317
        webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
318
        return responseSender.ok(webListing);
319
    }
26654 amit.gupta 320
 
32018 tejbeer 321
    @RequestMapping(value = "/store/otp/generateOTP", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
322
    public ResponseEntity<?> generateOtp(HttpServletRequest request, @RequestParam String mobile) throws Exception {
26630 amit.gupta 323
 
32018 tejbeer 324
        return responseSender.ok(otpProcessor.generateOtp(mobile, OtpType.REGISTRATION));
26630 amit.gupta 325
 
32018 tejbeer 326
    }
26652 amit.gupta 327
 
32018 tejbeer 328
    @RequestMapping(value = "/store/checkmobile/{mobile}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
329
    public ResponseEntity<?> checkRegistrationUsingMobile(HttpServletRequest request, @PathVariable String mobile) throws Exception {
330
        try {
331
            Customer customer = customerRepository.selectByMobileNumber(mobile);
332
            customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
333
            return responseSender.ok(new CustomerModel(true, customer));
334
        } catch (Exception e) {
335
            return responseSender.ok(new CustomerModel(false, null));
336
        }
337
    }
26833 amit.gupta 338
 
34477 aman.kumar 339
 
32019 tejbeer 340
    @RequestMapping(value = "/store/getCustomerById/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
32018 tejbeer 341
    public ResponseEntity<?> getCustomerById(HttpServletRequest request, @PathVariable int id) throws Exception {
26774 amit.gupta 342
 
32018 tejbeer 343
        Customer customer = customerRepository.selectById(id);
344
        customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
32218 tejbeer 345
 
32018 tejbeer 346
        return responseSender.ok(customer);
26857 amit.gupta 347
 
32018 tejbeer 348
    }
26652 amit.gupta 349
 
32018 tejbeer 350
    @RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
351
    public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
352
        if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
353
            return responseSender.ok(true);
354
        } else {
355
            return responseSender.ok(false);
356
        }
357
    }
27028 tejbeer 358
 
32018 tejbeer 359
    @RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
34190 aman.kumar 360
    public ResponseEntity<?> resetPassword(@RequestBody UserModel userModel) throws Exception {
34247 aman.kumar 361
        if ((userModel.getMobile() == null || userModel.getMobile().isEmpty()) && (userModel.getPassword() == null || userModel.getPassword().isEmpty())) {
362
            throw new ProfitMandiBusinessException("error", "", "all field are required");
363
        }
34259 aman.kumar 364
        try {
365
            customerService.resetPassword(userModel.getMobile(), userModel.getPassword());
366
        } catch (ProfitMandiBusinessException p) {
367
            throw new ProfitMandiBusinessException("error", "", "An error occurred while resetting password");
368
        }
34247 aman.kumar 369
 
32018 tejbeer 370
        return responseSender.ok(true);
371
    }
34242 tejus.loha 372
 
34190 aman.kumar 373
    @RequestMapping(value = "/store/changePassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
374
    public ResponseEntity<?> changePassword(@RequestBody UserModel userModel) throws Exception {
34259 aman.kumar 375
        logger.info("UserModel - " + userModel);
376
        if ((userModel.getOldPassword() == null || userModel.getOldPassword().isEmpty()) && (userModel.getMobile() == null || userModel.getMobile().isEmpty()) && (userModel.getPassword() == null || userModel.getPassword().isEmpty())) {
34247 aman.kumar 377
            throw new ProfitMandiBusinessException("error", "", "all fields are required");
34190 aman.kumar 378
        }
34259 aman.kumar 379
        try {
380
            customerService.changePassword(userModel.getMobile(), userModel.getOldPassword(), userModel.getPassword());
381
        } catch (ProfitMandiBusinessException p) {
34247 aman.kumar 382
            throw new ProfitMandiBusinessException("error", "", "An error occurred while changing password");
383
        }
384
        return responseSender.ok(true);
34190 aman.kumar 385
    }
28339 tejbeer 386
 
32018 tejbeer 387
    @RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
388
    public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
389
        Customer customer = new Customer();
390
        customer.setPassword(userModel.getPassword());
391
        customer.setEmailId(userModel.getEmail());
392
        customer.setFirstName(userModel.getFirstName());
393
        customer.setLastName(userModel.getLastName());
394
        customer.setMobileNumber(userModel.getMobile());
395
        return responseSender.ok(customerService.addCustomer(customer));
396
    }
28339 tejbeer 397
 
33573 amit.gupta 398
    @RequestMapping(value = "/store/checkplans", method = RequestMethod.GET)
33436 ranu 399
    public ResponseEntity<?> getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
33573 amit.gupta 400
                                                @RequestParam int itemId) throws ProfitMandiBusinessException {
33399 ranu 401
        logger.info("Request received at url : {}", request.getRequestURI());
402
 
403
        try {
33436 ranu 404
            Map<String, List<MobileInsurancePlan>> response = this.getPlans(price, itemId);
405
            List<MobileInsurancePlan> combinedPlans = new ArrayList<>();
406
            for (List<MobileInsurancePlan> plans : response.values()) {
407
                combinedPlans.addAll(plans);
408
            }
409
            return responseSender.ok(combinedPlans);
33399 ranu 410
        } catch (Exception e) {
411
            logger.info(e.getMessage(), e);
412
            throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
413
        }
414
 
415
    }
416
 
417
    @Autowired
418
    InsuranceService insuranceService;
419
 
420
    private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId)
421
            throws ProfitMandiBusinessException {
422
        try {
33573 amit.gupta 423
            Map<String, List<MobileInsurancePlan>> productDurationPlans = insuranceService.getAllPlans(itemId, sellingPrice, true);
34822 ranu 424
            Map<String, List<MobileInsurancePlan>> filteredPlans = productDurationPlans.entrySet()
425
                    .stream()
426
                    .collect(Collectors.toMap(
427
                            Map.Entry::getKey,
428
                            e -> e.getValue().stream()
34823 ranu 429
                                    .filter(plan -> "5".equals(plan.getProviderId()))
34822 ranu 430
                                    .collect(Collectors.toList())
431
                    ));
432
            return filteredPlans;
33399 ranu 433
        } catch (Exception e) {
434
            logger.info(e, e);
34247 aman.kumar 435
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance", "Could not fetch insurance Plans");
33399 ranu 436
        }
437
 
438
    }
439
 
32018 tejbeer 440
    @RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
441
    public ResponseEntity<?> confirmOrder(HttpServletRequest request, @RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
442
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
443
        Integer storeId = userInfo.getRetailerId();
444
        createPendingOrderRequest.setFofoId(storeId);
445
        List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
446
        List<CartItem> cartItems = new ArrayList<>();
447
        pendingOrderItems.stream().forEach(x -> {
448
            CartItem ci = new CartItem();
449
            ci.setItemId(x.getItemId());
450
            ci.setQuantity(x.getQuantity());
451
            ci.setSellingPrice(x.getSellingPrice());
33436 ranu 452
            ci.setPendingOrderItemPolicyPlan(x.getPendingOrderItemPolicyPlan());
32018 tejbeer 453
            cartItems.add(ci);
454
        });
33573 amit.gupta 455
        logger.info("cartItems {}", cartItems);
32018 tejbeer 456
        CartResponse cr = this.validateCart(storeId, cartItems);
34239 vikas.jang 457
        logger.info("CartResponse cr {}", cr);
32018 tejbeer 458
        if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
34186 vikas.jang 459
            return responseSender.badRequest(cr.getCartMessages());
32018 tejbeer 460
        }
28377 tejbeer 461
 
32018 tejbeer 462
        Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
28377 tejbeer 463
 
32018 tejbeer 464
        PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
465
        if (offlineOrders.contains(pendingOrder.getPayMethod())) {
28391 tejbeer 466
 
32018 tejbeer 467
            Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
28400 tejbeer 468
 
32018 tejbeer 469
            CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
470
            Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
471
            String[] customerEmail = null;
472
            if (Utils.validateEmail(customer.getEmailId())) {
473
                customerEmail = new String[]{customer.getEmailId()};
474
            }
31203 tejbeer 475
 
32616 amit.gupta 476
            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 477
 
32018 tejbeer 478
            List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
479
            if (authUserEmails != null) {
480
                authUserEmails = new ArrayList<>();
481
            }
482
            logger.info("authUserEmails {}", authUserEmails);
483
            authUserEmails.addAll(bccTo);
484
            StringBuffer itemBuffer = new StringBuffer();
485
            List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
486
            int totalItems = 0;
487
            String itemNoColor = null;
488
            float maxValue = 0;
489
            for (PendingOrderItem orderItem : orderItems) {
490
                if (maxValue < orderItem.getSellingPrice()) {
491
                    maxValue = orderItem.getSellingPrice();
492
                    itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
493
                }
494
                totalItems += orderItem.getQuantity();
495
            }
496
            if (totalItems > 1) {
497
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
498
                itemBuffer.append(" +").append(totalItems - 1).append(" items");
499
            } else {
500
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
501
            }
502
            String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(), itemBuffer.toString(), pendingOrder.getTotalAmount());
503
            otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28377 tejbeer 504
 
32018 tejbeer 505
            emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
28377 tejbeer 506
 
32018 tejbeer 507
            List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
27028 tejbeer 508
 
32018 tejbeer 509
            emailIds.addAll(
510
                    csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_MARKETING, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3, EscalationType.L4)).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
511
            emailIds.add("tarun.verma@smartdukaan.com");
512
            emailIds.add("devkinandan.lal@smartdukaan.com");
34186 vikas.jang 513
            emailIds.add("vikas.jangra@smartdukaan.com");
32018 tejbeer 514
            List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
515
            List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
26630 amit.gupta 516
 
32018 tejbeer 517
            logger.info("userIds" + userIds);
518
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
519
            sendNotificationModel.setCampaignName("Online Order Alert");
520
            sendNotificationModel.setTitle("Online Order Update");
521
            sendNotificationModel.setMessage(String.format(
522
                    "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."));
523
            sendNotificationModel.setType("url");
524
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
525
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
526
            sendNotificationModel.setMessageType(MessageType.notification);
527
            int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
528
            sendNotificationModel.setUserIds(Arrays.asList(userId));
529
            notificationService.sendNotification(sendNotificationModel);
26857 amit.gupta 530
 
32018 tejbeer 531
            SendNotificationModel snm = new SendNotificationModel();
532
            snm.setCampaignName("Online Order Alert");
533
            snm.setTitle("Online Order Update");
534
            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."));
535
            snm.setType("url");
536
            snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
537
            snm.setExpiresat(LocalDateTime.now().plusDays(1));
538
            snm.setMessageType(MessageType.notification);
539
            snm.setUserIds(userIds);
540
            notificationService.sendNotification(snm);
26857 amit.gupta 541
 
32018 tejbeer 542
        }
543
        return responseSender.ok(returnMap);
26857 amit.gupta 544
 
32018 tejbeer 545
    }
546
    @RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
547
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
548
    @ApiOperation(value = "Get brand list and count for category")
549
    public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
550
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
551
        Integer storeId = userInfo.getRetailerId();
552
        CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
26923 amit.gupta 553
 
32018 tejbeer 554
        return responseSender.ok(customRetailer.getAddress());
28566 tejbeer 555
 
32018 tejbeer 556
    }
34190 aman.kumar 557
    @RequestMapping(value = "/store/address/defaultAddress/{addressId}/{customerId}", method = RequestMethod.POST)
558
    @ApiImplicitParams({
559
            @ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")
560
    })
561
    @ApiOperation(value = "Set default address for a store")
34259 aman.kumar 562
    public ResponseEntity<?> setDefaultAddress(HttpServletRequest request, @PathVariable int addressId, @PathVariable int customerId) throws Exception {
34190 aman.kumar 563
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
564
        CustomerAddress defaultAddress;
565
        try {
566
            defaultAddress = customerAddressRepository.selectById(addressId);
567
        } catch (ProfitMandiBusinessException e) {
568
            return responseSender.badRequest("Address not found.");
569
        }
570
        logger.info("CustomerID: {}", customerId);
571
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerId);
572
        logger.info("customerAddresses: {}", customerAddresses);
573
        for (CustomerAddress addr : customerAddresses) {
34259 aman.kumar 574
            if (addr.getDefault() ) {
34190 aman.kumar 575
                addr.setDefault(false);
576
            }
577
        }
578
        defaultAddress.setDefault(true);
579
        return responseSender.ok("Default address updated successfully.");
580
    }
28566 tejbeer 581
 
32018 tejbeer 582
    @RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
583
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
584
    @ApiOperation(value = "Get brand list and count for category")
585
    public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
586
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
587
        int fofoId = ProfitMandiConstants.DEFAULT_STORE;
588
        if (pincodePartners.size() > 0) {
589
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
590
            List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
591
            if (fofoStores.size() > 0) {
592
                fofoId = fofoStores.get(0).getId();
593
            }
28566 tejbeer 594
 
32018 tejbeer 595
        }
596
        return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
597
    }
28566 tejbeer 598
 
32018 tejbeer 599
    @RequestMapping(value = "/store/addresses", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
600
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
601
    @ApiOperation(value = "Get brand list and count for category")
602
    public ResponseEntity<?> getStoresByPincod(HttpServletRequest request, @RequestParam String pincode, @RequestParam(name = "fofoCode", defaultValue = "", required = false) String fofoCode) throws Exception {
28566 tejbeer 603
 
32018 tejbeer 604
        List<CustomRetailer> customerRetailers = new ArrayList<>();
28566 tejbeer 605
 
32018 tejbeer 606
        logger.info("fofoCode" + fofoCode);
30426 tejbeer 607
 
32018 tejbeer 608
        if (fofoCode != null) {
609
            FofoStore fs = fofoStoreRepository.selectByStoreCode(fofoCode.toUpperCase());
610
            PincodePartner pp = pincodePartnerRepository.selectPartnerByPincode(pincode, fs.getId());
611
            if (pp != null) {
612
                return responseSender.ok(customerRetailers.add(retailerService.getFofoRetailer(pp.getFofoId())));
613
            } else {
30426 tejbeer 614
 
32018 tejbeer 615
                List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
616
                if (pincodePartners.size() > 0) {
28566 tejbeer 617
 
32018 tejbeer 618
                    List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
619
                    List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 620
 
32018 tejbeer 621
                    Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 622
 
32018 tejbeer 623
                    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 624
 
32018 tejbeer 625
                    customerRetailers.addAll(customerRetailerMap.values());
30426 tejbeer 626
 
32018 tejbeer 627
                }
628
                return responseSender.ok(customerRetailers);
30426 tejbeer 629
 
32018 tejbeer 630
            }
631
        } else {
28566 tejbeer 632
 
32018 tejbeer 633
            List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
634
            if (pincodePartners.size() > 0) {
635
                List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
636
                List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 637
 
32018 tejbeer 638
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 639
 
32018 tejbeer 640
                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 641
 
32018 tejbeer 642
                customerRetailers.addAll(customerRetailerMap.values());
643
            }
28298 tejbeer 644
 
32018 tejbeer 645
            return responseSender.ok(customerRetailers);
30426 tejbeer 646
 
32018 tejbeer 647
        }
30426 tejbeer 648
 
32018 tejbeer 649
    }
30426 tejbeer 650
 
32018 tejbeer 651
    @RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
652
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
653
    @ApiOperation(value = "Get brand list and count for category")
654
    public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
655
        List<CustomRetailer> customerRetailers = new ArrayList<>();
656
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28298 tejbeer 657
 
32018 tejbeer 658
        if (!pincodePartners.isEmpty()) {
659
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
660
            List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28298 tejbeer 661
 
32018 tejbeer 662
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 663
 
32018 tejbeer 664
            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 665
 
32018 tejbeer 666
            customerRetailers.addAll(customerRetailerMap.values());
667
        }
27049 tejbeer 668
 
32018 tejbeer 669
        logger.info("customerRetailers" + customerRetailers);
670
        return responseSender.ok(customerRetailers);
671
    }
26855 tejbeer 672
 
32018 tejbeer 673
    @RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
674
    public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 675
 
676
        List<PendingOrderDetail> pendingOrderDetails = new ArrayList<>();
32018 tejbeer 677
        List<Integer> catalogIds = new ArrayList<>();
678
        List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
26855 tejbeer 679
 
32018 tejbeer 680
        if (!pendingOrders.isEmpty()) {
681
            for (PendingOrder po : pendingOrders) {
682
                List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
683
                for (PendingOrderItem pendingOrderItem : pois) {
684
                    Item item = itemRepository.selectById(pendingOrderItem.getItemId());
685
                    pendingOrderItem.setItemName(item.getItemDescription());
34287 vikas.jang 686
                    FofoOrderItem fofoItem = fofoOrderItemRepository.selectByPendingOrderItemId(pendingOrderItem.getId());
687
                    if (fofoItem != null) pendingOrderItem.setFofoOrderItem(fofoItem);
32018 tejbeer 688
                    catalogIds.add(item.getCatalogItemId());
689
                }
26855 tejbeer 690
 
32018 tejbeer 691
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
26855 tejbeer 692
 
32018 tejbeer 693
                for (PendingOrderItem poi : pois) {
33436 ranu 694
                    PendingOrderDetail pendingOrderDetail = new PendingOrderDetail();
32018 tejbeer 695
                    Item item = itemRepository.selectById(poi.getItemId());
34287 vikas.jang 696
                    if(contentMap.containsKey(item.getCatalogItemId())) {
697
                        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
698
                        pendingOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
699
                    } else {
700
                        pendingOrderDetail.setImageUrl(ProfitMandiConstants.NO_IMAGE);
701
                    }
33436 ranu 702
                    pendingOrderDetail.setBrand(item.getBrand());
703
                    pendingOrderDetail.setColor(item.getColor());
704
                    pendingOrderDetail.setPendingOrderItemId(poi.getId());
705
                    pendingOrderDetail.setId(poi.getOrderId());
34287 vikas.jang 706
                    if(poi.getFofoOrderItem() != null && poi.getFofoOrderItem().getOrderId() > 0) pendingOrderDetail.setFofoOrderId(poi.getFofoOrderItem().getOrderId());
33436 ranu 707
                    pendingOrderDetail.setItemId(poi.getItemId());
708
                    pendingOrderDetail.setModelName(item.getModelName());
709
                    pendingOrderDetail.setModelNumber(item.getModelNumber());
710
                    pendingOrderDetail.setQuantity(poi.getQuantity());
711
                    pendingOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
712
                    pendingOrderDetail.setStatus(poi.getStatus());
713
                    pendingOrderDetail.setTotalPrice(poi.getSellingPrice());
714
                    pendingOrderDetail.setPayMethod(po.getPayMethod());
715
                    pendingOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
716
                    pendingOrderDetail.setPendingOrderPlan(pendingOrderPlanRepository.selectByPoid(poi.getId()));
717
                    pendingOrderDetails.add(pendingOrderDetail);
32018 tejbeer 718
                }
719
            }
720
        }
28566 tejbeer 721
 
33436 ranu 722
        return responseSender.ok(pendingOrderDetails);
32018 tejbeer 723
    }
28566 tejbeer 724
 
32018 tejbeer 725
    @RequestMapping(value = "/store/invoiceOrder", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
726
    public ResponseEntity<?> getOrderInvoiceDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 727
        List<CustomerOrderAndInsuranceDetails> customerOrderAndInsuranceDetails = new ArrayList<>();
32018 tejbeer 728
        List<Integer> catalogIds = new ArrayList<>();
729
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectOrderByCustomerId(id, offset, limit);
28566 tejbeer 730
 
32018 tejbeer 731
        if (!fofoOrders.isEmpty()) {
732
            for (FofoOrder fo : fofoOrders) {
733
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fo.getId());
734
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
735
                    Item item = itemRepository.selectById(fofoOrderItem.getItemId());
736
                    fofoOrderItem.setItemName(item.getItemDescription());
737
                    catalogIds.add(item.getCatalogItemId());
738
                }
28566 tejbeer 739
 
32018 tejbeer 740
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
741
                for (FofoOrderItem foi : fofoOrderItems) {
33436 ranu 742
                    CustomerOrderAndInsuranceDetails customerOrderDetail = new CustomerOrderAndInsuranceDetails();
32018 tejbeer 743
                    Item item = itemRepository.selectById(foi.getItemId());
744
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
745
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
746
                    customerOrderDetail.setBrand(item.getBrand());
747
                    customerOrderDetail.setColor(item.getColor());
748
                    customerOrderDetail.setFofoOrderItemId(foi.getId());
749
                    customerOrderDetail.setFofoOrderId(foi.getOrderId());
750
                    customerOrderDetail.setItemId(foi.getItemId());
751
                    customerOrderDetail.setModelName(item.getModelName());
752
                    customerOrderDetail.setModelNumber(item.getModelNumber());
753
                    customerOrderDetail.setQuantity(foi.getQuantity());
754
                    customerOrderDetail.setTotalPrice(foi.getSellingPrice());
755
                    customerOrderDetail.setCreatedTimeStamp(foi.getCreateTimestamp());
756
                    customerOrderDetail.setInvoiceNumber(fo.getInvoiceNumber());
757
                    customerOrderDetail.setCancelledTimestamp(fo.getCancelledTimestamp());
33436 ranu 758
                    customerOrderDetail.setInsurancePolicies(insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fo.getInvoiceNumber()));
759
                    customerOrderAndInsuranceDetails.add(customerOrderDetail);
32018 tejbeer 760
                }
33436 ranu 761
 
32018 tejbeer 762
            }
28566 tejbeer 763
 
32018 tejbeer 764
        }
33436 ranu 765
        return responseSender.ok(customerOrderAndInsuranceDetails);
32018 tejbeer 766
    }
28566 tejbeer 767
 
32018 tejbeer 768
    @RequestMapping(value = "/store/generateInvoice", method = RequestMethod.GET)
769
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
770
        InvoicePdfModel pdfModel = null;
771
        FofoOrder fo = fofoOrderRepository.selectByOrderId(orderId);
772
        pdfModel = orderService.getInvoicePdfModel(fo.getFofoId(), orderId);
773
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
774
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
775
        try {
776
            byteArrayOutputStream.close();
777
        } catch (IOException e) {
778
            // TODO Auto-generated catch block
779
            e.printStackTrace();
780
        }
781
        final HttpHeaders headers = new HttpHeaders();
782
        headers.setContentType(MediaType.APPLICATION_PDF);
783
        // headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
26745 amit.gupta 784
 
32018 tejbeer 785
        headers.setContentType(MediaType.parseMediaType("application/pdf"));
786
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
787
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
788
        headers.add("Pragma", "no-cache");
789
        headers.add("Expires", "0");
28287 amit.gupta 790
 
32018 tejbeer 791
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
792
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
793
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
794
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
795
        // return responseSender.ok(new
796
        // ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(),
797
        // headers,HttpStatus.OK));
798
        /*
799
         * ResponseEntity<byte[]> response = new
800
         * ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(), headers,
801
         * HttpStatus.OK); return response;
802
         */
26923 amit.gupta 803
 
32018 tejbeer 804
    }
26607 amit.gupta 805
 
32018 tejbeer 806
    @RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
807
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
808
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
809
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32546 amit.gupta 810
        for (WebListing webListing : webListings) {
811
            webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
812
        }
813
        return responseSender.ok(webListings);
814
    }
33399 ranu 815
 
816
    @Autowired
817
    StateRepository stateRepository;
818
 
819
    @RequestMapping(value = "/store/stateList", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
820
    public ResponseEntity<?> getStateList(HttpServletRequest request) throws Exception {
821
        List<State> states = stateRepository.selectAll();
822
        return responseSender.ok(states);
823
    }
32546 amit.gupta 824
    /*@RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
825
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
826
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
827
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32544 amit.gupta 828
        Iterator<WebListing> webListingIterator = webListings.iterator();
829
        while (webListingIterator.hasNext()) {
830
            WebListing webListing = webListingIterator.next();
831
            List<FofoCatalogResponse> catalogResponses = getDealResponses(userInfo, webListing);
832
            boolean isAvailable = catalogResponses.stream().anyMatch(x->x.getItems().stream().anyMatch(y->y.getAvailability()>0));
32545 amit.gupta 833
            webListing.setFofoCatalogResponses(catalogResponses);
32544 amit.gupta 834
            if(!isAvailable) {
835
                webListings.remove(webListing);
836
            }
32018 tejbeer 837
        }
32544 amit.gupta 838
 
32018 tejbeer 839
        return responseSender.ok(webListings);
32546 amit.gupta 840
    }*/
26607 amit.gupta 841
 
32018 tejbeer 842
    private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing) throws ProfitMandiBusinessException {
843
        List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
844
        if (webProducts.size() == 0) {
845
            return new ArrayList<>();
846
        }
847
        RestClient rc = new RestClient();
848
        Map<String, String> params = new HashMap<>();
849
        List<String> mandatoryQ = new ArrayList<>();
850
        mandatoryQ.add(String.format(
33599 amit.gupta 851
                "+{!parent which=\"catalogId_i:(" + StringUtils.join(webProducts, " ") + ")\"} tagId_i:(%s)", StringUtils.join(TAG_IDS, " ")));
32018 tejbeer 852
        params.put("q", StringUtils.join(mandatoryQ, " "));
853
        params.put("fl", "*, [child parentFilter=id:catalog*]");
854
        // params.put("sort", "create_s desc");
855
        params.put("start", String.valueOf(0));
856
        params.put("rows", String.valueOf(100));
857
        params.put("wt", "json");
858
        String response = null;
859
        try {
33487 amit.gupta 860
            response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
32018 tejbeer 861
        } catch (HttpHostConnectException e) {
862
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
863
        }
864
        JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
865
        JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
866
        List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
867
        return dealResponse;
868
    }
26607 amit.gupta 869
 
32018 tejbeer 870
    @RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
871
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
872
    @ApiOperation(value = "Get brand list and count for category")
873
    public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest) throws Exception {
874
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
875
        Integer storeId = userInfo.getRetailerId();
876
        ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()), "Success", "Items added to cart successfully");
877
        return responseSender.ok(vc);
878
    }
26607 amit.gupta 879
 
32018 tejbeer 880
    // Validate Cart for B2C Customers
881
    private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
33436 ranu 882
 
33573 amit.gupta 883
        logger.info("cartItems {}", cartItems);
32018 tejbeer 884
        cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
885
        List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
886
        Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId, itemIds);
887
        CartResponse cartResponse = new CartResponse();
888
        List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
889
        cartResponse.setCartItems(cartItemResponseModels);
890
        Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
891
        logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 892
 
32018 tejbeer 893
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26652 amit.gupta 894
 
32018 tejbeer 895
        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 896
 
32018 tejbeer 897
        List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId()).collect(Collectors.toList());
26607 amit.gupta 898
 
32018 tejbeer 899
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27030 amit.gupta 900
 
32018 tejbeer 901
        // cartResponse.getCartItems()
902
        int cartMessageChanged = 0;
903
        int cartMessageOOS = 0;
904
        int totalAmount = 0;
905
        int totalQty = 0;
34186 vikas.jang 906
        List<CartMessage> itemMessages = new ArrayList<>();
32018 tejbeer 907
        for (CartItem cartItem : cartItems) {
908
            Item item = itemsMap.get(cartItem.getItemId());
34186 vikas.jang 909
            CartMessage itemMsg = new CartMessage();
32018 tejbeer 910
            TagListing tagListing = tagListingMap.get(cartItem.getItemId());
32977 amit.gupta 911
            int catalogId = itemsMap.get(cartItem.getItemId()).getCatalogItemId();
912
            Float cashback = schemeService.getCatalogSchemeCashBack(storeId, Arrays.asList(catalogId))
913
                    .get(itemsMap.get(cartItem.getItemId()).getCatalogItemId());
32018 tejbeer 914
            cashback = cashback == null ? 0 : cashback;
915
            float itemSellingPrice = tagListing.getMop() - cashback;
916
            CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
917
            cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
33436 ranu 918
            cartItemResponseModel.setPendingOrderItemPolicyPlan(cartItem.getPendingOrderItemPolicyPlan());
34259 aman.kumar 919
            logger.info("itemSellingPrice: {}", itemSellingPrice);
920
            logger.info("cartItem: {}", cartItem.getSellingPrice());
921
            logger.info("cashback: {}", cashback);
32018 tejbeer 922
            if (itemSellingPrice != cartItem.getSellingPrice()) {
34186 vikas.jang 923
                itemMsg.setType("price");
34259 aman.kumar 924
                itemMsg.setMessageText("Price has changed to " + itemSellingPrice);
32018 tejbeer 925
                cartItemResponseModel.setSellingPrice(itemSellingPrice);
926
                cartMessageChanged++;
927
            }
928
            int estimate = -2;
929
            LocalDateTime promiseDeliveryTime = LocalDateTime.now();
930
            int qtyRequired = (int) cartItem.getQuantity();
931
            AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
932
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
933
            if (availabilityModel.getStoreAvailability() >= qtyRequired) {
34239 vikas.jang 934
                itemMsg.setType("estimate0");
34259 aman.kumar 935
                itemMsg.setMessageText("Store availability is " + availabilityModel.getStoreAvailability());
32018 tejbeer 936
                estimate = 0;
937
            } else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
34239 vikas.jang 938
                itemMsg.setType("estimate2");
34259 aman.kumar 939
                itemMsg.setMessageText("Store availability is " + availabilityModel.getWarehouseAvailability());
32018 tejbeer 940
                estimate = 2;
941
            } else if (availabilityModel.getStoreAvailability() > 0) {
942
                estimate = 0;
943
                qtyRequired = availabilityModel.getStoreAvailability();
944
                cartMessageChanged++;
34186 vikas.jang 945
                itemMsg.setType("quantity0");
34259 aman.kumar 946
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 947
            } else if (availabilityModel.getWarehouseAvailability() > 0) {
948
                qtyRequired = availabilityModel.getWarehouseAvailability();
949
                estimate = 2;
950
                cartMessageChanged++;
34186 vikas.jang 951
                itemMsg.setType("quantity2");
34259 aman.kumar 952
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 953
            } else {
954
                qtyRequired = 0;
955
                cartMessageChanged++;
34186 vikas.jang 956
                itemMsg.setType("item");
957
                itemMsg.setMessageText(item.getItemDescriptionNoColor() + " is out of stock");
32018 tejbeer 958
            }
959
            cartItemResponseModel.setQuantity(qtyRequired);
960
            if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
961
                estimate = estimate + 1;
962
                promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
963
            }
964
            totalQty += qtyRequired;
33573 amit.gupta 965
            if (cartItem.getPendingOrderItemPolicyPlan() != null) {
966
                totalAmount += qtyRequired * itemSellingPrice + qtyRequired * cartItem.getPendingOrderItemPolicyPlan().getPrice();
967
            } else {
33436 ranu 968
                totalAmount += qtyRequired * itemSellingPrice;
969
            }
970
 
32018 tejbeer 971
            cartItemResponseModel.setEstimate(estimate);
972
            cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
973
            cartItemResponseModel.setItemId(cartItem.getItemId());
974
            cartItemResponseModel.setMinBuyQuantity(1);
975
            cartItemResponseModel.setQuantity(qtyRequired);
976
            cartItemResponseModel.setQuantityStep(1);
977
            cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
978
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
979
            cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
980
            cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
981
            cartItemResponseModel.setColor(item.getColor());
982
            cartItemResponseModels.add(cartItemResponseModel);
34186 vikas.jang 983
            itemMessages.add(itemMsg);
32018 tejbeer 984
        }
985
        cartResponse.setCartItems(cartItemResponseModels);
34186 vikas.jang 986
        cartResponse.setCartMessages(itemMessages);
32018 tejbeer 987
        cartResponse.setCartMessageChanged(cartMessageChanged);
988
        cartResponse.setCartMessageOOS(cartMessageOOS);
989
        int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
990
        cartResponse.setMaxEstimate(maxEstimate);
991
        cartResponse.setTotalAmount(totalAmount);
992
        cartResponse.setTotalQty(totalQty);
26607 amit.gupta 993
 
32018 tejbeer 994
        return cartResponse;
26923 amit.gupta 995
 
32018 tejbeer 996
    }
27069 tejbeer 997
 
32018 tejbeer 998
    @RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
33573 amit.gupta 999
    public ResponseEntity<?> partnerStock(HttpServletRequest request, @RequestParam(required = false, defaultValue = "3") String categoryId, @RequestParam int offset,
34444 vikas.jang 1000
      @RequestParam int limit, @RequestParam(required = false) String sort, @RequestParam(required = false) String brand,
1001
      @RequestParam(value = "subCategoryId", required = false) int subCategoryId, @RequestParam(required = false) String queryTerm,
1002
      @RequestParam(required = false) String listing, @RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
32018 tejbeer 1003
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
1004
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1005
        FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
1006
        sort = "w" + fs.getWarehouseId() + "_i desc";
1007
        dealResponse = this.getCatalogResponse(
34024 vikas.jang 1008
                commonSolrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false, false), false, userInfo.getRetailerId());
32018 tejbeer 1009
        return responseSender.ok(dealResponse);
1010
    }
26923 amit.gupta 1011
 
32018 tejbeer 1012
    private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws ProfitMandiBusinessException {
1013
        Map<Integer, Integer> ourItemAvailabilityMap = null;
1014
        Map<Integer, Integer> partnerStockAvailabilityMap = null;
1015
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
1016
        List<Integer> tagIds = Arrays.asList(4);
1017
        if (docs.length() > 0) {
1018
            HashSet<Integer> itemsSet = new HashSet<>();
1019
            for (int i = 0; i < docs.length(); i++) {
1020
                JSONObject doc = docs.getJSONObject(i);
1021
                if (doc.has("_childDocuments_")) {
1022
                    for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1023
                        JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1024
                        int itemId = childItem.getInt("itemId_i");
1025
                        itemsSet.add(itemId);
1026
                    }
1027
                }
1028
            }
1029
            if (itemsSet.size() == 0) {
1030
                return dealResponse;
1031
            }
1032
            if (fofoId > 0) {
1033
                partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1034
            }
1035
            ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
1036
        }
26833 amit.gupta 1037
 
32018 tejbeer 1038
        for (int i = 0; i < docs.length(); i++) {
1039
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
1040
            JSONObject doc = docs.getJSONObject(i);
1041
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
1042
            ffdr.setCatalogId(doc.getInt("catalogId_i"));
1043
            ffdr.setImageUrl(doc.getString("imageUrl_s"));
1044
            ffdr.setTitle(doc.getString("title_s"));
34239 vikas.jang 1045
            ffdr.setSuperCatalogTitle(doc.getString("superCatalog_s"));
1046
            ffdr.setSuperCatalogId(doc.getInt("superCatalog_i"));
1047
            ffdr.setSuperCatalogVariants(doc.getString("superCatalogVariants_s"));
32018 tejbeer 1048
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
1049
            if (webOffers != null && webOffers.size() > 0) {
1050
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
1051
            }
1052
            try {
1053
                ffdr.setFeature(doc.getString("feature_s"));
1054
            } catch (Exception e) {
1055
                ffdr.setFeature(null);
1056
            }
1057
            ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
33314 ranu 1058
 
32018 tejbeer 1059
            if (doc.has("_childDocuments_")) {
1060
                for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1061
                    JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1062
                    int itemId = childItem.getInt("itemId_i");
33314 ranu 1063
                    ffdr.setIsSmartPhone(itemRepository.selectById(itemId).isSmartPhone());
32018 tejbeer 1064
                    float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
1065
                    if (fofoAvailabilityInfoMap.containsKey(itemId)) {
1066
                        if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
1067
                            fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
1068
                            fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
1069
                        }
1070
                    } else {
1071
                        FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
1072
                        fdi.setSellingPrice(sellingPrice);
1073
                        fdi.setMrp(childItem.getDouble("mrp_f"));
1074
                        fdi.setMop((float) childItem.getDouble("mop_f"));
1075
                        fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
1076
                        fdi.setTagId(childItem.getInt("tagId_i"));
1077
                        fdi.setItem_id(itemId);
34196 ranu 1078
                        fdi.setCatalog_id(doc.getInt("catalogId_i"));
32977 amit.gupta 1079
                        Float cashBack = schemeService.getCatalogSchemeCashBack(fofoId, Arrays.asList(ffdr.getCatalogId())).get(ffdr.getCatalogId());
32018 tejbeer 1080
                        cashBack = cashBack == null ? 0 : cashBack;
1081
                        // TODO:Dont commit
1082
                        // fdi.setCashback(Math.min(100, fdi.getMop()));
1083
                        fdi.setCashback(cashBack);
1084
                        fdi.setMinBuyQuantity(1);
1085
                        int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0 : partnerStockAvailabilityMap.get(itemId);
1086
                        int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0 : Math.max(0, ourItemAvailabilityMap.get(itemId));
1087
                        fdi.setActive(partnerAvailability > 0);
1088
                        // fdi.setActive(true);
34239 vikas.jang 1089
                        fdi.setPartnerAvailability(partnerAvailability);
32018 tejbeer 1090
                        fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
1091
                        fdi.setQuantityStep(1);
1092
                        fdi.setMaxQuantity(fdi.getAvailability());
1093
                        fofoAvailabilityInfoMap.put(itemId, fdi);
1094
                    }
1095
                }
1096
            }
1097
            if (fofoAvailabilityInfoMap.values().size() > 0) {
1098
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder()).thenComparingInt(y -> -y.getAvailability())).collect(Collectors.toList()));
1099
                dealResponse.add(ffdr);
1100
            }
1101
        }
1102
        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());
1103
    }
26857 amit.gupta 1104
 
32018 tejbeer 1105
    @GetMapping(value = "store/order-status/{pendingOrderId}")
1106
    public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId) throws Exception {
1107
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
1108
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
1109
        List<Integer> catalogIds = new ArrayList<>();
1110
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
34477 aman.kumar 1111
            //TODO : Amit feedback use poItemId instead of poId change Param name
1112
            // when list is supposed then use method names as selectAllBy instead selectBy of
1113
            //check for unique constraint
1114
            List<PendingOrderPlan> policyPlans = pendingOrderPlanRepository.selectByPoId(pendingOrderItem.getId());
1115
            pendingOrderItem.setPendingOrderItemPolicyPlan(policyPlans);
32018 tejbeer 1116
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1117
            pendingOrderItem.setItemName(item.getItemDescription());
34186 vikas.jang 1118
            pendingOrderItem.setCatalogId(item.getCatalogItemId());
32018 tejbeer 1119
            catalogIds.add(item.getCatalogItemId());
1120
        }
1121
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1122
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1123
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1124
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1125
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1126
        }
1127
        pendingOrder.setPendingOrderItems(pendingOrderItems);
27045 tejbeer 1128
 
32018 tejbeer 1129
        return responseSender.ok(pendingOrder);
1130
    }
28345 tejbeer 1131
 
32018 tejbeer 1132
    @RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
1133
    public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
1134
        return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
1135
    }
26861 tejbeer 1136
 
32018 tejbeer 1137
    @RequestMapping(value = "/store/address", method = RequestMethod.POST)
1138
    public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress) throws Throwable {
34259 aman.kumar 1139
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerAddress.getCustomerId());
1140
        if (customerAddresses.isEmpty()) {
1141
            customerAddress.setDefault(true);
1142
        } else {
1143
            customerAddress.setDefault(false);
1144
        }
32018 tejbeer 1145
        customerAddressRepository.persist(customerAddress);
1146
        return responseSender.ok(customerAddress);
1147
    }
27045 tejbeer 1148
 
32018 tejbeer 1149
    @RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
1150
    public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
1151
        CustomerAddress cust = customerAddressRepository.selectById(id);
34259 aman.kumar 1152
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByCustomerId(cust.getCustomerId());
32018 tejbeer 1153
        cust.setActive(false);
34259 aman.kumar 1154
        if(cust.getDefault()){
1155
            List<CustomerAddress> activeAddresses = customerAddresses.stream()
1156
                    .filter(a -> a.getActive() && a.getId() != id)
1157
                    .sorted(Comparator.comparing(CustomerAddress::getUpdateTimestamp).reversed())
1158
                    .collect(Collectors.toList());
1159
 
1160
            if (!activeAddresses.isEmpty()) {
1161
                CustomerAddress newDefault = activeAddresses.get(0);
1162
                newDefault.setDefault(true);
1163
            }
1164
        }
32018 tejbeer 1165
        return responseSender.ok(cust);
1166
    }
27048 tejbeer 1167
 
32018 tejbeer 1168
    @RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
1169
    public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer) throws Throwable {
1170
        Customer cust = customerRepository.selectById(customer.getId());
1171
        cust.setGender(customer.getGender());
1172
        cust.setProfileImageId(customer.getProfileImageId());
34186 vikas.jang 1173
        cust.setEmailId(customer.getEmailId());
32018 tejbeer 1174
        cust.setDob(customer.getDob());
1175
        return responseSender.ok(cust);
1176
    }
27048 tejbeer 1177
 
32018 tejbeer 1178
    @RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
1179
    public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state, @PathVariable String city, @PathVariable String storeCode) throws Throwable {
1180
        logger.info("Store code {}", storeCode);
1181
        Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
1182
        logger.info("retailer id {}", map.get(storeCode));
1183
        String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
1184
        String html = partnerIndexService.getPartnerIndexHtml();
1185
        logger.info("html {}", html);
1186
        html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan", String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
1187
        response.getWriter().write(html);
1188
    }
27048 tejbeer 1189
 
32018 tejbeer 1190
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
34186 vikas.jang 1191
    public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String statusDescription, @RequestParam String reason) throws Exception {
28339 tejbeer 1192
 
32018 tejbeer 1193
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1194
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1195
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1196
        if (pendingOrderItem.getBilledTimestamp() == null) {
1197
            pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1198
            pendingOrderItem.setRemark(reason);
1199
            pendingOrderItem.setStatusDescription("cancel by self");
1200
            pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1201
            List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream().map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1202
 
32018 tejbeer 1203
            if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING) && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED) && !status.contains(OrderStatus.CLAIMED)) {
1204
                pendingOrder.setStatus(OrderStatus.CLOSED);
1205
            }
28339 tejbeer 1206
 
32018 tejbeer 1207
            pendingOrderItemRepository.persist(pendingOrderItem);
1208
            String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
1209
            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 1210
 
32018 tejbeer 1211
            List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1212
 
32018 tejbeer 1213
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1214
            pendingOrderItem.setItemName(item.getItemDescription());
1215
            catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1216
 
32018 tejbeer 1217
            Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1218
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1219
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1220
            pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1221
            CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28355 tejbeer 1222
 
32018 tejbeer 1223
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1224
 
32018 tejbeer 1225
            Map<String, Object> emailModel = new HashMap<>();
1226
            emailModel.put("customer", customerAddress);
1227
            emailModel.put("pendingOrder", pendingOrder);
1228
            emailModel.put("date", dateTimeFormatter);
27048 tejbeer 1229
 
32018 tejbeer 1230
            String[] customerEmail = null;
1231
            if (customer.getEmailId() != null) {
1232
                customerEmail = new String[]{customer.getEmailId()};
27048 tejbeer 1233
 
34186 vikas.jang 1234
                List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
29515 tejbeer 1235
 
32018 tejbeer 1236
                emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
29515 tejbeer 1237
 
32018 tejbeer 1238
            }
1239
        }
29515 tejbeer 1240
 
32018 tejbeer 1241
        return responseSender.ok(true);
29515 tejbeer 1242
 
32018 tejbeer 1243
    }
31444 tejbeer 1244
 
32018 tejbeer 1245
    @RequestMapping(value = "/store/checkEligibilityStoreOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1246
    public ResponseEntity<?> checkEligibilityStoreOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1247
 
32018 tejbeer 1248
        boolean eligibility = false;
29515 tejbeer 1249
 
34186 vikas.jang 1250
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1251
 
32018 tejbeer 1252
        if (!scratchOffers.isEmpty()) {
1253
            eligibility = true;
31457 tejbeer 1254
 
32018 tejbeer 1255
        }
1256
        return responseSender.ok(eligibility);
1257
    }
29515 tejbeer 1258
 
32018 tejbeer 1259
    @RequestMapping(value = "/store/ScratchOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1260
    public ResponseEntity<?> scratchOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1261
 
34186 vikas.jang 1262
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1263
 
32218 tejbeer 1264
        logger.info("scratchOffers {}", scratchOffers);
32018 tejbeer 1265
        // List<ScratchOffer> scratchOffers =
1266
        // scratchOfferRepository.selectBycCustomerId(id);
1267
        for (ScratchOffer so : scratchOffers) {
1268
            if (LocalDateTime.now().isAfter(so.getUnlockedAt())) {
1269
                so.setUnlocked(true);
1270
            } else {
1271
                so.setUnlocked(false);
1272
            }
34371 ranu 1273
            LocalDateTime expiredTimestamp = ProfitMandiConstants.SCRATCH_OFFER_END_DATE.plusDays(0).atTime(LocalTime.MAX);
32671 ranu 1274
            so.setExpiredTimestamp(expiredTimestamp);
33573 amit.gupta 1275
            if (LocalDateTime.now().isAfter(expiredTimestamp)) {
32671 ranu 1276
                so.setExpired(true);
1277
            }
32018 tejbeer 1278
        }
29515 tejbeer 1279
 
32018 tejbeer 1280
        return responseSender.ok(scratchOffers);
1281
    }
1282
 
1283
    @RequestMapping(value = "/store/ScratchedOffer", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1284
    public ResponseEntity<?> scratchedOffer(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
1285
 
1286
        ScratchOffer scratchOffer = scratchOfferRepository.selectById(id);
1287
        scratchOffer.setScratched(true);
1288
        scratchOffer.setScracthedAt(LocalDateTime.now());
1289
 
1290
        return responseSender.ok(true);
1291
    }
1292
 
34242 tejus.loha 1293
    @RequestMapping(value = "/store/navbar", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1294
    public ResponseEntity<?> navBars() throws Exception {
1295
        List<NavBar> navBars = navBarRepository.selectAllActive();
1296
        return responseSender.ok(navBars);
1297
    }
1298
 
34444 vikas.jang 1299
    @RequestMapping(value = "/store/clearance", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1300
    public ResponseEntity<?> getLiquidations() throws Exception {
1301
        List<Integer> catalogIds = new ArrayList<>();
1302
        Map<Integer, JSONObject> contentMap = null;
34545 vikas.jang 1303
        List<Liquidation> liquidations = liquidationRepository.selectAllByStatus(ProfitMandiConstants.LIQUIDATION_ENUM.PUBLISHED);
34242 tejus.loha 1304
 
34444 vikas.jang 1305
        if (!liquidations.isEmpty()) {
1306
            for (Liquidation liquidation : liquidations) catalogIds.add(liquidation.getCatalogId());
1307
            contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1308
        }
1309
 
1310
        List<LiquidationDetail> resultList = new ArrayList<>();
1311
 
1312
        if (contentMap != null) {
1313
            for (Liquidation liquidation : liquidations) {
1314
                List<Bid> bidList = bidRepository.selectBidByLiquidationId(liquidation.getId());
1315
                LiquidationDetail liquidationDetail = new LiquidationDetail();
1316
                if(contentMap.containsKey(liquidation.getCatalogId())) {
1317
                    JSONObject jsonObj = contentMap.get(liquidation.getCatalogId());
1318
                    liquidationDetail.setLiquidationId(liquidation.getId());
1319
                    liquidationDetail.setImageURL(jsonObj.getString("imageUrl_s"));
1320
                    liquidationDetail.setItemName(jsonObj.getString("title_s"));
1321
                    liquidationDetail.setBrand(jsonObj.getString("title_s"));
1322
                    liquidationDetail.setCatalogId(jsonObj.getInt("catalogId_i"));
1323
                    liquidationDetail.setMrp(jsonObj.getFloat("mop_f"));
1324
                    liquidationDetail.setMop(jsonObj.getFloat("mop_f"));
1325
                    liquidationDetail.setDp(jsonObj.getFloat("dp_f"));
1326
                    liquidationDetail.setSuperCatalogs(jsonObj.getString("superCatalogVariants_s"));
1327
                    liquidationDetail.setStartDate(liquidation.getStartDate());
1328
                    liquidationDetail.setEndDate(liquidation.getEndDate());
1329
                    liquidationDetail.setSellingPrice(liquidation.getPrice());
1330
                    liquidationDetail.setAvailableQuantity(liquidation.getQuantity());
34494 vikas.jang 1331
                    liquidationDetail.setIncrementStep(liquidation.getIncrementStep());
34444 vikas.jang 1332
                    liquidationDetail.setBidList(bidList);
1333
                    resultList.add(liquidationDetail);
1334
                }
1335
            }
1336
        }
1337
 
1338
        return responseSender.ok(resultList);
1339
    }
1340
 
1341
    @RequestMapping(value = "/store/clearance/bid", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1342
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
1343
    public ResponseEntity<?> saveBidding(HttpServletRequest request, @RequestBody BiddingModel biddingModel) throws Exception {
34446 vikas.jang 1344
        LocalDateTime now = LocalDateTime.now();
34476 vikas.jang 1345
        Liquidation liquidation = liquidationRepository.selectLiquidationById(biddingModel.getLiquidationId());
1346
        LocalDateTime endDateTime = LocalDateTime.of(liquidation.getEndDate().toLocalDate(), LocalTime.of(ProfitMandiConstants.BID_END_HOUR, ProfitMandiConstants.BID_END_MIN));
34494 vikas.jang 1347
        List<Bid> biddings = bidRepository.selectBidByLiquidationId(biddingModel.getLiquidationId());
34476 vikas.jang 1348
        if (now.isAfter(endDateTime)) {
34494 vikas.jang 1349
            return responseSender.badRequest("Bid on this product has been closed");
34446 vikas.jang 1350
        }
34444 vikas.jang 1351
        Bid bid = null;
1352
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1353
        if (biddingModel.getId() != null && biddingModel.getId() > 0) {
1354
            bid = bidRepository.selectById(biddingModel.getId());
1355
            if (bid == null) {
34494 vikas.jang 1356
                return responseSender.badRequest("Bidding record not found with ID: " + biddingModel.getId());
34444 vikas.jang 1357
            }
1358
        } else {
1359
            bid = new Bid();
1360
        }
34476 vikas.jang 1361
        logger.info("biddingModel {}: ",biddingModel);
34444 vikas.jang 1362
        bid.setLiquidationId(biddingModel.getLiquidationId());
1363
        bid.setBiddingAmount(biddingModel.getBiddingAmount());
1364
        bid.setFofoId(userInfo.getRetailerId());
1365
        bid.setItemName(biddingModel.getItemName());
1366
        bid.setQuantity(biddingModel.getBidQty());
1367
        bid.setStatus(ProfitMandiConstants.BID_ENUM.PENDING);
1368
        bid.setCreatedAt(LocalDateTime.now());
34562 ranu 1369
        if (biddingModel.getId() == null) {
1370
            bidRepository.persist(bid);
34654 vikas.jang 1371
            //debit 500 from wallet
1372
            String reason = "Advance security for "+bid.getItemName()+" bid";
1373
            String message = "Dear Partner - We have Debited Rs "+ProfitMandiConstants.BID_CHARGES+" as Booking amount against your Bidding of Model No. "+bid.getItemName()+". We will refund this amount if the Bid gets approved.";
1374
            walletService.consumeAmountFromWallet(bid.getFofoId(),
1375
                    bid.getId(),
1376
                    WalletReferenceType.ADVANCE_SECURITY,
1377
                    reason, ProfitMandiConstants.BID_CHARGES,
1378
                    bid.getCreatedAt(),true);
1379
            bidService.sendPushNotification(message,"Bidding Update!",Arrays.asList(bid.getFofoId()));
34562 ranu 1380
        }
34494 vikas.jang 1381
        if (biddings.size() > 1) {
1382
            for (Bid bidding : biddings) {
34562 ranu 1383
                if (!(bid.getFofoId().equals(bidding.getFofoId()))) bidService.notifyPartner(bidding.getFofoId(), bid, ProfitMandiConstants.BID_ENUM.UPDATE);
34494 vikas.jang 1384
            }
1385
        }
1386
        return responseSender.ok("Bid placed successfully!");
34444 vikas.jang 1387
    }
1388
 
1389
 
26607 amit.gupta 1390
}