Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4687 mandeep.dh 1
package in.shop2020.inventory.controllers;
2
 
5110 mandeep.dh 3
import in.shop2020.model.v1.catalog.InventoryType;
4846 mandeep.dh 4
import in.shop2020.model.v1.catalog.Item;
5361 mandeep.dh 5
import in.shop2020.model.v1.catalog.ItemType;
5110 mandeep.dh 6
import in.shop2020.model.v1.catalog.Warehouse;
7
import in.shop2020.model.v1.catalog.WarehouseType;
8
import in.shop2020.model.v1.order.LineItem;
9
import in.shop2020.purchase.PurchaseOrder;
4687 mandeep.dh 10
import in.shop2020.purchase.PurchaseServiceException;
11
import in.shop2020.thrift.clients.CatalogClient;
12
import in.shop2020.thrift.clients.PurchaseClient;
13
import in.shop2020.thrift.clients.WarehouseClient;
4846 mandeep.dh 14
import in.shop2020.utils.ModelUtils;
4687 mandeep.dh 15
import in.shop2020.warehouse.InventoryItem;
16
import in.shop2020.warehouse.ScanType;
17
import in.shop2020.warehouse.WarehouseService.Client;
18
import in.shop2020.warehouse.WarehouseServiceException;
19
 
4846 mandeep.dh 20
import java.util.ArrayList;
5110 mandeep.dh 21
import java.util.HashMap;
4846 mandeep.dh 22
import java.util.List;
5110 mandeep.dh 23
import java.util.Map;
4846 mandeep.dh 24
 
4687 mandeep.dh 25
import javax.servlet.ServletContext;
26
 
27
import org.apache.struts2.convention.annotation.Result;
28
import org.apache.struts2.convention.annotation.Results;
29
import org.apache.thrift.TException;
30
import org.apache.thrift.transport.TTransportException;
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33
 
34
@SuppressWarnings("serial")
35
@Results({ @Result(name = "redirect", type = "redirectAction", params = {
36
        "actionName", "warehouse" }) })
