Subversion Repositories SmartDukaan

Rev

Rev 28170 | Rev 29261 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 28170 Rev 28653
Line 8... Line 8...
8
import java.util.List;
8
import java.util.List;
9
import java.util.Map;
9
import java.util.Map;
10
import java.util.Set;
10
import java.util.Set;
11
import java.util.stream.Collectors;
11
import java.util.stream.Collectors;
12
 
12
 
-
 
13
import org.apache.logging.log4j.LogManager;
-
 
14
import org.apache.logging.log4j.Logger;
13
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.beans.factory.annotation.Autowired;
14
import org.springframework.stereotype.Component;
16
import org.springframework.stereotype.Component;
15
 
17
 
16
import com.spice.profitmandi.common.util.FormattingUtils;
18
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
17
import com.spice.profitmandi.dao.entity.catalog.Item;
19
import com.spice.profitmandi.dao.entity.catalog.Item;
18
import com.spice.profitmandi.dao.entity.catalog.TagListing;
20
import com.spice.profitmandi.dao.entity.catalog.TagListing;
19
import com.spice.profitmandi.dao.entity.user.Cart;
21
import com.spice.profitmandi.dao.entity.user.Cart;
20
import com.spice.profitmandi.dao.entity.user.CartItem;
-
 
21
import com.spice.profitmandi.dao.entity.user.CartLine;
22
import com.spice.profitmandi.dao.entity.user.CartLine;
22
import com.spice.profitmandi.dao.entity.user.User;
23
import com.spice.profitmandi.dao.entity.user.User;
-
 
24
import com.spice.profitmandi.dao.model.CartItem;
-
 
25
import com.spice.profitmandi.dao.model.CartItemResponseModel;
-
 
26
import com.spice.profitmandi.dao.model.CartMessage;
-
 
27
import com.spice.profitmandi.dao.model.CartResponse;
23
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
28
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
24
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
29
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
25
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
30
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
26
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
31
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
27
import com.spice.profitmandi.dao.repository.user.CartItemRepository;
-
 
28
import com.spice.profitmandi.dao.repository.user.CartLineRepository;
32
import com.spice.profitmandi.dao.repository.user.CartLineRepository;
29
import com.spice.profitmandi.dao.repository.user.CartRepository;
33
import com.spice.profitmandi.dao.repository.user.CartRepository;
30
import com.spice.profitmandi.dao.repository.user.UserRepository;
34
import com.spice.profitmandi.dao.repository.user.UserRepository;
-
 
35
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
31
 
36
 
