Subversion Repositories SmartDukaan

Rev

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