/**
* Copyright © 2015 Pablo Grela Palleiro (pablogp_9@hotmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.cuacfm.members.model.directdebit;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import org.cuacfm.members.model.util.Constants;
import org.cuacfm.members.model.util.Constants.methods;
import org.cuacfm.members.model.util.Constants.states;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/** The Class DirectDebitRepositoryImpl. */
@Repository
@Transactional(readOnly = true)
public class DirectDebitRepositoryImpl implements DirectDebitRepository {
private static final Logger logger = LoggerFactory.getLogger(DirectDebitRepositoryImpl.class);
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
public DirectDebit save(DirectDebit directDebit) {
entityManager.persist(directDebit);
return directDebit;
}
@Override
@Transactional
public DirectDebit update(DirectDebit directDebit) {
return entityManager.merge(directDebit);
}
@Override
@Transactional
public void remove(DirectDebit directDebit) {
try {
entityManager.remove(directDebit);
} catch (Exception e) {
logger.error("save: ", e);
}
}
@Override
public DirectDebit findById(String id) {
try {
return entityManager.createQuery("select d from DirectDebit d where d.id = :id", DirectDebit.class).setParameter("id", id)
.getSingleResult();
} catch (NoResultException e) {
logger.info(Constants.NO_RESULT + e.getMessage());
return null;
}
}
@Override
public String findLastId() {
try {
String id = entityManager.createQuery("select MAX(d.id) from DirectDebit d", String.class).getSingleResult();
if (id != null) {
return id;
} else {
return "_0";
}
} catch (NoResultException e) {
logger.info(Constants.NO_RESULT + e.getMessage());
return "_0";
}
}
@Override
public List<DirectDebit> findAll() {
return entityManager.createQuery("select d from DirectDebit d order by d.id asc ", DirectDebit.class).getResultList();
}
@Override
public List<DirectDebit> findAllOpen() {
return entityManager
.createQuery("select d from DirectDebit d where d.state = :state1 or d.state = :state2 or d.state = :state3 order by d.id desc",
DirectDebit.class)
.setParameter("state1", states.NO_PAY).setParameter("state2", states.MANAGEMENT).setParameter("state3", states.RETURN_BILL)
.getResultList();
}
@Override
public List<DirectDebit> findAllClose() {
return entityManager
.createQuery("select d from DirectDebit d where d.state = :state1 or d.state = :state2 order by d.id desc", DirectDebit.class)
.setParameter("state1", states.PAY).setParameter("state2", states.CANCEL).getResultList();
}
@Override
public List<DirectDebit> findAllByAccountId(Long accountId) {
return entityManager.createQuery("select d from DirectDebit d where d.account.id = :accountId order by d.id desc", DirectDebit.class)
.setParameter("accountId", accountId).getResultList();
}
@Override
public List<DirectDebit> findAllOpenByAccountId(Long accountId) {
return entityManager
.createQuery(
"select d from DirectDebit d where d.account.id = :accountId and (d.state = :state1 or d.state = :state2) order by d.id desc",
DirectDebit.class)
.setParameter("accountId", accountId).setParameter("state1", states.NO_PAY).setParameter("state2", states.MANAGEMENT).getResultList();
}
@Override
public DirectDebit getLastDirectDebit(Long accountId) {
try {
return entityManager.createQuery("select d from DirectDebit d where d.account.id = :accountId and d.state = :state", DirectDebit.class)
.setParameter("accountId", accountId).setParameter("state", states.NO_PAY).getSingleResult();
} catch (NoResultException e) {
logger.info(Constants.NO_RESULT + e.getMessage());
return null;
}
}
@Override
public String isRcurOrFRST(Long accountId) {
// Si tienes pagos ese usario y son con remesada bancara y ya han sido cobrados
List<DirectDebit> directDebits = entityManager
.createQuery("select d from DirectDebit d where d.account.id = :id and d.state = :state and d.method = :method", DirectDebit.class)
.setParameter("id", accountId).setParameter("state", states.PAY).setParameter("method", methods.DIRECTDEBIT).getResultList();
if (directDebits.isEmpty()) {
return "FRST";
}
return "RCUR";
}
@Override
public List<DirectDebit> findAllByBankRemittanceId(Long bankRemittanceId) {
return entityManager.createQuery("select d from DirectDebit d where d.bankRemittance.id = :bankRemittanceId", DirectDebit.class)
.setParameter("bankRemittanceId", bankRemittanceId).getResultList();
}
@Override
public DirectDebit findByIdTxn(String idTxn) {
try {
return entityManager.createQuery("select d from DirectDebit d where d.idTxn = :idTxn", DirectDebit.class).setParameter("idTxn", idTxn)
.getSingleResult();
} catch (NoResultException e) {
logger.info(Constants.NO_RESULT + e.getMessage());
return null;
}
}
}