37
public class PurchaseController extends BaseController {
5110 mandeep.dh 38
    /**
39
     * 
40
     */
41
    private static final int NUM_BULK__SCAN_ITEMS = 10;
42
    private static Logger logger = LoggerFactory.getLogger(PurchaseController.class);
43
    private static enum ScanRecordType { VALID, BLANK };
4687 mandeep.dh 44
 
45
    private ServletContext context;
46
    private String id;
47
    private String itemId;
48
    private String itemNo;
49
    private String errorMsg = "";
4846 mandeep.dh 50
    private List<Item> items;
5110 mandeep.dh 51
    private List<LineItem> lineItems;
4687 mandeep.dh 52
 
53
    private String purchaseOrderId;
5110 mandeep.dh 54
    private Warehouse warehouse;
4687 mandeep.dh 55
 
56
    public String editNew() {
57
        purchaseOrderId = request.getParameter("poId");
58
        return "new";
59
    }
60
 
61
    public String create() {
62
        this.purchaseOrderId = request.getParameter("poId");
63
        long poId = Long.parseLong(purchaseOrderId);
64
        String invoiceNumber = request.getParameter("invoiceNo");
65
        String fc = request.getParameter("freightCharges").trim();
66
        double freightCharges = 0;
67
        if (fc != null && !fc.isEmpty())
68
            freightCharges = Double.parseDouble(fc);
69
        try {
70
            PurchaseClient purchaseClient = new PurchaseClient();
71
            in.shop2020.purchase.PurchaseService.Client client = purchaseClient
72
                    .getClient();
73
            id = "" + client.startPurchase(poId, invoiceNumber, freightCharges);
74
        } catch (TTransportException e) {
75
            errorMsg = "Error while establishing connection to the warehouse server";
76
            logger.error(errorMsg, e);
77
        } catch (TException e) {
78
            errorMsg = "Error while scanning in the item";
79
            logger.error(errorMsg, e);
80
        } catch (PurchaseServiceException e) {
81
            errorMsg = e.getMessage();
82
            logger.error(errorMsg, e);
83
        }
84
 
85
        if (errorMsg.isEmpty())
86
            return "create";
87
        else {
88
            addActionError(errorMsg);
89
            return "new";
90
        }
91
 
92
    }
93
 
94
    public String show() {
5110 mandeep.dh 95
        resetLineItems();
96
        setItemsFromPO(Long.parseLong(id));
97
        return SHOW;
4687 mandeep.dh 98
    }
99
 
5110 mandeep.dh 100
    private void resetLineItems() {
101
        lineItems = new ArrayList<LineItem>();
102
 
103
        for (int i = 0; i < NUM_BULK__SCAN_ITEMS; i++) {
104
            LineItem lineItem = new LineItem();
105
            lineItem.setId(i);
106
            lineItem.setExtra_info("");
107
            lineItem.setSerial_number("");
108
            lineItem.setItem_number("");
5361 mandeep.dh 109
            lineItem.setQuantity(1);
5110 mandeep.dh 110
            lineItem.setItem_id(-1);
111
            lineItems.add(lineItem);
112
        }
113
    }
114
 
4687 mandeep.dh 115
    public String update() {
116
        long id = Long.parseLong(this.id);
5110 mandeep.dh 117
        setItemsFromPO(id);
4687 mandeep.dh 118
 
119
        try {
5110 mandeep.dh 120
            if (!areValidScans()) {
121
                return SHOW;
122
            }
123
 
4687 mandeep.dh 124
            WarehouseClient warehouseClient = new WarehouseClient();
125
            Client client = warehouseClient.getClient();
5110 mandeep.dh 126
 
127
            for (LineItem lineItem : lineItems) {
128
                if (ScanRecordType.BLANK.name().equals(lineItem.getExtra_info())) {
129
                    continue;
130
                }
131
 
5437 mandeep.dh 132
                InventoryItem inventoryItem = new InventoryItem();
133
                inventoryItem.setItemId(lineItem.getItem_id());
134
                inventoryItem.setPurchaseId(id);
135
                inventoryItem.setCurrentQuantity(0);
136
                inventoryItem.setItemNumber(lineItem.getItem_number());
137
                inventoryItem.setSerialNumber(lineItem.getSerial_number());
138
 
5361 mandeep.dh 139
                if (ItemType.SERIALIZED.name().equals(lineItem.getProductGroup())) {
5437 mandeep.dh 140
                    inventoryItem.setInitialQuantity(1);
5361 mandeep.dh 141
                    client.scanSerializedItem(inventoryItem, ScanType.PURCHASE, PurchaseOrderController.WAREHOUSE_ID);
5110 mandeep.dh 142
                }
143
                else {
5437 mandeep.dh 144
                    inventoryItem.setInitialQuantity(new Double(lineItem.getQuantity()).longValue());
145
                    client.scan(inventoryItem, ScanType.PURCHASE, new Double(lineItem.getQuantity()).longValue(), PurchaseOrderController.WAREHOUSE_ID);
5110 mandeep.dh 146
                }
5361 mandeep.dh 147
            }
5110 mandeep.dh 148
 
149
            resetLineItems();
4687 mandeep.dh 150
        } catch (TTransportException e) {
151
            errorMsg = "Error while establishing connection to the warehouse server";
152
            logger.error(errorMsg, e);
153
        } catch (WarehouseServiceException e) {
154
            errorMsg = e.getMessage();
155
            logger.error(errorMsg, e);
156
        } catch (TException e) {
157
            errorMsg = "Error while scanning in the item";
158
            logger.error(errorMsg, e);
159
        }
5110 mandeep.dh 160
 
4687 mandeep.dh 161
        if (!errorMsg.isEmpty()) {
162
            addActionError(errorMsg);
163
        }
4846 mandeep.dh 164
 
5110 mandeep.dh 165
        return SHOW;
4687 mandeep.dh 166
    }
167
 
5110 mandeep.dh 168
    /**
169
     * @return
170
     * @throws TException 
171
     * @throws NumberFormatException 
172
     */
173
    private boolean areValidScans() throws NumberFormatException, TException {
174
        boolean areValidScans = true;
175
        in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
176
        PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrderForPurchase(Long.parseLong(id));
177
        Map<Long, Long> itemsQuantityMapFromPO = new HashMap<Long, Long>();
178
        for (in.shop2020.purchase.LineItem lineItem : purchaseOrder.getLineitems()) {
179
            itemsQuantityMapFromPO.put(lineItem.getItemId(), (long) lineItem.getUnfulfilledQuantity());
180
        }
181
 
182
        Client warehouseClient = new WarehouseClient().getClient();
183
 
184
        for (LineItem lineItem : lineItems) {
185
            if (lineItem.getItem_id() == -1 && lineItem.getItem_number().isEmpty() && lineItem.getSerial_number().isEmpty()) {
186
                lineItem.setExtra_info(ScanRecordType.BLANK.name());
187
            }
188
            else {
189
                lineItem.setExtra_info(ScanRecordType.VALID.name());
5361 mandeep.dh 190
                if (ItemType.SERIALIZED.name().equals(lineItem.getProductGroup())) {
191
                    if (lineItem.getSerial_number().isEmpty()) {
192
                        lineItem.setExtra_info("Serial number not present.");
193
                        areValidScans = false;
194
                        continue;
5372 mandeep.dh 195
                    }
5361 mandeep.dh 196
 
197
                    try {
198
                        warehouseClient.getInventoryItem(lineItem.getSerial_number());
199
                        lineItem.setExtra_info("Item scanned already.");
200
                        areValidScans = false;
201
                        continue;
202
                    }
203
                    catch (Exception e) {
204
                    }
5110 mandeep.dh 205
                }
206
 
207
                if (lineItem.getItem_id() == -1 && lineItem.getItem_number().isEmpty()) {
208
                    lineItem.setExtra_info("Item not selected/Item number not present.");
209
                    areValidScans = false;
210
                    continue;
211
                }
212
 
213
                if (lineItem.getItem_id() == -1) {
214
                    List<Long> itemIds = warehouseClient.getItemIds(lineItem.getItem_number());
215
                    if (itemIds.isEmpty()) {
216
                        lineItem.setExtra_info("Unknown item number");
217
                        areValidScans = false;
218
                        continue;
219
                    }
220
 
221
                    if (itemIds.size() > 0) {
222
                        int numItemsInPO = 0;
223
                        for (long itemId : itemIds) {
224
                            if (itemsQuantityMapFromPO.containsKey(itemId)) {
225
                                numItemsInPO++;
226
                                lineItem.setItem_id(itemId);
227
                            }
228
                        }
229
 
230
                        if (numItemsInPO > 1) {
231
                            lineItem.setExtra_info("Multiple items found for given item Number. Choose item explicitly.");
232
                            areValidScans = false;
5361 mandeep.dh 233
                            continue;
5110 mandeep.dh 234
                        }
235
                    }
236
                }
237
 
238
                if (!itemsQuantityMapFromPO.containsKey(lineItem.getItem_id())) {
239
                    lineItem.setExtra_info("Item not present in PO.");
240
                    areValidScans = false;
241
                    continue;
242
                }
243
 
5361 mandeep.dh 244
                itemsQuantityMapFromPO.put(lineItem.getItem_id(),
245
                        itemsQuantityMapFromPO.get(lineItem.getItem_id()) - new Double(lineItem.getQuantity()).longValue());
5110 mandeep.dh 246
 
247
                if (itemsQuantityMapFromPO.get(lineItem.getItem_id()) < 0) {
248
                    lineItem.setExtra_info("Item already fulfilled in PO.");
249
                    areValidScans = false;
250
                    continue;
251
                }
252
            }
253
        }
254
 
255
        return areValidScans;
256
    }
257
 
258
    private void setItemsFromPO(long id) {
259
        try {
260
            items = new ArrayList<Item>();
261
            in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
262
            PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrderForPurchase(id);
5361 mandeep.dh 263
            in.shop2020.model.v1.catalog.InventoryService.Client catalogClient = new CatalogClient().getClient();
264
 
5110 mandeep.dh 265
            for (in.shop2020.purchase.LineItem lineItem : purchaseOrder.getLineitems()) {
266
                Item item = new Item();
267
                item.setId(lineItem.getItemId());
268
                item.setBrand(lineItem.getBrand());
269
                item.setModelName(lineItem.getModelName());
270
                item.setModelNumber(lineItem.getModelNumber());
271
                item.setColor(lineItem.getColor());
5361 mandeep.dh 272
                item.setProductGroup(catalogClient.getItem(lineItem.getItemId()).getType().name());                
5110 mandeep.dh 273
                items.add(item);
274
            }
275
 
276
            warehouse = catalogClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, purchaseOrder.getSupplierId(), PurchaseOrderController.WAREHOUSE_ID, PurchaseOrderController.WAREHOUSE_ID).get(0);
277
        } catch (Exception e) {
278
            logger.error("Could not find items in PO with purchase: " + id, e);
279
        }
280
    }
