Subversion Repositories SmartDukaan

Rev

Rev 3364 | Rev 4823 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3364 chandransh 1
package in.shop2020.support.controllers;
2
 
3
import java.io.ByteArrayOutputStream;
4
import java.io.File;
5
import java.io.FileNotFoundException;
6
import java.io.FileOutputStream;
7
import java.io.IOException;
8
import java.util.ArrayList;
9
import java.util.Calendar;
10
import java.util.GregorianCalendar;
11
import java.util.List;
12
import java.util.Map;
13
 
14
import in.shop2020.model.v1.catalog.InventoryServiceException;
15
import in.shop2020.model.v1.catalog.Item;
16
import in.shop2020.model.v1.catalog.status;
17
import in.shop2020.support.utils.FileUtils;
18
import in.shop2020.support.utils.ReportsUtils;
19
import in.shop2020.thrift.clients.CatalogClient;
20
 
21
import javax.servlet.ServletContext;
22
import javax.servlet.ServletOutputStream;
23
import javax.servlet.http.HttpServletRequest;
24
import javax.servlet.http.HttpServletResponse;
25
import javax.servlet.http.HttpSession;
26
 
27
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
28
import org.apache.poi.ss.usermodel.Row;
29
import org.apache.poi.ss.usermodel.Sheet;
30
import org.apache.poi.ss.usermodel.Workbook;
31
import org.apache.struts2.convention.annotation.InterceptorRef;
32
import org.apache.struts2.convention.annotation.InterceptorRefs;
3936 chandransh 33
import org.apache.struts2.convention.annotation.Result;
34
import org.apache.struts2.convention.annotation.Results;
3364 chandransh 35
import org.apache.struts2.interceptor.ServletRequestAware;
36
import org.apache.struts2.interceptor.ServletResponseAware;
37
import org.apache.struts2.util.ServletContextAware;
38
import org.apache.thrift.TException;
39
import org.apache.thrift.transport.TTransportException;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42
 
43
 
44
@InterceptorRefs({
45
    @InterceptorRef("defaultStack"),
46
    @InterceptorRef("login")
47
})
3936 chandransh 48
@Results({
49
    @Result(name="authfail", type="redirectAction", params = {"actionName" , "reports"})
50
})
3364 chandransh 51
public class StockReportsController implements ServletRequestAware, ServletResponseAware, ServletContextAware{
52
 
53
    private static Logger logger = LoggerFactory.getLogger(StockReportsController.class);    
54
 
55
    private static final int ID = 0, BRAND = 1, MODEL_NUMBER = 2, MODEL_NAME = 3, COLOR = 4, QUANTITY = 5;
56
    private static final String REPORT_DIR = "/inventory-report";
57
 
58
    private HttpSession session;
59
    private HttpServletRequest request;
60
    private HttpServletResponse response;
61
    private ServletContext context;
62
 
63
    private String errorMsg = "";
64
 
65
    public String index(){
66
        if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
3936 chandransh 67
            return "authfail";
3364 chandransh 68
        }
69
        return "index";
70
    }
71
 
72
    public String create(){
73
 
74
        Calendar date = new GregorianCalendar();
75
        int year = date.get(Calendar.YEAR);
76
        int month = date.get(Calendar.MONTH) +1;
77
        int day = date.get(Calendar.DAY_OF_MONTH);
78
        String filename = "inventory-report." + year + "-" + month + "-" + day + ".xls";
79
 
80
        File inventoryReportFile = new File(REPORT_DIR + File.separator + filename);
81
 
82
        if(!inventoryReportFile.exists()){
83
            //Report doesn't exist. Need to generate it.
84
            ByteArrayOutputStream baosXLS = generateInventoryStockReport();
85
            if (baosXLS == null) {
86
                errorMsg = "Could not get output";
87
                return "index";
88
            }
89
 
90
            try {
91
                FileOutputStream f = new FileOutputStream(inventoryReportFile);
92
                baosXLS.writeTo(f);
93
                f.close();
94
            } catch (FileNotFoundException e) {
95
                logger.error("Error while writing the inventory report", e);
96
                return "index";
97
            } catch (IOException e) {
98
                logger.error("Error while writing the inventory report", e);
99
                return "index";
100
            }
101
        }
102
 
103
        response.setContentType("application/vnd.ms-excel");
104
        response.setHeader("Content-disposition", "inline; filename=" + filename);
105
        try {
106
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
107
            baos.write(FileUtils.getBytesFromFile(new File(REPORT_DIR + File.separator + filename)));
108
            ServletOutputStream sos = response.getOutputStream();
109
            baos.writeTo(sos);
110
            sos.flush();
111
            errorMsg = "Report generated";
112
        } catch (IOException e) {
113
            logger.error("Unable to stream the inventory stock report", e);
114
            errorMsg = "Failed to write to response.";
115
        }
116
        return "index";
117
    }
118
 
