Subversion Repositories SmartDukaan

Rev

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