281
 
4687 mandeep.dh 282
    public String destroy() {
283
        long id = Long.parseLong(this.id);
284
 
285
        try {
286
            PurchaseClient warehouseClient = new PurchaseClient();
287
            in.shop2020.purchase.PurchaseService.Client client = warehouseClient
288
                    .getClient();
289
            client.closePurchase(id);
290
        } catch (TTransportException e) {
291
            errorMsg = "Error while establishing connection to the warehouse server";
292
            logger.error(errorMsg, e);
293
        } catch (TException e) {
294
            errorMsg = "Error while scanning in the item";
295
            logger.error(errorMsg, e);
296
        } catch (PurchaseServiceException e) {
297
            errorMsg = e.getMessage();
298
            logger.error(errorMsg, e);
299
        }
300
        return "redirect";
301
    }
302
 
303
    public String createItemNumberMapping() {
304
        long itemIdLong = Long.parseLong(itemId);
305
 
306
        try {
307
            Client warehouseClient = new WarehouseClient().getClient();
308
            warehouseClient.createItemNumberMapping(itemNo, itemIdLong);
309
        } catch (TTransportException e) {
310
            logger.error("Could not create thrift client", e);
311
        } catch (TException e) {
312
            logger.error("Could not create item number mapping", e);
313
        }
314
 
315
        return show();
316
    }
