Subversion Repositories SmartDukaan

Rev

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

Rev 23069 Rev 23081
Line 1... Line 1...
1
package in.shop2020.inventory.controllers;
1
package in.shop2020.inventory.controllers;
2
 
2
 
3
import in.shop2020.model.v1.order.Order;
3
import in.shop2020.model.v1.order.Order;
4
import in.shop2020.thrift.clients.InventoryClient;
4
import in.shop2020.thrift.clients.InventoryClient;
5
import in.shop2020.thrift.clients.TransactionClient;
5
import in.shop2020.thrift.clients.TransactionClient;
-
 
6
import in.shop2020.thrift.clients.WarehouseClient;
-
 
7
import in.shop2020.warehouse.InventoryItem;
-
 
8
import in.shop2020.warehouse.WarehouseService.Client;
6
 
9
 
7
import java.io.BufferedInputStream;
10
import java.io.BufferedInputStream;
8
import java.io.BufferedWriter;
11
import java.io.BufferedWriter;
9
import java.io.File;
12
import java.io.File;
10
import java.io.FileInputStream;
13
import java.io.FileInputStream;
11
import java.io.FileWriter;
14
import java.io.FileWriter;
12
import java.io.InputStream;
15
import java.io.InputStream;
13
import java.text.DateFormat;
16
import java.text.DateFormat;
14
import java.text.SimpleDateFormat;
17
import java.text.SimpleDateFormat;
-
 
18
import java.util.ArrayList;
15
import java.util.HashMap;
19
import java.util.HashMap;
16
import java.util.HashSet;
20
import java.util.HashSet;
-
 
21
import java.util.Iterator;
17
import java.util.List;
22
import java.util.List;
18
import java.util.Map;
23
import java.util.Map;
19
import java.util.Set;
24
import java.util.Set;
20
 
25
 
21
import javax.servlet.ServletOutputStream;
26
import javax.servlet.ServletOutputStream;
22
 
27
 
23
import org.apache.commons.lang.StringUtils;
28
import org.apache.commons.lang.StringUtils;
24
import org.apache.commons.logging.Log;
29
import org.apache.commons.logging.Log;
25
import org.apache.commons.logging.LogFactory;
30
import org.apache.commons.logging.LogFactory;
-
 
31
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
 
32
import org.apache.poi.ss.usermodel.Row;
-
 
33
import org.apache.poi.ss.usermodel.Sheet;
-
 
34
import org.apache.poi.ss.usermodel.Workbook;
-
 
35
 
-
 