32
@Component
37
@Component
33
public class CartServiceImpl implements CartService {
38
public class CartServiceImpl implements CartService {
34
 
39
 
35
	private static final Set<Integer> tagIds = new HashSet<>(Arrays.asList(4));
40
	private static final Set<Integer> tagIds = new HashSet<>(Arrays.asList(4));
36
 
41
 
-
 
42
	private static final Logger logger = LogManager.getLogger(CartServiceImpl.class);
-
 
43
 
37
	@Autowired
44
	@Autowired
38
	CartRepository cartRepository;
45
	CartRepository cartRepository;
39
 
46
 
40
	@Autowired
47
	@Autowired
41
	CartItemRepository cartItemRepository;
48
	CartLineRepository cartLineRepository;
42
 
49
 
43
	@Autowired
50
	@Autowired
44
	FofoStoreRepository fofoStoreRepository;
51
	FofoStoreRepository fofoStoreRepository;
45
 
52
 
46
	@Autowired
53
	@Autowired
Line 51... Line 58...
51
 
58
 
52
	@Autowired
59
	@Autowired
53
	ItemRepository itemRepository;
60
	ItemRepository itemRepository;
54
 
61
 
55
	@Autowired
62
	@Autowired
56
	CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
63
	SaholicInventoryService saholicInventoryService;
57
 
64
 
58
	@Autowired
65
	@Autowired
59
	CartLineRepository cartLineRepository;
66
	CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
60
 
67
 
61
	@Override
68
	@Override
62
	public CartModel addToCart(int cartId, int itemId, int quantity, float sellingPrice) {
69
	public CartModel addToCart(int cartId, int itemId, int quantity, float sellingPrice) {
63
		CartItem cartItem = cartItemRepository.selectByCartItem(cartId, itemId);
70
		CartLine cartItem = cartLineRepository.selectByCartItem(cartId, itemId);
64
		if (cartItem == null) {
71
		if (cartItem == null) {
65
			this.createCartItem(cartId, itemId, quantity, sellingPrice);
72
			this.createCartItem(cartId, itemId, quantity, sellingPrice);
66
		} else {
73
		} else {
67
			cartItem.setQuantity(quantity);
74
			cartItem.setQuantity(quantity);
68
			cartItem.setActualPrice(sellingPrice);
75
			cartItem.setActualPrice(sellingPrice);
69
		}
76
		}
70
		return null;
77
		return null;
71
	}
78
	}
72
 
79
 
73
	private void createCartItem(int cartId, int itemId, int quantity, float sellingPrice) {
80
	private void createCartItem(int cartId, int itemId, int quantity, float sellingPrice) {
74
		CartItem cartItem = new CartItem();
81
		CartLine cartLine = new CartLine();
75
		cartItem.setActualPrice(sellingPrice);
82
		cartLine.setActualPrice(sellingPrice);
76
		cartItem.setCartId(cartId);
83
		cartLine.setCartId(cartId);
77
		cartItem.setQuantity(quantity);
84
		cartLine.setQuantity(quantity);
78
		// TODO: Estmiate Logic
85
		// TODO: Estmiate Logic
79
		cartItem.setEstimate(2);
86
		cartLine.setEstimate(2);
80
		cartItemRepository.persist(cartItem);
87
		cartLineRepository.persist(cartLine);
81
 
88
 
82
	}
89
	}
83
 
90
 
84
	@Override
91
	@Override
85
	public CartModel removeFromCart(int cartId, int itemId) {
92
	public boolean clearCart(int cartId) throws ProfitMandiBusinessException {
86
		CartItem cartItem = cartItemRepository.selectByCartItem(cartId, itemId);
93
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
87
		if (cartItem != null) {
-
 
88
			cartItemRepository.delete(cartItem);
94
		cartLines.stream().forEach(cartLine -> cartLineRepository.delete(cartLine));
89
		}
-
 
90
		return this.validateCart(cartId);
95
		Cart cart = cartRepository.selectById(cartId);
91
	}
-
 
92
 
96
 
93
	@Override
97
		cart.setUpdateTimestamp(LocalDateTime.now());
94
	public void clearCart(int cartId) {
98
		cart.setCheckoutTimestamp(null);
95
		List<CartItem> cartItems = cartItemRepository.selectAllByCartId(cartId);
99
		cart.setTotalPrice(0);
96
		cartItems.stream().forEach(cartItem -> cartItemRepository.delete(cartItem));
100
		cart.setWalletAmount(0);
-
 
101
		return true;
97
	}
102
	}
98
 
103
 
99
	@Override
104
	@Override
100
	public CartModel getCart(int cartId) {
105
	public CartModel getCart(int cartId) {
101
		// TODO Auto-generated method stub
106
		// TODO Auto-generated method stub
102
		return null;
107
		return null;
103
	}
108
	}
104
 
109
 
105
	private CartModel validateCart(int cartId) {
-
 
106
		CartModel cartModel = null;
-
 
107
		try {
-
 
108
			Cart cart = cartRepository.selectById(cartId);
-
 
109
			User user = saholicUserRepository.selectByCartId(cartId);
-
 
110
			List<CartItem> cartItems = cartItemRepository.selectAllByCartId(cartId);
-
 
111
			cartModel = new CartModel();
-
 
112
			List<CartItemModel> cartItemModels = new ArrayList<>();
-
 
113
			Set<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
-
 
114
			boolean isFofo = true;
-
 
115
			Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemIds).stream()
-
 
116
					.collect(Collectors.toMap(x -> x.getId(), x -> x));
-
 
117
 
-
 
118
			Map<Integer, Float> priceMap = this.getPriceMap(user, itemIds);
-
 
119
			Map<Integer, Integer> availabilityMap = this.getAvailabilityMap(user, itemIds);
-
 
120
			for (CartItem cartItem : cartItems) {
-
 
121
				try {
-
 
122
					CartItemModel cartItemModel = new CartItemModel();
-
 
123
					cartItemModel.setItemId(cartItem.getItemId());
-
 
124
					Item item = itemsMap.get(cartItem.getItemId());
-
 
125
					cartItemModel.setTitle(item.getItemDescription());
-
 
126
					float currentSellingPrice = priceMap.get(cartItem.getItemId());
-
 
127
					if (currentSellingPrice != cartItem.getActualPrice()) {
-
 
128
						CartItemMessage cartItemMessage = new CartItemMessage();
-
 
129
						int diffPrice = (int) (currentSellingPrice - cartItem.getActualPrice());
-
 
130
						String diff = currentSellingPrice - cartItem.getActualPrice() > 0 ? "increased" : "decreased";
-
 
131
						cartItem.setActualPrice(cartItem.getActualPrice());
-
 
132
						cartItemMessage.setMessageText("Pricing have been " + diff + "by Rs."
-
 
133
								+ FormattingUtils.formatDecimalTwoDigits(Math.abs(diffPrice)));
-
 
134
						cartItemMessage.setType("info");
-
 
135
					}
-
 
136
					cartItemModel.setSellingPrice(cartItem.getActualPrice());
-
 
137
 
-
 
138
					// Check stock availability and check if stock is active
-
 
139
				} catch (Exception e) {
-
 
140
 
-
 
141
				}
-
 
142
			}
-
 
143
		} catch (Exception e) {
-
 
144
			e.printStackTrace();
-
 
145
		}
-
 
146
		return cartModel;
-
 
147
	}
-
 
148
 
-
 
149
	// As of now it only works for Fofo Partners need to be refactored later
110
	// As of now it only works for Fofo Partners need to be refactored later
150
	private Map<Integer, Integer> getAvailabilityMap(User user, Set<Integer> itemIds) {
111
	private Map<Integer, Integer> getAvailabilityMap(User user, Set<Integer> itemIds) {
151
		Map<Integer, Integer> itemAvailabilityMap = new HashMap<>();
112
		Map<Integer, Integer> itemAvailabilityMap = new HashMap<>();
152
		List<TagListing> tags = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
113
		List<TagListing> tags = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
153
		tags.stream().forEach(tagListing -> {
114
		tags.stream().forEach(tagListing -> {
Line 172... Line 133...
172
		return tags.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getSellingPrice()));
133
		return tags.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getSellingPrice()));
173
 
134
 
174
	}
135
	}
175
 
136
 
176
	@Override
137
	@Override
-
 
138
	public CartResponse getCartValidation(int cartId) throws ProfitMandiBusinessException {
-
 
139
		/*
-
 
140
		 * # No need to validate duplicate items since there are only two ways # to add
-
 
141
		 * items to a cart and both of them check whether the item being # added is a
-
 
142
		 * duplicate of an already existing item.
-
 
143
		 */
-
 
144
 
-
 
145
		Cart cart = cartRepository.selectById(cartId);
-
 
146
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
-
 
147
 
-
 
148
		User saholicUser = saholicUserRepository.selectByCartId(cartId);
-
 
149
 
-
 
150
		int totalQty = 0;
-
 
151
		double totalAmount = 0;
-
 
152
		CartResponse cartResponse = new CartResponse();
-
 
153
		List<CartMessage> cartMessages = new ArrayList<>();
-
 
154
		List<CartItemResponseModel> cartItemModels = new ArrayList<>();
-
 
155
		cartResponse.setCartMessages(cartMessages);
-
 
156
		cartResponse.setCartItems(cartItemModels);
-
 
157
 
-
 
158
		int cartMessageChanged = 0;
-
 
159
		int cartMessageOOS = 0;
-
 
160
		int cartMessageUndeliverable = 0;
-
 
161
 
-
 
162
		Set<Integer> itemIds = cartLines.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
-
 
163
		logger.info("iteme ids -- {}", itemIds);
-
 
164
		List<TagListing> tagListings = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
-
 
165
		Map<Integer, TagListing> tagListingsMap = tagListings.stream()
-
 
166
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
-
 
167
 
-
 
168
		cart.setTotalPrice(0);
-
 
169
		int nonAccessoryQuantity = 0;
-
 
170
		for (CartLine cartLine : cartLines) {
-
 
171
			boolean itemQuantityChanged = false;
-
 
172
			CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
-
 
173
			int oldEstimate = cartLine.getEstimate();
-
 
174
			int itemId = cartLine.getItemId();
-
 
175
			Item item = null;
-
 
176
			try {
-
 
177
				item = itemRepository.selectById(itemId);
-
 
178
				cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
-
 
179
			} catch (ProfitMandiBusinessException e) {
-
 
180
				e.printStackTrace();
-
 
181
				logger.info("Error finding item with id {}", itemId);
-
 
182
				cartLineRepository.delete(cartLine);
-
 
183
				continue;
-
 
184
			}
-
 
185
			cartItemResponseModel.setItemId(itemId);
-
 
186
			cartItemResponseModel.setQuantity(0);
-
 
187
			cartItemResponseModel.setColor(item.getColor());
-
 
188
			List<CartItemMessage> cartItemMessages = new ArrayList<>();
-
 
189
			cartItemResponseModel.setCartItemMessages(cartItemMessages);
-
 
190
			cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
-
 
191
			cartItemResponseModel.setMinBuyQuantity(1);
-
 
192
			cartItemResponseModel.setQuantityStep(1);
-
 
193
			cartItemResponseModel.setMaxQuantity(0);
-
 
194
 
-
 
195
			/*
-
 
196
			 * int netAvailability = itemAvailabilityMap.get(itemId).stream()
-
 
197
			 * .collect(Collectors.summingInt(x -> x.getNetavailability()));
-
 
198
			 */
-
 
199
			int availability = 30;
-
 
200
			if (availability < cartLine.getQuantity()) {
-
 
201
				cartLine.setQuantity(availability);
-
 
202
				itemQuantityChanged = true;
-
 
203
			}
-
 
204
			cartItemResponseModel.setMaxQuantity(Math.max(availability, 100));
-
 
205
			if (availability < cartItemResponseModel.getMinBuyQuantity()) {
-
 
206
				cartItemResponseModel.setMinBuyQuantity(availability);
-
 
207
			}
-
 
208
			if (cartLine.getQuantity() < cartItemResponseModel.getMinBuyQuantity()) {
-
 
209
				itemQuantityChanged = true;
-
 
210
				cartLine.setQuantity(cartItemResponseModel.getMinBuyQuantity());
-
 
211
			}
-
 
212
 
-
 
213
			if (cartLine.getQuantity() > cartItemResponseModel.getMaxQuantity()) {
-
 
214
				itemQuantityChanged = true;
-
 
215
				cartLine.setQuantity(cartItemResponseModel.getMaxQuantity());
-
 
216
			}
-
 
217
			cartLine.setActualPrice(tagListingsMap.get(itemId).getSellingPrice());
-
 
218
			if (item.getCategoryId() == 10006 || item.getCategoryId() == 10010) {
-
 
219
				nonAccessoryQuantity += cartItemResponseModel.getQuantity();
-
 
220
				cartItemResponseModel.setCategoryName("mobile");
-
 
221
			}
-
 
222
			cartItemResponseModel.setSellingPrice(cartLine.getActualPrice());
-
 
223
 
-
 
224
			if (availability > 0) {
-
 
225
				cart.setTotalPrice(cart.getTotalPrice() + (cartLine.getActualPrice() * cartLine.getQuantity()));
-
 
226
				cartItemResponseModel.setQuantity(cartLine.getQuantity());
-
 
227
				cartItemResponseModel.setEstimate(2);
-
 
228
				if (itemQuantityChanged) {
-
 
229
					cartMessageChanged += 1;
-
 
230
					if (oldEstimate != cartItemResponseModel.getEstimate()) {
-
 
231
						cartLine.setEstimate(cartItemResponseModel.getEstimate());
-
 
232
						cart.setUpdateTimestamp(LocalDateTime.now());
-
 
233
						totalAmount += cartLine.getActualPrice() * cartLine.getQuantity();
-
 
234
					}
-
 
235
				}
-
 
236
			} else {
-
 
237
				cartItemResponseModel.setQuantity(0);
-
 
238
				cartMessageOOS += 1;
-
 
239
				CartItemMessage cartItemMessage = new CartItemMessage();
-
 
240
				cartItemMessage.setType("danger");
-
 
241
				cartItemMessage.setMessageText("Out of Stock");
-
 
242
				cartItemMessages.add(cartItemMessage);
-
 
243
				cartLineRepository.delete(cartLine);
-
 
244
			}
-
 
245
			totalQty += cartItemResponseModel.getQuantity();
-
 
246
 
-
 
247
			if (cartItemMessages.size() > 0) {
-
 
248
				cartResponse.getCartItems().add(0, cartItemResponseModel);
-
 
249
			} else {
-
 
250
				cartResponse.getCartItems().add(cartItemResponseModel);
-
 
251
			}
-
 
252
		}
-
 
253
		if (cart.getCheckoutTimestamp() != null) {
-
 
254
			if (cart.getUpdateTimestamp().isBefore(cart.getCheckoutTimestamp())) {
-
 
255
				cart.setCheckoutTimestamp(null);
-
 
256
			}
-
 
257
		}
-
 
258
		cartResponse.setTotalQty(totalQty);
-
 
259
		cartResponse.setTotalAmount(totalAmount);
-
 
260
		cartResponse.setNonAccessoryQuantity(nonAccessoryQuantity);
-
 
261
		cartResponse.setShippingCharge(0);
-
 
262
		cartResponse.setCartMessageChanged(cartMessageChanged);
-
 
263
		cartResponse.setCartMessageOOS(cartMessageOOS);
-
 
264
		cartResponse.setCartMessageUndeliverable(cartMessageUndeliverable);
-
 
265
		cartResponse.setCod(false);
-
 
266
		return cartResponse;
-
 
267
	}
-
 
268
 
-
 
269
	@Override
-
 
270
	public void addItemsToCart(int cartId, List<CartItem> cartItems) throws ProfitMandiBusinessException {
-
 
271
		logger.info("cart items {}", cartItems);
-
 
272
		cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
-
 
273
		Map<Integer, Integer> itemQuantityMap = cartItems.stream()
-
 
274
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getQuantity()));
-
 
