View Javadoc
1   package org.kuali.ole.select.document.krad;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.Map;
6   
7   import org.apache.log4j.Logger;
8   import org.kuali.ole.OLEConstants;
9   import org.kuali.ole.module.purap.businessobject.options.DiscountTypeValuesFinder;
10  import org.kuali.ole.select.businessobject.OleInvoiceItem;
11  import org.kuali.ole.select.document.OleInvoiceDocument;
12  import org.kuali.ole.select.form.OLEInvoiceForm;
13  import org.kuali.rice.core.api.util.KeyValue;
14  import org.kuali.rice.kew.api.WorkflowDocument;
15  import org.kuali.rice.krad.uif.UifConstants;
16  import org.kuali.rice.krad.uif.UifPropertyPaths;
17  import org.kuali.rice.krad.uif.component.BindingInfo;
18  import org.kuali.rice.krad.uif.component.Component;
19  import org.kuali.rice.krad.uif.container.CollectionGroup;
20  import org.kuali.rice.krad.uif.container.Container;
21  import org.kuali.rice.krad.uif.container.Group;
22  import org.kuali.rice.krad.uif.element.Action;
23  import org.kuali.rice.krad.uif.field.Field;
24  import org.kuali.rice.krad.uif.field.FieldGroup;
25  import org.kuali.rice.krad.uif.layout.CollectionLayoutManager;
26  import org.kuali.rice.krad.uif.layout.LayoutManagerBase;
27  import org.kuali.rice.krad.uif.util.ComponentUtils;
28  import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
29  import org.kuali.rice.krad.uif.view.View;
30  import org.kuali.rice.krad.uif.widget.Pager;
31  import org.kuali.rice.krad.uif.widget.QuickFinder;
32  
33  public class OleInvoiceItemsLayout extends LayoutManagerBase implements
34  		CollectionLayoutManager {
35  
36  	private static final long serialVersionUID = 5289870490845303915L;
37  	private static final Logger LOG = Logger
38  			.getLogger(OleInvoiceItemsLayout.class);
39  
40  	@SuppressWarnings("unchecked")
41  	private static final List<KeyValue> DISCOUNT_KEY_VALUES = new DiscountTypeValuesFinder()
42  			.getKeyValues();
43  
44  	private List<OleInvoiceItemsLine> itemLines = new ArrayList<OleInvoiceItemsLine>();
45  	private int filteredLines;
46  	private int displayedLines;
47  	private int totalLines;
48  	private boolean foreignCurrency;
49  
50  	private int pageSize;
51  	private int currentPage;
52  	private Pager pager;
53  	private QuickFinder relinkQuickfinder;
54  	private Group rowDetailsGroup;
55  	private String actionRefreshId;
56  
57  	private List<Component> components = new ArrayList<Component>();
58  
59      public OleInvoiceItemsLayout(){
60          super();
61          pageSize = OLEConstants.DEFAULT_INV_ITM_LMT;
62          String pageSizeFromParameter = OLEConstants.getParameterForSelectModule("INVOICE_ITEM_LIMIT");
63          try{
64              pageSize = Integer.parseInt(pageSizeFromParameter);
65          }catch(Exception e){
66              LOG.info("System parameter is having invalid size for invoice current item section page size. So taking the default value for page size : " + pageSize);
67          }
68      }
69  
70  	private void setUpPager(OLEInvoiceForm form, CollectionGroup collection) {
71  		if (pageSize == 0 || pager == null)
72  			return;
73  
74  		int total = 0;
75  		for (OleInvoiceItem item : ObjectPropertyUtils
76  				.<List<OleInvoiceItem>> getPropertyValue(form, collection
77  						.getBindingInfo().getBindingPath()))
78  			if ("Qty".equals(item.getItemType().getItemTypeDescription()))
79  				total++;
80  		totalLines = total;
81  
82  		String extensionKey = collection.getId() + ".currentPage";
83  		Map<String, Object> extension = form.getExtensionData();
84  		int lastPage = total / pageSize + (total % pageSize == 0 ? 0 : 1);
85  		Integer currentPage = (Integer) extension.get(extensionKey);
86  		if (currentPage == null)
87  			currentPage = 1;
88  
89  		String pageNumber = form.getPageNumber();
90  		if (pageNumber != null)
91  			switch (pageNumber) {
92  			case UifConstants.PageRequest.FIRST:
93  				currentPage = 1;
94  				break;
95  			case UifConstants.PageRequest.LAST:
96  				currentPage = lastPage;
97  				break;
98  			case UifConstants.PageRequest.NEXT:
99  				currentPage = Math.min(currentPage + 1, lastPage);
100 				break;
101 			case UifConstants.PageRequest.PREV:
102 				currentPage = Math.max(currentPage - 1, 1);
103 				break;
104 			default:
105 				try {
106 					currentPage = Math.max(1,
107 							Math.min(lastPage, Integer.parseInt(pageNumber)));
108 				} catch (NumberFormatException e) {
109 					LOG.warn("Invalid page number " + form.getPageNumber(), e);
110 				}
111 				break;
112 			}
113 		form.setPageNumber(null);
114 
115 		pager.setCurrentPage(currentPage);
116 		pager.setNumberOfPages(lastPage);
117 		this.currentPage = currentPage;
118 
119 		synchronized (extension) {
120 			extension.put(extensionKey, currentPage);
121 		}
122 	}
123 
124 	private Group getRowDetails(OLEInvoiceForm form, String idSuffix,
125 			int lineIndex, CollectionGroup collection, View view,
126 			String bindingPath, OleInvoiceItem item) {
127 		String lineId = collection.getBaseId() + idSuffix;
128 		String selectedRowDetails = form.getSelectRowDetails();
129 		String extensionKey = lineId + ".rowDetails";
130 		Map<String, Object> extension = form.getExtensionData();
131 		if (lineId.equals(selectedRowDetails))
132 			synchronized (extension) {
133 				if (form.isShowSelectedRowDetails())
134 					extension.put(extensionKey, true);
135 				else
136 					extension.remove(extensionKey);
137 			}
138 
139 		if (!Boolean.TRUE.equals(extension.get(extensionKey))) {
140 			if (LOG.isDebugEnabled())
141 				LOG.debug("Omitting row details " + extensionKey + ", "
142 						+ form.getSelectRowDetails() + " "
143 						+ form.isShowSelectedRowDetails());
144 			return null;
145 		}
146 
147 		if (LOG.isDebugEnabled())
148 			LOG.debug("Including row details " + extensionKey + ", "
149 					+ form.getSelectRowDetails() + " "
150 					+ form.isShowSelectedRowDetails());
151 
152 		Group rowDetails = ComponentUtils.copy(rowDetailsGroup, idSuffix);
153 		rowDetails.setFieldBindByNamePrefix(bindingPath);
154 		ComponentUtils.updateContextForLine(rowDetails, item, lineIndex,
155 				idSuffix);
156 		view.getViewHelperService().spawnSubLifecyle(view, form, rowDetails,
157 				collection, null, UifConstants.ViewPhases.INITIALIZE);
158 
159 		synchronized (components) {
160 			components.add(rowDetails);
161 		}
162 
163 		return rowDetails;
164 	}
165 
166 	@Override
167 	public void performApplyModel(View view, Object model, Container container) {
168 		OLEInvoiceForm form = (OLEInvoiceForm) model;
169 		CollectionGroup collection = (CollectionGroup) container;
170 
171 		setUpPager(form, collection);
172 
173 		if (LOG.isDebugEnabled())
174 			LOG.debug(collection
175 					+ " ro is "
176 					+ collection.isReadOnly()
177 					+ " "
178 					+ ((CollectionGroup) collection).isRenderAddLine()
179 					+ " "
180 					+ ((CollectionGroup) collection)
181 							.isRenderAddBlankLineButton());
182 
183 		foreignCurrency = ((OleInvoiceDocument) ((OLEInvoiceForm) model)
184 				.getDocument()).isForeignCurrencyFlag();
185 
186 		super.performApplyModel(view, model, container);
187 	}
188 
189 	@Override
190 	public void buildLine(View view, Object model,
191 			CollectionGroup collectionGroup, List<Field> lineFields,
192 			List<FieldGroup> subCollectionFields, String bindingPath,
193 			List<Action> actions, String idSuffix, Object currentLine,
194 			int lineIndex) {
195 
196 		OleInvoiceItem item = (OleInvoiceItem) currentLine;
197 		if (!"Qty".equals(item.getItemType().getItemTypeDescription())) {
198 			filteredLines++;
199 			return;
200 		}
201 
202 		if (currentPage > 0
203 				&& (lineIndex < (currentPage - 1) * pageSize || lineIndex >= currentPage
204 						* pageSize))
205 			return;
206 
207 		OLEInvoiceForm form = (OLEInvoiceForm) model;
208 
209 		BindingInfo bi = new BindingInfo();
210 		bi.setBindByNamePrefix(bindingPath
211 				.startsWith(UifPropertyPaths.NEW_COLLECTION_LINES) ? bindingPath
212 				: view.getDefaultBindingObjectPath() + '.' + bindingPath);
213 
214 		OleInvoiceItemsLine line = new OleInvoiceItemsLine();
215 		line.setLineNumber(lineIndex);
216 		line.setLineId(collectionGroup.getBaseId() + idSuffix);
217 		line.setBindPath(bi.getBindByNamePrefix());
218 		line.setItem(item);
219 		line.setRowDetails(getRowDetails(form, idSuffix, lineIndex,
220 				collectionGroup, view, bindingPath, item));
221 
222 		line.setActions(actions);
223 
224 		WorkflowDocument workflowDocument = form.getDocument()
225 				.getDocumentHeader().getWorkflowDocument();
226 		if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument
227 				.isEnroute())
228 				&& (item.getItemTitleId() == null || item
229 						.getTempPurchaseOrderIdentifier() == null)) {
230 			QuickFinder relinkQuickfinder = ComponentUtils.copy(
231 					this.relinkQuickfinder, idSuffix);
232 			relinkQuickfinder.updateFieldConversions(bi);
233 			relinkQuickfinder.updateLookupParameters(bi);
234 			relinkQuickfinder.updateReferencesToRefresh(bi);
235 			ComponentUtils.updateContextForLine(relinkQuickfinder, currentLine,
236 					lineIndex, idSuffix);
237 			view.getViewHelperService().spawnSubLifecyle(view, model,
238 					relinkQuickfinder, collectionGroup, null,
239 					UifConstants.ViewPhases.INITIALIZE);
240 			synchronized (components) {
241 				components.add(relinkQuickfinder);
242 			}
243 			line.setRelinkQuickfinder(relinkQuickfinder);
244 		}
245 
246 		if (actionRefreshId != null)
247 			for (Action action : actions) {
248 				action.setRefreshId(actionRefreshId);
249 				if (LOG.isDebugEnabled())
250 					LOG.debug("Action " + action.getId() + " refresh ID = "
251 							+ action.getRefreshId() + ", jump to "
252 							+ action.getJumpToIdAfterSubmit());
253 			}
254 
255 		synchronized (components) {
256 			components.addAll(actions);
257 		}
258 
259 		synchronized (itemLines) {
260 			itemLines.add(line);
261 		}
262 
263 		displayedLines++;
264 	}
265 
266 	public List<KeyValue> getDiscountKeyValues() {
267 		return DISCOUNT_KEY_VALUES;
268 	}
269 
270 	@Override
271 	public FieldGroup getSubCollectionFieldGroupPrototype() {
272 		return null;
273 	}
274 
275 	public int getPageSize() {
276 		return pageSize;
277 	}
278 
279 	public void setPageSize(int pageSize) {
280 		this.pageSize = pageSize;
281 	}
282 
283 	public int getFilteredLines() {
284 		return filteredLines;
285 	}
286 
287 	public int getDisplayedLines() {
288 		return displayedLines;
289 	}
290 
291 	public int getTotalLines() {
292 		return totalLines;
293 	}
294 
295 	public List<OleInvoiceItemsLine> getItemLines() {
296 		return itemLines;
297 	}
298 
299 	public boolean isForeignCurrency() {
300 		return foreignCurrency;
301 	}
302 
303 	public void setForeignCurrency(boolean foreignCurrency) {
304 		this.foreignCurrency = foreignCurrency;
305 	}
306 
307 	public QuickFinder getRelinkQuickfinder() {
308 		return relinkQuickfinder;
309 	}
310 
311 	public void setRelinkQuickfinder(QuickFinder relinkQuickfinder) {
312 		this.relinkQuickfinder = relinkQuickfinder;
313 	}
314 
315 	public Group getRowDetailsGroup() {
316 		return rowDetailsGroup;
317 	}
318 
319 	public void setRowDetailsGroup(Group rowDetailsGroup) {
320 		this.rowDetailsGroup = rowDetailsGroup;
321 	}
322 
323 	public Pager getPager() {
324 		return pager;
325 	}
326 
327 	public void setPager(Pager pager) {
328 		this.pager = pager;
329 	}
330 
331 	public String getActionRefreshId() {
332 		return actionRefreshId;
333 	}
334 
335 	public void setActionRefreshId(String actionRefreshId) {
336 		this.actionRefreshId = actionRefreshId;
337 	}
338 
339 	@Override
340 	public List<Component> getComponentPrototypes() {
341 		List<Component> rv = super.getComponentPrototypes();
342 		rv.add(rowDetailsGroup);
343 		rv.add(relinkQuickfinder);
344 		return rv;
345 	}
346 
347 	@Override
348 	public List<Component> getComponentsForLifecycle() {
349 		List<Component> rv = super.getComponentsForLifecycle();
350 		if (components != null)
351 			rv.addAll(components);
352 		if (pager != null)
353 			rv.add(pager);
354 		return rv;
355 	}
356 
357 	@Override
358 	protected <T> void copyProperties(T copy) {
359 		super.copyProperties(copy);
360 
361 		OleInvoiceItemsLayout c = (OleInvoiceItemsLayout) copy;
362 		c.pageSize = pageSize;
363 		c.actionRefreshId = actionRefreshId;
364 		if (rowDetailsGroup != null)
365 			c.setRowDetailsGroup(ComponentUtils.copy(rowDetailsGroup));
366 		if (relinkQuickfinder != null)
367 			c.setRelinkQuickfinder(ComponentUtils.copy(relinkQuickfinder));
368 		if (pager != null)
369 			c.setPager(ComponentUtils.copy(pager));
370 	}
371 
372 }
373