Subversion Repositories SmartDukaan

Rev

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