Subversion Repositories SmartDukaan

Rev

Rev 28298 | Rev 28309 | 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
 
27025 tejbeer 3
import java.time.LocalDateTime;
26628 amit.gupta 4
import java.time.LocalTime;
27069 tejbeer 5
import java.time.format.DateTimeFormatter;
26607 amit.gupta 6
import java.util.ArrayList;
7
import java.util.Arrays;
8
import java.util.HashMap;
9
import java.util.HashSet;
10
import java.util.List;
11
import java.util.Map;
26745 amit.gupta 12
import java.util.Optional;
26607 amit.gupta 13
import java.util.Set;
14
import java.util.stream.Collectors;
15
 
16
import javax.servlet.http.HttpServletRequest;
17
 
18
import org.apache.commons.lang3.StringUtils;
19
import org.apache.http.conn.HttpHostConnectException;
20
import org.apache.logging.log4j.LogManager;
21
import org.apache.logging.log4j.Logger;
22
import org.json.JSONArray;
23
import org.json.JSONObject;
24
import org.springframework.beans.factory.annotation.Autowired;
25
import org.springframework.beans.factory.annotation.Value;
26745 amit.gupta 26
import org.springframework.cache.annotation.Cacheable;
26607 amit.gupta 27
import org.springframework.http.MediaType;
28
import org.springframework.http.ResponseEntity;
29
import org.springframework.stereotype.Controller;
30
import org.springframework.transaction.annotation.Transactional;
26923 amit.gupta 31
import org.springframework.web.bind.annotation.GetMapping;
26662 amit.gupta 32
import org.springframework.web.bind.annotation.PathVariable;
26607 amit.gupta 33
import org.springframework.web.bind.annotation.RequestBody;
34
import org.springframework.web.bind.annotation.RequestMapping;
35
import org.springframework.web.bind.annotation.RequestMethod;
36
import org.springframework.web.bind.annotation.RequestParam;
37
 
38
import com.eclipsesource.json.JsonObject;
26774 amit.gupta 39
import com.fasterxml.jackson.annotation.JsonProperty;
26607 amit.gupta 40
import com.google.gson.Gson;
41
import com.google.gson.reflect.TypeToken;
42
import com.spice.profitmandi.common.enumuration.SchemeType;
43
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
26923 amit.gupta 44
import com.spice.profitmandi.common.model.CreatePendingOrderItem;
26648 amit.gupta 45
import com.spice.profitmandi.common.model.CreatePendingOrderRequest;
26651 amit.gupta 46
import com.spice.profitmandi.common.model.CustomRetailer;
26607 amit.gupta 47
import com.spice.profitmandi.common.model.ProfitMandiConstants;
48
import com.spice.profitmandi.common.model.UserInfo;
49
import com.spice.profitmandi.common.solr.SolrService;
28304 amit.gupta 50
import com.spice.profitmandi.common.util.FormattingUtils;
26607 amit.gupta 51
import com.spice.profitmandi.common.web.client.RestClient;
52
import com.spice.profitmandi.common.web.util.ResponseSender;
53
import com.spice.profitmandi.dao.entity.catalog.Item;
54
import com.spice.profitmandi.dao.entity.catalog.TagListing;
26745 amit.gupta 55
import com.spice.profitmandi.dao.entity.dtr.WebListing;
26774 amit.gupta 56
import com.spice.profitmandi.dao.entity.fofo.Customer;
26857 amit.gupta 57
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
28267 amit.gupta 58
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
26855 tejbeer 59
import com.spice.profitmandi.dao.entity.fofo.PendingOrder;
60
import com.spice.profitmandi.dao.entity.fofo.PendingOrderItem;
26715 amit.gupta 61
import com.spice.profitmandi.dao.entity.fofo.PincodePartner;
26630 amit.gupta 62
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
27045 tejbeer 63
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
26607 amit.gupta 64
import com.spice.profitmandi.dao.model.AddCartRequest;
65
import com.spice.profitmandi.dao.model.CartItem;
66
import com.spice.profitmandi.dao.model.CartItemResponseModel;
67
import com.spice.profitmandi.dao.model.CartResponse;
27045 tejbeer 68
import com.spice.profitmandi.dao.model.CustomerOrderDetail;
26607 amit.gupta 69
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
70
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
28290 tejbeer 71
import com.spice.profitmandi.dao.repository.cs.CsService;
26718 amit.gupta 72
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
27030 amit.gupta 73
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
26745 amit.gupta 74
import com.spice.profitmandi.dao.repository.dtr.WebListingRepository;
75
import com.spice.profitmandi.dao.repository.dtr.WebProductListingRepository;
26607 amit.gupta 76
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
26788 amit.gupta 77
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
26774 amit.gupta 78
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
26855 tejbeer 79
import com.spice.profitmandi.dao.repository.fofo.PendingOrderItemRepository;
80
import com.spice.profitmandi.dao.repository.fofo.PendingOrderRepository;
26648 amit.gupta 81
import com.spice.profitmandi.dao.repository.fofo.PendingOrderService;
26715 amit.gupta 82
import com.spice.profitmandi.dao.repository.fofo.PincodePartnerRepository;
26607 amit.gupta 83
import com.spice.profitmandi.dao.repository.inventory.ItemAvailabilityCacheRepository;
26784 amit.gupta 84
import com.spice.profitmandi.service.CustomerService;
26607 amit.gupta 85
import com.spice.profitmandi.service.authentication.RoleManager;
26923 amit.gupta 86
import com.spice.profitmandi.service.inventory.AvailabilityModel;
26607 amit.gupta 87
import com.spice.profitmandi.service.inventory.FofoAvailabilityInfo;
88
import com.spice.profitmandi.service.inventory.FofoCatalogResponse;
26923 amit.gupta 89
import com.spice.profitmandi.service.inventory.InventoryService;
26909 amit.gupta 90
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
26683 amit.gupta 91
import com.spice.profitmandi.service.scheme.SchemeService;
26651 amit.gupta 92
import com.spice.profitmandi.service.user.RetailerService;
26630 amit.gupta 93
import com.spice.profitmandi.web.processor.OtpProcessor;
26607 amit.gupta 94
import com.spice.profitmandi.web.res.DealBrands;
95
import com.spice.profitmandi.web.res.DealObjectResponse;
96
import com.spice.profitmandi.web.res.DealsResponse;
97
import com.spice.profitmandi.web.res.ValidateCartResponse;
28304 amit.gupta 98
import com.spice.profitmandi.web.services.EmailService;
26607 amit.gupta 99
 
