Subversion Repositories SmartDukaan

Rev

Rev 34562 | Rev 34822 | 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);
33399 ranu 424
            return productDurationPlans;
425
        } catch (Exception e) {
426
            logger.info(e, e);
34247 aman.kumar 427
            throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance", "Could not fetch insurance Plans");
33399 ranu 428
        }
429
 
430
    }
431
 
32018 tejbeer 432
    @RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
433
    public ResponseEntity<?> confirmOrder(HttpServletRequest request, @RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
434
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
435
        Integer storeId = userInfo.getRetailerId();
436
        createPendingOrderRequest.setFofoId(storeId);
437
        List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
438
        List<CartItem> cartItems = new ArrayList<>();
439
        pendingOrderItems.stream().forEach(x -> {
440
            CartItem ci = new CartItem();
441
            ci.setItemId(x.getItemId());
442
            ci.setQuantity(x.getQuantity());
443
            ci.setSellingPrice(x.getSellingPrice());
33436 ranu 444
            ci.setPendingOrderItemPolicyPlan(x.getPendingOrderItemPolicyPlan());
32018 tejbeer 445
            cartItems.add(ci);
446
        });
33573 amit.gupta 447
        logger.info("cartItems {}", cartItems);
32018 tejbeer 448
        CartResponse cr = this.validateCart(storeId, cartItems);
34239 vikas.jang 449
        logger.info("CartResponse cr {}", cr);
32018 tejbeer 450
        if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
34186 vikas.jang 451
            return responseSender.badRequest(cr.getCartMessages());
32018 tejbeer 452
        }
28377 tejbeer 453
 
32018 tejbeer 454
        Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
28377 tejbeer 455
 
32018 tejbeer 456
        PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
457
        if (offlineOrders.contains(pendingOrder.getPayMethod())) {
28391 tejbeer 458
 
32018 tejbeer 459
            Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
28400 tejbeer 460
 
32018 tejbeer 461
            CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
462
            Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
463
            String[] customerEmail = null;
464
            if (Utils.validateEmail(customer.getEmailId())) {
465
                customerEmail = new String[]{customer.getEmailId()};
466
            }
31203 tejbeer 467
 
32616 amit.gupta 468
            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 469
 
32018 tejbeer 470
            List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
471
            if (authUserEmails != null) {
472
                authUserEmails = new ArrayList<>();
473
            }
474
            logger.info("authUserEmails {}", authUserEmails);
475
            authUserEmails.addAll(bccTo);
476
            StringBuffer itemBuffer = new StringBuffer();
477
            List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
478
            int totalItems = 0;
479
            String itemNoColor = null;
480
            float maxValue = 0;
481
            for (PendingOrderItem orderItem : orderItems) {
482
                if (maxValue < orderItem.getSellingPrice()) {
483
                    maxValue = orderItem.getSellingPrice();
484
                    itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
485
                }
486
                totalItems += orderItem.getQuantity();
487
            }
488
            if (totalItems > 1) {
489
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
490
                itemBuffer.append(" +").append(totalItems - 1).append(" items");
491
            } else {
492
                itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
493
            }
494
            String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(), itemBuffer.toString(), pendingOrder.getTotalAmount());
495
            otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28377 tejbeer 496
 
32018 tejbeer 497
            emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
28377 tejbeer 498
 
32018 tejbeer 499
            List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
27028 tejbeer 500
 
32018 tejbeer 501
            emailIds.addAll(
502
                    csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_MARKETING, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3, EscalationType.L4)).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
503
            emailIds.add("tarun.verma@smartdukaan.com");
504
            emailIds.add("devkinandan.lal@smartdukaan.com");
34186 vikas.jang 505
            emailIds.add("vikas.jangra@smartdukaan.com");
32018 tejbeer 506
            List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
507
            List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
26630 amit.gupta 508
 
32018 tejbeer 509
            logger.info("userIds" + userIds);
510
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
511
            sendNotificationModel.setCampaignName("Online Order Alert");
512
            sendNotificationModel.setTitle("Online Order Update");
513
            sendNotificationModel.setMessage(String.format(
514
                    "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."));
515
            sendNotificationModel.setType("url");
516
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
517
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
518
            sendNotificationModel.setMessageType(MessageType.notification);
519
            int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
520
            sendNotificationModel.setUserIds(Arrays.asList(userId));
521
            notificationService.sendNotification(sendNotificationModel);
26857 amit.gupta 522
 
32018 tejbeer 523
            SendNotificationModel snm = new SendNotificationModel();
524
            snm.setCampaignName("Online Order Alert");
525
            snm.setTitle("Online Order Update");
526
            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."));
527
            snm.setType("url");
528
            snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
529
            snm.setExpiresat(LocalDateTime.now().plusDays(1));
530
            snm.setMessageType(MessageType.notification);
531
            snm.setUserIds(userIds);
532
            notificationService.sendNotification(snm);
26857 amit.gupta 533
 
32018 tejbeer 534
        }
535
        return responseSender.ok(returnMap);
26857 amit.gupta 536
 
32018 tejbeer 537
    }
538
    @RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
539
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
540
    @ApiOperation(value = "Get brand list and count for category")
541
    public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
542
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
543
        Integer storeId = userInfo.getRetailerId();
544
        CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
26923 amit.gupta 545
 
32018 tejbeer 546
        return responseSender.ok(customRetailer.getAddress());
28566 tejbeer 547
 
32018 tejbeer 548
    }
34190 aman.kumar 549
    @RequestMapping(value = "/store/address/defaultAddress/{addressId}/{customerId}", method = RequestMethod.POST)
550
    @ApiImplicitParams({
551
            @ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")
552
    })
553
    @ApiOperation(value = "Set default address for a store")
34259 aman.kumar 554
    public ResponseEntity<?> setDefaultAddress(HttpServletRequest request, @PathVariable int addressId, @PathVariable int customerId) throws Exception {
34190 aman.kumar 555
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
556
        CustomerAddress defaultAddress;
557
        try {
558
            defaultAddress = customerAddressRepository.selectById(addressId);
559
        } catch (ProfitMandiBusinessException e) {
560
            return responseSender.badRequest("Address not found.");
561
        }
562
        logger.info("CustomerID: {}", customerId);
563
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerId);
564
        logger.info("customerAddresses: {}", customerAddresses);