119
    private ByteArrayOutputStream generateInventoryStockReport(){
120
        List<RowItem> outOfStockItems = new ArrayList<RowItem>();
121
        List<RowItem> itemsDeliverableNextDay = new ArrayList<RowItem>();
122
        List<RowItem> itemsNotDeliverableNextDay = new ArrayList<RowItem>();
123
 
124
        CatalogClient catalogClientService;
125
        try {
126
            catalogClientService = new CatalogClient();
127
            in.shop2020.model.v1.catalog.InventoryService.Client client = catalogClientService.getClient();
128
            List<Item> items = client.getAllItems(false);
129
 
130
            for(Item item : items){
131
                if(!"Handsets".equals(item.getProductGroup()))
132
                    continue;
133
                status state = item.getItemStatus();
134
                switch(state){
135
                case IN_PROCESS:
136
                case CONTENT_COMPLETE:
137
                case DELETED:
138
                case PHASED_OUT:
139
                    continue;
140
                case PAUSED:
141
                case PAUSED_BY_RISK:
142
                case ACTIVE:
143
                    RowItem rowItem = new RowItem(item);
144
                    if(state == status.ACTIVE){
145
                        if(rowItem.quantity >= 2)
146
                            itemsDeliverableNextDay.add(rowItem);
147
                        else
148
                            itemsNotDeliverableNextDay.add(rowItem);    
149
                    }else
150
                        outOfStockItems.add(rowItem);
151
                }
152
            }
153
        } catch (TTransportException e) {
154
            logger.error("Unable to get the items from the inventory", e);
155
            return null;
156
        } catch (InventoryServiceException e) {
157
            logger.error("Error while getting the items from the inventory", e);
158
            return null;
159
        } catch (TException e) {
160
            logger.error("Error while getting the items from the inventory", e);
161
            return null;
162
        }
163
 
164
        ByteArrayOutputStream baosXLS = new ByteArrayOutputStream();
165
 
166
        Workbook wb = new HSSFWorkbook();
167
 
168
        createSheet(wb, "Items Deliverable on Next Day", itemsDeliverableNextDay);
169
        createSheet(wb, "Items Not Deliverable on Next Day", itemsNotDeliverableNextDay);
170
        createSheet(wb, "Out of Stock Items", outOfStockItems);
171
 
172
        try {
173
            wb.write(baosXLS);
174
            baosXLS.close();
175
        } catch (IOException e) {
176
            logger.error("Error while streaming inventory stock report", e);
177
            return null;
178
        }
179
        return baosXLS;
180
    }
181
 
182
    private void createSheet(Workbook wb, String name, List<RowItem> items){
183
        Sheet sheet = wb.createSheet(name);
184
        short serialNo = 0;
185
        Row headerRow = sheet.createRow(serialNo++);
186
        headerRow.createCell(ID).setCellValue("Item Id");
187
        headerRow.createCell(BRAND).setCellValue("Brand");
188
        headerRow.createCell(MODEL_NUMBER).setCellValue("Model Number");
189
        headerRow.createCell(MODEL_NAME).setCellValue("Model Name");
190
        headerRow.createCell(COLOR).setCellValue("Color");
191
        headerRow.createCell(QUANTITY).setCellValue("Quantity");
192
 
193
        for(RowItem item : items){
194
            Row contentRow = sheet.createRow(serialNo++);
195
            contentRow.createCell(ID).setCellValue(item.id);
196
            contentRow.createCell(BRAND).setCellValue(item.brand);
197
            contentRow.createCell(MODEL_NUMBER).setCellValue(item.modelNumber);
198
            contentRow.createCell(MODEL_NAME).setCellValue(item.modelName);
199
            contentRow.createCell(COLOR).setCellValue(item.color);
200
            contentRow.createCell(QUANTITY).setCellValue(item.quantity);
201
        }
202
    }
203
 
204
    public String getErrorMsg() {
205
        return errorMsg;
206
    }
207
 
208
    @Override
209
    public void setServletRequest(HttpServletRequest req) {
210
        this.request = req;
211
        this.session = req.getSession();
212
    }
213
 
214
    @Override
215
    public void setServletResponse(HttpServletResponse res) {
216
        this.response = res;
217
    }
218
 
219
    @Override
220
    public void setServletContext(ServletContext context) {
221
        this.context = context;
222
    }
223
 
224
    public String getServletContextPath() {
225
        return context.getContextPath();
226
    }
227
 
228
    public static void main(String[] args) {
229
        StockReportsController src = new StockReportsController();
230
        try {
231
            String userHome = System.getProperty("user.home");
232
            FileOutputStream f = new FileOutputStream(userHome + "/stock-report.xls");
233
            ByteArrayOutputStream baosXLS = src.generateInventoryStockReport();
234
            baosXLS.writeTo(f);
235
            f.close();
236
        } catch (FileNotFoundException e) {
237
            logger.error("Error creating inventory stock report", e);
238
        } catch (IOException e) {
239
            logger.error("IO error while creating inventory stock report", e);
240
        }
241
        System.out.println("Successfully generated the inventory stock report");
242
    }
243
 
244
    class RowItem {
245
        public long id;
246
        public String brand;
247
        public String modelNumber;
248
        public String modelName;
249
        public String color;
250
        public long quantity;
251
 
252
        public RowItem(Item item){
253
           id = item.getId();
254
           brand = item.getBrand();
255
           modelNumber = item.getModelNumber();
256
           modelName = item.getModelName();
257
           color = item.getColor();
258
           quantity = 0;
259
           for(Map.Entry<Long, Long> entry : item.getItemInventory().getAvailability().entrySet()){
260
               quantity += entry.getValue();
261
           }
262
        }
263
    }
264
}