100
import io.swagger.annotations.ApiImplicitParam;
101
import io.swagger.annotations.ApiImplicitParams;
102
import io.swagger.annotations.ApiOperation;
103
 
104
@Controller
105
@Transactional(rollbackFor = Throwable.class)
106
public class StoreController {
107
 
108
	private static final Logger logger = LogManager.getLogger(StoreController.class);
26630 amit.gupta 109
 
26628 amit.gupta 110
	private static final LocalTime CUTOFF_TIME = LocalTime.of(15, 0);
26745 amit.gupta 111
 
112
	private static final List<Integer> TAG_IDS = Arrays.asList(4);
113
 
26717 amit.gupta 114
	private static final int DEFAULT_STORE = 171912487;
26833 amit.gupta 115
 
26788 amit.gupta 116
	@Autowired
117
	CustomerAddressRepository customerAddressRepository;
26607 amit.gupta 118
 
26923 amit.gupta 119
	@Autowired
27030 amit.gupta 120
	SolrService solrService;
27045 tejbeer 121
 
27030 amit.gupta 122
	@Autowired
26923 amit.gupta 123
	InventoryService inventoryService;
27045 tejbeer 124
 
27030 amit.gupta 125
	@Autowired
126
	UserAccountRepository userAccountRepository;
26923 amit.gupta 127
 
26607 amit.gupta 128
	@Value("${python.api.host}")
129
	private String host;
26833 amit.gupta 130
 
26784 amit.gupta 131
	@Autowired
132
	CustomerService customerService;
26607 amit.gupta 133
 
134
	@Value("${python.api.port}")
135
	private int port;
26923 amit.gupta 136
 
26909 amit.gupta 137
	@Autowired
138
	private SaholicInventoryService saholicInventoryService;
26607 amit.gupta 139
 
140
	// This is now unused as we are not supporting multiple companies.
141
	@Value("${gadgetCops.invoice.cc}")
142
	private String[] ccGadgetCopInvoiceTo;
143
 
144
	@Autowired
26715 amit.gupta 145
	private PincodePartnerRepository pincodePartnerRepository;
146
 
147
	@Autowired
26718 amit.gupta 148
	private FofoStoreRepository fofoStoreRepository;
26745 amit.gupta 149
 
26718 amit.gupta 150
	@Autowired
26651 amit.gupta 151
	private RetailerService retailerService;
26861 tejbeer 152
 
26857 amit.gupta 153
	@Autowired
154
	private PendingOrderRepository pendingOrderRepository;
26861 tejbeer 155
 
26857 amit.gupta 156
	@Autowired
157
	private PendingOrderItemRepository pendingOrderItemRepository;
26652 amit.gupta 158
 
26651 amit.gupta 159
	@Autowired
26652 amit.gupta 160
	private PendingOrderService pendingOrderService;
26648 amit.gupta 161
 
162
	@Autowired
26774 amit.gupta 163
	private CustomerRepository customerRepository;
164
 
165
	@Autowired
26607 amit.gupta 166
	private SolrService commonSolrService;
167
 
168
	@Autowired
26630 amit.gupta 169
	private OtpProcessor otpProcessor;
170
 
171
	@Autowired
26607 amit.gupta 172
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
173
 
26609 amit.gupta 174
	@Autowired
26607 amit.gupta 175
	private ResponseSender<?> responseSender;
176
 
177
	@Autowired
178
	private TagListingRepository tagListingRepository;
179
 
180
	@Autowired
181
	private ItemRepository itemRepository;
26701 amit.gupta 182
 
26683 amit.gupta 183
	@Autowired
184
	private SchemeService schemeService;
26607 amit.gupta 185
 
186
	@Autowired
187
	private ItemAvailabilityCacheRepository itemAvailabilityCacheRepository;
188
 
189
	@Autowired
26745 amit.gupta 190
	private WebListingRepository webListingRepository;
191
 
192
	@Autowired
193
	private WebProductListingRepository webProductListingRepository;
194
 
195
	@Autowired
26607 amit.gupta 196
	private RoleManager roleManagerService;
197
 
28304 amit.gupta 198
 
27028 tejbeer 199
	@Autowired
28304 amit.gupta 200
	EmailService emailService;
201
 
27028 tejbeer 202
 
203
	@Autowired
28290 tejbeer 204
	CsService csService;
26607 amit.gupta 205
	List<String> filterableParams = Arrays.asList("brand");
206
 
26668 amit.gupta 207
	@RequestMapping(value = "/store/entity/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
208
	@ApiImplicitParams({
209
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
210
	@ApiOperation(value = "Get unit deal object")
211
	public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id)
212
			throws ProfitMandiBusinessException {
213
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
214
		List<Integer> tagIds = Arrays.asList(4);
215
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
216
		if (roleManagerService.isPartner(userInfo.getRoleIds())) {
217
			String categoryId = "(3 OR 6)";
26745 amit.gupta 218
 
26668 amit.gupta 219
			RestClient rc = new RestClient();
220
			Map<String, String> params = new HashMap<>();
221
			List<String> mandatoryQ = new ArrayList<>();
222
			String catalogString = "catalog" + id;
26607 amit.gupta 223
 
26668 amit.gupta 224
			mandatoryQ.add(String.format("+(categoryId_i:%s) +(id:%s) +{!parent which=\"id:%s\"} tagId_i:(%s)",
225
					categoryId, catalogString, catalogString, StringUtils.join(tagIds, " ")));
226
 
227
			params.put("q", StringUtils.join(mandatoryQ, " "));
228
			params.put("fl", "*, [child parentFilter=id:catalog*]");
229
			params.put("sort", "rank_i asc, create_s desc");
230
			params.put("wt", "json");
231
			String response = null;
232
			try {
233
				response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
234
			} catch (HttpHostConnectException e) {
235
				throw new ProfitMandiBusinessException("", "", "Could not connect to host");
236
			}
237
			JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
238
			JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
26909 amit.gupta 239
			dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
26668 amit.gupta 240
		} else {
241
			return responseSender.badRequest(
242
					new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
243
		}
244
		return responseSender.ok(dealResponse.get(0));
245
	}
246
 
26607 amit.gupta 247
	private Object toDealObject(JsonObject jsonObject) {
248
		if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
249
			return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
250
		}
251
		return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
252
	}
253
 
254
	@RequestMapping(value = "/store/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
255
	@ApiImplicitParams({
256
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
257
	@ApiOperation(value = "Get brand list and count for category")
258
	public ResponseEntity<?> getBrands(HttpServletRequest request,
259
			@RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
260
		logger.info("Request " + request.getParameterMap());
261
		String response = null;
262
		// TODO: move to properties
263
		String uri = ProfitMandiConstants.URL_BRANDS;
264
		RestClient rc = new RestClient();
265
		Map<String, String> params = new HashMap<>();
266
		params.put("category_id", category_id);
267
		List<DealBrands> dealBrandsResponse = null;
268
		try {
269
			response = rc.get(SchemeType.HTTP, host, port, uri, params);
270
		} catch (HttpHostConnectException e) {
271
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
272
		}
273
 
274
		dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
275
		}.getType());
276
 
277
		return responseSender.ok(dealBrandsResponse);
278
	}
279
 
26745 amit.gupta 280
	@RequestMapping(value = "/store/listing/{listingUrl}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
281
	public ResponseEntity<?> bestSellers(HttpServletRequest request, @PathVariable String listingUrl) throws Exception {
26909 amit.gupta 282
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
28287 amit.gupta 283
		WebListing webListing = webListingRepository.selectByUrl(listingUrl);
284
		webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
26745 amit.gupta 285
		return responseSender.ok(webListing);
26654 amit.gupta 286
	}
287
 
26632 amit.gupta 288
	@RequestMapping(value = "/store/otp/generateOTP", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
26783 amit.gupta 289
	public ResponseEntity<?> generateOtp(HttpServletRequest request, @RequestParam String mobile) throws Exception {
26630 amit.gupta 290
 
26857 amit.gupta 291
		return responseSender.ok(otpProcessor.generateOtp(mobile, OtpType.REGISTRATION));
26630 amit.gupta 292
 
293
	}
26652 amit.gupta 294
 
26784 amit.gupta 295
	@RequestMapping(value = "/store/checkmobile/{mobile}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
26833 amit.gupta 296
	public ResponseEntity<?> checkRegistrationUsingMobile(HttpServletRequest request, @PathVariable String mobile)
297
			throws Exception {
26774 amit.gupta 298
		try {
299
			Customer customer = customerRepository.selectByMobileNumber(mobile);
26777 amit.gupta 300
			customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
26774 amit.gupta 301
			return responseSender.ok(new CustomerModel(true, customer));
302
		} catch (Exception e) {
303
			return responseSender.ok(new CustomerModel(false, null));
304
		}
305
	}
26833 amit.gupta 306
 
26784 amit.gupta 307
	@RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
308
	public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
26833 amit.gupta 309
		if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
26784 amit.gupta 310
			return responseSender.ok(true);
311
		} else {
312
			return responseSender.ok(false);
313
		}
314
	}
26923 amit.gupta 315
 
26841 amit.gupta 316
	@RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
26923 amit.gupta 317
	public ResponseEntity<?> resetPassword(HttpServletRequest request, @RequestBody UserModel userModel)
318
			throws Exception {
26843 amit.gupta 319
		customerService.changePassword(userModel.getMobile(), userModel.getPassword());
26841 amit.gupta 320
		return responseSender.ok(true);
321
	}
26774 amit.gupta 322
 
26857 amit.gupta 323
	@RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
324
	public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
325
		Customer customer = new Customer();
326
		customer.setPassword(userModel.getPassword());
327
		customer.setEmailId(userModel.getEmail());
328
		customer.setFirstName(userModel.getFirstName());
329
		customer.setLastName(userModel.getLastName());
330
		customer.setMobileNumber(userModel.getMobile());
331
		return responseSender.ok(customerService.addCustomer(customer));
332
	}
333
 
26648 amit.gupta 334
	@RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
26857 amit.gupta 335
	public ResponseEntity<?> confirmOrder(HttpServletRequest request,
26652 amit.gupta 336
			@RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
26648 amit.gupta 337
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
338
		Integer storeId = userInfo.getRetailerId();
339
		createPendingOrderRequest.setFofoId(storeId);
26923 amit.gupta 340
		List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
341
		List<CartItem> cartItems = new ArrayList<>();
342
		pendingOrderItems.stream().forEach(x -> {
343
			CartItem ci = new CartItem();
344
			ci.setItemId(x.getItemId());
345
			ci.setQuantity(x.getQuantity());
346
			ci.setSellingPrice(x.getSellingPrice());
347
			cartItems.add(ci);
348
		});
349
		CartResponse cr = this.validateCart(storeId, cartItems);
350
		if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
351
			return responseSender.badRequest("Invalid request");
352
		}
26652 amit.gupta 353
 
27028 tejbeer 354
		Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
355
 
356
		return responseSender.ok(returnMap);
357
 
26648 amit.gupta 358
	}
26630 amit.gupta 359
 
26857 amit.gupta 360
	@RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
361
	@ApiImplicitParams({
362
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
363
	@ApiOperation(value = "Get brand list and count for category")
364
	public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
365
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
366
		Integer storeId = userInfo.getRetailerId();
367
		CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
368
 
369
		return responseSender.ok(customRetailer.getAddress());
370
 
371
	}
372
 
373
	@RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
374
	@ApiImplicitParams({
375
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
376
	@ApiOperation(value = "Get brand list and count for category")
377
	public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode)
378
			throws Exception {
379
		List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
380
		int fofoId = DEFAULT_STORE;
381
		if (pincodePartners.size() > 0) {
28287 amit.gupta 382
			List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
28267 amit.gupta 383
			List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
28287 amit.gupta 384
			if (fofoStores.size() > 0) {
28267 amit.gupta 385
				fofoId = fofoStores.get(0).getId();
386
			}
28287 amit.gupta 387
 
26857 amit.gupta 388
		}
389
		return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
390
	}
26923 amit.gupta 391
 
28298 tejbeer 392
	@RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
393
	@ApiImplicitParams({
394
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
395
	@ApiOperation(value = "Get brand list and count for category")
396
	public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode)
397
			throws Exception {
398
		List<CustomRetailer> customerRetailers = new ArrayList<>();
399
		List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
400
 
401
		if (!pincodePartners.isEmpty()) {
402
			List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
403
			List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream()
404
					.filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
405
			Map<Integer, CustomRetailer> customerRetailerMap = retailerService.getFofoRetailers(activefofoIds);
406
			customerRetailers.addAll(customerRetailerMap.values());
407
		}
408
 
409
		logger.info("customerRetailers" + customerRetailers);
410
		return responseSender.ok(customerRetailers);
411
	}
412
 
26855 tejbeer 413
	@RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
414
	public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id,
27049 tejbeer 415
			@RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
26855 tejbeer 416
		List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
27049 tejbeer 417
		List<Integer> catalogIds = new ArrayList<>();
26855 tejbeer 418
		List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
419
		if (!pendingOrders.isEmpty()) {
420
			for (PendingOrder po : pendingOrders) {
421
				List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
27049 tejbeer 422
				for (PendingOrderItem pendingOrderItem : pois) {
423
					Item item = itemRepository.selectById(pendingOrderItem.getItemId());
424
					pendingOrderItem.setItemName(item.getItemDescription());
425
					catalogIds.add(item.getCatalogItemId());
426
				}
427
 
428
				Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
429
 
26855 tejbeer 430
				for (PendingOrderItem poi : pois) {
431
 
432
					CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
433
 
434
					Item item = itemRepository.selectById(poi.getItemId());
27049 tejbeer 435
					JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
436
					customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
26855 tejbeer 437
					customerOrderDetail.setBrand(item.getBrand());
438
					customerOrderDetail.setColor(item.getColor());
27056 tejbeer 439
					customerOrderDetail.setPendingOrderItemId(poi.getId());
26855 tejbeer 440
					customerOrderDetail.setId(poi.getOrderId());
441
					customerOrderDetail.setItemId(poi.getItemId());
442
					customerOrderDetail.setModelName(item.getModelName());
443
					customerOrderDetail.setModelNumber(item.getModelNumber());
444
					customerOrderDetail.setQuantity(poi.getQuantity());
27045 tejbeer 445
					customerOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
446
					customerOrderDetail.setStatus(poi.getStatus());
26855 tejbeer 447
					customerOrderDetail.setTotalPrice(poi.getSellingPrice());
448
					customerOrderDetail.setPayMethod(po.getPayMethod());
26861 tejbeer 449
					customerOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
26855 tejbeer 450
					customerOrderDetails.add(customerOrderDetail);
451
				}
452
			}
453
		}
454
 
455
		return responseSender.ok(customerOrderDetails);
456
	}
457
 
26745 amit.gupta 458
	@RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
459
	@Cacheable(value = "storelisting.all", cacheManager = "thirtyMinsTimeOutCacheManager")
26774 amit.gupta 460
	public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
26745 amit.gupta 461
		List<WebListing> webListings = webListingRepository.selectAllWebListing(Optional.of(true));
28287 amit.gupta 462
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
26745 amit.gupta 463
		for (WebListing webListing : webListings) {
28287 amit.gupta 464
			webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
26745 amit.gupta 465
		}
466
		return responseSender.ok(webListings);
467
	}
468
 
28287 amit.gupta 469
	private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing)
470
			throws ProfitMandiBusinessException {
471
		List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream()
472
				.filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
473
		if (webProducts.size() == 0) {
474
			return new ArrayList<>();
475
		}
476
		RestClient rc = new RestClient();
477
		Map<String, String> params = new HashMap<>();
478
		List<String> mandatoryQ = new ArrayList<>();
479
		mandatoryQ.add(String.format(
480
				"+{!parent which=\"catalogId_i:" + StringUtils.join(webProducts, " ") + "\"} tagId_i:(%s)",
481
				StringUtils.join(TAG_IDS, " ")));
482
		params.put("q", StringUtils.join(mandatoryQ, " "));
483
		params.put("fl", "*, [child parentFilter=id:catalog*]");
484
		// params.put("sort", "create_s desc");
485
		params.put("start", String.valueOf(0));
486
		params.put("rows", String.valueOf(100));
487
		params.put("wt", "json");
488
		String response = null;
489
		try {
490
			response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
491
		} catch (HttpHostConnectException e) {
492
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
493
		}
494
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
495
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
496
		List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
497
		return dealResponse;
498
	}
499
 
26652 amit.gupta 500
	@RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
501
	@ApiImplicitParams({
26651 amit.gupta 502
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
26652 amit.gupta 503
	@ApiOperation(value = "Get brand list and count for category")
504
	public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest)
505
			throws Exception {
26923 amit.gupta 506
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
507
		Integer storeId = userInfo.getRetailerId();
508
		ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()),
509
				"Success", "Items added to cart successfully");
510
		return responseSender.ok(vc);
511
	}
512
 
513
	// Validate Cart for B2C Customers
514
	private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
515
		cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
516
		List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
517
		Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId,
518
				itemIds);
26607 amit.gupta 519
		CartResponse cartResponse = new CartResponse();
26612 amit.gupta 520
		List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
521
		cartResponse.setCartItems(cartItemResponseModels);
26607 amit.gupta 522
		Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
26668 amit.gupta 523
		logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 524
 
525
		Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream()
526
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
527
 
26923 amit.gupta 528
		Map<Integer, TagListing> tagListingMap = tagListingRepository
26607 amit.gupta 529
				.selectByItemIdsAndTagIds(new HashSet<>(itemIds), new HashSet<>(Arrays.asList(4))).stream()
530
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
531
 
532
		List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId())
