-
Notifications
You must be signed in to change notification settings - Fork 1
/
DemoOrder.java
157 lines (140 loc) · 5.85 KB
/
DemoOrder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package com.simplicite.objects.Demo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.simplicite.commons.Demo.DemoCommon;
import com.simplicite.util.AppLog;
import com.simplicite.util.Mail;
import com.simplicite.util.Message;
import com.simplicite.util.ObjectDB;
import com.simplicite.util.PrintTemplate;
import com.simplicite.util.Tool;
import com.simplicite.util.annotations.BusinessObjectPublication;
/**
* Order business object
*/
public class DemoOrder extends ObjectDB {
private static final long serialVersionUID = 1L;
public static final String QUANTITY_FIELDNAME = "demoOrdQuantity";
public static final String NUMBER_FIELDNAME = "demoOrdNumber";
public static final String PRODUCT_FIELDNAME = "demoOrdPrdId";
public static final String REFERENCE_FIELDNAME = PRODUCT_FIELDNAME + "." + DemoProduct.REFERENCE_FIELDNAME;
public static final String STOCK_FIELDNAME = PRODUCT_FIELDNAME + "." + DemoProduct.STOCK_FIELDNAME;
public static final String QUANTITY_ERROR = "ERR_DEMO_ORD_QUANTITY";
public static final String STOCK_ERROR = "ERR_DEMO_PRD_STOCK";
@Override
public List<String> postValidate() {
List<String> msgs = new ArrayList<>();
// Order quantity checking
if (getField(QUANTITY_FIELDNAME).getInt(0) <= 0) {
AppLog.log("DEMO_ERR", getClass(), "postValidate", "Order quantity <0 for order " + getFieldValue(NUMBER_FIELDNAME), null, getGrant());
msgs.add(Message.formatError(QUANTITY_ERROR, null, QUANTITY_FIELDNAME));
}
// Quantity checking
if ("D".equals(getStatus()) && getField(STOCK_FIELDNAME).getInt(0) - getField(QUANTITY_FIELDNAME).getInt(0) <= 0) {
AppLog.log("DEMO_ERR", getClass(), "postValidate", "Zero stock on " + getFieldValue(REFERENCE_FIELDNAME), getGrant());
msgs.add(Message.formatSimpleError(STOCK_ERROR));
}
// Set order unit price only at creation
if (isNew())
setFieldValue("demoOrdUnitPrice", getFieldValue(PRODUCT_FIELDNAME + ".demoPrdUnitPrice"));
return msgs;
}
private static final String DEMO_EMAIL = "demo@simplicite.fr";
/** Hook override: invitation for delivery + stock decrease on shipment */
@Override
public String postUpdate() {
if ("V".equals(getOldStatus()) && "D".equals(getStatus())) { // Upon state transition to delivered
try {
String n = getFieldValue(NUMBER_FIELDNAME);
Date d = Tool.fromDateTime(getFieldValue("demoOrdDeliveryDate"));
String name = getFieldValue("demoOrdCliId.demoCliFirstname") + " " + getFieldValue("demoOrdCliId.demoCliLastname");
String desc = "Hello " + name + ". Your order " + n + " delivery is scheduled";
new Mail(getGrant()).sendInvitation(
d, Tool.shiftSeconds(d, 2*3600),
getFieldValue("demoOrdCliId.demoCliAddress1") + " " + getFieldValue("demoOrdCliId.demoCliAddress2")
+ getFieldValue("demoOrdCliId.demoCliZipCode") + getFieldValue("demoOrdCliId.demoCliCity"),
DEMO_EMAIL, "Simplicité demo",
getFieldValue("demoOrdCliId.demoCliEmail"), name,
"Order " + n + " delivery schedule",
desc, desc);
} catch (Exception e) {
AppLog.warning("Error sending invitation", e, getGrant());
}
try {
ObjectDB prd = getGrant().getTmpObject("DemoProduct");
prd.select(getFieldValue(PRODUCT_FIELDNAME));
int q = getField(QUANTITY_FIELDNAME).getInt(0);
prd.setParameter("QUANTITY", q);
prd.invokeAction("DEMO_DECSTOCK");
prd.removeParameter("QUANTITY");
// Log
AppLog.info("Stock decreased by " + q + " on " + getFieldValue(REFERENCE_FIELDNAME), getGrant());
// User message
return Message.formatSimpleInfo("DEMO_PRD_STOCK_DECREASED");
} catch (Exception e) {
String msg = "Error decreasing stock: " + e.getMessage();
// Log
AppLog.error(msg, e, getGrant());
// User message
return Message.formatSimpleError(msg);
}
}
return super.postUpdate();
}
/** Hook override: check low stock */
@Override
public String postSave() {
int stock = getField(STOCK_FIELDNAME).getInt(0);
if (DemoCommon.getInstance().isLowStock(getGrant(), getFieldValue(PRODUCT_FIELDNAME), stock)) {
String ref = getFieldValue(REFERENCE_FIELDNAME);
// Notify responsible user if stock is low
try {
new Mail(getGrant()).send(DEMO_EMAIL, DEMO_EMAIL,
"Low stock on " + ref,
"<html><body>" +
"<h3>Hello,</h3>" +
"<p>The stock is low for product <b>" + ref + "</b> " +
"(" + stock + ")<br/>Please order new ones !</p>" +
"</body></html>");
} catch (Exception e) {
AppLog.warning("Error sending low stock alert email", e, getGrant());
}
// Log
AppLog.log("DEMO_WARN", getClass(), "postSave", "Low stock on " + ref + ": " + stock, getGrant());
// User message
return Message.formatSimpleWarning("ERR_DEMO_PRD_LOWSTOCK");
}
return super.postSave();
}
/** Hook override: custom short label */
@Override
public String getUserKeyLabel(String[] row) {
return getGrant().T("DEMO_ORDER_NUMBER") + getFieldValue(NUMBER_FIELDNAME, row);
}
/** Hook override: hide history records on tree view */
@Override
public boolean canReference(String objName, String fkFieldName) {
return !isTreeviewInstance() || "DemoOrderHistoric".equals(objName);
}
/** Publication: PDF receipt */
@BusinessObjectPublication
public Object printReceipt(PrintTemplate pt) {
try {
pt.setFilename(getDisplay() + "-" + getFieldValue(NUMBER_FIELDNAME) + ".pdf");
return DemoCommon.getInstance().orderReceipt(this); // Implemented in common class
} catch (Exception e) {
AppLog.error("Unable to publish " + pt.getName(), e, getGrant());
return e.getMessage();
}
}
/** Hook override: Allow custom publication only if status is validated or shipped */
@Override
public boolean isPrintTemplateEnable(String[] row, String ptName) {
if ("DemoOrder-PDF".equals(ptName)) {
String s = row!=null ? row[getStatusIndex()] : getStatus();
return "V".equals(s) || "D".equals(s);
}
return super.isPrintTemplateEnable(row, ptName);
}
}