565
        for (CustomerAddress addr : customerAddresses) {
34259 aman.kumar 566
            if (addr.getDefault() ) {
34190 aman.kumar 567
                addr.setDefault(false);
568
            }
569
        }
570
        defaultAddress.setDefault(true);
571
        return responseSender.ok("Default address updated successfully.");
572
    }
28566 tejbeer 573
 
32018 tejbeer 574
    @RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
575
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
576
    @ApiOperation(value = "Get brand list and count for category")
577
    public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
578
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
579
        int fofoId = ProfitMandiConstants.DEFAULT_STORE;
580
        if (pincodePartners.size() > 0) {
581
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
582
            List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
583
            if (fofoStores.size() > 0) {
584
                fofoId = fofoStores.get(0).getId();
585
            }
28566 tejbeer 586
 
32018 tejbeer 587
        }
588
        return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
589
    }
28566 tejbeer 590
 
32018 tejbeer 591
    @RequestMapping(value = "/store/addresses", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
592
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
593
    @ApiOperation(value = "Get brand list and count for category")
594
    public ResponseEntity<?> getStoresByPincod(HttpServletRequest request, @RequestParam String pincode, @RequestParam(name = "fofoCode", defaultValue = "", required = false) String fofoCode) throws Exception {
28566 tejbeer 595
 
32018 tejbeer 596
        List<CustomRetailer> customerRetailers = new ArrayList<>();
28566 tejbeer 597
 
32018 tejbeer 598
        logger.info("fofoCode" + fofoCode);
30426 tejbeer 599
 
32018 tejbeer 600
        if (fofoCode != null) {
601
            FofoStore fs = fofoStoreRepository.selectByStoreCode(fofoCode.toUpperCase());
602
            PincodePartner pp = pincodePartnerRepository.selectPartnerByPincode(pincode, fs.getId());
603
            if (pp != null) {
604
                return responseSender.ok(customerRetailers.add(retailerService.getFofoRetailer(pp.getFofoId())));
605
            } else {
30426 tejbeer 606
 
32018 tejbeer 607
                List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
608
                if (pincodePartners.size() > 0) {
28566 tejbeer 609
 
32018 tejbeer 610
                    List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
611
                    List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 612
 
32018 tejbeer 613
                    Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 614
 
32018 tejbeer 615
                    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 616
 
32018 tejbeer 617
                    customerRetailers.addAll(customerRetailerMap.values());
30426 tejbeer 618
 
32018 tejbeer 619
                }
620
                return responseSender.ok(customerRetailers);
30426 tejbeer 621
 
32018 tejbeer 622
            }
623
        } else {
28566 tejbeer 624
 
32018 tejbeer 625
            List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
626
            if (pincodePartners.size() > 0) {
627
                List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
628
                List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28566 tejbeer 629
 
32018 tejbeer 630
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 631
 
32018 tejbeer 632
                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 633
 
32018 tejbeer 634
                customerRetailers.addAll(customerRetailerMap.values());
635
            }
28298 tejbeer 636
 
32018 tejbeer 637
            return responseSender.ok(customerRetailers);
30426 tejbeer 638
 
32018 tejbeer 639
        }
30426 tejbeer 640
 
32018 tejbeer 641
    }
30426 tejbeer 642
 
32018 tejbeer 643
    @RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
644
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
645
    @ApiOperation(value = "Get brand list and count for category")
646
    public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode) throws Exception {
647
        List<CustomRetailer> customerRetailers = new ArrayList<>();
648
        List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28298 tejbeer 649
 
32018 tejbeer 650
        if (!pincodePartners.isEmpty()) {
651
            List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
652
            List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
28298 tejbeer 653
 
32018 tejbeer 654
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
28566 tejbeer 655
 
32018 tejbeer 656
            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 657
 
32018 tejbeer 658
            customerRetailers.addAll(customerRetailerMap.values());
659
        }
27049 tejbeer 660
 
32018 tejbeer 661
        logger.info("customerRetailers" + customerRetailers);
662
        return responseSender.ok(customerRetailers);
663
    }
26855 tejbeer 664
 
32018 tejbeer 665
    @RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
666
    public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 667
 
668
        List<PendingOrderDetail> pendingOrderDetails = new ArrayList<>();
32018 tejbeer 669
        List<Integer> catalogIds = new ArrayList<>();
670
        List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
26855 tejbeer 671
 
32018 tejbeer 672
        if (!pendingOrders.isEmpty()) {
673
            for (PendingOrder po : pendingOrders) {
674
                List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
675
                for (PendingOrderItem pendingOrderItem : pois) {
676
                    Item item = itemRepository.selectById(pendingOrderItem.getItemId());
677
                    pendingOrderItem.setItemName(item.getItemDescription());
34287 vikas.jang 678
                    FofoOrderItem fofoItem = fofoOrderItemRepository.selectByPendingOrderItemId(pendingOrderItem.getId());
679
                    if (fofoItem != null) pendingOrderItem.setFofoOrderItem(fofoItem);
32018 tejbeer 680
                    catalogIds.add(item.getCatalogItemId());
681
                }
26855 tejbeer 682
 
32018 tejbeer 683
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
26855 tejbeer 684
 
32018 tejbeer 685
                for (PendingOrderItem poi : pois) {
33436 ranu 686
                    PendingOrderDetail pendingOrderDetail = new PendingOrderDetail();
32018 tejbeer 687
                    Item item = itemRepository.selectById(poi.getItemId());
34287 vikas.jang 688
                    if(contentMap.containsKey(item.getCatalogItemId())) {
689
                        JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
690
                        pendingOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
691
                    } else {
692
                        pendingOrderDetail.setImageUrl(ProfitMandiConstants.NO_IMAGE);
693
                    }
33436 ranu 694
                    pendingOrderDetail.setBrand(item.getBrand());
695
                    pendingOrderDetail.setColor(item.getColor());
696
                    pendingOrderDetail.setPendingOrderItemId(poi.getId());
697
                    pendingOrderDetail.setId(poi.getOrderId());
34287 vikas.jang 698
                    if(poi.getFofoOrderItem() != null && poi.getFofoOrderItem().getOrderId() > 0) pendingOrderDetail.setFofoOrderId(poi.getFofoOrderItem().getOrderId());
33436 ranu 699
                    pendingOrderDetail.setItemId(poi.getItemId());
700
                    pendingOrderDetail.setModelName(item.getModelName());
701
                    pendingOrderDetail.setModelNumber(item.getModelNumber());
702
                    pendingOrderDetail.setQuantity(poi.getQuantity());
703
                    pendingOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
704
                    pendingOrderDetail.setStatus(poi.getStatus());
705
                    pendingOrderDetail.setTotalPrice(poi.getSellingPrice());
706
                    pendingOrderDetail.setPayMethod(po.getPayMethod());
707
                    pendingOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
708
                    pendingOrderDetail.setPendingOrderPlan(pendingOrderPlanRepository.selectByPoid(poi.getId()));
709
                    pendingOrderDetails.add(pendingOrderDetail);
32018 tejbeer 710
                }
711
            }
712
        }