533
				.collect(Collectors.toList());
534
 
535
		Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
536
 
537
		// cartResponse.getCartItems()
26923 amit.gupta 538
		int cartMessageChanged = 0;
539
		int cartMessageOOS = 0;
540
		int totalAmount = 0;
541
		int totalQty = 0;
542
		for (CartItem cartItem : cartItems) {
26607 amit.gupta 543
			Item item = itemsMap.get(cartItem.getItemId());
26923 amit.gupta 544
			TagListing tagListing = tagListingMap.get(cartItem.getItemId());
545
			Float cashback = schemeService.getItemSchemeCashBack().get(cartItem.getItemId());
546
			cashback = cashback == null ? 0 : cashback;
547
			float itemSellingPrice = tagListing.getMop() - cashback;
26607 amit.gupta 548
			CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
26923 amit.gupta 549
			cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
550
			if (itemSellingPrice != cartItem.getSellingPrice()) {
551
				cartItemResponseModel.setSellingPrice(itemSellingPrice);
552
				cartMessageChanged++;
553
			}
26628 amit.gupta 554
			int estimate = -2;
27025 tejbeer 555
			LocalDateTime promiseDeliveryTime = LocalDateTime.now();
26923 amit.gupta 556
			int qtyRequired = (int) cartItem.getQuantity();
557
			AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
558
			cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
559
			if (availabilityModel.getStoreAvailability() >= qtyRequired) {
560
				estimate = 0;
561
			} else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
26628 amit.gupta 562
				estimate = 2;
26923 amit.gupta 563
			} else if (availabilityModel.getStoreAvailability() > 0) {
564
				estimate = 0;
565
				qtyRequired = availabilityModel.getStoreAvailability();
566
				cartMessageChanged++;
567
			} else if (availabilityModel.getWarehouseAvailability() > 0) {
568
				qtyRequired = availabilityModel.getWarehouseAvailability();
569
				estimate = 2;
570
				cartMessageChanged++;
26620 amit.gupta 571
			} else {
26923 amit.gupta 572
				qtyRequired = 0;
26926 amit.gupta 573
				cartMessageChanged++;
26607 amit.gupta 574
			}
