diff --git a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/entities/ExpenseSheet.java b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/entities/ExpenseSheet.java index 8c00aa332..88c6d6b53 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/entities/ExpenseSheet.java +++ b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/entities/ExpenseSheet.java @@ -228,4 +228,8 @@ public class ExpenseSheet extends IntegrationEntity implements IHumanIdentifiabl this.personal = personal; } + public boolean isNotPersonal() { + return !personal; + } + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java index cece7983a..820d73a25 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java @@ -40,6 +40,7 @@ import org.libreplan.web.common.BaseCRUDController; import org.libreplan.web.common.Level; import org.libreplan.web.common.Util; import org.libreplan.web.common.components.bandboxsearch.BandboxSearch; +import org.libreplan.web.common.entrypoints.IURLHandlerRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.WrongValueException; @@ -63,7 +64,8 @@ import org.zkoss.zul.Textbox; * * @author Susana Montes Pedreira */ -public class ExpenseSheetCRUDController extends BaseCRUDController { +public class ExpenseSheetCRUDController extends + BaseCRUDController implements IExpenseSheetCRUDController { private static final org.apache.commons.logging.Log LOG = LogFactory .getLog(ExpenseSheetCRUDController.class); @@ -89,6 +91,15 @@ public class ExpenseSheetCRUDController extends BaseCRUDController private ExpenseSheetLineRenderer expenseSheetLineRenderer = new ExpenseSheetLineRenderer(); + private IURLHandlerRegistry URLHandlerRegistry; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + URLHandlerRegistry.getRedirectorFor(IExpenseSheetCRUDController.class) + .register(this, page); + } + @Override public void save() throws ValidationException { expenseSheetModel.confirmSave(); @@ -525,8 +536,7 @@ public class ExpenseSheetCRUDController extends BaseCRUDController @Override protected void initCreate() { - expenseSheetModel.initCreate(); - loadComponentsEditWindow(); + initCreate(false); } @Override @@ -563,4 +573,21 @@ public class ExpenseSheetCRUDController extends BaseCRUDController return Util.getMoneyFormat(); } + @Override + public void goToCreatePersonalExpenseSheet() { + state = CRUDControllerState.CREATE; + initCreate(true); + showEditWindow(); + } + + private void initCreate(boolean personal) { + expenseSheetModel.initCreate(personal); + loadComponentsEditWindow(); + } + + public String getResource() { + Resource resource = expenseSheetModel.getResource(); + return resource == null ? "" : resource.getShortDescription(); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetModel.java index 6e8c597a2..74b9c6730 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetModel.java @@ -44,6 +44,9 @@ import org.libreplan.business.orders.daos.ISumExpensesDAO; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.resources.entities.Resource; +import org.libreplan.business.users.entities.User; +import org.libreplan.web.UserUtil; import org.libreplan.web.common.IntegrationEntityModel; import org.libreplan.web.common.concurrentdetection.OnConcurrentModification; import org.libreplan.web.resources.worker.WorkerModel; @@ -90,6 +93,8 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens private Set deletedExpenseSheetLinesSet = new HashSet(); + private Resource resource; + public void setExpenseSheet(ExpenseSheet expenseSheet) { this.expenseSheet = expenseSheet; } @@ -142,7 +147,7 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens @Override @Transactional(readOnly = true) - public void initCreate() { + public void initCreate(boolean personal) { this.setSelectedProject(null); resetExpenseSheetLineDTO(); this.expenseSheet = ExpenseSheet.create(); @@ -155,6 +160,28 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens setDefaultCode(); } deletedExpenseSheetLinesSet = new HashSet(); + + expenseSheet.setPersonal(personal); + resource = initResource(); + } + + private Resource initResource() { + if (expenseSheet.isNotPersonal()) { + return null; + } + + SortedSet expenseSheetLines = expenseSheet + .getExpenseSheetLines(); + if (!expenseSheetLines.isEmpty()) { + return expenseSheetLines.iterator().next().getResource(); + } + + User user = UserUtil.getUserFromSession(); + if (user.isBound()) { + return user.getWorker(); + } + + return null; } @Override @@ -166,6 +193,7 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens this.expenseSheet = getFromDB(expenseSheet); initOldCodes(); deletedExpenseSheetLinesSet = new HashSet(); + resource = initResource(); } @Transactional(readOnly = true) @@ -252,9 +280,13 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens @Override public void addExpenseSheetLine() { - if (getExpenseSheet() != null) { - this.getExpenseSheetLineDTO().setExpenseSheet(getExpenseSheet()); - getExpenseSheet().add(this.getExpenseSheetLineDTO()); + if (expenseSheet != null) { + ExpenseSheetLine line = this.getExpenseSheetLineDTO(); + line.setExpenseSheet(expenseSheet); + if (expenseSheet.isPersonal()) { + line.setResource(resource); + } + expenseSheet.add(line); } this.resetExpenseSheetLineDTO(); } @@ -316,4 +348,9 @@ public class ExpenseSheetModel extends IntegrationEntityModel implements IExpens return selectedProject; } + @Override + public Resource getResource() { + return resource; + } + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetCRUDController.java new file mode 100644 index 000000000..919c88249 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetCRUDController.java @@ -0,0 +1,40 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2012 Igalia, S.L. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.expensesheet; + +import org.libreplan.business.expensesheet.entities.ExpenseSheet; +import org.libreplan.web.common.entrypoints.EntryPoint; +import org.libreplan.web.common.entrypoints.EntryPoints; + +/** + * Entry points for CRUD actions over a {@link ExpenseSheet} + * + * @author Manuel Rego Casasnovas + */ +@EntryPoints(page = "/expensesheet/expenseSheet.zul", registerAs = "expenseSheetCRUDController") +public interface IExpenseSheetCRUDController { + + @EntryPoint("create") + void goToCreatePersonalExpenseSheet(); + + @EntryPoint("edit") + void goToEditForm(ExpenseSheet expenseSheet); + +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetModel.java index 3100e41dd..d08f1a25d 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/IExpenseSheetModel.java @@ -26,6 +26,8 @@ import org.libreplan.business.expensesheet.entities.ExpenseSheet; import org.libreplan.business.expensesheet.entities.ExpenseSheetLine; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; +import org.libreplan.business.resources.entities.Resource; +import org.libreplan.business.users.entities.User; import org.libreplan.web.common.IIntegrationEntityModel; /** @@ -39,7 +41,7 @@ public interface IExpenseSheetModel extends IIntegrationEntityModel { void prepareToList(); - void initCreate(); + void initCreate(boolean personal); void prepareToEdit(ExpenseSheet expenseSheet); @@ -67,4 +69,16 @@ public interface IExpenseSheetModel extends IIntegrationEntityModel { void generateExpenseSheetLineCodesIfIsNecessary(); + /** + * Returns the {@link Resource} associated to the personal + * {@link ExpenseSheet}.
+ * + * In personal {@link ExpenseSheet ExpenseSheets} all + * {@link ExpenseSheetLine} has the same {@link Resource}.
+ * + * It tries to get the {@link Resource} from the first {@link ExpenseSheet} + * and if not it tries to get it from bound {@link User}. + */ + Resource getResource(); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/ExpensesAreaController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/ExpensesAreaController.java new file mode 100644 index 000000000..a0ca12634 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/ExpensesAreaController.java @@ -0,0 +1,49 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2012 Igalia, S.L. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.users.dashboard; + +import javax.annotation.Resource; + +import org.libreplan.web.expensesheet.IExpenseSheetCRUDController; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.util.GenericForwardComposer; + +/** + * Controller for "Expenses" area in the user dashboard window + * + * @author Manuel Rego Casasnovas + */ +@SuppressWarnings("serial") +public class ExpensesAreaController extends GenericForwardComposer { + + @Resource + private IExpenseSheetCRUDController expenseSheetCRUDController; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + comp.setAttribute("controller", this); + } + + public void newExpenseSheet() { + expenseSheetCRUDController.goToCreatePersonalExpenseSheet(); + } + +} diff --git a/libreplan-webapp/src/main/resources/libreplan-webapp-spring-security-config.xml b/libreplan-webapp/src/main/resources/libreplan-webapp-spring-security-config.xml index 8701861b6..971e9cde4 100644 --- a/libreplan-webapp/src/main/resources/libreplan-webapp-spring-security-config.xml +++ b/libreplan-webapp/src/main/resources/libreplan-webapp-spring-security-config.xml @@ -54,7 +54,8 @@ access="ROLE_ADMINISTRATION" /> - + + - + @@ -32,6 +32,7 @@ -