Subversion Repositories SmartDukaan

Rev

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