26923 amit.gupta 575
			cartItemResponseModel.setQuantity(qtyRequired);
26630 amit.gupta 576
			if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
26628 amit.gupta 577
				estimate = estimate + 1;
27025 tejbeer 578
				promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
26628 amit.gupta 579
			}
26923 amit.gupta 580
			totalQty += qtyRequired;
581
			totalAmount += qtyRequired * itemSellingPrice;
26628 amit.gupta 582
			cartItemResponseModel.setEstimate(estimate);
26616 amit.gupta 583
			cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
26614 amit.gupta 584
			cartItemResponseModel.setItemId(cartItem.getItemId());
26615 amit.gupta 585
			cartItemResponseModel.setMinBuyQuantity(1);
26923 amit.gupta 586
			cartItemResponseModel.setQuantity(qtyRequired);
26621 amit.gupta 587
			cartItemResponseModel.setQuantityStep(1);
27025 tejbeer 588
			cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
26923 amit.gupta 589
			cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
26607 amit.gupta 590
			cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
591
			cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
592
			cartItemResponseModel.setColor(item.getColor());
26620 amit.gupta 593
			cartItemResponseModels.add(cartItemResponseModel);
26607 amit.gupta 594
		}
26923 amit.gupta 595
		cartResponse.setCartItems(cartItemResponseModels);
