Subversion Repositories SmartDukaan

Rev

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