28566 tejbeer 713
 
33436 ranu 714
        return responseSender.ok(pendingOrderDetails);
32018 tejbeer 715
    }
28566 tejbeer 716
 
32018 tejbeer 717
    @RequestMapping(value = "/store/invoiceOrder", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
718
    public ResponseEntity<?> getOrderInvoiceDetail(HttpServletRequest request, @RequestParam(value = "id") int id, @RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
33436 ranu 719
        List<CustomerOrderAndInsuranceDetails> customerOrderAndInsuranceDetails = new ArrayList<>();
32018 tejbeer 720
        List<Integer> catalogIds = new ArrayList<>();
721
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectOrderByCustomerId(id, offset, limit);
28566 tejbeer 722
 
32018 tejbeer 723
        if (!fofoOrders.isEmpty()) {
724
            for (FofoOrder fo : fofoOrders) {
725
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fo.getId());
726
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
727
                    Item item = itemRepository.selectById(fofoOrderItem.getItemId());
728
                    fofoOrderItem.setItemName(item.getItemDescription());
729
                    catalogIds.add(item.getCatalogItemId());
730
                }
28566 tejbeer 731
 
32018 tejbeer 732
                Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
733
                for (FofoOrderItem foi : fofoOrderItems) {
33436 ranu 734
                    CustomerOrderAndInsuranceDetails customerOrderDetail = new CustomerOrderAndInsuranceDetails();
32018 tejbeer 735
                    Item item = itemRepository.selectById(foi.getItemId());
736
                    JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
737
                    customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
738
                    customerOrderDetail.setBrand(item.getBrand());
739
                    customerOrderDetail.setColor(item.getColor());
740
                    customerOrderDetail.setFofoOrderItemId(foi.getId());
741
                    customerOrderDetail.setFofoOrderId(foi.getOrderId());
742
                    customerOrderDetail.setItemId(foi.getItemId());
743
                    customerOrderDetail.setModelName(item.getModelName());
744
                    customerOrderDetail.setModelNumber(item.getModelNumber());
745
                    customerOrderDetail.setQuantity(foi.getQuantity());
746
                    customerOrderDetail.setTotalPrice(foi.getSellingPrice());
747
                    customerOrderDetail.setCreatedTimeStamp(foi.getCreateTimestamp());
748
                    customerOrderDetail.setInvoiceNumber(fo.getInvoiceNumber());
749
                    customerOrderDetail.setCancelledTimestamp(fo.getCancelledTimestamp());
33436 ranu 750
                    customerOrderDetail.setInsurancePolicies(insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fo.getInvoiceNumber()));
751
                    customerOrderAndInsuranceDetails.add(customerOrderDetail);
32018 tejbeer 752
                }
33436 ranu 753
 
32018 tejbeer 754
            }
28566 tejbeer 755
 
32018 tejbeer 756
        }
33436 ranu 757
        return responseSender.ok(customerOrderAndInsuranceDetails);
32018 tejbeer 758
    }
28566 tejbeer 759
 
32018 tejbeer 760
    @RequestMapping(value = "/store/generateInvoice", method = RequestMethod.GET)
761
    public ResponseEntity<?> generateInvoice(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
762
        InvoicePdfModel pdfModel = null;
763
        FofoOrder fo = fofoOrderRepository.selectByOrderId(orderId);
764
        pdfModel = orderService.getInvoicePdfModel(fo.getFofoId(), orderId);
765
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
766
        PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
767
        try {
768
            byteArrayOutputStream.close();
769
        } catch (IOException e) {
770
            // TODO Auto-generated catch block
771
            e.printStackTrace();
772
        }
773
        final HttpHeaders headers = new HttpHeaders();
774
        headers.setContentType(MediaType.APPLICATION_PDF);
775
        // headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
26745 amit.gupta 776
 
32018 tejbeer 777
        headers.setContentType(MediaType.parseMediaType("application/pdf"));
778
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
779
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
780
        headers.add("Pragma", "no-cache");
781
        headers.add("Expires", "0");
28287 amit.gupta 782
 
32018 tejbeer 783
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
784
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
785
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
786
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
787
        // return responseSender.ok(new
788
        // ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(),
789
        // headers,HttpStatus.OK));
790
        /*
791
         * ResponseEntity<byte[]> response = new
792
         * ResponseEntity<byte[]>(byteArrayOutputStream.toByteArray(), headers,
793
         * HttpStatus.OK); return response;
794
         */
26923 amit.gupta 795
 
32018 tejbeer 796
    }
26607 amit.gupta 797
 
32018 tejbeer 798
    @RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
799
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
800
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
801
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32546 amit.gupta 802
        for (WebListing webListing : webListings) {
803
            webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
804
        }
805
        return responseSender.ok(webListings);
806
    }
33399 ranu 807
 
808
    @Autowired
809
    StateRepository stateRepository;
810
 