596
		cartResponse.setCartMessageChanged(cartMessageChanged);
597
		cartResponse.setCartMessageOOS(cartMessageOOS);
598
		int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
599
		cartResponse.setMaxEstimate(maxEstimate);
600
		cartResponse.setTotalAmount(totalAmount);
601
		cartResponse.setTotalQty(totalQty);
26652 amit.gupta 602
 
26923 amit.gupta 603
		return cartResponse;
604
 
26648 amit.gupta 605
	}
26607 amit.gupta 606
 
27030 amit.gupta 607
	@RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
608
	public ResponseEntity<?> partnerStock(HttpServletRequest request,
609
			@RequestParam(value = "categoryId", required = false, defaultValue = "3") String categoryId,
610
			@RequestParam(value = "offset") String offset, @RequestParam(value = "limit") String limit,
611
			@RequestParam(value = "sort", required = false) String sort,
612
			@RequestParam(value = "brand", required = false) String brand,
613
			@RequestParam(value = "subCategoryId", required = false) int subCategoryId,
614
			@RequestParam(value = "q", required = false) String queryTerm,
28287 amit.gupta 615
			@RequestParam(required = false) String listing,
616
			@RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
27030 amit.gupta 617
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
618
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
28269 amit.gupta 619
		FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
620
		sort = "w" + fs.getWarehouseId() + "_i desc";
27045 tejbeer 621
		dealResponse = this.getCatalogResponse(
622
				solrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false), false,
623
				userInfo.getRetailerId());
