Subversion Repositories SmartDukaan

Rev

Rev 23415 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
23405 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
3
import java.time.LocalDate;
4
import java.time.LocalDateTime;
5
import java.time.LocalTime;
6
import java.util.ArrayList;
7
import java.util.Arrays;
8
import java.util.HashMap;
9
import java.util.HashSet;
10
import java.util.List;
11
import java.util.Map;
12
import java.util.stream.Collectors;
13
 
14
import javax.servlet.http.HttpServletRequest;
15
 
16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.stereotype.Controller;
20
import org.springframework.transaction.annotation.Transactional;
21
import org.springframework.ui.Model;
22
import org.springframework.web.bind.annotation.RequestBody;
23
import org.springframework.web.bind.annotation.RequestMapping;
24
import org.springframework.web.bind.annotation.RequestMethod;
25
 
26
import com.google.common.base.Functions;
27
import com.spice.profitmandi.common.enumuration.IndentStatus;
28
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29
import com.spice.profitmandi.common.model.ItemIdQuantity;
30
import com.spice.profitmandi.dao.entity.catalog.TagListing;
31
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
32
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
33
import com.spice.profitmandi.dao.entity.fofo.Indent;
34
import com.spice.profitmandi.dao.entity.fofo.IndentItem;
35
import com.spice.profitmandi.dao.repository.catalog.CategoryRepository;
36
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
37
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
38
import com.spice.profitmandi.dao.repository.dtr.IndentItemRepository;
39
import com.spice.profitmandi.dao.repository.dtr.IndentRepository;
40
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
41
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
42
import com.spice.profitmandi.service.indent.IndentService;
43
import com.spice.profitmandi.web.model.LoginDetails;
44
import com.spice.profitmandi.web.util.CookiesProcessor;
45
import com.spice.profitmandi.web.util.MVCResponseSender;
46
 
47
@Controller
48
@Transactional(rollbackFor = Throwable.class)
49
public class IndentController {
50
 
51
	private static final Logger LOGGER = LoggerFactory.getLogger(IndentController.class);
52
 
53
	@Autowired
54
	private CookiesProcessor cookiesProcessor;
55
 
56
	@Autowired
57
	private CategoryRepository categoryRepository;
58
 
59
	@Autowired
60
	private ItemRepository itemRepository;
61
 
62
	@Autowired
63
	private IndentRepository indentRepository;
64
 
65
	@Autowired
66
	private IndentItemRepository indentItemRepository;
67
 
68
	@Autowired
69
	private IndentService indentService;
70
 
71
	@Autowired
72
	private TagListingRepository tagListingRepository;
73
 
74
	@Autowired
75
	private FofoOrderRepository fofoOrderRepository;
76
 
77
	@Autowired
78
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
79
 
80
	@Autowired
81
	private MVCResponseSender mvcResponseSender;
82
 
83
	@RequestMapping(value = "/indent-item/save", method = RequestMethod.PUT)
84
	public String saveIndentItem(HttpServletRequest request, @RequestBody ItemIdQuantity itemIdQuantity, Model model)
85
			throws Exception {
86
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
87
		LOGGER.info("Item id is {}, And quantity is {}", itemIdQuantity.getItemId(), itemIdQuantity.getItemId());
88
		int fofoId = loginDetails.getFofoId();
89
		boolean response = indentService.updateOpenIndentItem(fofoId, itemIdQuantity.getItemId(),
90
				itemIdQuantity.getQuantity());
91
		model.addAttribute("response", mvcResponseSender.createResponseString(response));
92
		return "response";
93
	}
94
 
95
	@RequestMapping(value = "/open-indent/save", method = RequestMethod.PUT)
96
	public String saveOpenIndent(HttpServletRequest request, Model model) throws Exception {
97
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
98
		int fofoId = loginDetails.getFofoId();
99
		List<Indent> openIndents = indentRepository.selectIndentByStatus(fofoId, IndentStatus.OPEN);
100
		if (openIndents.size() > 0) {
101
			Indent openIndent = openIndents.get(0);
102
			if (indentItemRepository.selectIndentItems(Arrays.asList(openIndent.getId())).size() == 0) {
103
				model.addAttribute("response", mvcResponseSender.createResponseString(false));
104
			}
105
			openIndent.setCreateTimestamp(LocalDateTime.now());
106
			openIndent.setStatus(IndentStatus.ALLOCATED);
107
			indentRepository.persist(openIndent);
108
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
109
		}
110
		return "response";
111
	}
112
 
113
	@RequestMapping(value = "/indent/inProcess")
114
	public String loadInProcessIndents(HttpServletRequest request, Model model) throws ProfitMandiBusinessException{
115
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
116
		int fofoId = loginDetails.getFofoId();
117
 
118
		List<Integer> pendingIndentIds = indentRepository.selectIndentByStatus(fofoId, IndentStatus.PENDING).stream().map(x->x.getId()).collect(Collectors.toList());
119
		List<Integer> allocatedIndentIds = indentRepository.selectIndentByStatus(fofoId, IndentStatus.ALLOCATED).stream().map(x->x.getId()).collect(Collectors.toList());
120
		pendingIndentIds.addAll(allocatedIndentIds);
121
 
122
		if(pendingIndentIds.size() > 0) {
123
			Map<Integer, IndentItem> pendingIndentItemIdMap = indentItemRepository.selectIndentItems(pendingIndentIds).stream().collect(Collectors.toMap(x->x.getItemId(), x->x));
124
			List<TagListing> tagListings = tagListingRepository.selectByItemIdsAndTagIds(pendingIndentItemIdMap.keySet(), new HashSet<>(Arrays.asList(4)));
125
 
126
			List<FofoOrderItem> fofoOrderItems = fofoOrderRepository.selectByFofoItemIds(fofoId, pendingIndentIds, LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(30), LocalDateTime.now());
127
			Map<Integer, Integer> itemQuantity = fofoOrderItems.stream().collect(
128
					Collectors.groupingBy(FofoOrderItem::getItemId, Collectors.summingInt(FofoOrderItem::getQuantity)));
129
 
130
			List<CurrentInventorySnapshot> cis = currentInventorySnapshotRepository.selectByFofoId(fofoId);
131
			Map<Integer, CurrentInventorySnapshot> itemIdSnapshotMap = cis.stream().collect(Collectors.toMap(CurrentInventorySnapshot::getItemId, Functions.identity()));
132
 
133
			for(TagListing tagListing : tagListings){
134
				Integer itemId = tagListing.getItemId();
135
				tagListing.setItemDescription(itemRepository.selectById(itemId).getItemDescription());
136
				if(itemQuantity.containsKey(itemId)) {
137
					tagListing.setLast30DaysSale(itemQuantity.get(itemId));
138
				}
139
				if(itemIdSnapshotMap.containsKey(itemId)){
140
					tagListing.setStockInHand(itemIdSnapshotMap.get(itemId).getAvailability());
141
				}
142
			}
143
 
144
			model.addAttribute("pendingIndentItemIdMap", pendingIndentItemIdMap);
145
			model.addAttribute("tagListings", tagListings);
146
		}
147
		return "pending-indent";
148
	}
149
 
150
	@RequestMapping(value = "/indent/loadIndent")
151
	public String loadOpenIndent(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
152
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
153
		int fofoId = loginDetails.getFofoId();
154
		List<Indent> openIndents = indentRepository.selectIndentByStatus(fofoId, IndentStatus.OPEN);
155
		Indent openIndent = null;
156
		if (openIndents.size() > 0) {
157
			openIndent = openIndents.get(0);
158
		} else {
159
			LOGGER.info("Indent does not exist");
160
		}
161
		Map<Integer, IndentItem> itemIndentMap = new HashMap<>();
162
		if (openIndent != null) {
163
			List<IndentItem> openIndentItems = indentItemRepository
164
					.selectIndentItems(Arrays.asList(openIndent.getId()));
165
			if (openIndentItems.size() > 0) {
166
				itemIndentMap = openIndentItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x));
167
			}
168
		}