811
    @RequestMapping(value = "/store/stateList", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
812
    public ResponseEntity<?> getStateList(HttpServletRequest request) throws Exception {
813
        List<State> states = stateRepository.selectAll();
814
        return responseSender.ok(states);
815
    }
32546 amit.gupta 816
    /*@RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
817
    public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
818
        List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true), WebListingSource.store);
819
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
32544 amit.gupta 820
        Iterator<WebListing> webListingIterator = webListings.iterator();
821
        while (webListingIterator.hasNext()) {
822
            WebListing webListing = webListingIterator.next();
823
            List<FofoCatalogResponse> catalogResponses = getDealResponses(userInfo, webListing);
824
            boolean isAvailable = catalogResponses.stream().anyMatch(x->x.getItems().stream().anyMatch(y->y.getAvailability()>0));
32545 amit.gupta 825
            webListing.setFofoCatalogResponses(catalogResponses);
32544 amit.gupta 826
            if(!isAvailable) {
827
                webListings.remove(webListing);
828
            }
32018 tejbeer 829
        }
32544 amit.gupta 830
 
32018 tejbeer 831
        return responseSender.ok(webListings);
32546 amit.gupta 832
    }*/
26607 amit.gupta 833
 
32018 tejbeer 834
    private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing) throws ProfitMandiBusinessException {
835
        List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
836
        if (webProducts.size() == 0) {
837
            return new ArrayList<>();
838
        }
839
        RestClient rc = new RestClient();
840
        Map<String, String> params = new HashMap<>();
841
        List<String> mandatoryQ = new ArrayList<>();
842
        mandatoryQ.add(String.format(
33599 amit.gupta 843
                "+{!parent which=\"catalogId_i:(" + StringUtils.join(webProducts, " ") + ")\"} tagId_i:(%s)", StringUtils.join(TAG_IDS, " ")));
32018 tejbeer 844
        params.put("q", StringUtils.join(mandatoryQ, " "));
845
        params.put("fl", "*, [child parentFilter=id:catalog*]");
846
        // params.put("sort", "create_s desc");
847
        params.put("start", String.valueOf(0));
848
        params.put("rows", String.valueOf(100));
849
        params.put("wt", "json");
850
        String response = null;
851
        try {
33487 amit.gupta 852
            response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
32018 tejbeer 853
        } catch (HttpHostConnectException e) {
854
            throw new ProfitMandiBusinessException("", "", "Could not connect to host");
855
        }
856
        JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
857
        JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
858
        List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
859
        return dealResponse;
860
    }
26607 amit.gupta 861
 
32018 tejbeer 862
    @RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
863
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
864
    @ApiOperation(value = "Get brand list and count for category")
865
    public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest) throws Exception {
866
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
867
        Integer storeId = userInfo.getRetailerId();
868
        ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()), "Success", "Items added to cart successfully");
869
        return responseSender.ok(vc);
870
    }
26607 amit.gupta 871
 
32018 tejbeer 872
    // Validate Cart for B2C Customers
873
    private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
33436 ranu 874
 
33573 amit.gupta 875
        logger.info("cartItems {}", cartItems);
32018 tejbeer 876
        cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
877
        List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
878
        Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId, itemIds);
879
        CartResponse cartResponse = new CartResponse();
880
        List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
881
        cartResponse.setCartItems(cartItemResponseModels);
882
        Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
883
        logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 884
 
32018 tejbeer 885
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26652 amit.gupta 886
 
32018 tejbeer 887
        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 888
 
32018 tejbeer 889
        List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId()).collect(Collectors.toList());
26607 amit.gupta 890
 
32018 tejbeer 891
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27030 amit.gupta 892
 
32018 tejbeer 893
        // cartResponse.getCartItems()
894
        int cartMessageChanged = 0;
895
        int cartMessageOOS = 0;
896
        int totalAmount = 0;
897
        int totalQty = 0;
34186 vikas.jang 898
        List<CartMessage> itemMessages = new ArrayList<>();
32018 tejbeer 899
        for (CartItem cartItem : cartItems) {
900
            Item item = itemsMap.get(cartItem.getItemId());
34186 vikas.jang 901
            CartMessage itemMsg = new CartMessage();
32018 tejbeer 902
            TagListing tagListing = tagListingMap.get(cartItem.getItemId());
32977 amit.gupta 903
            int catalogId = itemsMap.get(cartItem.getItemId()).getCatalogItemId();
904
            Float cashback = schemeService.getCatalogSchemeCashBack(storeId, Arrays.asList(catalogId))
905
                    .get(itemsMap.get(cartItem.getItemId()).getCatalogItemId());
32018 tejbeer 906
            cashback = cashback == null ? 0 : cashback;
907
            float itemSellingPrice = tagListing.getMop() - cashback;
908
            CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
909
            cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
33436 ranu 910
            cartItemResponseModel.setPendingOrderItemPolicyPlan(cartItem.getPendingOrderItemPolicyPlan());
34259 aman.kumar 911
            logger.info("itemSellingPrice: {}", itemSellingPrice);
912
            logger.info("cartItem: {}", cartItem.getSellingPrice());
913
            logger.info("cashback: {}", cashback);
32018 tejbeer 914
            if (itemSellingPrice != cartItem.getSellingPrice()) {
34186 vikas.jang 915
                itemMsg.setType("price");
34259 aman.kumar 916
                itemMsg.setMessageText("Price has changed to " + itemSellingPrice);
32018 tejbeer 917
                cartItemResponseModel.setSellingPrice(itemSellingPrice);
918
                cartMessageChanged++;
919
            }
920
            int estimate = -2;
921
            LocalDateTime promiseDeliveryTime = LocalDateTime.now();
922
            int qtyRequired = (int) cartItem.getQuantity();
923
            AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
924
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
925
            if (availabilityModel.getStoreAvailability() >= qtyRequired) {
34239 vikas.jang 926
                itemMsg.setType("estimate0");
34259 aman.kumar 927
                itemMsg.setMessageText("Store availability is " + availabilityModel.getStoreAvailability());
32018 tejbeer 928
                estimate = 0;
929
            } else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
34239 vikas.jang 930
                itemMsg.setType("estimate2");
34259 aman.kumar 931
                itemMsg.setMessageText("Store availability is " + availabilityModel.getWarehouseAvailability());
32018 tejbeer 932
                estimate = 2;
933
            } else if (availabilityModel.getStoreAvailability() > 0) {
934
                estimate = 0;
935
                qtyRequired = availabilityModel.getStoreAvailability();
936
                cartMessageChanged++;
34186 vikas.jang 937
                itemMsg.setType("quantity0");
34259 aman.kumar 938
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 939
            } else if (availabilityModel.getWarehouseAvailability() > 0) {
940
                qtyRequired = availabilityModel.getWarehouseAvailability();
941
                estimate = 2;
942
                cartMessageChanged++;
34186 vikas.jang 943
                itemMsg.setType("quantity2");
34259 aman.kumar 944
                itemMsg.setMessageText("quantity is updated " + qtyRequired);
32018 tejbeer 945
            } else {
946
                qtyRequired = 0;
947
                cartMessageChanged++;
34186 vikas.jang 948
                itemMsg.setType("item");
949
                itemMsg.setMessageText(item.getItemDescriptionNoColor() + " is out of stock");
32018 tejbeer 950
            }
