/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.resource.accesscontrol.ui; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import org.olat.NewControllerFactory; import org.olat.core.gui.ShortName; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.table.ColumnDescriptor; import org.olat.core.gui.components.table.CustomRenderColumnDescriptor; import org.olat.core.gui.components.table.DefaultColumnDescriptor; import org.olat.core.gui.components.table.StaticColumnDescriptor; import org.olat.core.gui.components.table.Table; import org.olat.core.gui.components.table.TableController; import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.components.table.TableEvent; import org.olat.core.gui.components.table.TableGuiConfiguration; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.id.OLATResourceable; import org.olat.core.id.User; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.resource.OLATResource; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.AccessTransaction; import org.olat.resource.accesscontrol.Order; import org.olat.resource.accesscontrol.OrderLine; import org.olat.resource.accesscontrol.OrderPart; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; public class OrderDetailController extends FormBasicController { private static final String CMD_SELECT = "sel"; private FormLink backLink; private FormLink selectResourceLink; private TableController tableCtr; private CloseableModalController cmc; private TransactionDetailsController detailsCtlr; private final Order order; private Collection<AccessTransaction> transactions; @Autowired private ACService acService; @Autowired private AccessControlModule acModule; @Autowired private UserManager userManager; public OrderDetailController(UserRequest ureq, WindowControl wControl, Long orderKey) { super(ureq, wControl, "order"); order = acService.loadOrderByKey(orderKey); transactions = acService.findAccessTransactions(order); initForm(ureq); } public void hideBackLink() { backLink.setVisible(false); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { backLink = uifactory.addFormLink("back", formLayout, Link.LINK_BACK); FormLayoutContainer mainLayout = FormLayoutContainer.createDefaultFormLayout("mainCmp", getTranslator()); mainLayout.setRootForm(mainForm); formLayout.add("mainCmp", mainLayout); String orderNr = order.getOrderNr(); uifactory.addStaticTextElement("order-nr", "order.nr", orderNr, mainLayout); Date creationDate = order.getCreationDate(); String creationDateStr = Formatter.getInstance(getLocale()).formatDateAndTime(creationDate); uifactory.addStaticTextElement("creation-date", "order.creationDate", creationDateStr, mainLayout); String orderTotal = PriceFormat.fullFormat(order.getTotal()); String orderTotalStr; if(acModule.isVatEnabled()) { BigDecimal vat = acModule.getVat(); String vatStr = vat == null ? "" : vat.setScale(3, BigDecimal.ROUND_HALF_EVEN).toPlainString(); orderTotalStr = translate("access.info.price.vat", new String[]{orderTotal, vatStr}); } else { orderTotalStr = translate("access.info.price.noVat", new String[]{orderTotal}); } uifactory.addStaticTextElement("order-total", "order.total", orderTotalStr, mainLayout); OrderItemsDataModel tableModel = getOrderItemsDataModel(); if(tableModel.getRowCount() == 1) { OrderItemWrapper wrapper = tableModel.getObject(0); if(wrapper.getItem().getOffer().getResource() != null) { //resource is null if the resource has been deleted String linkName = StringHelper.escapeHtml(wrapper.getDisplayName()); selectResourceLink = uifactory.addFormLink("resource", linkName, translate("order.item"), mainLayout, Link.NONTRANSLATED); selectResourceLink.setUserObject(wrapper); selectResourceLink.setCustomEnabledLinkCSS("form-control-static"); } } User user = order.getDelivery().getUser(); String delivery = StringHelper.escapeHtml(userManager.getUserDisplayName(user)); uifactory.addStaticTextElement("delivery", "order.delivery", delivery, mainLayout); if(formLayout instanceof FormLayoutContainer) { TableGuiConfiguration tableConfig = new TableGuiConfiguration(); tableConfig.setDownloadOffered(false); tableConfig.setTableEmptyMessage(translate("orders.empty")); tableCtr = new TableController(tableConfig, ureq, getWindowControl(), Collections.<ShortName>emptyList(), null, null , null, false, getTranslator()); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("order.item.name", 0, null, getLocale())); tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("order.part.payment", 1, null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, new AccessMethodRenderer(acModule))); tableCtr.addColumnDescriptor(new StaticColumnDescriptor(CMD_SELECT, "table.order.details", getTranslator().translate("order.details"))); tableCtr.setTableDataModel(tableModel); listenTo(tableCtr); FormLayoutContainer layoutContainer = (FormLayoutContainer)formLayout; layoutContainer.put("orderItemList", tableCtr.getInitialComponent()); } } private OrderItemsDataModel getOrderItemsDataModel() { List<OrderItemWrapper> items = new ArrayList<OrderItemWrapper>(); for(OrderPart part: order.getParts()) { boolean first = true; AccessTransaction transaction = null; if(transactions != null) { for(AccessTransaction trx:transactions) { if(trx.getOrderPart().equals(part)) { transaction = trx; break; } } } for(OrderLine line:part.getOrderLines()) { OLATResource resource = line.getOffer().getResource(); String displayName; if(resource == null) { displayName = line.getOffer().getResourceDisplayName(); } else { displayName = acService.resolveDisplayName(resource); } OrderItemWrapper wrapper = new OrderItemWrapper(part, line, transaction, displayName, first); items.add(wrapper); first = false; } } return new OrderItemsDataModel(items); } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(source == tableCtr) { if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { TableEvent te = (TableEvent) event; String actionid = te.getActionId(); int rowid = te.getRowId(); OrderItemWrapper wrapper = (OrderItemWrapper)tableCtr.getTableDataModel().getObject(rowid); if(CMD_SELECT.equals(actionid)) { popupTransactionDetails(ureq, wrapper); } } } else if (source == detailsCtlr) { cmc.deactivate(); removeAsListenerAndDispose(detailsCtlr); removeAsListenerAndDispose(cmc); detailsCtlr = null; cmc = null; } } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(source == backLink) { fireEvent(ureq, Event.BACK_EVENT); } else if (source == selectResourceLink) { OrderItemWrapper wrapper = (OrderItemWrapper)source.getUserObject(); final Long resourceId = wrapper.getItem().getOffer().getResourceId(); final String type = wrapper.getItem().getOffer().getResourceTypeName(); String url; if("BusinessGroup".equals(type)) { url = "[" + type + ":" + resourceId + "]"; } else { OLATResourceable ores = wrapper.getOLATResourceable(); RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(ores, false); url = "[RepositoryEntry:" + re.getKey() + "]"; } BusinessControl bc = BusinessControlFactory.getInstance().createFromString(url); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); NewControllerFactory.getInstance().launch(ureq, bwControl); } super.formInnerEvent(ureq, source, event); } @Override protected void formOK(UserRequest ureq) { // } private void popupTransactionDetails(UserRequest ureq, OrderItemWrapper wrapper) { if(wrapper.getTransaction() == null) { //no transaction??? } else { detailsCtlr = new TransactionDetailsController(ureq, getWindowControl(), order, wrapper); listenTo(detailsCtlr); String title = translate("transaction.details.title"); cmc = new CloseableModalController(getWindowControl(), translate("close"), detailsCtlr.getInitialComponent(), true, title, true); listenTo(cmc); cmc.activate(); } } public class OrderItemsDataModel implements TableDataModel<OrderItemWrapper> { private List<OrderItemWrapper> items; public OrderItemsDataModel(List<OrderItemWrapper> items) { this.items = items; } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return items == null ? 0 : items.size(); } @Override public Object getValueAt(int row, int col) { OrderItemWrapper wrapper = getObject(row); switch(col) { case 0: { String name = wrapper.getDisplayName(); if(StringHelper.containsNonWhitespace(name)) { return name; } return "-"; } case 1: { if(wrapper.isFirst() && wrapper.getTransaction() != null) { return wrapper.getTransaction(); } return null; } default: return wrapper; } } @Override public OrderItemWrapper getObject(int row) { return items.get(row); } @Override public void setObjects(List<OrderItemWrapper> objects) { this.items = objects; } @Override public OrderItemsDataModel createCopyWithEmptyList() { return new OrderItemsDataModel(Collections.<OrderItemWrapper>emptyList()); } } public class OrderItemWrapper { private final boolean first; private final OrderPart part; private final OrderLine item; private final AccessTransaction transaction; private final String displayName; public OrderItemWrapper(OrderPart part, OrderLine item, AccessTransaction transaction, String displayName, boolean first) { this.part = part; this.item = item; this.first = first; this.transaction = transaction; this.displayName = displayName; } public boolean isFirst() { return first; } public String getDisplayName() { return displayName; } public OrderPart getPart() { return part; } public OrderLine getItem() { return item; } public AccessTransaction getTransaction() { return transaction; } public OLATResourceable getOLATResourceable() { return new OLATResourceable() { @Override public String getResourceableTypeName() { return item.getOffer().getResourceTypeName(); } @Override public Long getResourceableId() { return item.getOffer().getResourceId(); } }; } } }