/** * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L. * Copyright (C) 2007 Autentia Real Bussiness Solution S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.tnt.manager.commissioning; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.autentia.tnt.businessobject.Commissioning; import com.autentia.tnt.businessobject.CommissioningChange; import com.autentia.tnt.businessobject.CommissioningDelay; import com.autentia.tnt.businessobject.CommissioningFile; import com.autentia.tnt.businessobject.CommissioningPaymentData; import com.autentia.tnt.businessobject.CommissioningStatus; import com.autentia.tnt.businessobject.User; import com.autentia.tnt.dao.SortCriteria; import com.autentia.tnt.dao.hibernate.CommissioningDAO; import com.autentia.tnt.dao.search.CommissioningSearch; import com.autentia.tnt.manager.security.AuthenticationManager; import com.autentia.tnt.util.ConfigurationUtil; import com.autentia.tnt.util.SpringUtils; public class CommissioningManager { /* Commissioning - generated by stajanov (do not edit/delete) */ /** Logger */ private static final Log log = LogFactory .getLog(CommissioningManager.class); /** Commissioning DAO **/ private CommissioningDAO commissioningDAO; /** * Get default CommissioningManager as defined in Spring's configuration * file. * * @return the default singleton CommissioningManager */ public static CommissioningManager getDefault() { return (CommissioningManager) SpringUtils .getSpringBean("managerCommissioning"); } /** * Empty constructor needed by CGLIB (Spring AOP) */ protected CommissioningManager() { } /** * Default constructor * * @deprecated do not construct managers alone: use Spring's declared beans */ public CommissioningManager(CommissioningDAO commissioningDAO) { this.commissioningDAO = commissioningDAO; } /** * List commissionings. * * @param search * search filter to apply * @param sort * sorting criteria * @return the list of all commissionings sorted by requested criterion */ public List<Commissioning> getAllEntities(CommissioningSearch search, SortCriteria sort) { final User actualUser = AuthenticationManager.getDefault() .getCurrentPrincipal().getUser(); // FIXME no se si se puede hacer con acegi, pero no deberia hacerse asi if (!actualUser.getRole().getId().equals( ConfigurationUtil.getDefault().getRoleAdminId())) { List<User> reviser = new ArrayList<User>(); reviser.add(actualUser); search.setRevisers(reviser); } return commissioningDAO.search(search, sort); } /** * Get commissioning by primary key. * * @return commissioning selected by id. */ public Commissioning getEntityById(int id) { Commissioning commissioning = commissioningDAO.getById(id); commissioning.initChanges(); return commissioning; } /** * Insert commissioning. */ public void insertEntity(Commissioning commissioning) { commissioningDAO.insert(commissioning); } /** * Update commissioning. */ public void updateEntity(Commissioning commissioning) { if (commissioning.getStatus() == CommissioningStatus.VALIDATED) { if (entityChangedInStatus(commissioning, CommissioningStatus.CONFIRMED)) { deleteHistory(commissioning); commissioning.setStatus(CommissioningStatus.CREATED); // para que tampoco se graben los cambios en el histórico // ponemos el estado del changes a creado, y nos aseguramos que no // se evaluan los cambios if (commissioning.getChanges() != null) { commissioning.getChanges().setStatus(CommissioningStatus.CREATED); } } // se ha producido un cambio en la fase de confirmacion con lo // cual pasa a creado } // get changes for history Commissioning changes = commissioning.getChanges(); commissioningDAO.update(commissioning); // tracking entity changes Commissioning commissioningHibSession = commissioningDAO.getById(commissioning.getId()); Commissioning changesHibSession = commissioningHibSession.getChanges(); commissioningHibSession.setChanges(changes); trackEntityChanges(commissioningHibSession); } /** * Delete commissioning. */ public void deleteEntity(Commissioning commissioning) { commissioningDAO.delete(commissioning); } /* Commissioning - generated by stajanov (do not edit/delete) */ /** * Mira los campos de la entidad a ver si se han producido cambios * * @return true si se produjo algun cambio * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalArgumentException * @throws IllegalAccessException */ private boolean trackEntityChanges(final Commissioning commissioning) { final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); final DecimalFormat df = new DecimalFormat("0.00"); int previousHistorySize = commissioning.getHistory().size(); int finalHistorySize = previousHistorySize; // TODO ¿podría ser por reflexión para obtener los atributos persistentes? if ((commissioning.getChanges() != null) && (commissioning.getChanges().getStatus() == CommissioningStatus.ACCEPTED || commissioning .getChanges().getStatus() == CommissioningStatus.CONFIRMED)) { final Commissioning changes = commissioning.getChanges(); if (changes.getBudget() != null && !(changes.getBudget().floatValue() == commissioning.getBudget().floatValue())) { commissioning.getHistory().add( getChange("commissioning.budget", df.format(changes.getBudget()), df.format(commissioning .getBudget()), commissioning)); } commissioning.getHistory().add( getChange("commissioning.name", changes.getName(), commissioning.getName(), commissioning)); commissioning.getHistory().add( getChange("commissioning.conclusions", changes.getConclusions(), commissioning.getConclusions(), commissioning)); commissioning.getHistory() .add( getChange("commissioning.content", changes.getContent(), commissioning.getContent(), commissioning)); if (changes.getDeliveryDate() != null && commissioning.getDeliveryDate() != null && changes.getDeliveryDate().getTime() != commissioning.getDeliveryDate().getTime()) { commissioning.getHistory().add( getChange("commissioning.deliveryDate", sdf .format(changes.getDeliveryDate()), sdf .format(commissioning.getDeliveryDate()), commissioning)); } commissioning.getHistory().add( getChange("commissioning.developedActivities", changes.getDevelopedActivities(), commissioning .getDevelopedActivities(), commissioning)); commissioning.getHistory().add( getChange("commissioning.difficultiesAppeared", changes.getDifficultiesAppeared(), commissioning .getDifficultiesAppeared(), commissioning)); commissioning.getHistory().add( getChange("commissioning.evaluation", changes.getEvaluation(), commissioning.getEvaluation(), commissioning)); commissioning.getHistory().add( getChange("commissioning.notes", changes.getNotes(), commissioning.getNotes(), commissioning)); commissioning.getHistory().add( getChange("commissioning.products", changes.getProducts(), commissioning.getProducts(), commissioning)); if (changes.getRequestDate() != null && commissioning.getRequestDate() != null && changes.getRequestDate().getTime() != commissioning .getRequestDate().getTime()) { commissioning.getHistory().add( getChange("commissioning.requestDate", sdf .format(changes.getRequestDate()), sdf .format(commissioning.getRequestDate()), commissioning)); } commissioning.getHistory() .add( getChange("commissioning.results", changes.getResults(), commissioning.getResults(), commissioning)); commissioning.getHistory().add( getChange("commissioning.scope", changes.getScope(), commissioning.getScope(), commissioning)); if (changes.getStatus() != null && !changes.getStatus().equals(commissioning.getStatus())) { commissioning.getHistory().add( getChange("commissioning.status", changes.getStatus().toString(), commissioning.getStatus() .toString(), commissioning)); } if (changes.isJustifyInformation() != commissioning .isJustifyInformation()) { commissioning.getHistory().add( getChange("commissioning.justifyInformation", Boolean .toString(changes.isJustifyInformation()), Boolean.toString(commissioning .isJustifyInformation()), commissioning)); } if (changes.isAdminSignature() != commissioning.isAdminSignature()) { commissioning.getHistory().add( getChange("commissioning.adminSignature", Boolean .toString(changes.isAdminSignature()), Boolean .toString(commissioning.isAdminSignature()), commissioning)); } if (changes.isAuthorSignature() != commissioning .isAuthorSignature()) { commissioning.getHistory().add( getChange("commissioning.authorSignature", Boolean .toString(changes.isAuthorSignature()), Boolean .toString(commissioning.isAuthorSignature()), commissioning)); } if (changes.isReviserSignature() != commissioning .isReviserSignature()) { commissioning.getHistory().add( getChange("commissioning.reviserSignature", Boolean .toString(changes.isReviserSignature()), Boolean.toString(commissioning .isReviserSignature()), commissioning)); } if (changes.getProject() != null && changes.getProject().getName() != null && !changes.getProject().getName().equals(commissioning.getProject().getName())) { commissioning.getHistory().add( getChange("commissioning.project", changes.getProject().getName().toString(), commissioning .getProject().getName().toString(), commissioning)); } commissioning.getHistory().addAll(getRevisersChanges(commissioning)); commissioning.getHistory().addAll(getFilesChanges(commissioning)); commissioning.getHistory().addAll(getCommissioningDelaysChanges(commissioning)); commissioning.getHistory().addAll(getCollaboratorPaymentChanges(commissioning)); finalHistorySize = commissioning.getHistory().size(); } // if has changes previousHistorySize != finalHistorySize return previousHistorySize != finalHistorySize; } private List<CommissioningChange> getRevisersChanges(final Commissioning commissioning) { final List<CommissioningChange> changes = new ArrayList<CommissioningChange>(); for (User user : commissioning.getRevisers()) { if (!commissioning.getChanges().getRevisers().contains(user)) { changes.add(getChange("commissioning.revisers", "", user .getName(), commissioning)); } } for (User user : commissioning.getChanges().getRevisers()) { if (!commissioning.getRevisers().contains(user)) { changes.add(getChange("commissioning.revisers", user.getName(), "", commissioning)); } } return changes; } private List<CommissioningChange> getFilesChanges(final Commissioning commissioning) { final List<CommissioningChange> changes = new ArrayList<CommissioningChange>(); for (CommissioningFile file : commissioning.getFiles()) { if (!commissioning.getChanges().getFiles().contains(file)) { changes.add(getChange("commissioning.files", "", file.getFile(), commissioning)); } } for (CommissioningFile file : commissioning.getChanges().getFiles()) { if (!commissioning.getFiles().contains(file)) { changes.add(getChange("commissioning.files", file.getFile(), "", commissioning)); } } return changes; } private List<CommissioningChange> getCommissioningDelaysChanges(final Commissioning commissioning) { final List<CommissioningChange> changes = new ArrayList<CommissioningChange>(); final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); for (CommissioningDelay delay : commissioning.getCommissioningDelays()) { if (!commissioning.getChanges().getCommissioningDelays().contains(delay)) { changes.add(getChange("commissioningDelay.delayedToDate", "", sdf.format(delay.getDelayedToDate()), commissioning)); } } for (CommissioningDelay delay : commissioning.getChanges().getCommissioningDelays()) { if (!commissioning.getCommissioningDelays().contains(delay)) { changes.add(getChange("commissioningDelay.delayedToDate", sdf.format(delay.getDelayedToDate()), "", commissioning)); } } return changes; } private List<CommissioningChange> getCollaboratorPaymentChanges(final Commissioning commissioning) { final List<CommissioningChange> changes = new ArrayList<CommissioningChange>(); for (CommissioningPaymentData payment : commissioning.getCollaboratorsPaymentData()) { // FIXME no debería haber bucle y debería funcionar con el método "contains" // metemos el recorrido del bucle en busca del elemento // ya que el método contains no está funcionando correctamente boolean found = false; for (CommissioningPaymentData paymentInSet : commissioning.getChanges().getCollaboratorsPaymentData()) { if (paymentInSet.equals(payment)) { found = true; break; } } // if (!commissioning.getChanges().getCollaboratorsPaymentData().contains(payment)) { if (!found) { changes.add(getChange("commissioning.collaborators", "", payment.getCollaborator().getName(), commissioning)); changes.add(getChange("commissioning.paymentMode", "", "[" + payment.getCollaborator().getName() + "] " + payment.getPaymentMode().name(), commissioning)); changes.add(getChange("commissioning.bankAccount", "", "[" + payment.getCollaborator().getName() + "] " + payment.getBankAccount(), commissioning)); changes.add(getChange("commissioning.billNumber", "", "[" + payment.getCollaborator().getName() + "] " + payment.getBillNumber(), commissioning)); } else { changes.addAll(getCollaboratorPaymentInternalChanges(payment, commissioning, false)); } } for (CommissioningPaymentData payment : commissioning.getChanges().getCollaboratorsPaymentData()) { if (!commissioning.getCollaboratorsPaymentData().contains(payment)) { changes.add(getChange("commissioning.collaborators", payment.getCollaborator().getName(), "", commissioning)); changes.add(getChange("commissioning.paymentMode", "[" + payment.getCollaborator().getName() + "] " + payment.getPaymentMode().name(), "", commissioning)); changes.add(getChange("commissioning.bankAccount", "[" + payment.getCollaborator().getName() + "] " + payment.getBankAccount(), "", commissioning)); changes.add(getChange("commissioning.billNumber", "[" + payment.getCollaborator().getName() + "] " + payment.getBillNumber(), "", commissioning)); } else { changes.addAll(getCollaboratorPaymentInternalChanges(payment, commissioning, true)); } } return changes; } private Collection<? extends CommissioningChange> getCollaboratorPaymentInternalChanges( CommissioningPaymentData payment, Commissioning commissioning, boolean paymentIsPrevious) { final List<CommissioningChange> changes = new ArrayList<CommissioningChange>(); CommissioningPaymentData paymentInList = null; // recuperamos el colaborador de la lista que coincide con el pasado for (CommissioningPaymentData paymentData : commissioning.getCollaboratorsPaymentData()) { if (payment.equals(paymentData)) { paymentInList = paymentData; break; } } if(paymentInList == null){ throw new IllegalArgumentException ("PaymentInList no localizado"); } // asignamos los valores de antes y despues CommissioningPaymentData paymentPrevious = null; CommissioningPaymentData paymentNow = null; if (paymentIsPrevious) { paymentPrevious = payment; paymentNow = paymentInList; } else { paymentPrevious = paymentInList; paymentNow = payment; } // sólo puede haber cambiado el modo de pago, la cuenta y la billnumber if (!paymentPrevious.getPaymentMode().equals(paymentNow.getPaymentMode())) { changes.add(getChange("commissioning.paymentMode", "[" + payment.getCollaborator().getName() + "] " + paymentPrevious.getPaymentMode().name(), "[" + payment.getCollaborator().getName() + "] " + paymentNow.getPaymentMode().name(), commissioning)); } changes.add(getChange("commissioning.bankAccount", "[" + payment.getCollaborator().getName() + "] " + paymentPrevious.getBankAccount(), "[" + payment.getCollaborator().getName() + "] " + paymentNow.getBankAccount(), commissioning)); changes.add(getChange("commissioning.billNumber", "[" + payment.getCollaborator().getName() + "] " + paymentPrevious.getBillNumber(), "[" + payment.getCollaborator().getName() + "] " + paymentNow.getBillNumber(), commissioning)); return changes; } public CommissioningChange getChange(String field, String oldValue, String newValue, final Commissioning commissioning) { CommissioningChange change = null; if (!StringUtils.equals(oldValue, newValue)) { oldValue = StringUtils.defaultIfEmpty(oldValue, ""); newValue = StringUtils.defaultIfEmpty(newValue, ""); change = new CommissioningChange(); change.setCommissioning(commissioning); change.setStatus(commissioning.getStatus()); change.setField(field); change.setOldValue(oldValue); change.setNewValue(newValue); change.setInsertDate(new Date()); change.setUser(AuthenticationManager.getDefault().getCurrentPrincipal().getUser()); } return change; } private boolean entityChangedInStatus(final Commissioning commissioning, CommissioningStatus status) { Set<CommissioningChange> history = commissioning.getHistory(); for (CommissioningChange change : history) { if (change.getStatus() == status && change.getDeleteDate() == null) { if (change.getField().matches("commissioning[.].*")) return true; } } return false; } private void deleteHistory(final Commissioning commissioning) { Set<CommissioningChange> history = commissioning.getHistory(); for (CommissioningChange change : history) { if (change.getDeleteDate() == null) { change.setDeleteDate(new Date()); } } } }