/*
* Ara - Capture Species and Specimen Data
*
* Copyright © 2009 INBio (Instituto Nacional de Biodiversidad).
* Heredia, Costa Rica.
*
* 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, 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 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 org.inbio.ara.facade.transaction.impl;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB;
import org.inbio.ara.dto.agent.InstitutionDTO;
import org.inbio.ara.facade.transaction.*;
import javax.ejb.Stateless;
import org.inbio.ara.dto.agent.InstitutionDTOFactory;
import org.inbio.ara.dto.inventory.PersonDTO;
import org.inbio.ara.dto.inventory.PersonDTOFactory;
import org.inbio.ara.dto.inventory.SelectionListDTOFactory;
import org.inbio.ara.dto.transaction.TransactedSpecimenDTO;
import org.inbio.ara.dto.transaction.TransactedSpecimenDTOFactory;
import org.inbio.ara.dto.transaction.TransactionDTO;
import org.inbio.ara.dto.transaction.TransactionDTOFactory;
import org.inbio.ara.eao.agent.InstitutionEAOLocal;
import org.inbio.ara.eao.agent.PersonEAOLocal;
import org.inbio.ara.eao.collection.CollectionEAOLocal;
import org.inbio.ara.eao.identification.IdentificationEAOLocal;
import org.inbio.ara.eao.selectionlist.SelectionListValueLocalEAO;
import org.inbio.ara.eao.specimen.SpecimenEAOLocal;
import org.inbio.ara.eao.transaction.TransactedSpecimenEAOLocal;
import org.inbio.ara.eao.transaction.TransactedSpecimenStatusEAOLocal;
import org.inbio.ara.eao.transaction.TransactionEAOLocal;
import org.inbio.ara.eao.transaction.TransactionTypeEAOLocal;
import org.inbio.ara.persistence.collection.Collection;
import org.inbio.ara.persistence.identification.Identification;
import org.inbio.ara.persistence.institution.Institution;
import org.inbio.ara.persistence.person.Person;
import org.inbio.ara.persistence.specimen.Specimen;
import org.inbio.ara.persistence.transaction.TransactedSpecimen;
import org.inbio.ara.persistence.transaction.TransactedSpecimenPK;
import org.inbio.ara.persistence.transaction.TransactedSpecimenStatus;
import org.inbio.ara.persistence.transaction.Transaction;
import org.inbio.ara.persistence.transaction.TransactionType;
/**
*
* @author echinchilla
*/
@Stateless
public class TransactionFacadeImpl implements TransactionFacadeRemote {
@EJB
private TransactionEAOLocal transactionEAOImpl;
@EJB
private TransactedSpecimenEAOLocal transactedSpecimenEAOImpl;
@EJB
private PersonEAOLocal personEAOImpl;
@EJB
private InstitutionEAOLocal insitutionEAOImpl;
@EJB
private CollectionEAOLocal collectionEAOImpl;
@EJB
private TransactionTypeEAOLocal transactionTypeEAOImpl;
@EJB
private TransactedSpecimenStatusEAOLocal transactedSpecimenStatusEAOImpl;
@EJB
private SpecimenEAOLocal specimenEAOImpl;
/*@EJB
private SelectionListValueLocalEAO selectionListValueEAOImpl;*/
@EJB
private IdentificationEAOLocal identificationEAOImpl;
private TransactionDTOFactory transactionDTOFactory =
new TransactionDTOFactory();
private TransactedSpecimenDTOFactory transactedSpecimenDTOFactory =
new TransactedSpecimenDTOFactory();
private PersonDTOFactory personDTOFactory = new PersonDTOFactory();
private InstitutionDTOFactory institutionDTOFactory = new InstitutionDTOFactory();
/*private SelectionListDTOFactory selecionListDTOFactory =
new SelectionListDTOFactory();*/
/**
* Cuenta las transacciones asociadas a una colección
* @param collectionId
* @return
*/
public Long countTransaction(Long collectionId) {
return this.transactionEAOImpl.countTransactionByCollecionId(collectionId);
}
/**
* Cuenta los especímenes transados asociados a una transacción
* @param transactionId
* @return
*/
public Long countTransactedSpecimen(Long transactionId) {
return this.transactedSpecimenEAOImpl.countTransactedSpecimenByTransactionId(transactionId);
}
/**
* Retrive all transactions paginated
* @return
*/
public List<TransactionDTO> getAllTransactionPaginated(int firstResult, int maxResults, Long collectionId) {
String[] orderByFields = {"transactionId"};
List<TransactionDTO> result = transactionDTOFactory.createDTOList(transactionEAOImpl.
findAllPaginatedFilterAndOrderBy(Transaction.class, firstResult, maxResults, orderByFields,collectionId));
if (result == null) {
return null;
}
List<TransactionDTO> update = updateNames(result);
return update;
}
/**
* Retrive all transacted specimens paginated
* @return
*/
public List<TransactedSpecimenDTO> getAllTransactedSpecimenPaginated(int firstResult, int maxResults, Long transactionId) {
List<TransactedSpecimenDTO> result = transactedSpecimenDTOFactory.createDTOList(transactedSpecimenEAOImpl.
getTransactedSpecimenByTransactionIdPaginated(firstResult, maxResults, transactionId));
if (result == null) {
return null;
}
return getReadOnlyFields(result);
}
/**
* Función que llena los campos read-only para cada espécimen transado
* @param tsDTOList
* @return
*/
public List<TransactedSpecimenDTO>
getReadOnlyFields(List<TransactedSpecimenDTO> tsDTOList) {
List<TransactedSpecimenDTO> resultTransactedSpecimenDTOList = new ArrayList<TransactedSpecimenDTO>();
TransactedSpecimenDTO auxDTO;
for (TransactedSpecimenDTO tsDTO : tsDTOList) {
auxDTO = getCatalogNumber(tsDTO);
auxDTO = getSpecimenTaxon(auxDTO);
auxDTO = getTransactedSpecimenStatus(auxDTO);
resultTransactedSpecimenDTOList.add(auxDTO);
}
return resultTransactedSpecimenDTOList;
}
/**
* Función que trae el nombre del taxón asociado a un SpecimenId
* @param tsDTO
* @return
*/
public TransactedSpecimenDTO getSpecimenTaxon(TransactedSpecimenDTO tsDTO) {
String taxones = "";
List<Identification> identificaciones = this.identificationEAOImpl.
findBySpecimenId(tsDTO.getTransactedSpecimenPK().getSpecimenId());
for (int i = 1; i <= identificaciones.size(); i++) {
Identification aux = identificaciones.get(i - 1);
if (i == identificaciones.size()) {
taxones += aux.getTaxon().getDefaultName();
}
else {
taxones += aux.getTaxon().getDefaultName() + " , ";
}
}
tsDTO.setTaxonName(taxones);
return tsDTO;
}
/**
* Función que trae el CatalogNumber asociado a un SpecimenId
* @param transactedSpecimenDTO
* @return
*/
public TransactedSpecimenDTO getCatalogNumber(TransactedSpecimenDTO transactedSpecimenDTO) {
Specimen specimen;
specimen = this.specimenEAOImpl.findById(Specimen.class, transactedSpecimenDTO.getTransactedSpecimenPK().getSpecimenId());
transactedSpecimenDTO.setCatalogNumber(specimen.getCatalogNumber());
return transactedSpecimenDTO;
}
/**
* Función que trae el nombre asociado a un id de TransactedSpecimenStatus
* @param transactedSpecimenDTO
* @return
*/
public TransactedSpecimenDTO getTransactedSpecimenStatus(TransactedSpecimenDTO transactedSpecimenDTO) {
TransactedSpecimenStatus transactedSpecimenStatus;
transactedSpecimenStatus = this.transactedSpecimenStatusEAOImpl.findById(TransactedSpecimenStatus.class,
transactedSpecimenDTO.getTransactedSpecimenStatusId());
transactedSpecimenDTO.setTransactedSpecimenStatus(transactedSpecimenStatus.getName());
return transactedSpecimenDTO;
}
/**
* Metodo para eliminar Transacciones por su id
* @param Id
*/
public void deleteTransaction(Long transactionId) {
Transaction aux = this.transactionEAOImpl.findById(Transaction.class, transactionId);
if (aux != null) {
this.transactionEAOImpl.delete(aux);
}
}
/**
* Método para eliminar una lista de especímenes transados
* @param selectedTransactedSpecimens
*/
public void deleteTransactedSpecimens(ArrayList<TransactedSpecimenDTO> selectedTransactedSpecimens) {
Long transactionId;
Long specimenId;
for (TransactedSpecimenDTO tsDTO: selectedTransactedSpecimens) {
transactionId = tsDTO.getTransactedSpecimenPK().getTransactionId();
specimenId = tsDTO.getTransactedSpecimenPK().getSpecimenId();
this.transactedSpecimenEAOImpl.deleteTransactedSpecimen(transactionId, specimenId);
}
}
/**
* Método para editar una lista de especímenes transados.
* @param selectedTransactedSpecimens
* @param tDTO
*/
public void editTransactedSpecimens(ArrayList<TransactedSpecimenDTO> selectedTransactedSpecimens, TransactedSpecimenDTO tDTO) {
Long transactionId;
Long specimenId;
for (TransactedSpecimenDTO tsDTO: selectedTransactedSpecimens) {
transactionId = tsDTO.getTransactedSpecimenPK().getTransactionId();
specimenId = tsDTO.getTransactedSpecimenPK().getSpecimenId();
tDTO.setTransactedSpecimenPK(new TransactedSpecimenPK(specimenId, transactionId));
tDTO.setCrationDateAndTime(tsDTO.getCrationDateAndTime());
tDTO.setWaitingForReturn(tsDTO.getWaitingForReturn());
TransactedSpecimen transactedSpecimenEntity = this.transactedSpecimenEAOImpl.getTransactedSpecimenById(transactionId, specimenId).get(0);
transactedSpecimenEntity = this.transactedSpecimenDTOFactory.updateEntityWithPlainValues(tDTO, transactedSpecimenEntity);
this.transactedSpecimenEAOImpl.update(transactedSpecimenEntity);
}
}
/**
* Método para la devolución de un espécimen
* @param catalogNumber
* @param receivingDate
* @param transactedSpecimenStatusId
*/
public void returnTransactedSpecimen (String catalogNumber, Calendar receivingDate, Long transactedSpecimenStatusId) {
Long specimenId = getSpecimenIdByCatalogNumber(catalogNumber);
// traer el id de la última transacción que registró el espécimen a devolver
TransactedSpecimen transactedSpecimenEntity = this.transactedSpecimenEAOImpl.getWaitingForReturnTransactionId(specimenId);
TransactedSpecimenDTO tsDTO = this.transactedSpecimenDTOFactory.createDTO(transactedSpecimenEntity);
tsDTO.setReceivingDate(receivingDate);
tsDTO.setTransactedSpecimenStatusId(transactedSpecimenStatusId);
tsDTO.setWaitingForReturn(false);
transactedSpecimenEntity = this.transactedSpecimenDTOFactory.updateEntityWithPlainValues(tsDTO, transactedSpecimenEntity);
this.transactedSpecimenEAOImpl.update(transactedSpecimenEntity);
}
/**
* Método que setea campos read-only de una transacción
* @param transactionDTO
* @return
*/
public TransactionDTO updateNames(TransactionDTO transactionDTO) {
Person senderPerson, receiverPerson;
Institution senderInstitution, receiverInstitution;
Collection collection;
TransactionType transactionType;
senderPerson = this.personEAOImpl.findById(Person.class, transactionDTO.getSenderPersonId());
transactionDTO.setSenderPersonName(senderPerson.getNaturalLongName());
if (transactionDTO.getReceiverPersonId() != null) {
receiverPerson = this.personEAOImpl.findById(Person.class, transactionDTO.getReceiverPersonId());
transactionDTO.setReceiverPersonName(receiverPerson.getNaturalLongName());
}
if (transactionDTO.getSenderInstitutionId() != null) {
senderInstitution = this.insitutionEAOImpl.
findById(Institution.class, transactionDTO.getSenderInstitutionId());
transactionDTO.setSenderInstitutionName(senderInstitution.getInstitutionCode());
}
else { // PARA EL CASO DE 'SIN INSTITUCION ASOCIADA'
transactionDTO.setSenderInstitutionId(new Long(-1));
}
if (transactionDTO.getReceiverInstitutionId() != null) {
receiverInstitution = this.insitutionEAOImpl.
findById(Institution.class, transactionDTO.getReceiverInstitutionId());
transactionDTO.setReceiverInstitutionName(receiverInstitution.getInstitutionCode());
}
else {
if (transactionDTO.getReceiverPersonId() != null) { // PARA EL CASO DE 'SIN INSTITUCION ASOCIADA'
transactionDTO.setReceiverInstitutionId(new Long(-1));
}
}
collection = this.collectionEAOImpl.findById(Collection.class, transactionDTO.getCollectionId());
transactionDTO.setCollectionName(collection.getName());
transactionType = this.transactionTypeEAOImpl.
findById(TransactionType.class, transactionDTO.getTransactionTypeId());
transactionDTO.setTransactionType(transactionType.getName());
return transactionDTO;
}
/**
* Método que recorre lista de transacciones para setear campos read-only
* @param tDTOList
* @return
*/
public List<TransactionDTO>
updateNames(List<TransactionDTO> tDTOList) {
List<TransactionDTO> resultTransactionDTOList = new ArrayList<TransactionDTO>();
for (TransactionDTO tDTO : tDTOList) {
resultTransactionDTOList.add(updateNames(tDTO));
}
return resultTransactionDTOList;
}
/**
* Metodo para auctualizar una transaccion
* @param tDTO
* @return
*/
public void updateTransaction(TransactionDTO tDTO) {
//En caso de "Institución no Asociada"
if(tDTO.getSenderInstitutionId() != null &&
tDTO.getSenderInstitutionId() == -1)
tDTO.setSenderInstitutionId(null);
//En caso de "Institución no Asociada"
if(tDTO.getReceiverInstitutionId() != null &&
tDTO.getReceiverInstitutionId() == -1)
tDTO.setReceiverInstitutionId(null);
Transaction transactionEntity = this.transactionEAOImpl.findById(Transaction.class, tDTO.
getTransactionId());
transactionEntity = this.transactionDTOFactory.updatePlainEntity(tDTO, transactionEntity);
this.transactionEAOImpl.update(transactionEntity);
}
/**
* Método para crear una transacción
* @param transactionDTO
* @return
*/
public TransactionDTO saveTransaction(TransactionDTO transactionDTO) {
if(transactionDTO.getSenderInstitutionId() != null &&
transactionDTO.getSenderInstitutionId() == -1)
transactionDTO.setSenderInstitutionId(null);
if(transactionDTO.getReceiverInstitutionId() != null &&
transactionDTO.getReceiverInstitutionId() == -1)
transactionDTO.setReceiverInstitutionId(null);
Transaction entity = this.transactionDTOFactory.createPlainEntity(transactionDTO);
this.transactionEAOImpl.create(entity);
TransactionDTO aux = this.transactionDTOFactory.createDTO(entity);
// PARA EL CASO DE 'SIN INSTITUCION ASOCIADA'
if(aux.getSenderInstitutionId() == null)
aux.setSenderInstitutionId(new Long(-1));
if(aux.getReceiverInstitutionId() == null && aux.getReceiverPersonId() != null)
aux.setReceiverInstitutionId(new Long(-1));
return aux;
}
/**
* Método
* @param transactionDTO
* @param transactedSpecimenDTO
* @return
*/
public TransactedSpecimenDTO
saveTransactedSpecimen(TransactionDTO transactionDTO, TransactedSpecimenDTO transactedSpecimenDTO) {
Long specimenId = getSpecimenIdByCatalogNumber(transactedSpecimenDTO.getCatalogNumber());
TransactedSpecimen transactedSpecimenEntity = this.transactedSpecimenEAOImpl.getWaitingForReturnTransactionId(specimenId);
if (transactedSpecimenEntity == null) {
transactedSpecimenDTO.setTransactedSpecimenPK(new TransactedSpecimenPK(specimenId, transactionDTO.getTransactionId()));
transactedSpecimenDTO.setTransactionTypeId(transactionDTO.getTransactionTypeId());
Calendar currentDateAndTime = Calendar.getInstance();
transactedSpecimenDTO.setCrationDateAndTime(currentDateAndTime);
TransactedSpecimen entity = this.transactedSpecimenDTOFactory.createPlainEntity(transactedSpecimenDTO);
this.transactedSpecimenEAOImpl.create(entity);
return this.transactedSpecimenDTOFactory.createDTO(entity);
}
else {
return null;
}
}
/**
* Método que obtiene la lista de personas asociadas a una institución
* @param institutionId
* @return
*/
public List<PersonDTO> getPersonsByInstitutionId(Long institutionId) {
if (institutionId == null || institutionId != -1)
return personDTOFactory.createDTOList(transactionEAOImpl.
getPersonsByInstitution(institutionId));
else
return personDTOFactory.createDTOList(transactionEAOImpl.
getPersonsWithoutInstitution());
}
/**
*
* @return Lista de todas las instituciones registradas en el sistema
*/
public List<InstitutionDTO> getAllInstitutions() {
return institutionDTOFactory.createDTOList(transactionEAOImpl.getAllInstitutions());
}
/**
* Trae la lista de personas sin institución asociada
* @return
*/
public List<PersonDTO> getPersonsWithoutInstitution() {
return personDTOFactory.createDTOList(transactionEAOImpl.
getPersonsWithoutInstitution());
}
/**
* Método que obtiene el specimenId asociado a un número de catálogo
* @param catalogNumber
* @return
*/
public Long getSpecimenIdByCatalogNumber (String catalogNumber) {
return specimenEAOImpl.findByCatalogNumber(catalogNumber);
}
}