1 package org.kuali.ole.deliver.rule;
2
3
4 import org.kuali.ole.OLEConstants;
5 import org.kuali.ole.deliver.bo.OleCirculationDesk;
6 import org.kuali.ole.deliver.bo.OleCirculationDeskDetail;
7 import org.kuali.ole.deliver.bo.OleCirculationDeskLocation;
8 import org.kuali.ole.describe.bo.OleLocation;
9 import org.kuali.rice.core.api.criteria.QueryByCriteria;
10 import org.kuali.rice.kns.service.KNSServiceLocator;
11 import org.kuali.rice.krad.maintenance.MaintenanceDocument;
12 import org.kuali.rice.krad.rules.MaintenanceDocumentRuleBase;
13 import org.kuali.rice.krad.service.KRADServiceLocator;
14
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 import java.util.List;
18 import java.util.Map;
19
20
21
22
23 public class OleCirculationDeskRule extends MaintenanceDocumentRuleBase {
24
25
26
27
28
29
30 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
31 boolean isValid = true;
32 OleCirculationDesk circulationDesk = (OleCirculationDesk) document.getNewMaintainableObject().getDataObject();
33 String circulationDeskAction = document.getOldMaintainableObject().getMaintenanceAction();
34
35 isValid &= validateCirculationDeskCode(circulationDeskAction, circulationDesk);
36 isValid &= validateCirculationDeskBeforeEdit(circulationDeskAction, circulationDesk);
37 return isValid;
38 }
39
40
41
42
43
44
45
46 private boolean validateCirculationDeskCode(String circulationDeskAction, OleCirculationDesk circulationDesk) {
47 if (circulationDesk.getCirculationDeskCode() != null) {
48 Map<String, String> criteria = new HashMap<String, String>();
49 criteria.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CD, circulationDesk.getCirculationDeskCode());
50 List<OleCirculationDesk> circulationDeskInDatabase = (List<OleCirculationDesk>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDesk.class, QueryByCriteria.Builder.andAttributes(criteria).build()).getResults();
51 if ((circulationDeskInDatabase.size() > 0)) {
52 for (OleCirculationDesk circulationDeskObj : circulationDeskInDatabase) {
53 String circulationDeskId = circulationDeskObj.getCirculationDeskId();
54 if (null == circulationDesk.getCirculationDeskId() || !(circulationDesk.getCirculationDeskId().equalsIgnoreCase(circulationDeskId))) {
55 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CODE, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CD_EXIST);
56 return false;
57 }
58 }
59 }
60 }
61 if (circulationDesk.getOleCirculationDeskLocations().size() == 0) {
62 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_ERROR);
63 return false;
64 }
65 List<String> locationCodes = new ArrayList<String>();
66 for (OleCirculationDeskLocation oleCirculationDeskLocation : circulationDesk.getOleCirculationDeskLocations()) {
67 if (oleCirculationDeskLocation.getCirculationDeskLocation() == null) {
68 Map<String, String> map = new HashMap<String, String>();
69 map.put(OLEConstants.LOC_CD, oleCirculationDeskLocation.getCirculationLocationCode());
70 OleLocation oleLocation = KRADServiceLocator.getDataObjectService().find(OleLocation.class, oleCirculationDeskLocation.getCirculationFullLocationCode());
71 oleCirculationDeskLocation.setLocation(oleLocation);
72 oleCirculationDeskLocation.setCirculationDeskLocation(oleLocation != null ? oleLocation.getLocationId() : null);
73 }
74 locationCodes.add(oleCirculationDeskLocation.getCirculationLocationCode());
75 }
76 List<OleLocation> oleLocations = (List<OleLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleLocation.class, QueryByCriteria.Builder.create().build()).getResults();
77 List<String> validLocationCodes = new ArrayList<String>();
78 for (OleLocation oleLocation : oleLocations) {
79 for (String locationCode : locationCodes) {
80 if (oleLocation.getLocationCode().equals(locationCode))
81 validLocationCodes.add(locationCode);
82 }
83 }
84 if (validLocationCodes.size() != locationCodes.size()) {
85 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_VALID_ERROR);
86 return false;
87 }
88 for (String locationCode : locationCodes) {
89 boolean duplicate = false;
90 for (String dupLocationCode : validLocationCodes) {
91 if (locationCode.equalsIgnoreCase(dupLocationCode)) {
92 if (duplicate) {
93 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_DUPLICATE_ERROR);
94 return false;
95 }
96 duplicate = true;
97 }
98 }
99 }
100 for (OleCirculationDeskLocation oleCirculationDeskLocation : circulationDesk.getOleCirculationDeskLocations()) {
101 Map<String, String> circDeskLocation = new HashMap<String, String>();
102 circDeskLocation.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, oleCirculationDeskLocation.getCirculationDeskLocation());
103 List<OleCirculationDeskLocation> circulationDeskLocationInDatabase = (List<OleCirculationDeskLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDeskLocation.class, QueryByCriteria.Builder.andAttributes(circDeskLocation).build()).getResults();
104 if ((circulationDeskLocationInDatabase.size() > 0)) {
105 if (!circulationDeskAction.equalsIgnoreCase(OLEConstants.OleCirculationDesk.COPY)) {
106 if (!(circulationDeskLocationInDatabase.get(0).getCirculationDeskId().equalsIgnoreCase(oleCirculationDeskLocation.getCirculationDeskId()))) {
107 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_MAPPED_ERROR);
108 return false;
109 }
110 } else {
111 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_MAPPED_ERROR);
112 return false;
113 }
114 }
115 }
116 return true;
117 }
118
119
120
121
122
123
124
125
126 private boolean validateCirculationDeskBeforeEdit(String circulationDeskAction, OleCirculationDesk circulationDesk) {
127 if (circulationDeskAction.equalsIgnoreCase(OLEConstants.OleCirculationDesk.EDIT)) {
128 Map<String, String> circulationDeskIdMap = new HashMap<String, String>();
129 circulationDeskIdMap.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_ID, circulationDesk.getCirculationDeskId());
130 List<OleCirculationDeskDetail> circulationDeskDetailInDatabase = (List<OleCirculationDeskDetail>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDeskDetail.class, QueryByCriteria.Builder.andAttributes(circulationDeskIdMap).build()).getResults();
131 if ((circulationDeskDetailInDatabase.size() > 0)) {
132 if (!circulationDesk.isActive()) {
133 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_MAP, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_MAP_ERROR);
134 return false;
135 }
136 }
137 List<String> locationCodes = new ArrayList<String>();
138 if (circulationDesk.getOleCirculationDeskLocations() != null && circulationDesk.getOleCirculationDeskLocations().size() > 0 && locationCodes.size() == 0) {
139 locationCodes.add(circulationDesk.getOleCirculationDeskLocations().get(0).getCirculationLocationCode());
140 }
141
142 for (int i = 1; i < circulationDesk.getOleCirculationDeskLocations().size(); i++) {
143
144 for (int j = 0; j < locationCodes.size() - 1; j++) {
145
146 if (locationCodes.get(j).equals(circulationDesk.getOleCirculationDeskLocations().get(i).getCirculationLocationCode())) {
147 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_DUPLICATE_ERROR);
148 return false;
149 } else {
150 locationCodes.add(circulationDesk.getOleCirculationDeskLocations().get(i).getCirculationLocationCode());
151 j++;
152 }
153 }
154 }
155 List<OleLocation> oleLocations = (List<OleLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleLocation.class,QueryByCriteria.Builder.create().build()).getResults();
156 List<String> validLocationCodes = new ArrayList<String>();
157 for (OleLocation oleLocation : oleLocations) {
158 for (String locationCode : locationCodes) {
159 if (oleLocation.getLocationCode().equals(locationCode))
160 validLocationCodes.add(locationCode);
161 }
162 }
163 if (validLocationCodes.size() != locationCodes.size()) {
164 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_VALID_ERROR);
165 return false;
166 }
167
168 }
169 return true;
170 }
171 }
172
173
174
175