27030 amit.gupta 624
		return responseSender.ok(dealResponse);
625
	}
626
 
26909 amit.gupta 627
	private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId)
26607 amit.gupta 628
			throws ProfitMandiBusinessException {
26909 amit.gupta 629
		Map<Integer, Integer> ourItemAvailabilityMap = null;
630
		Map<Integer, Integer> partnerStockAvailabilityMap = null;
26607 amit.gupta 631
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
632
		List<Integer> tagIds = Arrays.asList(4);
633
		if (docs.length() > 0) {
634
			HashSet<Integer> itemsSet = new HashSet<>();
635
			for (int i = 0; i < docs.length(); i++) {
636
				JSONObject doc = docs.getJSONObject(i);
637
				if (doc.has("_childDocuments_")) {
638
					for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
639
						JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
640
						int itemId = childItem.getInt("itemId_i");
641
						itemsSet.add(itemId);
642
					}
643
				}
644
			}
645
			if (itemsSet.size() == 0) {
646
				return dealResponse;
647
			}
28269 amit.gupta 648
			if (fofoId > 0) {
26909 amit.gupta 649
				partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream()
650
						.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
651
			}
28287 amit.gupta 652
			ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
26607 amit.gupta 653
		}
654
 
655
		for (int i = 0; i < docs.length(); i++) {
656
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
657
			JSONObject doc = docs.getJSONObject(i);
658
			FofoCatalogResponse ffdr = new FofoCatalogResponse();
659
			ffdr.setCatalogId(doc.getInt("catalogId_i"));
660
			ffdr.setImageUrl(doc.getString("imageUrl_s"));
661
			ffdr.setTitle(doc.getString("title_s"));
662
			try {
663
				ffdr.setFeature(doc.getString("feature_s"));
664
			} catch (Exception e) {
665
				ffdr.setFeature(null);
666
				logger.info("Could not find Feature_s for {}", ffdr.getCatalogId());
667
			}
668
			ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
669
			if (doc.has("_childDocuments_")) {
670
				for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
671
					JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
672
					int itemId = childItem.getInt("itemId_i");
673
					float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
674
					if (fofoAvailabilityInfoMap.containsKey(itemId)) {
675
						if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
676
							fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
677
							fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
678
						}
679
					} else {
680
						FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
26909 amit.gupta 681
						fdi.setSellingPrice(sellingPrice);
682
						fdi.setActive(childItem.getBoolean("active_b"));
683
						fdi.setMrp(childItem.getDouble("mrp_f"));
26607 amit.gupta 684
						fdi.setMop((float) childItem.getDouble("mop_f"));
685
						fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
686
						fdi.setTagId(childItem.getInt("tagId_i"));
687
						fdi.setItem_id(itemId);
26909 amit.gupta 688
						Float cashBack = schemeService.getItemSchemeCashBack().get(itemId);
689
						cashBack = cashBack == null ? 0 : cashBack;
690
						fdi.setCashback(cashBack);
26673 amit.gupta 691
						fdi.setMinBuyQuantity(1);
28287 amit.gupta 692
						int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0
693
								: Math.max(0, ourItemAvailabilityMap.get(itemId));
28269 amit.gupta 694
						int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0
695
								: partnerStockAvailabilityMap.get(itemId);
28287 amit.gupta 696
						fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
26607 amit.gupta 697
						fdi.setQuantityStep(1);
28269 amit.gupta 698
						fdi.setMaxQuantity(fdi.getAvailability());
26607 amit.gupta 699
						fofoAvailabilityInfoMap.put(itemId, fdi);
700
					}
701
				}