951
            cartItemResponseModel.setQuantity(qtyRequired);
952
            if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
953
                estimate = estimate + 1;
954
                promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
955
            }
956
            totalQty += qtyRequired;
33573 amit.gupta 957
            if (cartItem.getPendingOrderItemPolicyPlan() != null) {
958
                totalAmount += qtyRequired * itemSellingPrice + qtyRequired * cartItem.getPendingOrderItemPolicyPlan().getPrice();
959
            } else {
33436 ranu 960
                totalAmount += qtyRequired * itemSellingPrice;
961
            }
962
 
32018 tejbeer 963
            cartItemResponseModel.setEstimate(estimate);
964
            cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
965
            cartItemResponseModel.setItemId(cartItem.getItemId());
966
            cartItemResponseModel.setMinBuyQuantity(1);
967
            cartItemResponseModel.setQuantity(qtyRequired);
968
            cartItemResponseModel.setQuantityStep(1);
969
            cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
970
            cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
971
            cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
972
            cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
973
            cartItemResponseModel.setColor(item.getColor());
974
            cartItemResponseModels.add(cartItemResponseModel);
34186 vikas.jang 975
            itemMessages.add(itemMsg);
32018 tejbeer 976
        }
977
        cartResponse.setCartItems(cartItemResponseModels);
34186 vikas.jang 978
        cartResponse.setCartMessages(itemMessages);
32018 tejbeer 979
        cartResponse.setCartMessageChanged(cartMessageChanged);
980
        cartResponse.setCartMessageOOS(cartMessageOOS);
981
        int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
982
        cartResponse.setMaxEstimate(maxEstimate);
983
        cartResponse.setTotalAmount(totalAmount);
984
        cartResponse.setTotalQty(totalQty);
26607 amit.gupta 985
 
32018 tejbeer 986
        return cartResponse;
26923 amit.gupta 987
 
32018 tejbeer 988
    }
27069 tejbeer 989
 
32018 tejbeer 990
    @RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
33573 amit.gupta 991
    public ResponseEntity<?> partnerStock(HttpServletRequest request, @RequestParam(required = false, defaultValue = "3") String categoryId, @RequestParam int offset,
34444 vikas.jang 992
      @RequestParam int limit, @RequestParam(required = false) String sort, @RequestParam(required = false) String brand,
993
      @RequestParam(value = "subCategoryId", required = false) int subCategoryId, @RequestParam(required = false) String queryTerm,
994
      @RequestParam(required = false) String listing, @RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
32018 tejbeer 995
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
996
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
997
        FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
998
        sort = "w" + fs.getWarehouseId() + "_i desc";
999
        dealResponse = this.getCatalogResponse(
34024 vikas.jang 1000
                commonSolrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false, false), false, userInfo.getRetailerId());
32018 tejbeer 1001
        return responseSender.ok(dealResponse);
1002
    }
26923 amit.gupta 1003
 
32018 tejbeer 1004
    private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws ProfitMandiBusinessException {
1005
        Map<Integer, Integer> ourItemAvailabilityMap = null;
1006
        Map<Integer, Integer> partnerStockAvailabilityMap = null;
1007
        List<FofoCatalogResponse> dealResponse = new ArrayList<>();
1008
        List<Integer> tagIds = Arrays.asList(4);
1009
        if (docs.length() > 0) {
1010
            HashSet<Integer> itemsSet = new HashSet<>();
1011
            for (int i = 0; i < docs.length(); i++) {
1012
                JSONObject doc = docs.getJSONObject(i);
1013
                if (doc.has("_childDocuments_")) {
1014
                    for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1015
                        JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1016
                        int itemId = childItem.getInt("itemId_i");
1017
                        itemsSet.add(itemId);
1018
                    }
1019
                }
1020
            }
1021
            if (itemsSet.size() == 0) {
1022
                return dealResponse;
1023
            }
1024
            if (fofoId > 0) {
1025
                partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1026
            }
1027
            ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
1028
        }
26833 amit.gupta 1029
 
