Subversion Repositories SmartDukaan

Rev

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