702
			}
703
			if (fofoAvailabilityInfoMap.values().size() > 0) {
26909 amit.gupta 704
				ffdr.setItems(fofoAvailabilityInfoMap.values().stream()
26923 amit.gupta 705
						.sorted((x, y) -> y.getAvailability() - x.getAvailability()).collect(Collectors.toList()));
26607 amit.gupta 706
				dealResponse.add(ffdr);
707
			}
708
		}
28287 amit.gupta 709
		return dealResponse.stream().sorted((x, y) -> {
710
			return Math.min(y.getItems().get(0).getAvailability(), 1)
711
					- Math.min(x.getItems().get(0).getAvailability(), 1);
28237 amit.gupta 712
		}).collect(Collectors.toList());
26909 amit.gupta 713
 
26607 amit.gupta 714
	}
26923 amit.gupta 715
 
716
	@GetMapping(value = "store/order-status/{pendingOrderId}")
27028 tejbeer 717
	public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId)
718
			throws Exception {
26923 amit.gupta 719
		PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
720
		List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
721
		List<Integer> catalogIds = new ArrayList<>();
27028 tejbeer 722
		for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
26923 amit.gupta 723
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
724
			pendingOrderItem.setItemName(item.getItemDescription());
725
			catalogIds.add(item.getCatalogItemId());
726
		}
727
		Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27028 tejbeer 728
		for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
26923 amit.gupta 729
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
730
			JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
731
			pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
732
		}
733
		pendingOrder.setPendingOrderItems(pendingOrderItems);
27069 tejbeer 734
 
735
		CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
736
 
28304 amit.gupta 737
		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
27069 tejbeer 738
 
28304 amit.gupta 739
		Map<String, Object> emailModel = new HashMap<>();
740
		emailModel.put("customer", customerAddress);
741
		emailModel.put("pendingOrder", pendingOrder);
742
		emailModel.put("date", dateTimeFormatter);
27069 tejbeer 743
 
28290 tejbeer 744
		CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
745
		Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
28304 amit.gupta 746
		String[] customerEmail = null;
747
		if (customer.getEmailId()!= null) {
748
			customerEmail = new String[]{ customer.getEmailId() };
28291 tejbeer 749
		}
28304 amit.gupta 750
		List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28296 tejbeer 751
				"hemant.kaura@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
28304 amit.gupta 752
				"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28290 tejbeer 753
		List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
28304 amit.gupta 754
		bccTo.addAll(authUserEmails);
28290 tejbeer 755
 
28304 amit.gupta 756
		emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", 
757
				emailModel, customerEmail, null, 
758
				bccTo.toArray(new String[0]));
26923 amit.gupta 759
		return responseSender.ok(pendingOrder);
760
	}
761
 
26833 amit.gupta 762
	@RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
763
	public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
27045 tejbeer 764
		return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
26788 amit.gupta 765
	}
26833 amit.gupta 766
 
26857 amit.gupta 767
	@RequestMapping(value = "/store/address", method = RequestMethod.POST)
