Subversion Repositories SmartDukaan

Rev

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