275
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
-
 
276
		// Delete cartLines with 0 values
-
 
277
		for (CartLine cartLine : cartLines) {
-
 
278
			Integer quantity = itemQuantityMap.get(cartLine.getItemId());
-
 
279
			if (quantity == null || quantity.intValue() == 0) {
-
 
280
				cartLineRepository.delete(cartLine);
-
 
281
			} else {
-
 
282
				cartLine.setQuantity(itemQuantityMap.get(cartLine.getItemId()));
-
 
283
				cartLine.setUpdateTimestapm(LocalDateTime.now());
-
 
284
			}
-
 
285
		}
-
 
286
		for (CartItem cartItem : cartItems) {
-
 
287
			if (cartLineRepository.selectByCartItem(cartId, cartItem.getItemId()) == null) {
-
 
288
				CartLine cartLineNew = new CartLine();
-
 
289
				cartLineNew.setItemId(cartItem.getItemId());
-
 
290
				cartLineNew.setQuantity(cartItem.getQuantity());
-
 
291
				cartLineNew.setCartId(cartId);
-
 
292
				cartLineNew.setCreateTimestamp(LocalDateTime.now());
-
 
293
				cartLineRepository.persist(cartLineNew);
-
 
294
			}
-
 
295
		}
-
 
296
 
-
 