32018 tejbeer 1030
        for (int i = 0; i < docs.length(); i++) {
1031
            Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
1032
            JSONObject doc = docs.getJSONObject(i);
1033
            FofoCatalogResponse ffdr = new FofoCatalogResponse();
1034
            ffdr.setCatalogId(doc.getInt("catalogId_i"));
1035
            ffdr.setImageUrl(doc.getString("imageUrl_s"));
1036
            ffdr.setTitle(doc.getString("title_s"));
34239 vikas.jang 1037
            ffdr.setSuperCatalogTitle(doc.getString("superCatalog_s"));
1038
            ffdr.setSuperCatalogId(doc.getInt("superCatalog_i"));
1039
            ffdr.setSuperCatalogVariants(doc.getString("superCatalogVariants_s"));
32018 tejbeer 1040
            List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
1041
            if (webOffers != null && webOffers.size() > 0) {
1042
                ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
1043
            }
1044
            try {
1045
                ffdr.setFeature(doc.getString("feature_s"));
1046
            } catch (Exception e) {
1047
                ffdr.setFeature(null);
1048
            }
1049
            ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
33314 ranu 1050
 
32018 tejbeer 1051
            if (doc.has("_childDocuments_")) {
1052
                for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
1053
                    JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
1054
                    int itemId = childItem.getInt("itemId_i");
33314 ranu 1055
                    ffdr.setIsSmartPhone(itemRepository.selectById(itemId).isSmartPhone());
32018 tejbeer 1056
                    float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
1057
                    if (fofoAvailabilityInfoMap.containsKey(itemId)) {
1058
                        if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
1059
                            fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
1060
                            fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
1061
                        }
1062
                    } else {
1063
                        FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
1064
                        fdi.setSellingPrice(sellingPrice);
1065
                        fdi.setMrp(childItem.getDouble("mrp_f"));
1066
                        fdi.setMop((float) childItem.getDouble("mop_f"));
1067
                        fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
1068
                        fdi.setTagId(childItem.getInt("tagId_i"));
1069
                        fdi.setItem_id(itemId);
34196 ranu 1070
                        fdi.setCatalog_id(doc.getInt("catalogId_i"));
32977 amit.gupta 1071
                        Float cashBack = schemeService.getCatalogSchemeCashBack(fofoId, Arrays.asList(ffdr.getCatalogId())).get(ffdr.getCatalogId());
32018 tejbeer 1072
                        cashBack = cashBack == null ? 0 : cashBack;
1073
                        // TODO:Dont commit
1074
                        // fdi.setCashback(Math.min(100, fdi.getMop()));
1075
                        fdi.setCashback(cashBack);
1076
                        fdi.setMinBuyQuantity(1);
1077
                        int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0 : partnerStockAvailabilityMap.get(itemId);
1078
                        int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0 : Math.max(0, ourItemAvailabilityMap.get(itemId));
1079
                        fdi.setActive(partnerAvailability > 0);
1080
                        // fdi.setActive(true);
34239 vikas.jang 1081
                        fdi.setPartnerAvailability(partnerAvailability);
32018 tejbeer 1082
                        fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
1083
                        fdi.setQuantityStep(1);
1084
                        fdi.setMaxQuantity(fdi.getAvailability());
1085
                        fofoAvailabilityInfoMap.put(itemId, fdi);
1086
                    }
1087
                }
1088
            }
1089
            if (fofoAvailabilityInfoMap.values().size() > 0) {
1090
                ffdr.setItems(fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder()).thenComparingInt(y -> -y.getAvailability())).collect(Collectors.toList()));
1091
                dealResponse.add(ffdr);
1092
            }
1093
        }
1094
        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());
1095
    }
26857 amit.gupta 1096
 
32018 tejbeer 1097
    @GetMapping(value = "store/order-status/{pendingOrderId}")
1098
    public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId) throws Exception {
1099
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
1100
        List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
1101
        List<Integer> catalogIds = new ArrayList<>();
1102
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
34477 aman.kumar 1103
            //TODO : Amit feedback use poItemId instead of poId change Param name
1104
            // when list is supposed then use method names as selectAllBy instead selectBy of
1105
            //check for unique constraint
1106
            List<PendingOrderPlan> policyPlans = pendingOrderPlanRepository.selectByPoId(pendingOrderItem.getId());
1107
            pendingOrderItem.setPendingOrderItemPolicyPlan(policyPlans);
32018 tejbeer 1108
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1109
            pendingOrderItem.setItemName(item.getItemDescription());
34186 vikas.jang 1110
            pendingOrderItem.setCatalogId(item.getCatalogItemId());
32018 tejbeer 1111
            catalogIds.add(item.getCatalogItemId());
1112
        }
1113
        Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1114
        for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
1115
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1116
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1117
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1118
        }
1119
        pendingOrder.setPendingOrderItems(pendingOrderItems);
27045 tejbeer 1120
 
32018 tejbeer 1121
        return responseSender.ok(pendingOrder);
1122
    }
28345 tejbeer 1123
 
32018 tejbeer 1124
    @RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
1125
    public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
1126
        return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
1127
    }
26861 tejbeer 1128
 
32018 tejbeer 1129
    @RequestMapping(value = "/store/address", method = RequestMethod.POST)
1130
    public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress) throws Throwable {
34259 aman.kumar 1131
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByActiveCustomerId(customerAddress.getCustomerId());
1132
        if (customerAddresses.isEmpty()) {
1133
            customerAddress.setDefault(true);
1134
        } else {
1135
            customerAddress.setDefault(false);
1136
        }
32018 tejbeer 1137
        customerAddressRepository.persist(customerAddress);
1138
        return responseSender.ok(customerAddress);
1139
    }
27045 tejbeer 1140
 
32018 tejbeer 1141
    @RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
1142
    public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
1143
        CustomerAddress cust = customerAddressRepository.selectById(id);
34259 aman.kumar 1144
        List<CustomerAddress> customerAddresses = customerAddressRepository.selectByCustomerId(cust.getCustomerId());
32018 tejbeer 1145
        cust.setActive(false);
34259 aman.kumar 1146
        if(cust.getDefault()){
1147
            List<CustomerAddress> activeAddresses = customerAddresses.stream()
1148
                    .filter(a -> a.getActive() && a.getId() != id)
1149
                    .sorted(Comparator.comparing(CustomerAddress::getUpdateTimestamp).reversed())
1150
                    .collect(Collectors.toList());
1151
 
1152
            if (!activeAddresses.isEmpty()) {
1153
                CustomerAddress newDefault = activeAddresses.get(0);
1154
                newDefault.setDefault(true);
1155
            }
1156
        }
32018 tejbeer 1157
        return responseSender.ok(cust);
1158
    }
27048 tejbeer 1159
 
32018 tejbeer 1160
    @RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
1161
    public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer) throws Throwable {
1162
        Customer cust = customerRepository.selectById(customer.getId());
1163
        cust.setGender(customer.getGender());
1164
        cust.setProfileImageId(customer.getProfileImageId());
34186 vikas.jang 1165
        cust.setEmailId(customer.getEmailId());
32018 tejbeer 1166
        cust.setDob(customer.getDob());
1167
        return responseSender.ok(cust);
1168
    }
27048 tejbeer 1169
 
32018 tejbeer 1170
    @RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
