Subversion Repositories SmartDukaan

Rev

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