36
public class PriceDropController extends BaseController {
-
 
37
 
-
 
38
	private static final DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
26
 
39
 
27
public class PriceDropController extends BaseController{
-
 
28
	
-
 
29
	private TransactionClient tsc;
40
	private TransactionClient tsc;
30
	private in.shop2020.model.v1.order.TransactionService.Client tClient;
41
	private in.shop2020.model.v1.order.TransactionService.Client tClient;
31
	
42
 
32
	private InventoryClient ic;
43
	private InventoryClient ic;
33
	private in.shop2020.model.v1.inventory.InventoryService.Client iClient;
44
	private in.shop2020.model.v1.inventory.InventoryService.Client iClient;
-
 
45
 
-
 
46
	private WarehouseClient wc;
-
 
47
	private Client wClient;
34
	
48
 
35
	private static Log logger = LogFactory.getLog(PurchaseReportController.class);
49
	private static Log logger = LogFactory.getLog(PurchaseReportController.class);
36
	private String closingDate;
50
	private String closingDate;
37
	private int itemId;
51
	private int itemId;
-
 
52
 
-
 
53
	private File imeiFile;
-
 
54
	private String imeiFileContentType;
-
 
55
	private String imeiFileFileName;
-
 
56
	private String affectedDate;
-
 
57
 
-
 
58
	private double priceDrop;
-
 
59
 
-
 
60
	public File getImeiFile() {
-
 
61
		return imeiFile;
-
 
62
	}
-
 
63
 
-
 
64
	public String getAffectedDate() {
-
 
65
		return affectedDate;
-
 
66
	}
-
 
67
 
-
 
68
	public void setAffectedDate(String affectedDate) {
-
 
69
		this.affectedDate = affectedDate;
-
 
70
	}
-
 
71
 
-
 
72
	public void setImeiFile(File imeiFile) {
-
 
73
		this.imeiFile = imeiFile;
-
 
74
	}
-
 
75
 
-
 
76
	public String getImeiFileContentType() {
-
 
77
		return imeiFileContentType;
-
 
78
	}
-
 
79
 
-
 
80
	public void setImeiFileContentType(String imeiFileContentType) {
-
 
81
		this.imeiFileContentType = imeiFileContentType;
-
 
82
	}
-
 
83
 
-
 
84
	public String getImeiFileFileName() {
-
 
85
		return imeiFileFileName;
-
 
86
	}
-
 
87
 
-
 
88
	public void setImeiFileFileName(String imeiFileFileName) {
-
 
89
		this.imeiFileFileName = imeiFileFileName;
-
 
90
	}
-
 
91
 
38
    public int getItemId() {
92
	public int getItemId() {
39
		return itemId;
93
		return itemId;
40
	}
94
	}
41
 
95
 
42
	public void setItemId(int itemId) {
96
	public void setItemId(int itemId) {
43
		this.itemId = itemId;
97
		this.itemId = itemId;
44
	}
98
	}
45
 
99
 
46
	private final DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
 
47
    
-
 
48
    
100
 
49
    public String index() {
101
	public String index() {
50
    	return INDEX;
102
		return INDEX;
51
    }
103
	}
52
    
104
 
53
    public String downloadImeis() throws Exception {
105
	public String downloadImeis() throws Exception {
54
    	long closingDateLong;
106
		long closingDateLong;
55
		try {
107
		try {
56
			closingDateLong = sdf.parse(this.closingDate).getTime();
108
			closingDateLong = sdf.parse(this.closingDate).getTime();
57
		} catch (Exception e) {
109
		} catch (Exception e) {
58
			this.addActionError("Invalid date format");
110
			this.addActionError("Invalid closing date");
59
			return INDEX;
111
			return INDEX;
60
		}
112
		}
61
		tsc = new TransactionClient();
113
		tsc = new TransactionClient();
62
		tClient = tsc.getClient();
114
		tClient = tsc.getClient();
63
		
115
 
64
		List<Order> inTransitOrders;
116
		List<Order> inTransitOrders;
65
 
117
 
66
		inTransitOrders = tClient.getInTransitOrdersOnDateByItemId(closingDateLong, this.itemId);
118
		inTransitOrders = tClient.getInTransitOrdersOnDateByItemId(closingDateLong, this.itemId);
67
		
119
 
68
		Set<Long> warehouseSet = new HashSet<Long>();
120
		Set<Long> warehouseSet = new HashSet<Long>();
69
		for(Order o: inTransitOrders) {
121
		for (Order o : inTransitOrders) {
70
			warehouseSet.add(o.getFulfilmentWarehouseId());
122
			warehouseSet.add(o.getFulfilmentWarehouseId());
71
		}
123
		}
72
		
124
 
73
		ic = new InventoryClient();
125
		ic = new InventoryClient();
74
		iClient = ic.getClient();
126
		iClient = ic.getClient();
75
		
127
 
76
		Map<Long, String> warehouseNameMap = new HashMap<Long, String>(); 
128
		Map<Long, String> warehouseNameMap = new HashMap<Long, String>();
77
		for (Long warehouseId : warehouseSet) {
129
		for (Long warehouseId : warehouseSet) {
78
			warehouseNameMap.put(warehouseId, iClient.getWarehouseName(warehouseId));
130
			warehouseNameMap.put(warehouseId, iClient.getWarehouseName(warehouseId));
79
		}
131
		}
80
 
132
 
81
		byte[] buffer = null;
133
		byte[] buffer = null;
82
        File file = createFile(inTransitOrders, warehouseNameMap);
134
		File file = createFile(inTransitOrders, warehouseNameMap);
83
        buffer = new byte[(int) file.length()];
135
		buffer = new byte[(int) file.length()];
84
        InputStream input = null;
136
		InputStream input = null;
85
        try {
137
		try {
86
            int totalBytesRead = 0;
138
			int totalBytesRead = 0;
87
            input = new BufferedInputStream(new FileInputStream(file));
139
			input = new BufferedInputStream(new FileInputStream(file));
88
            while (totalBytesRead < buffer.length) {
140
			while (totalBytesRead < buffer.length) {
89
                int bytesRemaining = buffer.length - totalBytesRead;
141
				int bytesRemaining = buffer.length - totalBytesRead;
90
                // input.read() returns -1, 0, or more :
142
				// input.read() returns -1, 0, or more :
91
                int bytesRead = input.read(buffer, totalBytesRead,
143
				int bytesRead = input.read(buffer, totalBytesRead, bytesRemaining);
92
                        bytesRemaining);
-
 
93
                if (bytesRead > 0) {
144
				if (bytesRead > 0) {
94
                    totalBytesRead = totalBytesRead + bytesRead;
145
					totalBytesRead = totalBytesRead + bytesRead;
95
                }
146
				}
96
            }
147
			}
97
            /*
148
			/*
98
             * the above style is a bit tricky: it places bytes into the
149
			 * the above style is a bit tricky: it places bytes into the
99
             * 'buffer' array; 'buffer' is an output parameter; the while
150
			 * 'buffer' array; 'buffer' is an output parameter; the while loop
100
             * loop usually has a single iteration only.
151
			 * usually has a single iteration only.
101
             */
152
			 */
102
        } finally {
153
		} finally {
103
            input.close();
154
			input.close();
104
        }
155
		}
105
 
156
 
106
        response.setContentType("application/vnd.ms-excel");
157
		response.setContentType("application/vnd.ms-excel");
107
        response.setHeader("Content-disposition", "inline; filename="
158
		response.setHeader("Content-disposition", "inline; filename=" + file.getName());
108
                + file.getName());
-
 
109
 
159
 
110
        ServletOutputStream sos = response.getOutputStream();
160
		ServletOutputStream sos = response.getOutputStream();
111
        sos.write(buffer);
161
		sos.write(buffer);
112
        sos.flush();
162
		sos.flush();
113
		
163
 
114
    	return null;
164
		return null;
115
    }
165
	}
116
 
166
 
117
	private File createFile(List<Order> inTransitOrders, Map<Long, String> warehouseNameMap) {
167
	private File createFile(List<Order> inTransitOrders, Map<Long, String> warehouseNameMap) {
118
		try {
168
		try {
119
        	String tmpDir = System.getProperty("java.io.tmpdir");
169
			String tmpDir = System.getProperty("java.io.tmpdir");
120
            File file = new File(tmpDir + "/IntransitIMEIS-" + this.closingDate + this.itemId
170
			File file = new File(tmpDir + "/IntransitIMEIS-" + this.closingDate + this.itemId + ".xls");
121
                    + ".xls");
-
 
122
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(
171
			BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
123
                    file));
-
 
124
            bufferedWriter.write(StringUtils.join(new String[] { "Order Id",
172
			bufferedWriter.write(StringUtils.join(new String[] { "Order Id", "Vendor Name", "Brand", "ModelName", "ModelNumber", "Color",
125
                    "Vendor Name", "Brand", "ModelName", "ModelNumber", "Color", "UnitPrice", "IMEI"},
-
 
126
                    '\t'));
173
					"UnitPrice", "IMEI" }, '\t'));
127
 
174
 
128
            for (Order order : inTransitOrders) {
175
			for (Order order : inTransitOrders) {
129
                bufferedWriter.newLine();
176
				bufferedWriter.newLine();
130
                in.shop2020.model.v1.order.LineItem lineitem = order.getLineitems().get(0);
177
				in.shop2020.model.v1.order.LineItem lineitem = order.getLineitems().get(0);
131
                for(String serialNumber : lineitem.getSerial_number().split(",")){
178
				for (String serialNumber : lineitem.getSerial_number().split(",")) {
132
                	bufferedWriter.write(StringUtils.join(
179
					bufferedWriter.write(StringUtils.join(
-
 
180
							new String[] { String.valueOf(order.getId()), warehouseNameMap.get(order.getFulfilmentWarehouseId()),
-
 
181
									lineitem.getBrand(), lineitem.getModel_name(), lineitem.getModel_number(), lineitem.getColor(),
-
 
182
									String.valueOf(lineitem.getUnit_price()), serialNumber, order.getStatusDescription() }, '\t'));
-
 
183
				}
-
 
184
			}
-
 
185
 
-
 
186
			bufferedWriter.close();
-
 
187
			return file;
-
 
188
		} catch (Exception e) {
-
 
189
			return null;
-
 
190
		}
-
 
191
	}
-
 
192
 
-
 
193
	public String uploadImeis() throws Exception {
-
 
194
		long affectedDateLong;
-
 
195
		try {
-
 
196
			affectedDateLong = sdf.parse(this.affectedDate).getTime();
133
                			new String[] {
197
		} catch (Exception e) {
-
 
198
			e.printStackTrace();
134
                					String.valueOf(order.getId()),
199
			this.addActionError("Invalid Affected Date");
-
 
200
			return INDEX;
-
 
201
		}
135
                					warehouseNameMap.get(order.getFulfilmentWarehouseId()),
202
		FileInputStream inputStream = new FileInputStream(this.imeiFile);
-
 
203
 
-
 
204
		Workbook workbook = new HSSFWorkbook(inputStream);
136
                					lineitem.getBrand(),
205
		Sheet firstSheet = workbook.getSheetAt(0);
-
 
206
		
137
                					lineitem.getModel_name(),
207
		Iterator<Row> iterator = firstSheet.iterator();
138
                					lineitem.getModel_number(),
208
		List<String> imeis = new ArrayList<String>();
-
 
209
		// Ignore first row as it is header
-
 
210
		if (iterator.hasNext()) {
-
 
211
			iterator.next();
-
 
212
		}
-
 
213
		while (iterator.hasNext()) {
139
                					lineitem.getColor(),
214
			Row nextRow = iterator.next();
-
 
215
			// logger.info("IMEIs " + nextRow.getCell(0).getStringCellValue());
140
                					String.valueOf(lineitem.getUnit_price()),
216
			String imei = String.valueOf((int)(nextRow.getCell(0).getNumericCellValue()));
141
                					serialNumber,
217
			if (imei.length() < 15) {
142
                					order.getStatusDescription() }, '\t'));
218
				addActionError("IMEI size should be of 15 digit - " + imei);
143
                }
219
				return INDEX;
144
            }
220
			}
145
 
221
		}
-
 
222
		// Check if all imeis belong to specified item
146
            bufferedWriter.close();
223
		wc = new WarehouseClient();
147
            return file;
224
		wClient = wc.getClient();
-
 
225
		if (imeis.size() > 0) {
-
 
226
			List<InventoryItem> inventoryItems = wClient.getInventoryItems(imeis);
-
 
227
			Map<String, InventoryItem> inventoryItemMap = new HashMap<String, InventoryItem>();
-
 
228
			
-
 
229
			for(InventoryItem inventoryItem : inventoryItems) {
-
 
230
				inventoryItemMap.put(inventoryItem.getSerialNumber(), inventoryItem);
-
 
231
			}
-
 
232
			if(inventoryItems.size() != imeis.size()) {
-
 
233
				addActionError("Few IMEIs are missing");
148
        } catch (Exception e) {
234
				for (String imei : imeis) {
-
 
235
					if(!inventoryItemMap.containsKey(imei)) {
-
 
236
						addActionError(imei);
-
 
237
					}
-
 
238
				}
-
 
239
			}
-
 
240
			for (InventoryItem inventoryItem : inventoryItems) {
-
 
241
				if (inventoryItem.getItemId() != this.getItemId()) {
-
 
242
					addActionError("IMEI " + inventoryItem.getSerialNumber() + " belongs to other item - " + inventoryItem.getItemId());
149
            return null;
243
					return INDEX;
-
 
244
				}
-
 
245
			}
-
 
246
			
-
 
247
			tsc = new TransactionClient();
-
 
248
			tClient = tsc.getClient();
-
 
249
			tClient.addPriceDrop(itemId, imeis, this.priceDrop, affectedDateLong);
-
 
250
			
150
        }
251
		} else {
-
 
252
			addActionError("Serial numbers should not be empty");
-
 
253
		}
-
 
254
		
-
 
255
		
-
 
256
		
-
 
257
		addActionMessage("Items Added Successfully");
-
 
258
		return INDEX;
151
	}
259
	}
152
 
260
 
153
	public void setClosingDate(String closingDate) {
261
	public void setClosingDate(String closingDate) {
154
		this.closingDate = closingDate;
262
		this.closingDate = closingDate;
155
	}
263
	}
156
 
264
 
157
	public String getClosingDate() {
265
	public String getClosingDate() {
158
		return closingDate;
266
		return closingDate;
159
	}
267
	}
-
 
268
 
-
 
269
 
-
 
270
	public void setPriceDrop(double priceDrop) {
-
 
271
		this.priceDrop = priceDrop;
-
 
272
	}
-
 
273
 
-
 
274
	public double getPriceDrop() {
-
 
275
		return priceDrop;
-
 
276
	}
-
 
277
	
-
 
278
	
160
}
279
}