297
	}
-
 
298
 
-
 
299
	@Override
-
 
300
	public void addAddressToCart(int cartId, long addressId) throws ProfitMandiBusinessException {
-
 
301
		Cart cart = cartRepository.selectById(cartId);
-
 
302
		cart.setAddressId((int) addressId);
-
 
303
 
-
 
304
	}
-
 
305
 
-
 
306
	@Override
177
	public void addShoppingBag(int cartId, long qty) {
307
	public void addShoppingBag(int cartId, long qty) {
178
		CartLine cl = new CartLine();
308
		CartLine cl = new CartLine();
179
		cl.setItemId(32046);
309
		cl.setItemId(32046);
180
		cl.setQuantity((int) qty);
310
		cl.setQuantity((int) qty);
181
		cl.setCartId(cartId);
311
		cl.setCartId(cartId);
Line 187... Line 317...
187
		cl.setActualPrice((float) 0.01 * qty);
317
		cl.setActualPrice((float) 0.01 * qty);
188
		cartLineRepository.persist(cl);
318
		cartLineRepository.persist(cl);
189
 
319
 
190
	}
320
	}
191
 
321
 
-
 
322
	@Override
-
 
323
	public CartModel removeFromCart(int cartId, int itemId) {
-
 
324
		// TODO Auto-generated method stub
-
 
325
		return null;
-
 
326
	}
-
 
327
 
192
}
328
}