768
	public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress)
769
			throws Throwable {
770
		customerAddressRepository.persist(customerAddress);
771
		return responseSender.ok(customerAddress);
772
	}
773
 
27045 tejbeer 774
	@RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
775
	public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
776
		CustomerAddress cust = customerAddressRepository.selectById(id);
777
		cust.setActive(false);
778
		return responseSender.ok(cust);
779
	}
780
 
26861 tejbeer 781
	@RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
782
	public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer)
783
			throws Throwable {
784
		Customer cust = customerRepository.selectById(customer.getId());
785
		cust.setGender(customer.getGender());
26867 tejbeer 786
		cust.setProfileImageId(customer.getProfileImageId());
26861 tejbeer 787
		cust.setDob(customer.getDob());
788
		return responseSender.ok(cust);
789
	}
790
 
27048 tejbeer 791
	@RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
792
	public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id,
27045 tejbeer 793
 
27048 tejbeer 794
			@RequestParam String statusDescription) throws Exception {
795
 
796
		PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
27057 tejbeer 797
		PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28304 amit.gupta 798
		Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
27048 tejbeer 799
		if (pendingOrderItem.getBilledTimestamp() == null) {
800
			pendingOrderItem.setStatus(OrderStatus.CANCELLED);
801
			pendingOrderItem.setStatusDescription(statusDescription);
28304 amit.gupta 802
			pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
27048 tejbeer 803
			List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId())
804
					.stream().map(x -> x.getStatus()).collect(Collectors.toList());
805
 
806
			if (!status.contains(OrderStatus.PENDING)) {
807
				pendingOrder.setStatus(OrderStatus.CLOSED);
808
			}
809
 
810
			pendingOrderItemRepository.persist(pendingOrderItem);
28304 amit.gupta 811
			String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
812
			otpProcessor.sendSms(OtpProcessor.SELF_CANCELLED_TEMPLATE_ID, 
813
					String.format(OtpProcessor.SELF_CANCELLED_TEMPLATE, pendingOrder.getId(), 
814
							StringUtils.abbreviate(itemDescription, 30),
815
							FormattingUtils.format(pendingOrderItem.getCancelledTimestamp())), 
816
					customer.getMobileNumber());
27048 tejbeer 817
		}
818
 
819
		return responseSender.ok(true);
820
 
821
	}
822
 
26774 amit.gupta 823
}
824
 
26784 amit.gupta 825
class UserModel {
26857 amit.gupta 826
	@JsonProperty(required = true)
26784 amit.gupta 827
	private String mobile;
26857 amit.gupta 828
	@JsonProperty(required = true)
26784 amit.gupta 829
	private String password;
26857 amit.gupta 830
	@JsonProperty(required = false)
831
	private String firstName;
832
	@JsonProperty(required = false)
833
	private String lastName;
834
	@JsonProperty(required = false)
835
	private String email;
26833 amit.gupta 836
 
26784 amit.gupta 837
	@Override
838
	public String toString() {
839
		return "UserModel [mobile=" + mobile + ", password=" + password + "]";
840
	}
26833 amit.gupta 841
 
26784 amit.gupta 842
	public String getMobile() {
843
		return mobile;
844
	}
26833 amit.gupta 845
 
26784 amit.gupta 846
	public void setMobile(String mobile) {
847
		this.mobile = mobile;
848
	}
26833 amit.gupta 849
 
26784 amit.gupta 850
	public String getPassword() {
851
		return password;
852
	}
26833 amit.gupta 853
 
26784 amit.gupta 854
	public void setPassword(String password) {
855
		this.password = password;
856
	}
26857 amit.gupta 857
 
858
	public String getFirstName() {
859
		return firstName;
860
	}
861
 
862
	public void setFirstName(String firstName) {
863
		this.firstName = firstName;
864
	}
865
 
866
	public String getLastName() {
867
		return lastName;
868
	}
869
 
870
	public void setLastName(String lastName) {
871
		this.lastName = lastName;
872
	}
873
 
874
	public String getEmail() {
875
		return email;
876
	}
877
 
878
	public void setEmail(String email) {
879
		this.email = email;
880
	}
881
 
26784 amit.gupta 882
}
883
 
26774 amit.gupta 884
class CustomerModel {
26783 amit.gupta 885
 
26774 amit.gupta 886
	@JsonProperty(required = false)
887
	private Customer customer;
888
	@JsonProperty(required = true)
889
	private boolean exists;
890
 
891
	public CustomerModel(boolean exists, Customer customer) {
892
		super();
893
		this.customer = customer;
894
		this.exists = exists;
895
	}
896
 
897
	@Override
898
	public String toString() {
899
		return "CustomerModel [customer=" + customer + ", exists=" + exists + "]";
900
	}
901
 
902
	public Customer getCustomer() {
903
		return customer;
904
	}
905
 
906
	public void setCustomer(Customer customer) {
907
		this.customer = customer;
908
	}
909
 
910
	public boolean isExists() {
911
		return exists;
912
	}
913
 
914
	public void setExists(boolean exists) {
915
		this.exists = exists;
916
	}
26607 amit.gupta 917
}