169
 
170
		List<TagListing> tagListings = tagListingRepository.selectAll();
171
 
172
		List<Integer> itemIds = new ArrayList<>();
173
		for (TagListing tagListing : tagListings) {
174
			itemIds.add(tagListing.getItemId());
175
		}
176
 
177
		List<FofoOrderItem> fofoOrderItems = fofoOrderRepository.selectByFofoItemIds(fofoId, itemIds,
178
				LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(30), LocalDateTime.now());
179
		Map<Integer, Integer> itemQuantity = fofoOrderItems.stream().collect(
180
				Collectors.groupingBy(FofoOrderItem::getItemId, Collectors.summingInt(FofoOrderItem::getQuantity)));
181
 
182
		List<CurrentInventorySnapshot> cis = currentInventorySnapshotRepository.selectByFofoId(fofoId);
183
		Map<Integer, CurrentInventorySnapshot> itemIdSnapshotMap = cis.stream()
184
				.collect(Collectors.toMap(CurrentInventorySnapshot::getItemId, Functions.identity()));
185
 
186
		List<Integer> pendingIndentIds = indentRepository.selectIndentByStatus(fofoId, IndentStatus.PENDING).stream()
187
				.map(x -> x.getId()).collect(Collectors.toList());
188
		List<Integer> allocatedIndentIds = indentRepository.selectIndentByStatus(fofoId, IndentStatus.ALLOCATED)
189
				.stream().map(x -> x.getId()).collect(Collectors.toList());
190
		pendingIndentIds.addAll(allocatedIndentIds);
191
 
192
		if (pendingIndentIds.size() > 0) {
193
			List<Integer> pendingItemIds = indentItemRepository.selectIndentItems(pendingIndentIds).stream()
194
					.map(x -> x.getItemId()).collect(Collectors.toList());
195
			tagListings = tagListings.stream().filter(x -> pendingItemIds.indexOf(x.getItemId()) == -1)
196
					.collect(Collectors.toList());
197
		}
198
 
199
		for (TagListing tagListing : tagListings) {
200
			Integer itemId = tagListing.getItemId();
201
			tagListing.setItemDescription(itemRepository.selectById(itemId).getItemDescription());
202
			if (itemQuantity.containsKey(itemId)) {
203
				tagListing.setLast30DaysSale(itemQuantity.get(itemId));
204
			}
205
			if (itemIdSnapshotMap.containsKey(itemId)) {
206
				tagListing.setStockInHand(itemIdSnapshotMap.get(itemId).getAvailability());
207
			}
208
		}
209
 
210
		model.addAttribute("tagListings", tagListings);
211
		model.addAttribute("itemIndentMap", itemIndentMap);
212
		return "open-indent";
213
	}
214
}