317
 
5110 mandeep.dh 318
    public String itemNumberMappingEditNew() {
319
        return "item-number-mapping";
320
    }
321
 
4846 mandeep.dh 322
    public String getName(Item item){
323
        return ModelUtils.extractProductNameFromItem(item);
324
    }
325
 
4687 mandeep.dh 326
    public void setId(String id) {
327
        this.id = id;
328
    }
329
 
330
    public String getId() {
331
        return id;
332
    }
333
 
334
    public String getErrorMessage() {
335
        return errorMsg;
336
    }
337
 
338
    public String getPurchaseOrderId() {
339
        return purchaseOrderId;
340
    }
341
 
342
    public String getServletContextPath() {
343
        return context.getContextPath();
344
    }
345
 
346
    public String getItemId() {
347
        return itemId;
348
    }
349
 
350
    public void setItemId(String itemId) {
351
        this.itemId = itemId;
352
    }
353
 
354
    public String getItemNo() {
355
        return itemNo;
356
    }
357
 
358
    public void setItemNo(String itemNo) {
359
        this.itemNo = itemNo;
360
    }
361
 
4846 mandeep.dh 362
    public List<Item> getItems() {
363
        return items;
364
    }
365
 
366
    public void setItems(List<Item> items) {
367
        this.items = items;
368
    }
369
 
5110 mandeep.dh 370
    public List<LineItem> getLineItems() {
371
        return lineItems;
372
    }
373
 
374
    public void setLineItems(List<LineItem> lineItems) {
375
        this.lineItems = lineItems;
376
    }
377
 
378
    public Warehouse getWarehouse() {
379
        return warehouse;
380
    }
4687 mandeep.dh 381
}