Subversion Repositories SmartDukaan

Rev

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