Subversion Repositories SmartDukaan

Rev

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