1171
    public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state, @PathVariable String city, @PathVariable String storeCode) throws Throwable {
1172
        logger.info("Store code {}", storeCode);
1173
        Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
1174
        logger.info("retailer id {}", map.get(storeCode));
1175
        String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
1176
        String html = partnerIndexService.getPartnerIndexHtml();
1177
        logger.info("html {}", html);
1178
        html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan", String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
1179
        response.getWriter().write(html);
1180
    }
27048 tejbeer 1181
 
32018 tejbeer 1182
    @RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
34186 vikas.jang 1183
    public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, @RequestParam String statusDescription, @RequestParam String reason) throws Exception {
28339 tejbeer 1184
 
32018 tejbeer 1185
        PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
1186
        PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
1187
        Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
1188
        if (pendingOrderItem.getBilledTimestamp() == null) {
1189
            pendingOrderItem.setStatus(OrderStatus.CANCELLED);
1190
            pendingOrderItem.setRemark(reason);
1191
            pendingOrderItem.setStatusDescription("cancel by self");
1192
            pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
1193
            List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream().map(x -> x.getStatus()).collect(Collectors.toList());
28339 tejbeer 1194
 
32018 tejbeer 1195
            if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING) && !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED) && !status.contains(OrderStatus.CLAIMED)) {
1196
                pendingOrder.setStatus(OrderStatus.CLOSED);
1197
            }
28339 tejbeer 1198
 
32018 tejbeer 1199
            pendingOrderItemRepository.persist(pendingOrderItem);
1200
            String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
1201
            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 1202
 
32018 tejbeer 1203
            List<Integer> catalogIds = new ArrayList<>();
28339 tejbeer 1204
 
32018 tejbeer 1205
            Item item = itemRepository.selectById(pendingOrderItem.getItemId());
1206
            pendingOrderItem.setItemName(item.getItemDescription());
1207
            catalogIds.add(item.getCatalogItemId());
28339 tejbeer 1208
 
32018 tejbeer 1209
            Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1210
            JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
1211
            pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
1212
            pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
1213
            CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
28355 tejbeer 1214
 
32018 tejbeer 1215
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
28339 tejbeer 1216
 
32018 tejbeer 1217
            Map<String, Object> emailModel = new HashMap<>();
1218
            emailModel.put("customer", customerAddress);
1219
            emailModel.put("pendingOrder", pendingOrder);
1220
            emailModel.put("date", dateTimeFormatter);
27048 tejbeer 1221
 
32018 tejbeer 1222
            String[] customerEmail = null;
1223
            if (customer.getEmailId() != null) {
1224
                customerEmail = new String[]{customer.getEmailId()};
27048 tejbeer 1225
 
34186 vikas.jang 1226
                List<String> bccTo = Arrays.asList("vikas.jangra@smartdukaan.com");
29515 tejbeer 1227
 
32018 tejbeer 1228
                emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel, customerEmail, null, bccTo.toArray(new String[0]));
29515 tejbeer 1229
 
32018 tejbeer 1230
            }
1231
        }
29515 tejbeer 1232
 
32018 tejbeer 1233
        return responseSender.ok(true);
29515 tejbeer 1234
 
32018 tejbeer 1235
    }
31444 tejbeer 1236
 
32018 tejbeer 1237
    @RequestMapping(value = "/store/checkEligibilityStoreOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1238
    public ResponseEntity<?> checkEligibilityStoreOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1239
 
32018 tejbeer 1240
        boolean eligibility = false;
29515 tejbeer 1241
 
34186 vikas.jang 1242
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1243
 
32018 tejbeer 1244
        if (!scratchOffers.isEmpty()) {
1245
            eligibility = true;
31457 tejbeer 1246
 
32018 tejbeer 1247
        }
1248
        return responseSender.ok(eligibility);
1249
    }
29515 tejbeer 1250
 
32018 tejbeer 1251
    @RequestMapping(value = "/store/ScratchOffers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1252
    public ResponseEntity<?> scratchOffers(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
29515 tejbeer 1253
 
34186 vikas.jang 1254
        List<ScratchOffer> scratchOffers = scratchOfferRepository.selectBycCustomerIdAndDate(id, ProfitMandiConstants.SCRATCH_OFFER_START_DATE, ProfitMandiConstants.SCRATCH_OFFER_END_DATE);
29515 tejbeer 1255
 
32218 tejbeer 1256
        logger.info("scratchOffers {}", scratchOffers);
32018 tejbeer 1257
        // List<ScratchOffer> scratchOffers =
1258
        // scratchOfferRepository.selectBycCustomerId(id);
1259
        for (ScratchOffer so : scratchOffers) {
1260
            if (LocalDateTime.now().isAfter(so.getUnlockedAt())) {
1261
                so.setUnlocked(true);
1262
            } else {
1263
                so.setUnlocked(false);
1264
            }
34371 ranu 1265
            LocalDateTime expiredTimestamp = ProfitMandiConstants.SCRATCH_OFFER_END_DATE.plusDays(0).atTime(LocalTime.MAX);
32671 ranu 1266
            so.setExpiredTimestamp(expiredTimestamp);
33573 amit.gupta 1267
            if (LocalDateTime.now().isAfter(expiredTimestamp)) {
32671 ranu 1268
                so.setExpired(true);
1269
            }
32018 tejbeer 1270
        }
29515 tejbeer 1271
 
32018 tejbeer 1272
        return responseSender.ok(scratchOffers);
1273
    }
1274
 
1275
    @RequestMapping(value = "/store/ScratchedOffer", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1276
    public ResponseEntity<?> scratchedOffer(HttpServletRequest request, @RequestParam(value = "id") int id) throws Exception {
1277
 
1278
        ScratchOffer scratchOffer = scratchOfferRepository.selectById(id);
1279
        scratchOffer.setScratched(true);
1280
        scratchOffer.setScracthedAt(LocalDateTime.now());
1281
 
1282
        return responseSender.ok(true);
1283
    }
1284
 
34242 tejus.loha 1285
    @RequestMapping(value = "/store/navbar", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1286
    public ResponseEntity<?> navBars() throws Exception {
1287
        List<NavBar> navBars = navBarRepository.selectAllActive();
1288
        return responseSender.ok(navBars);
1289
    }
1290
 
34444 vikas.jang 1291
    @RequestMapping(value = "/store/clearance", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1292
    public ResponseEntity<?> getLiquidations() throws Exception {
1293
        List<Integer> catalogIds = new ArrayList<>();
1294
        Map<Integer, JSONObject> contentMap = null;
34545 vikas.jang 1295
        List<Liquidation> liquidations = liquidationRepository.selectAllByStatus(ProfitMandiConstants.LIQUIDATION_ENUM.PUBLISHED);
34242 tejus.loha 1296
 
34444 vikas.jang 1297
        if (!liquidations.isEmpty()) {
1298
            for (Liquidation liquidation : liquidations) catalogIds.add(liquidation.getCatalogId());
1299
            contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
1300
        }
1301
 
1302
        List<LiquidationDetail> resultList = new ArrayList<>();
1303
 
1304
        if (contentMap != null) {
1305
            for (Liquidation liquidation : liquidations) {
1306
                List<Bid> bidList = bidRepository.selectBidByLiquidationId(liquidation.getId());
1307
                LiquidationDetail liquidationDetail = new LiquidationDetail();
1308
                if(contentMap.containsKey(liquidation.getCatalogId())) {
1309
                    JSONObject jsonObj = contentMap.get(liquidation.getCatalogId());
1310
                    liquidationDetail.setLiquidationId(liquidation.getId());
1311
                    liquidationDetail.setImageURL(jsonObj.getString("imageUrl_s"));
1312
                    liquidationDetail.setItemName(jsonObj.getString("title_s"));
1313
                    liquidationDetail.setBrand(jsonObj.getString("title_s"));
1314
                    liquidationDetail.setCatalogId(jsonObj.getInt("catalogId_i"));
1315
                    liquidationDetail.setMrp(jsonObj.getFloat("mop_f"));
1316
                    liquidationDetail.setMop(jsonObj.getFloat("mop_f"));
1317
                    liquidationDetail.setDp(jsonObj.getFloat("dp_f"));
1318
                    liquidationDetail.setSuperCatalogs(jsonObj.getString("superCatalogVariants_s"));
1319
                    liquidationDetail.setStartDate(liquidation.getStartDate());
1320
                    liquidationDetail.setEndDate(liquidation.getEndDate());
1321
                    liquidationDetail.setSellingPrice(liquidation.getPrice());
1322
                    liquidationDetail.setAvailableQuantity(liquidation.getQuantity());
34494 vikas.jang 1323
                    liquidationDetail.setIncrementStep(liquidation.getIncrementStep());
34444 vikas.jang 1324
                    liquidationDetail.setBidList(bidList);
1325
                    resultList.add(liquidationDetail);
1326
                }
1327
            }
1328
        }
1329
 
1330
        return responseSender.ok(resultList);
1331
    }
1332
 
1333
    @RequestMapping(value = "/store/clearance/bid", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
1334
    @ApiImplicitParams({@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header")})
1335
    public ResponseEntity<?> saveBidding(HttpServletRequest request, @RequestBody BiddingModel biddingModel) throws Exception {
34446 vikas.jang 1336
        LocalDateTime now = LocalDateTime.now();
34476 vikas.jang 1337
        Liquidation liquidation = liquidationRepository.selectLiquidationById(biddingModel.getLiquidationId());
1338
        LocalDateTime endDateTime = LocalDateTime.of(liquidation.getEndDate().toLocalDate(), LocalTime.of(ProfitMandiConstants.BID_END_HOUR, ProfitMandiConstants.BID_END_MIN));
34494 vikas.jang 1339
        List<Bid> biddings = bidRepository.selectBidByLiquidationId(biddingModel.getLiquidationId());
34476 vikas.jang 1340
        if (now.isAfter(endDateTime)) {
34494 vikas.jang 1341
            return responseSender.badRequest("Bid on this product has been closed");
34446 vikas.jang 1342
        }
34444 vikas.jang 1343
        Bid bid = null;
1344
        UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
1345
        if (biddingModel.getId() != null && biddingModel.getId() > 0) {
1346
            bid = bidRepository.selectById(biddingModel.getId());
1347
            if (bid == null) {
34494 vikas.jang 1348
                return responseSender.badRequest("Bidding record not found with ID: " + biddingModel.getId());
34444 vikas.jang 1349
            }
1350
        } else {
1351
            bid = new Bid();
1352
        }
34476 vikas.jang 1353
        logger.info("biddingModel {}: ",biddingModel);
34444 vikas.jang 1354
        bid.setLiquidationId(biddingModel.getLiquidationId());
1355
        bid.setBiddingAmount(biddingModel.getBiddingAmount());
1356
        bid.setFofoId(userInfo.getRetailerId());
1357
        bid.setItemName(biddingModel.getItemName());
1358
        bid.setQuantity(biddingModel.getBidQty());
1359
        bid.setStatus(ProfitMandiConstants.BID_ENUM.PENDING);
1360
        bid.setCreatedAt(LocalDateTime.now());
34562 ranu 1361
        if (biddingModel.getId() == null) {
1362
            bidRepository.persist(bid);
34654 vikas.jang 1363
            //debit 500 from wallet
1364
            String reason = "Advance security for "+bid.getItemName()+" bid";
1365
            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.";
1366
            walletService.consumeAmountFromWallet(bid.getFofoId(),
1367
                    bid.getId(),
1368
                    WalletReferenceType.ADVANCE_SECURITY,
1369
                    reason, ProfitMandiConstants.BID_CHARGES,
1370
                    bid.getCreatedAt(),true);
1371
            bidService.sendPushNotification(message,"Bidding Update!",Arrays.asList(bid.getFofoId()));
34562 ranu 1372
        }
34494 vikas.jang 1373
        if (biddings.size() > 1) {
1374
            for (Bid bidding : biddings) {
34562 ranu 1375
                if (!(bid.getFofoId().equals(bidding.getFofoId()))) bidService.notifyPartner(bidding.getFofoId(), bid, ProfitMandiConstants.BID_ENUM.UPDATE);
34494 vikas.jang 1376
            }
1377
        }
1378
        return responseSender.ok("Bid placed successfully!");
34444 vikas.jang 1379
    }
1380
 
1381
 
26607 amit.gupta 1382
}